Eric Gardner commited on
Commit
cdc50ff
·
1 Parent(s): 36f22b0

Initial deployment

Browse files
.gitignore ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ node_modules/
2
+ cache/
3
+ .env
4
+
Dockerfile ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM node:20-slim
2
+
3
+ WORKDIR /app
4
+
5
+ # Copy package files
6
+ COPY package*.json ./
7
+
8
+ # Install dependencies
9
+ RUN npm install --production
10
+
11
+ # Copy application code
12
+ COPY . .
13
+
14
+ # Create cache directory with proper permissions
15
+ RUN mkdir -p /app/cache && chmod 777 /app/cache
16
+
17
+ # Hugging Face Spaces uses port 7860
18
+ ENV PORT=7860
19
+
20
+ # Expose the port
21
+ EXPOSE 7860
22
+
23
+ # Start the server
24
+ CMD ["node", "index.js"]
README.md CHANGED
@@ -1,11 +1,26 @@
1
  ---
2
- title: Question Explorer Api
3
- emoji: 🦀
4
- colorFrom: green
5
- colorTo: pink
6
  sdk: docker
7
  pinned: false
8
- short_description: API for Wikipedia "question explorer" prototype
9
  ---
10
 
11
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: Wikipedia Question Explorer API
3
+ emoji: 📚
4
+ colorFrom: blue
5
+ colorTo: purple
6
  sdk: docker
7
  pinned: false
 
8
  ---
9
 
10
+ # Wikipedia Question Explorer API
11
+
12
+ Backend API for semantic search over Wikipedia articles using local embeddings.
13
+
14
+ ## Endpoints
15
+
16
+ - `GET /api/article/:title` - Fetch and process an article
17
+ - `GET /api/article/:title/status` - Check processing status
18
+ - `POST /api/article/:title/query` - Query an article with a question
19
+ - `GET /api/search?q=query` - Search Wikipedia articles
20
+ - `GET /api/health` - Health check
21
+
22
+ ## Technology
23
+
24
+ - Express.js server
25
+ - Xenova/transformers.js for local embeddings (all-MiniLM-L6-v2)
26
+ - Cosine similarity vector search
index.js ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import express from 'express';
2
+ import cors from 'cors';
3
+ import articleRoutes from './routes/article.js';
4
+ import searchRoutes from './routes/search.js';
5
+ import { initEmbedder } from './services/embedder.js';
6
+
7
+ const app = express();
8
+ const PORT = process.env.PORT || 3000;
9
+
10
+ app.use( cors() );
11
+ app.use( express.json() );
12
+
13
+ // Routes
14
+ app.use( '/api/article', articleRoutes );
15
+ app.use( '/api/search', searchRoutes );
16
+
17
+ // Health check
18
+ app.get( '/api/health', ( _, res ) => {
19
+ res.json( { status: 'ok' } );
20
+ } );
21
+
22
+ // Pre-warm the embedding model on startup
23
+ console.log( 'Starting server and loading embedding model...' );
24
+ initEmbedder().then( () => {
25
+ app.listen( PORT, () => {
26
+ console.log( `Server running on http://localhost:${ PORT }` );
27
+ } );
28
+ } ).catch( ( err ) => {
29
+ console.error( 'Failed to initialize embedder:', err );
30
+ process.exit( 1 );
31
+ } );
package-lock.json ADDED
@@ -0,0 +1,2315 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "question-explorer-server",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "question-explorer-server",
9
+ "version": "1.0.0",
10
+ "dependencies": {
11
+ "@xenova/transformers": "^2.17.2",
12
+ "cors": "^2.8.5",
13
+ "express": "^4.18.2",
14
+ "jsdom": "^24.1.0"
15
+ }
16
+ },
17
+ "node_modules/@asamuzakjp/css-color": {
18
+ "version": "3.2.0",
19
+ "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz",
20
+ "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==",
21
+ "license": "MIT",
22
+ "dependencies": {
23
+ "@csstools/css-calc": "^2.1.3",
24
+ "@csstools/css-color-parser": "^3.0.9",
25
+ "@csstools/css-parser-algorithms": "^3.0.4",
26
+ "@csstools/css-tokenizer": "^3.0.3",
27
+ "lru-cache": "^10.4.3"
28
+ }
29
+ },
30
+ "node_modules/@csstools/color-helpers": {
31
+ "version": "5.1.0",
32
+ "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz",
33
+ "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==",
34
+ "funding": [
35
+ {
36
+ "type": "github",
37
+ "url": "https://github.com/sponsors/csstools"
38
+ },
39
+ {
40
+ "type": "opencollective",
41
+ "url": "https://opencollective.com/csstools"
42
+ }
43
+ ],
44
+ "license": "MIT-0",
45
+ "engines": {
46
+ "node": ">=18"
47
+ }
48
+ },
49
+ "node_modules/@csstools/css-calc": {
50
+ "version": "2.1.4",
51
+ "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz",
52
+ "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==",
53
+ "funding": [
54
+ {
55
+ "type": "github",
56
+ "url": "https://github.com/sponsors/csstools"
57
+ },
58
+ {
59
+ "type": "opencollective",
60
+ "url": "https://opencollective.com/csstools"
61
+ }
62
+ ],
63
+ "license": "MIT",
64
+ "engines": {
65
+ "node": ">=18"
66
+ },
67
+ "peerDependencies": {
68
+ "@csstools/css-parser-algorithms": "^3.0.5",
69
+ "@csstools/css-tokenizer": "^3.0.4"
70
+ }
71
+ },
72
+ "node_modules/@csstools/css-color-parser": {
73
+ "version": "3.1.0",
74
+ "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz",
75
+ "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==",
76
+ "funding": [
77
+ {
78
+ "type": "github",
79
+ "url": "https://github.com/sponsors/csstools"
80
+ },
81
+ {
82
+ "type": "opencollective",
83
+ "url": "https://opencollective.com/csstools"
84
+ }
85
+ ],
86
+ "license": "MIT",
87
+ "dependencies": {
88
+ "@csstools/color-helpers": "^5.1.0",
89
+ "@csstools/css-calc": "^2.1.4"
90
+ },
91
+ "engines": {
92
+ "node": ">=18"
93
+ },
94
+ "peerDependencies": {
95
+ "@csstools/css-parser-algorithms": "^3.0.5",
96
+ "@csstools/css-tokenizer": "^3.0.4"
97
+ }
98
+ },
99
+ "node_modules/@csstools/css-parser-algorithms": {
100
+ "version": "3.0.5",
101
+ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz",
102
+ "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==",
103
+ "funding": [
104
+ {
105
+ "type": "github",
106
+ "url": "https://github.com/sponsors/csstools"
107
+ },
108
+ {
109
+ "type": "opencollective",
110
+ "url": "https://opencollective.com/csstools"
111
+ }
112
+ ],
113
+ "license": "MIT",
114
+ "engines": {
115
+ "node": ">=18"
116
+ },
117
+ "peerDependencies": {
118
+ "@csstools/css-tokenizer": "^3.0.4"
119
+ }
120
+ },
121
+ "node_modules/@csstools/css-tokenizer": {
122
+ "version": "3.0.4",
123
+ "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz",
124
+ "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==",
125
+ "funding": [
126
+ {
127
+ "type": "github",
128
+ "url": "https://github.com/sponsors/csstools"
129
+ },
130
+ {
131
+ "type": "opencollective",
132
+ "url": "https://opencollective.com/csstools"
133
+ }
134
+ ],
135
+ "license": "MIT",
136
+ "engines": {
137
+ "node": ">=18"
138
+ }
139
+ },
140
+ "node_modules/@huggingface/jinja": {
141
+ "version": "0.2.2",
142
+ "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.2.2.tgz",
143
+ "integrity": "sha512-/KPde26khDUIPkTGU82jdtTW9UAuvUTumCAbFs/7giR0SxsvZC4hru51PBvpijH6BVkHcROcvZM/lpy5h1jRRA==",
144
+ "license": "MIT",
145
+ "engines": {
146
+ "node": ">=18"
147
+ }
148
+ },
149
+ "node_modules/@protobufjs/aspromise": {
150
+ "version": "1.1.2",
151
+ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
152
+ "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==",
153
+ "license": "BSD-3-Clause"
154
+ },
155
+ "node_modules/@protobufjs/base64": {
156
+ "version": "1.1.2",
157
+ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
158
+ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
159
+ "license": "BSD-3-Clause"
160
+ },
161
+ "node_modules/@protobufjs/codegen": {
162
+ "version": "2.0.4",
163
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
164
+ "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
165
+ "license": "BSD-3-Clause"
166
+ },
167
+ "node_modules/@protobufjs/eventemitter": {
168
+ "version": "1.1.0",
169
+ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
170
+ "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==",
171
+ "license": "BSD-3-Clause"
172
+ },
173
+ "node_modules/@protobufjs/fetch": {
174
+ "version": "1.1.0",
175
+ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
176
+ "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
177
+ "license": "BSD-3-Clause",
178
+ "dependencies": {
179
+ "@protobufjs/aspromise": "^1.1.1",
180
+ "@protobufjs/inquire": "^1.1.0"
181
+ }
182
+ },
183
+ "node_modules/@protobufjs/float": {
184
+ "version": "1.0.2",
185
+ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
186
+ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
187
+ "license": "BSD-3-Clause"
188
+ },
189
+ "node_modules/@protobufjs/inquire": {
190
+ "version": "1.1.0",
191
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
192
+ "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==",
193
+ "license": "BSD-3-Clause"
194
+ },
195
+ "node_modules/@protobufjs/path": {
196
+ "version": "1.1.2",
197
+ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
198
+ "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
199
+ "license": "BSD-3-Clause"
200
+ },
201
+ "node_modules/@protobufjs/pool": {
202
+ "version": "1.1.0",
203
+ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
204
+ "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
205
+ "license": "BSD-3-Clause"
206
+ },
207
+ "node_modules/@protobufjs/utf8": {
208
+ "version": "1.1.0",
209
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
210
+ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
211
+ "license": "BSD-3-Clause"
212
+ },
213
+ "node_modules/@types/long": {
214
+ "version": "4.0.2",
215
+ "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
216
+ "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==",
217
+ "license": "MIT"
218
+ },
219
+ "node_modules/@types/node": {
220
+ "version": "25.0.3",
221
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz",
222
+ "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==",
223
+ "license": "MIT",
224
+ "dependencies": {
225
+ "undici-types": "~7.16.0"
226
+ }
227
+ },
228
+ "node_modules/@xenova/transformers": {
229
+ "version": "2.17.2",
230
+ "resolved": "https://registry.npmjs.org/@xenova/transformers/-/transformers-2.17.2.tgz",
231
+ "integrity": "sha512-lZmHqzrVIkSvZdKZEx7IYY51TK0WDrC8eR0c5IMnBsO8di8are1zzw8BlLhyO2TklZKLN5UffNGs1IJwT6oOqQ==",
232
+ "license": "Apache-2.0",
233
+ "dependencies": {
234
+ "@huggingface/jinja": "^0.2.2",
235
+ "onnxruntime-web": "1.14.0",
236
+ "sharp": "^0.32.0"
237
+ },
238
+ "optionalDependencies": {
239
+ "onnxruntime-node": "1.14.0"
240
+ }
241
+ },
242
+ "node_modules/accepts": {
243
+ "version": "1.3.8",
244
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
245
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
246
+ "license": "MIT",
247
+ "dependencies": {
248
+ "mime-types": "~2.1.34",
249
+ "negotiator": "0.6.3"
250
+ },
251
+ "engines": {
252
+ "node": ">= 0.6"
253
+ }
254
+ },
255
+ "node_modules/agent-base": {
256
+ "version": "7.1.4",
257
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
258
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
259
+ "license": "MIT",
260
+ "engines": {
261
+ "node": ">= 14"
262
+ }
263
+ },
264
+ "node_modules/array-flatten": {
265
+ "version": "1.1.1",
266
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
267
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
268
+ "license": "MIT"
269
+ },
270
+ "node_modules/asynckit": {
271
+ "version": "0.4.0",
272
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
273
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
274
+ "license": "MIT"
275
+ },
276
+ "node_modules/b4a": {
277
+ "version": "1.7.3",
278
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz",
279
+ "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==",
280
+ "license": "Apache-2.0",
281
+ "peerDependencies": {
282
+ "react-native-b4a": "*"
283
+ },
284
+ "peerDependenciesMeta": {
285
+ "react-native-b4a": {
286
+ "optional": true
287
+ }
288
+ }
289
+ },
290
+ "node_modules/bare-events": {
291
+ "version": "2.8.2",
292
+ "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz",
293
+ "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==",
294
+ "license": "Apache-2.0",
295
+ "peerDependencies": {
296
+ "bare-abort-controller": "*"
297
+ },
298
+ "peerDependenciesMeta": {
299
+ "bare-abort-controller": {
300
+ "optional": true
301
+ }
302
+ }
303
+ },
304
+ "node_modules/bare-fs": {
305
+ "version": "4.5.2",
306
+ "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.2.tgz",
307
+ "integrity": "sha512-veTnRzkb6aPHOvSKIOy60KzURfBdUflr5VReI+NSaPL6xf+XLdONQgZgpYvUuZLVQ8dCqxpBAudaOM1+KpAUxw==",
308
+ "license": "Apache-2.0",
309
+ "optional": true,
310
+ "dependencies": {
311
+ "bare-events": "^2.5.4",
312
+ "bare-path": "^3.0.0",
313
+ "bare-stream": "^2.6.4",
314
+ "bare-url": "^2.2.2",
315
+ "fast-fifo": "^1.3.2"
316
+ },
317
+ "engines": {
318
+ "bare": ">=1.16.0"
319
+ },
320
+ "peerDependencies": {
321
+ "bare-buffer": "*"
322
+ },
323
+ "peerDependenciesMeta": {
324
+ "bare-buffer": {
325
+ "optional": true
326
+ }
327
+ }
328
+ },
329
+ "node_modules/bare-os": {
330
+ "version": "3.6.2",
331
+ "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz",
332
+ "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==",
333
+ "license": "Apache-2.0",
334
+ "optional": true,
335
+ "engines": {
336
+ "bare": ">=1.14.0"
337
+ }
338
+ },
339
+ "node_modules/bare-path": {
340
+ "version": "3.0.0",
341
+ "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
342
+ "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
343
+ "license": "Apache-2.0",
344
+ "optional": true,
345
+ "dependencies": {
346
+ "bare-os": "^3.0.1"
347
+ }
348
+ },
349
+ "node_modules/bare-stream": {
350
+ "version": "2.7.0",
351
+ "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz",
352
+ "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==",
353
+ "license": "Apache-2.0",
354
+ "optional": true,
355
+ "dependencies": {
356
+ "streamx": "^2.21.0"
357
+ },
358
+ "peerDependencies": {
359
+ "bare-buffer": "*",
360
+ "bare-events": "*"
361
+ },
362
+ "peerDependenciesMeta": {
363
+ "bare-buffer": {
364
+ "optional": true
365
+ },
366
+ "bare-events": {
367
+ "optional": true
368
+ }
369
+ }
370
+ },
371
+ "node_modules/bare-url": {
372
+ "version": "2.3.2",
373
+ "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz",
374
+ "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==",
375
+ "license": "Apache-2.0",
376
+ "optional": true,
377
+ "dependencies": {
378
+ "bare-path": "^3.0.0"
379
+ }
380
+ },
381
+ "node_modules/base64-js": {
382
+ "version": "1.5.1",
383
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
384
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
385
+ "funding": [
386
+ {
387
+ "type": "github",
388
+ "url": "https://github.com/sponsors/feross"
389
+ },
390
+ {
391
+ "type": "patreon",
392
+ "url": "https://www.patreon.com/feross"
393
+ },
394
+ {
395
+ "type": "consulting",
396
+ "url": "https://feross.org/support"
397
+ }
398
+ ],
399
+ "license": "MIT"
400
+ },
401
+ "node_modules/bl": {
402
+ "version": "4.1.0",
403
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
404
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
405
+ "license": "MIT",
406
+ "dependencies": {
407
+ "buffer": "^5.5.0",
408
+ "inherits": "^2.0.4",
409
+ "readable-stream": "^3.4.0"
410
+ }
411
+ },
412
+ "node_modules/body-parser": {
413
+ "version": "1.20.4",
414
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz",
415
+ "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==",
416
+ "license": "MIT",
417
+ "dependencies": {
418
+ "bytes": "~3.1.2",
419
+ "content-type": "~1.0.5",
420
+ "debug": "2.6.9",
421
+ "depd": "2.0.0",
422
+ "destroy": "~1.2.0",
423
+ "http-errors": "~2.0.1",
424
+ "iconv-lite": "~0.4.24",
425
+ "on-finished": "~2.4.1",
426
+ "qs": "~6.14.0",
427
+ "raw-body": "~2.5.3",
428
+ "type-is": "~1.6.18",
429
+ "unpipe": "~1.0.0"
430
+ },
431
+ "engines": {
432
+ "node": ">= 0.8",
433
+ "npm": "1.2.8000 || >= 1.4.16"
434
+ }
435
+ },
436
+ "node_modules/buffer": {
437
+ "version": "5.7.1",
438
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
439
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
440
+ "funding": [
441
+ {
442
+ "type": "github",
443
+ "url": "https://github.com/sponsors/feross"
444
+ },
445
+ {
446
+ "type": "patreon",
447
+ "url": "https://www.patreon.com/feross"
448
+ },
449
+ {
450
+ "type": "consulting",
451
+ "url": "https://feross.org/support"
452
+ }
453
+ ],
454
+ "license": "MIT",
455
+ "dependencies": {
456
+ "base64-js": "^1.3.1",
457
+ "ieee754": "^1.1.13"
458
+ }
459
+ },
460
+ "node_modules/bytes": {
461
+ "version": "3.1.2",
462
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
463
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
464
+ "license": "MIT",
465
+ "engines": {
466
+ "node": ">= 0.8"
467
+ }
468
+ },
469
+ "node_modules/call-bind-apply-helpers": {
470
+ "version": "1.0.2",
471
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
472
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
473
+ "license": "MIT",
474
+ "dependencies": {
475
+ "es-errors": "^1.3.0",
476
+ "function-bind": "^1.1.2"
477
+ },
478
+ "engines": {
479
+ "node": ">= 0.4"
480
+ }
481
+ },
482
+ "node_modules/call-bound": {
483
+ "version": "1.0.4",
484
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
485
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
486
+ "license": "MIT",
487
+ "dependencies": {
488
+ "call-bind-apply-helpers": "^1.0.2",
489
+ "get-intrinsic": "^1.3.0"
490
+ },
491
+ "engines": {
492
+ "node": ">= 0.4"
493
+ },
494
+ "funding": {
495
+ "url": "https://github.com/sponsors/ljharb"
496
+ }
497
+ },
498
+ "node_modules/chownr": {
499
+ "version": "1.1.4",
500
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
501
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
502
+ "license": "ISC"
503
+ },
504
+ "node_modules/color": {
505
+ "version": "4.2.3",
506
+ "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
507
+ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
508
+ "license": "MIT",
509
+ "dependencies": {
510
+ "color-convert": "^2.0.1",
511
+ "color-string": "^1.9.0"
512
+ },
513
+ "engines": {
514
+ "node": ">=12.5.0"
515
+ }
516
+ },
517
+ "node_modules/color-convert": {
518
+ "version": "2.0.1",
519
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
520
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
521
+ "license": "MIT",
522
+ "dependencies": {
523
+ "color-name": "~1.1.4"
524
+ },
525
+ "engines": {
526
+ "node": ">=7.0.0"
527
+ }
528
+ },
529
+ "node_modules/color-name": {
530
+ "version": "1.1.4",
531
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
532
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
533
+ "license": "MIT"
534
+ },
535
+ "node_modules/color-string": {
536
+ "version": "1.9.1",
537
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
538
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
539
+ "license": "MIT",
540
+ "dependencies": {
541
+ "color-name": "^1.0.0",
542
+ "simple-swizzle": "^0.2.2"
543
+ }
544
+ },
545
+ "node_modules/combined-stream": {
546
+ "version": "1.0.8",
547
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
548
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
549
+ "license": "MIT",
550
+ "dependencies": {
551
+ "delayed-stream": "~1.0.0"
552
+ },
553
+ "engines": {
554
+ "node": ">= 0.8"
555
+ }
556
+ },
557
+ "node_modules/content-disposition": {
558
+ "version": "0.5.4",
559
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
560
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
561
+ "license": "MIT",
562
+ "dependencies": {
563
+ "safe-buffer": "5.2.1"
564
+ },
565
+ "engines": {
566
+ "node": ">= 0.6"
567
+ }
568
+ },
569
+ "node_modules/content-type": {
570
+ "version": "1.0.5",
571
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
572
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
573
+ "license": "MIT",
574
+ "engines": {
575
+ "node": ">= 0.6"
576
+ }
577
+ },
578
+ "node_modules/cookie": {
579
+ "version": "0.7.2",
580
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
581
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
582
+ "license": "MIT",
583
+ "engines": {
584
+ "node": ">= 0.6"
585
+ }
586
+ },
587
+ "node_modules/cookie-signature": {
588
+ "version": "1.0.7",
589
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz",
590
+ "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==",
591
+ "license": "MIT"
592
+ },
593
+ "node_modules/cors": {
594
+ "version": "2.8.5",
595
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
596
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
597
+ "license": "MIT",
598
+ "dependencies": {
599
+ "object-assign": "^4",
600
+ "vary": "^1"
601
+ },
602
+ "engines": {
603
+ "node": ">= 0.10"
604
+ }
605
+ },
606
+ "node_modules/cssstyle": {
607
+ "version": "4.6.0",
608
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz",
609
+ "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==",
610
+ "license": "MIT",
611
+ "dependencies": {
612
+ "@asamuzakjp/css-color": "^3.2.0",
613
+ "rrweb-cssom": "^0.8.0"
614
+ },
615
+ "engines": {
616
+ "node": ">=18"
617
+ }
618
+ },
619
+ "node_modules/cssstyle/node_modules/rrweb-cssom": {
620
+ "version": "0.8.0",
621
+ "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz",
622
+ "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==",
623
+ "license": "MIT"
624
+ },
625
+ "node_modules/data-urls": {
626
+ "version": "5.0.0",
627
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz",
628
+ "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==",
629
+ "license": "MIT",
630
+ "dependencies": {
631
+ "whatwg-mimetype": "^4.0.0",
632
+ "whatwg-url": "^14.0.0"
633
+ },
634
+ "engines": {
635
+ "node": ">=18"
636
+ }
637
+ },
638
+ "node_modules/debug": {
639
+ "version": "2.6.9",
640
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
641
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
642
+ "license": "MIT",
643
+ "dependencies": {
644
+ "ms": "2.0.0"
645
+ }
646
+ },
647
+ "node_modules/decimal.js": {
648
+ "version": "10.6.0",
649
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
650
+ "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
651
+ "license": "MIT"
652
+ },
653
+ "node_modules/decompress-response": {
654
+ "version": "6.0.0",
655
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
656
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
657
+ "license": "MIT",
658
+ "dependencies": {
659
+ "mimic-response": "^3.1.0"
660
+ },
661
+ "engines": {
662
+ "node": ">=10"
663
+ },
664
+ "funding": {
665
+ "url": "https://github.com/sponsors/sindresorhus"
666
+ }
667
+ },
668
+ "node_modules/deep-extend": {
669
+ "version": "0.6.0",
670
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
671
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
672
+ "license": "MIT",
673
+ "engines": {
674
+ "node": ">=4.0.0"
675
+ }
676
+ },
677
+ "node_modules/delayed-stream": {
678
+ "version": "1.0.0",
679
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
680
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
681
+ "license": "MIT",
682
+ "engines": {
683
+ "node": ">=0.4.0"
684
+ }
685
+ },
686
+ "node_modules/depd": {
687
+ "version": "2.0.0",
688
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
689
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
690
+ "license": "MIT",
691
+ "engines": {
692
+ "node": ">= 0.8"
693
+ }
694
+ },
695
+ "node_modules/destroy": {
696
+ "version": "1.2.0",
697
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
698
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
699
+ "license": "MIT",
700
+ "engines": {
701
+ "node": ">= 0.8",
702
+ "npm": "1.2.8000 || >= 1.4.16"
703
+ }
704
+ },
705
+ "node_modules/detect-libc": {
706
+ "version": "2.1.2",
707
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
708
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
709
+ "license": "Apache-2.0",
710
+ "engines": {
711
+ "node": ">=8"
712
+ }
713
+ },
714
+ "node_modules/dunder-proto": {
715
+ "version": "1.0.1",
716
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
717
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
718
+ "license": "MIT",
719
+ "dependencies": {
720
+ "call-bind-apply-helpers": "^1.0.1",
721
+ "es-errors": "^1.3.0",
722
+ "gopd": "^1.2.0"
723
+ },
724
+ "engines": {
725
+ "node": ">= 0.4"
726
+ }
727
+ },
728
+ "node_modules/ee-first": {
729
+ "version": "1.1.1",
730
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
731
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
732
+ "license": "MIT"
733
+ },
734
+ "node_modules/encodeurl": {
735
+ "version": "2.0.0",
736
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
737
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
738
+ "license": "MIT",
739
+ "engines": {
740
+ "node": ">= 0.8"
741
+ }
742
+ },
743
+ "node_modules/end-of-stream": {
744
+ "version": "1.4.5",
745
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
746
+ "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
747
+ "license": "MIT",
748
+ "dependencies": {
749
+ "once": "^1.4.0"
750
+ }
751
+ },
752
+ "node_modules/entities": {
753
+ "version": "6.0.1",
754
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
755
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
756
+ "license": "BSD-2-Clause",
757
+ "engines": {
758
+ "node": ">=0.12"
759
+ },
760
+ "funding": {
761
+ "url": "https://github.com/fb55/entities?sponsor=1"
762
+ }
763
+ },
764
+ "node_modules/es-define-property": {
765
+ "version": "1.0.1",
766
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
767
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
768
+ "license": "MIT",
769
+ "engines": {
770
+ "node": ">= 0.4"
771
+ }
772
+ },
773
+ "node_modules/es-errors": {
774
+ "version": "1.3.0",
775
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
776
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
777
+ "license": "MIT",
778
+ "engines": {
779
+ "node": ">= 0.4"
780
+ }
781
+ },
782
+ "node_modules/es-object-atoms": {
783
+ "version": "1.1.1",
784
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
785
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
786
+ "license": "MIT",
787
+ "dependencies": {
788
+ "es-errors": "^1.3.0"
789
+ },
790
+ "engines": {
791
+ "node": ">= 0.4"
792
+ }
793
+ },
794
+ "node_modules/es-set-tostringtag": {
795
+ "version": "2.1.0",
796
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
797
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
798
+ "license": "MIT",
799
+ "dependencies": {
800
+ "es-errors": "^1.3.0",
801
+ "get-intrinsic": "^1.2.6",
802
+ "has-tostringtag": "^1.0.2",
803
+ "hasown": "^2.0.2"
804
+ },
805
+ "engines": {
806
+ "node": ">= 0.4"
807
+ }
808
+ },
809
+ "node_modules/escape-html": {
810
+ "version": "1.0.3",
811
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
812
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
813
+ "license": "MIT"
814
+ },
815
+ "node_modules/etag": {
816
+ "version": "1.8.1",
817
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
818
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
819
+ "license": "MIT",
820
+ "engines": {
821
+ "node": ">= 0.6"
822
+ }
823
+ },
824
+ "node_modules/events-universal": {
825
+ "version": "1.0.1",
826
+ "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz",
827
+ "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==",
828
+ "license": "Apache-2.0",
829
+ "dependencies": {
830
+ "bare-events": "^2.7.0"
831
+ }
832
+ },
833
+ "node_modules/expand-template": {
834
+ "version": "2.0.3",
835
+ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
836
+ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
837
+ "license": "(MIT OR WTFPL)",
838
+ "engines": {
839
+ "node": ">=6"
840
+ }
841
+ },
842
+ "node_modules/express": {
843
+ "version": "4.22.1",
844
+ "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz",
845
+ "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==",
846
+ "license": "MIT",
847
+ "dependencies": {
848
+ "accepts": "~1.3.8",
849
+ "array-flatten": "1.1.1",
850
+ "body-parser": "~1.20.3",
851
+ "content-disposition": "~0.5.4",
852
+ "content-type": "~1.0.4",
853
+ "cookie": "~0.7.1",
854
+ "cookie-signature": "~1.0.6",
855
+ "debug": "2.6.9",
856
+ "depd": "2.0.0",
857
+ "encodeurl": "~2.0.0",
858
+ "escape-html": "~1.0.3",
859
+ "etag": "~1.8.1",
860
+ "finalhandler": "~1.3.1",
861
+ "fresh": "~0.5.2",
862
+ "http-errors": "~2.0.0",
863
+ "merge-descriptors": "1.0.3",
864
+ "methods": "~1.1.2",
865
+ "on-finished": "~2.4.1",
866
+ "parseurl": "~1.3.3",
867
+ "path-to-regexp": "~0.1.12",
868
+ "proxy-addr": "~2.0.7",
869
+ "qs": "~6.14.0",
870
+ "range-parser": "~1.2.1",
871
+ "safe-buffer": "5.2.1",
872
+ "send": "~0.19.0",
873
+ "serve-static": "~1.16.2",
874
+ "setprototypeof": "1.2.0",
875
+ "statuses": "~2.0.1",
876
+ "type-is": "~1.6.18",
877
+ "utils-merge": "1.0.1",
878
+ "vary": "~1.1.2"
879
+ },
880
+ "engines": {
881
+ "node": ">= 0.10.0"
882
+ },
883
+ "funding": {
884
+ "type": "opencollective",
885
+ "url": "https://opencollective.com/express"
886
+ }
887
+ },
888
+ "node_modules/fast-fifo": {
889
+ "version": "1.3.2",
890
+ "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
891
+ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
892
+ "license": "MIT"
893
+ },
894
+ "node_modules/finalhandler": {
895
+ "version": "1.3.2",
896
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz",
897
+ "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==",
898
+ "license": "MIT",
899
+ "dependencies": {
900
+ "debug": "2.6.9",
901
+ "encodeurl": "~2.0.0",
902
+ "escape-html": "~1.0.3",
903
+ "on-finished": "~2.4.1",
904
+ "parseurl": "~1.3.3",
905
+ "statuses": "~2.0.2",
906
+ "unpipe": "~1.0.0"
907
+ },
908
+ "engines": {
909
+ "node": ">= 0.8"
910
+ }
911
+ },
912
+ "node_modules/flatbuffers": {
913
+ "version": "1.12.0",
914
+ "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-1.12.0.tgz",
915
+ "integrity": "sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==",
916
+ "license": "SEE LICENSE IN LICENSE.txt"
917
+ },
918
+ "node_modules/form-data": {
919
+ "version": "4.0.5",
920
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
921
+ "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
922
+ "license": "MIT",
923
+ "dependencies": {
924
+ "asynckit": "^0.4.0",
925
+ "combined-stream": "^1.0.8",
926
+ "es-set-tostringtag": "^2.1.0",
927
+ "hasown": "^2.0.2",
928
+ "mime-types": "^2.1.12"
929
+ },
930
+ "engines": {
931
+ "node": ">= 6"
932
+ }
933
+ },
934
+ "node_modules/forwarded": {
935
+ "version": "0.2.0",
936
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
937
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
938
+ "license": "MIT",
939
+ "engines": {
940
+ "node": ">= 0.6"
941
+ }
942
+ },
943
+ "node_modules/fresh": {
944
+ "version": "0.5.2",
945
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
946
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
947
+ "license": "MIT",
948
+ "engines": {
949
+ "node": ">= 0.6"
950
+ }
951
+ },
952
+ "node_modules/fs-constants": {
953
+ "version": "1.0.0",
954
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
955
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
956
+ "license": "MIT"
957
+ },
958
+ "node_modules/function-bind": {
959
+ "version": "1.1.2",
960
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
961
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
962
+ "license": "MIT",
963
+ "funding": {
964
+ "url": "https://github.com/sponsors/ljharb"
965
+ }
966
+ },
967
+ "node_modules/get-intrinsic": {
968
+ "version": "1.3.0",
969
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
970
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
971
+ "license": "MIT",
972
+ "dependencies": {
973
+ "call-bind-apply-helpers": "^1.0.2",
974
+ "es-define-property": "^1.0.1",
975
+ "es-errors": "^1.3.0",
976
+ "es-object-atoms": "^1.1.1",
977
+ "function-bind": "^1.1.2",
978
+ "get-proto": "^1.0.1",
979
+ "gopd": "^1.2.0",
980
+ "has-symbols": "^1.1.0",
981
+ "hasown": "^2.0.2",
982
+ "math-intrinsics": "^1.1.0"
983
+ },
984
+ "engines": {
985
+ "node": ">= 0.4"
986
+ },
987
+ "funding": {
988
+ "url": "https://github.com/sponsors/ljharb"
989
+ }
990
+ },
991
+ "node_modules/get-proto": {
992
+ "version": "1.0.1",
993
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
994
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
995
+ "license": "MIT",
996
+ "dependencies": {
997
+ "dunder-proto": "^1.0.1",
998
+ "es-object-atoms": "^1.0.0"
999
+ },
1000
+ "engines": {
1001
+ "node": ">= 0.4"
1002
+ }
1003
+ },
1004
+ "node_modules/github-from-package": {
1005
+ "version": "0.0.0",
1006
+ "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
1007
+ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
1008
+ "license": "MIT"
1009
+ },
1010
+ "node_modules/gopd": {
1011
+ "version": "1.2.0",
1012
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
1013
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
1014
+ "license": "MIT",
1015
+ "engines": {
1016
+ "node": ">= 0.4"
1017
+ },
1018
+ "funding": {
1019
+ "url": "https://github.com/sponsors/ljharb"
1020
+ }
1021
+ },
1022
+ "node_modules/guid-typescript": {
1023
+ "version": "1.0.9",
1024
+ "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz",
1025
+ "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==",
1026
+ "license": "ISC"
1027
+ },
1028
+ "node_modules/has-symbols": {
1029
+ "version": "1.1.0",
1030
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
1031
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
1032
+ "license": "MIT",
1033
+ "engines": {
1034
+ "node": ">= 0.4"
1035
+ },
1036
+ "funding": {
1037
+ "url": "https://github.com/sponsors/ljharb"
1038
+ }
1039
+ },
1040
+ "node_modules/has-tostringtag": {
1041
+ "version": "1.0.2",
1042
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
1043
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
1044
+ "license": "MIT",
1045
+ "dependencies": {
1046
+ "has-symbols": "^1.0.3"
1047
+ },
1048
+ "engines": {
1049
+ "node": ">= 0.4"
1050
+ },
1051
+ "funding": {
1052
+ "url": "https://github.com/sponsors/ljharb"
1053
+ }
1054
+ },
1055
+ "node_modules/hasown": {
1056
+ "version": "2.0.2",
1057
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
1058
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
1059
+ "license": "MIT",
1060
+ "dependencies": {
1061
+ "function-bind": "^1.1.2"
1062
+ },
1063
+ "engines": {
1064
+ "node": ">= 0.4"
1065
+ }
1066
+ },
1067
+ "node_modules/html-encoding-sniffer": {
1068
+ "version": "4.0.0",
1069
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
1070
+ "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==",
1071
+ "license": "MIT",
1072
+ "dependencies": {
1073
+ "whatwg-encoding": "^3.1.1"
1074
+ },
1075
+ "engines": {
1076
+ "node": ">=18"
1077
+ }
1078
+ },
1079
+ "node_modules/http-errors": {
1080
+ "version": "2.0.1",
1081
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
1082
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
1083
+ "license": "MIT",
1084
+ "dependencies": {
1085
+ "depd": "~2.0.0",
1086
+ "inherits": "~2.0.4",
1087
+ "setprototypeof": "~1.2.0",
1088
+ "statuses": "~2.0.2",
1089
+ "toidentifier": "~1.0.1"
1090
+ },
1091
+ "engines": {
1092
+ "node": ">= 0.8"
1093
+ },
1094
+ "funding": {
1095
+ "type": "opencollective",
1096
+ "url": "https://opencollective.com/express"
1097
+ }
1098
+ },
1099
+ "node_modules/http-proxy-agent": {
1100
+ "version": "7.0.2",
1101
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
1102
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
1103
+ "license": "MIT",
1104
+ "dependencies": {
1105
+ "agent-base": "^7.1.0",
1106
+ "debug": "^4.3.4"
1107
+ },
1108
+ "engines": {
1109
+ "node": ">= 14"
1110
+ }
1111
+ },
1112
+ "node_modules/http-proxy-agent/node_modules/debug": {
1113
+ "version": "4.4.3",
1114
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
1115
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
1116
+ "license": "MIT",
1117
+ "dependencies": {
1118
+ "ms": "^2.1.3"
1119
+ },
1120
+ "engines": {
1121
+ "node": ">=6.0"
1122
+ },
1123
+ "peerDependenciesMeta": {
1124
+ "supports-color": {
1125
+ "optional": true
1126
+ }
1127
+ }
1128
+ },
1129
+ "node_modules/http-proxy-agent/node_modules/ms": {
1130
+ "version": "2.1.3",
1131
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1132
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1133
+ "license": "MIT"
1134
+ },
1135
+ "node_modules/https-proxy-agent": {
1136
+ "version": "7.0.6",
1137
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
1138
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
1139
+ "license": "MIT",
1140
+ "dependencies": {
1141
+ "agent-base": "^7.1.2",
1142
+ "debug": "4"
1143
+ },
1144
+ "engines": {
1145
+ "node": ">= 14"
1146
+ }
1147
+ },
1148
+ "node_modules/https-proxy-agent/node_modules/debug": {
1149
+ "version": "4.4.3",
1150
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
1151
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
1152
+ "license": "MIT",
1153
+ "dependencies": {
1154
+ "ms": "^2.1.3"
1155
+ },
1156
+ "engines": {
1157
+ "node": ">=6.0"
1158
+ },
1159
+ "peerDependenciesMeta": {
1160
+ "supports-color": {
1161
+ "optional": true
1162
+ }
1163
+ }
1164
+ },
1165
+ "node_modules/https-proxy-agent/node_modules/ms": {
1166
+ "version": "2.1.3",
1167
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1168
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1169
+ "license": "MIT"
1170
+ },
1171
+ "node_modules/iconv-lite": {
1172
+ "version": "0.4.24",
1173
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1174
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1175
+ "license": "MIT",
1176
+ "dependencies": {
1177
+ "safer-buffer": ">= 2.1.2 < 3"
1178
+ },
1179
+ "engines": {
1180
+ "node": ">=0.10.0"
1181
+ }
1182
+ },
1183
+ "node_modules/ieee754": {
1184
+ "version": "1.2.1",
1185
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
1186
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
1187
+ "funding": [
1188
+ {
1189
+ "type": "github",
1190
+ "url": "https://github.com/sponsors/feross"
1191
+ },
1192
+ {
1193
+ "type": "patreon",
1194
+ "url": "https://www.patreon.com/feross"
1195
+ },
1196
+ {
1197
+ "type": "consulting",
1198
+ "url": "https://feross.org/support"
1199
+ }
1200
+ ],
1201
+ "license": "BSD-3-Clause"
1202
+ },
1203
+ "node_modules/inherits": {
1204
+ "version": "2.0.4",
1205
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1206
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1207
+ "license": "ISC"
1208
+ },
1209
+ "node_modules/ini": {
1210
+ "version": "1.3.8",
1211
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
1212
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
1213
+ "license": "ISC"
1214
+ },
1215
+ "node_modules/ipaddr.js": {
1216
+ "version": "1.9.1",
1217
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
1218
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
1219
+ "license": "MIT",
1220
+ "engines": {
1221
+ "node": ">= 0.10"
1222
+ }
1223
+ },
1224
+ "node_modules/is-arrayish": {
1225
+ "version": "0.3.4",
1226
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz",
1227
+ "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==",
1228
+ "license": "MIT"
1229
+ },
1230
+ "node_modules/is-potential-custom-element-name": {
1231
+ "version": "1.0.1",
1232
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
1233
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
1234
+ "license": "MIT"
1235
+ },
1236
+ "node_modules/jsdom": {
1237
+ "version": "24.1.3",
1238
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.3.tgz",
1239
+ "integrity": "sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==",
1240
+ "license": "MIT",
1241
+ "dependencies": {
1242
+ "cssstyle": "^4.0.1",
1243
+ "data-urls": "^5.0.0",
1244
+ "decimal.js": "^10.4.3",
1245
+ "form-data": "^4.0.0",
1246
+ "html-encoding-sniffer": "^4.0.0",
1247
+ "http-proxy-agent": "^7.0.2",
1248
+ "https-proxy-agent": "^7.0.5",
1249
+ "is-potential-custom-element-name": "^1.0.1",
1250
+ "nwsapi": "^2.2.12",
1251
+ "parse5": "^7.1.2",
1252
+ "rrweb-cssom": "^0.7.1",
1253
+ "saxes": "^6.0.0",
1254
+ "symbol-tree": "^3.2.4",
1255
+ "tough-cookie": "^4.1.4",
1256
+ "w3c-xmlserializer": "^5.0.0",
1257
+ "webidl-conversions": "^7.0.0",
1258
+ "whatwg-encoding": "^3.1.1",
1259
+ "whatwg-mimetype": "^4.0.0",
1260
+ "whatwg-url": "^14.0.0",
1261
+ "ws": "^8.18.0",
1262
+ "xml-name-validator": "^5.0.0"
1263
+ },
1264
+ "engines": {
1265
+ "node": ">=18"
1266
+ },
1267
+ "peerDependencies": {
1268
+ "canvas": "^2.11.2"
1269
+ },
1270
+ "peerDependenciesMeta": {
1271
+ "canvas": {
1272
+ "optional": true
1273
+ }
1274
+ }
1275
+ },
1276
+ "node_modules/long": {
1277
+ "version": "4.0.0",
1278
+ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
1279
+ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==",
1280
+ "license": "Apache-2.0"
1281
+ },
1282
+ "node_modules/lru-cache": {
1283
+ "version": "10.4.3",
1284
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
1285
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
1286
+ "license": "ISC"
1287
+ },
1288
+ "node_modules/math-intrinsics": {
1289
+ "version": "1.1.0",
1290
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
1291
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
1292
+ "license": "MIT",
1293
+ "engines": {
1294
+ "node": ">= 0.4"
1295
+ }
1296
+ },
1297
+ "node_modules/media-typer": {
1298
+ "version": "0.3.0",
1299
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1300
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
1301
+ "license": "MIT",
1302
+ "engines": {
1303
+ "node": ">= 0.6"
1304
+ }
1305
+ },
1306
+ "node_modules/merge-descriptors": {
1307
+ "version": "1.0.3",
1308
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
1309
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
1310
+ "license": "MIT",
1311
+ "funding": {
1312
+ "url": "https://github.com/sponsors/sindresorhus"
1313
+ }
1314
+ },
1315
+ "node_modules/methods": {
1316
+ "version": "1.1.2",
1317
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1318
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
1319
+ "license": "MIT",
1320
+ "engines": {
1321
+ "node": ">= 0.6"
1322
+ }
1323
+ },
1324
+ "node_modules/mime": {
1325
+ "version": "1.6.0",
1326
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1327
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
1328
+ "license": "MIT",
1329
+ "bin": {
1330
+ "mime": "cli.js"
1331
+ },
1332
+ "engines": {
1333
+ "node": ">=4"
1334
+ }
1335
+ },
1336
+ "node_modules/mime-db": {
1337
+ "version": "1.52.0",
1338
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1339
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1340
+ "license": "MIT",
1341
+ "engines": {
1342
+ "node": ">= 0.6"
1343
+ }
1344
+ },
1345
+ "node_modules/mime-types": {
1346
+ "version": "2.1.35",
1347
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1348
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1349
+ "license": "MIT",
1350
+ "dependencies": {
1351
+ "mime-db": "1.52.0"
1352
+ },
1353
+ "engines": {
1354
+ "node": ">= 0.6"
1355
+ }
1356
+ },
1357
+ "node_modules/mimic-response": {
1358
+ "version": "3.1.0",
1359
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
1360
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
1361
+ "license": "MIT",
1362
+ "engines": {
1363
+ "node": ">=10"
1364
+ },
1365
+ "funding": {
1366
+ "url": "https://github.com/sponsors/sindresorhus"
1367
+ }
1368
+ },
1369
+ "node_modules/minimist": {
1370
+ "version": "1.2.8",
1371
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
1372
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
1373
+ "license": "MIT",
1374
+ "funding": {
1375
+ "url": "https://github.com/sponsors/ljharb"
1376
+ }
1377
+ },
1378
+ "node_modules/mkdirp-classic": {
1379
+ "version": "0.5.3",
1380
+ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
1381
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
1382
+ "license": "MIT"
1383
+ },
1384
+ "node_modules/ms": {
1385
+ "version": "2.0.0",
1386
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1387
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
1388
+ "license": "MIT"
1389
+ },
1390
+ "node_modules/napi-build-utils": {
1391
+ "version": "2.0.0",
1392
+ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz",
1393
+ "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==",
1394
+ "license": "MIT"
1395
+ },
1396
+ "node_modules/negotiator": {
1397
+ "version": "0.6.3",
1398
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1399
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
1400
+ "license": "MIT",
1401
+ "engines": {
1402
+ "node": ">= 0.6"
1403
+ }
1404
+ },
1405
+ "node_modules/node-abi": {
1406
+ "version": "3.85.0",
1407
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.85.0.tgz",
1408
+ "integrity": "sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==",
1409
+ "license": "MIT",
1410
+ "dependencies": {
1411
+ "semver": "^7.3.5"
1412
+ },
1413
+ "engines": {
1414
+ "node": ">=10"
1415
+ }
1416
+ },
1417
+ "node_modules/node-addon-api": {
1418
+ "version": "6.1.0",
1419
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz",
1420
+ "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==",
1421
+ "license": "MIT"
1422
+ },
1423
+ "node_modules/nwsapi": {
1424
+ "version": "2.2.23",
1425
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz",
1426
+ "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==",
1427
+ "license": "MIT"
1428
+ },
1429
+ "node_modules/object-assign": {
1430
+ "version": "4.1.1",
1431
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1432
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1433
+ "license": "MIT",
1434
+ "engines": {
1435
+ "node": ">=0.10.0"
1436
+ }
1437
+ },
1438
+ "node_modules/object-inspect": {
1439
+ "version": "1.13.4",
1440
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
1441
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
1442
+ "license": "MIT",
1443
+ "engines": {
1444
+ "node": ">= 0.4"
1445
+ },
1446
+ "funding": {
1447
+ "url": "https://github.com/sponsors/ljharb"
1448
+ }
1449
+ },
1450
+ "node_modules/on-finished": {
1451
+ "version": "2.4.1",
1452
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1453
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1454
+ "license": "MIT",
1455
+ "dependencies": {
1456
+ "ee-first": "1.1.1"
1457
+ },
1458
+ "engines": {
1459
+ "node": ">= 0.8"
1460
+ }
1461
+ },
1462
+ "node_modules/once": {
1463
+ "version": "1.4.0",
1464
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1465
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1466
+ "license": "ISC",
1467
+ "dependencies": {
1468
+ "wrappy": "1"
1469
+ }
1470
+ },
1471
+ "node_modules/onnx-proto": {
1472
+ "version": "4.0.4",
1473
+ "resolved": "https://registry.npmjs.org/onnx-proto/-/onnx-proto-4.0.4.tgz",
1474
+ "integrity": "sha512-aldMOB3HRoo6q/phyB6QRQxSt895HNNw82BNyZ2CMh4bjeKv7g/c+VpAFtJuEMVfYLMbRx61hbuqnKceLeDcDA==",
1475
+ "license": "MIT",
1476
+ "dependencies": {
1477
+ "protobufjs": "^6.8.8"
1478
+ }
1479
+ },
1480
+ "node_modules/onnxruntime-common": {
1481
+ "version": "1.14.0",
1482
+ "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.14.0.tgz",
1483
+ "integrity": "sha512-3LJpegM2iMNRX2wUmtYfeX/ytfOzNwAWKSq1HbRrKc9+uqG/FsEA0bbKZl1btQeZaXhC26l44NWpNUeXPII7Ew==",
1484
+ "license": "MIT"
1485
+ },
1486
+ "node_modules/onnxruntime-node": {
1487
+ "version": "1.14.0",
1488
+ "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.14.0.tgz",
1489
+ "integrity": "sha512-5ba7TWomIV/9b6NH/1x/8QEeowsb+jBEvFzU6z0T4mNsFwdPqXeFUM7uxC6QeSRkEbWu3qEB0VMjrvzN/0S9+w==",
1490
+ "license": "MIT",
1491
+ "optional": true,
1492
+ "os": [
1493
+ "win32",
1494
+ "darwin",
1495
+ "linux"
1496
+ ],
1497
+ "dependencies": {
1498
+ "onnxruntime-common": "~1.14.0"
1499
+ }
1500
+ },
1501
+ "node_modules/onnxruntime-web": {
1502
+ "version": "1.14.0",
1503
+ "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.14.0.tgz",
1504
+ "integrity": "sha512-Kcqf43UMfW8mCydVGcX9OMXI2VN17c0p6XvR7IPSZzBf/6lteBzXHvcEVWDPmCKuGombl997HgLqj91F11DzXw==",
1505
+ "license": "MIT",
1506
+ "dependencies": {
1507
+ "flatbuffers": "^1.12.0",
1508
+ "guid-typescript": "^1.0.9",
1509
+ "long": "^4.0.0",
1510
+ "onnx-proto": "^4.0.4",
1511
+ "onnxruntime-common": "~1.14.0",
1512
+ "platform": "^1.3.6"
1513
+ }
1514
+ },
1515
+ "node_modules/parse5": {
1516
+ "version": "7.3.0",
1517
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
1518
+ "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
1519
+ "license": "MIT",
1520
+ "dependencies": {
1521
+ "entities": "^6.0.0"
1522
+ },
1523
+ "funding": {
1524
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
1525
+ }
1526
+ },
1527
+ "node_modules/parseurl": {
1528
+ "version": "1.3.3",
1529
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1530
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1531
+ "license": "MIT",
1532
+ "engines": {
1533
+ "node": ">= 0.8"
1534
+ }
1535
+ },
1536
+ "node_modules/path-to-regexp": {
1537
+ "version": "0.1.12",
1538
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
1539
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
1540
+ "license": "MIT"
1541
+ },
1542
+ "node_modules/platform": {
1543
+ "version": "1.3.6",
1544
+ "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz",
1545
+ "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==",
1546
+ "license": "MIT"
1547
+ },
1548
+ "node_modules/prebuild-install": {
1549
+ "version": "7.1.3",
1550
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz",
1551
+ "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==",
1552
+ "license": "MIT",
1553
+ "dependencies": {
1554
+ "detect-libc": "^2.0.0",
1555
+ "expand-template": "^2.0.3",
1556
+ "github-from-package": "0.0.0",
1557
+ "minimist": "^1.2.3",
1558
+ "mkdirp-classic": "^0.5.3",
1559
+ "napi-build-utils": "^2.0.0",
1560
+ "node-abi": "^3.3.0",
1561
+ "pump": "^3.0.0",
1562
+ "rc": "^1.2.7",
1563
+ "simple-get": "^4.0.0",
1564
+ "tar-fs": "^2.0.0",
1565
+ "tunnel-agent": "^0.6.0"
1566
+ },
1567
+ "bin": {
1568
+ "prebuild-install": "bin.js"
1569
+ },
1570
+ "engines": {
1571
+ "node": ">=10"
1572
+ }
1573
+ },
1574
+ "node_modules/prebuild-install/node_modules/tar-fs": {
1575
+ "version": "2.1.4",
1576
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz",
1577
+ "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==",
1578
+ "license": "MIT",
1579
+ "dependencies": {
1580
+ "chownr": "^1.1.1",
1581
+ "mkdirp-classic": "^0.5.2",
1582
+ "pump": "^3.0.0",
1583
+ "tar-stream": "^2.1.4"
1584
+ }
1585
+ },
1586
+ "node_modules/prebuild-install/node_modules/tar-stream": {
1587
+ "version": "2.2.0",
1588
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
1589
+ "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
1590
+ "license": "MIT",
1591
+ "dependencies": {
1592
+ "bl": "^4.0.3",
1593
+ "end-of-stream": "^1.4.1",
1594
+ "fs-constants": "^1.0.0",
1595
+ "inherits": "^2.0.3",
1596
+ "readable-stream": "^3.1.1"
1597
+ },
1598
+ "engines": {
1599
+ "node": ">=6"
1600
+ }
1601
+ },
1602
+ "node_modules/protobufjs": {
1603
+ "version": "6.11.4",
1604
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz",
1605
+ "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==",
1606
+ "hasInstallScript": true,
1607
+ "license": "BSD-3-Clause",
1608
+ "dependencies": {
1609
+ "@protobufjs/aspromise": "^1.1.2",
1610
+ "@protobufjs/base64": "^1.1.2",
1611
+ "@protobufjs/codegen": "^2.0.4",
1612
+ "@protobufjs/eventemitter": "^1.1.0",
1613
+ "@protobufjs/fetch": "^1.1.0",
1614
+ "@protobufjs/float": "^1.0.2",
1615
+ "@protobufjs/inquire": "^1.1.0",
1616
+ "@protobufjs/path": "^1.1.2",
1617
+ "@protobufjs/pool": "^1.1.0",
1618
+ "@protobufjs/utf8": "^1.1.0",
1619
+ "@types/long": "^4.0.1",
1620
+ "@types/node": ">=13.7.0",
1621
+ "long": "^4.0.0"
1622
+ },
1623
+ "bin": {
1624
+ "pbjs": "bin/pbjs",
1625
+ "pbts": "bin/pbts"
1626
+ }
1627
+ },
1628
+ "node_modules/proxy-addr": {
1629
+ "version": "2.0.7",
1630
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1631
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1632
+ "license": "MIT",
1633
+ "dependencies": {
1634
+ "forwarded": "0.2.0",
1635
+ "ipaddr.js": "1.9.1"
1636
+ },
1637
+ "engines": {
1638
+ "node": ">= 0.10"
1639
+ }
1640
+ },
1641
+ "node_modules/psl": {
1642
+ "version": "1.15.0",
1643
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
1644
+ "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
1645
+ "license": "MIT",
1646
+ "dependencies": {
1647
+ "punycode": "^2.3.1"
1648
+ },
1649
+ "funding": {
1650
+ "url": "https://github.com/sponsors/lupomontero"
1651
+ }
1652
+ },
1653
+ "node_modules/pump": {
1654
+ "version": "3.0.3",
1655
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
1656
+ "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
1657
+ "license": "MIT",
1658
+ "dependencies": {
1659
+ "end-of-stream": "^1.1.0",
1660
+ "once": "^1.3.1"
1661
+ }
1662
+ },
1663
+ "node_modules/punycode": {
1664
+ "version": "2.3.1",
1665
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
1666
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
1667
+ "license": "MIT",
1668
+ "engines": {
1669
+ "node": ">=6"
1670
+ }
1671
+ },
1672
+ "node_modules/qs": {
1673
+ "version": "6.14.0",
1674
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
1675
+ "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
1676
+ "license": "BSD-3-Clause",
1677
+ "dependencies": {
1678
+ "side-channel": "^1.1.0"
1679
+ },
1680
+ "engines": {
1681
+ "node": ">=0.6"
1682
+ },
1683
+ "funding": {
1684
+ "url": "https://github.com/sponsors/ljharb"
1685
+ }
1686
+ },
1687
+ "node_modules/querystringify": {
1688
+ "version": "2.2.0",
1689
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
1690
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
1691
+ "license": "MIT"
1692
+ },
1693
+ "node_modules/range-parser": {
1694
+ "version": "1.2.1",
1695
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1696
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1697
+ "license": "MIT",
1698
+ "engines": {
1699
+ "node": ">= 0.6"
1700
+ }
1701
+ },
1702
+ "node_modules/raw-body": {
1703
+ "version": "2.5.3",
1704
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
1705
+ "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==",
1706
+ "license": "MIT",
1707
+ "dependencies": {
1708
+ "bytes": "~3.1.2",
1709
+ "http-errors": "~2.0.1",
1710
+ "iconv-lite": "~0.4.24",
1711
+ "unpipe": "~1.0.0"
1712
+ },
1713
+ "engines": {
1714
+ "node": ">= 0.8"
1715
+ }
1716
+ },
1717
+ "node_modules/rc": {
1718
+ "version": "1.2.8",
1719
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
1720
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
1721
+ "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
1722
+ "dependencies": {
1723
+ "deep-extend": "^0.6.0",
1724
+ "ini": "~1.3.0",
1725
+ "minimist": "^1.2.0",
1726
+ "strip-json-comments": "~2.0.1"
1727
+ },
1728
+ "bin": {
1729
+ "rc": "cli.js"
1730
+ }
1731
+ },
1732
+ "node_modules/readable-stream": {
1733
+ "version": "3.6.2",
1734
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
1735
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
1736
+ "license": "MIT",
1737
+ "dependencies": {
1738
+ "inherits": "^2.0.3",
1739
+ "string_decoder": "^1.1.1",
1740
+ "util-deprecate": "^1.0.1"
1741
+ },
1742
+ "engines": {
1743
+ "node": ">= 6"
1744
+ }
1745
+ },
1746
+ "node_modules/requires-port": {
1747
+ "version": "1.0.0",
1748
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
1749
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
1750
+ "license": "MIT"
1751
+ },
1752
+ "node_modules/rrweb-cssom": {
1753
+ "version": "0.7.1",
1754
+ "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz",
1755
+ "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==",
1756
+ "license": "MIT"
1757
+ },
1758
+ "node_modules/safe-buffer": {
1759
+ "version": "5.2.1",
1760
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1761
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1762
+ "funding": [
1763
+ {
1764
+ "type": "github",
1765
+ "url": "https://github.com/sponsors/feross"
1766
+ },
1767
+ {
1768
+ "type": "patreon",
1769
+ "url": "https://www.patreon.com/feross"
1770
+ },
1771
+ {
1772
+ "type": "consulting",
1773
+ "url": "https://feross.org/support"
1774
+ }
1775
+ ],
1776
+ "license": "MIT"
1777
+ },
1778
+ "node_modules/safer-buffer": {
1779
+ "version": "2.1.2",
1780
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1781
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1782
+ "license": "MIT"
1783
+ },
1784
+ "node_modules/saxes": {
1785
+ "version": "6.0.0",
1786
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
1787
+ "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
1788
+ "license": "ISC",
1789
+ "dependencies": {
1790
+ "xmlchars": "^2.2.0"
1791
+ },
1792
+ "engines": {
1793
+ "node": ">=v12.22.7"
1794
+ }
1795
+ },
1796
+ "node_modules/semver": {
1797
+ "version": "7.7.3",
1798
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
1799
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
1800
+ "license": "ISC",
1801
+ "bin": {
1802
+ "semver": "bin/semver.js"
1803
+ },
1804
+ "engines": {
1805
+ "node": ">=10"
1806
+ }
1807
+ },
1808
+ "node_modules/send": {
1809
+ "version": "0.19.2",
1810
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz",
1811
+ "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==",
1812
+ "license": "MIT",
1813
+ "dependencies": {
1814
+ "debug": "2.6.9",
1815
+ "depd": "2.0.0",
1816
+ "destroy": "1.2.0",
1817
+ "encodeurl": "~2.0.0",
1818
+ "escape-html": "~1.0.3",
1819
+ "etag": "~1.8.1",
1820
+ "fresh": "~0.5.2",
1821
+ "http-errors": "~2.0.1",
1822
+ "mime": "1.6.0",
1823
+ "ms": "2.1.3",
1824
+ "on-finished": "~2.4.1",
1825
+ "range-parser": "~1.2.1",
1826
+ "statuses": "~2.0.2"
1827
+ },
1828
+ "engines": {
1829
+ "node": ">= 0.8.0"
1830
+ }
1831
+ },
1832
+ "node_modules/send/node_modules/ms": {
1833
+ "version": "2.1.3",
1834
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1835
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1836
+ "license": "MIT"
1837
+ },
1838
+ "node_modules/serve-static": {
1839
+ "version": "1.16.3",
1840
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz",
1841
+ "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==",
1842
+ "license": "MIT",
1843
+ "dependencies": {
1844
+ "encodeurl": "~2.0.0",
1845
+ "escape-html": "~1.0.3",
1846
+ "parseurl": "~1.3.3",
1847
+ "send": "~0.19.1"
1848
+ },
1849
+ "engines": {
1850
+ "node": ">= 0.8.0"
1851
+ }
1852
+ },
1853
+ "node_modules/setprototypeof": {
1854
+ "version": "1.2.0",
1855
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1856
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1857
+ "license": "ISC"
1858
+ },
1859
+ "node_modules/sharp": {
1860
+ "version": "0.32.6",
1861
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz",
1862
+ "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==",
1863
+ "hasInstallScript": true,
1864
+ "license": "Apache-2.0",
1865
+ "dependencies": {
1866
+ "color": "^4.2.3",
1867
+ "detect-libc": "^2.0.2",
1868
+ "node-addon-api": "^6.1.0",
1869
+ "prebuild-install": "^7.1.1",
1870
+ "semver": "^7.5.4",
1871
+ "simple-get": "^4.0.1",
1872
+ "tar-fs": "^3.0.4",
1873
+ "tunnel-agent": "^0.6.0"
1874
+ },
1875
+ "engines": {
1876
+ "node": ">=14.15.0"
1877
+ },
1878
+ "funding": {
1879
+ "url": "https://opencollective.com/libvips"
1880
+ }
1881
+ },
1882
+ "node_modules/side-channel": {
1883
+ "version": "1.1.0",
1884
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
1885
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
1886
+ "license": "MIT",
1887
+ "dependencies": {
1888
+ "es-errors": "^1.3.0",
1889
+ "object-inspect": "^1.13.3",
1890
+ "side-channel-list": "^1.0.0",
1891
+ "side-channel-map": "^1.0.1",
1892
+ "side-channel-weakmap": "^1.0.2"
1893
+ },
1894
+ "engines": {
1895
+ "node": ">= 0.4"
1896
+ },
1897
+ "funding": {
1898
+ "url": "https://github.com/sponsors/ljharb"
1899
+ }
1900
+ },
1901
+ "node_modules/side-channel-list": {
1902
+ "version": "1.0.0",
1903
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
1904
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
1905
+ "license": "MIT",
1906
+ "dependencies": {
1907
+ "es-errors": "^1.3.0",
1908
+ "object-inspect": "^1.13.3"
1909
+ },
1910
+ "engines": {
1911
+ "node": ">= 0.4"
1912
+ },
1913
+ "funding": {
1914
+ "url": "https://github.com/sponsors/ljharb"
1915
+ }
1916
+ },
1917
+ "node_modules/side-channel-map": {
1918
+ "version": "1.0.1",
1919
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
1920
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
1921
+ "license": "MIT",
1922
+ "dependencies": {
1923
+ "call-bound": "^1.0.2",
1924
+ "es-errors": "^1.3.0",
1925
+ "get-intrinsic": "^1.2.5",
1926
+ "object-inspect": "^1.13.3"
1927
+ },
1928
+ "engines": {
1929
+ "node": ">= 0.4"
1930
+ },
1931
+ "funding": {
1932
+ "url": "https://github.com/sponsors/ljharb"
1933
+ }
1934
+ },
1935
+ "node_modules/side-channel-weakmap": {
1936
+ "version": "1.0.2",
1937
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
1938
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
1939
+ "license": "MIT",
1940
+ "dependencies": {
1941
+ "call-bound": "^1.0.2",
1942
+ "es-errors": "^1.3.0",
1943
+ "get-intrinsic": "^1.2.5",
1944
+ "object-inspect": "^1.13.3",
1945
+ "side-channel-map": "^1.0.1"
1946
+ },
1947
+ "engines": {
1948
+ "node": ">= 0.4"
1949
+ },
1950
+ "funding": {
1951
+ "url": "https://github.com/sponsors/ljharb"
1952
+ }
1953
+ },
1954
+ "node_modules/simple-concat": {
1955
+ "version": "1.0.1",
1956
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
1957
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
1958
+ "funding": [
1959
+ {
1960
+ "type": "github",
1961
+ "url": "https://github.com/sponsors/feross"
1962
+ },
1963
+ {
1964
+ "type": "patreon",
1965
+ "url": "https://www.patreon.com/feross"
1966
+ },
1967
+ {
1968
+ "type": "consulting",
1969
+ "url": "https://feross.org/support"
1970
+ }
1971
+ ],
1972
+ "license": "MIT"
1973
+ },
1974
+ "node_modules/simple-get": {
1975
+ "version": "4.0.1",
1976
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
1977
+ "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
1978
+ "funding": [
1979
+ {
1980
+ "type": "github",
1981
+ "url": "https://github.com/sponsors/feross"
1982
+ },
1983
+ {
1984
+ "type": "patreon",
1985
+ "url": "https://www.patreon.com/feross"
1986
+ },
1987
+ {
1988
+ "type": "consulting",
1989
+ "url": "https://feross.org/support"
1990
+ }
1991
+ ],
1992
+ "license": "MIT",
1993
+ "dependencies": {
1994
+ "decompress-response": "^6.0.0",
1995
+ "once": "^1.3.1",
1996
+ "simple-concat": "^1.0.0"
1997
+ }
1998
+ },
1999
+ "node_modules/simple-swizzle": {
2000
+ "version": "0.2.4",
2001
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz",
2002
+ "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==",
2003
+ "license": "MIT",
2004
+ "dependencies": {
2005
+ "is-arrayish": "^0.3.1"
2006
+ }
2007
+ },
2008
+ "node_modules/statuses": {
2009
+ "version": "2.0.2",
2010
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
2011
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
2012
+ "license": "MIT",
2013
+ "engines": {
2014
+ "node": ">= 0.8"
2015
+ }
2016
+ },
2017
+ "node_modules/streamx": {
2018
+ "version": "2.23.0",
2019
+ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz",
2020
+ "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==",
2021
+ "license": "MIT",
2022
+ "dependencies": {
2023
+ "events-universal": "^1.0.0",
2024
+ "fast-fifo": "^1.3.2",
2025
+ "text-decoder": "^1.1.0"
2026
+ }
2027
+ },
2028
+ "node_modules/string_decoder": {
2029
+ "version": "1.3.0",
2030
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
2031
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
2032
+ "license": "MIT",
2033
+ "dependencies": {
2034
+ "safe-buffer": "~5.2.0"
2035
+ }
2036
+ },
2037
+ "node_modules/strip-json-comments": {
2038
+ "version": "2.0.1",
2039
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
2040
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
2041
+ "license": "MIT",
2042
+ "engines": {
2043
+ "node": ">=0.10.0"
2044
+ }
2045
+ },
2046
+ "node_modules/symbol-tree": {
2047
+ "version": "3.2.4",
2048
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
2049
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
2050
+ "license": "MIT"
2051
+ },
2052
+ "node_modules/tar-fs": {
2053
+ "version": "3.1.1",
2054
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz",
2055
+ "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==",
2056
+ "license": "MIT",
2057
+ "dependencies": {
2058
+ "pump": "^3.0.0",
2059
+ "tar-stream": "^3.1.5"
2060
+ },
2061
+ "optionalDependencies": {
2062
+ "bare-fs": "^4.0.1",
2063
+ "bare-path": "^3.0.0"
2064
+ }
2065
+ },
2066
+ "node_modules/tar-stream": {
2067
+ "version": "3.1.7",
2068
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
2069
+ "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
2070
+ "license": "MIT",
2071
+ "dependencies": {
2072
+ "b4a": "^1.6.4",
2073
+ "fast-fifo": "^1.2.0",
2074
+ "streamx": "^2.15.0"
2075
+ }
2076
+ },
2077
+ "node_modules/text-decoder": {
2078
+ "version": "1.2.3",
2079
+ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz",
2080
+ "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==",
2081
+ "license": "Apache-2.0",
2082
+ "dependencies": {
2083
+ "b4a": "^1.6.4"
2084
+ }
2085
+ },
2086
+ "node_modules/toidentifier": {
2087
+ "version": "1.0.1",
2088
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
2089
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
2090
+ "license": "MIT",
2091
+ "engines": {
2092
+ "node": ">=0.6"
2093
+ }
2094
+ },
2095
+ "node_modules/tough-cookie": {
2096
+ "version": "4.1.4",
2097
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
2098
+ "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
2099
+ "license": "BSD-3-Clause",
2100
+ "dependencies": {
2101
+ "psl": "^1.1.33",
2102
+ "punycode": "^2.1.1",
2103
+ "universalify": "^0.2.0",
2104
+ "url-parse": "^1.5.3"
2105
+ },
2106
+ "engines": {
2107
+ "node": ">=6"
2108
+ }
2109
+ },
2110
+ "node_modules/tr46": {
2111
+ "version": "5.1.1",
2112
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz",
2113
+ "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==",
2114
+ "license": "MIT",
2115
+ "dependencies": {
2116
+ "punycode": "^2.3.1"
2117
+ },
2118
+ "engines": {
2119
+ "node": ">=18"
2120
+ }
2121
+ },
2122
+ "node_modules/tunnel-agent": {
2123
+ "version": "0.6.0",
2124
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
2125
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
2126
+ "license": "Apache-2.0",
2127
+ "dependencies": {
2128
+ "safe-buffer": "^5.0.1"
2129
+ },
2130
+ "engines": {
2131
+ "node": "*"
2132
+ }
2133
+ },
2134
+ "node_modules/type-is": {
2135
+ "version": "1.6.18",
2136
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
2137
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
2138
+ "license": "MIT",
2139
+ "dependencies": {
2140
+ "media-typer": "0.3.0",
2141
+ "mime-types": "~2.1.24"
2142
+ },
2143
+ "engines": {
2144
+ "node": ">= 0.6"
2145
+ }
2146
+ },
2147
+ "node_modules/undici-types": {
2148
+ "version": "7.16.0",
2149
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
2150
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
2151
+ "license": "MIT"
2152
+ },
2153
+ "node_modules/universalify": {
2154
+ "version": "0.2.0",
2155
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
2156
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
2157
+ "license": "MIT",
2158
+ "engines": {
2159
+ "node": ">= 4.0.0"
2160
+ }
2161
+ },
2162
+ "node_modules/unpipe": {
2163
+ "version": "1.0.0",
2164
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
2165
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
2166
+ "license": "MIT",
2167
+ "engines": {
2168
+ "node": ">= 0.8"
2169
+ }
2170
+ },
2171
+ "node_modules/url-parse": {
2172
+ "version": "1.5.10",
2173
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
2174
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
2175
+ "license": "MIT",
2176
+ "dependencies": {
2177
+ "querystringify": "^2.1.1",
2178
+ "requires-port": "^1.0.0"
2179
+ }
2180
+ },
2181
+ "node_modules/util-deprecate": {
2182
+ "version": "1.0.2",
2183
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2184
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
2185
+ "license": "MIT"
2186
+ },
2187
+ "node_modules/utils-merge": {
2188
+ "version": "1.0.1",
2189
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
2190
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
2191
+ "license": "MIT",
2192
+ "engines": {
2193
+ "node": ">= 0.4.0"
2194
+ }
2195
+ },
2196
+ "node_modules/vary": {
2197
+ "version": "1.1.2",
2198
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
2199
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
2200
+ "license": "MIT",
2201
+ "engines": {
2202
+ "node": ">= 0.8"
2203
+ }
2204
+ },
2205
+ "node_modules/w3c-xmlserializer": {
2206
+ "version": "5.0.0",
2207
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
2208
+ "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
2209
+ "license": "MIT",
2210
+ "dependencies": {
2211
+ "xml-name-validator": "^5.0.0"
2212
+ },
2213
+ "engines": {
2214
+ "node": ">=18"
2215
+ }
2216
+ },
2217
+ "node_modules/webidl-conversions": {
2218
+ "version": "7.0.0",
2219
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
2220
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
2221
+ "license": "BSD-2-Clause",
2222
+ "engines": {
2223
+ "node": ">=12"
2224
+ }
2225
+ },
2226
+ "node_modules/whatwg-encoding": {
2227
+ "version": "3.1.1",
2228
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
2229
+ "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
2230
+ "license": "MIT",
2231
+ "dependencies": {
2232
+ "iconv-lite": "0.6.3"
2233
+ },
2234
+ "engines": {
2235
+ "node": ">=18"
2236
+ }
2237
+ },
2238
+ "node_modules/whatwg-encoding/node_modules/iconv-lite": {
2239
+ "version": "0.6.3",
2240
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
2241
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
2242
+ "license": "MIT",
2243
+ "dependencies": {
2244
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
2245
+ },
2246
+ "engines": {
2247
+ "node": ">=0.10.0"
2248
+ }
2249
+ },
2250
+ "node_modules/whatwg-mimetype": {
2251
+ "version": "4.0.0",
2252
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
2253
+ "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
2254
+ "license": "MIT",
2255
+ "engines": {
2256
+ "node": ">=18"
2257
+ }
2258
+ },
2259
+ "node_modules/whatwg-url": {
2260
+ "version": "14.2.0",
2261
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz",
2262
+ "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==",
2263
+ "license": "MIT",
2264
+ "dependencies": {
2265
+ "tr46": "^5.1.0",
2266
+ "webidl-conversions": "^7.0.0"
2267
+ },
2268
+ "engines": {
2269
+ "node": ">=18"
2270
+ }
2271
+ },
2272
+ "node_modules/wrappy": {
2273
+ "version": "1.0.2",
2274
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2275
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
2276
+ "license": "ISC"
2277
+ },
2278
+ "node_modules/ws": {
2279
+ "version": "8.18.3",
2280
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
2281
+ "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
2282
+ "license": "MIT",
2283
+ "engines": {
2284
+ "node": ">=10.0.0"
2285
+ },
2286
+ "peerDependencies": {
2287
+ "bufferutil": "^4.0.1",
2288
+ "utf-8-validate": ">=5.0.2"
2289
+ },
2290
+ "peerDependenciesMeta": {
2291
+ "bufferutil": {
2292
+ "optional": true
2293
+ },
2294
+ "utf-8-validate": {
2295
+ "optional": true
2296
+ }
2297
+ }
2298
+ },
2299
+ "node_modules/xml-name-validator": {
2300
+ "version": "5.0.0",
2301
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
2302
+ "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
2303
+ "license": "Apache-2.0",
2304
+ "engines": {
2305
+ "node": ">=18"
2306
+ }
2307
+ },
2308
+ "node_modules/xmlchars": {
2309
+ "version": "2.2.0",
2310
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
2311
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
2312
+ "license": "MIT"
2313
+ }
2314
+ }
2315
+ }
package.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "question-explorer-server",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "scripts": {
6
+ "dev": "node --watch index.js",
7
+ "start": "node index.js"
8
+ },
9
+ "dependencies": {
10
+ "express": "^4.18.2",
11
+ "cors": "^2.8.5",
12
+ "@xenova/transformers": "^2.17.2",
13
+ "jsdom": "^24.1.0"
14
+ }
15
+ }
routes/article.js ADDED
@@ -0,0 +1,220 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Router } from 'express';
2
+ import { getArticleMetadata, getArticleHtml } from '../services/wikipedia.js';
3
+ import { chunkArticle } from '../services/chunker.js';
4
+ import { embedTexts, embedSingle } from '../services/embedder.js';
5
+ import { search } from '../services/vectorSearch.js';
6
+ import { getCached, setCache, isCacheValid } from '../services/cache.js';
7
+ import { getProcessingState, setProcessing } from '../services/processingState.js';
8
+
9
+ const router = Router();
10
+
11
+ /**
12
+ * GET /api/article/:title
13
+ * Fetch article content; initiates embedding pipeline if not cached
14
+ */
15
+ router.get( '/:title', async ( req, res ) => {
16
+ try {
17
+ const title = decodeURIComponent( req.params.title );
18
+
19
+ // Get current revision from Wikipedia
20
+ const metadata = await getArticleMetadata( title );
21
+ if ( !metadata ) {
22
+ return res.status( 404 ).json( { error: 'Article not found' } );
23
+ }
24
+
25
+ // Check cache validity
26
+ const cacheValid = await isCacheValid( title, metadata.revisionId );
27
+
28
+ if ( cacheValid ) {
29
+ const cached = await getCached( title );
30
+ return res.json( {
31
+ title: cached.title,
32
+ revisionId: cached.revisionId,
33
+ html: cached.html,
34
+ status: 'ready',
35
+ chunkCount: cached.chunks.length
36
+ } );
37
+ }
38
+
39
+ // Check if already processing
40
+ const state = getProcessingState( title );
41
+ if ( state.state === 'processing' ) {
42
+ return res.json( {
43
+ title: metadata.title,
44
+ revisionId: metadata.revisionId,
45
+ status: 'processing'
46
+ } );
47
+ }
48
+
49
+ // Start async processing
50
+ setProcessing( title, 'processing' );
51
+
52
+ // Return immediately with processing status
53
+ res.json( {
54
+ title: metadata.title,
55
+ revisionId: metadata.revisionId,
56
+ status: 'processing'
57
+ } );
58
+
59
+ // Process in background
60
+ processArticle( title, metadata.revisionId ).catch( ( err ) => {
61
+ console.error( `Error processing ${ title }:`, err );
62
+ setProcessing( title, 'error', err.message );
63
+ } );
64
+
65
+ } catch ( error ) {
66
+ console.error( 'Article fetch error:', error );
67
+ res.status( 500 ).json( { error: 'Failed to fetch article' } );
68
+ }
69
+ } );
70
+
71
+ /**
72
+ * GET /api/article/:title/status
73
+ * Poll endpoint for embedding status
74
+ */
75
+ router.get( '/:title/status', async ( req, res ) => {
76
+ try {
77
+ const title = decodeURIComponent( req.params.title );
78
+
79
+ const cached = await getCached( title );
80
+ if ( cached ) {
81
+ return res.json( {
82
+ title: cached.title,
83
+ revisionId: cached.revisionId,
84
+ status: 'ready',
85
+ chunkCount: cached.chunks.length
86
+ } );
87
+ }
88
+
89
+ const state = getProcessingState( title );
90
+
91
+ if ( state.state === 'error' ) {
92
+ return res.json( {
93
+ title,
94
+ status: 'error',
95
+ error: state.error
96
+ } );
97
+ }
98
+
99
+ if ( state.state === 'processing' ) {
100
+ return res.json( {
101
+ title,
102
+ status: 'processing'
103
+ } );
104
+ }
105
+
106
+ return res.json( {
107
+ title,
108
+ status: 'unknown'
109
+ } );
110
+
111
+ } catch ( error ) {
112
+ console.error( 'Status check error:', error );
113
+ res.status( 500 ).json( { error: 'Failed to check status' } );
114
+ }
115
+ } );
116
+
117
+ /**
118
+ * POST /api/article/:title/query
119
+ * Submit a natural language question
120
+ */
121
+ router.post( '/:title/query', async ( req, res ) => {
122
+ try {
123
+ const title = decodeURIComponent( req.params.title );
124
+ const { question, topK = 3 } = req.body;
125
+
126
+ if ( !question ) {
127
+ return res.status( 400 ).json( { error: 'Missing question' } );
128
+ }
129
+
130
+ const cached = await getCached( title );
131
+ if ( !cached ) {
132
+ const state = getProcessingState( title );
133
+ if ( state.state === 'processing' ) {
134
+ return res.status( 503 ).json( { error: 'Article still processing' } );
135
+ }
136
+ return res.status( 404 ).json( { error: 'Article not found or not processed' } );
137
+ }
138
+
139
+ // Embed the question
140
+ const queryEmbedding = await embedSingle( question );
141
+
142
+ // Search for relevant chunks
143
+ const { results, belowThreshold } = search(
144
+ queryEmbedding,
145
+ cached.chunks,
146
+ Math.min( topK, 10 )
147
+ );
148
+
149
+ res.json( {
150
+ question,
151
+ articleTitle: cached.title,
152
+ results,
153
+ belowThreshold
154
+ } );
155
+
156
+ } catch ( error ) {
157
+ console.error( 'Query error:', error );
158
+ res.status( 500 ).json( { error: 'Query failed' } );
159
+ }
160
+ } );
161
+
162
+ /**
163
+ * Background processing function
164
+ */
165
+ async function processArticle( title, revisionId ) {
166
+ console.log( `Processing article: ${ title }` );
167
+
168
+ // Fetch parsed HTML from Action API
169
+ const articleData = await getArticleHtml( title );
170
+ if ( !articleData ) {
171
+ throw new Error( 'Failed to fetch article HTML' );
172
+ }
173
+
174
+ const { html, sections } = articleData;
175
+
176
+ // Chunk the article
177
+ const chunks = chunkArticle( html, sections );
178
+ console.log( `Created ${ chunks.length } chunks for ${ title }` );
179
+
180
+ if ( chunks.length === 0 ) {
181
+ // Still cache it, but with no chunks
182
+ await setCache( title, {
183
+ title: articleData.title,
184
+ normalizedTitle: title.toLowerCase().replace( / /g, '-' ),
185
+ revisionId,
186
+ fetchedAt: new Date().toISOString(),
187
+ html,
188
+ chunkCount: 0,
189
+ chunks: []
190
+ } );
191
+ setProcessing( title, 'ready' );
192
+ return;
193
+ }
194
+
195
+ // Generate embeddings for all chunks
196
+ const texts = chunks.map( ( c ) => c.text );
197
+ console.log( `Generating embeddings for ${ texts.length } chunks...` );
198
+ const embeddings = await embedTexts( texts );
199
+
200
+ // Attach embeddings to chunks
201
+ chunks.forEach( ( chunk, i ) => {
202
+ chunk.embedding = embeddings[ i ];
203
+ } );
204
+
205
+ // Save to cache
206
+ await setCache( title, {
207
+ title: articleData.title,
208
+ normalizedTitle: title.toLowerCase().replace( / /g, '-' ),
209
+ revisionId,
210
+ fetchedAt: new Date().toISOString(),
211
+ html,
212
+ chunkCount: chunks.length,
213
+ chunks
214
+ } );
215
+
216
+ setProcessing( title, 'ready' );
217
+ console.log( `Finished processing: ${ title }` );
218
+ }
219
+
220
+ export default router;
routes/search.js ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Router } from 'express';
2
+ import { searchArticles } from '../services/wikipedia.js';
3
+
4
+ const router = Router();
5
+
6
+ /**
7
+ * GET /api/search?q=:query
8
+ * Proxy to Wikipedia's search API
9
+ */
10
+ router.get( '/', async ( req, res ) => {
11
+ try {
12
+ const query = req.query.q;
13
+
14
+ if ( !query ) {
15
+ return res.status( 400 ).json( { error: 'Missing query parameter "q"' } );
16
+ }
17
+
18
+ const results = await searchArticles( query );
19
+
20
+ res.json( {
21
+ query,
22
+ results
23
+ } );
24
+ } catch ( error ) {
25
+ console.error( 'Search error:', error );
26
+ res.status( 500 ).json( { error: 'Search failed' } );
27
+ }
28
+ } );
29
+
30
+ export default router;
services/cache.js ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ import { normalizeTitle } from '../utils/normalize.js';
5
+
6
+ const __dirname = path.dirname( fileURLToPath( import.meta.url ) );
7
+ const CACHE_DIR = path.join( __dirname, '..', 'cache' );
8
+
9
+ export async function getCached( title ) {
10
+ const filename = `${ normalizeTitle( title ) }.json`;
11
+ const filepath = path.join( CACHE_DIR, filename );
12
+
13
+ try {
14
+ const data = await fs.readFile( filepath, 'utf-8' );
15
+ return JSON.parse( data );
16
+ } catch ( e ) {
17
+ if ( e.code === 'ENOENT' ) {
18
+ return null;
19
+ }
20
+ throw e;
21
+ }
22
+ }
23
+
24
+ export async function setCache( title, data ) {
25
+ await fs.mkdir( CACHE_DIR, { recursive: true } );
26
+ const filename = `${ normalizeTitle( title ) }.json`;
27
+ const filepath = path.join( CACHE_DIR, filename );
28
+ await fs.writeFile( filepath, JSON.stringify( data, null, 2 ) );
29
+ }
30
+
31
+ export async function isCacheValid( title, currentRevisionId ) {
32
+ const cached = await getCached( title );
33
+ if ( !cached ) {
34
+ return false;
35
+ }
36
+ return cached.revisionId === currentRevisionId;
37
+ }
services/chunker.js ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { JSDOM } from 'jsdom';
2
+
3
+ /**
4
+ * Escape a string for use in a CSS selector
5
+ */
6
+ function cssEscape( str ) {
7
+ return str.replace( /([^\w-])/g, '\\$1' );
8
+ }
9
+
10
+ /**
11
+ * Parse Wikipedia Parsoid HTML into chunks for embedding.
12
+ * Parsoid output uses <section> tags with data-mw-section-id attributes.
13
+ *
14
+ * @param {string} html - The parsed HTML from Wikipedia Action API (with useparsoid)
15
+ * @param {Array} sections - Section metadata from the API (optional)
16
+ */
17
+ export function chunkArticle( html, sections = [] ) {
18
+ const dom = new JSDOM( html );
19
+ const doc = dom.window.document;
20
+ const chunks = [];
21
+
22
+ // Build a map of section IDs to titles from the API metadata
23
+ const sectionMap = new Map();
24
+ sections.forEach( ( s ) => {
25
+ if ( s.anchor ) {
26
+ sectionMap.set( s.anchor, s.line );
27
+ }
28
+ } );
29
+
30
+ const container = doc.querySelector( '.mw-parser-output' );
31
+ if ( !container ) {
32
+ return chunks;
33
+ }
34
+
35
+ let chunkIndex = 0;
36
+
37
+ // Find all sections (Parsoid wraps content in <section> tags)
38
+ const sectionElements = container.querySelectorAll( 'section' );
39
+
40
+ if ( sectionElements.length > 0 ) {
41
+ // Parsoid structure: iterate through sections
42
+ sectionElements.forEach( ( section ) => {
43
+ const sectionId = section.getAttribute( 'data-mw-section-id' );
44
+ const heading = section.querySelector( ':scope > h2, :scope > h3, :scope > h4' );
45
+
46
+ let sectionTitle = 'Introduction';
47
+ let sectionAnchor = null;
48
+
49
+ if ( heading ) {
50
+ sectionAnchor = heading.id;
51
+ sectionTitle = sectionMap.get( sectionAnchor ) || heading.textContent.trim();
52
+ }
53
+
54
+ // Get paragraphs directly in this section
55
+ const paragraphs = section.querySelectorAll( ':scope > p' );
56
+
57
+ paragraphs.forEach( ( p, pIdx ) => {
58
+ const text = p.textContent.trim();
59
+
60
+ // Skip empty or very short paragraphs
61
+ if ( text.length < 50 ) {
62
+ return;
63
+ }
64
+
65
+ // Build selector using section's data-mw-section-id
66
+ let selector;
67
+ if ( sectionId !== null ) {
68
+ selector = `section[data-mw-section-id="${ sectionId }"] > p:nth-of-type(${ pIdx + 1 })`;
69
+ } else if ( section.id ) {
70
+ selector = `#${ cssEscape( section.id ) } > p:nth-of-type(${ pIdx + 1 })`;
71
+ } else {
72
+ // Fallback for sections without ID
73
+ selector = `section:first-of-type > p:nth-of-type(${ pIdx + 1 })`;
74
+ }
75
+
76
+ chunks.push( {
77
+ id: `chunk-${ String( chunkIndex ).padStart( 3, '0' ) }`,
78
+ text: text,
79
+ sectionId: sectionAnchor,
80
+ sectionTitle: sectionTitle,
81
+ selector: selector,
82
+ embedding: null
83
+ } );
84
+
85
+ chunkIndex++;
86
+ } );
87
+ } );
88
+ } else {
89
+ // Fallback: no sections, use flat paragraph structure
90
+ const paragraphs = container.querySelectorAll( ':scope > p' );
91
+
92
+ paragraphs.forEach( ( p, pIdx ) => {
93
+ const text = p.textContent.trim();
94
+
95
+ if ( text.length < 50 ) {
96
+ return;
97
+ }
98
+
99
+ chunks.push( {
100
+ id: `chunk-${ String( chunkIndex ).padStart( 3, '0' ) }`,
101
+ text: text,
102
+ sectionId: null,
103
+ sectionTitle: 'Introduction',
104
+ selector: `.mw-parser-output > p:nth-of-type(${ pIdx + 1 })`,
105
+ embedding: null
106
+ } );
107
+
108
+ chunkIndex++;
109
+ } );
110
+ }
111
+
112
+ return chunks;
113
+ }
services/embedder.js ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { pipeline } from '@xenova/transformers';
2
+
3
+ let extractor = null;
4
+
5
+ export async function initEmbedder() {
6
+ if ( !extractor ) {
7
+ console.log( 'Loading embedding model (Xenova/all-MiniLM-L6-v2)...' );
8
+ extractor = await pipeline(
9
+ 'feature-extraction',
10
+ 'Xenova/all-MiniLM-L6-v2'
11
+ );
12
+ console.log( 'Embedding model loaded.' );
13
+ }
14
+ return extractor;
15
+ }
16
+
17
+ export async function embedTexts( texts ) {
18
+ const ext = await initEmbedder();
19
+ const output = await ext( texts, { pooling: 'mean', normalize: true } );
20
+ return output.tolist();
21
+ }
22
+
23
+ export async function embedSingle( text ) {
24
+ const results = await embedTexts( [ text ] );
25
+ return results[ 0 ];
26
+ }
services/processingState.js ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { normalizeTitle } from '../utils/normalize.js';
2
+
3
+ // In-memory map for processing status
4
+ // In production, this would be Redis or similar
5
+ const processingState = new Map();
6
+
7
+ // States: 'processing' | 'ready' | 'error'
8
+ export function setProcessing( title, state, error = null ) {
9
+ processingState.set( normalizeTitle( title ), { state, error, timestamp: Date.now() } );
10
+ }
11
+
12
+ export function getProcessingState( title ) {
13
+ return processingState.get( normalizeTitle( title ) ) || { state: 'unknown' };
14
+ }
15
+
16
+ export function clearProcessing( title ) {
17
+ processingState.delete( normalizeTitle( title ) );
18
+ }
services/vectorSearch.js ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Compute cosine similarity between two vectors
3
+ * Assumes vectors are already normalized
4
+ */
5
+ export function cosineSimilarity( a, b ) {
6
+ let dot = 0;
7
+ for ( let i = 0; i < a.length; i++ ) {
8
+ dot += a[ i ] * b[ i ];
9
+ }
10
+ return dot;
11
+ }
12
+
13
+ /**
14
+ * Search chunks by embedding similarity
15
+ */
16
+ export function search( queryEmbedding, chunks, topK = 3, threshold = 0.4 ) {
17
+ const scored = chunks.map( ( chunk ) => ( {
18
+ ...chunk,
19
+ score: cosineSimilarity( queryEmbedding, chunk.embedding )
20
+ } ) );
21
+
22
+ scored.sort( ( a, b ) => b.score - a.score );
23
+
24
+ const results = scored.slice( 0, topK ).map( ( r ) => ( {
25
+ chunkId: r.id,
26
+ text: r.text,
27
+ score: r.score,
28
+ confidence: scoreToConfidence( r.score ),
29
+ sectionId: r.sectionId,
30
+ sectionTitle: r.sectionTitle,
31
+ selector: r.selector,
32
+ paragraphIndex: r.paragraphIndex
33
+ } ) );
34
+
35
+ const belowThreshold = results.length === 0 || results[ 0 ].score < threshold;
36
+
37
+ return { results, belowThreshold };
38
+ }
39
+
40
+ function scoreToConfidence( score ) {
41
+ if ( score >= 0.6 ) {
42
+ return 'high';
43
+ }
44
+ if ( score >= 0.45 ) {
45
+ return 'medium';
46
+ }
47
+ return 'low';
48
+ }
services/wikipedia.js ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const USER_AGENT = 'WikipediaQuestionExplorer/1.0 (prototype)';
2
+
3
+ async function fetchJSON( url ) {
4
+ const response = await fetch( url, {
5
+ headers: { 'User-Agent': USER_AGENT }
6
+ } );
7
+
8
+ if ( !response.ok ) {
9
+ throw new Error( `HTTP ${ response.status }: ${ response.statusText }` );
10
+ }
11
+
12
+ return response.json();
13
+ }
14
+
15
+ /**
16
+ * Fetch article metadata including revision ID using the Action API
17
+ */
18
+ export async function getArticleMetadata( title ) {
19
+ const params = new URLSearchParams( {
20
+ action: 'query',
21
+ format: 'json',
22
+ titles: title,
23
+ prop: 'revisions',
24
+ rvprop: 'ids',
25
+ redirects: '1'
26
+ } );
27
+
28
+ const url = `https://en.wikipedia.org/w/api.php?${ params }`;
29
+
30
+ try {
31
+ const data = await fetchJSON( url );
32
+ const pages = data.query?.pages;
33
+ if ( !pages ) {
34
+ return null;
35
+ }
36
+
37
+ const page = Object.values( pages )[ 0 ];
38
+ if ( page.missing !== undefined ) {
39
+ return null;
40
+ }
41
+
42
+ return {
43
+ title: page.title,
44
+ revisionId: page.revisions?.[ 0 ]?.revid
45
+ };
46
+ } catch ( error ) {
47
+ if ( error.message.includes( '404' ) ) {
48
+ return null;
49
+ }
50
+ throw error;
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Fetch parsed HTML for an article using the Action API with mobile format and Parsoid
56
+ * Returns cleaner HTML optimized for mobile viewing (no infoboxes, cleaner structure)
57
+ */
58
+ export async function getArticleHtml( title ) {
59
+ const params = new URLSearchParams( {
60
+ action: 'parse',
61
+ format: 'json',
62
+ page: title,
63
+ prop: 'text|sections|displaytitle',
64
+ redirects: '1',
65
+ disableeditsection: '1',
66
+ disabletoc: '1',
67
+ mobileformat: '1',
68
+ useparsoid: '1'
69
+ } );
70
+
71
+ const url = `https://en.wikipedia.org/w/api.php?${ params }`;
72
+
73
+ try {
74
+ const data = await fetchJSON( url );
75
+
76
+ if ( data.error ) {
77
+ if ( data.error.code === 'missingtitle' ) {
78
+ return null;
79
+ }
80
+ throw new Error( data.error.info );
81
+ }
82
+
83
+ let html = data.parse.text[ '*' ];
84
+
85
+ // Convert relative links to absolute Wikipedia URLs
86
+ html = html.replace( /href="\/wiki\//gi, 'href="https://en.wikipedia.org/wiki/' );
87
+ html = html.replace( /href="\/w\//gi, 'href="https://en.wikipedia.org/w/' );
88
+ html = html.replace( /href="\.\/([^"]+)"/gi, 'href="https://en.wikipedia.org/wiki/$1"' );
89
+
90
+ // Convert protocol-relative URLs to https (only at start of URL, not ://)
91
+ html = html.replace( /src="\/\//gi, 'src="https://' );
92
+ // Handle srcset with multiple entries - only replace // at start of URLs, not :// in the middle
93
+ html = html.replace( /srcset="([^"]*)"/gi, ( _, srcset ) => {
94
+ // Replace space followed by // (new URL entry) or start of string //
95
+ const fixed = srcset
96
+ .replace( /^\/\//g, 'https://' )
97
+ .replace( /(\s)\/\//g, '$1https://' );
98
+ return `srcset="${ fixed }"`;
99
+ } );
100
+
101
+ // Add lazy loading to images
102
+ html = html.replace( /<img /gi, '<img loading="lazy" ' );
103
+
104
+ // Wrap in a container div with class for styling
105
+ html = `<div class="mw-parser-output">${ html }</div>`;
106
+
107
+ return {
108
+ html,
109
+ title: data.parse.title,
110
+ displayTitle: data.parse.displaytitle,
111
+ sections: data.parse.sections
112
+ };
113
+ } catch ( error ) {
114
+ if ( error.message.includes( '404' ) ) {
115
+ return null;
116
+ }
117
+ throw error;
118
+ }
119
+ }
120
+
121
+ /**
122
+ * Search Wikipedia articles
123
+ */
124
+ export async function searchArticles( query, limit = 10 ) {
125
+ if ( !query || query.trim() === '' ) {
126
+ return [];
127
+ }
128
+
129
+ const url = `https://en.wikipedia.org/w/api.php?action=query&format=json&generator=prefixsearch&gpssearch=${ encodeURIComponent( query ) }&gpsnamespace=0&gpslimit=${ limit }&prop=description`;
130
+
131
+ const response = await fetchJSON( url );
132
+
133
+ if ( !response.query || !response.query.pages ) {
134
+ return [];
135
+ }
136
+
137
+ return Object.values( response.query.pages )
138
+ .sort( ( a, b ) => a.index - b.index )
139
+ .map( ( page ) => ( {
140
+ title: page.title,
141
+ description: page.description || ''
142
+ } ) );
143
+ }
utils/normalize.js ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Normalize a Wikipedia article title for use as a cache key/filename
3
+ *
4
+ * @param {string} title - Wikipedia article title
5
+ * @returns {string} - Normalized title safe for filenames
6
+ */
7
+ export function normalizeTitle( title ) {
8
+ return title
9
+ .toLowerCase()
10
+ .replace( / /g, '-' )
11
+ .replace( /[^a-z0-9-]/g, '' )
12
+ .substring( 0, 100 );
13
+ }