├── README.md
├── preclass
├── index.html
├── package-lock.json
├── package.json
└── src
│ ├── gestures.js
│ └── index.js
└── recorded
├── .vscode
└── settings.json
├── index.html
├── package-lock.json
├── package.json
└── src
├── gestures.js
└── index.js
/README.md:
--------------------------------------------------------------------------------
1 | # live-recognizing-multiple-gestures-tensorflowjs
2 |
3 | ## About
4 |
5 | This is the examples shown in my live screen about [Recognizing gestures in real time right from the browser (pt-br)](https://www.youtube.com/live/MeS6dX2a2zQ?feature=share)
6 |
7 | First of all, leave your star 🌟 on this repo.
8 |
9 | Access our [**exclusive telegram channel**](https://bit.ly/canalerickwendel) so I'll let you know about all the content I've been producing
10 |
11 | ## Complete source code
12 | - Access it in [app](./recorded/)
13 | - Checkout the [live demo](https://erickwendel.github.io/live-recognizing-multiple-gestures-tensorflowjs/recorded/).
14 | - It recognizes, single hand gestures 🖐,👊,✌️,👍🏻 and the multigesture 🙅
15 |
16 |
17 | ## Have fun!
18 | 
19 |
20 | ## References:
21 | - https://github.com/ErickWendel/fingerpose
22 | - Rock, Paper & Scissors: https://github.com/andypotato/rock-paper-scissors
23 | - Pacman: https://storage.googleapis.com/tfjs-examples/webcam-transfer-learning/dist/index.html
24 | - https://github.com/tensorflow/tfjs-examples/
25 | - https://www.npmjs.com/package/fingerpose
26 | - https://github.com/andypotato/rock-paper-scissors/blob/master/src/js/Gestures.js
27 | - https://www.tensorflow.org/js/demos
28 | - https://github.com/tensorflow/tfjs-models/tree/master/hand-pose-detection#mediapipe-hands-keypoints-used-in-mediapipe-hands
29 |
--------------------------------------------------------------------------------
/preclass/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | FingerPose Example
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
17 |
18 |
19 |
20 |
21 |
22 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
Left Hand
110 |
111 |
112 |
113 | Idx |
114 | Finger |
115 | Curl |
116 | Direction |
117 |
118 |
119 |
120 |
121 | 0 |
122 | Thumb |
123 | - |
124 | - |
125 |
126 |
127 | 1 |
128 | Index |
129 | - |
130 | - |
131 |
132 |
133 | 2 |
134 | Middle |
135 | - |
136 | - |
137 |
138 |
139 | 3 |
140 | Ring |
141 | - |
142 | - |
143 |
144 |
145 | 4 |
146 | Pinky |
147 | - |
148 | - |
149 |
150 |
151 |
152 |
153 |
Right Hand
154 |
155 |
156 |
157 | Idx |
158 | Finger |
159 | Curl |
160 | Direction |
161 |
162 |
163 |
164 |
165 | 0 |
166 | Thumb |
167 | - |
168 | - |
169 |
170 |
171 | 1 |
172 | Index |
173 | - |
174 | - |
175 |
176 |
177 | 2 |
178 | Middle |
179 | - |
180 | - |
181 |
182 |
183 | 3 |
184 | Ring |
185 | - |
186 | - |
187 |
188 |
189 | 4 |
190 | Pinky |
191 | - |
192 | - |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
202 |
203 |
204 |
205 |
--------------------------------------------------------------------------------
/preclass/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "gestures",
3 | "version": "0.0.1",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "gestures",
9 | "version": "0.0.1",
10 | "license": "ISC",
11 | "devDependencies": {
12 | "browser-sync": "^2.27.11"
13 | }
14 | },
15 | "node_modules/@socket.io/component-emitter": {
16 | "version": "3.1.0",
17 | "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
18 | "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==",
19 | "dev": true
20 | },
21 | "node_modules/@types/cookie": {
22 | "version": "0.4.1",
23 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
24 | "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==",
25 | "dev": true
26 | },
27 | "node_modules/@types/cors": {
28 | "version": "2.8.13",
29 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz",
30 | "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==",
31 | "dev": true,
32 | "dependencies": {
33 | "@types/node": "*"
34 | }
35 | },
36 | "node_modules/@types/node": {
37 | "version": "18.13.0",
38 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz",
39 | "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==",
40 | "dev": true
41 | },
42 | "node_modules/accepts": {
43 | "version": "1.3.8",
44 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
45 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
46 | "dev": true,
47 | "dependencies": {
48 | "mime-types": "~2.1.34",
49 | "negotiator": "0.6.3"
50 | },
51 | "engines": {
52 | "node": ">= 0.6"
53 | }
54 | },
55 | "node_modules/ansi-regex": {
56 | "version": "2.1.1",
57 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
58 | "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
59 | "dev": true,
60 | "engines": {
61 | "node": ">=0.10.0"
62 | }
63 | },
64 | "node_modules/ansi-styles": {
65 | "version": "2.2.1",
66 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
67 | "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
68 | "dev": true,
69 | "engines": {
70 | "node": ">=0.10.0"
71 | }
72 | },
73 | "node_modules/anymatch": {
74 | "version": "3.1.3",
75 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
76 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
77 | "dev": true,
78 | "dependencies": {
79 | "normalize-path": "^3.0.0",
80 | "picomatch": "^2.0.4"
81 | },
82 | "engines": {
83 | "node": ">= 8"
84 | }
85 | },
86 | "node_modules/async": {
87 | "version": "2.6.4",
88 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
89 | "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
90 | "dev": true,
91 | "dependencies": {
92 | "lodash": "^4.17.14"
93 | }
94 | },
95 | "node_modules/async-each-series": {
96 | "version": "0.1.1",
97 | "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz",
98 | "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==",
99 | "dev": true,
100 | "engines": {
101 | "node": ">=0.8.0"
102 | }
103 | },
104 | "node_modules/axios": {
105 | "version": "0.21.4",
106 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
107 | "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
108 | "dev": true,
109 | "dependencies": {
110 | "follow-redirects": "^1.14.0"
111 | }
112 | },
113 | "node_modules/balanced-match": {
114 | "version": "1.0.2",
115 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
116 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
117 | "dev": true
118 | },
119 | "node_modules/base64id": {
120 | "version": "2.0.0",
121 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
122 | "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
123 | "dev": true,
124 | "engines": {
125 | "node": "^4.5.0 || >= 5.9"
126 | }
127 | },
128 | "node_modules/batch": {
129 | "version": "0.6.1",
130 | "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
131 | "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
132 | "dev": true
133 | },
134 | "node_modules/binary-extensions": {
135 | "version": "2.2.0",
136 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
137 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
138 | "dev": true,
139 | "engines": {
140 | "node": ">=8"
141 | }
142 | },
143 | "node_modules/brace-expansion": {
144 | "version": "1.1.11",
145 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
146 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
147 | "dev": true,
148 | "dependencies": {
149 | "balanced-match": "^1.0.0",
150 | "concat-map": "0.0.1"
151 | }
152 | },
153 | "node_modules/braces": {
154 | "version": "3.0.2",
155 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
156 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
157 | "dev": true,
158 | "dependencies": {
159 | "fill-range": "^7.0.1"
160 | },
161 | "engines": {
162 | "node": ">=8"
163 | }
164 | },
165 | "node_modules/browser-sync": {
166 | "version": "2.27.11",
167 | "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.27.11.tgz",
168 | "integrity": "sha512-U5f9u97OYJH66T0MGWWzG9rOQTW6ZmDMj97vsmtqwNS03JAwdLVES8eel2lD3rvAqQCNAFqaJ74NMacBI57vJg==",
169 | "dev": true,
170 | "dependencies": {
171 | "browser-sync-client": "^2.27.11",
172 | "browser-sync-ui": "^2.27.11",
173 | "bs-recipes": "1.3.4",
174 | "bs-snippet-injector": "^2.0.1",
175 | "chokidar": "^3.5.1",
176 | "connect": "3.6.6",
177 | "connect-history-api-fallback": "^1",
178 | "dev-ip": "^1.0.1",
179 | "easy-extender": "^2.3.4",
180 | "eazy-logger": "3.1.0",
181 | "etag": "^1.8.1",
182 | "fresh": "^0.5.2",
183 | "fs-extra": "3.0.1",
184 | "http-proxy": "^1.18.1",
185 | "immutable": "^3",
186 | "localtunnel": "^2.0.1",
187 | "micromatch": "^4.0.2",
188 | "opn": "5.3.0",
189 | "portscanner": "2.2.0",
190 | "qs": "^6.11.0",
191 | "raw-body": "^2.3.2",
192 | "resp-modifier": "6.0.2",
193 | "rx": "4.1.0",
194 | "send": "0.16.2",
195 | "serve-index": "1.9.1",
196 | "serve-static": "1.13.2",
197 | "server-destroy": "1.0.1",
198 | "socket.io": "^4.4.1",
199 | "ua-parser-js": "1.0.2",
200 | "yargs": "^17.3.1"
201 | },
202 | "bin": {
203 | "browser-sync": "dist/bin.js"
204 | },
205 | "engines": {
206 | "node": ">= 8.0.0"
207 | }
208 | },
209 | "node_modules/browser-sync-client": {
210 | "version": "2.27.11",
211 | "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.11.tgz",
212 | "integrity": "sha512-okMNfD2NasL/XD1/BclP3onXjhahisk3e/kTQ5HPDT/lLqdBqNDd6QFcjI5I1ak7na2hxKQSLjryql+7fp5gKQ==",
213 | "dev": true,
214 | "dependencies": {
215 | "etag": "1.8.1",
216 | "fresh": "0.5.2",
217 | "mitt": "^1.1.3",
218 | "rxjs": "^5.5.6",
219 | "typescript": "^4.6.2"
220 | },
221 | "engines": {
222 | "node": ">=8.0.0"
223 | }
224 | },
225 | "node_modules/browser-sync-ui": {
226 | "version": "2.27.11",
227 | "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.11.tgz",
228 | "integrity": "sha512-1T/Y8Pp1R68aUL7zVSFq0nxtr258xWd/nTasCAHX2M6EsGaswVOFtXsw3bKqsr35z+J+LfVfOdz1HFLYKxdgrA==",
229 | "dev": true,
230 | "dependencies": {
231 | "async-each-series": "0.1.1",
232 | "connect-history-api-fallback": "^1",
233 | "immutable": "^3",
234 | "server-destroy": "1.0.1",
235 | "socket.io-client": "^4.4.1",
236 | "stream-throttle": "^0.1.3"
237 | }
238 | },
239 | "node_modules/bs-recipes": {
240 | "version": "1.3.4",
241 | "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz",
242 | "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==",
243 | "dev": true
244 | },
245 | "node_modules/bs-snippet-injector": {
246 | "version": "2.0.1",
247 | "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz",
248 | "integrity": "sha512-4u8IgB+L9L+S5hknOj3ddNSb42436gsnGm1AuM15B7CdbkpQTyVWgIM5/JUBiKiRwGOR86uo0Lu/OsX+SAlJmw==",
249 | "dev": true
250 | },
251 | "node_modules/bytes": {
252 | "version": "3.1.2",
253 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
254 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
255 | "dev": true,
256 | "engines": {
257 | "node": ">= 0.8"
258 | }
259 | },
260 | "node_modules/call-bind": {
261 | "version": "1.0.2",
262 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
263 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
264 | "dev": true,
265 | "dependencies": {
266 | "function-bind": "^1.1.1",
267 | "get-intrinsic": "^1.0.2"
268 | },
269 | "funding": {
270 | "url": "https://github.com/sponsors/ljharb"
271 | }
272 | },
273 | "node_modules/chalk": {
274 | "version": "1.1.3",
275 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
276 | "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
277 | "dev": true,
278 | "dependencies": {
279 | "ansi-styles": "^2.2.1",
280 | "escape-string-regexp": "^1.0.2",
281 | "has-ansi": "^2.0.0",
282 | "strip-ansi": "^3.0.0",
283 | "supports-color": "^2.0.0"
284 | },
285 | "engines": {
286 | "node": ">=0.10.0"
287 | }
288 | },
289 | "node_modules/chokidar": {
290 | "version": "3.5.3",
291 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
292 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
293 | "dev": true,
294 | "funding": [
295 | {
296 | "type": "individual",
297 | "url": "https://paulmillr.com/funding/"
298 | }
299 | ],
300 | "dependencies": {
301 | "anymatch": "~3.1.2",
302 | "braces": "~3.0.2",
303 | "glob-parent": "~5.1.2",
304 | "is-binary-path": "~2.1.0",
305 | "is-glob": "~4.0.1",
306 | "normalize-path": "~3.0.0",
307 | "readdirp": "~3.6.0"
308 | },
309 | "engines": {
310 | "node": ">= 8.10.0"
311 | },
312 | "optionalDependencies": {
313 | "fsevents": "~2.3.2"
314 | }
315 | },
316 | "node_modules/cliui": {
317 | "version": "8.0.1",
318 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
319 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
320 | "dev": true,
321 | "dependencies": {
322 | "string-width": "^4.2.0",
323 | "strip-ansi": "^6.0.1",
324 | "wrap-ansi": "^7.0.0"
325 | },
326 | "engines": {
327 | "node": ">=12"
328 | }
329 | },
330 | "node_modules/cliui/node_modules/ansi-regex": {
331 | "version": "5.0.1",
332 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
333 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
334 | "dev": true,
335 | "engines": {
336 | "node": ">=8"
337 | }
338 | },
339 | "node_modules/cliui/node_modules/strip-ansi": {
340 | "version": "6.0.1",
341 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
342 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
343 | "dev": true,
344 | "dependencies": {
345 | "ansi-regex": "^5.0.1"
346 | },
347 | "engines": {
348 | "node": ">=8"
349 | }
350 | },
351 | "node_modules/color-convert": {
352 | "version": "2.0.1",
353 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
354 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
355 | "dev": true,
356 | "dependencies": {
357 | "color-name": "~1.1.4"
358 | },
359 | "engines": {
360 | "node": ">=7.0.0"
361 | }
362 | },
363 | "node_modules/color-name": {
364 | "version": "1.1.4",
365 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
366 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
367 | "dev": true
368 | },
369 | "node_modules/commander": {
370 | "version": "2.20.3",
371 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
372 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
373 | "dev": true
374 | },
375 | "node_modules/concat-map": {
376 | "version": "0.0.1",
377 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
378 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
379 | "dev": true
380 | },
381 | "node_modules/connect": {
382 | "version": "3.6.6",
383 | "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz",
384 | "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==",
385 | "dev": true,
386 | "dependencies": {
387 | "debug": "2.6.9",
388 | "finalhandler": "1.1.0",
389 | "parseurl": "~1.3.2",
390 | "utils-merge": "1.0.1"
391 | },
392 | "engines": {
393 | "node": ">= 0.10.0"
394 | }
395 | },
396 | "node_modules/connect-history-api-fallback": {
397 | "version": "1.6.0",
398 | "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
399 | "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
400 | "dev": true,
401 | "engines": {
402 | "node": ">=0.8"
403 | }
404 | },
405 | "node_modules/cookie": {
406 | "version": "0.4.2",
407 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
408 | "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
409 | "dev": true,
410 | "engines": {
411 | "node": ">= 0.6"
412 | }
413 | },
414 | "node_modules/cors": {
415 | "version": "2.8.5",
416 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
417 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
418 | "dev": true,
419 | "dependencies": {
420 | "object-assign": "^4",
421 | "vary": "^1"
422 | },
423 | "engines": {
424 | "node": ">= 0.10"
425 | }
426 | },
427 | "node_modules/debug": {
428 | "version": "2.6.9",
429 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
430 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
431 | "dev": true,
432 | "dependencies": {
433 | "ms": "2.0.0"
434 | }
435 | },
436 | "node_modules/depd": {
437 | "version": "2.0.0",
438 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
439 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
440 | "dev": true,
441 | "engines": {
442 | "node": ">= 0.8"
443 | }
444 | },
445 | "node_modules/destroy": {
446 | "version": "1.0.4",
447 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
448 | "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==",
449 | "dev": true
450 | },
451 | "node_modules/dev-ip": {
452 | "version": "1.0.1",
453 | "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz",
454 | "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==",
455 | "dev": true,
456 | "bin": {
457 | "dev-ip": "lib/dev-ip.js"
458 | },
459 | "engines": {
460 | "node": ">= 0.8.0"
461 | }
462 | },
463 | "node_modules/dlv": {
464 | "version": "1.1.3",
465 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
466 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
467 | "dev": true
468 | },
469 | "node_modules/easy-extender": {
470 | "version": "2.3.4",
471 | "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz",
472 | "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==",
473 | "dev": true,
474 | "dependencies": {
475 | "lodash": "^4.17.10"
476 | },
477 | "engines": {
478 | "node": ">= 4.0.0"
479 | }
480 | },
481 | "node_modules/eazy-logger": {
482 | "version": "3.1.0",
483 | "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.1.0.tgz",
484 | "integrity": "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==",
485 | "dev": true,
486 | "dependencies": {
487 | "tfunk": "^4.0.0"
488 | },
489 | "engines": {
490 | "node": ">= 0.8.0"
491 | }
492 | },
493 | "node_modules/ee-first": {
494 | "version": "1.1.1",
495 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
496 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
497 | "dev": true
498 | },
499 | "node_modules/emoji-regex": {
500 | "version": "8.0.0",
501 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
502 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
503 | "dev": true
504 | },
505 | "node_modules/encodeurl": {
506 | "version": "1.0.2",
507 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
508 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
509 | "dev": true,
510 | "engines": {
511 | "node": ">= 0.8"
512 | }
513 | },
514 | "node_modules/engine.io": {
515 | "version": "6.4.0",
516 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.0.tgz",
517 | "integrity": "sha512-OgxY1c/RuCSeO/rTr8DIFXx76IzUUft86R7/P7MMbbkuzeqJoTNw2lmeD91IyGz41QYleIIjWeMJGgug043sfQ==",
518 | "dev": true,
519 | "dependencies": {
520 | "@types/cookie": "^0.4.1",
521 | "@types/cors": "^2.8.12",
522 | "@types/node": ">=10.0.0",
523 | "accepts": "~1.3.4",
524 | "base64id": "2.0.0",
525 | "cookie": "~0.4.1",
526 | "cors": "~2.8.5",
527 | "debug": "~4.3.1",
528 | "engine.io-parser": "~5.0.3",
529 | "ws": "~8.11.0"
530 | },
531 | "engines": {
532 | "node": ">=10.0.0"
533 | }
534 | },
535 | "node_modules/engine.io-client": {
536 | "version": "6.4.0",
537 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz",
538 | "integrity": "sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==",
539 | "dev": true,
540 | "dependencies": {
541 | "@socket.io/component-emitter": "~3.1.0",
542 | "debug": "~4.3.1",
543 | "engine.io-parser": "~5.0.3",
544 | "ws": "~8.11.0",
545 | "xmlhttprequest-ssl": "~2.0.0"
546 | }
547 | },
548 | "node_modules/engine.io-client/node_modules/debug": {
549 | "version": "4.3.4",
550 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
551 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
552 | "dev": true,
553 | "dependencies": {
554 | "ms": "2.1.2"
555 | },
556 | "engines": {
557 | "node": ">=6.0"
558 | },
559 | "peerDependenciesMeta": {
560 | "supports-color": {
561 | "optional": true
562 | }
563 | }
564 | },
565 | "node_modules/engine.io-client/node_modules/ms": {
566 | "version": "2.1.2",
567 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
568 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
569 | "dev": true
570 | },
571 | "node_modules/engine.io-parser": {
572 | "version": "5.0.6",
573 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz",
574 | "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==",
575 | "dev": true,
576 | "engines": {
577 | "node": ">=10.0.0"
578 | }
579 | },
580 | "node_modules/engine.io/node_modules/debug": {
581 | "version": "4.3.4",
582 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
583 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
584 | "dev": true,
585 | "dependencies": {
586 | "ms": "2.1.2"
587 | },
588 | "engines": {
589 | "node": ">=6.0"
590 | },
591 | "peerDependenciesMeta": {
592 | "supports-color": {
593 | "optional": true
594 | }
595 | }
596 | },
597 | "node_modules/engine.io/node_modules/ms": {
598 | "version": "2.1.2",
599 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
600 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
601 | "dev": true
602 | },
603 | "node_modules/escalade": {
604 | "version": "3.1.1",
605 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
606 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
607 | "dev": true,
608 | "engines": {
609 | "node": ">=6"
610 | }
611 | },
612 | "node_modules/escape-html": {
613 | "version": "1.0.3",
614 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
615 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
616 | "dev": true
617 | },
618 | "node_modules/escape-string-regexp": {
619 | "version": "1.0.5",
620 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
621 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
622 | "dev": true,
623 | "engines": {
624 | "node": ">=0.8.0"
625 | }
626 | },
627 | "node_modules/etag": {
628 | "version": "1.8.1",
629 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
630 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
631 | "dev": true,
632 | "engines": {
633 | "node": ">= 0.6"
634 | }
635 | },
636 | "node_modules/eventemitter3": {
637 | "version": "4.0.7",
638 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
639 | "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
640 | "dev": true
641 | },
642 | "node_modules/fill-range": {
643 | "version": "7.0.1",
644 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
645 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
646 | "dev": true,
647 | "dependencies": {
648 | "to-regex-range": "^5.0.1"
649 | },
650 | "engines": {
651 | "node": ">=8"
652 | }
653 | },
654 | "node_modules/finalhandler": {
655 | "version": "1.1.0",
656 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
657 | "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==",
658 | "dev": true,
659 | "dependencies": {
660 | "debug": "2.6.9",
661 | "encodeurl": "~1.0.1",
662 | "escape-html": "~1.0.3",
663 | "on-finished": "~2.3.0",
664 | "parseurl": "~1.3.2",
665 | "statuses": "~1.3.1",
666 | "unpipe": "~1.0.0"
667 | },
668 | "engines": {
669 | "node": ">= 0.8"
670 | }
671 | },
672 | "node_modules/follow-redirects": {
673 | "version": "1.15.2",
674 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
675 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
676 | "dev": true,
677 | "funding": [
678 | {
679 | "type": "individual",
680 | "url": "https://github.com/sponsors/RubenVerborgh"
681 | }
682 | ],
683 | "engines": {
684 | "node": ">=4.0"
685 | },
686 | "peerDependenciesMeta": {
687 | "debug": {
688 | "optional": true
689 | }
690 | }
691 | },
692 | "node_modules/fresh": {
693 | "version": "0.5.2",
694 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
695 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
696 | "dev": true,
697 | "engines": {
698 | "node": ">= 0.6"
699 | }
700 | },
701 | "node_modules/fs-extra": {
702 | "version": "3.0.1",
703 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz",
704 | "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==",
705 | "dev": true,
706 | "dependencies": {
707 | "graceful-fs": "^4.1.2",
708 | "jsonfile": "^3.0.0",
709 | "universalify": "^0.1.0"
710 | }
711 | },
712 | "node_modules/fsevents": {
713 | "version": "2.3.2",
714 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
715 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
716 | "dev": true,
717 | "hasInstallScript": true,
718 | "optional": true,
719 | "os": [
720 | "darwin"
721 | ],
722 | "engines": {
723 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
724 | }
725 | },
726 | "node_modules/function-bind": {
727 | "version": "1.1.1",
728 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
729 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
730 | "dev": true
731 | },
732 | "node_modules/get-caller-file": {
733 | "version": "2.0.5",
734 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
735 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
736 | "dev": true,
737 | "engines": {
738 | "node": "6.* || 8.* || >= 10.*"
739 | }
740 | },
741 | "node_modules/get-intrinsic": {
742 | "version": "1.2.0",
743 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
744 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
745 | "dev": true,
746 | "dependencies": {
747 | "function-bind": "^1.1.1",
748 | "has": "^1.0.3",
749 | "has-symbols": "^1.0.3"
750 | },
751 | "funding": {
752 | "url": "https://github.com/sponsors/ljharb"
753 | }
754 | },
755 | "node_modules/glob-parent": {
756 | "version": "5.1.2",
757 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
758 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
759 | "dev": true,
760 | "dependencies": {
761 | "is-glob": "^4.0.1"
762 | },
763 | "engines": {
764 | "node": ">= 6"
765 | }
766 | },
767 | "node_modules/graceful-fs": {
768 | "version": "4.2.10",
769 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
770 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
771 | "dev": true
772 | },
773 | "node_modules/has": {
774 | "version": "1.0.3",
775 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
776 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
777 | "dev": true,
778 | "dependencies": {
779 | "function-bind": "^1.1.1"
780 | },
781 | "engines": {
782 | "node": ">= 0.4.0"
783 | }
784 | },
785 | "node_modules/has-ansi": {
786 | "version": "2.0.0",
787 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
788 | "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==",
789 | "dev": true,
790 | "dependencies": {
791 | "ansi-regex": "^2.0.0"
792 | },
793 | "engines": {
794 | "node": ">=0.10.0"
795 | }
796 | },
797 | "node_modules/has-symbols": {
798 | "version": "1.0.3",
799 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
800 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
801 | "dev": true,
802 | "engines": {
803 | "node": ">= 0.4"
804 | },
805 | "funding": {
806 | "url": "https://github.com/sponsors/ljharb"
807 | }
808 | },
809 | "node_modules/http-errors": {
810 | "version": "2.0.0",
811 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
812 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
813 | "dev": true,
814 | "dependencies": {
815 | "depd": "2.0.0",
816 | "inherits": "2.0.4",
817 | "setprototypeof": "1.2.0",
818 | "statuses": "2.0.1",
819 | "toidentifier": "1.0.1"
820 | },
821 | "engines": {
822 | "node": ">= 0.8"
823 | }
824 | },
825 | "node_modules/http-errors/node_modules/statuses": {
826 | "version": "2.0.1",
827 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
828 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
829 | "dev": true,
830 | "engines": {
831 | "node": ">= 0.8"
832 | }
833 | },
834 | "node_modules/http-proxy": {
835 | "version": "1.18.1",
836 | "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
837 | "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
838 | "dev": true,
839 | "dependencies": {
840 | "eventemitter3": "^4.0.0",
841 | "follow-redirects": "^1.0.0",
842 | "requires-port": "^1.0.0"
843 | },
844 | "engines": {
845 | "node": ">=8.0.0"
846 | }
847 | },
848 | "node_modules/iconv-lite": {
849 | "version": "0.4.24",
850 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
851 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
852 | "dev": true,
853 | "dependencies": {
854 | "safer-buffer": ">= 2.1.2 < 3"
855 | },
856 | "engines": {
857 | "node": ">=0.10.0"
858 | }
859 | },
860 | "node_modules/immutable": {
861 | "version": "3.8.2",
862 | "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz",
863 | "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==",
864 | "dev": true,
865 | "engines": {
866 | "node": ">=0.10.0"
867 | }
868 | },
869 | "node_modules/inherits": {
870 | "version": "2.0.4",
871 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
872 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
873 | "dev": true
874 | },
875 | "node_modules/is-binary-path": {
876 | "version": "2.1.0",
877 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
878 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
879 | "dev": true,
880 | "dependencies": {
881 | "binary-extensions": "^2.0.0"
882 | },
883 | "engines": {
884 | "node": ">=8"
885 | }
886 | },
887 | "node_modules/is-extglob": {
888 | "version": "2.1.1",
889 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
890 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
891 | "dev": true,
892 | "engines": {
893 | "node": ">=0.10.0"
894 | }
895 | },
896 | "node_modules/is-fullwidth-code-point": {
897 | "version": "3.0.0",
898 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
899 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
900 | "dev": true,
901 | "engines": {
902 | "node": ">=8"
903 | }
904 | },
905 | "node_modules/is-glob": {
906 | "version": "4.0.3",
907 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
908 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
909 | "dev": true,
910 | "dependencies": {
911 | "is-extglob": "^2.1.1"
912 | },
913 | "engines": {
914 | "node": ">=0.10.0"
915 | }
916 | },
917 | "node_modules/is-number": {
918 | "version": "7.0.0",
919 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
920 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
921 | "dev": true,
922 | "engines": {
923 | "node": ">=0.12.0"
924 | }
925 | },
926 | "node_modules/is-number-like": {
927 | "version": "1.0.8",
928 | "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz",
929 | "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==",
930 | "dev": true,
931 | "dependencies": {
932 | "lodash.isfinite": "^3.3.2"
933 | }
934 | },
935 | "node_modules/is-wsl": {
936 | "version": "1.1.0",
937 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
938 | "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==",
939 | "dev": true,
940 | "engines": {
941 | "node": ">=4"
942 | }
943 | },
944 | "node_modules/jsonfile": {
945 | "version": "3.0.1",
946 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz",
947 | "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==",
948 | "dev": true,
949 | "optionalDependencies": {
950 | "graceful-fs": "^4.1.6"
951 | }
952 | },
953 | "node_modules/limiter": {
954 | "version": "1.1.5",
955 | "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz",
956 | "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==",
957 | "dev": true
958 | },
959 | "node_modules/localtunnel": {
960 | "version": "2.0.2",
961 | "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz",
962 | "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==",
963 | "dev": true,
964 | "dependencies": {
965 | "axios": "0.21.4",
966 | "debug": "4.3.2",
967 | "openurl": "1.1.1",
968 | "yargs": "17.1.1"
969 | },
970 | "bin": {
971 | "lt": "bin/lt.js"
972 | },
973 | "engines": {
974 | "node": ">=8.3.0"
975 | }
976 | },
977 | "node_modules/localtunnel/node_modules/ansi-regex": {
978 | "version": "5.0.1",
979 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
980 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
981 | "dev": true,
982 | "engines": {
983 | "node": ">=8"
984 | }
985 | },
986 | "node_modules/localtunnel/node_modules/cliui": {
987 | "version": "7.0.4",
988 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
989 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
990 | "dev": true,
991 | "dependencies": {
992 | "string-width": "^4.2.0",
993 | "strip-ansi": "^6.0.0",
994 | "wrap-ansi": "^7.0.0"
995 | }
996 | },
997 | "node_modules/localtunnel/node_modules/debug": {
998 | "version": "4.3.2",
999 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
1000 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
1001 | "dev": true,
1002 | "dependencies": {
1003 | "ms": "2.1.2"
1004 | },
1005 | "engines": {
1006 | "node": ">=6.0"
1007 | },
1008 | "peerDependenciesMeta": {
1009 | "supports-color": {
1010 | "optional": true
1011 | }
1012 | }
1013 | },
1014 | "node_modules/localtunnel/node_modules/ms": {
1015 | "version": "2.1.2",
1016 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1017 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1018 | "dev": true
1019 | },
1020 | "node_modules/localtunnel/node_modules/strip-ansi": {
1021 | "version": "6.0.1",
1022 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1023 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1024 | "dev": true,
1025 | "dependencies": {
1026 | "ansi-regex": "^5.0.1"
1027 | },
1028 | "engines": {
1029 | "node": ">=8"
1030 | }
1031 | },
1032 | "node_modules/localtunnel/node_modules/yargs": {
1033 | "version": "17.1.1",
1034 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz",
1035 | "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==",
1036 | "dev": true,
1037 | "dependencies": {
1038 | "cliui": "^7.0.2",
1039 | "escalade": "^3.1.1",
1040 | "get-caller-file": "^2.0.5",
1041 | "require-directory": "^2.1.1",
1042 | "string-width": "^4.2.0",
1043 | "y18n": "^5.0.5",
1044 | "yargs-parser": "^20.2.2"
1045 | },
1046 | "engines": {
1047 | "node": ">=12"
1048 | }
1049 | },
1050 | "node_modules/localtunnel/node_modules/yargs-parser": {
1051 | "version": "20.2.9",
1052 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
1053 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
1054 | "dev": true,
1055 | "engines": {
1056 | "node": ">=10"
1057 | }
1058 | },
1059 | "node_modules/lodash": {
1060 | "version": "4.17.21",
1061 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
1062 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
1063 | "dev": true
1064 | },
1065 | "node_modules/lodash.isfinite": {
1066 | "version": "3.3.2",
1067 | "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz",
1068 | "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==",
1069 | "dev": true
1070 | },
1071 | "node_modules/micromatch": {
1072 | "version": "4.0.5",
1073 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
1074 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
1075 | "dev": true,
1076 | "dependencies": {
1077 | "braces": "^3.0.2",
1078 | "picomatch": "^2.3.1"
1079 | },
1080 | "engines": {
1081 | "node": ">=8.6"
1082 | }
1083 | },
1084 | "node_modules/mime": {
1085 | "version": "1.4.1",
1086 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
1087 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
1088 | "dev": true,
1089 | "bin": {
1090 | "mime": "cli.js"
1091 | }
1092 | },
1093 | "node_modules/mime-db": {
1094 | "version": "1.52.0",
1095 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1096 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1097 | "dev": true,
1098 | "engines": {
1099 | "node": ">= 0.6"
1100 | }
1101 | },
1102 | "node_modules/mime-types": {
1103 | "version": "2.1.35",
1104 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1105 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1106 | "dev": true,
1107 | "dependencies": {
1108 | "mime-db": "1.52.0"
1109 | },
1110 | "engines": {
1111 | "node": ">= 0.6"
1112 | }
1113 | },
1114 | "node_modules/minimatch": {
1115 | "version": "3.1.2",
1116 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1117 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1118 | "dev": true,
1119 | "dependencies": {
1120 | "brace-expansion": "^1.1.7"
1121 | },
1122 | "engines": {
1123 | "node": "*"
1124 | }
1125 | },
1126 | "node_modules/mitt": {
1127 | "version": "1.2.0",
1128 | "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz",
1129 | "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==",
1130 | "dev": true
1131 | },
1132 | "node_modules/ms": {
1133 | "version": "2.0.0",
1134 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1135 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
1136 | "dev": true
1137 | },
1138 | "node_modules/negotiator": {
1139 | "version": "0.6.3",
1140 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1141 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
1142 | "dev": true,
1143 | "engines": {
1144 | "node": ">= 0.6"
1145 | }
1146 | },
1147 | "node_modules/normalize-path": {
1148 | "version": "3.0.0",
1149 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1150 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1151 | "dev": true,
1152 | "engines": {
1153 | "node": ">=0.10.0"
1154 | }
1155 | },
1156 | "node_modules/object-assign": {
1157 | "version": "4.1.1",
1158 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1159 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1160 | "dev": true,
1161 | "engines": {
1162 | "node": ">=0.10.0"
1163 | }
1164 | },
1165 | "node_modules/object-inspect": {
1166 | "version": "1.12.3",
1167 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
1168 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
1169 | "dev": true,
1170 | "funding": {
1171 | "url": "https://github.com/sponsors/ljharb"
1172 | }
1173 | },
1174 | "node_modules/on-finished": {
1175 | "version": "2.3.0",
1176 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1177 | "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
1178 | "dev": true,
1179 | "dependencies": {
1180 | "ee-first": "1.1.1"
1181 | },
1182 | "engines": {
1183 | "node": ">= 0.8"
1184 | }
1185 | },
1186 | "node_modules/openurl": {
1187 | "version": "1.1.1",
1188 | "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz",
1189 | "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==",
1190 | "dev": true
1191 | },
1192 | "node_modules/opn": {
1193 | "version": "5.3.0",
1194 | "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz",
1195 | "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==",
1196 | "dev": true,
1197 | "dependencies": {
1198 | "is-wsl": "^1.1.0"
1199 | },
1200 | "engines": {
1201 | "node": ">=4"
1202 | }
1203 | },
1204 | "node_modules/parseurl": {
1205 | "version": "1.3.3",
1206 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1207 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1208 | "dev": true,
1209 | "engines": {
1210 | "node": ">= 0.8"
1211 | }
1212 | },
1213 | "node_modules/picomatch": {
1214 | "version": "2.3.1",
1215 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1216 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1217 | "dev": true,
1218 | "engines": {
1219 | "node": ">=8.6"
1220 | },
1221 | "funding": {
1222 | "url": "https://github.com/sponsors/jonschlinkert"
1223 | }
1224 | },
1225 | "node_modules/portscanner": {
1226 | "version": "2.2.0",
1227 | "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz",
1228 | "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==",
1229 | "dev": true,
1230 | "dependencies": {
1231 | "async": "^2.6.0",
1232 | "is-number-like": "^1.0.3"
1233 | },
1234 | "engines": {
1235 | "node": ">=0.4",
1236 | "npm": ">=1.0.0"
1237 | }
1238 | },
1239 | "node_modules/qs": {
1240 | "version": "6.11.0",
1241 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
1242 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
1243 | "dev": true,
1244 | "dependencies": {
1245 | "side-channel": "^1.0.4"
1246 | },
1247 | "engines": {
1248 | "node": ">=0.6"
1249 | },
1250 | "funding": {
1251 | "url": "https://github.com/sponsors/ljharb"
1252 | }
1253 | },
1254 | "node_modules/range-parser": {
1255 | "version": "1.2.1",
1256 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1257 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1258 | "dev": true,
1259 | "engines": {
1260 | "node": ">= 0.6"
1261 | }
1262 | },
1263 | "node_modules/raw-body": {
1264 | "version": "2.5.1",
1265 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
1266 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
1267 | "dev": true,
1268 | "dependencies": {
1269 | "bytes": "3.1.2",
1270 | "http-errors": "2.0.0",
1271 | "iconv-lite": "0.4.24",
1272 | "unpipe": "1.0.0"
1273 | },
1274 | "engines": {
1275 | "node": ">= 0.8"
1276 | }
1277 | },
1278 | "node_modules/readdirp": {
1279 | "version": "3.6.0",
1280 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1281 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1282 | "dev": true,
1283 | "dependencies": {
1284 | "picomatch": "^2.2.1"
1285 | },
1286 | "engines": {
1287 | "node": ">=8.10.0"
1288 | }
1289 | },
1290 | "node_modules/require-directory": {
1291 | "version": "2.1.1",
1292 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
1293 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
1294 | "dev": true,
1295 | "engines": {
1296 | "node": ">=0.10.0"
1297 | }
1298 | },
1299 | "node_modules/requires-port": {
1300 | "version": "1.0.0",
1301 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
1302 | "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
1303 | "dev": true
1304 | },
1305 | "node_modules/resp-modifier": {
1306 | "version": "6.0.2",
1307 | "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz",
1308 | "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==",
1309 | "dev": true,
1310 | "dependencies": {
1311 | "debug": "^2.2.0",
1312 | "minimatch": "^3.0.2"
1313 | },
1314 | "engines": {
1315 | "node": ">= 0.8.0"
1316 | }
1317 | },
1318 | "node_modules/rx": {
1319 | "version": "4.1.0",
1320 | "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz",
1321 | "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==",
1322 | "dev": true
1323 | },
1324 | "node_modules/rxjs": {
1325 | "version": "5.5.12",
1326 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz",
1327 | "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==",
1328 | "dev": true,
1329 | "dependencies": {
1330 | "symbol-observable": "1.0.1"
1331 | },
1332 | "engines": {
1333 | "npm": ">=2.0.0"
1334 | }
1335 | },
1336 | "node_modules/safer-buffer": {
1337 | "version": "2.1.2",
1338 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1339 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1340 | "dev": true
1341 | },
1342 | "node_modules/send": {
1343 | "version": "0.16.2",
1344 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
1345 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
1346 | "dev": true,
1347 | "dependencies": {
1348 | "debug": "2.6.9",
1349 | "depd": "~1.1.2",
1350 | "destroy": "~1.0.4",
1351 | "encodeurl": "~1.0.2",
1352 | "escape-html": "~1.0.3",
1353 | "etag": "~1.8.1",
1354 | "fresh": "0.5.2",
1355 | "http-errors": "~1.6.2",
1356 | "mime": "1.4.1",
1357 | "ms": "2.0.0",
1358 | "on-finished": "~2.3.0",
1359 | "range-parser": "~1.2.0",
1360 | "statuses": "~1.4.0"
1361 | },
1362 | "engines": {
1363 | "node": ">= 0.8.0"
1364 | }
1365 | },
1366 | "node_modules/send/node_modules/depd": {
1367 | "version": "1.1.2",
1368 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
1369 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
1370 | "dev": true,
1371 | "engines": {
1372 | "node": ">= 0.6"
1373 | }
1374 | },
1375 | "node_modules/send/node_modules/http-errors": {
1376 | "version": "1.6.3",
1377 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
1378 | "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
1379 | "dev": true,
1380 | "dependencies": {
1381 | "depd": "~1.1.2",
1382 | "inherits": "2.0.3",
1383 | "setprototypeof": "1.1.0",
1384 | "statuses": ">= 1.4.0 < 2"
1385 | },
1386 | "engines": {
1387 | "node": ">= 0.6"
1388 | }
1389 | },
1390 | "node_modules/send/node_modules/inherits": {
1391 | "version": "2.0.3",
1392 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1393 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
1394 | "dev": true
1395 | },
1396 | "node_modules/send/node_modules/setprototypeof": {
1397 | "version": "1.1.0",
1398 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
1399 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
1400 | "dev": true
1401 | },
1402 | "node_modules/send/node_modules/statuses": {
1403 | "version": "1.4.0",
1404 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
1405 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
1406 | "dev": true,
1407 | "engines": {
1408 | "node": ">= 0.6"
1409 | }
1410 | },
1411 | "node_modules/serve-index": {
1412 | "version": "1.9.1",
1413 | "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
1414 | "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
1415 | "dev": true,
1416 | "dependencies": {
1417 | "accepts": "~1.3.4",
1418 | "batch": "0.6.1",
1419 | "debug": "2.6.9",
1420 | "escape-html": "~1.0.3",
1421 | "http-errors": "~1.6.2",
1422 | "mime-types": "~2.1.17",
1423 | "parseurl": "~1.3.2"
1424 | },
1425 | "engines": {
1426 | "node": ">= 0.8.0"
1427 | }
1428 | },
1429 | "node_modules/serve-index/node_modules/depd": {
1430 | "version": "1.1.2",
1431 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
1432 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
1433 | "dev": true,
1434 | "engines": {
1435 | "node": ">= 0.6"
1436 | }
1437 | },
1438 | "node_modules/serve-index/node_modules/http-errors": {
1439 | "version": "1.6.3",
1440 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
1441 | "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
1442 | "dev": true,
1443 | "dependencies": {
1444 | "depd": "~1.1.2",
1445 | "inherits": "2.0.3",
1446 | "setprototypeof": "1.1.0",
1447 | "statuses": ">= 1.4.0 < 2"
1448 | },
1449 | "engines": {
1450 | "node": ">= 0.6"
1451 | }
1452 | },
1453 | "node_modules/serve-index/node_modules/inherits": {
1454 | "version": "2.0.3",
1455 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1456 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
1457 | "dev": true
1458 | },
1459 | "node_modules/serve-index/node_modules/setprototypeof": {
1460 | "version": "1.1.0",
1461 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
1462 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
1463 | "dev": true
1464 | },
1465 | "node_modules/serve-index/node_modules/statuses": {
1466 | "version": "1.5.0",
1467 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
1468 | "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
1469 | "dev": true,
1470 | "engines": {
1471 | "node": ">= 0.6"
1472 | }
1473 | },
1474 | "node_modules/serve-static": {
1475 | "version": "1.13.2",
1476 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
1477 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
1478 | "dev": true,
1479 | "dependencies": {
1480 | "encodeurl": "~1.0.2",
1481 | "escape-html": "~1.0.3",
1482 | "parseurl": "~1.3.2",
1483 | "send": "0.16.2"
1484 | },
1485 | "engines": {
1486 | "node": ">= 0.8.0"
1487 | }
1488 | },
1489 | "node_modules/server-destroy": {
1490 | "version": "1.0.1",
1491 | "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
1492 | "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==",
1493 | "dev": true
1494 | },
1495 | "node_modules/setprototypeof": {
1496 | "version": "1.2.0",
1497 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1498 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1499 | "dev": true
1500 | },
1501 | "node_modules/side-channel": {
1502 | "version": "1.0.4",
1503 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
1504 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1505 | "dev": true,
1506 | "dependencies": {
1507 | "call-bind": "^1.0.0",
1508 | "get-intrinsic": "^1.0.2",
1509 | "object-inspect": "^1.9.0"
1510 | },
1511 | "funding": {
1512 | "url": "https://github.com/sponsors/ljharb"
1513 | }
1514 | },
1515 | "node_modules/socket.io": {
1516 | "version": "4.6.0",
1517 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.0.tgz",
1518 | "integrity": "sha512-b65bp6INPk/BMMrIgVvX12x3Q+NqlGqSlTuvKQWt0BUJ3Hyy3JangBl7fEoWZTXbOKlCqNPbQ6MbWgok/km28w==",
1519 | "dev": true,
1520 | "dependencies": {
1521 | "accepts": "~1.3.4",
1522 | "base64id": "~2.0.0",
1523 | "debug": "~4.3.2",
1524 | "engine.io": "~6.4.0",
1525 | "socket.io-adapter": "~2.5.2",
1526 | "socket.io-parser": "~4.2.1"
1527 | },
1528 | "engines": {
1529 | "node": ">=10.0.0"
1530 | }
1531 | },
1532 | "node_modules/socket.io-adapter": {
1533 | "version": "2.5.2",
1534 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz",
1535 | "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==",
1536 | "dev": true,
1537 | "dependencies": {
1538 | "ws": "~8.11.0"
1539 | }
1540 | },
1541 | "node_modules/socket.io-client": {
1542 | "version": "4.6.0",
1543 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.0.tgz",
1544 | "integrity": "sha512-2XOp18xnGghUICSd5ziUIS4rB0dhr6S8OvAps8y+HhOjFQlqGcf+FIh6fCIsKKZyWFxJeFPrZRNPGsHDTsz1Ug==",
1545 | "dev": true,
1546 | "dependencies": {
1547 | "@socket.io/component-emitter": "~3.1.0",
1548 | "debug": "~4.3.2",
1549 | "engine.io-client": "~6.4.0",
1550 | "socket.io-parser": "~4.2.1"
1551 | },
1552 | "engines": {
1553 | "node": ">=10.0.0"
1554 | }
1555 | },
1556 | "node_modules/socket.io-client/node_modules/debug": {
1557 | "version": "4.3.4",
1558 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1559 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1560 | "dev": true,
1561 | "dependencies": {
1562 | "ms": "2.1.2"
1563 | },
1564 | "engines": {
1565 | "node": ">=6.0"
1566 | },
1567 | "peerDependenciesMeta": {
1568 | "supports-color": {
1569 | "optional": true
1570 | }
1571 | }
1572 | },
1573 | "node_modules/socket.io-client/node_modules/ms": {
1574 | "version": "2.1.2",
1575 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1576 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1577 | "dev": true
1578 | },
1579 | "node_modules/socket.io-parser": {
1580 | "version": "4.2.2",
1581 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz",
1582 | "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==",
1583 | "dev": true,
1584 | "dependencies": {
1585 | "@socket.io/component-emitter": "~3.1.0",
1586 | "debug": "~4.3.1"
1587 | },
1588 | "engines": {
1589 | "node": ">=10.0.0"
1590 | }
1591 | },
1592 | "node_modules/socket.io-parser/node_modules/debug": {
1593 | "version": "4.3.4",
1594 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1595 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1596 | "dev": true,
1597 | "dependencies": {
1598 | "ms": "2.1.2"
1599 | },
1600 | "engines": {
1601 | "node": ">=6.0"
1602 | },
1603 | "peerDependenciesMeta": {
1604 | "supports-color": {
1605 | "optional": true
1606 | }
1607 | }
1608 | },
1609 | "node_modules/socket.io-parser/node_modules/ms": {
1610 | "version": "2.1.2",
1611 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1612 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1613 | "dev": true
1614 | },
1615 | "node_modules/socket.io/node_modules/debug": {
1616 | "version": "4.3.4",
1617 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1618 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1619 | "dev": true,
1620 | "dependencies": {
1621 | "ms": "2.1.2"
1622 | },
1623 | "engines": {
1624 | "node": ">=6.0"
1625 | },
1626 | "peerDependenciesMeta": {
1627 | "supports-color": {
1628 | "optional": true
1629 | }
1630 | }
1631 | },
1632 | "node_modules/socket.io/node_modules/ms": {
1633 | "version": "2.1.2",
1634 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1635 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1636 | "dev": true
1637 | },
1638 | "node_modules/statuses": {
1639 | "version": "1.3.1",
1640 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
1641 | "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==",
1642 | "dev": true,
1643 | "engines": {
1644 | "node": ">= 0.6"
1645 | }
1646 | },
1647 | "node_modules/stream-throttle": {
1648 | "version": "0.1.3",
1649 | "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz",
1650 | "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==",
1651 | "dev": true,
1652 | "dependencies": {
1653 | "commander": "^2.2.0",
1654 | "limiter": "^1.0.5"
1655 | },
1656 | "bin": {
1657 | "throttleproxy": "bin/throttleproxy.js"
1658 | },
1659 | "engines": {
1660 | "node": ">= 0.10.0"
1661 | }
1662 | },
1663 | "node_modules/string-width": {
1664 | "version": "4.2.3",
1665 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
1666 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
1667 | "dev": true,
1668 | "dependencies": {
1669 | "emoji-regex": "^8.0.0",
1670 | "is-fullwidth-code-point": "^3.0.0",
1671 | "strip-ansi": "^6.0.1"
1672 | },
1673 | "engines": {
1674 | "node": ">=8"
1675 | }
1676 | },
1677 | "node_modules/string-width/node_modules/ansi-regex": {
1678 | "version": "5.0.1",
1679 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
1680 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
1681 | "dev": true,
1682 | "engines": {
1683 | "node": ">=8"
1684 | }
1685 | },
1686 | "node_modules/string-width/node_modules/strip-ansi": {
1687 | "version": "6.0.1",
1688 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1689 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1690 | "dev": true,
1691 | "dependencies": {
1692 | "ansi-regex": "^5.0.1"
1693 | },
1694 | "engines": {
1695 | "node": ">=8"
1696 | }
1697 | },
1698 | "node_modules/strip-ansi": {
1699 | "version": "3.0.1",
1700 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1701 | "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
1702 | "dev": true,
1703 | "dependencies": {
1704 | "ansi-regex": "^2.0.0"
1705 | },
1706 | "engines": {
1707 | "node": ">=0.10.0"
1708 | }
1709 | },
1710 | "node_modules/supports-color": {
1711 | "version": "2.0.0",
1712 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
1713 | "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
1714 | "dev": true,
1715 | "engines": {
1716 | "node": ">=0.8.0"
1717 | }
1718 | },
1719 | "node_modules/symbol-observable": {
1720 | "version": "1.0.1",
1721 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz",
1722 | "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==",
1723 | "dev": true,
1724 | "engines": {
1725 | "node": ">=0.10.0"
1726 | }
1727 | },
1728 | "node_modules/tfunk": {
1729 | "version": "4.0.0",
1730 | "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-4.0.0.tgz",
1731 | "integrity": "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==",
1732 | "dev": true,
1733 | "dependencies": {
1734 | "chalk": "^1.1.3",
1735 | "dlv": "^1.1.3"
1736 | }
1737 | },
1738 | "node_modules/to-regex-range": {
1739 | "version": "5.0.1",
1740 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1741 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1742 | "dev": true,
1743 | "dependencies": {
1744 | "is-number": "^7.0.0"
1745 | },
1746 | "engines": {
1747 | "node": ">=8.0"
1748 | }
1749 | },
1750 | "node_modules/toidentifier": {
1751 | "version": "1.0.1",
1752 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1753 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1754 | "dev": true,
1755 | "engines": {
1756 | "node": ">=0.6"
1757 | }
1758 | },
1759 | "node_modules/typescript": {
1760 | "version": "4.9.5",
1761 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
1762 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
1763 | "dev": true,
1764 | "bin": {
1765 | "tsc": "bin/tsc",
1766 | "tsserver": "bin/tsserver"
1767 | },
1768 | "engines": {
1769 | "node": ">=4.2.0"
1770 | }
1771 | },
1772 | "node_modules/ua-parser-js": {
1773 | "version": "1.0.2",
1774 | "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz",
1775 | "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==",
1776 | "dev": true,
1777 | "funding": [
1778 | {
1779 | "type": "opencollective",
1780 | "url": "https://opencollective.com/ua-parser-js"
1781 | },
1782 | {
1783 | "type": "paypal",
1784 | "url": "https://paypal.me/faisalman"
1785 | }
1786 | ],
1787 | "engines": {
1788 | "node": "*"
1789 | }
1790 | },
1791 | "node_modules/universalify": {
1792 | "version": "0.1.2",
1793 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
1794 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
1795 | "dev": true,
1796 | "engines": {
1797 | "node": ">= 4.0.0"
1798 | }
1799 | },
1800 | "node_modules/unpipe": {
1801 | "version": "1.0.0",
1802 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1803 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1804 | "dev": true,
1805 | "engines": {
1806 | "node": ">= 0.8"
1807 | }
1808 | },
1809 | "node_modules/utils-merge": {
1810 | "version": "1.0.1",
1811 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1812 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1813 | "dev": true,
1814 | "engines": {
1815 | "node": ">= 0.4.0"
1816 | }
1817 | },
1818 | "node_modules/vary": {
1819 | "version": "1.1.2",
1820 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1821 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1822 | "dev": true,
1823 | "engines": {
1824 | "node": ">= 0.8"
1825 | }
1826 | },
1827 | "node_modules/wrap-ansi": {
1828 | "version": "7.0.0",
1829 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
1830 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
1831 | "dev": true,
1832 | "dependencies": {
1833 | "ansi-styles": "^4.0.0",
1834 | "string-width": "^4.1.0",
1835 | "strip-ansi": "^6.0.0"
1836 | },
1837 | "engines": {
1838 | "node": ">=10"
1839 | },
1840 | "funding": {
1841 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
1842 | }
1843 | },
1844 | "node_modules/wrap-ansi/node_modules/ansi-regex": {
1845 | "version": "5.0.1",
1846 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
1847 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
1848 | "dev": true,
1849 | "engines": {
1850 | "node": ">=8"
1851 | }
1852 | },
1853 | "node_modules/wrap-ansi/node_modules/ansi-styles": {
1854 | "version": "4.3.0",
1855 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
1856 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
1857 | "dev": true,
1858 | "dependencies": {
1859 | "color-convert": "^2.0.1"
1860 | },
1861 | "engines": {
1862 | "node": ">=8"
1863 | },
1864 | "funding": {
1865 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1866 | }
1867 | },
1868 | "node_modules/wrap-ansi/node_modules/strip-ansi": {
1869 | "version": "6.0.1",
1870 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1871 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1872 | "dev": true,
1873 | "dependencies": {
1874 | "ansi-regex": "^5.0.1"
1875 | },
1876 | "engines": {
1877 | "node": ">=8"
1878 | }
1879 | },
1880 | "node_modules/ws": {
1881 | "version": "8.11.0",
1882 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
1883 | "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
1884 | "dev": true,
1885 | "engines": {
1886 | "node": ">=10.0.0"
1887 | },
1888 | "peerDependencies": {
1889 | "bufferutil": "^4.0.1",
1890 | "utf-8-validate": "^5.0.2"
1891 | },
1892 | "peerDependenciesMeta": {
1893 | "bufferutil": {
1894 | "optional": true
1895 | },
1896 | "utf-8-validate": {
1897 | "optional": true
1898 | }
1899 | }
1900 | },
1901 | "node_modules/xmlhttprequest-ssl": {
1902 | "version": "2.0.0",
1903 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz",
1904 | "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==",
1905 | "dev": true,
1906 | "engines": {
1907 | "node": ">=0.4.0"
1908 | }
1909 | },
1910 | "node_modules/y18n": {
1911 | "version": "5.0.8",
1912 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
1913 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
1914 | "dev": true,
1915 | "engines": {
1916 | "node": ">=10"
1917 | }
1918 | },
1919 | "node_modules/yargs": {
1920 | "version": "17.7.0",
1921 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.0.tgz",
1922 | "integrity": "sha512-dwqOPg5trmrre9+v8SUo2q/hAwyKoVfu8OC1xPHKJGNdxAvPl4sKxL4vBnh3bQz/ZvvGAFeA5H3ou2kcOY8sQQ==",
1923 | "dev": true,
1924 | "dependencies": {
1925 | "cliui": "^8.0.1",
1926 | "escalade": "^3.1.1",
1927 | "get-caller-file": "^2.0.5",
1928 | "require-directory": "^2.1.1",
1929 | "string-width": "^4.2.3",
1930 | "y18n": "^5.0.5",
1931 | "yargs-parser": "^21.1.1"
1932 | },
1933 | "engines": {
1934 | "node": ">=12"
1935 | }
1936 | },
1937 | "node_modules/yargs-parser": {
1938 | "version": "21.1.1",
1939 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
1940 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
1941 | "dev": true,
1942 | "engines": {
1943 | "node": ">=12"
1944 | }
1945 | }
1946 | }
1947 | }
1948 |
--------------------------------------------------------------------------------
/preclass/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "gestures",
3 | "version": "0.0.1",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "browser-sync start --server --files src/*.js",
8 | "test": "echo \"Error: no test specified\" && exit 1"
9 | },
10 | "keywords": [],
11 | "author": "",
12 | "license": "ISC",
13 | "devDependencies": {
14 | "browser-sync": "^2.27.11"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/preclass/src/gestures.js:
--------------------------------------------------------------------------------
1 | const { GestureDescription, Finger, FingerCurl, FingerDirection } = window.fp
2 |
3 | const rockGesture = new GestureDescription('rock') // ✊️
4 | const paperGesture = new GestureDescription('paper') // 🖐
5 | const scissorsGesture = new GestureDescription('scissors') // ✌️
6 | const dontGesture = new GestureDescription('dont') // ✌️
7 |
8 |
9 | // Rock
10 | // -----------------------------------------------------------------------------
11 |
12 | // thumb: half curled
13 | // accept no curl with a bit lower confidence
14 | rockGesture.addCurl(Finger.Thumb, FingerCurl.HalfCurl, 1.0)
15 | rockGesture.addCurl(Finger.Thumb, FingerCurl.NoCurl, 0.5)
16 |
17 | // all other fingers: curled
18 | for (let finger of [Finger.Index, Finger.Middle, Finger.Ring, Finger.Pinky]) {
19 | rockGesture.addCurl(finger, FingerCurl.FullCurl, 1.0)
20 | rockGesture.addCurl(finger, FingerCurl.HalfCurl, 0.9)
21 | }
22 |
23 |
24 | // Paper
25 | // -----------------------------------------------------------------------------
26 |
27 | // no finger should be curled
28 | for (let finger of Finger.all) {
29 | paperGesture.addCurl(finger, FingerCurl.NoCurl, 1.0)
30 | }
31 |
32 |
33 | // Scissors
34 | //------------------------------------------------------------------------------
35 |
36 | // index and middle finger: stretched out
37 | scissorsGesture.addCurl(Finger.Index, FingerCurl.NoCurl, 1.0)
38 | scissorsGesture.addCurl(Finger.Middle, FingerCurl.NoCurl, 1.0)
39 |
40 | // ring: curled
41 | scissorsGesture.addCurl(Finger.Ring, FingerCurl.FullCurl, 1.0)
42 | scissorsGesture.addCurl(Finger.Ring, FingerCurl.HalfCurl, 0.9)
43 |
44 | // pinky: curled
45 | scissorsGesture.addCurl(Finger.Pinky, FingerCurl.FullCurl, 1.0)
46 | scissorsGesture.addCurl(Finger.Pinky, FingerCurl.HalfCurl, 0.9)
47 |
48 |
49 | // dontGesture🙅
50 | //------------------------------------------------------------------------------
51 | for (let finger of Finger.all) {
52 |
53 | dontGesture.addCurl(finger, FingerCurl.NoCurl, 1.0)
54 | dontGesture.addCurl(finger, FingerCurl.HalfCurl, 0.8)
55 | dontGesture.addDirection(finger, FingerDirection.DiagonalUpRight, 1.0)
56 | dontGesture.addDirection(finger, FingerDirection.DiagonalUpLeft, 1.0)
57 |
58 | dontGesture.addDirection(finger, FingerDirection.HorizontalRight, 1.0)
59 | dontGesture.addDirection(finger, FingerDirection.HorizontalLeft, 1.0)
60 | }
61 |
62 | const gestures = [
63 | rockGesture, paperGesture, scissorsGesture,
64 | dontGesture
65 | ]
66 | export {
67 | gestures
68 | }
69 |
--------------------------------------------------------------------------------
/preclass/src/index.js:
--------------------------------------------------------------------------------
1 | import { gestures } from "./gestures.js"
2 |
3 | const config = {
4 | video: { width: 640, height: 480, fps: 30 }
5 | }
6 |
7 | const landmarkColors = {
8 | thumb: 'red',
9 | index: 'blue',
10 | middle: 'yellow',
11 | ring: 'green',
12 | pinky: 'pink',
13 | wrist: 'white'
14 | }
15 |
16 | const gestureStrings = {
17 | 'thumbs_up': '👍',
18 | 'victory': '✌🏻',
19 | 'rock': '👊🏻',
20 | 'paper': '🖐',
21 | 'scissors': '✌🏻',
22 | 'dont': '🙅'
23 | }
24 | const base = ['Horizontal ', 'Diagonal Up ']
25 | const dont = {
26 | left: [...base].map(i => i.concat(`Right`)),
27 | right: [...base].map(i => i.concat(`Left`))
28 | }
29 |
30 | async function createDetector() {
31 | return window.handPoseDetection.createDetector(
32 | window.handPoseDetection.SupportedModels.MediaPipeHands,
33 | {
34 | runtime: "mediapipe",
35 | modelType: "full",
36 | maxHands: 2,
37 | solutionPath: `https://cdn.jsdelivr.net/npm/@mediapipe/hands@0.4.1646424915`,
38 | }
39 | )
40 | }
41 |
42 | async function main() {
43 |
44 | const video = document.querySelector("#pose-video")
45 | const canvas = document.querySelector("#pose-canvas")
46 | const ctx = canvas.getContext("2d")
47 |
48 | const resultLayer = {
49 | right: document.querySelector("#pose-result-right"),
50 | left: document.querySelector("#pose-result-left")
51 | }
52 | // configure gesture estimator
53 | // add "✌🏻" and "👍" as sample gestures
54 | const knownGestures = [
55 | fp.Gestures.VictoryGesture,
56 | fp.Gestures.ThumbsUpGesture,
57 | ...gestures
58 | ]
59 | const GE = new fp.GestureEstimator(knownGestures)
60 | // load handpose model
61 | const detector = await createDetector()
62 | console.log("mediaPose model loaded")
63 |
64 | const pair = new Set()
65 | function checkGestureCombination(chosenHand, poseData) {
66 | const addToPairIfCorrect = (chosenHand) => {
67 | const containsHand = poseData.some(finger => dont[chosenHand].includes(finger[2]))
68 | if (!containsHand) return
69 | pair.add(chosenHand)
70 | }
71 |
72 |
73 | addToPairIfCorrect(chosenHand)
74 |
75 | if (pair.size !== 2) return
76 | resultLayer.left.innerText = resultLayer.right.innerText = gestureStrings.dont
77 | pair.clear()
78 | }
79 | // main estimation loop
80 | const estimateHands = async () => {
81 |
82 | // clear canvas overlay
83 | ctx.clearRect(0, 0, config.video.width, config.video.height)
84 | resultLayer.right.innerText = ''
85 | resultLayer.left.innerText = ''
86 |
87 | // get hand landmarks from video
88 | const hands = await detector.estimateHands(video, {
89 | flipHorizontal: true
90 | })
91 |
92 | for (const hand of hands) {
93 | for (const keypoint of hand.keypoints) {
94 | const name = keypoint.name.split('_')[0].toString().toLowerCase()
95 | const color = landmarkColors[name]
96 | drawPoint(ctx, keypoint.x, keypoint.y, 3, color)
97 | }
98 |
99 |
100 | const keypoints3D = hand.keypoints3D.map(keypoint => [keypoint.x, keypoint.y, keypoint.z])
101 | const prediction = GE.estimate(keypoints3D, 8.5)
102 | if (prediction.gestures.length === 0) {
103 | updateDebugInfo(prediction.poseData, 'left')
104 | }
105 |
106 | if (!prediction.gestures.length) continue
107 |
108 |
109 | // find gesture with highest match score
110 | const result = prediction.gestures.reduce((p, c) => (p.score > c.score) ? p : c)
111 | const found = gestureStrings[result.name]
112 | const chosenHand = hand.handedness.toLowerCase()
113 | updateDebugInfo(prediction.poseData, chosenHand)
114 |
115 | if (found !== gestureStrings.dont) {
116 | resultLayer[chosenHand].innerText = found
117 | continue
118 | }
119 |
120 | checkGestureCombination(chosenHand, prediction.poseData)
121 |
122 | }
123 | // ...and so on
124 | setTimeout(() => { estimateHands() }, 1000 / config.video.fps)
125 | }
126 |
127 |
128 | estimateHands()
129 | console.log("Starting predictions")
130 | }
131 |
132 | async function initCamera(width, height, fps) {
133 |
134 | const constraints = {
135 | audio: false,
136 | video: {
137 | facingMode: "user",
138 | width: width,
139 | height: height,
140 | frameRate: { max: fps }
141 | }
142 | }
143 |
144 | const video = document.querySelector("#pose-video")
145 | video.width = width
146 | video.height = height
147 |
148 | // get video stream
149 | const stream = await navigator.mediaDevices.getUserMedia(constraints)
150 | video.srcObject = stream
151 |
152 | return new Promise(resolve => {
153 | video.onloadedmetadata = () => { resolve(video) }
154 | })
155 | }
156 |
157 | function drawPoint(ctx, x, y, r, color) {
158 | ctx.beginPath()
159 | ctx.arc(x, y, r, 0, 2 * Math.PI)
160 | ctx.fillStyle = color
161 | ctx.fill()
162 | }
163 |
164 | function updateDebugInfo(data, hand) {
165 | const summaryTable = `#summary-${hand}`
166 | for (let fingerIdx in data) {
167 | document.querySelector(`${summaryTable} span#curl-${fingerIdx}`).innerHTML = data[fingerIdx][1]
168 | document.querySelector(`${summaryTable} span#dir-${fingerIdx}`).innerHTML = data[fingerIdx][2]
169 | }
170 | }
171 |
172 | window.addEventListener("DOMContentLoaded", () => {
173 |
174 | initCamera(
175 | config.video.width, config.video.height, config.video.fps
176 | ).then(video => {
177 | video.play()
178 | video.addEventListener("loadeddata", event => {
179 | console.log("Camera is ready")
180 | main()
181 | })
182 | })
183 |
184 | const canvas = document.querySelector("#pose-canvas")
185 | canvas.width = config.video.width
186 | canvas.height = config.video.height
187 | console.log("Canvas initialized")
188 | })
--------------------------------------------------------------------------------
/recorded/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "window.zoomLevel": 3
3 | }
--------------------------------------------------------------------------------
/recorded/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | FingerPose Example
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
Left Hand
108 |
109 |
110 |
111 | Idx |
112 | Finger |
113 | Curl |
114 | Direction |
115 |
116 |
117 |
118 |
119 | 0 |
120 | Thumb |
121 | - |
122 | - |
123 |
124 |
125 | 1 |
126 | Index |
127 | - |
128 | - |
129 |
130 |
131 | 2 |
132 | Middle |
133 | - |
134 | - |
135 |
136 |
137 | 3 |
138 | Ring |
139 | - |
140 | - |
141 |
142 |
143 | 4 |
144 | Pinky |
145 | - |
146 | - |
147 |
148 |
149 |
150 |
151 |
Right Hand
152 |
153 |
154 |
155 | Idx |
156 | Finger |
157 | Curl |
158 | Direction |
159 |
160 |
161 |
162 |
163 | 0 |
164 | Thumb |
165 | - |
166 | - |
167 |
168 |
169 | 1 |
170 | Index |
171 | - |
172 | - |
173 |
174 |
175 | 2 |
176 | Middle |
177 | - |
178 | - |
179 |
180 |
181 | 3 |
182 | Ring |
183 | - |
184 | - |
185 |
186 |
187 | 4 |
188 | Pinky |
189 | - |
190 | - |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
--------------------------------------------------------------------------------
/recorded/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "recorded",
3 | "version": "0.0.1",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "recorded",
9 | "version": "0.0.1",
10 | "license": "ISC",
11 | "devDependencies": {
12 | "browser-sync": "^2.27.11"
13 | }
14 | },
15 | "node_modules/@socket.io/component-emitter": {
16 | "version": "3.1.0",
17 | "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
18 | "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==",
19 | "dev": true
20 | },
21 | "node_modules/@types/cookie": {
22 | "version": "0.4.1",
23 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
24 | "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==",
25 | "dev": true
26 | },
27 | "node_modules/@types/cors": {
28 | "version": "2.8.13",
29 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz",
30 | "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==",
31 | "dev": true,
32 | "dependencies": {
33 | "@types/node": "*"
34 | }
35 | },
36 | "node_modules/@types/node": {
37 | "version": "18.13.0",
38 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz",
39 | "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==",
40 | "dev": true
41 | },
42 | "node_modules/accepts": {
43 | "version": "1.3.8",
44 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
45 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
46 | "dev": true,
47 | "dependencies": {
48 | "mime-types": "~2.1.34",
49 | "negotiator": "0.6.3"
50 | },
51 | "engines": {
52 | "node": ">= 0.6"
53 | }
54 | },
55 | "node_modules/ansi-regex": {
56 | "version": "2.1.1",
57 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
58 | "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
59 | "dev": true,
60 | "engines": {
61 | "node": ">=0.10.0"
62 | }
63 | },
64 | "node_modules/ansi-styles": {
65 | "version": "2.2.1",
66 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
67 | "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
68 | "dev": true,
69 | "engines": {
70 | "node": ">=0.10.0"
71 | }
72 | },
73 | "node_modules/anymatch": {
74 | "version": "3.1.3",
75 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
76 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
77 | "dev": true,
78 | "dependencies": {
79 | "normalize-path": "^3.0.0",
80 | "picomatch": "^2.0.4"
81 | },
82 | "engines": {
83 | "node": ">= 8"
84 | }
85 | },
86 | "node_modules/async": {
87 | "version": "2.6.4",
88 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
89 | "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
90 | "dev": true,
91 | "dependencies": {
92 | "lodash": "^4.17.14"
93 | }
94 | },
95 | "node_modules/async-each-series": {
96 | "version": "0.1.1",
97 | "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz",
98 | "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==",
99 | "dev": true,
100 | "engines": {
101 | "node": ">=0.8.0"
102 | }
103 | },
104 | "node_modules/axios": {
105 | "version": "0.21.4",
106 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
107 | "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
108 | "dev": true,
109 | "dependencies": {
110 | "follow-redirects": "^1.14.0"
111 | }
112 | },
113 | "node_modules/balanced-match": {
114 | "version": "1.0.2",
115 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
116 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
117 | "dev": true
118 | },
119 | "node_modules/base64id": {
120 | "version": "2.0.0",
121 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
122 | "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
123 | "dev": true,
124 | "engines": {
125 | "node": "^4.5.0 || >= 5.9"
126 | }
127 | },
128 | "node_modules/batch": {
129 | "version": "0.6.1",
130 | "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
131 | "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
132 | "dev": true
133 | },
134 | "node_modules/binary-extensions": {
135 | "version": "2.2.0",
136 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
137 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
138 | "dev": true,
139 | "engines": {
140 | "node": ">=8"
141 | }
142 | },
143 | "node_modules/brace-expansion": {
144 | "version": "1.1.11",
145 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
146 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
147 | "dev": true,
148 | "dependencies": {
149 | "balanced-match": "^1.0.0",
150 | "concat-map": "0.0.1"
151 | }
152 | },
153 | "node_modules/braces": {
154 | "version": "3.0.2",
155 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
156 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
157 | "dev": true,
158 | "dependencies": {
159 | "fill-range": "^7.0.1"
160 | },
161 | "engines": {
162 | "node": ">=8"
163 | }
164 | },
165 | "node_modules/browser-sync": {
166 | "version": "2.27.11",
167 | "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.27.11.tgz",
168 | "integrity": "sha512-U5f9u97OYJH66T0MGWWzG9rOQTW6ZmDMj97vsmtqwNS03JAwdLVES8eel2lD3rvAqQCNAFqaJ74NMacBI57vJg==",
169 | "dev": true,
170 | "dependencies": {
171 | "browser-sync-client": "^2.27.11",
172 | "browser-sync-ui": "^2.27.11",
173 | "bs-recipes": "1.3.4",
174 | "bs-snippet-injector": "^2.0.1",
175 | "chokidar": "^3.5.1",
176 | "connect": "3.6.6",
177 | "connect-history-api-fallback": "^1",
178 | "dev-ip": "^1.0.1",
179 | "easy-extender": "^2.3.4",
180 | "eazy-logger": "3.1.0",
181 | "etag": "^1.8.1",
182 | "fresh": "^0.5.2",
183 | "fs-extra": "3.0.1",
184 | "http-proxy": "^1.18.1",
185 | "immutable": "^3",
186 | "localtunnel": "^2.0.1",
187 | "micromatch": "^4.0.2",
188 | "opn": "5.3.0",
189 | "portscanner": "2.2.0",
190 | "qs": "^6.11.0",
191 | "raw-body": "^2.3.2",
192 | "resp-modifier": "6.0.2",
193 | "rx": "4.1.0",
194 | "send": "0.16.2",
195 | "serve-index": "1.9.1",
196 | "serve-static": "1.13.2",
197 | "server-destroy": "1.0.1",
198 | "socket.io": "^4.4.1",
199 | "ua-parser-js": "1.0.2",
200 | "yargs": "^17.3.1"
201 | },
202 | "bin": {
203 | "browser-sync": "dist/bin.js"
204 | },
205 | "engines": {
206 | "node": ">= 8.0.0"
207 | }
208 | },
209 | "node_modules/browser-sync-client": {
210 | "version": "2.27.11",
211 | "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.11.tgz",
212 | "integrity": "sha512-okMNfD2NasL/XD1/BclP3onXjhahisk3e/kTQ5HPDT/lLqdBqNDd6QFcjI5I1ak7na2hxKQSLjryql+7fp5gKQ==",
213 | "dev": true,
214 | "dependencies": {
215 | "etag": "1.8.1",
216 | "fresh": "0.5.2",
217 | "mitt": "^1.1.3",
218 | "rxjs": "^5.5.6",
219 | "typescript": "^4.6.2"
220 | },
221 | "engines": {
222 | "node": ">=8.0.0"
223 | }
224 | },
225 | "node_modules/browser-sync-ui": {
226 | "version": "2.27.11",
227 | "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.11.tgz",
228 | "integrity": "sha512-1T/Y8Pp1R68aUL7zVSFq0nxtr258xWd/nTasCAHX2M6EsGaswVOFtXsw3bKqsr35z+J+LfVfOdz1HFLYKxdgrA==",
229 | "dev": true,
230 | "dependencies": {
231 | "async-each-series": "0.1.1",
232 | "connect-history-api-fallback": "^1",
233 | "immutable": "^3",
234 | "server-destroy": "1.0.1",
235 | "socket.io-client": "^4.4.1",
236 | "stream-throttle": "^0.1.3"
237 | }
238 | },
239 | "node_modules/bs-recipes": {
240 | "version": "1.3.4",
241 | "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz",
242 | "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==",
243 | "dev": true
244 | },
245 | "node_modules/bs-snippet-injector": {
246 | "version": "2.0.1",
247 | "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz",
248 | "integrity": "sha512-4u8IgB+L9L+S5hknOj3ddNSb42436gsnGm1AuM15B7CdbkpQTyVWgIM5/JUBiKiRwGOR86uo0Lu/OsX+SAlJmw==",
249 | "dev": true
250 | },
251 | "node_modules/bytes": {
252 | "version": "3.1.2",
253 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
254 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
255 | "dev": true,
256 | "engines": {
257 | "node": ">= 0.8"
258 | }
259 | },
260 | "node_modules/call-bind": {
261 | "version": "1.0.2",
262 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
263 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
264 | "dev": true,
265 | "dependencies": {
266 | "function-bind": "^1.1.1",
267 | "get-intrinsic": "^1.0.2"
268 | },
269 | "funding": {
270 | "url": "https://github.com/sponsors/ljharb"
271 | }
272 | },
273 | "node_modules/chalk": {
274 | "version": "1.1.3",
275 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
276 | "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
277 | "dev": true,
278 | "dependencies": {
279 | "ansi-styles": "^2.2.1",
280 | "escape-string-regexp": "^1.0.2",
281 | "has-ansi": "^2.0.0",
282 | "strip-ansi": "^3.0.0",
283 | "supports-color": "^2.0.0"
284 | },
285 | "engines": {
286 | "node": ">=0.10.0"
287 | }
288 | },
289 | "node_modules/chokidar": {
290 | "version": "3.5.3",
291 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
292 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
293 | "dev": true,
294 | "funding": [
295 | {
296 | "type": "individual",
297 | "url": "https://paulmillr.com/funding/"
298 | }
299 | ],
300 | "dependencies": {
301 | "anymatch": "~3.1.2",
302 | "braces": "~3.0.2",
303 | "glob-parent": "~5.1.2",
304 | "is-binary-path": "~2.1.0",
305 | "is-glob": "~4.0.1",
306 | "normalize-path": "~3.0.0",
307 | "readdirp": "~3.6.0"
308 | },
309 | "engines": {
310 | "node": ">= 8.10.0"
311 | },
312 | "optionalDependencies": {
313 | "fsevents": "~2.3.2"
314 | }
315 | },
316 | "node_modules/cliui": {
317 | "version": "8.0.1",
318 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
319 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
320 | "dev": true,
321 | "dependencies": {
322 | "string-width": "^4.2.0",
323 | "strip-ansi": "^6.0.1",
324 | "wrap-ansi": "^7.0.0"
325 | },
326 | "engines": {
327 | "node": ">=12"
328 | }
329 | },
330 | "node_modules/cliui/node_modules/ansi-regex": {
331 | "version": "5.0.1",
332 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
333 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
334 | "dev": true,
335 | "engines": {
336 | "node": ">=8"
337 | }
338 | },
339 | "node_modules/cliui/node_modules/strip-ansi": {
340 | "version": "6.0.1",
341 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
342 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
343 | "dev": true,
344 | "dependencies": {
345 | "ansi-regex": "^5.0.1"
346 | },
347 | "engines": {
348 | "node": ">=8"
349 | }
350 | },
351 | "node_modules/color-convert": {
352 | "version": "2.0.1",
353 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
354 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
355 | "dev": true,
356 | "dependencies": {
357 | "color-name": "~1.1.4"
358 | },
359 | "engines": {
360 | "node": ">=7.0.0"
361 | }
362 | },
363 | "node_modules/color-name": {
364 | "version": "1.1.4",
365 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
366 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
367 | "dev": true
368 | },
369 | "node_modules/commander": {
370 | "version": "2.20.3",
371 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
372 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
373 | "dev": true
374 | },
375 | "node_modules/concat-map": {
376 | "version": "0.0.1",
377 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
378 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
379 | "dev": true
380 | },
381 | "node_modules/connect": {
382 | "version": "3.6.6",
383 | "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz",
384 | "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==",
385 | "dev": true,
386 | "dependencies": {
387 | "debug": "2.6.9",
388 | "finalhandler": "1.1.0",
389 | "parseurl": "~1.3.2",
390 | "utils-merge": "1.0.1"
391 | },
392 | "engines": {
393 | "node": ">= 0.10.0"
394 | }
395 | },
396 | "node_modules/connect-history-api-fallback": {
397 | "version": "1.6.0",
398 | "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
399 | "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
400 | "dev": true,
401 | "engines": {
402 | "node": ">=0.8"
403 | }
404 | },
405 | "node_modules/cookie": {
406 | "version": "0.4.2",
407 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
408 | "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
409 | "dev": true,
410 | "engines": {
411 | "node": ">= 0.6"
412 | }
413 | },
414 | "node_modules/cors": {
415 | "version": "2.8.5",
416 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
417 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
418 | "dev": true,
419 | "dependencies": {
420 | "object-assign": "^4",
421 | "vary": "^1"
422 | },
423 | "engines": {
424 | "node": ">= 0.10"
425 | }
426 | },
427 | "node_modules/debug": {
428 | "version": "2.6.9",
429 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
430 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
431 | "dev": true,
432 | "dependencies": {
433 | "ms": "2.0.0"
434 | }
435 | },
436 | "node_modules/depd": {
437 | "version": "2.0.0",
438 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
439 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
440 | "dev": true,
441 | "engines": {
442 | "node": ">= 0.8"
443 | }
444 | },
445 | "node_modules/destroy": {
446 | "version": "1.0.4",
447 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
448 | "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==",
449 | "dev": true
450 | },
451 | "node_modules/dev-ip": {
452 | "version": "1.0.1",
453 | "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz",
454 | "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==",
455 | "dev": true,
456 | "bin": {
457 | "dev-ip": "lib/dev-ip.js"
458 | },
459 | "engines": {
460 | "node": ">= 0.8.0"
461 | }
462 | },
463 | "node_modules/dlv": {
464 | "version": "1.1.3",
465 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
466 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
467 | "dev": true
468 | },
469 | "node_modules/easy-extender": {
470 | "version": "2.3.4",
471 | "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz",
472 | "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==",
473 | "dev": true,
474 | "dependencies": {
475 | "lodash": "^4.17.10"
476 | },
477 | "engines": {
478 | "node": ">= 4.0.0"
479 | }
480 | },
481 | "node_modules/eazy-logger": {
482 | "version": "3.1.0",
483 | "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.1.0.tgz",
484 | "integrity": "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==",
485 | "dev": true,
486 | "dependencies": {
487 | "tfunk": "^4.0.0"
488 | },
489 | "engines": {
490 | "node": ">= 0.8.0"
491 | }
492 | },
493 | "node_modules/ee-first": {
494 | "version": "1.1.1",
495 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
496 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
497 | "dev": true
498 | },
499 | "node_modules/emoji-regex": {
500 | "version": "8.0.0",
501 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
502 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
503 | "dev": true
504 | },
505 | "node_modules/encodeurl": {
506 | "version": "1.0.2",
507 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
508 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
509 | "dev": true,
510 | "engines": {
511 | "node": ">= 0.8"
512 | }
513 | },
514 | "node_modules/engine.io": {
515 | "version": "6.4.0",
516 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.0.tgz",
517 | "integrity": "sha512-OgxY1c/RuCSeO/rTr8DIFXx76IzUUft86R7/P7MMbbkuzeqJoTNw2lmeD91IyGz41QYleIIjWeMJGgug043sfQ==",
518 | "dev": true,
519 | "dependencies": {
520 | "@types/cookie": "^0.4.1",
521 | "@types/cors": "^2.8.12",
522 | "@types/node": ">=10.0.0",
523 | "accepts": "~1.3.4",
524 | "base64id": "2.0.0",
525 | "cookie": "~0.4.1",
526 | "cors": "~2.8.5",
527 | "debug": "~4.3.1",
528 | "engine.io-parser": "~5.0.3",
529 | "ws": "~8.11.0"
530 | },
531 | "engines": {
532 | "node": ">=10.0.0"
533 | }
534 | },
535 | "node_modules/engine.io-client": {
536 | "version": "6.4.0",
537 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz",
538 | "integrity": "sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==",
539 | "dev": true,
540 | "dependencies": {
541 | "@socket.io/component-emitter": "~3.1.0",
542 | "debug": "~4.3.1",
543 | "engine.io-parser": "~5.0.3",
544 | "ws": "~8.11.0",
545 | "xmlhttprequest-ssl": "~2.0.0"
546 | }
547 | },
548 | "node_modules/engine.io-client/node_modules/debug": {
549 | "version": "4.3.4",
550 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
551 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
552 | "dev": true,
553 | "dependencies": {
554 | "ms": "2.1.2"
555 | },
556 | "engines": {
557 | "node": ">=6.0"
558 | },
559 | "peerDependenciesMeta": {
560 | "supports-color": {
561 | "optional": true
562 | }
563 | }
564 | },
565 | "node_modules/engine.io-client/node_modules/ms": {
566 | "version": "2.1.2",
567 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
568 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
569 | "dev": true
570 | },
571 | "node_modules/engine.io-parser": {
572 | "version": "5.0.6",
573 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz",
574 | "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==",
575 | "dev": true,
576 | "engines": {
577 | "node": ">=10.0.0"
578 | }
579 | },
580 | "node_modules/engine.io/node_modules/debug": {
581 | "version": "4.3.4",
582 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
583 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
584 | "dev": true,
585 | "dependencies": {
586 | "ms": "2.1.2"
587 | },
588 | "engines": {
589 | "node": ">=6.0"
590 | },
591 | "peerDependenciesMeta": {
592 | "supports-color": {
593 | "optional": true
594 | }
595 | }
596 | },
597 | "node_modules/engine.io/node_modules/ms": {
598 | "version": "2.1.2",
599 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
600 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
601 | "dev": true
602 | },
603 | "node_modules/escalade": {
604 | "version": "3.1.1",
605 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
606 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
607 | "dev": true,
608 | "engines": {
609 | "node": ">=6"
610 | }
611 | },
612 | "node_modules/escape-html": {
613 | "version": "1.0.3",
614 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
615 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
616 | "dev": true
617 | },
618 | "node_modules/escape-string-regexp": {
619 | "version": "1.0.5",
620 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
621 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
622 | "dev": true,
623 | "engines": {
624 | "node": ">=0.8.0"
625 | }
626 | },
627 | "node_modules/etag": {
628 | "version": "1.8.1",
629 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
630 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
631 | "dev": true,
632 | "engines": {
633 | "node": ">= 0.6"
634 | }
635 | },
636 | "node_modules/eventemitter3": {
637 | "version": "4.0.7",
638 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
639 | "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
640 | "dev": true
641 | },
642 | "node_modules/fill-range": {
643 | "version": "7.0.1",
644 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
645 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
646 | "dev": true,
647 | "dependencies": {
648 | "to-regex-range": "^5.0.1"
649 | },
650 | "engines": {
651 | "node": ">=8"
652 | }
653 | },
654 | "node_modules/finalhandler": {
655 | "version": "1.1.0",
656 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
657 | "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==",
658 | "dev": true,
659 | "dependencies": {
660 | "debug": "2.6.9",
661 | "encodeurl": "~1.0.1",
662 | "escape-html": "~1.0.3",
663 | "on-finished": "~2.3.0",
664 | "parseurl": "~1.3.2",
665 | "statuses": "~1.3.1",
666 | "unpipe": "~1.0.0"
667 | },
668 | "engines": {
669 | "node": ">= 0.8"
670 | }
671 | },
672 | "node_modules/follow-redirects": {
673 | "version": "1.15.2",
674 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
675 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
676 | "dev": true,
677 | "funding": [
678 | {
679 | "type": "individual",
680 | "url": "https://github.com/sponsors/RubenVerborgh"
681 | }
682 | ],
683 | "engines": {
684 | "node": ">=4.0"
685 | },
686 | "peerDependenciesMeta": {
687 | "debug": {
688 | "optional": true
689 | }
690 | }
691 | },
692 | "node_modules/fresh": {
693 | "version": "0.5.2",
694 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
695 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
696 | "dev": true,
697 | "engines": {
698 | "node": ">= 0.6"
699 | }
700 | },
701 | "node_modules/fs-extra": {
702 | "version": "3.0.1",
703 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz",
704 | "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==",
705 | "dev": true,
706 | "dependencies": {
707 | "graceful-fs": "^4.1.2",
708 | "jsonfile": "^3.0.0",
709 | "universalify": "^0.1.0"
710 | }
711 | },
712 | "node_modules/fsevents": {
713 | "version": "2.3.2",
714 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
715 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
716 | "dev": true,
717 | "hasInstallScript": true,
718 | "optional": true,
719 | "os": [
720 | "darwin"
721 | ],
722 | "engines": {
723 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
724 | }
725 | },
726 | "node_modules/function-bind": {
727 | "version": "1.1.1",
728 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
729 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
730 | "dev": true
731 | },
732 | "node_modules/get-caller-file": {
733 | "version": "2.0.5",
734 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
735 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
736 | "dev": true,
737 | "engines": {
738 | "node": "6.* || 8.* || >= 10.*"
739 | }
740 | },
741 | "node_modules/get-intrinsic": {
742 | "version": "1.2.0",
743 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
744 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
745 | "dev": true,
746 | "dependencies": {
747 | "function-bind": "^1.1.1",
748 | "has": "^1.0.3",
749 | "has-symbols": "^1.0.3"
750 | },
751 | "funding": {
752 | "url": "https://github.com/sponsors/ljharb"
753 | }
754 | },
755 | "node_modules/glob-parent": {
756 | "version": "5.1.2",
757 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
758 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
759 | "dev": true,
760 | "dependencies": {
761 | "is-glob": "^4.0.1"
762 | },
763 | "engines": {
764 | "node": ">= 6"
765 | }
766 | },
767 | "node_modules/graceful-fs": {
768 | "version": "4.2.10",
769 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
770 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
771 | "dev": true
772 | },
773 | "node_modules/has": {
774 | "version": "1.0.3",
775 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
776 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
777 | "dev": true,
778 | "dependencies": {
779 | "function-bind": "^1.1.1"
780 | },
781 | "engines": {
782 | "node": ">= 0.4.0"
783 | }
784 | },
785 | "node_modules/has-ansi": {
786 | "version": "2.0.0",
787 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
788 | "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==",
789 | "dev": true,
790 | "dependencies": {
791 | "ansi-regex": "^2.0.0"
792 | },
793 | "engines": {
794 | "node": ">=0.10.0"
795 | }
796 | },
797 | "node_modules/has-symbols": {
798 | "version": "1.0.3",
799 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
800 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
801 | "dev": true,
802 | "engines": {
803 | "node": ">= 0.4"
804 | },
805 | "funding": {
806 | "url": "https://github.com/sponsors/ljharb"
807 | }
808 | },
809 | "node_modules/http-errors": {
810 | "version": "2.0.0",
811 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
812 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
813 | "dev": true,
814 | "dependencies": {
815 | "depd": "2.0.0",
816 | "inherits": "2.0.4",
817 | "setprototypeof": "1.2.0",
818 | "statuses": "2.0.1",
819 | "toidentifier": "1.0.1"
820 | },
821 | "engines": {
822 | "node": ">= 0.8"
823 | }
824 | },
825 | "node_modules/http-errors/node_modules/statuses": {
826 | "version": "2.0.1",
827 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
828 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
829 | "dev": true,
830 | "engines": {
831 | "node": ">= 0.8"
832 | }
833 | },
834 | "node_modules/http-proxy": {
835 | "version": "1.18.1",
836 | "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
837 | "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
838 | "dev": true,
839 | "dependencies": {
840 | "eventemitter3": "^4.0.0",
841 | "follow-redirects": "^1.0.0",
842 | "requires-port": "^1.0.0"
843 | },
844 | "engines": {
845 | "node": ">=8.0.0"
846 | }
847 | },
848 | "node_modules/iconv-lite": {
849 | "version": "0.4.24",
850 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
851 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
852 | "dev": true,
853 | "dependencies": {
854 | "safer-buffer": ">= 2.1.2 < 3"
855 | },
856 | "engines": {
857 | "node": ">=0.10.0"
858 | }
859 | },
860 | "node_modules/immutable": {
861 | "version": "3.8.2",
862 | "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz",
863 | "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==",
864 | "dev": true,
865 | "engines": {
866 | "node": ">=0.10.0"
867 | }
868 | },
869 | "node_modules/inherits": {
870 | "version": "2.0.4",
871 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
872 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
873 | "dev": true
874 | },
875 | "node_modules/is-binary-path": {
876 | "version": "2.1.0",
877 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
878 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
879 | "dev": true,
880 | "dependencies": {
881 | "binary-extensions": "^2.0.0"
882 | },
883 | "engines": {
884 | "node": ">=8"
885 | }
886 | },
887 | "node_modules/is-extglob": {
888 | "version": "2.1.1",
889 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
890 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
891 | "dev": true,
892 | "engines": {
893 | "node": ">=0.10.0"
894 | }
895 | },
896 | "node_modules/is-fullwidth-code-point": {
897 | "version": "3.0.0",
898 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
899 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
900 | "dev": true,
901 | "engines": {
902 | "node": ">=8"
903 | }
904 | },
905 | "node_modules/is-glob": {
906 | "version": "4.0.3",
907 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
908 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
909 | "dev": true,
910 | "dependencies": {
911 | "is-extglob": "^2.1.1"
912 | },
913 | "engines": {
914 | "node": ">=0.10.0"
915 | }
916 | },
917 | "node_modules/is-number": {
918 | "version": "7.0.0",
919 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
920 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
921 | "dev": true,
922 | "engines": {
923 | "node": ">=0.12.0"
924 | }
925 | },
926 | "node_modules/is-number-like": {
927 | "version": "1.0.8",
928 | "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz",
929 | "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==",
930 | "dev": true,
931 | "dependencies": {
932 | "lodash.isfinite": "^3.3.2"
933 | }
934 | },
935 | "node_modules/is-wsl": {
936 | "version": "1.1.0",
937 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
938 | "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==",
939 | "dev": true,
940 | "engines": {
941 | "node": ">=4"
942 | }
943 | },
944 | "node_modules/jsonfile": {
945 | "version": "3.0.1",
946 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz",
947 | "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==",
948 | "dev": true,
949 | "optionalDependencies": {
950 | "graceful-fs": "^4.1.6"
951 | }
952 | },
953 | "node_modules/limiter": {
954 | "version": "1.1.5",
955 | "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz",
956 | "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==",
957 | "dev": true
958 | },
959 | "node_modules/localtunnel": {
960 | "version": "2.0.2",
961 | "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz",
962 | "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==",
963 | "dev": true,
964 | "dependencies": {
965 | "axios": "0.21.4",
966 | "debug": "4.3.2",
967 | "openurl": "1.1.1",
968 | "yargs": "17.1.1"
969 | },
970 | "bin": {
971 | "lt": "bin/lt.js"
972 | },
973 | "engines": {
974 | "node": ">=8.3.0"
975 | }
976 | },
977 | "node_modules/localtunnel/node_modules/ansi-regex": {
978 | "version": "5.0.1",
979 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
980 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
981 | "dev": true,
982 | "engines": {
983 | "node": ">=8"
984 | }
985 | },
986 | "node_modules/localtunnel/node_modules/cliui": {
987 | "version": "7.0.4",
988 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
989 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
990 | "dev": true,
991 | "dependencies": {
992 | "string-width": "^4.2.0",
993 | "strip-ansi": "^6.0.0",
994 | "wrap-ansi": "^7.0.0"
995 | }
996 | },
997 | "node_modules/localtunnel/node_modules/debug": {
998 | "version": "4.3.2",
999 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
1000 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
1001 | "dev": true,
1002 | "dependencies": {
1003 | "ms": "2.1.2"
1004 | },
1005 | "engines": {
1006 | "node": ">=6.0"
1007 | },
1008 | "peerDependenciesMeta": {
1009 | "supports-color": {
1010 | "optional": true
1011 | }
1012 | }
1013 | },
1014 | "node_modules/localtunnel/node_modules/ms": {
1015 | "version": "2.1.2",
1016 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1017 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1018 | "dev": true
1019 | },
1020 | "node_modules/localtunnel/node_modules/strip-ansi": {
1021 | "version": "6.0.1",
1022 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1023 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1024 | "dev": true,
1025 | "dependencies": {
1026 | "ansi-regex": "^5.0.1"
1027 | },
1028 | "engines": {
1029 | "node": ">=8"
1030 | }
1031 | },
1032 | "node_modules/localtunnel/node_modules/yargs": {
1033 | "version": "17.1.1",
1034 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz",
1035 | "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==",
1036 | "dev": true,
1037 | "dependencies": {
1038 | "cliui": "^7.0.2",
1039 | "escalade": "^3.1.1",
1040 | "get-caller-file": "^2.0.5",
1041 | "require-directory": "^2.1.1",
1042 | "string-width": "^4.2.0",
1043 | "y18n": "^5.0.5",
1044 | "yargs-parser": "^20.2.2"
1045 | },
1046 | "engines": {
1047 | "node": ">=12"
1048 | }
1049 | },
1050 | "node_modules/localtunnel/node_modules/yargs-parser": {
1051 | "version": "20.2.9",
1052 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
1053 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
1054 | "dev": true,
1055 | "engines": {
1056 | "node": ">=10"
1057 | }
1058 | },
1059 | "node_modules/lodash": {
1060 | "version": "4.17.21",
1061 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
1062 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
1063 | "dev": true
1064 | },
1065 | "node_modules/lodash.isfinite": {
1066 | "version": "3.3.2",
1067 | "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz",
1068 | "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==",
1069 | "dev": true
1070 | },
1071 | "node_modules/micromatch": {
1072 | "version": "4.0.5",
1073 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
1074 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
1075 | "dev": true,
1076 | "dependencies": {
1077 | "braces": "^3.0.2",
1078 | "picomatch": "^2.3.1"
1079 | },
1080 | "engines": {
1081 | "node": ">=8.6"
1082 | }
1083 | },
1084 | "node_modules/mime": {
1085 | "version": "1.4.1",
1086 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
1087 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
1088 | "dev": true,
1089 | "bin": {
1090 | "mime": "cli.js"
1091 | }
1092 | },
1093 | "node_modules/mime-db": {
1094 | "version": "1.52.0",
1095 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1096 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1097 | "dev": true,
1098 | "engines": {
1099 | "node": ">= 0.6"
1100 | }
1101 | },
1102 | "node_modules/mime-types": {
1103 | "version": "2.1.35",
1104 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1105 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1106 | "dev": true,
1107 | "dependencies": {
1108 | "mime-db": "1.52.0"
1109 | },
1110 | "engines": {
1111 | "node": ">= 0.6"
1112 | }
1113 | },
1114 | "node_modules/minimatch": {
1115 | "version": "3.1.2",
1116 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1117 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1118 | "dev": true,
1119 | "dependencies": {
1120 | "brace-expansion": "^1.1.7"
1121 | },
1122 | "engines": {
1123 | "node": "*"
1124 | }
1125 | },
1126 | "node_modules/mitt": {
1127 | "version": "1.2.0",
1128 | "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz",
1129 | "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==",
1130 | "dev": true
1131 | },
1132 | "node_modules/ms": {
1133 | "version": "2.0.0",
1134 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1135 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
1136 | "dev": true
1137 | },
1138 | "node_modules/negotiator": {
1139 | "version": "0.6.3",
1140 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1141 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
1142 | "dev": true,
1143 | "engines": {
1144 | "node": ">= 0.6"
1145 | }
1146 | },
1147 | "node_modules/normalize-path": {
1148 | "version": "3.0.0",
1149 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1150 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1151 | "dev": true,
1152 | "engines": {
1153 | "node": ">=0.10.0"
1154 | }
1155 | },
1156 | "node_modules/object-assign": {
1157 | "version": "4.1.1",
1158 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1159 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1160 | "dev": true,
1161 | "engines": {
1162 | "node": ">=0.10.0"
1163 | }
1164 | },
1165 | "node_modules/object-inspect": {
1166 | "version": "1.12.3",
1167 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
1168 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
1169 | "dev": true,
1170 | "funding": {
1171 | "url": "https://github.com/sponsors/ljharb"
1172 | }
1173 | },
1174 | "node_modules/on-finished": {
1175 | "version": "2.3.0",
1176 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1177 | "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
1178 | "dev": true,
1179 | "dependencies": {
1180 | "ee-first": "1.1.1"
1181 | },
1182 | "engines": {
1183 | "node": ">= 0.8"
1184 | }
1185 | },
1186 | "node_modules/openurl": {
1187 | "version": "1.1.1",
1188 | "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz",
1189 | "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==",
1190 | "dev": true
1191 | },
1192 | "node_modules/opn": {
1193 | "version": "5.3.0",
1194 | "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz",
1195 | "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==",
1196 | "dev": true,
1197 | "dependencies": {
1198 | "is-wsl": "^1.1.0"
1199 | },
1200 | "engines": {
1201 | "node": ">=4"
1202 | }
1203 | },
1204 | "node_modules/parseurl": {
1205 | "version": "1.3.3",
1206 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1207 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1208 | "dev": true,
1209 | "engines": {
1210 | "node": ">= 0.8"
1211 | }
1212 | },
1213 | "node_modules/picomatch": {
1214 | "version": "2.3.1",
1215 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1216 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1217 | "dev": true,
1218 | "engines": {
1219 | "node": ">=8.6"
1220 | },
1221 | "funding": {
1222 | "url": "https://github.com/sponsors/jonschlinkert"
1223 | }
1224 | },
1225 | "node_modules/portscanner": {
1226 | "version": "2.2.0",
1227 | "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz",
1228 | "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==",
1229 | "dev": true,
1230 | "dependencies": {
1231 | "async": "^2.6.0",
1232 | "is-number-like": "^1.0.3"
1233 | },
1234 | "engines": {
1235 | "node": ">=0.4",
1236 | "npm": ">=1.0.0"
1237 | }
1238 | },
1239 | "node_modules/qs": {
1240 | "version": "6.11.0",
1241 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
1242 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
1243 | "dev": true,
1244 | "dependencies": {
1245 | "side-channel": "^1.0.4"
1246 | },
1247 | "engines": {
1248 | "node": ">=0.6"
1249 | },
1250 | "funding": {
1251 | "url": "https://github.com/sponsors/ljharb"
1252 | }
1253 | },
1254 | "node_modules/range-parser": {
1255 | "version": "1.2.1",
1256 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1257 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1258 | "dev": true,
1259 | "engines": {
1260 | "node": ">= 0.6"
1261 | }
1262 | },
1263 | "node_modules/raw-body": {
1264 | "version": "2.5.1",
1265 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
1266 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
1267 | "dev": true,
1268 | "dependencies": {
1269 | "bytes": "3.1.2",
1270 | "http-errors": "2.0.0",
1271 | "iconv-lite": "0.4.24",
1272 | "unpipe": "1.0.0"
1273 | },
1274 | "engines": {
1275 | "node": ">= 0.8"
1276 | }
1277 | },
1278 | "node_modules/readdirp": {
1279 | "version": "3.6.0",
1280 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1281 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1282 | "dev": true,
1283 | "dependencies": {
1284 | "picomatch": "^2.2.1"
1285 | },
1286 | "engines": {
1287 | "node": ">=8.10.0"
1288 | }
1289 | },
1290 | "node_modules/require-directory": {
1291 | "version": "2.1.1",
1292 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
1293 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
1294 | "dev": true,
1295 | "engines": {
1296 | "node": ">=0.10.0"
1297 | }
1298 | },
1299 | "node_modules/requires-port": {
1300 | "version": "1.0.0",
1301 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
1302 | "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
1303 | "dev": true
1304 | },
1305 | "node_modules/resp-modifier": {
1306 | "version": "6.0.2",
1307 | "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz",
1308 | "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==",
1309 | "dev": true,
1310 | "dependencies": {
1311 | "debug": "^2.2.0",
1312 | "minimatch": "^3.0.2"
1313 | },
1314 | "engines": {
1315 | "node": ">= 0.8.0"
1316 | }
1317 | },
1318 | "node_modules/rx": {
1319 | "version": "4.1.0",
1320 | "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz",
1321 | "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==",
1322 | "dev": true
1323 | },
1324 | "node_modules/rxjs": {
1325 | "version": "5.5.12",
1326 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz",
1327 | "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==",
1328 | "dev": true,
1329 | "dependencies": {
1330 | "symbol-observable": "1.0.1"
1331 | },
1332 | "engines": {
1333 | "npm": ">=2.0.0"
1334 | }
1335 | },
1336 | "node_modules/safer-buffer": {
1337 | "version": "2.1.2",
1338 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1339 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1340 | "dev": true
1341 | },
1342 | "node_modules/send": {
1343 | "version": "0.16.2",
1344 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
1345 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
1346 | "dev": true,
1347 | "dependencies": {
1348 | "debug": "2.6.9",
1349 | "depd": "~1.1.2",
1350 | "destroy": "~1.0.4",
1351 | "encodeurl": "~1.0.2",
1352 | "escape-html": "~1.0.3",
1353 | "etag": "~1.8.1",
1354 | "fresh": "0.5.2",
1355 | "http-errors": "~1.6.2",
1356 | "mime": "1.4.1",
1357 | "ms": "2.0.0",
1358 | "on-finished": "~2.3.0",
1359 | "range-parser": "~1.2.0",
1360 | "statuses": "~1.4.0"
1361 | },
1362 | "engines": {
1363 | "node": ">= 0.8.0"
1364 | }
1365 | },
1366 | "node_modules/send/node_modules/depd": {
1367 | "version": "1.1.2",
1368 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
1369 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
1370 | "dev": true,
1371 | "engines": {
1372 | "node": ">= 0.6"
1373 | }
1374 | },
1375 | "node_modules/send/node_modules/http-errors": {
1376 | "version": "1.6.3",
1377 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
1378 | "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
1379 | "dev": true,
1380 | "dependencies": {
1381 | "depd": "~1.1.2",
1382 | "inherits": "2.0.3",
1383 | "setprototypeof": "1.1.0",
1384 | "statuses": ">= 1.4.0 < 2"
1385 | },
1386 | "engines": {
1387 | "node": ">= 0.6"
1388 | }
1389 | },
1390 | "node_modules/send/node_modules/inherits": {
1391 | "version": "2.0.3",
1392 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1393 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
1394 | "dev": true
1395 | },
1396 | "node_modules/send/node_modules/setprototypeof": {
1397 | "version": "1.1.0",
1398 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
1399 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
1400 | "dev": true
1401 | },
1402 | "node_modules/send/node_modules/statuses": {
1403 | "version": "1.4.0",
1404 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
1405 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
1406 | "dev": true,
1407 | "engines": {
1408 | "node": ">= 0.6"
1409 | }
1410 | },
1411 | "node_modules/serve-index": {
1412 | "version": "1.9.1",
1413 | "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
1414 | "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
1415 | "dev": true,
1416 | "dependencies": {
1417 | "accepts": "~1.3.4",
1418 | "batch": "0.6.1",
1419 | "debug": "2.6.9",
1420 | "escape-html": "~1.0.3",
1421 | "http-errors": "~1.6.2",
1422 | "mime-types": "~2.1.17",
1423 | "parseurl": "~1.3.2"
1424 | },
1425 | "engines": {
1426 | "node": ">= 0.8.0"
1427 | }
1428 | },
1429 | "node_modules/serve-index/node_modules/depd": {
1430 | "version": "1.1.2",
1431 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
1432 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
1433 | "dev": true,
1434 | "engines": {
1435 | "node": ">= 0.6"
1436 | }
1437 | },
1438 | "node_modules/serve-index/node_modules/http-errors": {
1439 | "version": "1.6.3",
1440 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
1441 | "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
1442 | "dev": true,
1443 | "dependencies": {
1444 | "depd": "~1.1.2",
1445 | "inherits": "2.0.3",
1446 | "setprototypeof": "1.1.0",
1447 | "statuses": ">= 1.4.0 < 2"
1448 | },
1449 | "engines": {
1450 | "node": ">= 0.6"
1451 | }
1452 | },
1453 | "node_modules/serve-index/node_modules/inherits": {
1454 | "version": "2.0.3",
1455 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1456 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
1457 | "dev": true
1458 | },
1459 | "node_modules/serve-index/node_modules/setprototypeof": {
1460 | "version": "1.1.0",
1461 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
1462 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
1463 | "dev": true
1464 | },
1465 | "node_modules/serve-index/node_modules/statuses": {
1466 | "version": "1.5.0",
1467 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
1468 | "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
1469 | "dev": true,
1470 | "engines": {
1471 | "node": ">= 0.6"
1472 | }
1473 | },
1474 | "node_modules/serve-static": {
1475 | "version": "1.13.2",
1476 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
1477 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
1478 | "dev": true,
1479 | "dependencies": {
1480 | "encodeurl": "~1.0.2",
1481 | "escape-html": "~1.0.3",
1482 | "parseurl": "~1.3.2",
1483 | "send": "0.16.2"
1484 | },
1485 | "engines": {
1486 | "node": ">= 0.8.0"
1487 | }
1488 | },
1489 | "node_modules/server-destroy": {
1490 | "version": "1.0.1",
1491 | "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
1492 | "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==",
1493 | "dev": true
1494 | },
1495 | "node_modules/setprototypeof": {
1496 | "version": "1.2.0",
1497 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1498 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1499 | "dev": true
1500 | },
1501 | "node_modules/side-channel": {
1502 | "version": "1.0.4",
1503 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
1504 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1505 | "dev": true,
1506 | "dependencies": {
1507 | "call-bind": "^1.0.0",
1508 | "get-intrinsic": "^1.0.2",
1509 | "object-inspect": "^1.9.0"
1510 | },
1511 | "funding": {
1512 | "url": "https://github.com/sponsors/ljharb"
1513 | }
1514 | },
1515 | "node_modules/socket.io": {
1516 | "version": "4.6.0",
1517 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.0.tgz",
1518 | "integrity": "sha512-b65bp6INPk/BMMrIgVvX12x3Q+NqlGqSlTuvKQWt0BUJ3Hyy3JangBl7fEoWZTXbOKlCqNPbQ6MbWgok/km28w==",
1519 | "dev": true,
1520 | "dependencies": {
1521 | "accepts": "~1.3.4",
1522 | "base64id": "~2.0.0",
1523 | "debug": "~4.3.2",
1524 | "engine.io": "~6.4.0",
1525 | "socket.io-adapter": "~2.5.2",
1526 | "socket.io-parser": "~4.2.1"
1527 | },
1528 | "engines": {
1529 | "node": ">=10.0.0"
1530 | }
1531 | },
1532 | "node_modules/socket.io-adapter": {
1533 | "version": "2.5.2",
1534 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz",
1535 | "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==",
1536 | "dev": true,
1537 | "dependencies": {
1538 | "ws": "~8.11.0"
1539 | }
1540 | },
1541 | "node_modules/socket.io-client": {
1542 | "version": "4.6.0",
1543 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.0.tgz",
1544 | "integrity": "sha512-2XOp18xnGghUICSd5ziUIS4rB0dhr6S8OvAps8y+HhOjFQlqGcf+FIh6fCIsKKZyWFxJeFPrZRNPGsHDTsz1Ug==",
1545 | "dev": true,
1546 | "dependencies": {
1547 | "@socket.io/component-emitter": "~3.1.0",
1548 | "debug": "~4.3.2",
1549 | "engine.io-client": "~6.4.0",
1550 | "socket.io-parser": "~4.2.1"
1551 | },
1552 | "engines": {
1553 | "node": ">=10.0.0"
1554 | }
1555 | },
1556 | "node_modules/socket.io-client/node_modules/debug": {
1557 | "version": "4.3.4",
1558 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1559 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1560 | "dev": true,
1561 | "dependencies": {
1562 | "ms": "2.1.2"
1563 | },
1564 | "engines": {
1565 | "node": ">=6.0"
1566 | },
1567 | "peerDependenciesMeta": {
1568 | "supports-color": {
1569 | "optional": true
1570 | }
1571 | }
1572 | },
1573 | "node_modules/socket.io-client/node_modules/ms": {
1574 | "version": "2.1.2",
1575 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1576 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1577 | "dev": true
1578 | },
1579 | "node_modules/socket.io-parser": {
1580 | "version": "4.2.2",
1581 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz",
1582 | "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==",
1583 | "dev": true,
1584 | "dependencies": {
1585 | "@socket.io/component-emitter": "~3.1.0",
1586 | "debug": "~4.3.1"
1587 | },
1588 | "engines": {
1589 | "node": ">=10.0.0"
1590 | }
1591 | },
1592 | "node_modules/socket.io-parser/node_modules/debug": {
1593 | "version": "4.3.4",
1594 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1595 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1596 | "dev": true,
1597 | "dependencies": {
1598 | "ms": "2.1.2"
1599 | },
1600 | "engines": {
1601 | "node": ">=6.0"
1602 | },
1603 | "peerDependenciesMeta": {
1604 | "supports-color": {
1605 | "optional": true
1606 | }
1607 | }
1608 | },
1609 | "node_modules/socket.io-parser/node_modules/ms": {
1610 | "version": "2.1.2",
1611 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1612 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1613 | "dev": true
1614 | },
1615 | "node_modules/socket.io/node_modules/debug": {
1616 | "version": "4.3.4",
1617 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1618 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1619 | "dev": true,
1620 | "dependencies": {
1621 | "ms": "2.1.2"
1622 | },
1623 | "engines": {
1624 | "node": ">=6.0"
1625 | },
1626 | "peerDependenciesMeta": {
1627 | "supports-color": {
1628 | "optional": true
1629 | }
1630 | }
1631 | },
1632 | "node_modules/socket.io/node_modules/ms": {
1633 | "version": "2.1.2",
1634 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1635 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1636 | "dev": true
1637 | },
1638 | "node_modules/statuses": {
1639 | "version": "1.3.1",
1640 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
1641 | "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==",
1642 | "dev": true,
1643 | "engines": {
1644 | "node": ">= 0.6"
1645 | }
1646 | },
1647 | "node_modules/stream-throttle": {
1648 | "version": "0.1.3",
1649 | "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz",
1650 | "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==",
1651 | "dev": true,
1652 | "dependencies": {
1653 | "commander": "^2.2.0",
1654 | "limiter": "^1.0.5"
1655 | },
1656 | "bin": {
1657 | "throttleproxy": "bin/throttleproxy.js"
1658 | },
1659 | "engines": {
1660 | "node": ">= 0.10.0"
1661 | }
1662 | },
1663 | "node_modules/string-width": {
1664 | "version": "4.2.3",
1665 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
1666 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
1667 | "dev": true,
1668 | "dependencies": {
1669 | "emoji-regex": "^8.0.0",
1670 | "is-fullwidth-code-point": "^3.0.0",
1671 | "strip-ansi": "^6.0.1"
1672 | },
1673 | "engines": {
1674 | "node": ">=8"
1675 | }
1676 | },
1677 | "node_modules/string-width/node_modules/ansi-regex": {
1678 | "version": "5.0.1",
1679 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
1680 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
1681 | "dev": true,
1682 | "engines": {
1683 | "node": ">=8"
1684 | }
1685 | },
1686 | "node_modules/string-width/node_modules/strip-ansi": {
1687 | "version": "6.0.1",
1688 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1689 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1690 | "dev": true,
1691 | "dependencies": {
1692 | "ansi-regex": "^5.0.1"
1693 | },
1694 | "engines": {
1695 | "node": ">=8"
1696 | }
1697 | },
1698 | "node_modules/strip-ansi": {
1699 | "version": "3.0.1",
1700 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1701 | "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
1702 | "dev": true,
1703 | "dependencies": {
1704 | "ansi-regex": "^2.0.0"
1705 | },
1706 | "engines": {
1707 | "node": ">=0.10.0"
1708 | }
1709 | },
1710 | "node_modules/supports-color": {
1711 | "version": "2.0.0",
1712 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
1713 | "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
1714 | "dev": true,
1715 | "engines": {
1716 | "node": ">=0.8.0"
1717 | }
1718 | },
1719 | "node_modules/symbol-observable": {
1720 | "version": "1.0.1",
1721 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz",
1722 | "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==",
1723 | "dev": true,
1724 | "engines": {
1725 | "node": ">=0.10.0"
1726 | }
1727 | },
1728 | "node_modules/tfunk": {
1729 | "version": "4.0.0",
1730 | "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-4.0.0.tgz",
1731 | "integrity": "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==",
1732 | "dev": true,
1733 | "dependencies": {
1734 | "chalk": "^1.1.3",
1735 | "dlv": "^1.1.3"
1736 | }
1737 | },
1738 | "node_modules/to-regex-range": {
1739 | "version": "5.0.1",
1740 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1741 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1742 | "dev": true,
1743 | "dependencies": {
1744 | "is-number": "^7.0.0"
1745 | },
1746 | "engines": {
1747 | "node": ">=8.0"
1748 | }
1749 | },
1750 | "node_modules/toidentifier": {
1751 | "version": "1.0.1",
1752 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1753 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1754 | "dev": true,
1755 | "engines": {
1756 | "node": ">=0.6"
1757 | }
1758 | },
1759 | "node_modules/typescript": {
1760 | "version": "4.9.5",
1761 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
1762 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
1763 | "dev": true,
1764 | "bin": {
1765 | "tsc": "bin/tsc",
1766 | "tsserver": "bin/tsserver"
1767 | },
1768 | "engines": {
1769 | "node": ">=4.2.0"
1770 | }
1771 | },
1772 | "node_modules/ua-parser-js": {
1773 | "version": "1.0.2",
1774 | "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz",
1775 | "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==",
1776 | "dev": true,
1777 | "funding": [
1778 | {
1779 | "type": "opencollective",
1780 | "url": "https://opencollective.com/ua-parser-js"
1781 | },
1782 | {
1783 | "type": "paypal",
1784 | "url": "https://paypal.me/faisalman"
1785 | }
1786 | ],
1787 | "engines": {
1788 | "node": "*"
1789 | }
1790 | },
1791 | "node_modules/universalify": {
1792 | "version": "0.1.2",
1793 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
1794 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
1795 | "dev": true,
1796 | "engines": {
1797 | "node": ">= 4.0.0"
1798 | }
1799 | },
1800 | "node_modules/unpipe": {
1801 | "version": "1.0.0",
1802 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1803 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1804 | "dev": true,
1805 | "engines": {
1806 | "node": ">= 0.8"
1807 | }
1808 | },
1809 | "node_modules/utils-merge": {
1810 | "version": "1.0.1",
1811 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1812 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1813 | "dev": true,
1814 | "engines": {
1815 | "node": ">= 0.4.0"
1816 | }
1817 | },
1818 | "node_modules/vary": {
1819 | "version": "1.1.2",
1820 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1821 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1822 | "dev": true,
1823 | "engines": {
1824 | "node": ">= 0.8"
1825 | }
1826 | },
1827 | "node_modules/wrap-ansi": {
1828 | "version": "7.0.0",
1829 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
1830 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
1831 | "dev": true,
1832 | "dependencies": {
1833 | "ansi-styles": "^4.0.0",
1834 | "string-width": "^4.1.0",
1835 | "strip-ansi": "^6.0.0"
1836 | },
1837 | "engines": {
1838 | "node": ">=10"
1839 | },
1840 | "funding": {
1841 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
1842 | }
1843 | },
1844 | "node_modules/wrap-ansi/node_modules/ansi-regex": {
1845 | "version": "5.0.1",
1846 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
1847 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
1848 | "dev": true,
1849 | "engines": {
1850 | "node": ">=8"
1851 | }
1852 | },
1853 | "node_modules/wrap-ansi/node_modules/ansi-styles": {
1854 | "version": "4.3.0",
1855 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
1856 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
1857 | "dev": true,
1858 | "dependencies": {
1859 | "color-convert": "^2.0.1"
1860 | },
1861 | "engines": {
1862 | "node": ">=8"
1863 | },
1864 | "funding": {
1865 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1866 | }
1867 | },
1868 | "node_modules/wrap-ansi/node_modules/strip-ansi": {
1869 | "version": "6.0.1",
1870 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1871 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1872 | "dev": true,
1873 | "dependencies": {
1874 | "ansi-regex": "^5.0.1"
1875 | },
1876 | "engines": {
1877 | "node": ">=8"
1878 | }
1879 | },
1880 | "node_modules/ws": {
1881 | "version": "8.11.0",
1882 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
1883 | "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
1884 | "dev": true,
1885 | "engines": {
1886 | "node": ">=10.0.0"
1887 | },
1888 | "peerDependencies": {
1889 | "bufferutil": "^4.0.1",
1890 | "utf-8-validate": "^5.0.2"
1891 | },
1892 | "peerDependenciesMeta": {
1893 | "bufferutil": {
1894 | "optional": true
1895 | },
1896 | "utf-8-validate": {
1897 | "optional": true
1898 | }
1899 | }
1900 | },
1901 | "node_modules/xmlhttprequest-ssl": {
1902 | "version": "2.0.0",
1903 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz",
1904 | "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==",
1905 | "dev": true,
1906 | "engines": {
1907 | "node": ">=0.4.0"
1908 | }
1909 | },
1910 | "node_modules/y18n": {
1911 | "version": "5.0.8",
1912 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
1913 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
1914 | "dev": true,
1915 | "engines": {
1916 | "node": ">=10"
1917 | }
1918 | },
1919 | "node_modules/yargs": {
1920 | "version": "17.7.0",
1921 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.0.tgz",
1922 | "integrity": "sha512-dwqOPg5trmrre9+v8SUo2q/hAwyKoVfu8OC1xPHKJGNdxAvPl4sKxL4vBnh3bQz/ZvvGAFeA5H3ou2kcOY8sQQ==",
1923 | "dev": true,
1924 | "dependencies": {
1925 | "cliui": "^8.0.1",
1926 | "escalade": "^3.1.1",
1927 | "get-caller-file": "^2.0.5",
1928 | "require-directory": "^2.1.1",
1929 | "string-width": "^4.2.3",
1930 | "y18n": "^5.0.5",
1931 | "yargs-parser": "^21.1.1"
1932 | },
1933 | "engines": {
1934 | "node": ">=12"
1935 | }
1936 | },
1937 | "node_modules/yargs-parser": {
1938 | "version": "21.1.1",
1939 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
1940 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
1941 | "dev": true,
1942 | "engines": {
1943 | "node": ">=12"
1944 | }
1945 | }
1946 | }
1947 | }
1948 |
--------------------------------------------------------------------------------
/recorded/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "recorded",
3 | "version": "0.0.1",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "npx browser-sync start --server --files src/*.js",
8 | "test": "echo \"Error: no test specified\" && exit 1"
9 | },
10 | "keywords": [],
11 | "author": "",
12 | "license": "ISC",
13 | "devDependencies": {
14 | "browser-sync": "^2.27.11"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/recorded/src/gestures.js:
--------------------------------------------------------------------------------
1 | const { GestureDescription, Finger, FingerCurl, FingerDirection } = window.fp;
2 |
3 | const rockGesture = new GestureDescription('rock'); // ✊️
4 | const paperGesture = new GestureDescription('paper'); // 🖐
5 | const scissorsGesture = new GestureDescription('scissors'); // ✌️
6 | const dontGesture = new GestureDescription('dont'); // 🙅
7 |
8 |
9 | // Rock
10 | // -----------------------------------------------------------------------------
11 |
12 | // thumb: half curled
13 | // accept no curl with a bit lower confidence
14 | rockGesture.addCurl(Finger.Thumb, FingerCurl.HalfCurl, 1.0);
15 | rockGesture.addCurl(Finger.Thumb, FingerCurl.NoCurl, 0.5);
16 |
17 | // all other fingers: curled
18 | for(let finger of [Finger.Index, Finger.Middle, Finger.Ring, Finger.Pinky]) {
19 | rockGesture.addCurl(finger, FingerCurl.FullCurl, 1.0);
20 | rockGesture.addCurl(finger, FingerCurl.HalfCurl, 0.9);
21 | }
22 |
23 |
24 | // Paper
25 | // -----------------------------------------------------------------------------
26 |
27 | // no finger should be curled
28 | for(let finger of Finger.all) {
29 | paperGesture.addCurl(finger, FingerCurl.NoCurl, 1.0);
30 | }
31 |
32 |
33 | // Scissors
34 | //------------------------------------------------------------------------------
35 |
36 | // index and middle finger: stretched out
37 | scissorsGesture.addCurl(Finger.Index, FingerCurl.NoCurl, 1.0);
38 | scissorsGesture.addCurl(Finger.Middle, FingerCurl.NoCurl, 1.0);
39 |
40 | // ring: curled
41 | scissorsGesture.addCurl(Finger.Ring, FingerCurl.FullCurl, 1.0);
42 | scissorsGesture.addCurl(Finger.Ring, FingerCurl.HalfCurl, 0.9);
43 |
44 | // pinky: curled
45 | scissorsGesture.addCurl(Finger.Pinky, FingerCurl.FullCurl, 1.0);
46 | scissorsGesture.addCurl(Finger.Pinky, FingerCurl.HalfCurl, 0.9);
47 |
48 | // Dont 🙅
49 | //------------------------------------------------------------------------------
50 |
51 | for(const finger of Finger.all) {
52 | dontGesture.addCurl(finger, FingerCurl.NoCurl, 1.0)
53 | dontGesture.addCurl(finger, FingerCurl.HalfCurl, 0.8)
54 |
55 | dontGesture.addDirection(finger, FingerDirection.DiagonalUpRight, 1.0)
56 | dontGesture.addDirection(finger, FingerDirection.DiagonalUpLeft, 1.0)
57 |
58 | dontGesture.addDirection(finger, FingerDirection.HorizontalRight, 1.0)
59 | dontGesture.addDirection(finger, FingerDirection.HorizontalLeft, 1.0)
60 | }
61 |
62 |
63 | const gestures = [
64 | rockGesture, paperGesture, scissorsGesture, dontGesture
65 | ]
66 |
67 | export {
68 | gestures
69 | }
--------------------------------------------------------------------------------
/recorded/src/index.js:
--------------------------------------------------------------------------------
1 |
2 | import { gestures } from "./gestures.js"
3 | const config = {
4 | video: { width: 640, height: 480, fps: 30 }
5 | }
6 |
7 | const landmarkColors = {
8 | thumb: 'red',
9 | index: 'blue',
10 | middle: 'yellow',
11 | ring: 'green',
12 | pinky: 'pink',
13 | wrist: 'white'
14 | }
15 |
16 | const gestureStrings = {
17 | 'thumbs_up': '👍',
18 | 'victory': '✌🏻',
19 | 'rock': '✊️',
20 | 'paper': '🖐',
21 | 'scissors': '✌️',
22 | 'dont': '🙅'
23 | }
24 |
25 | const base = ['Horizontal ', 'Diagonal Up ']
26 | const dont = {
27 | left: [...base].map(i => i.concat(`Right`)),
28 | right: [...base].map(i => i.concat(`Left`))
29 | }
30 |
31 | async function createDetector() {
32 | return window.handPoseDetection.createDetector(
33 | window.handPoseDetection.SupportedModels.MediaPipeHands,
34 | {
35 | runtime: "mediapipe",
36 | modelType: "full",
37 | maxHands: 2,
38 | solutionPath: `https://cdn.jsdelivr.net/npm/@mediapipe/hands@0.4.1646424915`,
39 | }
40 | )
41 | }
42 |
43 | async function main() {
44 |
45 | const video = document.querySelector("#pose-video")
46 | const canvas = document.querySelector("#pose-canvas")
47 | const ctx = canvas.getContext("2d")
48 |
49 | const resultLayer = {
50 | right: document.querySelector("#pose-result-right"),
51 | left: document.querySelector("#pose-result-left")
52 | }
53 | // configure gesture estimator
54 | // add "✌🏻" and "👍" as sample gestures
55 | const knownGestures = [
56 | fp.Gestures.VictoryGesture,
57 | fp.Gestures.ThumbsUpGesture,
58 | ...gestures
59 | ]
60 | const GE = new fp.GestureEstimator(knownGestures)
61 | // load handpose model
62 | const detector = await createDetector()
63 | console.log("mediaPose model loaded")
64 | const pair = new Set()
65 |
66 | function checkGestureCombination(chosenHand, poseData) {
67 | const addToPairIfCorrect = (chosenHand) => {
68 | const containsHand = poseData.some(finger => dont[chosenHand].includes(finger[2]))
69 | if(!containsHand) return;
70 | pair.add(chosenHand)
71 | }
72 |
73 | addToPairIfCorrect(chosenHand)
74 | if(pair.size !== 2) return;
75 | resultLayer.left.innerText = resultLayer.right.innerText = gestureStrings.dont
76 | pair.clear()
77 | }
78 | // main estimation loop
79 | const estimateHands = async () => {
80 |
81 | // clear canvas overlay
82 | ctx.clearRect(0, 0, config.video.width, config.video.height)
83 | resultLayer.right.innerText = ''
84 | resultLayer.left.innerText = ''
85 |
86 | // get hand landmarks from video
87 | const hands = await detector.estimateHands(video, {
88 | flipHorizontal: true
89 | })
90 |
91 | for (const hand of hands) {
92 | for (const keypoint of hand.keypoints) {
93 | const name = keypoint.name.split('_')[0].toString().toLowerCase()
94 | const color = landmarkColors[name]
95 | drawPoint(ctx, keypoint.x, keypoint.y, 3, color)
96 | }
97 |
98 | const keypoints3D = hand.keypoints3D.map(keypoint => [keypoint.x, keypoint.y, keypoint.z])
99 | const predictions = GE.estimate(keypoints3D, 9)
100 | if(!predictions.gestures.length) {
101 | updateDebugInfo(predictions.poseData, 'left')
102 | }
103 |
104 | if (predictions.gestures.length > 0) {
105 |
106 | const result = predictions.gestures.reduce((p, c) => (p.score > c.score) ? p : c)
107 | const found = gestureStrings[result.name]
108 | // find gesture with highest match score
109 | const chosenHand = hand.handedness.toLowerCase()
110 | updateDebugInfo(predictions.poseData, chosenHand)
111 |
112 | if(found !== gestureStrings.dont) {
113 | resultLayer[chosenHand].innerText = found
114 | continue
115 | }
116 | checkGestureCombination(chosenHand, predictions.poseData)
117 | }
118 |
119 | }
120 | // ...and so on
121 | setTimeout(() => { estimateHands() }, 1000 / config.video.fps)
122 | }
123 |
124 | estimateHands()
125 | console.log("Starting predictions")
126 | }
127 |
128 | async function initCamera(width, height, fps) {
129 |
130 | const constraints = {
131 | audio: false,
132 | video: {
133 | facingMode: "user",
134 | width: width,
135 | height: height,
136 | frameRate: { max: fps }
137 | }
138 | }
139 |
140 | const video = document.querySelector("#pose-video")
141 | video.width = width
142 | video.height = height
143 |
144 | // get video stream
145 | const stream = await navigator.mediaDevices.getUserMedia(constraints)
146 | video.srcObject = stream
147 |
148 | return new Promise(resolve => {
149 | video.onloadedmetadata = () => { resolve(video) }
150 | })
151 | }
152 |
153 | function drawPoint(ctx, x, y, r, color) {
154 | ctx.beginPath()
155 | ctx.arc(x, y, r, 0, 2 * Math.PI)
156 | ctx.fillStyle = color
157 | ctx.fill()
158 | }
159 |
160 | function updateDebugInfo(data, hand) {
161 | const summaryTable = `#summary-${hand}`
162 | for (let fingerIdx in data) {
163 | document.querySelector(`${summaryTable} span#curl-${fingerIdx}`).innerHTML = data[fingerIdx][1]
164 | document.querySelector(`${summaryTable} span#dir-${fingerIdx}`).innerHTML = data[fingerIdx][2]
165 | }
166 | }
167 |
168 | window.addEventListener("DOMContentLoaded", () => {
169 |
170 | initCamera(
171 | config.video.width, config.video.height, config.video.fps
172 | ).then(video => {
173 | video.play()
174 | video.addEventListener("loadeddata", event => {
175 | console.log("Camera is ready")
176 | main()
177 | })
178 | })
179 |
180 | const canvas = document.querySelector("#pose-canvas")
181 | canvas.width = config.video.width
182 | canvas.height = config.video.height
183 | console.log("Canvas initialized")
184 | })
185 |
--------------------------------------------------------------------------------