atharvawarade9807 commited on
Commit
81d33cb
·
verified ·
1 Parent(s): 92f63a9

Upload 804 files

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +2 -0
  2. sandbox/.dockerignore +5 -0
  3. sandbox/Dockerfile +28 -0
  4. sandbox/app.py +74 -0
  5. sandbox/node_modules/.bin/mime +16 -0
  6. sandbox/node_modules/.bin/mime.cmd +17 -0
  7. sandbox/node_modules/.bin/mime.ps1 +28 -0
  8. sandbox/node_modules/.bin/playwright +16 -0
  9. sandbox/node_modules/.bin/playwright-core +16 -0
  10. sandbox/node_modules/.bin/playwright-core.cmd +17 -0
  11. sandbox/node_modules/.bin/playwright-core.ps1 +28 -0
  12. sandbox/node_modules/.bin/playwright.cmd +17 -0
  13. sandbox/node_modules/.bin/playwright.ps1 +28 -0
  14. sandbox/node_modules/.package-lock.json +850 -0
  15. sandbox/node_modules/accepts/HISTORY.md +243 -0
  16. sandbox/node_modules/accepts/LICENSE +23 -0
  17. sandbox/node_modules/accepts/README.md +140 -0
  18. sandbox/node_modules/accepts/index.js +238 -0
  19. sandbox/node_modules/accepts/package.json +47 -0
  20. sandbox/node_modules/array-flatten/LICENSE +21 -0
  21. sandbox/node_modules/array-flatten/README.md +43 -0
  22. sandbox/node_modules/array-flatten/array-flatten.js +64 -0
  23. sandbox/node_modules/array-flatten/package.json +39 -0
  24. sandbox/node_modules/body-parser/HISTORY.md +686 -0
  25. sandbox/node_modules/body-parser/LICENSE +23 -0
  26. sandbox/node_modules/body-parser/README.md +476 -0
  27. sandbox/node_modules/body-parser/index.js +156 -0
  28. sandbox/node_modules/body-parser/lib/read.js +205 -0
  29. sandbox/node_modules/body-parser/lib/types/json.js +243 -0
  30. sandbox/node_modules/body-parser/lib/types/raw.js +101 -0
  31. sandbox/node_modules/body-parser/lib/types/text.js +121 -0
  32. sandbox/node_modules/body-parser/lib/types/urlencoded.js +299 -0
  33. sandbox/node_modules/body-parser/package.json +55 -0
  34. sandbox/node_modules/bytes/History.md +97 -0
  35. sandbox/node_modules/bytes/LICENSE +23 -0
  36. sandbox/node_modules/bytes/Readme.md +152 -0
  37. sandbox/node_modules/bytes/index.js +170 -0
  38. sandbox/node_modules/bytes/package.json +42 -0
  39. sandbox/node_modules/call-bind-apply-helpers/.eslintrc +17 -0
  40. sandbox/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +12 -0
  41. sandbox/node_modules/call-bind-apply-helpers/.nycrc +9 -0
  42. sandbox/node_modules/call-bind-apply-helpers/CHANGELOG.md +30 -0
  43. sandbox/node_modules/call-bind-apply-helpers/LICENSE +21 -0
  44. sandbox/node_modules/call-bind-apply-helpers/README.md +62 -0
  45. sandbox/node_modules/call-bind-apply-helpers/actualApply.d.ts +1 -0
  46. sandbox/node_modules/call-bind-apply-helpers/actualApply.js +10 -0
  47. sandbox/node_modules/call-bind-apply-helpers/applyBind.d.ts +19 -0
  48. sandbox/node_modules/call-bind-apply-helpers/applyBind.js +10 -0
  49. sandbox/node_modules/call-bind-apply-helpers/functionApply.d.ts +1 -0
  50. sandbox/node_modules/call-bind-apply-helpers/functionApply.js +4 -0
.gitattributes CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ sandbox/output/screenshot_1779951462274.png filter=lfs diff=lfs merge=lfs -text
37
+ sandbox/output/screenshot_1780024509375.png filter=lfs diff=lfs merge=lfs -text
sandbox/.dockerignore ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ node_modules
2
+ npm-debug.log
3
+ output
4
+ .git
5
+ .env
sandbox/Dockerfile ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 1. Start with the official Playwright image (Ubuntu Noble base)
2
+ FROM mcr.microsoft.com/playwright:v1.49.0-noble
3
+
4
+ # 2. Set the working directory inside the container
5
+ WORKDIR /usr/src/app
6
+
7
+ # 3. Copy only the package files first (to cache dependencies)
8
+ COPY package*.json ./
9
+
10
+ # 4. Install production Node dependencies
11
+ RUN npm ci --only=production
12
+
13
+ # 5. Copy your server code into the container
14
+ COPY server.js .
15
+
16
+ # 6. Create the artifact output directory
17
+ RUN mkdir -p output
18
+
19
+ # 7. Security: Switch away from the root user
20
+ # The Microsoft image comes with a built-in user called 'pwuser'
21
+ RUN chown -R pwuser:pwuser /usr/src/app
22
+ USER pwuser
23
+
24
+ # 8. Expose the API port
25
+ EXPOSE 8080
26
+
27
+ # 9. Start the server
28
+ CMD ["node", "server.js"]
sandbox/app.py ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import time
3
+ from fastapi import APIRouter, HTTPException
4
+ from pydantic import BaseModel, Field
5
+ from playwright.async_api import async_playwright
6
+
7
+ router = APIRouter()
8
+
9
+ # Ensure an output directory exists for screenshots
10
+ BASE_DIR = os.path.dirname(os.path.abspath(__file__))
11
+ OUTPUT_DIR = os.path.join(BASE_DIR, 'output')
12
+ os.makedirs(OUTPUT_DIR, exist_ok=True)
13
+
14
+ class SandboxRequest(BaseModel):
15
+ url: str = Field(..., description="Target URL to analyze in the sandbox")
16
+
17
+ @router.post("/sandbox")
18
+ async def run_sandbox_endpoint(payload: SandboxRequest):
19
+ target_url = payload.url.strip()
20
+
21
+ if not target_url:
22
+ raise HTTPException(status_code=400, detail="URL cannot be empty.")
23
+
24
+ # Auto-fix missing protocol headers
25
+ if not target_url.lower().startswith(('http://', 'https://')):
26
+ target_url = 'https://' + target_url
27
+
28
+ network_logs = []
29
+
30
+ try:
31
+ # Launch headless Chromium using async Playwright
32
+ async with async_playwright() as p:
33
+ browser = await p.chromium.launch(
34
+ headless=True,
35
+ args=['--disable-dev-shm-usage', '--no-zygote', '--disable-extensions']
36
+ )
37
+
38
+ context = await browser.new_context(
39
+ accept_downloads=False, # Prevent auto-download malware execution
40
+ viewport={'width': 1280, 'height': 720},
41
+ user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
42
+ )
43
+
44
+ page = await context.new_page()
45
+
46
+ # Intercept and track all outbound connections made by the page
47
+ page.on("request", lambda request: network_logs.append({
48
+ "method": request.method,
49
+ "url": request.url
50
+ }))
51
+
52
+ # Safe navigation with a 30-second cap
53
+ await page.goto(target_url, wait_until='networkidle', timeout=30000)
54
+
55
+ # Capture evidence
56
+ screenshot_name = f"screenshot_{int(time.time() * 1000)}.png"
57
+ screenshot_path = os.path.join(OUTPUT_DIR, screenshot_name)
58
+ await page.screenshot(path=screenshot_path, full_page=True)
59
+
60
+ page_title = await page.title()
61
+
62
+ # Guarantee the browser closes to save system memory
63
+ await browser.close()
64
+
65
+ return {
66
+ "target_url": target_url,
67
+ "page_title": page_title or "N/A",
68
+ "screenshot_saved_as": screenshot_name,
69
+ "total_network_connections": len(network_logs),
70
+ "network_logs": network_logs[:50] # Capped at 50 so the API response isn't too massive
71
+ }
72
+
73
+ except Exception as e:
74
+ raise HTTPException(status_code=500, detail=f"Sandbox execution failed: {str(e)}")
sandbox/node_modules/.bin/mime ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -x "$basedir/node" ]; then
13
+ exec "$basedir/node" "$basedir/../mime/cli.js" "$@"
14
+ else
15
+ exec node "$basedir/../mime/cli.js" "$@"
16
+ fi
sandbox/node_modules/.bin/mime.cmd ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @ECHO off
2
+ GOTO start
3
+ :find_dp0
4
+ SET dp0=%~dp0
5
+ EXIT /b
6
+ :start
7
+ SETLOCAL
8
+ CALL :find_dp0
9
+
10
+ IF EXIST "%dp0%\node.exe" (
11
+ SET "_prog=%dp0%\node.exe"
12
+ ) ELSE (
13
+ SET "_prog=node"
14
+ SET PATHEXT=%PATHEXT:;.JS;=;%
15
+ )
16
+
17
+ endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\mime\cli.js" %*
sandbox/node_modules/.bin/mime.ps1 ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env pwsh
2
+ $basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
3
+
4
+ $exe=""
5
+ if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
6
+ # Fix case when both the Windows and Linux builds of Node
7
+ # are installed in the same directory
8
+ $exe=".exe"
9
+ }
10
+ $ret=0
11
+ if (Test-Path "$basedir/node$exe") {
12
+ # Support pipeline input
13
+ if ($MyInvocation.ExpectingInput) {
14
+ $input | & "$basedir/node$exe" "$basedir/../mime/cli.js" $args
15
+ } else {
16
+ & "$basedir/node$exe" "$basedir/../mime/cli.js" $args
17
+ }
18
+ $ret=$LASTEXITCODE
19
+ } else {
20
+ # Support pipeline input
21
+ if ($MyInvocation.ExpectingInput) {
22
+ $input | & "node$exe" "$basedir/../mime/cli.js" $args
23
+ } else {
24
+ & "node$exe" "$basedir/../mime/cli.js" $args
25
+ }
26
+ $ret=$LASTEXITCODE
27
+ }
28
+ exit $ret
sandbox/node_modules/.bin/playwright ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -x "$basedir/node" ]; then
13
+ exec "$basedir/node" "$basedir/../playwright/cli.js" "$@"
14
+ else
15
+ exec node "$basedir/../playwright/cli.js" "$@"
16
+ fi
sandbox/node_modules/.bin/playwright-core ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -x "$basedir/node" ]; then
13
+ exec "$basedir/node" "$basedir/../playwright-core/cli.js" "$@"
14
+ else
15
+ exec node "$basedir/../playwright-core/cli.js" "$@"
16
+ fi
sandbox/node_modules/.bin/playwright-core.cmd ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @ECHO off
2
+ GOTO start
3
+ :find_dp0
4
+ SET dp0=%~dp0
5
+ EXIT /b
6
+ :start
7
+ SETLOCAL
8
+ CALL :find_dp0
9
+
10
+ IF EXIST "%dp0%\node.exe" (
11
+ SET "_prog=%dp0%\node.exe"
12
+ ) ELSE (
13
+ SET "_prog=node"
14
+ SET PATHEXT=%PATHEXT:;.JS;=;%
15
+ )
16
+
17
+ endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\playwright-core\cli.js" %*
sandbox/node_modules/.bin/playwright-core.ps1 ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env pwsh
2
+ $basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
3
+
4
+ $exe=""
5
+ if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
6
+ # Fix case when both the Windows and Linux builds of Node
7
+ # are installed in the same directory
8
+ $exe=".exe"
9
+ }
10
+ $ret=0
11
+ if (Test-Path "$basedir/node$exe") {
12
+ # Support pipeline input
13
+ if ($MyInvocation.ExpectingInput) {
14
+ $input | & "$basedir/node$exe" "$basedir/../playwright-core/cli.js" $args
15
+ } else {
16
+ & "$basedir/node$exe" "$basedir/../playwright-core/cli.js" $args
17
+ }
18
+ $ret=$LASTEXITCODE
19
+ } else {
20
+ # Support pipeline input
21
+ if ($MyInvocation.ExpectingInput) {
22
+ $input | & "node$exe" "$basedir/../playwright-core/cli.js" $args
23
+ } else {
24
+ & "node$exe" "$basedir/../playwright-core/cli.js" $args
25
+ }
26
+ $ret=$LASTEXITCODE
27
+ }
28
+ exit $ret
sandbox/node_modules/.bin/playwright.cmd ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @ECHO off
2
+ GOTO start
3
+ :find_dp0
4
+ SET dp0=%~dp0
5
+ EXIT /b
6
+ :start
7
+ SETLOCAL
8
+ CALL :find_dp0
9
+
10
+ IF EXIST "%dp0%\node.exe" (
11
+ SET "_prog=%dp0%\node.exe"
12
+ ) ELSE (
13
+ SET "_prog=node"
14
+ SET PATHEXT=%PATHEXT:;.JS;=;%
15
+ )
16
+
17
+ endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\playwright\cli.js" %*
sandbox/node_modules/.bin/playwright.ps1 ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env pwsh
2
+ $basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
3
+
4
+ $exe=""
5
+ if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
6
+ # Fix case when both the Windows and Linux builds of Node
7
+ # are installed in the same directory
8
+ $exe=".exe"
9
+ }
10
+ $ret=0
11
+ if (Test-Path "$basedir/node$exe") {
12
+ # Support pipeline input
13
+ if ($MyInvocation.ExpectingInput) {
14
+ $input | & "$basedir/node$exe" "$basedir/../playwright/cli.js" $args
15
+ } else {
16
+ & "$basedir/node$exe" "$basedir/../playwright/cli.js" $args
17
+ }
18
+ $ret=$LASTEXITCODE
19
+ } else {
20
+ # Support pipeline input
21
+ if ($MyInvocation.ExpectingInput) {
22
+ $input | & "node$exe" "$basedir/../playwright/cli.js" $args
23
+ } else {
24
+ & "node$exe" "$basedir/../playwright/cli.js" $args
25
+ }
26
+ $ret=$LASTEXITCODE
27
+ }
28
+ exit $ret
sandbox/node_modules/.package-lock.json ADDED
@@ -0,0 +1,850 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "headless-url-sandbox",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "node_modules/accepts": {
8
+ "version": "1.3.8",
9
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
10
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
11
+ "license": "MIT",
12
+ "dependencies": {
13
+ "mime-types": "~2.1.34",
14
+ "negotiator": "0.6.3"
15
+ },
16
+ "engines": {
17
+ "node": ">= 0.6"
18
+ }
19
+ },
20
+ "node_modules/array-flatten": {
21
+ "version": "1.1.1",
22
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
23
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
24
+ "license": "MIT"
25
+ },
26
+ "node_modules/body-parser": {
27
+ "version": "1.20.5",
28
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz",
29
+ "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==",
30
+ "license": "MIT",
31
+ "dependencies": {
32
+ "bytes": "~3.1.2",
33
+ "content-type": "~1.0.5",
34
+ "debug": "2.6.9",
35
+ "depd": "2.0.0",
36
+ "destroy": "~1.2.0",
37
+ "http-errors": "~2.0.1",
38
+ "iconv-lite": "~0.4.24",
39
+ "on-finished": "~2.4.1",
40
+ "qs": "~6.15.1",
41
+ "raw-body": "~2.5.3",
42
+ "type-is": "~1.6.18",
43
+ "unpipe": "~1.0.0"
44
+ },
45
+ "engines": {
46
+ "node": ">= 0.8",
47
+ "npm": "1.2.8000 || >= 1.4.16"
48
+ }
49
+ },
50
+ "node_modules/bytes": {
51
+ "version": "3.1.2",
52
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
53
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
54
+ "license": "MIT",
55
+ "engines": {
56
+ "node": ">= 0.8"
57
+ }
58
+ },
59
+ "node_modules/call-bind-apply-helpers": {
60
+ "version": "1.0.2",
61
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
62
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
63
+ "license": "MIT",
64
+ "dependencies": {
65
+ "es-errors": "^1.3.0",
66
+ "function-bind": "^1.1.2"
67
+ },
68
+ "engines": {
69
+ "node": ">= 0.4"
70
+ }
71
+ },
72
+ "node_modules/call-bound": {
73
+ "version": "1.0.4",
74
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
75
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
76
+ "license": "MIT",
77
+ "dependencies": {
78
+ "call-bind-apply-helpers": "^1.0.2",
79
+ "get-intrinsic": "^1.3.0"
80
+ },
81
+ "engines": {
82
+ "node": ">= 0.4"
83
+ },
84
+ "funding": {
85
+ "url": "https://github.com/sponsors/ljharb"
86
+ }
87
+ },
88
+ "node_modules/content-disposition": {
89
+ "version": "0.5.4",
90
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
91
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
92
+ "license": "MIT",
93
+ "dependencies": {
94
+ "safe-buffer": "5.2.1"
95
+ },
96
+ "engines": {
97
+ "node": ">= 0.6"
98
+ }
99
+ },
100
+ "node_modules/content-type": {
101
+ "version": "1.0.5",
102
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
103
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
104
+ "license": "MIT",
105
+ "engines": {
106
+ "node": ">= 0.6"
107
+ }
108
+ },
109
+ "node_modules/cookie": {
110
+ "version": "0.7.2",
111
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
112
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
113
+ "license": "MIT",
114
+ "engines": {
115
+ "node": ">= 0.6"
116
+ }
117
+ },
118
+ "node_modules/cookie-signature": {
119
+ "version": "1.0.7",
120
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz",
121
+ "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==",
122
+ "license": "MIT"
123
+ },
124
+ "node_modules/debug": {
125
+ "version": "2.6.9",
126
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
127
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
128
+ "license": "MIT",
129
+ "dependencies": {
130
+ "ms": "2.0.0"
131
+ }
132
+ },
133
+ "node_modules/depd": {
134
+ "version": "2.0.0",
135
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
136
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
137
+ "license": "MIT",
138
+ "engines": {
139
+ "node": ">= 0.8"
140
+ }
141
+ },
142
+ "node_modules/destroy": {
143
+ "version": "1.2.0",
144
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
145
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
146
+ "license": "MIT",
147
+ "engines": {
148
+ "node": ">= 0.8",
149
+ "npm": "1.2.8000 || >= 1.4.16"
150
+ }
151
+ },
152
+ "node_modules/dunder-proto": {
153
+ "version": "1.0.1",
154
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
155
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
156
+ "license": "MIT",
157
+ "dependencies": {
158
+ "call-bind-apply-helpers": "^1.0.1",
159
+ "es-errors": "^1.3.0",
160
+ "gopd": "^1.2.0"
161
+ },
162
+ "engines": {
163
+ "node": ">= 0.4"
164
+ }
165
+ },
166
+ "node_modules/ee-first": {
167
+ "version": "1.1.1",
168
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
169
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
170
+ "license": "MIT"
171
+ },
172
+ "node_modules/encodeurl": {
173
+ "version": "2.0.0",
174
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
175
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
176
+ "license": "MIT",
177
+ "engines": {
178
+ "node": ">= 0.8"
179
+ }
180
+ },
181
+ "node_modules/es-define-property": {
182
+ "version": "1.0.1",
183
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
184
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
185
+ "license": "MIT",
186
+ "engines": {
187
+ "node": ">= 0.4"
188
+ }
189
+ },
190
+ "node_modules/es-errors": {
191
+ "version": "1.3.0",
192
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
193
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
194
+ "license": "MIT",
195
+ "engines": {
196
+ "node": ">= 0.4"
197
+ }
198
+ },
199
+ "node_modules/es-object-atoms": {
200
+ "version": "1.1.2",
201
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
202
+ "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
203
+ "license": "MIT",
204
+ "dependencies": {
205
+ "es-errors": "^1.3.0"
206
+ },
207
+ "engines": {
208
+ "node": ">= 0.4"
209
+ }
210
+ },
211
+ "node_modules/escape-html": {
212
+ "version": "1.0.3",
213
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
214
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
215
+ "license": "MIT"
216
+ },
217
+ "node_modules/etag": {
218
+ "version": "1.8.1",
219
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
220
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
221
+ "license": "MIT",
222
+ "engines": {
223
+ "node": ">= 0.6"
224
+ }
225
+ },
226
+ "node_modules/express": {
227
+ "version": "4.22.2",
228
+ "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz",
229
+ "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==",
230
+ "license": "MIT",
231
+ "dependencies": {
232
+ "accepts": "~1.3.8",
233
+ "array-flatten": "1.1.1",
234
+ "body-parser": "~1.20.5",
235
+ "content-disposition": "~0.5.4",
236
+ "content-type": "~1.0.4",
237
+ "cookie": "~0.7.1",
238
+ "cookie-signature": "~1.0.6",
239
+ "debug": "2.6.9",
240
+ "depd": "2.0.0",
241
+ "encodeurl": "~2.0.0",
242
+ "escape-html": "~1.0.3",
243
+ "etag": "~1.8.1",
244
+ "finalhandler": "~1.3.1",
245
+ "fresh": "~0.5.2",
246
+ "http-errors": "~2.0.0",
247
+ "merge-descriptors": "1.0.3",
248
+ "methods": "~1.1.2",
249
+ "on-finished": "~2.4.1",
250
+ "parseurl": "~1.3.3",
251
+ "path-to-regexp": "~0.1.12",
252
+ "proxy-addr": "~2.0.7",
253
+ "qs": "~6.15.1",
254
+ "range-parser": "~1.2.1",
255
+ "safe-buffer": "5.2.1",
256
+ "send": "~0.19.0",
257
+ "serve-static": "~1.16.2",
258
+ "setprototypeof": "1.2.0",
259
+ "statuses": "~2.0.1",
260
+ "type-is": "~1.6.18",
261
+ "utils-merge": "1.0.1",
262
+ "vary": "~1.1.2"
263
+ },
264
+ "engines": {
265
+ "node": ">= 0.10.0"
266
+ },
267
+ "funding": {
268
+ "type": "opencollective",
269
+ "url": "https://opencollective.com/express"
270
+ }
271
+ },
272
+ "node_modules/finalhandler": {
273
+ "version": "1.3.2",
274
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz",
275
+ "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==",
276
+ "license": "MIT",
277
+ "dependencies": {
278
+ "debug": "2.6.9",
279
+ "encodeurl": "~2.0.0",
280
+ "escape-html": "~1.0.3",
281
+ "on-finished": "~2.4.1",
282
+ "parseurl": "~1.3.3",
283
+ "statuses": "~2.0.2",
284
+ "unpipe": "~1.0.0"
285
+ },
286
+ "engines": {
287
+ "node": ">= 0.8"
288
+ }
289
+ },
290
+ "node_modules/forwarded": {
291
+ "version": "0.2.0",
292
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
293
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
294
+ "license": "MIT",
295
+ "engines": {
296
+ "node": ">= 0.6"
297
+ }
298
+ },
299
+ "node_modules/fresh": {
300
+ "version": "0.5.2",
301
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
302
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
303
+ "license": "MIT",
304
+ "engines": {
305
+ "node": ">= 0.6"
306
+ }
307
+ },
308
+ "node_modules/function-bind": {
309
+ "version": "1.1.2",
310
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
311
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
312
+ "license": "MIT",
313
+ "funding": {
314
+ "url": "https://github.com/sponsors/ljharb"
315
+ }
316
+ },
317
+ "node_modules/get-intrinsic": {
318
+ "version": "1.3.0",
319
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
320
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
321
+ "license": "MIT",
322
+ "dependencies": {
323
+ "call-bind-apply-helpers": "^1.0.2",
324
+ "es-define-property": "^1.0.1",
325
+ "es-errors": "^1.3.0",
326
+ "es-object-atoms": "^1.1.1",
327
+ "function-bind": "^1.1.2",
328
+ "get-proto": "^1.0.1",
329
+ "gopd": "^1.2.0",
330
+ "has-symbols": "^1.1.0",
331
+ "hasown": "^2.0.2",
332
+ "math-intrinsics": "^1.1.0"
333
+ },
334
+ "engines": {
335
+ "node": ">= 0.4"
336
+ },
337
+ "funding": {
338
+ "url": "https://github.com/sponsors/ljharb"
339
+ }
340
+ },
341
+ "node_modules/get-proto": {
342
+ "version": "1.0.1",
343
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
344
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
345
+ "license": "MIT",
346
+ "dependencies": {
347
+ "dunder-proto": "^1.0.1",
348
+ "es-object-atoms": "^1.0.0"
349
+ },
350
+ "engines": {
351
+ "node": ">= 0.4"
352
+ }
353
+ },
354
+ "node_modules/gopd": {
355
+ "version": "1.2.0",
356
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
357
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
358
+ "license": "MIT",
359
+ "engines": {
360
+ "node": ">= 0.4"
361
+ },
362
+ "funding": {
363
+ "url": "https://github.com/sponsors/ljharb"
364
+ }
365
+ },
366
+ "node_modules/has-symbols": {
367
+ "version": "1.1.0",
368
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
369
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
370
+ "license": "MIT",
371
+ "engines": {
372
+ "node": ">= 0.4"
373
+ },
374
+ "funding": {
375
+ "url": "https://github.com/sponsors/ljharb"
376
+ }
377
+ },
378
+ "node_modules/hasown": {
379
+ "version": "2.0.3",
380
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz",
381
+ "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==",
382
+ "license": "MIT",
383
+ "dependencies": {
384
+ "function-bind": "^1.1.2"
385
+ },
386
+ "engines": {
387
+ "node": ">= 0.4"
388
+ }
389
+ },
390
+ "node_modules/http-errors": {
391
+ "version": "2.0.1",
392
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
393
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
394
+ "license": "MIT",
395
+ "dependencies": {
396
+ "depd": "~2.0.0",
397
+ "inherits": "~2.0.4",
398
+ "setprototypeof": "~1.2.0",
399
+ "statuses": "~2.0.2",
400
+ "toidentifier": "~1.0.1"
401
+ },
402
+ "engines": {
403
+ "node": ">= 0.8"
404
+ },
405
+ "funding": {
406
+ "type": "opencollective",
407
+ "url": "https://opencollective.com/express"
408
+ }
409
+ },
410
+ "node_modules/iconv-lite": {
411
+ "version": "0.4.24",
412
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
413
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
414
+ "license": "MIT",
415
+ "dependencies": {
416
+ "safer-buffer": ">= 2.1.2 < 3"
417
+ },
418
+ "engines": {
419
+ "node": ">=0.10.0"
420
+ }
421
+ },
422
+ "node_modules/inherits": {
423
+ "version": "2.0.4",
424
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
425
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
426
+ "license": "ISC"
427
+ },
428
+ "node_modules/ipaddr.js": {
429
+ "version": "1.9.1",
430
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
431
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
432
+ "license": "MIT",
433
+ "engines": {
434
+ "node": ">= 0.10"
435
+ }
436
+ },
437
+ "node_modules/math-intrinsics": {
438
+ "version": "1.1.0",
439
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
440
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
441
+ "license": "MIT",
442
+ "engines": {
443
+ "node": ">= 0.4"
444
+ }
445
+ },
446
+ "node_modules/media-typer": {
447
+ "version": "0.3.0",
448
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
449
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
450
+ "license": "MIT",
451
+ "engines": {
452
+ "node": ">= 0.6"
453
+ }
454
+ },
455
+ "node_modules/merge-descriptors": {
456
+ "version": "1.0.3",
457
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
458
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
459
+ "license": "MIT",
460
+ "funding": {
461
+ "url": "https://github.com/sponsors/sindresorhus"
462
+ }
463
+ },
464
+ "node_modules/methods": {
465
+ "version": "1.1.2",
466
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
467
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
468
+ "license": "MIT",
469
+ "engines": {
470
+ "node": ">= 0.6"
471
+ }
472
+ },
473
+ "node_modules/mime": {
474
+ "version": "1.6.0",
475
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
476
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
477
+ "license": "MIT",
478
+ "bin": {
479
+ "mime": "cli.js"
480
+ },
481
+ "engines": {
482
+ "node": ">=4"
483
+ }
484
+ },
485
+ "node_modules/mime-db": {
486
+ "version": "1.52.0",
487
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
488
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
489
+ "license": "MIT",
490
+ "engines": {
491
+ "node": ">= 0.6"
492
+ }
493
+ },
494
+ "node_modules/mime-types": {
495
+ "version": "2.1.35",
496
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
497
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
498
+ "license": "MIT",
499
+ "dependencies": {
500
+ "mime-db": "1.52.0"
501
+ },
502
+ "engines": {
503
+ "node": ">= 0.6"
504
+ }
505
+ },
506
+ "node_modules/ms": {
507
+ "version": "2.0.0",
508
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
509
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
510
+ "license": "MIT"
511
+ },
512
+ "node_modules/negotiator": {
513
+ "version": "0.6.3",
514
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
515
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
516
+ "license": "MIT",
517
+ "engines": {
518
+ "node": ">= 0.6"
519
+ }
520
+ },
521
+ "node_modules/object-inspect": {
522
+ "version": "1.13.4",
523
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
524
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
525
+ "license": "MIT",
526
+ "engines": {
527
+ "node": ">= 0.4"
528
+ },
529
+ "funding": {
530
+ "url": "https://github.com/sponsors/ljharb"
531
+ }
532
+ },
533
+ "node_modules/on-finished": {
534
+ "version": "2.4.1",
535
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
536
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
537
+ "license": "MIT",
538
+ "dependencies": {
539
+ "ee-first": "1.1.1"
540
+ },
541
+ "engines": {
542
+ "node": ">= 0.8"
543
+ }
544
+ },
545
+ "node_modules/parseurl": {
546
+ "version": "1.3.3",
547
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
548
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
549
+ "license": "MIT",
550
+ "engines": {
551
+ "node": ">= 0.8"
552
+ }
553
+ },
554
+ "node_modules/path-to-regexp": {
555
+ "version": "0.1.13",
556
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz",
557
+ "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==",
558
+ "license": "MIT"
559
+ },
560
+ "node_modules/playwright": {
561
+ "version": "1.60.0",
562
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.60.0.tgz",
563
+ "integrity": "sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==",
564
+ "license": "Apache-2.0",
565
+ "dependencies": {
566
+ "playwright-core": "1.60.0"
567
+ },
568
+ "bin": {
569
+ "playwright": "cli.js"
570
+ },
571
+ "engines": {
572
+ "node": ">=18"
573
+ },
574
+ "optionalDependencies": {
575
+ "fsevents": "2.3.2"
576
+ }
577
+ },
578
+ "node_modules/playwright-core": {
579
+ "version": "1.60.0",
580
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.60.0.tgz",
581
+ "integrity": "sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==",
582
+ "license": "Apache-2.0",
583
+ "bin": {
584
+ "playwright-core": "cli.js"
585
+ },
586
+ "engines": {
587
+ "node": ">=18"
588
+ }
589
+ },
590
+ "node_modules/proxy-addr": {
591
+ "version": "2.0.7",
592
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
593
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
594
+ "license": "MIT",
595
+ "dependencies": {
596
+ "forwarded": "0.2.0",
597
+ "ipaddr.js": "1.9.1"
598
+ },
599
+ "engines": {
600
+ "node": ">= 0.10"
601
+ }
602
+ },
603
+ "node_modules/qs": {
604
+ "version": "6.15.2",
605
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz",
606
+ "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==",
607
+ "license": "BSD-3-Clause",
608
+ "dependencies": {
609
+ "side-channel": "^1.1.0"
610
+ },
611
+ "engines": {
612
+ "node": ">=0.6"
613
+ },
614
+ "funding": {
615
+ "url": "https://github.com/sponsors/ljharb"
616
+ }
617
+ },
618
+ "node_modules/range-parser": {
619
+ "version": "1.2.1",
620
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
621
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
622
+ "license": "MIT",
623
+ "engines": {
624
+ "node": ">= 0.6"
625
+ }
626
+ },
627
+ "node_modules/raw-body": {
628
+ "version": "2.5.3",
629
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
630
+ "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==",
631
+ "license": "MIT",
632
+ "dependencies": {
633
+ "bytes": "~3.1.2",
634
+ "http-errors": "~2.0.1",
635
+ "iconv-lite": "~0.4.24",
636
+ "unpipe": "~1.0.0"
637
+ },
638
+ "engines": {
639
+ "node": ">= 0.8"
640
+ }
641
+ },
642
+ "node_modules/safe-buffer": {
643
+ "version": "5.2.1",
644
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
645
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
646
+ "funding": [
647
+ {
648
+ "type": "github",
649
+ "url": "https://github.com/sponsors/feross"
650
+ },
651
+ {
652
+ "type": "patreon",
653
+ "url": "https://www.patreon.com/feross"
654
+ },
655
+ {
656
+ "type": "consulting",
657
+ "url": "https://feross.org/support"
658
+ }
659
+ ],
660
+ "license": "MIT"
661
+ },
662
+ "node_modules/safer-buffer": {
663
+ "version": "2.1.2",
664
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
665
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
666
+ "license": "MIT"
667
+ },
668
+ "node_modules/send": {
669
+ "version": "0.19.2",
670
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz",
671
+ "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==",
672
+ "license": "MIT",
673
+ "dependencies": {
674
+ "debug": "2.6.9",
675
+ "depd": "2.0.0",
676
+ "destroy": "1.2.0",
677
+ "encodeurl": "~2.0.0",
678
+ "escape-html": "~1.0.3",
679
+ "etag": "~1.8.1",
680
+ "fresh": "~0.5.2",
681
+ "http-errors": "~2.0.1",
682
+ "mime": "1.6.0",
683
+ "ms": "2.1.3",
684
+ "on-finished": "~2.4.1",
685
+ "range-parser": "~1.2.1",
686
+ "statuses": "~2.0.2"
687
+ },
688
+ "engines": {
689
+ "node": ">= 0.8.0"
690
+ }
691
+ },
692
+ "node_modules/send/node_modules/ms": {
693
+ "version": "2.1.3",
694
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
695
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
696
+ "license": "MIT"
697
+ },
698
+ "node_modules/serve-static": {
699
+ "version": "1.16.3",
700
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz",
701
+ "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==",
702
+ "license": "MIT",
703
+ "dependencies": {
704
+ "encodeurl": "~2.0.0",
705
+ "escape-html": "~1.0.3",
706
+ "parseurl": "~1.3.3",
707
+ "send": "~0.19.1"
708
+ },
709
+ "engines": {
710
+ "node": ">= 0.8.0"
711
+ }
712
+ },
713
+ "node_modules/setprototypeof": {
714
+ "version": "1.2.0",
715
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
716
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
717
+ "license": "ISC"
718
+ },
719
+ "node_modules/side-channel": {
720
+ "version": "1.1.0",
721
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
722
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
723
+ "license": "MIT",
724
+ "dependencies": {
725
+ "es-errors": "^1.3.0",
726
+ "object-inspect": "^1.13.3",
727
+ "side-channel-list": "^1.0.0",
728
+ "side-channel-map": "^1.0.1",
729
+ "side-channel-weakmap": "^1.0.2"
730
+ },
731
+ "engines": {
732
+ "node": ">= 0.4"
733
+ },
734
+ "funding": {
735
+ "url": "https://github.com/sponsors/ljharb"
736
+ }
737
+ },
738
+ "node_modules/side-channel-list": {
739
+ "version": "1.0.1",
740
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
741
+ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
742
+ "license": "MIT",
743
+ "dependencies": {
744
+ "es-errors": "^1.3.0",
745
+ "object-inspect": "^1.13.4"
746
+ },
747
+ "engines": {
748
+ "node": ">= 0.4"
749
+ },
750
+ "funding": {
751
+ "url": "https://github.com/sponsors/ljharb"
752
+ }
753
+ },
754
+ "node_modules/side-channel-map": {
755
+ "version": "1.0.1",
756
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
757
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
758
+ "license": "MIT",
759
+ "dependencies": {
760
+ "call-bound": "^1.0.2",
761
+ "es-errors": "^1.3.0",
762
+ "get-intrinsic": "^1.2.5",
763
+ "object-inspect": "^1.13.3"
764
+ },
765
+ "engines": {
766
+ "node": ">= 0.4"
767
+ },
768
+ "funding": {
769
+ "url": "https://github.com/sponsors/ljharb"
770
+ }
771
+ },
772
+ "node_modules/side-channel-weakmap": {
773
+ "version": "1.0.2",
774
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
775
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
776
+ "license": "MIT",
777
+ "dependencies": {
778
+ "call-bound": "^1.0.2",
779
+ "es-errors": "^1.3.0",
780
+ "get-intrinsic": "^1.2.5",
781
+ "object-inspect": "^1.13.3",
782
+ "side-channel-map": "^1.0.1"
783
+ },
784
+ "engines": {
785
+ "node": ">= 0.4"
786
+ },
787
+ "funding": {
788
+ "url": "https://github.com/sponsors/ljharb"
789
+ }
790
+ },
791
+ "node_modules/statuses": {
792
+ "version": "2.0.2",
793
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
794
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
795
+ "license": "MIT",
796
+ "engines": {
797
+ "node": ">= 0.8"
798
+ }
799
+ },
800
+ "node_modules/toidentifier": {
801
+ "version": "1.0.1",
802
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
803
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
804
+ "license": "MIT",
805
+ "engines": {
806
+ "node": ">=0.6"
807
+ }
808
+ },
809
+ "node_modules/type-is": {
810
+ "version": "1.6.18",
811
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
812
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
813
+ "license": "MIT",
814
+ "dependencies": {
815
+ "media-typer": "0.3.0",
816
+ "mime-types": "~2.1.24"
817
+ },
818
+ "engines": {
819
+ "node": ">= 0.6"
820
+ }
821
+ },
822
+ "node_modules/unpipe": {
823
+ "version": "1.0.0",
824
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
825
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
826
+ "license": "MIT",
827
+ "engines": {
828
+ "node": ">= 0.8"
829
+ }
830
+ },
831
+ "node_modules/utils-merge": {
832
+ "version": "1.0.1",
833
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
834
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
835
+ "license": "MIT",
836
+ "engines": {
837
+ "node": ">= 0.4.0"
838
+ }
839
+ },
840
+ "node_modules/vary": {
841
+ "version": "1.1.2",
842
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
843
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
844
+ "license": "MIT",
845
+ "engines": {
846
+ "node": ">= 0.8"
847
+ }
848
+ }
849
+ }
850
+ }
sandbox/node_modules/accepts/HISTORY.md ADDED
@@ -0,0 +1,243 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 1.3.8 / 2022-02-02
2
+ ==================
3
+
4
+ * deps: mime-types@~2.1.34
5
+ - deps: mime-db@~1.51.0
6
+ * deps: negotiator@0.6.3
7
+
8
+ 1.3.7 / 2019-04-29
9
+ ==================
10
+
11
+ * deps: negotiator@0.6.2
12
+ - Fix sorting charset, encoding, and language with extra parameters
13
+
14
+ 1.3.6 / 2019-04-28
15
+ ==================
16
+
17
+ * deps: mime-types@~2.1.24
18
+ - deps: mime-db@~1.40.0
19
+
20
+ 1.3.5 / 2018-02-28
21
+ ==================
22
+
23
+ * deps: mime-types@~2.1.18
24
+ - deps: mime-db@~1.33.0
25
+
26
+ 1.3.4 / 2017-08-22
27
+ ==================
28
+
29
+ * deps: mime-types@~2.1.16
30
+ - deps: mime-db@~1.29.0
31
+
32
+ 1.3.3 / 2016-05-02
33
+ ==================
34
+
35
+ * deps: mime-types@~2.1.11
36
+ - deps: mime-db@~1.23.0
37
+ * deps: negotiator@0.6.1
38
+ - perf: improve `Accept` parsing speed
39
+ - perf: improve `Accept-Charset` parsing speed
40
+ - perf: improve `Accept-Encoding` parsing speed
41
+ - perf: improve `Accept-Language` parsing speed
42
+
43
+ 1.3.2 / 2016-03-08
44
+ ==================
45
+
46
+ * deps: mime-types@~2.1.10
47
+ - Fix extension of `application/dash+xml`
48
+ - Update primary extension for `audio/mp4`
49
+ - deps: mime-db@~1.22.0
50
+
51
+ 1.3.1 / 2016-01-19
52
+ ==================
53
+
54
+ * deps: mime-types@~2.1.9
55
+ - deps: mime-db@~1.21.0
56
+
57
+ 1.3.0 / 2015-09-29
58
+ ==================
59
+
60
+ * deps: mime-types@~2.1.7
61
+ - deps: mime-db@~1.19.0
62
+ * deps: negotiator@0.6.0
63
+ - Fix including type extensions in parameters in `Accept` parsing
64
+ - Fix parsing `Accept` parameters with quoted equals
65
+ - Fix parsing `Accept` parameters with quoted semicolons
66
+ - Lazy-load modules from main entry point
67
+ - perf: delay type concatenation until needed
68
+ - perf: enable strict mode
69
+ - perf: hoist regular expressions
70
+ - perf: remove closures getting spec properties
71
+ - perf: remove a closure from media type parsing
72
+ - perf: remove property delete from media type parsing
73
+
74
+ 1.2.13 / 2015-09-06
75
+ ===================
76
+
77
+ * deps: mime-types@~2.1.6
78
+ - deps: mime-db@~1.18.0
79
+
80
+ 1.2.12 / 2015-07-30
81
+ ===================
82
+
83
+ * deps: mime-types@~2.1.4
84
+ - deps: mime-db@~1.16.0
85
+
86
+ 1.2.11 / 2015-07-16
87
+ ===================
88
+
89
+ * deps: mime-types@~2.1.3
90
+ - deps: mime-db@~1.15.0
91
+
92
+ 1.2.10 / 2015-07-01
93
+ ===================
94
+
95
+ * deps: mime-types@~2.1.2
96
+ - deps: mime-db@~1.14.0
97
+
98
+ 1.2.9 / 2015-06-08
99
+ ==================
100
+
101
+ * deps: mime-types@~2.1.1
102
+ - perf: fix deopt during mapping
103
+
104
+ 1.2.8 / 2015-06-07
105
+ ==================
106
+
107
+ * deps: mime-types@~2.1.0
108
+ - deps: mime-db@~1.13.0
109
+ * perf: avoid argument reassignment & argument slice
110
+ * perf: avoid negotiator recursive construction
111
+ * perf: enable strict mode
112
+ * perf: remove unnecessary bitwise operator
113
+
114
+ 1.2.7 / 2015-05-10
115
+ ==================
116
+
117
+ * deps: negotiator@0.5.3
118
+ - Fix media type parameter matching to be case-insensitive
119
+
120
+ 1.2.6 / 2015-05-07
121
+ ==================
122
+
123
+ * deps: mime-types@~2.0.11
124
+ - deps: mime-db@~1.9.1
125
+ * deps: negotiator@0.5.2
126
+ - Fix comparing media types with quoted values
127
+ - Fix splitting media types with quoted commas
128
+
129
+ 1.2.5 / 2015-03-13
130
+ ==================
131
+
132
+ * deps: mime-types@~2.0.10
133
+ - deps: mime-db@~1.8.0
134
+
135
+ 1.2.4 / 2015-02-14
136
+ ==================
137
+
138
+ * Support Node.js 0.6
139
+ * deps: mime-types@~2.0.9
140
+ - deps: mime-db@~1.7.0
141
+ * deps: negotiator@0.5.1
142
+ - Fix preference sorting to be stable for long acceptable lists
143
+
144
+ 1.2.3 / 2015-01-31
145
+ ==================
146
+
147
+ * deps: mime-types@~2.0.8
148
+ - deps: mime-db@~1.6.0
149
+
150
+ 1.2.2 / 2014-12-30
151
+ ==================
152
+
153
+ * deps: mime-types@~2.0.7
154
+ - deps: mime-db@~1.5.0
155
+
156
+ 1.2.1 / 2014-12-30
157
+ ==================
158
+
159
+ * deps: mime-types@~2.0.5
160
+ - deps: mime-db@~1.3.1
161
+
162
+ 1.2.0 / 2014-12-19
163
+ ==================
164
+
165
+ * deps: negotiator@0.5.0
166
+ - Fix list return order when large accepted list
167
+ - Fix missing identity encoding when q=0 exists
168
+ - Remove dynamic building of Negotiator class
169
+
170
+ 1.1.4 / 2014-12-10
171
+ ==================
172
+
173
+ * deps: mime-types@~2.0.4
174
+ - deps: mime-db@~1.3.0
175
+
176
+ 1.1.3 / 2014-11-09
177
+ ==================
178
+
179
+ * deps: mime-types@~2.0.3
180
+ - deps: mime-db@~1.2.0
181
+
182
+ 1.1.2 / 2014-10-14
183
+ ==================
184
+
185
+ * deps: negotiator@0.4.9
186
+ - Fix error when media type has invalid parameter
187
+
188
+ 1.1.1 / 2014-09-28
189
+ ==================
190
+
191
+ * deps: mime-types@~2.0.2
192
+ - deps: mime-db@~1.1.0
193
+ * deps: negotiator@0.4.8
194
+ - Fix all negotiations to be case-insensitive
195
+ - Stable sort preferences of same quality according to client order
196
+
197
+ 1.1.0 / 2014-09-02
198
+ ==================
199
+
200
+ * update `mime-types`
201
+
202
+ 1.0.7 / 2014-07-04
203
+ ==================
204
+
205
+ * Fix wrong type returned from `type` when match after unknown extension
206
+
207
+ 1.0.6 / 2014-06-24
208
+ ==================
209
+
210
+ * deps: negotiator@0.4.7
211
+
212
+ 1.0.5 / 2014-06-20
213
+ ==================
214
+
215
+ * fix crash when unknown extension given
216
+
217
+ 1.0.4 / 2014-06-19
218
+ ==================
219
+
220
+ * use `mime-types`
221
+
222
+ 1.0.3 / 2014-06-11
223
+ ==================
224
+
225
+ * deps: negotiator@0.4.6
226
+ - Order by specificity when quality is the same
227
+
228
+ 1.0.2 / 2014-05-29
229
+ ==================
230
+
231
+ * Fix interpretation when header not in request
232
+ * deps: pin negotiator@0.4.5
233
+
234
+ 1.0.1 / 2014-01-18
235
+ ==================
236
+
237
+ * Identity encoding isn't always acceptable
238
+ * deps: negotiator@~0.4.0
239
+
240
+ 1.0.0 / 2013-12-27
241
+ ==================
242
+
243
+ * Genesis
sandbox/node_modules/accepts/LICENSE ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (The MIT License)
2
+
3
+ Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
4
+ Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining
7
+ a copy of this software and associated documentation files (the
8
+ 'Software'), to deal in the Software without restriction, including
9
+ without limitation the rights to use, copy, modify, merge, publish,
10
+ distribute, sublicense, and/or sell copies of the Software, and to
11
+ permit persons to whom the Software is furnished to do so, subject to
12
+ the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be
15
+ included in all copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
18
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
sandbox/node_modules/accepts/README.md ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # accepts
2
+
3
+ [![NPM Version][npm-version-image]][npm-url]
4
+ [![NPM Downloads][npm-downloads-image]][npm-url]
5
+ [![Node.js Version][node-version-image]][node-version-url]
6
+ [![Build Status][github-actions-ci-image]][github-actions-ci-url]
7
+ [![Test Coverage][coveralls-image]][coveralls-url]
8
+
9
+ Higher level content negotiation based on [negotiator](https://www.npmjs.com/package/negotiator).
10
+ Extracted from [koa](https://www.npmjs.com/package/koa) for general use.
11
+
12
+ In addition to negotiator, it allows:
13
+
14
+ - Allows types as an array or arguments list, ie `(['text/html', 'application/json'])`
15
+ as well as `('text/html', 'application/json')`.
16
+ - Allows type shorthands such as `json`.
17
+ - Returns `false` when no types match
18
+ - Treats non-existent headers as `*`
19
+
20
+ ## Installation
21
+
22
+ This is a [Node.js](https://nodejs.org/en/) module available through the
23
+ [npm registry](https://www.npmjs.com/). Installation is done using the
24
+ [`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
25
+
26
+ ```sh
27
+ $ npm install accepts
28
+ ```
29
+
30
+ ## API
31
+
32
+ ```js
33
+ var accepts = require('accepts')
34
+ ```
35
+
36
+ ### accepts(req)
37
+
38
+ Create a new `Accepts` object for the given `req`.
39
+
40
+ #### .charset(charsets)
41
+
42
+ Return the first accepted charset. If nothing in `charsets` is accepted,
43
+ then `false` is returned.
44
+
45
+ #### .charsets()
46
+
47
+ Return the charsets that the request accepts, in the order of the client's
48
+ preference (most preferred first).
49
+
50
+ #### .encoding(encodings)
51
+
52
+ Return the first accepted encoding. If nothing in `encodings` is accepted,
53
+ then `false` is returned.
54
+
55
+ #### .encodings()
56
+
57
+ Return the encodings that the request accepts, in the order of the client's
58
+ preference (most preferred first).
59
+
60
+ #### .language(languages)
61
+
62
+ Return the first accepted language. If nothing in `languages` is accepted,
63
+ then `false` is returned.
64
+
65
+ #### .languages()
66
+
67
+ Return the languages that the request accepts, in the order of the client's
68
+ preference (most preferred first).
69
+
70
+ #### .type(types)
71
+
72
+ Return the first accepted type (and it is returned as the same text as what
73
+ appears in the `types` array). If nothing in `types` is accepted, then `false`
74
+ is returned.
75
+
76
+ The `types` array can contain full MIME types or file extensions. Any value
77
+ that is not a full MIME types is passed to `require('mime-types').lookup`.
78
+
79
+ #### .types()
80
+
81
+ Return the types that the request accepts, in the order of the client's
82
+ preference (most preferred first).
83
+
84
+ ## Examples
85
+
86
+ ### Simple type negotiation
87
+
88
+ This simple example shows how to use `accepts` to return a different typed
89
+ respond body based on what the client wants to accept. The server lists it's
90
+ preferences in order and will get back the best match between the client and
91
+ server.
92
+
93
+ ```js
94
+ var accepts = require('accepts')
95
+ var http = require('http')
96
+
97
+ function app (req, res) {
98
+ var accept = accepts(req)
99
+
100
+ // the order of this list is significant; should be server preferred order
101
+ switch (accept.type(['json', 'html'])) {
102
+ case 'json':
103
+ res.setHeader('Content-Type', 'application/json')
104
+ res.write('{"hello":"world!"}')
105
+ break
106
+ case 'html':
107
+ res.setHeader('Content-Type', 'text/html')
108
+ res.write('<b>hello, world!</b>')
109
+ break
110
+ default:
111
+ // the fallback is text/plain, so no need to specify it above
112
+ res.setHeader('Content-Type', 'text/plain')
113
+ res.write('hello, world!')
114
+ break
115
+ }
116
+
117
+ res.end()
118
+ }
119
+
120
+ http.createServer(app).listen(3000)
121
+ ```
122
+
123
+ You can test this out with the cURL program:
124
+ ```sh
125
+ curl -I -H'Accept: text/html' http://localhost:3000/
126
+ ```
127
+
128
+ ## License
129
+
130
+ [MIT](LICENSE)
131
+
132
+ [coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/accepts/master
133
+ [coveralls-url]: https://coveralls.io/r/jshttp/accepts?branch=master
134
+ [github-actions-ci-image]: https://badgen.net/github/checks/jshttp/accepts/master?label=ci
135
+ [github-actions-ci-url]: https://github.com/jshttp/accepts/actions/workflows/ci.yml
136
+ [node-version-image]: https://badgen.net/npm/node/accepts
137
+ [node-version-url]: https://nodejs.org/en/download
138
+ [npm-downloads-image]: https://badgen.net/npm/dm/accepts
139
+ [npm-url]: https://npmjs.org/package/accepts
140
+ [npm-version-image]: https://badgen.net/npm/v/accepts
sandbox/node_modules/accepts/index.js ADDED
@@ -0,0 +1,238 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * accepts
3
+ * Copyright(c) 2014 Jonathan Ong
4
+ * Copyright(c) 2015 Douglas Christopher Wilson
5
+ * MIT Licensed
6
+ */
7
+
8
+ 'use strict'
9
+
10
+ /**
11
+ * Module dependencies.
12
+ * @private
13
+ */
14
+
15
+ var Negotiator = require('negotiator')
16
+ var mime = require('mime-types')
17
+
18
+ /**
19
+ * Module exports.
20
+ * @public
21
+ */
22
+
23
+ module.exports = Accepts
24
+
25
+ /**
26
+ * Create a new Accepts object for the given req.
27
+ *
28
+ * @param {object} req
29
+ * @public
30
+ */
31
+
32
+ function Accepts (req) {
33
+ if (!(this instanceof Accepts)) {
34
+ return new Accepts(req)
35
+ }
36
+
37
+ this.headers = req.headers
38
+ this.negotiator = new Negotiator(req)
39
+ }
40
+
41
+ /**
42
+ * Check if the given `type(s)` is acceptable, returning
43
+ * the best match when true, otherwise `undefined`, in which
44
+ * case you should respond with 406 "Not Acceptable".
45
+ *
46
+ * The `type` value may be a single mime type string
47
+ * such as "application/json", the extension name
48
+ * such as "json" or an array `["json", "html", "text/plain"]`. When a list
49
+ * or array is given the _best_ match, if any is returned.
50
+ *
51
+ * Examples:
52
+ *
53
+ * // Accept: text/html
54
+ * this.types('html');
55
+ * // => "html"
56
+ *
57
+ * // Accept: text/*, application/json
58
+ * this.types('html');
59
+ * // => "html"
60
+ * this.types('text/html');
61
+ * // => "text/html"
62
+ * this.types('json', 'text');
63
+ * // => "json"
64
+ * this.types('application/json');
65
+ * // => "application/json"
66
+ *
67
+ * // Accept: text/*, application/json
68
+ * this.types('image/png');
69
+ * this.types('png');
70
+ * // => undefined
71
+ *
72
+ * // Accept: text/*;q=.5, application/json
73
+ * this.types(['html', 'json']);
74
+ * this.types('html', 'json');
75
+ * // => "json"
76
+ *
77
+ * @param {String|Array} types...
78
+ * @return {String|Array|Boolean}
79
+ * @public
80
+ */
81
+
82
+ Accepts.prototype.type =
83
+ Accepts.prototype.types = function (types_) {
84
+ var types = types_
85
+
86
+ // support flattened arguments
87
+ if (types && !Array.isArray(types)) {
88
+ types = new Array(arguments.length)
89
+ for (var i = 0; i < types.length; i++) {
90
+ types[i] = arguments[i]
91
+ }
92
+ }
93
+
94
+ // no types, return all requested types
95
+ if (!types || types.length === 0) {
96
+ return this.negotiator.mediaTypes()
97
+ }
98
+
99
+ // no accept header, return first given type
100
+ if (!this.headers.accept) {
101
+ return types[0]
102
+ }
103
+
104
+ var mimes = types.map(extToMime)
105
+ var accepts = this.negotiator.mediaTypes(mimes.filter(validMime))
106
+ var first = accepts[0]
107
+
108
+ return first
109
+ ? types[mimes.indexOf(first)]
110
+ : false
111
+ }
112
+
113
+ /**
114
+ * Return accepted encodings or best fit based on `encodings`.
115
+ *
116
+ * Given `Accept-Encoding: gzip, deflate`
117
+ * an array sorted by quality is returned:
118
+ *
119
+ * ['gzip', 'deflate']
120
+ *
121
+ * @param {String|Array} encodings...
122
+ * @return {String|Array}
123
+ * @public
124
+ */
125
+
126
+ Accepts.prototype.encoding =
127
+ Accepts.prototype.encodings = function (encodings_) {
128
+ var encodings = encodings_
129
+
130
+ // support flattened arguments
131
+ if (encodings && !Array.isArray(encodings)) {
132
+ encodings = new Array(arguments.length)
133
+ for (var i = 0; i < encodings.length; i++) {
134
+ encodings[i] = arguments[i]
135
+ }
136
+ }
137
+
138
+ // no encodings, return all requested encodings
139
+ if (!encodings || encodings.length === 0) {
140
+ return this.negotiator.encodings()
141
+ }
142
+
143
+ return this.negotiator.encodings(encodings)[0] || false
144
+ }
145
+
146
+ /**
147
+ * Return accepted charsets or best fit based on `charsets`.
148
+ *
149
+ * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5`
150
+ * an array sorted by quality is returned:
151
+ *
152
+ * ['utf-8', 'utf-7', 'iso-8859-1']
153
+ *
154
+ * @param {String|Array} charsets...
155
+ * @return {String|Array}
156
+ * @public
157
+ */
158
+
159
+ Accepts.prototype.charset =
160
+ Accepts.prototype.charsets = function (charsets_) {
161
+ var charsets = charsets_
162
+
163
+ // support flattened arguments
164
+ if (charsets && !Array.isArray(charsets)) {
165
+ charsets = new Array(arguments.length)
166
+ for (var i = 0; i < charsets.length; i++) {
167
+ charsets[i] = arguments[i]
168
+ }
169
+ }
170
+
171
+ // no charsets, return all requested charsets
172
+ if (!charsets || charsets.length === 0) {
173
+ return this.negotiator.charsets()
174
+ }
175
+
176
+ return this.negotiator.charsets(charsets)[0] || false
177
+ }
178
+
179
+ /**
180
+ * Return accepted languages or best fit based on `langs`.
181
+ *
182
+ * Given `Accept-Language: en;q=0.8, es, pt`
183
+ * an array sorted by quality is returned:
184
+ *
185
+ * ['es', 'pt', 'en']
186
+ *
187
+ * @param {String|Array} langs...
188
+ * @return {Array|String}
189
+ * @public
190
+ */
191
+
192
+ Accepts.prototype.lang =
193
+ Accepts.prototype.langs =
194
+ Accepts.prototype.language =
195
+ Accepts.prototype.languages = function (languages_) {
196
+ var languages = languages_
197
+
198
+ // support flattened arguments
199
+ if (languages && !Array.isArray(languages)) {
200
+ languages = new Array(arguments.length)
201
+ for (var i = 0; i < languages.length; i++) {
202
+ languages[i] = arguments[i]
203
+ }
204
+ }
205
+
206
+ // no languages, return all requested languages
207
+ if (!languages || languages.length === 0) {
208
+ return this.negotiator.languages()
209
+ }
210
+
211
+ return this.negotiator.languages(languages)[0] || false
212
+ }
213
+
214
+ /**
215
+ * Convert extnames to mime.
216
+ *
217
+ * @param {String} type
218
+ * @return {String}
219
+ * @private
220
+ */
221
+
222
+ function extToMime (type) {
223
+ return type.indexOf('/') === -1
224
+ ? mime.lookup(type)
225
+ : type
226
+ }
227
+
228
+ /**
229
+ * Check if mime is valid.
230
+ *
231
+ * @param {String} type
232
+ * @return {String}
233
+ * @private
234
+ */
235
+
236
+ function validMime (type) {
237
+ return typeof type === 'string'
238
+ }
sandbox/node_modules/accepts/package.json ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "accepts",
3
+ "description": "Higher-level content negotiation",
4
+ "version": "1.3.8",
5
+ "contributors": [
6
+ "Douglas Christopher Wilson <doug@somethingdoug.com>",
7
+ "Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)"
8
+ ],
9
+ "license": "MIT",
10
+ "repository": "jshttp/accepts",
11
+ "dependencies": {
12
+ "mime-types": "~2.1.34",
13
+ "negotiator": "0.6.3"
14
+ },
15
+ "devDependencies": {
16
+ "deep-equal": "1.0.1",
17
+ "eslint": "7.32.0",
18
+ "eslint-config-standard": "14.1.1",
19
+ "eslint-plugin-import": "2.25.4",
20
+ "eslint-plugin-markdown": "2.2.1",
21
+ "eslint-plugin-node": "11.1.0",
22
+ "eslint-plugin-promise": "4.3.1",
23
+ "eslint-plugin-standard": "4.1.0",
24
+ "mocha": "9.2.0",
25
+ "nyc": "15.1.0"
26
+ },
27
+ "files": [
28
+ "LICENSE",
29
+ "HISTORY.md",
30
+ "index.js"
31
+ ],
32
+ "engines": {
33
+ "node": ">= 0.6"
34
+ },
35
+ "scripts": {
36
+ "lint": "eslint .",
37
+ "test": "mocha --reporter spec --check-leaks --bail test/",
38
+ "test-ci": "nyc --reporter=lcov --reporter=text npm test",
39
+ "test-cov": "nyc --reporter=html --reporter=text npm test"
40
+ },
41
+ "keywords": [
42
+ "content",
43
+ "negotiation",
44
+ "accept",
45
+ "accepts"
46
+ ]
47
+ }
sandbox/node_modules/array-flatten/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
sandbox/node_modules/array-flatten/README.md ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Array Flatten
2
+
3
+ [![NPM version][npm-image]][npm-url]
4
+ [![NPM downloads][downloads-image]][downloads-url]
5
+ [![Build status][travis-image]][travis-url]
6
+ [![Test coverage][coveralls-image]][coveralls-url]
7
+
8
+ > Flatten an array of nested arrays into a single flat array. Accepts an optional depth.
9
+
10
+ ## Installation
11
+
12
+ ```
13
+ npm install array-flatten --save
14
+ ```
15
+
16
+ ## Usage
17
+
18
+ ```javascript
19
+ var flatten = require('array-flatten')
20
+
21
+ flatten([1, [2, [3, [4, [5], 6], 7], 8], 9])
22
+ //=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
23
+
24
+ flatten([1, [2, [3, [4, [5], 6], 7], 8], 9], 2)
25
+ //=> [1, 2, 3, [4, [5], 6], 7, 8, 9]
26
+
27
+ (function () {
28
+ flatten(arguments) //=> [1, 2, 3]
29
+ })(1, [2, 3])
30
+ ```
31
+
32
+ ## License
33
+
34
+ MIT
35
+
36
+ [npm-image]: https://img.shields.io/npm/v/array-flatten.svg?style=flat
37
+ [npm-url]: https://npmjs.org/package/array-flatten
38
+ [downloads-image]: https://img.shields.io/npm/dm/array-flatten.svg?style=flat
39
+ [downloads-url]: https://npmjs.org/package/array-flatten
40
+ [travis-image]: https://img.shields.io/travis/blakeembrey/array-flatten.svg?style=flat
41
+ [travis-url]: https://travis-ci.org/blakeembrey/array-flatten
42
+ [coveralls-image]: https://img.shields.io/coveralls/blakeembrey/array-flatten.svg?style=flat
43
+ [coveralls-url]: https://coveralls.io/r/blakeembrey/array-flatten?branch=master
sandbox/node_modules/array-flatten/array-flatten.js ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use strict'
2
+
3
+ /**
4
+ * Expose `arrayFlatten`.
5
+ */
6
+ module.exports = arrayFlatten
7
+
8
+ /**
9
+ * Recursive flatten function with depth.
10
+ *
11
+ * @param {Array} array
12
+ * @param {Array} result
13
+ * @param {Number} depth
14
+ * @return {Array}
15
+ */
16
+ function flattenWithDepth (array, result, depth) {
17
+ for (var i = 0; i < array.length; i++) {
18
+ var value = array[i]
19
+
20
+ if (depth > 0 && Array.isArray(value)) {
21
+ flattenWithDepth(value, result, depth - 1)
22
+ } else {
23
+ result.push(value)
24
+ }
25
+ }
26
+
27
+ return result
28
+ }
29
+
30
+ /**
31
+ * Recursive flatten function. Omitting depth is slightly faster.
32
+ *
33
+ * @param {Array} array
34
+ * @param {Array} result
35
+ * @return {Array}
36
+ */
37
+ function flattenForever (array, result) {
38
+ for (var i = 0; i < array.length; i++) {
39
+ var value = array[i]
40
+
41
+ if (Array.isArray(value)) {
42
+ flattenForever(value, result)
43
+ } else {
44
+ result.push(value)
45
+ }
46
+ }
47
+
48
+ return result
49
+ }
50
+
51
+ /**
52
+ * Flatten an array, with the ability to define a depth.
53
+ *
54
+ * @param {Array} array
55
+ * @param {Number} depth
56
+ * @return {Array}
57
+ */
58
+ function arrayFlatten (array, depth) {
59
+ if (depth == null) {
60
+ return flattenForever(array, [])
61
+ }
62
+
63
+ return flattenWithDepth(array, [], depth)
64
+ }
sandbox/node_modules/array-flatten/package.json ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "array-flatten",
3
+ "version": "1.1.1",
4
+ "description": "Flatten an array of nested arrays into a single flat array",
5
+ "main": "array-flatten.js",
6
+ "files": [
7
+ "array-flatten.js",
8
+ "LICENSE"
9
+ ],
10
+ "scripts": {
11
+ "test": "istanbul cover _mocha -- -R spec"
12
+ },
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git://github.com/blakeembrey/array-flatten.git"
16
+ },
17
+ "keywords": [
18
+ "array",
19
+ "flatten",
20
+ "arguments",
21
+ "depth"
22
+ ],
23
+ "author": {
24
+ "name": "Blake Embrey",
25
+ "email": "hello@blakeembrey.com",
26
+ "url": "http://blakeembrey.me"
27
+ },
28
+ "license": "MIT",
29
+ "bugs": {
30
+ "url": "https://github.com/blakeembrey/array-flatten/issues"
31
+ },
32
+ "homepage": "https://github.com/blakeembrey/array-flatten",
33
+ "devDependencies": {
34
+ "istanbul": "^0.3.13",
35
+ "mocha": "^2.2.4",
36
+ "pre-commit": "^1.0.7",
37
+ "standard": "^3.7.3"
38
+ }
39
+ }
sandbox/node_modules/body-parser/HISTORY.md ADDED
@@ -0,0 +1,686 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 1.20.5 / 2026-04-24
2
+ ===================
3
+ * refactor(json): simplify strict mode error string construction
4
+ * fix: extended urlencoded parsing of arrays with >100 elements (#716)
5
+ * deps: qs@~6.15.1
6
+
7
+ 1.20.4 / 2025-12-01
8
+ ===================
9
+
10
+ * deps: qs@~6.14.0
11
+ * deps: use tilde notation for dependencies
12
+ * deps: http-errors@~2.0.1
13
+ * deps: raw-body@~2.5.3
14
+
15
+ 1.20.3 / 2024-09-10
16
+ ===================
17
+
18
+ * deps: qs@6.13.0
19
+ * add `depth` option to customize the depth level in the parser
20
+ * IMPORTANT: The default `depth` level for parsing URL-encoded data is now `32` (previously was `Infinity`)
21
+
22
+ 1.20.2 / 2023-02-21
23
+ ===================
24
+
25
+ * Fix strict json error message on Node.js 19+
26
+ * deps: content-type@~1.0.5
27
+ - perf: skip value escaping when unnecessary
28
+ * deps: raw-body@2.5.2
29
+
30
+ 1.20.1 / 2022-10-06
31
+ ===================
32
+
33
+ * deps: qs@6.11.0
34
+ * perf: remove unnecessary object clone
35
+
36
+ 1.20.0 / 2022-04-02
37
+ ===================
38
+
39
+ * Fix error message for json parse whitespace in `strict`
40
+ * Fix internal error when inflated body exceeds limit
41
+ * Prevent loss of async hooks context
42
+ * Prevent hanging when request already read
43
+ * deps: depd@2.0.0
44
+ - Replace internal `eval` usage with `Function` constructor
45
+ - Use instance methods on `process` to check for listeners
46
+ * deps: http-errors@2.0.0
47
+ - deps: depd@2.0.0
48
+ - deps: statuses@2.0.1
49
+ * deps: on-finished@2.4.1
50
+ * deps: qs@6.10.3
51
+ * deps: raw-body@2.5.1
52
+ - deps: http-errors@2.0.0
53
+
54
+ 1.19.2 / 2022-02-15
55
+ ===================
56
+
57
+ * deps: bytes@3.1.2
58
+ * deps: qs@6.9.7
59
+ * Fix handling of `__proto__` keys
60
+ * deps: raw-body@2.4.3
61
+ - deps: bytes@3.1.2
62
+
63
+ 1.19.1 / 2021-12-10
64
+ ===================
65
+
66
+ * deps: bytes@3.1.1
67
+ * deps: http-errors@1.8.1
68
+ - deps: inherits@2.0.4
69
+ - deps: toidentifier@1.0.1
70
+ - deps: setprototypeof@1.2.0
71
+ * deps: qs@6.9.6
72
+ * deps: raw-body@2.4.2
73
+ - deps: bytes@3.1.1
74
+ - deps: http-errors@1.8.1
75
+ * deps: safe-buffer@5.2.1
76
+ * deps: type-is@~1.6.18
77
+
78
+ 1.19.0 / 2019-04-25
79
+ ===================
80
+
81
+ * deps: bytes@3.1.0
82
+ - Add petabyte (`pb`) support
83
+ * deps: http-errors@1.7.2
84
+ - Set constructor name when possible
85
+ - deps: setprototypeof@1.1.1
86
+ - deps: statuses@'>= 1.5.0 < 2'
87
+ * deps: iconv-lite@0.4.24
88
+ - Added encoding MIK
89
+ * deps: qs@6.7.0
90
+ - Fix parsing array brackets after index
91
+ * deps: raw-body@2.4.0
92
+ - deps: bytes@3.1.0
93
+ - deps: http-errors@1.7.2
94
+ - deps: iconv-lite@0.4.24
95
+ * deps: type-is@~1.6.17
96
+ - deps: mime-types@~2.1.24
97
+ - perf: prevent internal `throw` on invalid type
98
+
99
+ 1.18.3 / 2018-05-14
100
+ ===================
101
+
102
+ * Fix stack trace for strict json parse error
103
+ * deps: depd@~1.1.2
104
+ - perf: remove argument reassignment
105
+ * deps: http-errors@~1.6.3
106
+ - deps: depd@~1.1.2
107
+ - deps: setprototypeof@1.1.0
108
+ - deps: statuses@'>= 1.3.1 < 2'
109
+ * deps: iconv-lite@0.4.23
110
+ - Fix loading encoding with year appended
111
+ - Fix deprecation warnings on Node.js 10+
112
+ * deps: qs@6.5.2
113
+ * deps: raw-body@2.3.3
114
+ - deps: http-errors@1.6.3
115
+ - deps: iconv-lite@0.4.23
116
+ * deps: type-is@~1.6.16
117
+ - deps: mime-types@~2.1.18
118
+
119
+ 1.18.2 / 2017-09-22
120
+ ===================
121
+
122
+ * deps: debug@2.6.9
123
+ * perf: remove argument reassignment
124
+
125
+ 1.18.1 / 2017-09-12
126
+ ===================
127
+
128
+ * deps: content-type@~1.0.4
129
+ - perf: remove argument reassignment
130
+ - perf: skip parameter parsing when no parameters
131
+ * deps: iconv-lite@0.4.19
132
+ - Fix ISO-8859-1 regression
133
+ - Update Windows-1255
134
+ * deps: qs@6.5.1
135
+ - Fix parsing & compacting very deep objects
136
+ * deps: raw-body@2.3.2
137
+ - deps: iconv-lite@0.4.19
138
+
139
+ 1.18.0 / 2017-09-08
140
+ ===================
141
+
142
+ * Fix JSON strict violation error to match native parse error
143
+ * Include the `body` property on verify errors
144
+ * Include the `type` property on all generated errors
145
+ * Use `http-errors` to set status code on errors
146
+ * deps: bytes@3.0.0
147
+ * deps: debug@2.6.8
148
+ * deps: depd@~1.1.1
149
+ - Remove unnecessary `Buffer` loading
150
+ * deps: http-errors@~1.6.2
151
+ - deps: depd@1.1.1
152
+ * deps: iconv-lite@0.4.18
153
+ - Add support for React Native
154
+ - Add a warning if not loaded as utf-8
155
+ - Fix CESU-8 decoding in Node.js 8
156
+ - Improve speed of ISO-8859-1 encoding
157
+ * deps: qs@6.5.0
158
+ * deps: raw-body@2.3.1
159
+ - Use `http-errors` for standard emitted errors
160
+ - deps: bytes@3.0.0
161
+ - deps: iconv-lite@0.4.18
162
+ - perf: skip buffer decoding on overage chunk
163
+ * perf: prevent internal `throw` when missing charset
164
+
165
+ 1.17.2 / 2017-05-17
166
+ ===================
167
+
168
+ * deps: debug@2.6.7
169
+ - Fix `DEBUG_MAX_ARRAY_LENGTH`
170
+ - deps: ms@2.0.0
171
+ * deps: type-is@~1.6.15
172
+ - deps: mime-types@~2.1.15
173
+
174
+ 1.17.1 / 2017-03-06
175
+ ===================
176
+
177
+ * deps: qs@6.4.0
178
+ - Fix regression parsing keys starting with `[`
179
+
180
+ 1.17.0 / 2017-03-01
181
+ ===================
182
+
183
+ * deps: http-errors@~1.6.1
184
+ - Make `message` property enumerable for `HttpError`s
185
+ - deps: setprototypeof@1.0.3
186
+ * deps: qs@6.3.1
187
+ - Fix compacting nested arrays
188
+
189
+ 1.16.1 / 2017-02-10
190
+ ===================
191
+
192
+ * deps: debug@2.6.1
193
+ - Fix deprecation messages in WebStorm and other editors
194
+ - Undeprecate `DEBUG_FD` set to `1` or `2`
195
+
196
+ 1.16.0 / 2017-01-17
197
+ ===================
198
+
199
+ * deps: debug@2.6.0
200
+ - Allow colors in workers
201
+ - Deprecated `DEBUG_FD` environment variable
202
+ - Fix error when running under React Native
203
+ - Use same color for same namespace
204
+ - deps: ms@0.7.2
205
+ * deps: http-errors@~1.5.1
206
+ - deps: inherits@2.0.3
207
+ - deps: setprototypeof@1.0.2
208
+ - deps: statuses@'>= 1.3.1 < 2'
209
+ * deps: iconv-lite@0.4.15
210
+ - Added encoding MS-31J
211
+ - Added encoding MS-932
212
+ - Added encoding MS-936
213
+ - Added encoding MS-949
214
+ - Added encoding MS-950
215
+ - Fix GBK/GB18030 handling of Euro character
216
+ * deps: qs@6.2.1
217
+ - Fix array parsing from skipping empty values
218
+ * deps: raw-body@~2.2.0
219
+ - deps: iconv-lite@0.4.15
220
+ * deps: type-is@~1.6.14
221
+ - deps: mime-types@~2.1.13
222
+
223
+ 1.15.2 / 2016-06-19
224
+ ===================
225
+
226
+ * deps: bytes@2.4.0
227
+ * deps: content-type@~1.0.2
228
+ - perf: enable strict mode
229
+ * deps: http-errors@~1.5.0
230
+ - Use `setprototypeof` module to replace `__proto__` setting
231
+ - deps: statuses@'>= 1.3.0 < 2'
232
+ - perf: enable strict mode
233
+ * deps: qs@6.2.0
234
+ * deps: raw-body@~2.1.7
235
+ - deps: bytes@2.4.0
236
+ - perf: remove double-cleanup on happy path
237
+ * deps: type-is@~1.6.13
238
+ - deps: mime-types@~2.1.11
239
+
240
+ 1.15.1 / 2016-05-05
241
+ ===================
242
+
243
+ * deps: bytes@2.3.0
244
+ - Drop partial bytes on all parsed units
245
+ - Fix parsing byte string that looks like hex
246
+ * deps: raw-body@~2.1.6
247
+ - deps: bytes@2.3.0
248
+ * deps: type-is@~1.6.12
249
+ - deps: mime-types@~2.1.10
250
+
251
+ 1.15.0 / 2016-02-10
252
+ ===================
253
+
254
+ * deps: http-errors@~1.4.0
255
+ - Add `HttpError` export, for `err instanceof createError.HttpError`
256
+ - deps: inherits@2.0.1
257
+ - deps: statuses@'>= 1.2.1 < 2'
258
+ * deps: qs@6.1.0
259
+ * deps: type-is@~1.6.11
260
+ - deps: mime-types@~2.1.9
261
+
262
+ 1.14.2 / 2015-12-16
263
+ ===================
264
+
265
+ * deps: bytes@2.2.0
266
+ * deps: iconv-lite@0.4.13
267
+ * deps: qs@5.2.0
268
+ * deps: raw-body@~2.1.5
269
+ - deps: bytes@2.2.0
270
+ - deps: iconv-lite@0.4.13
271
+ * deps: type-is@~1.6.10
272
+ - deps: mime-types@~2.1.8
273
+
274
+ 1.14.1 / 2015-09-27
275
+ ===================
276
+
277
+ * Fix issue where invalid charset results in 400 when `verify` used
278
+ * deps: iconv-lite@0.4.12
279
+ - Fix CESU-8 decoding in Node.js 4.x
280
+ * deps: raw-body@~2.1.4
281
+ - Fix masking critical errors from `iconv-lite`
282
+ - deps: iconv-lite@0.4.12
283
+ * deps: type-is@~1.6.9
284
+ - deps: mime-types@~2.1.7
285
+
286
+ 1.14.0 / 2015-09-16
287
+ ===================
288
+
289
+ * Fix JSON strict parse error to match syntax errors
290
+ * Provide static `require` analysis in `urlencoded` parser
291
+ * deps: depd@~1.1.0
292
+ - Support web browser loading
293
+ * deps: qs@5.1.0
294
+ * deps: raw-body@~2.1.3
295
+ - Fix sync callback when attaching data listener causes sync read
296
+ * deps: type-is@~1.6.8
297
+ - Fix type error when given invalid type to match against
298
+ - deps: mime-types@~2.1.6
299
+
300
+ 1.13.3 / 2015-07-31
301
+ ===================
302
+
303
+ * deps: type-is@~1.6.6
304
+ - deps: mime-types@~2.1.4
305
+
306
+ 1.13.2 / 2015-07-05
307
+ ===================
308
+
309
+ * deps: iconv-lite@0.4.11
310
+ * deps: qs@4.0.0
311
+ - Fix dropping parameters like `hasOwnProperty`
312
+ - Fix user-visible incompatibilities from 3.1.0
313
+ - Fix various parsing edge cases
314
+ * deps: raw-body@~2.1.2
315
+ - Fix error stack traces to skip `makeError`
316
+ - deps: iconv-lite@0.4.11
317
+ * deps: type-is@~1.6.4
318
+ - deps: mime-types@~2.1.2
319
+ - perf: enable strict mode
320
+ - perf: remove argument reassignment
321
+
322
+ 1.13.1 / 2015-06-16
323
+ ===================
324
+
325
+ * deps: qs@2.4.2
326
+ - Downgraded from 3.1.0 because of user-visible incompatibilities
327
+
328
+ 1.13.0 / 2015-06-14
329
+ ===================
330
+
331
+ * Add `statusCode` property on `Error`s, in addition to `status`
332
+ * Change `type` default to `application/json` for JSON parser
333
+ * Change `type` default to `application/x-www-form-urlencoded` for urlencoded parser
334
+ * Provide static `require` analysis
335
+ * Use the `http-errors` module to generate errors
336
+ * deps: bytes@2.1.0
337
+ - Slight optimizations
338
+ * deps: iconv-lite@0.4.10
339
+ - The encoding UTF-16 without BOM now defaults to UTF-16LE when detection fails
340
+ - Leading BOM is now removed when decoding
341
+ * deps: on-finished@~2.3.0
342
+ - Add defined behavior for HTTP `CONNECT` requests
343
+ - Add defined behavior for HTTP `Upgrade` requests
344
+ - deps: ee-first@1.1.1
345
+ * deps: qs@3.1.0
346
+ - Fix dropping parameters like `hasOwnProperty`
347
+ - Fix various parsing edge cases
348
+ - Parsed object now has `null` prototype
349
+ * deps: raw-body@~2.1.1
350
+ - Use `unpipe` module for unpiping requests
351
+ - deps: iconv-lite@0.4.10
352
+ * deps: type-is@~1.6.3
353
+ - deps: mime-types@~2.1.1
354
+ - perf: reduce try block size
355
+ - perf: remove bitwise operations
356
+ * perf: enable strict mode
357
+ * perf: remove argument reassignment
358
+ * perf: remove delete call
359
+
360
+ 1.12.4 / 2015-05-10
361
+ ===================
362
+
363
+ * deps: debug@~2.2.0
364
+ * deps: qs@2.4.2
365
+ - Fix allowing parameters like `constructor`
366
+ * deps: on-finished@~2.2.1
367
+ * deps: raw-body@~2.0.1
368
+ - Fix a false-positive when unpiping in Node.js 0.8
369
+ - deps: bytes@2.0.1
370
+ * deps: type-is@~1.6.2
371
+ - deps: mime-types@~2.0.11
372
+
373
+ 1.12.3 / 2015-04-15
374
+ ===================
375
+
376
+ * Slight efficiency improvement when not debugging
377
+ * deps: depd@~1.0.1
378
+ * deps: iconv-lite@0.4.8
379
+ - Add encoding alias UNICODE-1-1-UTF-7
380
+ * deps: raw-body@1.3.4
381
+ - Fix hanging callback if request aborts during read
382
+ - deps: iconv-lite@0.4.8
383
+
384
+ 1.12.2 / 2015-03-16
385
+ ===================
386
+
387
+ * deps: qs@2.4.1
388
+ - Fix error when parameter `hasOwnProperty` is present
389
+
390
+ 1.12.1 / 2015-03-15
391
+ ===================
392
+
393
+ * deps: debug@~2.1.3
394
+ - Fix high intensity foreground color for bold
395
+ - deps: ms@0.7.0
396
+ * deps: type-is@~1.6.1
397
+ - deps: mime-types@~2.0.10
398
+
399
+ 1.12.0 / 2015-02-13
400
+ ===================
401
+
402
+ * add `debug` messages
403
+ * accept a function for the `type` option
404
+ * use `content-type` to parse `Content-Type` headers
405
+ * deps: iconv-lite@0.4.7
406
+ - Gracefully support enumerables on `Object.prototype`
407
+ * deps: raw-body@1.3.3
408
+ - deps: iconv-lite@0.4.7
409
+ * deps: type-is@~1.6.0
410
+ - fix argument reassignment
411
+ - fix false-positives in `hasBody` `Transfer-Encoding` check
412
+ - support wildcard for both type and subtype (`*/*`)
413
+ - deps: mime-types@~2.0.9
414
+
415
+ 1.11.0 / 2015-01-30
416
+ ===================
417
+
418
+ * make internal `extended: true` depth limit infinity
419
+ * deps: type-is@~1.5.6
420
+ - deps: mime-types@~2.0.8
421
+
422
+ 1.10.2 / 2015-01-20
423
+ ===================
424
+
425
+ * deps: iconv-lite@0.4.6
426
+ - Fix rare aliases of single-byte encodings
427
+ * deps: raw-body@1.3.2
428
+ - deps: iconv-lite@0.4.6
429
+
430
+ 1.10.1 / 2015-01-01
431
+ ===================
432
+
433
+ * deps: on-finished@~2.2.0
434
+ * deps: type-is@~1.5.5
435
+ - deps: mime-types@~2.0.7
436
+
437
+ 1.10.0 / 2014-12-02
438
+ ===================
439
+
440
+ * make internal `extended: true` array limit dynamic
441
+
442
+ 1.9.3 / 2014-11-21
443
+ ==================
444
+
445
+ * deps: iconv-lite@0.4.5
446
+ - Fix Windows-31J and X-SJIS encoding support
447
+ * deps: qs@2.3.3
448
+ - Fix `arrayLimit` behavior
449
+ * deps: raw-body@1.3.1
450
+ - deps: iconv-lite@0.4.5
451
+ * deps: type-is@~1.5.3
452
+ - deps: mime-types@~2.0.3
453
+
454
+ 1.9.2 / 2014-10-27
455
+ ==================
456
+
457
+ * deps: qs@2.3.2
458
+ - Fix parsing of mixed objects and values
459
+
460
+ 1.9.1 / 2014-10-22
461
+ ==================
462
+
463
+ * deps: on-finished@~2.1.1
464
+ - Fix handling of pipelined requests
465
+ * deps: qs@2.3.0
466
+ - Fix parsing of mixed implicit and explicit arrays
467
+ * deps: type-is@~1.5.2
468
+ - deps: mime-types@~2.0.2
469
+
470
+ 1.9.0 / 2014-09-24
471
+ ==================
472
+
473
+ * include the charset in "unsupported charset" error message
474
+ * include the encoding in "unsupported content encoding" error message
475
+ * deps: depd@~1.0.0
476
+
477
+ 1.8.4 / 2014-09-23
478
+ ==================
479
+
480
+ * fix content encoding to be case-insensitive
481
+
482
+ 1.8.3 / 2014-09-19
483
+ ==================
484
+
485
+ * deps: qs@2.2.4
486
+ - Fix issue with object keys starting with numbers truncated
487
+
488
+ 1.8.2 / 2014-09-15
489
+ ==================
490
+
491
+ * deps: depd@0.4.5
492
+
493
+ 1.8.1 / 2014-09-07
494
+ ==================
495
+
496
+ * deps: media-typer@0.3.0
497
+ * deps: type-is@~1.5.1
498
+
499
+ 1.8.0 / 2014-09-05
500
+ ==================
501
+
502
+ * make empty-body-handling consistent between chunked requests
503
+ - empty `json` produces `{}`
504
+ - empty `raw` produces `new Buffer(0)`
505
+ - empty `text` produces `''`
506
+ - empty `urlencoded` produces `{}`
507
+ * deps: qs@2.2.3
508
+ - Fix issue where first empty value in array is discarded
509
+ * deps: type-is@~1.5.0
510
+ - fix `hasbody` to be true for `content-length: 0`
511
+
512
+ 1.7.0 / 2014-09-01
513
+ ==================
514
+
515
+ * add `parameterLimit` option to `urlencoded` parser
516
+ * change `urlencoded` extended array limit to 100
517
+ * respond with 413 when over `parameterLimit` in `urlencoded`
518
+
519
+ 1.6.7 / 2014-08-29
520
+ ==================
521
+
522
+ * deps: qs@2.2.2
523
+ - Remove unnecessary cloning
524
+
525
+ 1.6.6 / 2014-08-27
526
+ ==================
527
+
528
+ * deps: qs@2.2.0
529
+ - Array parsing fix
530
+ - Performance improvements
531
+
532
+ 1.6.5 / 2014-08-16
533
+ ==================
534
+
535
+ * deps: on-finished@2.1.0
536
+
537
+ 1.6.4 / 2014-08-14
538
+ ==================
539
+
540
+ * deps: qs@1.2.2
541
+
542
+ 1.6.3 / 2014-08-10
543
+ ==================
544
+
545
+ * deps: qs@1.2.1
546
+
547
+ 1.6.2 / 2014-08-07
548
+ ==================
549
+
550
+ * deps: qs@1.2.0
551
+ - Fix parsing array of objects
552
+
553
+ 1.6.1 / 2014-08-06
554
+ ==================
555
+
556
+ * deps: qs@1.1.0
557
+ - Accept urlencoded square brackets
558
+ - Accept empty values in implicit array notation
559
+
560
+ 1.6.0 / 2014-08-05
561
+ ==================
562
+
563
+ * deps: qs@1.0.2
564
+ - Complete rewrite
565
+ - Limits array length to 20
566
+ - Limits object depth to 5
567
+ - Limits parameters to 1,000
568
+
569
+ 1.5.2 / 2014-07-27
570
+ ==================
571
+
572
+ * deps: depd@0.4.4
573
+ - Work-around v8 generating empty stack traces
574
+
575
+ 1.5.1 / 2014-07-26
576
+ ==================
577
+
578
+ * deps: depd@0.4.3
579
+ - Fix exception when global `Error.stackTraceLimit` is too low
580
+
581
+ 1.5.0 / 2014-07-20
582
+ ==================
583
+
584
+ * deps: depd@0.4.2
585
+ - Add `TRACE_DEPRECATION` environment variable
586
+ - Remove non-standard grey color from color output
587
+ - Support `--no-deprecation` argument
588
+ - Support `--trace-deprecation` argument
589
+ * deps: iconv-lite@0.4.4
590
+ - Added encoding UTF-7
591
+ * deps: raw-body@1.3.0
592
+ - deps: iconv-lite@0.4.4
593
+ - Added encoding UTF-7
594
+ - Fix `Cannot switch to old mode now` error on Node.js 0.10+
595
+ * deps: type-is@~1.3.2
596
+
597
+ 1.4.3 / 2014-06-19
598
+ ==================
599
+
600
+ * deps: type-is@1.3.1
601
+ - fix global variable leak
602
+
603
+ 1.4.2 / 2014-06-19
604
+ ==================
605
+
606
+ * deps: type-is@1.3.0
607
+ - improve type parsing
608
+
609
+ 1.4.1 / 2014-06-19
610
+ ==================
611
+
612
+ * fix urlencoded extended deprecation message
613
+
614
+ 1.4.0 / 2014-06-19
615
+ ==================
616
+
617
+ * add `text` parser
618
+ * add `raw` parser
619
+ * check accepted charset in content-type (accepts utf-8)
620
+ * check accepted encoding in content-encoding (accepts identity)
621
+ * deprecate `bodyParser()` middleware; use `.json()` and `.urlencoded()` as needed
622
+ * deprecate `urlencoded()` without provided `extended` option
623
+ * lazy-load urlencoded parsers
624
+ * parsers split into files for reduced mem usage
625
+ * support gzip and deflate bodies
626
+ - set `inflate: false` to turn off
627
+ * deps: raw-body@1.2.2
628
+ - Support all encodings from `iconv-lite`
629
+
630
+ 1.3.1 / 2014-06-11
631
+ ==================
632
+
633
+ * deps: type-is@1.2.1
634
+ - Switch dependency from mime to mime-types@1.0.0
635
+
636
+ 1.3.0 / 2014-05-31
637
+ ==================
638
+
639
+ * add `extended` option to urlencoded parser
640
+
641
+ 1.2.2 / 2014-05-27
642
+ ==================
643
+
644
+ * deps: raw-body@1.1.6
645
+ - assert stream encoding on node.js 0.8
646
+ - assert stream encoding on node.js < 0.10.6
647
+ - deps: bytes@1
648
+
649
+ 1.2.1 / 2014-05-26
650
+ ==================
651
+
652
+ * invoke `next(err)` after request fully read
653
+ - prevents hung responses and socket hang ups
654
+
655
+ 1.2.0 / 2014-05-11
656
+ ==================
657
+
658
+ * add `verify` option
659
+ * deps: type-is@1.2.0
660
+ - support suffix matching
661
+
662
+ 1.1.2 / 2014-05-11
663
+ ==================
664
+
665
+ * improve json parser speed
666
+
667
+ 1.1.1 / 2014-05-11
668
+ ==================
669
+
670
+ * fix repeated limit parsing with every request
671
+
672
+ 1.1.0 / 2014-05-10
673
+ ==================
674
+
675
+ * add `type` option
676
+ * deps: pin for safety and consistency
677
+
678
+ 1.0.2 / 2014-04-14
679
+ ==================
680
+
681
+ * use `type-is` module
682
+
683
+ 1.0.1 / 2014-03-20
684
+ ==================
685
+
686
+ * lower default limits to 100kb
sandbox/node_modules/body-parser/LICENSE ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (The MIT License)
2
+
3
+ Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
4
+ Copyright (c) 2014-2015 Douglas Christopher Wilson <doug@somethingdoug.com>
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining
7
+ a copy of this software and associated documentation files (the
8
+ 'Software'), to deal in the Software without restriction, including
9
+ without limitation the rights to use, copy, modify, merge, publish,
10
+ distribute, sublicense, and/or sell copies of the Software, and to
11
+ permit persons to whom the Software is furnished to do so, subject to
12
+ the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be
15
+ included in all copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
18
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
sandbox/node_modules/body-parser/README.md ADDED
@@ -0,0 +1,476 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # body-parser
2
+
3
+ [![NPM Version][npm-version-image]][npm-url]
4
+ [![NPM Downloads][npm-downloads-image]][npm-url]
5
+ [![Build Status][ci-image]][ci-url]
6
+ [![Test Coverage][coveralls-image]][coveralls-url]
7
+ [![OpenSSF Scorecard Badge][ossf-scorecard-badge]][ossf-scorecard-visualizer]
8
+
9
+ Node.js body parsing middleware.
10
+
11
+ Parse incoming request bodies in a middleware before your handlers, available
12
+ under the `req.body` property.
13
+
14
+ **Note** As `req.body`'s shape is based on user-controlled input, all
15
+ properties and values in this object are untrusted and should be validated
16
+ before trusting. For example, `req.body.foo.toString()` may fail in multiple
17
+ ways, for example the `foo` property may not be there or may not be a string,
18
+ and `toString` may not be a function and instead a string or other user input.
19
+
20
+ [Learn about the anatomy of an HTTP transaction in Node.js](https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/).
21
+
22
+ _This does not handle multipart bodies_, due to their complex and typically
23
+ large nature. For multipart bodies, you may be interested in the following
24
+ modules:
25
+
26
+ * [busboy](https://www.npmjs.org/package/busboy#readme) and
27
+ [connect-busboy](https://www.npmjs.org/package/connect-busboy#readme)
28
+ * [multiparty](https://www.npmjs.org/package/multiparty#readme) and
29
+ [connect-multiparty](https://www.npmjs.org/package/connect-multiparty#readme)
30
+ * [formidable](https://www.npmjs.org/package/formidable#readme)
31
+ * [multer](https://www.npmjs.org/package/multer#readme)
32
+
33
+ This module provides the following parsers:
34
+
35
+ * [JSON body parser](#bodyparserjsonoptions)
36
+ * [Raw body parser](#bodyparserrawoptions)
37
+ * [Text body parser](#bodyparsertextoptions)
38
+ * [URL-encoded form body parser](#bodyparserurlencodedoptions)
39
+
40
+ Other body parsers you might be interested in:
41
+
42
+ - [body](https://www.npmjs.org/package/body#readme)
43
+ - [co-body](https://www.npmjs.org/package/co-body#readme)
44
+
45
+ ## Installation
46
+
47
+ ```sh
48
+ $ npm install body-parser
49
+ ```
50
+
51
+ ## API
52
+
53
+ ```js
54
+ var bodyParser = require('body-parser')
55
+ ```
56
+
57
+ The `bodyParser` object exposes various factories to create middlewares. All
58
+ middlewares will populate the `req.body` property with the parsed body when
59
+ the `Content-Type` request header matches the `type` option, or an empty
60
+ object (`{}`) if there was no body to parse, the `Content-Type` was not matched,
61
+ or an error occurred.
62
+
63
+ The various errors returned by this module are described in the
64
+ [errors section](#errors).
65
+
66
+ ### bodyParser.json([options])
67
+
68
+ Returns middleware that only parses `json` and only looks at requests where
69
+ the `Content-Type` header matches the `type` option. This parser accepts any
70
+ Unicode encoding of the body and supports automatic inflation of `gzip` and
71
+ `deflate` encodings.
72
+
73
+ A new `body` object containing the parsed data is populated on the `request`
74
+ object after the middleware (i.e. `req.body`).
75
+
76
+ #### Options
77
+
78
+ The `json` function takes an optional `options` object that may contain any of
79
+ the following keys:
80
+
81
+ ##### inflate
82
+
83
+ When set to `true`, then deflated (compressed) bodies will be inflated; when
84
+ `false`, deflated bodies are rejected. Defaults to `true`.
85
+
86
+ ##### limit
87
+
88
+ Controls the maximum request body size. If this is a number, then the value
89
+ specifies the number of bytes; if it is a string, the value is passed to the
90
+ [bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults
91
+ to `'100kb'`.
92
+
93
+ ##### reviver
94
+
95
+ The `reviver` option is passed directly to `JSON.parse` as the second
96
+ argument. You can find more information on this argument
97
+ [in the MDN documentation about JSON.parse](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Example.3A_Using_the_reviver_parameter).
98
+
99
+ ##### strict
100
+
101
+ When set to `true`, will only accept arrays and objects; when `false` will
102
+ accept anything `JSON.parse` accepts. Defaults to `true`.
103
+
104
+ ##### type
105
+
106
+ The `type` option is used to determine what media type the middleware will
107
+ parse. This option can be a string, array of strings, or a function. If not a
108
+ function, `type` option is passed directly to the
109
+ [type-is](https://www.npmjs.org/package/type-is#readme) library and this can
110
+ be an extension name (like `json`), a mime type (like `application/json`), or
111
+ a mime type with a wildcard (like `*/*` or `*/json`). If a function, the `type`
112
+ option is called as `fn(req)` and the request is parsed if it returns a truthy
113
+ value. Defaults to `application/json`.
114
+
115
+ ##### verify
116
+
117
+ The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`,
118
+ where `buf` is a `Buffer` of the raw request body and `encoding` is the
119
+ encoding of the request. The parsing can be aborted by throwing an error.
120
+
121
+ ### bodyParser.raw([options])
122
+
123
+ Returns middleware that parses all bodies as a `Buffer` and only looks at
124
+ requests where the `Content-Type` header matches the `type` option. This
125
+ parser supports automatic inflation of `gzip` and `deflate` encodings.
126
+
127
+ A new `body` object containing the parsed data is populated on the `request`
128
+ object after the middleware (i.e. `req.body`). This will be a `Buffer` object
129
+ of the body.
130
+
131
+ #### Options
132
+
133
+ The `raw` function takes an optional `options` object that may contain any of
134
+ the following keys:
135
+
136
+ ##### inflate
137
+
138
+ When set to `true`, then deflated (compressed) bodies will be inflated; when
139
+ `false`, deflated bodies are rejected. Defaults to `true`.
140
+
141
+ ##### limit
142
+
143
+ Controls the maximum request body size. If this is a number, then the value
144
+ specifies the number of bytes; if it is a string, the value is passed to the
145
+ [bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults
146
+ to `'100kb'`.
147
+
148
+ ##### type
149
+
150
+ The `type` option is used to determine what media type the middleware will
151
+ parse. This option can be a string, array of strings, or a function.
152
+ If not a function, `type` option is passed directly to the
153
+ [type-is](https://www.npmjs.org/package/type-is#readme) library and this
154
+ can be an extension name (like `bin`), a mime type (like
155
+ `application/octet-stream`), or a mime type with a wildcard (like `*/*` or
156
+ `application/*`). If a function, the `type` option is called as `fn(req)`
157
+ and the request is parsed if it returns a truthy value. Defaults to
158
+ `application/octet-stream`.
159
+
160
+ ##### verify
161
+
162
+ The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`,
163
+ where `buf` is a `Buffer` of the raw request body and `encoding` is the
164
+ encoding of the request. The parsing can be aborted by throwing an error.
165
+
166
+ ### bodyParser.text([options])
167
+
168
+ Returns middleware that parses all bodies as a string and only looks at
169
+ requests where the `Content-Type` header matches the `type` option. This
170
+ parser supports automatic inflation of `gzip` and `deflate` encodings.
171
+
172
+ A new `body` string containing the parsed data is populated on the `request`
173
+ object after the middleware (i.e. `req.body`). This will be a string of the
174
+ body.
175
+
176
+ #### Options
177
+
178
+ The `text` function takes an optional `options` object that may contain any of
179
+ the following keys:
180
+
181
+ ##### defaultCharset
182
+
183
+ Specify the default character set for the text content if the charset is not
184
+ specified in the `Content-Type` header of the request. Defaults to `utf-8`.
185
+
186
+ ##### inflate
187
+
188
+ When set to `true`, then deflated (compressed) bodies will be inflated; when
189
+ `false`, deflated bodies are rejected. Defaults to `true`.
190
+
191
+ ##### limit
192
+
193
+ Controls the maximum request body size. If this is a number, then the value
194
+ specifies the number of bytes; if it is a string, the value is passed to the
195
+ [bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults
196
+ to `'100kb'`.
197
+
198
+ ##### type
199
+
200
+ The `type` option is used to determine what media type the middleware will
201
+ parse. This option can be a string, array of strings, or a function. If not
202
+ a function, `type` option is passed directly to the
203
+ [type-is](https://www.npmjs.org/package/type-is#readme) library and this can
204
+ be an extension name (like `txt`), a mime type (like `text/plain`), or a mime
205
+ type with a wildcard (like `*/*` or `text/*`). If a function, the `type`
206
+ option is called as `fn(req)` and the request is parsed if it returns a
207
+ truthy value. Defaults to `text/plain`.
208
+
209
+ ##### verify
210
+
211
+ The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`,
212
+ where `buf` is a `Buffer` of the raw request body and `encoding` is the
213
+ encoding of the request. The parsing can be aborted by throwing an error.
214
+
215
+ ### bodyParser.urlencoded([options])
216
+
217
+ Returns middleware that only parses `urlencoded` bodies and only looks at
218
+ requests where the `Content-Type` header matches the `type` option. This
219
+ parser accepts only UTF-8 encoding of the body and supports automatic
220
+ inflation of `gzip` and `deflate` encodings.
221
+
222
+ A new `body` object containing the parsed data is populated on the `request`
223
+ object after the middleware (i.e. `req.body`). This object will contain
224
+ key-value pairs, where the value can be a string or array (when `extended` is
225
+ `false`), or any type (when `extended` is `true`).
226
+
227
+ #### Options
228
+
229
+ The `urlencoded` function takes an optional `options` object that may contain
230
+ any of the following keys:
231
+
232
+ ##### extended
233
+
234
+ The `extended` option allows to choose between parsing the URL-encoded data
235
+ with the `querystring` library (when `false`) or the `qs` library (when
236
+ `true`). The "extended" syntax allows for rich objects and arrays to be
237
+ encoded into the URL-encoded format, allowing for a JSON-like experience
238
+ with URL-encoded. For more information, please
239
+ [see the qs library](https://www.npmjs.org/package/qs#readme).
240
+
241
+ Defaults to `true`, but using the default has been deprecated. Please
242
+ research into the difference between `qs` and `querystring` and choose the
243
+ appropriate setting.
244
+
245
+ ##### inflate
246
+
247
+ When set to `true`, then deflated (compressed) bodies will be inflated; when
248
+ `false`, deflated bodies are rejected. Defaults to `true`.
249
+
250
+ ##### limit
251
+
252
+ Controls the maximum request body size. If this is a number, then the value
253
+ specifies the number of bytes; if it is a string, the value is passed to the
254
+ [bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults
255
+ to `'100kb'`.
256
+
257
+ ##### parameterLimit
258
+
259
+ The `parameterLimit` option controls the maximum number of parameters that
260
+ are allowed in the URL-encoded data. If a request contains more parameters
261
+ than this value, a 413 will be returned to the client. Defaults to `1000`.
262
+
263
+ ##### type
264
+
265
+ The `type` option is used to determine what media type the middleware will
266
+ parse. This option can be a string, array of strings, or a function. If not
267
+ a function, `type` option is passed directly to the
268
+ [type-is](https://www.npmjs.org/package/type-is#readme) library and this can
269
+ be an extension name (like `urlencoded`), a mime type (like
270
+ `application/x-www-form-urlencoded`), or a mime type with a wildcard (like
271
+ `*/x-www-form-urlencoded`). If a function, the `type` option is called as
272
+ `fn(req)` and the request is parsed if it returns a truthy value. Defaults
273
+ to `application/x-www-form-urlencoded`.
274
+
275
+ ##### verify
276
+
277
+ The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`,
278
+ where `buf` is a `Buffer` of the raw request body and `encoding` is the
279
+ encoding of the request. The parsing can be aborted by throwing an error.
280
+
281
+ #### depth
282
+
283
+ The `depth` option is used to configure the maximum depth of the `qs` library when `extended` is `true`. This allows you to limit the amount of keys that are parsed and can be useful to prevent certain types of abuse. Defaults to `32`. It is recommended to keep this value as low as possible.
284
+
285
+ ## Errors
286
+
287
+ The middlewares provided by this module create errors using the
288
+ [`http-errors` module](https://www.npmjs.com/package/http-errors). The errors
289
+ will typically have a `status`/`statusCode` property that contains the suggested
290
+ HTTP response code, an `expose` property to determine if the `message` property
291
+ should be displayed to the client, a `type` property to determine the type of
292
+ error without matching against the `message`, and a `body` property containing
293
+ the read body, if available.
294
+
295
+ The following are the common errors created, though any error can come through
296
+ for various reasons.
297
+
298
+ ### content encoding unsupported
299
+
300
+ This error will occur when the request had a `Content-Encoding` header that
301
+ contained an encoding but the "inflation" option was set to `false`. The
302
+ `status` property is set to `415`, the `type` property is set to
303
+ `'encoding.unsupported'`, and the `charset` property will be set to the
304
+ encoding that is unsupported.
305
+
306
+ ### entity parse failed
307
+
308
+ This error will occur when the request contained an entity that could not be
309
+ parsed by the middleware. The `status` property is set to `400`, the `type`
310
+ property is set to `'entity.parse.failed'`, and the `body` property is set to
311
+ the entity value that failed parsing.
312
+
313
+ ### entity verify failed
314
+
315
+ This error will occur when the request contained an entity that could not be
316
+ failed verification by the defined `verify` option. The `status` property is
317
+ set to `403`, the `type` property is set to `'entity.verify.failed'`, and the
318
+ `body` property is set to the entity value that failed verification.
319
+
320
+ ### request aborted
321
+
322
+ This error will occur when the request is aborted by the client before reading
323
+ the body has finished. The `received` property will be set to the number of
324
+ bytes received before the request was aborted and the `expected` property is
325
+ set to the number of expected bytes. The `status` property is set to `400`
326
+ and `type` property is set to `'request.aborted'`.
327
+
328
+ ### request entity too large
329
+
330
+ This error will occur when the request body's size is larger than the "limit"
331
+ option. The `limit` property will be set to the byte limit and the `length`
332
+ property will be set to the request body's length. The `status` property is
333
+ set to `413` and the `type` property is set to `'entity.too.large'`.
334
+
335
+ ### request size did not match content length
336
+
337
+ This error will occur when the request's length did not match the length from
338
+ the `Content-Length` header. This typically occurs when the request is malformed,
339
+ typically when the `Content-Length` header was calculated based on characters
340
+ instead of bytes. The `status` property is set to `400` and the `type` property
341
+ is set to `'request.size.invalid'`.
342
+
343
+ ### stream encoding should not be set
344
+
345
+ This error will occur when something called the `req.setEncoding` method prior
346
+ to this middleware. This module operates directly on bytes only and you cannot
347
+ call `req.setEncoding` when using this module. The `status` property is set to
348
+ `500` and the `type` property is set to `'stream.encoding.set'`.
349
+
350
+ ### stream is not readable
351
+
352
+ This error will occur when the request is no longer readable when this middleware
353
+ attempts to read it. This typically means something other than a middleware from
354
+ this module read the request body already and the middleware was also configured to
355
+ read the same request. The `status` property is set to `500` and the `type`
356
+ property is set to `'stream.not.readable'`.
357
+
358
+ ### too many parameters
359
+
360
+ This error will occur when the content of the request exceeds the configured
361
+ `parameterLimit` for the `urlencoded` parser. The `status` property is set to
362
+ `413` and the `type` property is set to `'parameters.too.many'`.
363
+
364
+ ### unsupported charset "BOGUS"
365
+
366
+ This error will occur when the request had a charset parameter in the
367
+ `Content-Type` header, but the `iconv-lite` module does not support it OR the
368
+ parser does not support it. The charset is contained in the message as well
369
+ as in the `charset` property. The `status` property is set to `415`, the
370
+ `type` property is set to `'charset.unsupported'`, and the `charset` property
371
+ is set to the charset that is unsupported.
372
+
373
+ ### unsupported content encoding "bogus"
374
+
375
+ This error will occur when the request had a `Content-Encoding` header that
376
+ contained an unsupported encoding. The encoding is contained in the message
377
+ as well as in the `encoding` property. The `status` property is set to `415`,
378
+ the `type` property is set to `'encoding.unsupported'`, and the `encoding`
379
+ property is set to the encoding that is unsupported.
380
+
381
+ ### The input exceeded the depth
382
+
383
+ This error occurs when using `bodyParser.urlencoded` with the `extended` property set to `true` and the input exceeds the configured `depth` option. The `status` property is set to `400`. It is recommended to review the `depth` option and evaluate if it requires a higher value. When the `depth` option is set to `32` (default value), the error will not be thrown.
384
+
385
+ ## Examples
386
+
387
+ ### Express/Connect top-level generic
388
+
389
+ This example demonstrates adding a generic JSON and URL-encoded parser as a
390
+ top-level middleware, which will parse the bodies of all incoming requests.
391
+ This is the simplest setup.
392
+
393
+ ```js
394
+ var express = require('express')
395
+ var bodyParser = require('body-parser')
396
+
397
+ var app = express()
398
+
399
+ // parse application/x-www-form-urlencoded
400
+ app.use(bodyParser.urlencoded({ extended: false }))
401
+
402
+ // parse application/json
403
+ app.use(bodyParser.json())
404
+
405
+ app.use(function (req, res) {
406
+ res.setHeader('Content-Type', 'text/plain')
407
+ res.write('you posted:\n')
408
+ res.end(JSON.stringify(req.body, null, 2))
409
+ })
410
+ ```
411
+
412
+ ### Express route-specific
413
+
414
+ This example demonstrates adding body parsers specifically to the routes that
415
+ need them. In general, this is the most recommended way to use body-parser with
416
+ Express.
417
+
418
+ ```js
419
+ var express = require('express')
420
+ var bodyParser = require('body-parser')
421
+
422
+ var app = express()
423
+
424
+ // create application/json parser
425
+ var jsonParser = bodyParser.json()
426
+
427
+ // create application/x-www-form-urlencoded parser
428
+ var urlencodedParser = bodyParser.urlencoded({ extended: false })
429
+
430
+ // POST /login gets urlencoded bodies
431
+ app.post('/login', urlencodedParser, function (req, res) {
432
+ res.send('welcome, ' + req.body.username)
433
+ })
434
+
435
+ // POST /api/users gets JSON bodies
436
+ app.post('/api/users', jsonParser, function (req, res) {
437
+ // create user in req.body
438
+ })
439
+ ```
440
+
441
+ ### Change accepted type for parsers
442
+
443
+ All the parsers accept a `type` option which allows you to change the
444
+ `Content-Type` that the middleware will parse.
445
+
446
+ ```js
447
+ var express = require('express')
448
+ var bodyParser = require('body-parser')
449
+
450
+ var app = express()
451
+
452
+ // parse various different custom JSON types as JSON
453
+ app.use(bodyParser.json({ type: 'application/*+json' }))
454
+
455
+ // parse some custom thing into a Buffer
456
+ app.use(bodyParser.raw({ type: 'application/vnd.custom-type' }))
457
+
458
+ // parse an HTML body into a string
459
+ app.use(bodyParser.text({ type: 'text/html' }))
460
+ ```
461
+
462
+ ## License
463
+
464
+ [MIT](LICENSE)
465
+
466
+ [ci-image]: https://badgen.net/github/checks/expressjs/body-parser/master?label=ci
467
+ [ci-url]: https://github.com/expressjs/body-parser/actions/workflows/ci.yml
468
+ [coveralls-image]: https://badgen.net/coveralls/c/github/expressjs/body-parser/master
469
+ [coveralls-url]: https://coveralls.io/r/expressjs/body-parser?branch=master
470
+ [node-version-image]: https://badgen.net/npm/node/body-parser
471
+ [node-version-url]: https://nodejs.org/en/download
472
+ [npm-downloads-image]: https://badgen.net/npm/dm/body-parser
473
+ [npm-url]: https://npmjs.org/package/body-parser
474
+ [npm-version-image]: https://badgen.net/npm/v/body-parser
475
+ [ossf-scorecard-badge]: https://api.scorecard.dev/projects/github.com/expressjs/body-parser/badge
476
+ [ossf-scorecard-visualizer]: https://ossf.github.io/scorecard-visualizer/#/projects/github.com/expressjs/body-parser
sandbox/node_modules/body-parser/index.js ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * body-parser
3
+ * Copyright(c) 2014-2015 Douglas Christopher Wilson
4
+ * MIT Licensed
5
+ */
6
+
7
+ 'use strict'
8
+
9
+ /**
10
+ * Module dependencies.
11
+ * @private
12
+ */
13
+
14
+ var deprecate = require('depd')('body-parser')
15
+
16
+ /**
17
+ * Cache of loaded parsers.
18
+ * @private
19
+ */
20
+
21
+ var parsers = Object.create(null)
22
+
23
+ /**
24
+ * @typedef Parsers
25
+ * @type {function}
26
+ * @property {function} json
27
+ * @property {function} raw
28
+ * @property {function} text
29
+ * @property {function} urlencoded
30
+ */
31
+
32
+ /**
33
+ * Module exports.
34
+ * @type {Parsers}
35
+ */
36
+
37
+ exports = module.exports = deprecate.function(bodyParser,
38
+ 'bodyParser: use individual json/urlencoded middlewares')
39
+
40
+ /**
41
+ * JSON parser.
42
+ * @public
43
+ */
44
+
45
+ Object.defineProperty(exports, 'json', {
46
+ configurable: true,
47
+ enumerable: true,
48
+ get: createParserGetter('json')
49
+ })
50
+
51
+ /**
52
+ * Raw parser.
53
+ * @public
54
+ */
55
+
56
+ Object.defineProperty(exports, 'raw', {
57
+ configurable: true,
58
+ enumerable: true,
59
+ get: createParserGetter('raw')
60
+ })
61
+
62
+ /**
63
+ * Text parser.
64
+ * @public
65
+ */
66
+
67
+ Object.defineProperty(exports, 'text', {
68
+ configurable: true,
69
+ enumerable: true,
70
+ get: createParserGetter('text')
71
+ })
72
+
73
+ /**
74
+ * URL-encoded parser.
75
+ * @public
76
+ */
77
+
78
+ Object.defineProperty(exports, 'urlencoded', {
79
+ configurable: true,
80
+ enumerable: true,
81
+ get: createParserGetter('urlencoded')
82
+ })
83
+
84
+ /**
85
+ * Create a middleware to parse json and urlencoded bodies.
86
+ *
87
+ * @param {object} [options]
88
+ * @return {function}
89
+ * @deprecated
90
+ * @public
91
+ */
92
+
93
+ function bodyParser (options) {
94
+ // use default type for parsers
95
+ var opts = Object.create(options || null, {
96
+ type: {
97
+ configurable: true,
98
+ enumerable: true,
99
+ value: undefined,
100
+ writable: true
101
+ }
102
+ })
103
+
104
+ var _urlencoded = exports.urlencoded(opts)
105
+ var _json = exports.json(opts)
106
+
107
+ return function bodyParser (req, res, next) {
108
+ _json(req, res, function (err) {
109
+ if (err) return next(err)
110
+ _urlencoded(req, res, next)
111
+ })
112
+ }
113
+ }
114
+
115
+ /**
116
+ * Create a getter for loading a parser.
117
+ * @private
118
+ */
119
+
120
+ function createParserGetter (name) {
121
+ return function get () {
122
+ return loadParser(name)
123
+ }
124
+ }
125
+
126
+ /**
127
+ * Load a parser module.
128
+ * @private
129
+ */
130
+
131
+ function loadParser (parserName) {
132
+ var parser = parsers[parserName]
133
+
134
+ if (parser !== undefined) {
135
+ return parser
136
+ }
137
+
138
+ // this uses a switch for static require analysis
139
+ switch (parserName) {
140
+ case 'json':
141
+ parser = require('./lib/types/json')
142
+ break
143
+ case 'raw':
144
+ parser = require('./lib/types/raw')
145
+ break
146
+ case 'text':
147
+ parser = require('./lib/types/text')
148
+ break
149
+ case 'urlencoded':
150
+ parser = require('./lib/types/urlencoded')
151
+ break
152
+ }
153
+
154
+ // store to prevent invoking require()
155
+ return (parsers[parserName] = parser)
156
+ }
sandbox/node_modules/body-parser/lib/read.js ADDED
@@ -0,0 +1,205 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * body-parser
3
+ * Copyright(c) 2014-2015 Douglas Christopher Wilson
4
+ * MIT Licensed
5
+ */
6
+
7
+ 'use strict'
8
+
9
+ /**
10
+ * Module dependencies.
11
+ * @private
12
+ */
13
+
14
+ var createError = require('http-errors')
15
+ var destroy = require('destroy')
16
+ var getBody = require('raw-body')
17
+ var iconv = require('iconv-lite')
18
+ var onFinished = require('on-finished')
19
+ var unpipe = require('unpipe')
20
+ var zlib = require('zlib')
21
+
22
+ /**
23
+ * Module exports.
24
+ */
25
+
26
+ module.exports = read
27
+
28
+ /**
29
+ * Read a request into a buffer and parse.
30
+ *
31
+ * @param {object} req
32
+ * @param {object} res
33
+ * @param {function} next
34
+ * @param {function} parse
35
+ * @param {function} debug
36
+ * @param {object} options
37
+ * @private
38
+ */
39
+
40
+ function read (req, res, next, parse, debug, options) {
41
+ var length
42
+ var opts = options
43
+ var stream
44
+
45
+ // flag as parsed
46
+ req._body = true
47
+
48
+ // read options
49
+ var encoding = opts.encoding !== null
50
+ ? opts.encoding
51
+ : null
52
+ var verify = opts.verify
53
+
54
+ try {
55
+ // get the content stream
56
+ stream = contentstream(req, debug, opts.inflate)
57
+ length = stream.length
58
+ stream.length = undefined
59
+ } catch (err) {
60
+ return next(err)
61
+ }
62
+
63
+ // set raw-body options
64
+ opts.length = length
65
+ opts.encoding = verify
66
+ ? null
67
+ : encoding
68
+
69
+ // assert charset is supported
70
+ if (opts.encoding === null && encoding !== null && !iconv.encodingExists(encoding)) {
71
+ return next(createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', {
72
+ charset: encoding.toLowerCase(),
73
+ type: 'charset.unsupported'
74
+ }))
75
+ }
76
+
77
+ // read body
78
+ debug('read body')
79
+ getBody(stream, opts, function (error, body) {
80
+ if (error) {
81
+ var _error
82
+
83
+ if (error.type === 'encoding.unsupported') {
84
+ // echo back charset
85
+ _error = createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', {
86
+ charset: encoding.toLowerCase(),
87
+ type: 'charset.unsupported'
88
+ })
89
+ } else {
90
+ // set status code on error
91
+ _error = createError(400, error)
92
+ }
93
+
94
+ // unpipe from stream and destroy
95
+ if (stream !== req) {
96
+ unpipe(req)
97
+ destroy(stream, true)
98
+ }
99
+
100
+ // read off entire request
101
+ dump(req, function onfinished () {
102
+ next(createError(400, _error))
103
+ })
104
+ return
105
+ }
106
+
107
+ // verify
108
+ if (verify) {
109
+ try {
110
+ debug('verify body')
111
+ verify(req, res, body, encoding)
112
+ } catch (err) {
113
+ next(createError(403, err, {
114
+ body: body,
115
+ type: err.type || 'entity.verify.failed'
116
+ }))
117
+ return
118
+ }
119
+ }
120
+
121
+ // parse
122
+ var str = body
123
+ try {
124
+ debug('parse body')
125
+ str = typeof body !== 'string' && encoding !== null
126
+ ? iconv.decode(body, encoding)
127
+ : body
128
+ req.body = parse(str)
129
+ } catch (err) {
130
+ next(createError(400, err, {
131
+ body: str,
132
+ type: err.type || 'entity.parse.failed'
133
+ }))
134
+ return
135
+ }
136
+
137
+ next()
138
+ })
139
+ }
140
+
141
+ /**
142
+ * Get the content stream of the request.
143
+ *
144
+ * @param {object} req
145
+ * @param {function} debug
146
+ * @param {boolean} [inflate=true]
147
+ * @return {object}
148
+ * @api private
149
+ */
150
+
151
+ function contentstream (req, debug, inflate) {
152
+ var encoding = (req.headers['content-encoding'] || 'identity').toLowerCase()
153
+ var length = req.headers['content-length']
154
+ var stream
155
+
156
+ debug('content-encoding "%s"', encoding)
157
+
158
+ if (inflate === false && encoding !== 'identity') {
159
+ throw createError(415, 'content encoding unsupported', {
160
+ encoding: encoding,
161
+ type: 'encoding.unsupported'
162
+ })
163
+ }
164
+
165
+ switch (encoding) {
166
+ case 'deflate':
167
+ stream = zlib.createInflate()
168
+ debug('inflate body')
169
+ req.pipe(stream)
170
+ break
171
+ case 'gzip':
172
+ stream = zlib.createGunzip()
173
+ debug('gunzip body')
174
+ req.pipe(stream)
175
+ break
176
+ case 'identity':
177
+ stream = req
178
+ stream.length = length
179
+ break
180
+ default:
181
+ throw createError(415, 'unsupported content encoding "' + encoding + '"', {
182
+ encoding: encoding,
183
+ type: 'encoding.unsupported'
184
+ })
185
+ }
186
+
187
+ return stream
188
+ }
189
+
190
+ /**
191
+ * Dump the contents of a request.
192
+ *
193
+ * @param {object} req
194
+ * @param {function} callback
195
+ * @api private
196
+ */
197
+
198
+ function dump (req, callback) {
199
+ if (onFinished.isFinished(req)) {
200
+ callback(null)
201
+ } else {
202
+ onFinished(req, callback)
203
+ req.resume()
204
+ }
205
+ }
sandbox/node_modules/body-parser/lib/types/json.js ADDED
@@ -0,0 +1,243 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * body-parser
3
+ * Copyright(c) 2014 Jonathan Ong
4
+ * Copyright(c) 2014-2015 Douglas Christopher Wilson
5
+ * MIT Licensed
6
+ */
7
+
8
+ 'use strict'
9
+
10
+ /**
11
+ * Module dependencies.
12
+ * @private
13
+ */
14
+
15
+ var bytes = require('bytes')
16
+ var contentType = require('content-type')
17
+ var createError = require('http-errors')
18
+ var debug = require('debug')('body-parser:json')
19
+ var read = require('../read')
20
+ var typeis = require('type-is')
21
+
22
+ /**
23
+ * Module exports.
24
+ */
25
+
26
+ module.exports = json
27
+
28
+ /**
29
+ * RegExp to match the first non-space in a string.
30
+ *
31
+ * Allowed whitespace is defined in RFC 7159:
32
+ *
33
+ * ws = *(
34
+ * %x20 / ; Space
35
+ * %x09 / ; Horizontal tab
36
+ * %x0A / ; Line feed or New line
37
+ * %x0D ) ; Carriage return
38
+ */
39
+
40
+ var FIRST_CHAR_REGEXP = /^[\x20\x09\x0a\x0d]*([^\x20\x09\x0a\x0d])/ // eslint-disable-line no-control-regex
41
+
42
+ var JSON_SYNTAX_CHAR = '#'
43
+ var JSON_SYNTAX_REGEXP = /#+/g
44
+
45
+ /**
46
+ * Create a middleware to parse JSON bodies.
47
+ *
48
+ * @param {object} [options]
49
+ * @return {function}
50
+ * @public
51
+ */
52
+
53
+ function json (options) {
54
+ var opts = options || {}
55
+
56
+ var limit = typeof opts.limit !== 'number'
57
+ ? bytes.parse(opts.limit || '100kb')
58
+ : opts.limit
59
+ var inflate = opts.inflate !== false
60
+ var reviver = opts.reviver
61
+ var strict = opts.strict !== false
62
+ var type = opts.type || 'application/json'
63
+ var verify = opts.verify || false
64
+
65
+ if (verify !== false && typeof verify !== 'function') {
66
+ throw new TypeError('option verify must be function')
67
+ }
68
+
69
+ // create the appropriate type checking function
70
+ var shouldParse = typeof type !== 'function'
71
+ ? typeChecker(type)
72
+ : type
73
+
74
+ function parse (body) {
75
+ if (body.length === 0) {
76
+ // special-case empty json body, as it's a common client-side mistake
77
+ // TODO: maybe make this configurable or part of "strict" option
78
+ return {}
79
+ }
80
+
81
+ if (strict) {
82
+ var first = firstchar(body)
83
+
84
+ if (first !== '{' && first !== '[') {
85
+ debug('strict violation')
86
+ throw createStrictSyntaxError(body, first)
87
+ }
88
+ }
89
+
90
+ try {
91
+ debug('parse json')
92
+ return JSON.parse(body, reviver)
93
+ } catch (e) {
94
+ throw normalizeJsonSyntaxError(e, {
95
+ message: e.message,
96
+ stack: e.stack
97
+ })
98
+ }
99
+ }
100
+
101
+ return function jsonParser (req, res, next) {
102
+ if (req._body) {
103
+ debug('body already parsed')
104
+ next()
105
+ return
106
+ }
107
+
108
+ req.body = req.body || {}
109
+
110
+ // skip requests without bodies
111
+ if (!typeis.hasBody(req)) {
112
+ debug('skip empty body')
113
+ next()
114
+ return
115
+ }
116
+
117
+ debug('content-type %j', req.headers['content-type'])
118
+
119
+ // determine if request should be parsed
120
+ if (!shouldParse(req)) {
121
+ debug('skip parsing')
122
+ next()
123
+ return
124
+ }
125
+
126
+ // assert charset per RFC 7159 sec 8.1
127
+ var charset = getCharset(req) || 'utf-8'
128
+ if (charset.slice(0, 4) !== 'utf-') {
129
+ debug('invalid charset')
130
+ next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', {
131
+ charset: charset,
132
+ type: 'charset.unsupported'
133
+ }))
134
+ return
135
+ }
136
+
137
+ // read
138
+ read(req, res, next, parse, debug, {
139
+ encoding: charset,
140
+ inflate: inflate,
141
+ limit: limit,
142
+ verify: verify
143
+ })
144
+ }
145
+ }
146
+
147
+ /**
148
+ * Create strict violation syntax error matching native error.
149
+ *
150
+ * @param {string} str
151
+ * @param {string} char
152
+ * @return {Error}
153
+ * @private
154
+ */
155
+
156
+ function createStrictSyntaxError (str, char) {
157
+ var index = str.indexOf(char)
158
+ var partial = ''
159
+
160
+ if (index !== -1) {
161
+ partial = str.substring(0, index) + new Array(str.length - index + 1).join(JSON_SYNTAX_CHAR)
162
+ }
163
+
164
+ try {
165
+ JSON.parse(partial); /* istanbul ignore next */ throw new SyntaxError('strict violation')
166
+ } catch (e) {
167
+ return normalizeJsonSyntaxError(e, {
168
+ message: e.message.replace(JSON_SYNTAX_REGEXP, function (placeholder) {
169
+ return str.substring(index, index + placeholder.length)
170
+ }),
171
+ stack: e.stack
172
+ })
173
+ }
174
+ }
175
+
176
+ /**
177
+ * Get the first non-whitespace character in a string.
178
+ *
179
+ * @param {string} str
180
+ * @return {function}
181
+ * @private
182
+ */
183
+
184
+ function firstchar (str) {
185
+ var match = FIRST_CHAR_REGEXP.exec(str)
186
+
187
+ return match
188
+ ? match[1]
189
+ : undefined
190
+ }
191
+
192
+ /**
193
+ * Get the charset of a request.
194
+ *
195
+ * @param {object} req
196
+ * @api private
197
+ */
198
+
199
+ function getCharset (req) {
200
+ try {
201
+ return (contentType.parse(req).parameters.charset || '').toLowerCase()
202
+ } catch (e) {
203
+ return undefined
204
+ }
205
+ }
206
+
207
+ /**
208
+ * Normalize a SyntaxError for JSON.parse.
209
+ *
210
+ * @param {SyntaxError} error
211
+ * @param {object} obj
212
+ * @return {SyntaxError}
213
+ */
214
+
215
+ function normalizeJsonSyntaxError (error, obj) {
216
+ var keys = Object.getOwnPropertyNames(error)
217
+
218
+ for (var i = 0; i < keys.length; i++) {
219
+ var key = keys[i]
220
+ if (key !== 'stack' && key !== 'message') {
221
+ delete error[key]
222
+ }
223
+ }
224
+
225
+ // replace stack before message for Node.js 0.10 and below
226
+ error.stack = obj.stack.replace(error.message, obj.message)
227
+ error.message = obj.message
228
+
229
+ return error
230
+ }
231
+
232
+ /**
233
+ * Get the simple type checker.
234
+ *
235
+ * @param {string} type
236
+ * @return {function}
237
+ */
238
+
239
+ function typeChecker (type) {
240
+ return function checkType (req) {
241
+ return Boolean(typeis(req, type))
242
+ }
243
+ }
sandbox/node_modules/body-parser/lib/types/raw.js ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * body-parser
3
+ * Copyright(c) 2014-2015 Douglas Christopher Wilson
4
+ * MIT Licensed
5
+ */
6
+
7
+ 'use strict'
8
+
9
+ /**
10
+ * Module dependencies.
11
+ */
12
+
13
+ var bytes = require('bytes')
14
+ var debug = require('debug')('body-parser:raw')
15
+ var read = require('../read')
16
+ var typeis = require('type-is')
17
+
18
+ /**
19
+ * Module exports.
20
+ */
21
+
22
+ module.exports = raw
23
+
24
+ /**
25
+ * Create a middleware to parse raw bodies.
26
+ *
27
+ * @param {object} [options]
28
+ * @return {function}
29
+ * @api public
30
+ */
31
+
32
+ function raw (options) {
33
+ var opts = options || {}
34
+
35
+ var inflate = opts.inflate !== false
36
+ var limit = typeof opts.limit !== 'number'
37
+ ? bytes.parse(opts.limit || '100kb')
38
+ : opts.limit
39
+ var type = opts.type || 'application/octet-stream'
40
+ var verify = opts.verify || false
41
+
42
+ if (verify !== false && typeof verify !== 'function') {
43
+ throw new TypeError('option verify must be function')
44
+ }
45
+
46
+ // create the appropriate type checking function
47
+ var shouldParse = typeof type !== 'function'
48
+ ? typeChecker(type)
49
+ : type
50
+
51
+ function parse (buf) {
52
+ return buf
53
+ }
54
+
55
+ return function rawParser (req, res, next) {
56
+ if (req._body) {
57
+ debug('body already parsed')
58
+ next()
59
+ return
60
+ }
61
+
62
+ req.body = req.body || {}
63
+
64
+ // skip requests without bodies
65
+ if (!typeis.hasBody(req)) {
66
+ debug('skip empty body')
67
+ next()
68
+ return
69
+ }
70
+
71
+ debug('content-type %j', req.headers['content-type'])
72
+
73
+ // determine if request should be parsed
74
+ if (!shouldParse(req)) {
75
+ debug('skip parsing')
76
+ next()
77
+ return
78
+ }
79
+
80
+ // read
81
+ read(req, res, next, parse, debug, {
82
+ encoding: null,
83
+ inflate: inflate,
84
+ limit: limit,
85
+ verify: verify
86
+ })
87
+ }
88
+ }
89
+
90
+ /**
91
+ * Get the simple type checker.
92
+ *
93
+ * @param {string} type
94
+ * @return {function}
95
+ */
96
+
97
+ function typeChecker (type) {
98
+ return function checkType (req) {
99
+ return Boolean(typeis(req, type))
100
+ }
101
+ }
sandbox/node_modules/body-parser/lib/types/text.js ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * body-parser
3
+ * Copyright(c) 2014-2015 Douglas Christopher Wilson
4
+ * MIT Licensed
5
+ */
6
+
7
+ 'use strict'
8
+
9
+ /**
10
+ * Module dependencies.
11
+ */
12
+
13
+ var bytes = require('bytes')
14
+ var contentType = require('content-type')
15
+ var debug = require('debug')('body-parser:text')
16
+ var read = require('../read')
17
+ var typeis = require('type-is')
18
+
19
+ /**
20
+ * Module exports.
21
+ */
22
+
23
+ module.exports = text
24
+
25
+ /**
26
+ * Create a middleware to parse text bodies.
27
+ *
28
+ * @param {object} [options]
29
+ * @return {function}
30
+ * @api public
31
+ */
32
+
33
+ function text (options) {
34
+ var opts = options || {}
35
+
36
+ var defaultCharset = opts.defaultCharset || 'utf-8'
37
+ var inflate = opts.inflate !== false
38
+ var limit = typeof opts.limit !== 'number'
39
+ ? bytes.parse(opts.limit || '100kb')
40
+ : opts.limit
41
+ var type = opts.type || 'text/plain'
42
+ var verify = opts.verify || false
43
+
44
+ if (verify !== false && typeof verify !== 'function') {
45
+ throw new TypeError('option verify must be function')
46
+ }
47
+
48
+ // create the appropriate type checking function
49
+ var shouldParse = typeof type !== 'function'
50
+ ? typeChecker(type)
51
+ : type
52
+
53
+ function parse (buf) {
54
+ return buf
55
+ }
56
+
57
+ return function textParser (req, res, next) {
58
+ if (req._body) {
59
+ debug('body already parsed')
60
+ next()
61
+ return
62
+ }
63
+
64
+ req.body = req.body || {}
65
+
66
+ // skip requests without bodies
67
+ if (!typeis.hasBody(req)) {
68
+ debug('skip empty body')
69
+ next()
70
+ return
71
+ }
72
+
73
+ debug('content-type %j', req.headers['content-type'])
74
+
75
+ // determine if request should be parsed
76
+ if (!shouldParse(req)) {
77
+ debug('skip parsing')
78
+ next()
79
+ return
80
+ }
81
+
82
+ // get charset
83
+ var charset = getCharset(req) || defaultCharset
84
+
85
+ // read
86
+ read(req, res, next, parse, debug, {
87
+ encoding: charset,
88
+ inflate: inflate,
89
+ limit: limit,
90
+ verify: verify
91
+ })
92
+ }
93
+ }
94
+
95
+ /**
96
+ * Get the charset of a request.
97
+ *
98
+ * @param {object} req
99
+ * @api private
100
+ */
101
+
102
+ function getCharset (req) {
103
+ try {
104
+ return (contentType.parse(req).parameters.charset || '').toLowerCase()
105
+ } catch (e) {
106
+ return undefined
107
+ }
108
+ }
109
+
110
+ /**
111
+ * Get the simple type checker.
112
+ *
113
+ * @param {string} type
114
+ * @return {function}
115
+ */
116
+
117
+ function typeChecker (type) {
118
+ return function checkType (req) {
119
+ return Boolean(typeis(req, type))
120
+ }
121
+ }
sandbox/node_modules/body-parser/lib/types/urlencoded.js ADDED
@@ -0,0 +1,299 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * body-parser
3
+ * Copyright(c) 2014 Jonathan Ong
4
+ * Copyright(c) 2014-2015 Douglas Christopher Wilson
5
+ * MIT Licensed
6
+ */
7
+
8
+ 'use strict'
9
+
10
+ /**
11
+ * Module dependencies.
12
+ * @private
13
+ */
14
+
15
+ var bytes = require('bytes')
16
+ var contentType = require('content-type')
17
+ var createError = require('http-errors')
18
+ var debug = require('debug')('body-parser:urlencoded')
19
+ var deprecate = require('depd')('body-parser')
20
+ var read = require('../read')
21
+ var typeis = require('type-is')
22
+
23
+ /**
24
+ * Module exports.
25
+ */
26
+
27
+ module.exports = urlencoded
28
+
29
+ /**
30
+ * Cache of parser modules.
31
+ */
32
+
33
+ var parsers = Object.create(null)
34
+
35
+ /**
36
+ * Create a middleware to parse urlencoded bodies.
37
+ *
38
+ * @param {object} [options]
39
+ * @return {function}
40
+ * @public
41
+ */
42
+
43
+ function urlencoded (options) {
44
+ var opts = options || {}
45
+
46
+ // notice because option default will flip in next major
47
+ if (opts.extended === undefined) {
48
+ deprecate('undefined extended: provide extended option')
49
+ }
50
+
51
+ var extended = opts.extended !== false
52
+ var inflate = opts.inflate !== false
53
+ var limit = typeof opts.limit !== 'number'
54
+ ? bytes.parse(opts.limit || '100kb')
55
+ : opts.limit
56
+ var type = opts.type || 'application/x-www-form-urlencoded'
57
+ var verify = opts.verify || false
58
+
59
+ if (verify !== false && typeof verify !== 'function') {
60
+ throw new TypeError('option verify must be function')
61
+ }
62
+
63
+ // create the appropriate query parser
64
+ var queryparse = extended
65
+ ? extendedparser(opts)
66
+ : simpleparser(opts)
67
+
68
+ // create the appropriate type checking function
69
+ var shouldParse = typeof type !== 'function'
70
+ ? typeChecker(type)
71
+ : type
72
+
73
+ function parse (body) {
74
+ return body.length
75
+ ? queryparse(body)
76
+ : {}
77
+ }
78
+
79
+ return function urlencodedParser (req, res, next) {
80
+ if (req._body) {
81
+ debug('body already parsed')
82
+ next()
83
+ return
84
+ }
85
+
86
+ req.body = req.body || {}
87
+
88
+ // skip requests without bodies
89
+ if (!typeis.hasBody(req)) {
90
+ debug('skip empty body')
91
+ next()
92
+ return
93
+ }
94
+
95
+ debug('content-type %j', req.headers['content-type'])
96
+
97
+ // determine if request should be parsed
98
+ if (!shouldParse(req)) {
99
+ debug('skip parsing')
100
+ next()
101
+ return
102
+ }
103
+
104
+ // assert charset
105
+ var charset = getCharset(req) || 'utf-8'
106
+ if (charset !== 'utf-8') {
107
+ debug('invalid charset')
108
+ next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', {
109
+ charset: charset,
110
+ type: 'charset.unsupported'
111
+ }))
112
+ return
113
+ }
114
+
115
+ // read
116
+ read(req, res, next, parse, debug, {
117
+ debug: debug,
118
+ encoding: charset,
119
+ inflate: inflate,
120
+ limit: limit,
121
+ verify: verify
122
+ })
123
+ }
124
+ }
125
+
126
+ /**
127
+ * Get the extended query parser.
128
+ *
129
+ * @param {object} options
130
+ */
131
+
132
+ function extendedparser (options) {
133
+ var parameterLimit = options.parameterLimit !== undefined
134
+ ? options.parameterLimit
135
+ : 1000
136
+ var depth = options.depth !== undefined ? options.depth : 32
137
+ var parse = parser('qs')
138
+
139
+ if (isNaN(parameterLimit) || parameterLimit < 1) {
140
+ throw new TypeError('option parameterLimit must be a positive number')
141
+ }
142
+
143
+ if (isNaN(depth) || depth < 0) {
144
+ throw new TypeError('option depth must be a zero or a positive number')
145
+ }
146
+
147
+ if (isFinite(parameterLimit)) {
148
+ parameterLimit = parameterLimit | 0
149
+ }
150
+
151
+ return function queryparse (body) {
152
+ var paramCount = parameterCount(body, parameterLimit)
153
+
154
+ if (paramCount === undefined) {
155
+ debug('too many parameters')
156
+ throw createError(413, 'too many parameters', {
157
+ type: 'parameters.too.many'
158
+ })
159
+ }
160
+
161
+ var arrayLimit = Math.max(100, paramCount)
162
+
163
+ debug('parse extended urlencoding')
164
+ try {
165
+ return parse(body, {
166
+ allowPrototypes: true,
167
+ arrayLimit: arrayLimit,
168
+ depth: depth,
169
+ strictDepth: true,
170
+ parameterLimit: parameterLimit
171
+ })
172
+ } catch (err) {
173
+ if (err instanceof RangeError) {
174
+ throw createError(400, 'The input exceeded the depth', {
175
+ type: 'querystring.parse.rangeError'
176
+ })
177
+ } else {
178
+ throw err
179
+ }
180
+ }
181
+ }
182
+ }
183
+
184
+ /**
185
+ * Get the charset of a request.
186
+ *
187
+ * @param {object} req
188
+ * @api private
189
+ */
190
+
191
+ function getCharset (req) {
192
+ try {
193
+ return (contentType.parse(req).parameters.charset || '').toLowerCase()
194
+ } catch (e) {
195
+ return undefined
196
+ }
197
+ }
198
+
199
+ /**
200
+ * Count the number of parameters, stopping once limit reached
201
+ *
202
+ * @param {string} body
203
+ * @param {number} limit
204
+ * @api private
205
+ */
206
+
207
+ function parameterCount (body, limit) {
208
+ var count = 0
209
+ var index = -1
210
+
211
+ do {
212
+ count++
213
+ if (count > limit) {
214
+ return undefined
215
+ }
216
+ index = body.indexOf('&', index + 1)
217
+ } while (index !== -1)
218
+
219
+ return count
220
+ }
221
+
222
+ /**
223
+ * Get parser for module name dynamically.
224
+ *
225
+ * @param {string} name
226
+ * @return {function}
227
+ * @api private
228
+ */
229
+
230
+ function parser (name) {
231
+ var mod = parsers[name]
232
+
233
+ if (mod !== undefined) {
234
+ return mod.parse
235
+ }
236
+
237
+ // this uses a switch for static require analysis
238
+ switch (name) {
239
+ case 'qs':
240
+ mod = require('qs')
241
+ break
242
+ case 'querystring':
243
+ mod = require('querystring')
244
+ break
245
+ }
246
+
247
+ // store to prevent invoking require()
248
+ parsers[name] = mod
249
+
250
+ return mod.parse
251
+ }
252
+
253
+ /**
254
+ * Get the simple query parser.
255
+ *
256
+ * @param {object} options
257
+ */
258
+
259
+ function simpleparser (options) {
260
+ var parameterLimit = options.parameterLimit !== undefined
261
+ ? options.parameterLimit
262
+ : 1000
263
+ var parse = parser('querystring')
264
+
265
+ if (isNaN(parameterLimit) || parameterLimit < 1) {
266
+ throw new TypeError('option parameterLimit must be a positive number')
267
+ }
268
+
269
+ if (isFinite(parameterLimit)) {
270
+ parameterLimit = parameterLimit | 0
271
+ }
272
+
273
+ return function queryparse (body) {
274
+ var paramCount = parameterCount(body, parameterLimit)
275
+
276
+ if (paramCount === undefined) {
277
+ debug('too many parameters')
278
+ throw createError(413, 'too many parameters', {
279
+ type: 'parameters.too.many'
280
+ })
281
+ }
282
+
283
+ debug('parse urlencoding')
284
+ return parse(body, undefined, undefined, { maxKeys: parameterLimit })
285
+ }
286
+ }
287
+
288
+ /**
289
+ * Get the simple type checker.
290
+ *
291
+ * @param {string} type
292
+ * @return {function}
293
+ */
294
+
295
+ function typeChecker (type) {
296
+ return function checkType (req) {
297
+ return Boolean(typeis(req, type))
298
+ }
299
+ }
sandbox/node_modules/body-parser/package.json ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "body-parser",
3
+ "description": "Node.js body parsing middleware",
4
+ "version": "1.20.5",
5
+ "contributors": [
6
+ "Douglas Christopher Wilson <doug@somethingdoug.com>",
7
+ "Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)"
8
+ ],
9
+ "license": "MIT",
10
+ "repository": "expressjs/body-parser",
11
+ "dependencies": {
12
+ "bytes": "~3.1.2",
13
+ "content-type": "~1.0.5",
14
+ "debug": "2.6.9",
15
+ "depd": "2.0.0",
16
+ "destroy": "~1.2.0",
17
+ "http-errors": "~2.0.1",
18
+ "iconv-lite": "~0.4.24",
19
+ "on-finished": "~2.4.1",
20
+ "qs": "~6.15.1",
21
+ "raw-body": "~2.5.3",
22
+ "type-is": "~1.6.18",
23
+ "unpipe": "~1.0.0"
24
+ },
25
+ "devDependencies": {
26
+ "eslint": "8.34.0",
27
+ "eslint-config-standard": "14.1.1",
28
+ "eslint-plugin-import": "2.27.5",
29
+ "eslint-plugin-markdown": "3.0.0",
30
+ "eslint-plugin-node": "11.1.0",
31
+ "eslint-plugin-promise": "6.1.1",
32
+ "eslint-plugin-standard": "4.1.0",
33
+ "methods": "1.1.2",
34
+ "mocha": "10.2.0",
35
+ "nyc": "15.1.0",
36
+ "safe-buffer": "5.2.1",
37
+ "supertest": "6.3.3"
38
+ },
39
+ "files": [
40
+ "lib/",
41
+ "LICENSE",
42
+ "HISTORY.md",
43
+ "index.js"
44
+ ],
45
+ "engines": {
46
+ "node": ">= 0.8",
47
+ "npm": "1.2.8000 || >= 1.4.16"
48
+ },
49
+ "scripts": {
50
+ "lint": "eslint .",
51
+ "test": "mocha --require test/support/env --reporter spec --check-leaks --bail test/",
52
+ "test-ci": "nyc --reporter=lcov --reporter=text npm test",
53
+ "test-cov": "nyc --reporter=html --reporter=text npm test"
54
+ }
55
+ }
sandbox/node_modules/bytes/History.md ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 3.1.2 / 2022-01-27
2
+ ==================
3
+
4
+ * Fix return value for un-parsable strings
5
+
6
+ 3.1.1 / 2021-11-15
7
+ ==================
8
+
9
+ * Fix "thousandsSeparator" incorrecting formatting fractional part
10
+
11
+ 3.1.0 / 2019-01-22
12
+ ==================
13
+
14
+ * Add petabyte (`pb`) support
15
+
16
+ 3.0.0 / 2017-08-31
17
+ ==================
18
+
19
+ * Change "kB" to "KB" in format output
20
+ * Remove support for Node.js 0.6
21
+ * Remove support for ComponentJS
22
+
23
+ 2.5.0 / 2017-03-24
24
+ ==================
25
+
26
+ * Add option "unit"
27
+
28
+ 2.4.0 / 2016-06-01
29
+ ==================
30
+
31
+ * Add option "unitSeparator"
32
+
33
+ 2.3.0 / 2016-02-15
34
+ ==================
35
+
36
+ * Drop partial bytes on all parsed units
37
+ * Fix non-finite numbers to `.format` to return `null`
38
+ * Fix parsing byte string that looks like hex
39
+ * perf: hoist regular expressions
40
+
41
+ 2.2.0 / 2015-11-13
42
+ ==================
43
+
44
+ * add option "decimalPlaces"
45
+ * add option "fixedDecimals"
46
+
47
+ 2.1.0 / 2015-05-21
48
+ ==================
49
+
50
+ * add `.format` export
51
+ * add `.parse` export
52
+
53
+ 2.0.2 / 2015-05-20
54
+ ==================
55
+
56
+ * remove map recreation
57
+ * remove unnecessary object construction
58
+
59
+ 2.0.1 / 2015-05-07
60
+ ==================
61
+
62
+ * fix browserify require
63
+ * remove node.extend dependency
64
+
65
+ 2.0.0 / 2015-04-12
66
+ ==================
67
+
68
+ * add option "case"
69
+ * add option "thousandsSeparator"
70
+ * return "null" on invalid parse input
71
+ * support proper round-trip: bytes(bytes(num)) === num
72
+ * units no longer case sensitive when parsing
73
+
74
+ 1.0.0 / 2014-05-05
75
+ ==================
76
+
77
+ * add negative support. fixes #6
78
+
79
+ 0.3.0 / 2014-03-19
80
+ ==================
81
+
82
+ * added terabyte support
83
+
84
+ 0.2.1 / 2013-04-01
85
+ ==================
86
+
87
+ * add .component
88
+
89
+ 0.2.0 / 2012-10-28
90
+ ==================
91
+
92
+ * bytes(200).should.eql('200b')
93
+
94
+ 0.1.0 / 2012-07-04
95
+ ==================
96
+
97
+ * add bytes to string conversion [yields]
sandbox/node_modules/bytes/LICENSE ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (The MIT License)
2
+
3
+ Copyright (c) 2012-2014 TJ Holowaychuk <tj@vision-media.ca>
4
+ Copyright (c) 2015 Jed Watson <jed.watson@me.com>
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining
7
+ a copy of this software and associated documentation files (the
8
+ 'Software'), to deal in the Software without restriction, including
9
+ without limitation the rights to use, copy, modify, merge, publish,
10
+ distribute, sublicense, and/or sell copies of the Software, and to
11
+ permit persons to whom the Software is furnished to do so, subject to
12
+ the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be
15
+ included in all copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
18
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
sandbox/node_modules/bytes/Readme.md ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Bytes utility
2
+
3
+ [![NPM Version][npm-image]][npm-url]
4
+ [![NPM Downloads][downloads-image]][downloads-url]
5
+ [![Build Status][ci-image]][ci-url]
6
+ [![Test Coverage][coveralls-image]][coveralls-url]
7
+
8
+ Utility to parse a string bytes (ex: `1TB`) to bytes (`1099511627776`) and vice-versa.
9
+
10
+ ## Installation
11
+
12
+ This is a [Node.js](https://nodejs.org/en/) module available through the
13
+ [npm registry](https://www.npmjs.com/). Installation is done using the
14
+ [`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
15
+
16
+ ```bash
17
+ $ npm install bytes
18
+ ```
19
+
20
+ ## Usage
21
+
22
+ ```js
23
+ var bytes = require('bytes');
24
+ ```
25
+
26
+ #### bytes(number|string value, [options]): number|string|null
27
+
28
+ Default export function. Delegates to either `bytes.format` or `bytes.parse` based on the type of `value`.
29
+
30
+ **Arguments**
31
+
32
+ | Name | Type | Description |
33
+ |---------|----------|--------------------|
34
+ | value | `number`|`string` | Number value to format or string value to parse |
35
+ | options | `Object` | Conversion options for `format` |
36
+
37
+ **Returns**
38
+
39
+ | Name | Type | Description |
40
+ |---------|------------------|-------------------------------------------------|
41
+ | results | `string`|`number`|`null` | Return null upon error. Numeric value in bytes, or string value otherwise. |
42
+
43
+ **Example**
44
+
45
+ ```js
46
+ bytes(1024);
47
+ // output: '1KB'
48
+
49
+ bytes('1KB');
50
+ // output: 1024
51
+ ```
52
+
53
+ #### bytes.format(number value, [options]): string|null
54
+
55
+ Format the given value in bytes into a string. If the value is negative, it is kept as such. If it is a float, it is
56
+ rounded.
57
+
58
+ **Arguments**
59
+
60
+ | Name | Type | Description |
61
+ |---------|----------|--------------------|
62
+ | value | `number` | Value in bytes |
63
+ | options | `Object` | Conversion options |
64
+
65
+ **Options**
66
+
67
+ | Property | Type | Description |
68
+ |-------------------|--------|-----------------------------------------------------------------------------------------|
69
+ | decimalPlaces | `number`|`null` | Maximum number of decimal places to include in output. Default value to `2`. |
70
+ | fixedDecimals | `boolean`|`null` | Whether to always display the maximum number of decimal places. Default value to `false` |
71
+ | thousandsSeparator | `string`|`null` | Example of values: `' '`, `','` and `'.'`... Default value to `''`. |
72
+ | unit | `string`|`null` | The unit in which the result will be returned (B/KB/MB/GB/TB). Default value to `''` (which means auto detect). |
73
+ | unitSeparator | `string`|`null` | Separator to use between number and unit. Default value to `''`. |
74
+
75
+ **Returns**
76
+
77
+ | Name | Type | Description |
78
+ |---------|------------------|-------------------------------------------------|
79
+ | results | `string`|`null` | Return null upon error. String value otherwise. |
80
+
81
+ **Example**
82
+
83
+ ```js
84
+ bytes.format(1024);
85
+ // output: '1KB'
86
+
87
+ bytes.format(1000);
88
+ // output: '1000B'
89
+
90
+ bytes.format(1000, {thousandsSeparator: ' '});
91
+ // output: '1 000B'
92
+
93
+ bytes.format(1024 * 1.7, {decimalPlaces: 0});
94
+ // output: '2KB'
95
+
96
+ bytes.format(1024, {unitSeparator: ' '});
97
+ // output: '1 KB'
98
+ ```
99
+
100
+ #### bytes.parse(string|number value): number|null
101
+
102
+ Parse the string value into an integer in bytes. If no unit is given, or `value`
103
+ is a number, it is assumed the value is in bytes.
104
+
105
+ Supported units and abbreviations are as follows and are case-insensitive:
106
+
107
+ * `b` for bytes
108
+ * `kb` for kilobytes
109
+ * `mb` for megabytes
110
+ * `gb` for gigabytes
111
+ * `tb` for terabytes
112
+ * `pb` for petabytes
113
+
114
+ The units are in powers of two, not ten. This means 1kb = 1024b according to this parser.
115
+
116
+ **Arguments**
117
+
118
+ | Name | Type | Description |
119
+ |---------------|--------|--------------------|
120
+ | value | `string`|`number` | String to parse, or number in bytes. |
121
+
122
+ **Returns**
123
+
124
+ | Name | Type | Description |
125
+ |---------|-------------|-------------------------|
126
+ | results | `number`|`null` | Return null upon error. Value in bytes otherwise. |
127
+
128
+ **Example**
129
+
130
+ ```js
131
+ bytes.parse('1KB');
132
+ // output: 1024
133
+
134
+ bytes.parse('1024');
135
+ // output: 1024
136
+
137
+ bytes.parse(1024);
138
+ // output: 1024
139
+ ```
140
+
141
+ ## License
142
+
143
+ [MIT](LICENSE)
144
+
145
+ [ci-image]: https://badgen.net/github/checks/visionmedia/bytes.js/master?label=ci
146
+ [ci-url]: https://github.com/visionmedia/bytes.js/actions?query=workflow%3Aci
147
+ [coveralls-image]: https://badgen.net/coveralls/c/github/visionmedia/bytes.js/master
148
+ [coveralls-url]: https://coveralls.io/r/visionmedia/bytes.js?branch=master
149
+ [downloads-image]: https://badgen.net/npm/dm/bytes
150
+ [downloads-url]: https://npmjs.org/package/bytes
151
+ [npm-image]: https://badgen.net/npm/v/bytes
152
+ [npm-url]: https://npmjs.org/package/bytes
sandbox/node_modules/bytes/index.js ADDED
@@ -0,0 +1,170 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * bytes
3
+ * Copyright(c) 2012-2014 TJ Holowaychuk
4
+ * Copyright(c) 2015 Jed Watson
5
+ * MIT Licensed
6
+ */
7
+
8
+ 'use strict';
9
+
10
+ /**
11
+ * Module exports.
12
+ * @public
13
+ */
14
+
15
+ module.exports = bytes;
16
+ module.exports.format = format;
17
+ module.exports.parse = parse;
18
+
19
+ /**
20
+ * Module variables.
21
+ * @private
22
+ */
23
+
24
+ var formatThousandsRegExp = /\B(?=(\d{3})+(?!\d))/g;
25
+
26
+ var formatDecimalsRegExp = /(?:\.0*|(\.[^0]+)0+)$/;
27
+
28
+ var map = {
29
+ b: 1,
30
+ kb: 1 << 10,
31
+ mb: 1 << 20,
32
+ gb: 1 << 30,
33
+ tb: Math.pow(1024, 4),
34
+ pb: Math.pow(1024, 5),
35
+ };
36
+
37
+ var parseRegExp = /^((-|\+)?(\d+(?:\.\d+)?)) *(kb|mb|gb|tb|pb)$/i;
38
+
39
+ /**
40
+ * Convert the given value in bytes into a string or parse to string to an integer in bytes.
41
+ *
42
+ * @param {string|number} value
43
+ * @param {{
44
+ * case: [string],
45
+ * decimalPlaces: [number]
46
+ * fixedDecimals: [boolean]
47
+ * thousandsSeparator: [string]
48
+ * unitSeparator: [string]
49
+ * }} [options] bytes options.
50
+ *
51
+ * @returns {string|number|null}
52
+ */
53
+
54
+ function bytes(value, options) {
55
+ if (typeof value === 'string') {
56
+ return parse(value);
57
+ }
58
+
59
+ if (typeof value === 'number') {
60
+ return format(value, options);
61
+ }
62
+
63
+ return null;
64
+ }
65
+
66
+ /**
67
+ * Format the given value in bytes into a string.
68
+ *
69
+ * If the value is negative, it is kept as such. If it is a float,
70
+ * it is rounded.
71
+ *
72
+ * @param {number} value
73
+ * @param {object} [options]
74
+ * @param {number} [options.decimalPlaces=2]
75
+ * @param {number} [options.fixedDecimals=false]
76
+ * @param {string} [options.thousandsSeparator=]
77
+ * @param {string} [options.unit=]
78
+ * @param {string} [options.unitSeparator=]
79
+ *
80
+ * @returns {string|null}
81
+ * @public
82
+ */
83
+
84
+ function format(value, options) {
85
+ if (!Number.isFinite(value)) {
86
+ return null;
87
+ }
88
+
89
+ var mag = Math.abs(value);
90
+ var thousandsSeparator = (options && options.thousandsSeparator) || '';
91
+ var unitSeparator = (options && options.unitSeparator) || '';
92
+ var decimalPlaces = (options && options.decimalPlaces !== undefined) ? options.decimalPlaces : 2;
93
+ var fixedDecimals = Boolean(options && options.fixedDecimals);
94
+ var unit = (options && options.unit) || '';
95
+
96
+ if (!unit || !map[unit.toLowerCase()]) {
97
+ if (mag >= map.pb) {
98
+ unit = 'PB';
99
+ } else if (mag >= map.tb) {
100
+ unit = 'TB';
101
+ } else if (mag >= map.gb) {
102
+ unit = 'GB';
103
+ } else if (mag >= map.mb) {
104
+ unit = 'MB';
105
+ } else if (mag >= map.kb) {
106
+ unit = 'KB';
107
+ } else {
108
+ unit = 'B';
109
+ }
110
+ }
111
+
112
+ var val = value / map[unit.toLowerCase()];
113
+ var str = val.toFixed(decimalPlaces);
114
+
115
+ if (!fixedDecimals) {
116
+ str = str.replace(formatDecimalsRegExp, '$1');
117
+ }
118
+
119
+ if (thousandsSeparator) {
120
+ str = str.split('.').map(function (s, i) {
121
+ return i === 0
122
+ ? s.replace(formatThousandsRegExp, thousandsSeparator)
123
+ : s
124
+ }).join('.');
125
+ }
126
+
127
+ return str + unitSeparator + unit;
128
+ }
129
+
130
+ /**
131
+ * Parse the string value into an integer in bytes.
132
+ *
133
+ * If no unit is given, it is assumed the value is in bytes.
134
+ *
135
+ * @param {number|string} val
136
+ *
137
+ * @returns {number|null}
138
+ * @public
139
+ */
140
+
141
+ function parse(val) {
142
+ if (typeof val === 'number' && !isNaN(val)) {
143
+ return val;
144
+ }
145
+
146
+ if (typeof val !== 'string') {
147
+ return null;
148
+ }
149
+
150
+ // Test if the string passed is valid
151
+ var results = parseRegExp.exec(val);
152
+ var floatValue;
153
+ var unit = 'b';
154
+
155
+ if (!results) {
156
+ // Nothing could be extracted from the given string
157
+ floatValue = parseInt(val, 10);
158
+ unit = 'b'
159
+ } else {
160
+ // Retrieve the value and the unit
161
+ floatValue = parseFloat(results[1]);
162
+ unit = results[4].toLowerCase();
163
+ }
164
+
165
+ if (isNaN(floatValue)) {
166
+ return null;
167
+ }
168
+
169
+ return Math.floor(map[unit] * floatValue);
170
+ }
sandbox/node_modules/bytes/package.json ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "bytes",
3
+ "description": "Utility to parse a string bytes to bytes and vice-versa",
4
+ "version": "3.1.2",
5
+ "author": "TJ Holowaychuk <tj@vision-media.ca> (http://tjholowaychuk.com)",
6
+ "contributors": [
7
+ "Jed Watson <jed.watson@me.com>",
8
+ "Théo FIDRY <theo.fidry@gmail.com>"
9
+ ],
10
+ "license": "MIT",
11
+ "keywords": [
12
+ "byte",
13
+ "bytes",
14
+ "utility",
15
+ "parse",
16
+ "parser",
17
+ "convert",
18
+ "converter"
19
+ ],
20
+ "repository": "visionmedia/bytes.js",
21
+ "devDependencies": {
22
+ "eslint": "7.32.0",
23
+ "eslint-plugin-markdown": "2.2.1",
24
+ "mocha": "9.2.0",
25
+ "nyc": "15.1.0"
26
+ },
27
+ "files": [
28
+ "History.md",
29
+ "LICENSE",
30
+ "Readme.md",
31
+ "index.js"
32
+ ],
33
+ "engines": {
34
+ "node": ">= 0.8"
35
+ },
36
+ "scripts": {
37
+ "lint": "eslint .",
38
+ "test": "mocha --check-leaks --reporter spec",
39
+ "test-ci": "nyc --reporter=lcov --reporter=text npm test",
40
+ "test-cov": "nyc --reporter=html --reporter=text npm test"
41
+ }
42
+ }
sandbox/node_modules/call-bind-apply-helpers/.eslintrc ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "root": true,
3
+
4
+ "extends": "@ljharb",
5
+
6
+ "rules": {
7
+ "func-name-matching": 0,
8
+ "id-length": 0,
9
+ "new-cap": [2, {
10
+ "capIsNewExceptions": [
11
+ "GetIntrinsic",
12
+ ],
13
+ }],
14
+ "no-extra-parens": 0,
15
+ "no-magic-numbers": 0,
16
+ },
17
+ }
sandbox/node_modules/call-bind-apply-helpers/.github/FUNDING.yml ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # These are supported funding model platforms
2
+
3
+ github: [ljharb]
4
+ patreon: # Replace with a single Patreon username
5
+ open_collective: # Replace with a single Open Collective username
6
+ ko_fi: # Replace with a single Ko-fi username
7
+ tidelift: npm/call-bind-apply-helpers
8
+ community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9
+ liberapay: # Replace with a single Liberapay username
10
+ issuehunt: # Replace with a single IssueHunt username
11
+ otechie: # Replace with a single Otechie username
12
+ custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
sandbox/node_modules/call-bind-apply-helpers/.nycrc ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "all": true,
3
+ "check-coverage": false,
4
+ "reporter": ["text-summary", "text", "html", "json"],
5
+ "exclude": [
6
+ "coverage",
7
+ "test"
8
+ ]
9
+ }
sandbox/node_modules/call-bind-apply-helpers/CHANGELOG.md ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [v1.0.2](https://github.com/ljharb/call-bind-apply-helpers/compare/v1.0.1...v1.0.2) - 2025-02-12
9
+
10
+ ### Commits
11
+
12
+ - [types] improve inferred types [`e6f9586`](https://github.com/ljharb/call-bind-apply-helpers/commit/e6f95860a3c72879cb861a858cdfb8138fbedec1)
13
+ - [Dev Deps] update `@arethetypeswrong/cli`, `@ljharb/tsconfig`, `@types/tape`, `es-value-fixtures`, `for-each`, `has-strict-mode`, `object-inspect` [`e43d540`](https://github.com/ljharb/call-bind-apply-helpers/commit/e43d5409f97543bfbb11f345d47d8ce4e066d8c1)
14
+
15
+ ## [v1.0.1](https://github.com/ljharb/call-bind-apply-helpers/compare/v1.0.0...v1.0.1) - 2024-12-08
16
+
17
+ ### Commits
18
+
19
+ - [types] `reflectApply`: fix types [`4efc396`](https://github.com/ljharb/call-bind-apply-helpers/commit/4efc3965351a4f02cc55e836fa391d3d11ef2ef8)
20
+ - [Fix] `reflectApply`: oops, Reflect is not a function [`83cc739`](https://github.com/ljharb/call-bind-apply-helpers/commit/83cc7395de6b79b7730bdf092f1436f0b1263c75)
21
+ - [Dev Deps] update `@arethetypeswrong/cli` [`80bd5d3`](https://github.com/ljharb/call-bind-apply-helpers/commit/80bd5d3ae58b4f6b6995ce439dd5a1bcb178a940)
22
+
23
+ ## v1.0.0 - 2024-12-05
24
+
25
+ ### Commits
26
+
27
+ - Initial implementation, tests, readme [`7879629`](https://github.com/ljharb/call-bind-apply-helpers/commit/78796290f9b7430c9934d6f33d94ae9bc89fce04)
28
+ - Initial commit [`3f1dc16`](https://github.com/ljharb/call-bind-apply-helpers/commit/3f1dc164afc43285631b114a5f9dd9137b2b952f)
29
+ - npm init [`081df04`](https://github.com/ljharb/call-bind-apply-helpers/commit/081df048c312fcee400922026f6e97281200a603)
30
+ - Only apps should have lockfiles [`5b9ca0f`](https://github.com/ljharb/call-bind-apply-helpers/commit/5b9ca0fe8101ebfaf309c549caac4e0a017ed930)
sandbox/node_modules/call-bind-apply-helpers/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Jordan Harband
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
sandbox/node_modules/call-bind-apply-helpers/README.md ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # call-bind-apply-helpers <sup>[![Version Badge][npm-version-svg]][package-url]</sup>
2
+
3
+ [![github actions][actions-image]][actions-url]
4
+ [![coverage][codecov-image]][codecov-url]
5
+ [![dependency status][deps-svg]][deps-url]
6
+ [![dev dependency status][dev-deps-svg]][dev-deps-url]
7
+ [![License][license-image]][license-url]
8
+ [![Downloads][downloads-image]][downloads-url]
9
+
10
+ [![npm badge][npm-badge-png]][package-url]
11
+
12
+ Helper functions around Function call/apply/bind, for use in `call-bind`.
13
+
14
+ The only packages that should likely ever use this package directly are `call-bind` and `get-intrinsic`.
15
+ Please use `call-bind` unless you have a very good reason not to.
16
+
17
+ ## Getting started
18
+
19
+ ```sh
20
+ npm install --save call-bind-apply-helpers
21
+ ```
22
+
23
+ ## Usage/Examples
24
+
25
+ ```js
26
+ const assert = require('assert');
27
+ const callBindBasic = require('call-bind-apply-helpers');
28
+
29
+ function f(a, b) {
30
+ assert.equal(this, 1);
31
+ assert.equal(a, 2);
32
+ assert.equal(b, 3);
33
+ assert.equal(arguments.length, 2);
34
+ }
35
+
36
+ const fBound = callBindBasic([f, 1]);
37
+
38
+ delete Function.prototype.call;
39
+ delete Function.prototype.bind;
40
+
41
+ fBound(2, 3);
42
+ ```
43
+
44
+ ## Tests
45
+
46
+ Clone the repo, `npm install`, and run `npm test`
47
+
48
+ [package-url]: https://npmjs.org/package/call-bind-apply-helpers
49
+ [npm-version-svg]: https://versionbadg.es/ljharb/call-bind-apply-helpers.svg
50
+ [deps-svg]: https://david-dm.org/ljharb/call-bind-apply-helpers.svg
51
+ [deps-url]: https://david-dm.org/ljharb/call-bind-apply-helpers
52
+ [dev-deps-svg]: https://david-dm.org/ljharb/call-bind-apply-helpers/dev-status.svg
53
+ [dev-deps-url]: https://david-dm.org/ljharb/call-bind-apply-helpers#info=devDependencies
54
+ [npm-badge-png]: https://nodei.co/npm/call-bind-apply-helpers.png?downloads=true&stars=true
55
+ [license-image]: https://img.shields.io/npm/l/call-bind-apply-helpers.svg
56
+ [license-url]: LICENSE
57
+ [downloads-image]: https://img.shields.io/npm/dm/call-bind-apply-helpers.svg
58
+ [downloads-url]: https://npm-stat.com/charts.html?package=call-bind-apply-helpers
59
+ [codecov-image]: https://codecov.io/gh/ljharb/call-bind-apply-helpers/branch/main/graphs/badge.svg
60
+ [codecov-url]: https://app.codecov.io/gh/ljharb/call-bind-apply-helpers/
61
+ [actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/call-bind-apply-helpers
62
+ [actions-url]: https://github.com/ljharb/call-bind-apply-helpers/actions
sandbox/node_modules/call-bind-apply-helpers/actualApply.d.ts ADDED
@@ -0,0 +1 @@
 
 
1
+ export = Reflect.apply;
sandbox/node_modules/call-bind-apply-helpers/actualApply.js ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use strict';
2
+
3
+ var bind = require('function-bind');
4
+
5
+ var $apply = require('./functionApply');
6
+ var $call = require('./functionCall');
7
+ var $reflectApply = require('./reflectApply');
8
+
9
+ /** @type {import('./actualApply')} */
10
+ module.exports = $reflectApply || bind.call($call, $apply);
sandbox/node_modules/call-bind-apply-helpers/applyBind.d.ts ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import actualApply from './actualApply';
2
+
3
+ type TupleSplitHead<T extends any[], N extends number> = T['length'] extends N
4
+ ? T
5
+ : T extends [...infer R, any]
6
+ ? TupleSplitHead<R, N>
7
+ : never
8
+
9
+ type TupleSplitTail<T, N extends number, O extends any[] = []> = O['length'] extends N
10
+ ? T
11
+ : T extends [infer F, ...infer R]
12
+ ? TupleSplitTail<[...R], N, [...O, F]>
13
+ : never
14
+
15
+ type TupleSplit<T extends any[], N extends number> = [TupleSplitHead<T, N>, TupleSplitTail<T, N>]
16
+
17
+ declare function applyBind(...args: TupleSplit<Parameters<typeof actualApply>, 2>[1]): ReturnType<typeof actualApply>;
18
+
19
+ export = applyBind;
sandbox/node_modules/call-bind-apply-helpers/applyBind.js ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use strict';
2
+
3
+ var bind = require('function-bind');
4
+ var $apply = require('./functionApply');
5
+ var actualApply = require('./actualApply');
6
+
7
+ /** @type {import('./applyBind')} */
8
+ module.exports = function applyBind() {
9
+ return actualApply(bind, $apply, arguments);
10
+ };
sandbox/node_modules/call-bind-apply-helpers/functionApply.d.ts ADDED
@@ -0,0 +1 @@
 
 
1
+ export = Function.prototype.apply;
sandbox/node_modules/call-bind-apply-helpers/functionApply.js ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ 'use strict';
2
+
3
+ /** @type {import('./functionApply')} */
4
+ module.exports = Function.prototype.apply;