trretretret commited on
Commit
26ab438
·
1 Parent(s): 3b0ef47
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitignore +4 -0
  2. Dockerfile +40 -0
  3. README.md +9 -5
  4. buildrun_docker.sh +1 -0
  5. dev.sh +4 -0
  6. package-lock.json +1479 -0
  7. package.json +22 -0
  8. public/ainote/bear58.png +0 -0
  9. public/ainote/build.sh +7 -0
  10. public/ainote/controller.js +124 -0
  11. public/ainote/esltool.js +160 -0
  12. public/ainote/favicon.ico +0 -0
  13. public/ainote/icon/icons8-microsoft-edge-192.png +0 -0
  14. public/ainote/icon/icons8-microsoft-edge-512.png +0 -0
  15. public/ainote/index.html +73 -0
  16. public/ainote/index.js +3 -0
  17. public/ainote/libs/toastui-editor-all.min.js +0 -0
  18. public/ainote/libs/toastui-editor.min.css +0 -0
  19. public/ainote/manifest.json +22 -0
  20. public/ainote/model.js +32 -0
  21. public/ainote/notebin.js +295 -0
  22. public/ainote/package-lock.json +1102 -0
  23. public/ainote/package.json +17 -0
  24. public/ainote/start.sh +3 -0
  25. public/ainote/test.html +70 -0
  26. public/ainote/test/test.html +86 -0
  27. public/ainote/test/test.js +19 -0
  28. public/ainote/test/transcribe.html +100 -0
  29. public/ainote/test/transcribe.js +74 -0
  30. public/ainote/test/transcribex.html +100 -0
  31. public/ainote/test/transcribex.js +74 -0
  32. public/ainote/utils.js +886 -0
  33. public/ainote/view.js +280 -0
  34. public/ainote/vite.config.js +12 -0
  35. public/bear58.png +0 -0
  36. public/build.sh +7 -0
  37. public/controller.js +124 -0
  38. public/esltool.js +160 -0
  39. public/favicon.ico +0 -0
  40. public/icon/icons8-microsoft-edge-192.png +0 -0
  41. public/icon/icons8-microsoft-edge-512.png +0 -0
  42. public/index.html +73 -0
  43. public/index.js +68 -0
  44. public/libs/toastui-editor-all.min.js +0 -0
  45. public/libs/toastui-editor.min.css +0 -0
  46. public/manifest.json +22 -0
  47. public/model.js +32 -0
  48. public/notebin.js +295 -0
  49. public/package-lock.json +1102 -0
  50. public/package.json +17 -0
.gitignore ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ public/ainote/node_modules
2
+ node_modules
3
+ kvStore
4
+ .env
Dockerfile ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use the official Alpine as a base image
2
+ FROM debian:12
3
+
4
+ # Set environment variables for Python and NVM installation
5
+ ENV PYTHON_VERSION=3.10.9
6
+ ENV NODE_VERSION=20.0.0
7
+ ENV NVM_DIR=/root/.nvm
8
+
9
+ # Install dependencies
10
+ RUN apt update -y && \
11
+ apt install -y htop wget aria2 curl git gcc \
12
+ && rm -rf /var/cache/apt
13
+
14
+
15
+ # Install NVM and Node.js
16
+ RUN mkdir -p $NVM_DIR
17
+ RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash
18
+ RUN . $NVM_DIR/nvm.sh && \
19
+ nvm install $NODE_VERSION && \
20
+ nvm use $NODE_VERSION && \
21
+ nvm alias default $NODE_VERSION
22
+
23
+ # Add NVM to PATH
24
+ ENV PATH=$NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH
25
+
26
+ # Verify installations
27
+ # RUN python3 --version
28
+ # RUN node --version
29
+ # RUN npm --version
30
+
31
+
32
+
33
+ # Copy application code to the container
34
+ COPY ./ /root/app
35
+ RUN chmod -R 777 /root
36
+
37
+ # Set working directory
38
+ WORKDIR /root/app
39
+ # Default command
40
+ CMD ["bash","startinhgspace.sh"]
README.md CHANGED
@@ -1,10 +1,14 @@
1
  ---
2
- title: Groqnote
3
- emoji: 🦀
4
- colorFrom: blue
5
- colorTo: gray
6
  sdk: docker
7
  pinned: false
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
1
  ---
2
+ title: groqnote
3
+ emoji: 🐨
4
+ colorFrom: red
5
+ colorTo: red
6
  sdk: docker
7
  pinned: false
8
  ---
9
 
10
+ set up env variable first:
11
+ AI_SERVER_URL=https://api.groq.com
12
+ AI_API_KEY=youapikey
13
+
14
+
buildrun_docker.sh ADDED
@@ -0,0 +1 @@
 
 
1
+ docker build -t aiser . && docker run -it aiser
dev.sh ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ . .env
2
+
3
+ npx nodemon --ignore kvStore server.js
4
+
package-lock.json ADDED
@@ -0,0 +1,1479 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "aiser",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "aiser",
9
+ "version": "1.0.0",
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "axios": "^1.6.8",
13
+ "body-parser": "^1.20.2",
14
+ "dotenv": "^16.4.5",
15
+ "express": "^4.19.2",
16
+ "express-rate-limit": "^7.2.0",
17
+ "http-proxy-middleware": "^3.0.0",
18
+ "multer": "^1.4.5-lts.1",
19
+ "request": "^2.88.2"
20
+ }
21
+ },
22
+ "node_modules/@types/http-proxy": {
23
+ "version": "1.17.14",
24
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz",
25
+ "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==",
26
+ "dependencies": {
27
+ "@types/node": "*"
28
+ }
29
+ },
30
+ "node_modules/@types/node": {
31
+ "version": "20.12.12",
32
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz",
33
+ "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==",
34
+ "dependencies": {
35
+ "undici-types": "~5.26.4"
36
+ }
37
+ },
38
+ "node_modules/accepts": {
39
+ "version": "1.3.8",
40
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
41
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
42
+ "dependencies": {
43
+ "mime-types": "~2.1.34",
44
+ "negotiator": "0.6.3"
45
+ },
46
+ "engines": {
47
+ "node": ">= 0.6"
48
+ }
49
+ },
50
+ "node_modules/ajv": {
51
+ "version": "6.12.6",
52
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
53
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
54
+ "dependencies": {
55
+ "fast-deep-equal": "^3.1.1",
56
+ "fast-json-stable-stringify": "^2.0.0",
57
+ "json-schema-traverse": "^0.4.1",
58
+ "uri-js": "^4.2.2"
59
+ },
60
+ "funding": {
61
+ "type": "github",
62
+ "url": "https://github.com/sponsors/epoberezkin"
63
+ }
64
+ },
65
+ "node_modules/append-field": {
66
+ "version": "1.0.0",
67
+ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
68
+ "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw=="
69
+ },
70
+ "node_modules/array-flatten": {
71
+ "version": "1.1.1",
72
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
73
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
74
+ },
75
+ "node_modules/asn1": {
76
+ "version": "0.2.6",
77
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
78
+ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
79
+ "dependencies": {
80
+ "safer-buffer": "~2.1.0"
81
+ }
82
+ },
83
+ "node_modules/assert-plus": {
84
+ "version": "1.0.0",
85
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
86
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
87
+ "engines": {
88
+ "node": ">=0.8"
89
+ }
90
+ },
91
+ "node_modules/asynckit": {
92
+ "version": "0.4.0",
93
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
94
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
95
+ },
96
+ "node_modules/aws-sign2": {
97
+ "version": "0.7.0",
98
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
99
+ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
100
+ "engines": {
101
+ "node": "*"
102
+ }
103
+ },
104
+ "node_modules/aws4": {
105
+ "version": "1.12.0",
106
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
107
+ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg=="
108
+ },
109
+ "node_modules/axios": {
110
+ "version": "1.6.8",
111
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz",
112
+ "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
113
+ "dependencies": {
114
+ "follow-redirects": "^1.15.6",
115
+ "form-data": "^4.0.0",
116
+ "proxy-from-env": "^1.1.0"
117
+ }
118
+ },
119
+ "node_modules/bcrypt-pbkdf": {
120
+ "version": "1.0.2",
121
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
122
+ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
123
+ "dependencies": {
124
+ "tweetnacl": "^0.14.3"
125
+ }
126
+ },
127
+ "node_modules/body-parser": {
128
+ "version": "1.20.2",
129
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
130
+ "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
131
+ "dependencies": {
132
+ "bytes": "3.1.2",
133
+ "content-type": "~1.0.5",
134
+ "debug": "2.6.9",
135
+ "depd": "2.0.0",
136
+ "destroy": "1.2.0",
137
+ "http-errors": "2.0.0",
138
+ "iconv-lite": "0.4.24",
139
+ "on-finished": "2.4.1",
140
+ "qs": "6.11.0",
141
+ "raw-body": "2.5.2",
142
+ "type-is": "~1.6.18",
143
+ "unpipe": "1.0.0"
144
+ },
145
+ "engines": {
146
+ "node": ">= 0.8",
147
+ "npm": "1.2.8000 || >= 1.4.16"
148
+ }
149
+ },
150
+ "node_modules/braces": {
151
+ "version": "3.0.2",
152
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
153
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
154
+ "dependencies": {
155
+ "fill-range": "^7.0.1"
156
+ },
157
+ "engines": {
158
+ "node": ">=8"
159
+ }
160
+ },
161
+ "node_modules/buffer-from": {
162
+ "version": "1.1.2",
163
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
164
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
165
+ },
166
+ "node_modules/busboy": {
167
+ "version": "1.6.0",
168
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
169
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
170
+ "dependencies": {
171
+ "streamsearch": "^1.1.0"
172
+ },
173
+ "engines": {
174
+ "node": ">=10.16.0"
175
+ }
176
+ },
177
+ "node_modules/bytes": {
178
+ "version": "3.1.2",
179
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
180
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
181
+ "engines": {
182
+ "node": ">= 0.8"
183
+ }
184
+ },
185
+ "node_modules/call-bind": {
186
+ "version": "1.0.7",
187
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
188
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
189
+ "dependencies": {
190
+ "es-define-property": "^1.0.0",
191
+ "es-errors": "^1.3.0",
192
+ "function-bind": "^1.1.2",
193
+ "get-intrinsic": "^1.2.4",
194
+ "set-function-length": "^1.2.1"
195
+ },
196
+ "engines": {
197
+ "node": ">= 0.4"
198
+ },
199
+ "funding": {
200
+ "url": "https://github.com/sponsors/ljharb"
201
+ }
202
+ },
203
+ "node_modules/caseless": {
204
+ "version": "0.12.0",
205
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
206
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
207
+ },
208
+ "node_modules/combined-stream": {
209
+ "version": "1.0.8",
210
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
211
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
212
+ "dependencies": {
213
+ "delayed-stream": "~1.0.0"
214
+ },
215
+ "engines": {
216
+ "node": ">= 0.8"
217
+ }
218
+ },
219
+ "node_modules/concat-stream": {
220
+ "version": "1.6.2",
221
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
222
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
223
+ "engines": [
224
+ "node >= 0.8"
225
+ ],
226
+ "dependencies": {
227
+ "buffer-from": "^1.0.0",
228
+ "inherits": "^2.0.3",
229
+ "readable-stream": "^2.2.2",
230
+ "typedarray": "^0.0.6"
231
+ }
232
+ },
233
+ "node_modules/content-disposition": {
234
+ "version": "0.5.4",
235
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
236
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
237
+ "dependencies": {
238
+ "safe-buffer": "5.2.1"
239
+ },
240
+ "engines": {
241
+ "node": ">= 0.6"
242
+ }
243
+ },
244
+ "node_modules/content-type": {
245
+ "version": "1.0.5",
246
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
247
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
248
+ "engines": {
249
+ "node": ">= 0.6"
250
+ }
251
+ },
252
+ "node_modules/cookie": {
253
+ "version": "0.6.0",
254
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
255
+ "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
256
+ "engines": {
257
+ "node": ">= 0.6"
258
+ }
259
+ },
260
+ "node_modules/cookie-signature": {
261
+ "version": "1.0.6",
262
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
263
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
264
+ },
265
+ "node_modules/core-util-is": {
266
+ "version": "1.0.2",
267
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
268
+ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
269
+ },
270
+ "node_modules/dashdash": {
271
+ "version": "1.14.1",
272
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
273
+ "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
274
+ "dependencies": {
275
+ "assert-plus": "^1.0.0"
276
+ },
277
+ "engines": {
278
+ "node": ">=0.10"
279
+ }
280
+ },
281
+ "node_modules/debug": {
282
+ "version": "2.6.9",
283
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
284
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
285
+ "dependencies": {
286
+ "ms": "2.0.0"
287
+ }
288
+ },
289
+ "node_modules/define-data-property": {
290
+ "version": "1.1.4",
291
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
292
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
293
+ "dependencies": {
294
+ "es-define-property": "^1.0.0",
295
+ "es-errors": "^1.3.0",
296
+ "gopd": "^1.0.1"
297
+ },
298
+ "engines": {
299
+ "node": ">= 0.4"
300
+ },
301
+ "funding": {
302
+ "url": "https://github.com/sponsors/ljharb"
303
+ }
304
+ },
305
+ "node_modules/delayed-stream": {
306
+ "version": "1.0.0",
307
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
308
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
309
+ "engines": {
310
+ "node": ">=0.4.0"
311
+ }
312
+ },
313
+ "node_modules/depd": {
314
+ "version": "2.0.0",
315
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
316
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
317
+ "engines": {
318
+ "node": ">= 0.8"
319
+ }
320
+ },
321
+ "node_modules/destroy": {
322
+ "version": "1.2.0",
323
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
324
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
325
+ "engines": {
326
+ "node": ">= 0.8",
327
+ "npm": "1.2.8000 || >= 1.4.16"
328
+ }
329
+ },
330
+ "node_modules/dotenv": {
331
+ "version": "16.4.5",
332
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
333
+ "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
334
+ "engines": {
335
+ "node": ">=12"
336
+ },
337
+ "funding": {
338
+ "url": "https://dotenvx.com"
339
+ }
340
+ },
341
+ "node_modules/ecc-jsbn": {
342
+ "version": "0.1.2",
343
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
344
+ "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
345
+ "dependencies": {
346
+ "jsbn": "~0.1.0",
347
+ "safer-buffer": "^2.1.0"
348
+ }
349
+ },
350
+ "node_modules/ee-first": {
351
+ "version": "1.1.1",
352
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
353
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
354
+ },
355
+ "node_modules/encodeurl": {
356
+ "version": "1.0.2",
357
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
358
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
359
+ "engines": {
360
+ "node": ">= 0.8"
361
+ }
362
+ },
363
+ "node_modules/es-define-property": {
364
+ "version": "1.0.0",
365
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
366
+ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
367
+ "dependencies": {
368
+ "get-intrinsic": "^1.2.4"
369
+ },
370
+ "engines": {
371
+ "node": ">= 0.4"
372
+ }
373
+ },
374
+ "node_modules/es-errors": {
375
+ "version": "1.3.0",
376
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
377
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
378
+ "engines": {
379
+ "node": ">= 0.4"
380
+ }
381
+ },
382
+ "node_modules/escape-html": {
383
+ "version": "1.0.3",
384
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
385
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
386
+ },
387
+ "node_modules/etag": {
388
+ "version": "1.8.1",
389
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
390
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
391
+ "engines": {
392
+ "node": ">= 0.6"
393
+ }
394
+ },
395
+ "node_modules/eventemitter3": {
396
+ "version": "4.0.7",
397
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
398
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
399
+ },
400
+ "node_modules/express": {
401
+ "version": "4.19.2",
402
+ "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
403
+ "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
404
+ "dependencies": {
405
+ "accepts": "~1.3.8",
406
+ "array-flatten": "1.1.1",
407
+ "body-parser": "1.20.2",
408
+ "content-disposition": "0.5.4",
409
+ "content-type": "~1.0.4",
410
+ "cookie": "0.6.0",
411
+ "cookie-signature": "1.0.6",
412
+ "debug": "2.6.9",
413
+ "depd": "2.0.0",
414
+ "encodeurl": "~1.0.2",
415
+ "escape-html": "~1.0.3",
416
+ "etag": "~1.8.1",
417
+ "finalhandler": "1.2.0",
418
+ "fresh": "0.5.2",
419
+ "http-errors": "2.0.0",
420
+ "merge-descriptors": "1.0.1",
421
+ "methods": "~1.1.2",
422
+ "on-finished": "2.4.1",
423
+ "parseurl": "~1.3.3",
424
+ "path-to-regexp": "0.1.7",
425
+ "proxy-addr": "~2.0.7",
426
+ "qs": "6.11.0",
427
+ "range-parser": "~1.2.1",
428
+ "safe-buffer": "5.2.1",
429
+ "send": "0.18.0",
430
+ "serve-static": "1.15.0",
431
+ "setprototypeof": "1.2.0",
432
+ "statuses": "2.0.1",
433
+ "type-is": "~1.6.18",
434
+ "utils-merge": "1.0.1",
435
+ "vary": "~1.1.2"
436
+ },
437
+ "engines": {
438
+ "node": ">= 0.10.0"
439
+ }
440
+ },
441
+ "node_modules/express-rate-limit": {
442
+ "version": "7.2.0",
443
+ "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.2.0.tgz",
444
+ "integrity": "sha512-T7nul1t4TNyfZMJ7pKRKkdeVJWa2CqB8NA1P8BwYaoDI5QSBZARv5oMS43J7b7I5P+4asjVXjb7ONuwDKucahg==",
445
+ "engines": {
446
+ "node": ">= 16"
447
+ },
448
+ "funding": {
449
+ "url": "https://github.com/sponsors/express-rate-limit"
450
+ },
451
+ "peerDependencies": {
452
+ "express": "4 || 5 || ^5.0.0-beta.1"
453
+ }
454
+ },
455
+ "node_modules/extend": {
456
+ "version": "3.0.2",
457
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
458
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
459
+ },
460
+ "node_modules/extsprintf": {
461
+ "version": "1.3.0",
462
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
463
+ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
464
+ "engines": [
465
+ "node >=0.6.0"
466
+ ]
467
+ },
468
+ "node_modules/fast-deep-equal": {
469
+ "version": "3.1.3",
470
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
471
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
472
+ },
473
+ "node_modules/fast-json-stable-stringify": {
474
+ "version": "2.1.0",
475
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
476
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
477
+ },
478
+ "node_modules/fill-range": {
479
+ "version": "7.0.1",
480
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
481
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
482
+ "dependencies": {
483
+ "to-regex-range": "^5.0.1"
484
+ },
485
+ "engines": {
486
+ "node": ">=8"
487
+ }
488
+ },
489
+ "node_modules/finalhandler": {
490
+ "version": "1.2.0",
491
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
492
+ "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
493
+ "dependencies": {
494
+ "debug": "2.6.9",
495
+ "encodeurl": "~1.0.2",
496
+ "escape-html": "~1.0.3",
497
+ "on-finished": "2.4.1",
498
+ "parseurl": "~1.3.3",
499
+ "statuses": "2.0.1",
500
+ "unpipe": "~1.0.0"
501
+ },
502
+ "engines": {
503
+ "node": ">= 0.8"
504
+ }
505
+ },
506
+ "node_modules/follow-redirects": {
507
+ "version": "1.15.6",
508
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
509
+ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
510
+ "funding": [
511
+ {
512
+ "type": "individual",
513
+ "url": "https://github.com/sponsors/RubenVerborgh"
514
+ }
515
+ ],
516
+ "engines": {
517
+ "node": ">=4.0"
518
+ },
519
+ "peerDependenciesMeta": {
520
+ "debug": {
521
+ "optional": true
522
+ }
523
+ }
524
+ },
525
+ "node_modules/forever-agent": {
526
+ "version": "0.6.1",
527
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
528
+ "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
529
+ "engines": {
530
+ "node": "*"
531
+ }
532
+ },
533
+ "node_modules/form-data": {
534
+ "version": "4.0.0",
535
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
536
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
537
+ "dependencies": {
538
+ "asynckit": "^0.4.0",
539
+ "combined-stream": "^1.0.8",
540
+ "mime-types": "^2.1.12"
541
+ },
542
+ "engines": {
543
+ "node": ">= 6"
544
+ }
545
+ },
546
+ "node_modules/forwarded": {
547
+ "version": "0.2.0",
548
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
549
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
550
+ "engines": {
551
+ "node": ">= 0.6"
552
+ }
553
+ },
554
+ "node_modules/fresh": {
555
+ "version": "0.5.2",
556
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
557
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
558
+ "engines": {
559
+ "node": ">= 0.6"
560
+ }
561
+ },
562
+ "node_modules/function-bind": {
563
+ "version": "1.1.2",
564
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
565
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
566
+ "funding": {
567
+ "url": "https://github.com/sponsors/ljharb"
568
+ }
569
+ },
570
+ "node_modules/get-intrinsic": {
571
+ "version": "1.2.4",
572
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
573
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
574
+ "dependencies": {
575
+ "es-errors": "^1.3.0",
576
+ "function-bind": "^1.1.2",
577
+ "has-proto": "^1.0.1",
578
+ "has-symbols": "^1.0.3",
579
+ "hasown": "^2.0.0"
580
+ },
581
+ "engines": {
582
+ "node": ">= 0.4"
583
+ },
584
+ "funding": {
585
+ "url": "https://github.com/sponsors/ljharb"
586
+ }
587
+ },
588
+ "node_modules/getpass": {
589
+ "version": "0.1.7",
590
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
591
+ "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
592
+ "dependencies": {
593
+ "assert-plus": "^1.0.0"
594
+ }
595
+ },
596
+ "node_modules/gopd": {
597
+ "version": "1.0.1",
598
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
599
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
600
+ "dependencies": {
601
+ "get-intrinsic": "^1.1.3"
602
+ },
603
+ "funding": {
604
+ "url": "https://github.com/sponsors/ljharb"
605
+ }
606
+ },
607
+ "node_modules/har-schema": {
608
+ "version": "2.0.0",
609
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
610
+ "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
611
+ "engines": {
612
+ "node": ">=4"
613
+ }
614
+ },
615
+ "node_modules/har-validator": {
616
+ "version": "5.1.5",
617
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
618
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
619
+ "deprecated": "this library is no longer supported",
620
+ "dependencies": {
621
+ "ajv": "^6.12.3",
622
+ "har-schema": "^2.0.0"
623
+ },
624
+ "engines": {
625
+ "node": ">=6"
626
+ }
627
+ },
628
+ "node_modules/has-property-descriptors": {
629
+ "version": "1.0.2",
630
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
631
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
632
+ "dependencies": {
633
+ "es-define-property": "^1.0.0"
634
+ },
635
+ "funding": {
636
+ "url": "https://github.com/sponsors/ljharb"
637
+ }
638
+ },
639
+ "node_modules/has-proto": {
640
+ "version": "1.0.3",
641
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
642
+ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
643
+ "engines": {
644
+ "node": ">= 0.4"
645
+ },
646
+ "funding": {
647
+ "url": "https://github.com/sponsors/ljharb"
648
+ }
649
+ },
650
+ "node_modules/has-symbols": {
651
+ "version": "1.0.3",
652
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
653
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
654
+ "engines": {
655
+ "node": ">= 0.4"
656
+ },
657
+ "funding": {
658
+ "url": "https://github.com/sponsors/ljharb"
659
+ }
660
+ },
661
+ "node_modules/hasown": {
662
+ "version": "2.0.2",
663
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
664
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
665
+ "dependencies": {
666
+ "function-bind": "^1.1.2"
667
+ },
668
+ "engines": {
669
+ "node": ">= 0.4"
670
+ }
671
+ },
672
+ "node_modules/http-errors": {
673
+ "version": "2.0.0",
674
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
675
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
676
+ "dependencies": {
677
+ "depd": "2.0.0",
678
+ "inherits": "2.0.4",
679
+ "setprototypeof": "1.2.0",
680
+ "statuses": "2.0.1",
681
+ "toidentifier": "1.0.1"
682
+ },
683
+ "engines": {
684
+ "node": ">= 0.8"
685
+ }
686
+ },
687
+ "node_modules/http-proxy": {
688
+ "version": "1.18.1",
689
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
690
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
691
+ "dependencies": {
692
+ "eventemitter3": "^4.0.0",
693
+ "follow-redirects": "^1.0.0",
694
+ "requires-port": "^1.0.0"
695
+ },
696
+ "engines": {
697
+ "node": ">=8.0.0"
698
+ }
699
+ },
700
+ "node_modules/http-proxy-middleware": {
701
+ "version": "3.0.0",
702
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.0.tgz",
703
+ "integrity": "sha512-36AV1fIaI2cWRzHo+rbcxhe3M3jUDCNzc4D5zRl57sEWRAxdXYtw7FSQKYY6PDKssiAKjLYypbssHk+xs/kMXw==",
704
+ "dependencies": {
705
+ "@types/http-proxy": "^1.17.10",
706
+ "debug": "^4.3.4",
707
+ "http-proxy": "^1.18.1",
708
+ "is-glob": "^4.0.1",
709
+ "is-plain-obj": "^3.0.0",
710
+ "micromatch": "^4.0.5"
711
+ },
712
+ "engines": {
713
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
714
+ }
715
+ },
716
+ "node_modules/http-proxy-middleware/node_modules/debug": {
717
+ "version": "4.3.4",
718
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
719
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
720
+ "dependencies": {
721
+ "ms": "2.1.2"
722
+ },
723
+ "engines": {
724
+ "node": ">=6.0"
725
+ },
726
+ "peerDependenciesMeta": {
727
+ "supports-color": {
728
+ "optional": true
729
+ }
730
+ }
731
+ },
732
+ "node_modules/http-proxy-middleware/node_modules/ms": {
733
+ "version": "2.1.2",
734
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
735
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
736
+ },
737
+ "node_modules/http-signature": {
738
+ "version": "1.2.0",
739
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
740
+ "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
741
+ "dependencies": {
742
+ "assert-plus": "^1.0.0",
743
+ "jsprim": "^1.2.2",
744
+ "sshpk": "^1.7.0"
745
+ },
746
+ "engines": {
747
+ "node": ">=0.8",
748
+ "npm": ">=1.3.7"
749
+ }
750
+ },
751
+ "node_modules/iconv-lite": {
752
+ "version": "0.4.24",
753
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
754
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
755
+ "dependencies": {
756
+ "safer-buffer": ">= 2.1.2 < 3"
757
+ },
758
+ "engines": {
759
+ "node": ">=0.10.0"
760
+ }
761
+ },
762
+ "node_modules/inherits": {
763
+ "version": "2.0.4",
764
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
765
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
766
+ },
767
+ "node_modules/ipaddr.js": {
768
+ "version": "1.9.1",
769
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
770
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
771
+ "engines": {
772
+ "node": ">= 0.10"
773
+ }
774
+ },
775
+ "node_modules/is-extglob": {
776
+ "version": "2.1.1",
777
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
778
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
779
+ "engines": {
780
+ "node": ">=0.10.0"
781
+ }
782
+ },
783
+ "node_modules/is-glob": {
784
+ "version": "4.0.3",
785
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
786
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
787
+ "dependencies": {
788
+ "is-extglob": "^2.1.1"
789
+ },
790
+ "engines": {
791
+ "node": ">=0.10.0"
792
+ }
793
+ },
794
+ "node_modules/is-number": {
795
+ "version": "7.0.0",
796
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
797
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
798
+ "engines": {
799
+ "node": ">=0.12.0"
800
+ }
801
+ },
802
+ "node_modules/is-plain-obj": {
803
+ "version": "3.0.0",
804
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
805
+ "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
806
+ "engines": {
807
+ "node": ">=10"
808
+ },
809
+ "funding": {
810
+ "url": "https://github.com/sponsors/sindresorhus"
811
+ }
812
+ },
813
+ "node_modules/is-typedarray": {
814
+ "version": "1.0.0",
815
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
816
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
817
+ },
818
+ "node_modules/isarray": {
819
+ "version": "1.0.0",
820
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
821
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
822
+ },
823
+ "node_modules/isstream": {
824
+ "version": "0.1.2",
825
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
826
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
827
+ },
828
+ "node_modules/jsbn": {
829
+ "version": "0.1.1",
830
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
831
+ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
832
+ },
833
+ "node_modules/json-schema": {
834
+ "version": "0.4.0",
835
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
836
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
837
+ },
838
+ "node_modules/json-schema-traverse": {
839
+ "version": "0.4.1",
840
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
841
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
842
+ },
843
+ "node_modules/json-stringify-safe": {
844
+ "version": "5.0.1",
845
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
846
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
847
+ },
848
+ "node_modules/jsprim": {
849
+ "version": "1.4.2",
850
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
851
+ "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
852
+ "dependencies": {
853
+ "assert-plus": "1.0.0",
854
+ "extsprintf": "1.3.0",
855
+ "json-schema": "0.4.0",
856
+ "verror": "1.10.0"
857
+ },
858
+ "engines": {
859
+ "node": ">=0.6.0"
860
+ }
861
+ },
862
+ "node_modules/media-typer": {
863
+ "version": "0.3.0",
864
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
865
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
866
+ "engines": {
867
+ "node": ">= 0.6"
868
+ }
869
+ },
870
+ "node_modules/merge-descriptors": {
871
+ "version": "1.0.1",
872
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
873
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
874
+ },
875
+ "node_modules/methods": {
876
+ "version": "1.1.2",
877
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
878
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
879
+ "engines": {
880
+ "node": ">= 0.6"
881
+ }
882
+ },
883
+ "node_modules/micromatch": {
884
+ "version": "4.0.5",
885
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
886
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
887
+ "dependencies": {
888
+ "braces": "^3.0.2",
889
+ "picomatch": "^2.3.1"
890
+ },
891
+ "engines": {
892
+ "node": ">=8.6"
893
+ }
894
+ },
895
+ "node_modules/mime": {
896
+ "version": "1.6.0",
897
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
898
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
899
+ "bin": {
900
+ "mime": "cli.js"
901
+ },
902
+ "engines": {
903
+ "node": ">=4"
904
+ }
905
+ },
906
+ "node_modules/mime-db": {
907
+ "version": "1.52.0",
908
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
909
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
910
+ "engines": {
911
+ "node": ">= 0.6"
912
+ }
913
+ },
914
+ "node_modules/mime-types": {
915
+ "version": "2.1.35",
916
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
917
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
918
+ "dependencies": {
919
+ "mime-db": "1.52.0"
920
+ },
921
+ "engines": {
922
+ "node": ">= 0.6"
923
+ }
924
+ },
925
+ "node_modules/minimist": {
926
+ "version": "1.2.8",
927
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
928
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
929
+ "funding": {
930
+ "url": "https://github.com/sponsors/ljharb"
931
+ }
932
+ },
933
+ "node_modules/mkdirp": {
934
+ "version": "0.5.6",
935
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
936
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
937
+ "dependencies": {
938
+ "minimist": "^1.2.6"
939
+ },
940
+ "bin": {
941
+ "mkdirp": "bin/cmd.js"
942
+ }
943
+ },
944
+ "node_modules/ms": {
945
+ "version": "2.0.0",
946
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
947
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
948
+ },
949
+ "node_modules/multer": {
950
+ "version": "1.4.5-lts.1",
951
+ "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz",
952
+ "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==",
953
+ "dependencies": {
954
+ "append-field": "^1.0.0",
955
+ "busboy": "^1.0.0",
956
+ "concat-stream": "^1.5.2",
957
+ "mkdirp": "^0.5.4",
958
+ "object-assign": "^4.1.1",
959
+ "type-is": "^1.6.4",
960
+ "xtend": "^4.0.0"
961
+ },
962
+ "engines": {
963
+ "node": ">= 6.0.0"
964
+ }
965
+ },
966
+ "node_modules/negotiator": {
967
+ "version": "0.6.3",
968
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
969
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
970
+ "engines": {
971
+ "node": ">= 0.6"
972
+ }
973
+ },
974
+ "node_modules/oauth-sign": {
975
+ "version": "0.9.0",
976
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
977
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
978
+ "engines": {
979
+ "node": "*"
980
+ }
981
+ },
982
+ "node_modules/object-assign": {
983
+ "version": "4.1.1",
984
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
985
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
986
+ "engines": {
987
+ "node": ">=0.10.0"
988
+ }
989
+ },
990
+ "node_modules/object-inspect": {
991
+ "version": "1.13.1",
992
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
993
+ "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
994
+ "funding": {
995
+ "url": "https://github.com/sponsors/ljharb"
996
+ }
997
+ },
998
+ "node_modules/on-finished": {
999
+ "version": "2.4.1",
1000
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1001
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1002
+ "dependencies": {
1003
+ "ee-first": "1.1.1"
1004
+ },
1005
+ "engines": {
1006
+ "node": ">= 0.8"
1007
+ }
1008
+ },
1009
+ "node_modules/parseurl": {
1010
+ "version": "1.3.3",
1011
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1012
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1013
+ "engines": {
1014
+ "node": ">= 0.8"
1015
+ }
1016
+ },
1017
+ "node_modules/path-to-regexp": {
1018
+ "version": "0.1.7",
1019
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1020
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
1021
+ },
1022
+ "node_modules/performance-now": {
1023
+ "version": "2.1.0",
1024
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
1025
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
1026
+ },
1027
+ "node_modules/picomatch": {
1028
+ "version": "2.3.1",
1029
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1030
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1031
+ "engines": {
1032
+ "node": ">=8.6"
1033
+ },
1034
+ "funding": {
1035
+ "url": "https://github.com/sponsors/jonschlinkert"
1036
+ }
1037
+ },
1038
+ "node_modules/process-nextick-args": {
1039
+ "version": "2.0.1",
1040
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1041
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
1042
+ },
1043
+ "node_modules/proxy-addr": {
1044
+ "version": "2.0.7",
1045
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1046
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1047
+ "dependencies": {
1048
+ "forwarded": "0.2.0",
1049
+ "ipaddr.js": "1.9.1"
1050
+ },
1051
+ "engines": {
1052
+ "node": ">= 0.10"
1053
+ }
1054
+ },
1055
+ "node_modules/proxy-from-env": {
1056
+ "version": "1.1.0",
1057
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
1058
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
1059
+ },
1060
+ "node_modules/psl": {
1061
+ "version": "1.9.0",
1062
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
1063
+ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
1064
+ },
1065
+ "node_modules/punycode": {
1066
+ "version": "2.3.1",
1067
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
1068
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
1069
+ "engines": {
1070
+ "node": ">=6"
1071
+ }
1072
+ },
1073
+ "node_modules/qs": {
1074
+ "version": "6.11.0",
1075
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
1076
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
1077
+ "dependencies": {
1078
+ "side-channel": "^1.0.4"
1079
+ },
1080
+ "engines": {
1081
+ "node": ">=0.6"
1082
+ },
1083
+ "funding": {
1084
+ "url": "https://github.com/sponsors/ljharb"
1085
+ }
1086
+ },
1087
+ "node_modules/range-parser": {
1088
+ "version": "1.2.1",
1089
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1090
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1091
+ "engines": {
1092
+ "node": ">= 0.6"
1093
+ }
1094
+ },
1095
+ "node_modules/raw-body": {
1096
+ "version": "2.5.2",
1097
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
1098
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
1099
+ "dependencies": {
1100
+ "bytes": "3.1.2",
1101
+ "http-errors": "2.0.0",
1102
+ "iconv-lite": "0.4.24",
1103
+ "unpipe": "1.0.0"
1104
+ },
1105
+ "engines": {
1106
+ "node": ">= 0.8"
1107
+ }
1108
+ },
1109
+ "node_modules/readable-stream": {
1110
+ "version": "2.3.8",
1111
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
1112
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
1113
+ "dependencies": {
1114
+ "core-util-is": "~1.0.0",
1115
+ "inherits": "~2.0.3",
1116
+ "isarray": "~1.0.0",
1117
+ "process-nextick-args": "~2.0.0",
1118
+ "safe-buffer": "~5.1.1",
1119
+ "string_decoder": "~1.1.1",
1120
+ "util-deprecate": "~1.0.1"
1121
+ }
1122
+ },
1123
+ "node_modules/readable-stream/node_modules/safe-buffer": {
1124
+ "version": "5.1.2",
1125
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1126
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1127
+ },
1128
+ "node_modules/request": {
1129
+ "version": "2.88.2",
1130
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
1131
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
1132
+ "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
1133
+ "dependencies": {
1134
+ "aws-sign2": "~0.7.0",
1135
+ "aws4": "^1.8.0",
1136
+ "caseless": "~0.12.0",
1137
+ "combined-stream": "~1.0.6",
1138
+ "extend": "~3.0.2",
1139
+ "forever-agent": "~0.6.1",
1140
+ "form-data": "~2.3.2",
1141
+ "har-validator": "~5.1.3",
1142
+ "http-signature": "~1.2.0",
1143
+ "is-typedarray": "~1.0.0",
1144
+ "isstream": "~0.1.2",
1145
+ "json-stringify-safe": "~5.0.1",
1146
+ "mime-types": "~2.1.19",
1147
+ "oauth-sign": "~0.9.0",
1148
+ "performance-now": "^2.1.0",
1149
+ "qs": "~6.5.2",
1150
+ "safe-buffer": "^5.1.2",
1151
+ "tough-cookie": "~2.5.0",
1152
+ "tunnel-agent": "^0.6.0",
1153
+ "uuid": "^3.3.2"
1154
+ },
1155
+ "engines": {
1156
+ "node": ">= 6"
1157
+ }
1158
+ },
1159
+ "node_modules/request/node_modules/form-data": {
1160
+ "version": "2.3.3",
1161
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
1162
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
1163
+ "dependencies": {
1164
+ "asynckit": "^0.4.0",
1165
+ "combined-stream": "^1.0.6",
1166
+ "mime-types": "^2.1.12"
1167
+ },
1168
+ "engines": {
1169
+ "node": ">= 0.12"
1170
+ }
1171
+ },
1172
+ "node_modules/request/node_modules/qs": {
1173
+ "version": "6.5.3",
1174
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
1175
+ "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
1176
+ "engines": {
1177
+ "node": ">=0.6"
1178
+ }
1179
+ },
1180
+ "node_modules/requires-port": {
1181
+ "version": "1.0.0",
1182
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
1183
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
1184
+ },
1185
+ "node_modules/safe-buffer": {
1186
+ "version": "5.2.1",
1187
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1188
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1189
+ "funding": [
1190
+ {
1191
+ "type": "github",
1192
+ "url": "https://github.com/sponsors/feross"
1193
+ },
1194
+ {
1195
+ "type": "patreon",
1196
+ "url": "https://www.patreon.com/feross"
1197
+ },
1198
+ {
1199
+ "type": "consulting",
1200
+ "url": "https://feross.org/support"
1201
+ }
1202
+ ]
1203
+ },
1204
+ "node_modules/safer-buffer": {
1205
+ "version": "2.1.2",
1206
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1207
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1208
+ },
1209
+ "node_modules/send": {
1210
+ "version": "0.18.0",
1211
+ "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
1212
+ "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1213
+ "dependencies": {
1214
+ "debug": "2.6.9",
1215
+ "depd": "2.0.0",
1216
+ "destroy": "1.2.0",
1217
+ "encodeurl": "~1.0.2",
1218
+ "escape-html": "~1.0.3",
1219
+ "etag": "~1.8.1",
1220
+ "fresh": "0.5.2",
1221
+ "http-errors": "2.0.0",
1222
+ "mime": "1.6.0",
1223
+ "ms": "2.1.3",
1224
+ "on-finished": "2.4.1",
1225
+ "range-parser": "~1.2.1",
1226
+ "statuses": "2.0.1"
1227
+ },
1228
+ "engines": {
1229
+ "node": ">= 0.8.0"
1230
+ }
1231
+ },
1232
+ "node_modules/send/node_modules/ms": {
1233
+ "version": "2.1.3",
1234
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1235
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1236
+ },
1237
+ "node_modules/serve-static": {
1238
+ "version": "1.15.0",
1239
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
1240
+ "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
1241
+ "dependencies": {
1242
+ "encodeurl": "~1.0.2",
1243
+ "escape-html": "~1.0.3",
1244
+ "parseurl": "~1.3.3",
1245
+ "send": "0.18.0"
1246
+ },
1247
+ "engines": {
1248
+ "node": ">= 0.8.0"
1249
+ }
1250
+ },
1251
+ "node_modules/set-function-length": {
1252
+ "version": "1.2.2",
1253
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
1254
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
1255
+ "dependencies": {
1256
+ "define-data-property": "^1.1.4",
1257
+ "es-errors": "^1.3.0",
1258
+ "function-bind": "^1.1.2",
1259
+ "get-intrinsic": "^1.2.4",
1260
+ "gopd": "^1.0.1",
1261
+ "has-property-descriptors": "^1.0.2"
1262
+ },
1263
+ "engines": {
1264
+ "node": ">= 0.4"
1265
+ }
1266
+ },
1267
+ "node_modules/setprototypeof": {
1268
+ "version": "1.2.0",
1269
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1270
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1271
+ },
1272
+ "node_modules/side-channel": {
1273
+ "version": "1.0.6",
1274
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
1275
+ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
1276
+ "dependencies": {
1277
+ "call-bind": "^1.0.7",
1278
+ "es-errors": "^1.3.0",
1279
+ "get-intrinsic": "^1.2.4",
1280
+ "object-inspect": "^1.13.1"
1281
+ },
1282
+ "engines": {
1283
+ "node": ">= 0.4"
1284
+ },
1285
+ "funding": {
1286
+ "url": "https://github.com/sponsors/ljharb"
1287
+ }
1288
+ },
1289
+ "node_modules/sshpk": {
1290
+ "version": "1.18.0",
1291
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
1292
+ "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
1293
+ "dependencies": {
1294
+ "asn1": "~0.2.3",
1295
+ "assert-plus": "^1.0.0",
1296
+ "bcrypt-pbkdf": "^1.0.0",
1297
+ "dashdash": "^1.12.0",
1298
+ "ecc-jsbn": "~0.1.1",
1299
+ "getpass": "^0.1.1",
1300
+ "jsbn": "~0.1.0",
1301
+ "safer-buffer": "^2.0.2",
1302
+ "tweetnacl": "~0.14.0"
1303
+ },
1304
+ "bin": {
1305
+ "sshpk-conv": "bin/sshpk-conv",
1306
+ "sshpk-sign": "bin/sshpk-sign",
1307
+ "sshpk-verify": "bin/sshpk-verify"
1308
+ },
1309
+ "engines": {
1310
+ "node": ">=0.10.0"
1311
+ }
1312
+ },
1313
+ "node_modules/statuses": {
1314
+ "version": "2.0.1",
1315
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1316
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1317
+ "engines": {
1318
+ "node": ">= 0.8"
1319
+ }
1320
+ },
1321
+ "node_modules/streamsearch": {
1322
+ "version": "1.1.0",
1323
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
1324
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
1325
+ "engines": {
1326
+ "node": ">=10.0.0"
1327
+ }
1328
+ },
1329
+ "node_modules/string_decoder": {
1330
+ "version": "1.1.1",
1331
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1332
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1333
+ "dependencies": {
1334
+ "safe-buffer": "~5.1.0"
1335
+ }
1336
+ },
1337
+ "node_modules/string_decoder/node_modules/safe-buffer": {
1338
+ "version": "5.1.2",
1339
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1340
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1341
+ },
1342
+ "node_modules/to-regex-range": {
1343
+ "version": "5.0.1",
1344
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1345
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1346
+ "dependencies": {
1347
+ "is-number": "^7.0.0"
1348
+ },
1349
+ "engines": {
1350
+ "node": ">=8.0"
1351
+ }
1352
+ },
1353
+ "node_modules/toidentifier": {
1354
+ "version": "1.0.1",
1355
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1356
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1357
+ "engines": {
1358
+ "node": ">=0.6"
1359
+ }
1360
+ },
1361
+ "node_modules/tough-cookie": {
1362
+ "version": "2.5.0",
1363
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
1364
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
1365
+ "dependencies": {
1366
+ "psl": "^1.1.28",
1367
+ "punycode": "^2.1.1"
1368
+ },
1369
+ "engines": {
1370
+ "node": ">=0.8"
1371
+ }
1372
+ },
1373
+ "node_modules/tunnel-agent": {
1374
+ "version": "0.6.0",
1375
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1376
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
1377
+ "dependencies": {
1378
+ "safe-buffer": "^5.0.1"
1379
+ },
1380
+ "engines": {
1381
+ "node": "*"
1382
+ }
1383
+ },
1384
+ "node_modules/tweetnacl": {
1385
+ "version": "0.14.5",
1386
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1387
+ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
1388
+ },
1389
+ "node_modules/type-is": {
1390
+ "version": "1.6.18",
1391
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1392
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1393
+ "dependencies": {
1394
+ "media-typer": "0.3.0",
1395
+ "mime-types": "~2.1.24"
1396
+ },
1397
+ "engines": {
1398
+ "node": ">= 0.6"
1399
+ }
1400
+ },
1401
+ "node_modules/typedarray": {
1402
+ "version": "0.0.6",
1403
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
1404
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
1405
+ },
1406
+ "node_modules/undici-types": {
1407
+ "version": "5.26.5",
1408
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
1409
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
1410
+ },
1411
+ "node_modules/unpipe": {
1412
+ "version": "1.0.0",
1413
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1414
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1415
+ "engines": {
1416
+ "node": ">= 0.8"
1417
+ }
1418
+ },
1419
+ "node_modules/uri-js": {
1420
+ "version": "4.4.1",
1421
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
1422
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
1423
+ "dependencies": {
1424
+ "punycode": "^2.1.0"
1425
+ }
1426
+ },
1427
+ "node_modules/util-deprecate": {
1428
+ "version": "1.0.2",
1429
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1430
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
1431
+ },
1432
+ "node_modules/utils-merge": {
1433
+ "version": "1.0.1",
1434
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1435
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1436
+ "engines": {
1437
+ "node": ">= 0.4.0"
1438
+ }
1439
+ },
1440
+ "node_modules/uuid": {
1441
+ "version": "3.4.0",
1442
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
1443
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
1444
+ "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
1445
+ "bin": {
1446
+ "uuid": "bin/uuid"
1447
+ }
1448
+ },
1449
+ "node_modules/vary": {
1450
+ "version": "1.1.2",
1451
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1452
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1453
+ "engines": {
1454
+ "node": ">= 0.8"
1455
+ }
1456
+ },
1457
+ "node_modules/verror": {
1458
+ "version": "1.10.0",
1459
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
1460
+ "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
1461
+ "engines": [
1462
+ "node >=0.6.0"
1463
+ ],
1464
+ "dependencies": {
1465
+ "assert-plus": "^1.0.0",
1466
+ "core-util-is": "1.0.2",
1467
+ "extsprintf": "^1.2.0"
1468
+ }
1469
+ },
1470
+ "node_modules/xtend": {
1471
+ "version": "4.0.2",
1472
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
1473
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
1474
+ "engines": {
1475
+ "node": ">=0.4"
1476
+ }
1477
+ }
1478
+ }
1479
+ }
package.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "aiser",
3
+ "version": "1.0.0",
4
+ "description": "--- title: Aiser emoji: 🐨 colorFrom: red colorTo: red sdk: docker pinned: false ---",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "test": "echo \"Error: no test specified\" && exit 1"
8
+ },
9
+ "keywords": [],
10
+ "author": "",
11
+ "license": "ISC",
12
+ "dependencies": {
13
+ "axios": "^1.6.8",
14
+ "body-parser": "^1.20.2",
15
+ "dotenv": "^16.4.5",
16
+ "express": "^4.19.2",
17
+ "express-rate-limit": "^7.2.0",
18
+ "http-proxy-middleware": "^3.0.0",
19
+ "multer": "^1.4.5-lts.1",
20
+ "request": "^2.88.2"
21
+ }
22
+ }
public/ainote/bear58.png ADDED
public/ainote/build.sh ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ echo '(() => {' >./dist/index.js
2
+
3
+ cat index.js >>./dist/index.js
4
+
5
+ echo '})();' >> ./dist/index.js
6
+
7
+ cp esltool.js dist/
public/ainote/controller.js ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import { appModel } from './model.js';
3
+ import { utils } from './utils.js';
4
+ import { view } from './view.js';
5
+
6
+ const controller = {
7
+
8
+ async handleRecording(event) {
9
+ let startTime = Date.now();
10
+ let audioblob = await view.recorder.startRecording(view.elem.voiceButton);
11
+
12
+ if (Date.now() - startTime < appModel.minimalRecordTime) {
13
+ utils.showToast("time too short, this will not transcribe");
14
+ return;
15
+ }
16
+
17
+ let transcribe = await utils.stt(audioblob);
18
+ if (!transcribe.text) {
19
+ console.log("transcribe failed, try alternative way");
20
+ transcribe = await whisperjaxws(audioblob); // Replace with your alternative transcription
21
+ }
22
+ utils.writeText(document.activeElement, transcribe.text);
23
+ },
24
+
25
+ async startRecordingWithSilenceDetection(event) {
26
+ let startTime = Date.now();
27
+ let finalAudioblob = await view.recorder.startRecordingWithSilenceDetection(
28
+ view.elem.voiceButton,
29
+ (audioBlob) => {
30
+ utils.stt(audioBlob).then((transcribe) => {
31
+ if (transcribe === false) {
32
+ console.log("transcribe failed, try alternative way");
33
+ whisperjaxws(audioBlob).then((transcribe) => { // Replace with your alternative transcription
34
+ utils.writeText(document.activeElement, transcribe);
35
+ });
36
+ } else {
37
+ utils.writeText(document.activeElement, transcribe.text);
38
+ }
39
+ });
40
+ }
41
+ );
42
+
43
+ if (Date.now() - startTime < appModel.minimalRecordTime) {
44
+ utils.showToast("time too short, this will not transcribe");
45
+ return;
46
+ }
47
+
48
+ let transcribe = await utils.sendAudioToLeptonWhisperApi(finalAudioblob);
49
+ if (!transcribe) {
50
+ console.log("transcribe failed, try alternative way");
51
+ transcribe = await whisperjaxws(finalAudioblob); // Replace with your alternative transcription
52
+ }
53
+ utils.writeText(document.activeElement, transcribe.text);
54
+ },
55
+
56
+ stopRecording(safeStop = true) {
57
+ appModel.isRecording = false;
58
+ if (safeStop) {
59
+ setTimeout(() => {
60
+ console.log("safeStop");
61
+ view.recorder.stopRecording();
62
+ }, 500);
63
+ } else {
64
+ view.recorder.stopRecording();
65
+ }
66
+ },
67
+
68
+ async chat(message) {
69
+ let selectText = window.getSelection().toString();
70
+ let currentLineString = utils.getCurrentLineString(document.activeElement);
71
+
72
+ prompt=`${message} ${selectText.length >= 1 ? selectText : currentLineString} `
73
+
74
+ let userText = prompt;
75
+
76
+ if (!utils.checkValidString(userText)) {
77
+ console.log("chat(): invalid userText:", userText);
78
+ return;
79
+ }
80
+
81
+ utils.displayMarkdown(userText + " \n please wait");
82
+ utils.AIComplete(userText,appModel.llm_model_info); // Replace with your LLM API call
83
+ },
84
+
85
+ async ask() {
86
+ if (appModel.isRecording) {
87
+ utils.AIComplete(utils.getSelectionText(),appModel.llm_model_info);
88
+ return;
89
+ }
90
+
91
+ let startTime = Date.now();
92
+ let audioblob = await view.recorder.startRecording(view.elem.voiceButton);
93
+
94
+ if (Date.now() - startTime < appModel.minimalRecordTime) {
95
+ utils.showToast("time too short, this will not transcribe");
96
+ console.log("ask():", utils.getSelectionText());
97
+ utils.AIComplete(utils.getSelectionText(),appModel.llm_model_info);
98
+
99
+ return;
100
+ }
101
+
102
+ let transcribe = await utils.stt(audioblob);
103
+ if (!transcribe) {
104
+ console.log("transcribe failed, try alternative way");
105
+ transcribe = await whisperjaxws(audioblob); // Replace with your alternative transcription
106
+ }
107
+ let selectionString = window.getSelection().toString();
108
+ let userText = utils.checkValidString(selectionString)
109
+ ? `"${selectionString}" ${transcribe.text}`
110
+ : transcribe.text;
111
+
112
+ if (!utils.checkValidString(userText)) {
113
+ console.log("ask(): invalid userText:", userText);
114
+ return;
115
+ }
116
+
117
+ utils.displayMarkdown(userText + " please wait");
118
+ utils.AIComplete(userText); // Replace with your LLM API call
119
+ },
120
+ };
121
+
122
+ // ... (whisperjaxws function or other external APIs) ...
123
+
124
+ export { controller };
public/ainote/esltool.js ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { utils } from "./utils.js";
2
+ import { view } from "./view.js";
3
+
4
+
5
+ let config = {
6
+ first_language: 'にほんご',
7
+ second_language: 'English'
8
+ }
9
+
10
+
11
+
12
+ // Create toolbar element
13
+ const toolbar = document.createElement("div");
14
+ toolbar.id = "esl-toolbar";
15
+ toolbar.style.position = "fixed"; // Make it stick to the top
16
+ toolbar.style.top = "0"; // Position at the very top
17
+ toolbar.style.left = "0"; // Position at the leftmost side
18
+ toolbar.style.width = "100%"; // Make it span the entire width
19
+ toolbar.style.backgroundColor = "lightgray"; // Example background color
20
+ toolbar.style.padding = "10px"; // Add some padding
21
+
22
+ // Create buttons
23
+
24
+ const askButton = document.createElement("button");
25
+ askButton.id = "ask-btn";
26
+ askButton.textContent = "Ask";
27
+
28
+
29
+
30
+ const correctBtn = document.createElement("button");
31
+ correctBtn.id = "correct-btn";
32
+ correctBtn.textContent = "Correct";
33
+
34
+ const translateBtn = document.createElement("button");
35
+ translateBtn.id = "translate-btn";
36
+ translateBtn.textContent = "Translate";
37
+
38
+ const explainBtn = document.createElement("button");
39
+ explainBtn.id = "explain-btn";
40
+ explainBtn.textContent = "Explain";
41
+
42
+ const defineBtn = document.createElement("button");
43
+ defineBtn.id = "define-btn";
44
+ defineBtn.textContent = "Define";
45
+
46
+
47
+ const removeButton = document.createElement("button");
48
+ removeButton.id = "remove-btn";
49
+ removeButton.textContent = "Hide";
50
+
51
+ // Append buttons to toolbar
52
+ toolbar.appendChild(askButton);
53
+ toolbar.appendChild(correctBtn);
54
+ toolbar.appendChild(translateBtn);
55
+ toolbar.appendChild(explainBtn);
56
+ toolbar.appendChild(defineBtn);
57
+ toolbar.appendChild(removeButton);
58
+
59
+
60
+ // Create content area
61
+ const contentArea = document.createElement("div");
62
+ contentArea.id = "content";
63
+ contentArea.contentEditable = true; // Allow user to select text
64
+
65
+ // Append toolbar and content area to the body
66
+ document.body.appendChild(toolbar);
67
+ document.body.appendChild(contentArea);
68
+
69
+ // Function to get selected text
70
+ function getSelectedText() {
71
+ return window.getSelection().toString();
72
+ }
73
+
74
+ // Implement functionalities for each button (same as before)
75
+
76
+ function ask(prompt) {
77
+
78
+ let currentLineString = utils.getCurrentLineString(document.activeElement);
79
+ let selectText = window.getSelection().toString();
80
+ prompt=`${prompt} **${selectText.length >= 1 ? selectText : currentLineString}** `
81
+ utils.displayMarkdown(prompt+'...');
82
+ utils.AIComplete(prompt,{
83
+ url: '/openai/v1/chat/completions',
84
+ model: 'llama3-8b-8192',
85
+ max_tokens:8000,
86
+ });
87
+ }
88
+
89
+ askButton.addEventListener("click", () => {
90
+ ask(' ');
91
+
92
+ });
93
+
94
+
95
+ // Correct Button:
96
+ correctBtn.addEventListener("click", () => {
97
+ ask('correct mistakes of the text: \n');
98
+ });
99
+
100
+ // Translate Button:
101
+ translateBtn.addEventListener("click", () => {
102
+ ask(`translate to ${config.first_language}:\n `);
103
+ });
104
+
105
+ // Explain Button:
106
+ explainBtn.addEventListener("click", () => {
107
+ ask('explain this for english seconds language learner in simple english:\n ');
108
+
109
+ });
110
+
111
+ // Define Button:
112
+ defineBtn.addEventListener("click", () => {
113
+ ask('define the word , first in simple english , and give some usage example:\n ' )
114
+ });
115
+
116
+ removeButton.addEventListener('click', () => toolbar.style.display = 'none')
117
+
118
+ // Style the toolbar
119
+ toolbar.style.position = "fixed";
120
+ toolbar.style.top = "0%";
121
+ toolbar.style.left = "0";
122
+ toolbar.style.width = "wrap-content";
123
+ toolbar.style.backgroundColor = "black"; // Light gray background
124
+ toolbar.style.padding = "5px";
125
+ toolbar.style.boxShadow = "0 2px 4px rgba(0, 0, 0, 0.1)"; // Add a subtle shadow
126
+
127
+ // Style the buttons
128
+ const buttonStyles = {
129
+ backgroundColor: "black", // Green background
130
+ border: "none",
131
+ color: "white",
132
+ padding: "2px",
133
+ textAlign: "center",
134
+ textDecoration: "none",
135
+ display: "inline-block",
136
+ fontSize: "small",
137
+ margin: "2px",
138
+ cursor: "pointer",
139
+ borderRadius: "5px", // Rounded corners
140
+ };
141
+
142
+ // Apply styles to each button
143
+ for (const button of [askButton, correctBtn, translateBtn, explainBtn, defineBtn, removeButton]) {
144
+ Object.assign(button.style, buttonStyles);
145
+ utils.makeButtonFeedback(button);
146
+ }
147
+
148
+
149
+
150
+ setTimeout(() => {
151
+ utils.displayMarkdown(`
152
+ hello, this is note for language learner
153
+ code will display like this:
154
+ \`\`\`
155
+ this code
156
+ \`\`\`
157
+ `)
158
+ view.createMenu(window.innerWidth*0.9, 300);
159
+
160
+ }, 1000);
public/ainote/favicon.ico ADDED
public/ainote/icon/icons8-microsoft-edge-192.png ADDED
public/ainote/icon/icons8-microsoft-edge-512.png ADDED
public/ainote/index.html ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <link rel="manifest" href="./manifest.json">
8
+ <link rel="stylesheet" href="./libs/toastui-editor.min.css" />
9
+
10
+ <title>groqnote</title>
11
+ <style>
12
+ body {
13
+ font-family: Arial, sans-serif;
14
+ background-color: #f4f4f4;
15
+ }
16
+
17
+ #testLinkContainer a {
18
+ width: fit-content;
19
+ display: inline-block;
20
+ margin-bottom: 10px;
21
+ color: #333;
22
+ text-decoration: none;
23
+ background-color: #ddd;
24
+ padding: 10px;
25
+ border-radius: 5px;
26
+ }
27
+ #testLinkContainer a:hover {
28
+ background-color: #eee;
29
+ }
30
+ textarea {
31
+ width: 90%;
32
+ height: 40vh;
33
+ margin-bottom: 20px;
34
+ padding: 10px;
35
+ border-radius: 5px;
36
+ border: 1px solid #ccc;
37
+ }
38
+ input {
39
+ display: block;
40
+ margin-bottom: 20px;
41
+ padding: 10px;
42
+ border-radius: 5px;
43
+ border: 1px solid #ccc;
44
+ }
45
+ #editableDiv {
46
+ padding: 20px;
47
+ border: 1px solid #ccc;
48
+ border-radius: 5px;
49
+ background-color: #fff;
50
+ }
51
+ #editableDiv div {
52
+ padding: 10px;
53
+ }
54
+ </style>
55
+ </head>
56
+ <body>
57
+ <div style="height: 30vh;"></div>
58
+ share the note via url:
59
+ <div id="url_div"></div>
60
+ <div id="notebin_editor"></div>
61
+
62
+
63
+ <div style="height: 300vh;"></div>
64
+
65
+
66
+
67
+ <script src="./index.js" type="module"></script>
68
+ <script src="./esltool.js" type="module"></script>
69
+ <script src="./libs/toastui-editor-all.min.js"></script>
70
+ <script type="module" src="./notebin.js"></script>
71
+
72
+ </body>
73
+ </html>
public/ainote/index.js ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ import { view } from './view.js';
2
+
3
+ view.init();
public/ainote/libs/toastui-editor-all.min.js ADDED
The diff for this file is too large to render. See raw diff
 
public/ainote/libs/toastui-editor.min.css ADDED
The diff for this file is too large to render. See raw diff
 
public/ainote/manifest.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "short_name": "aiinput",
3
+ "name": "aiinput",
4
+ "description": "input use AI ",
5
+ "icons": [
6
+ {
7
+ "src": "./icon/icons8-microsoft-edge-192.png",
8
+ "sizes": "192x192",
9
+ "type": "image/png"
10
+ },
11
+ {
12
+ "src": "./icon/icons8-microsoft-edge-512.png",
13
+ "sizes": "512x512",
14
+ "type": "image/png"
15
+ }
16
+ ],
17
+ "start_url": "./",
18
+ "background_color": "#ffffff",
19
+ "display": "standalone",
20
+ "scope": "/",
21
+ "theme_color": "#ffffff"
22
+ }
public/ainote/model.js ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ const appModel = {
3
+ api_url: "",
4
+ api_key: "",
5
+ voice_button_id: "whisper_voice_button",
6
+ transcribeProvider: "lepton_whisper",
7
+ language: "",
8
+ supportedInputTypeList: ["text", "number", "tel", "search", "url", "email"],
9
+ buttonBackgroundColor: "lightblue",
10
+ minimalRecordTime: 2000,
11
+ keepButtonAliveInterval: 0,
12
+ isRecording: false,
13
+ llm_model_info: {
14
+ url: '/openai/v1/chat/completions',
15
+ model: 'llama3-8b-8192',
16
+ max_tokens:8000,
17
+ },
18
+
19
+ zIndex: {
20
+ highest: 999999,
21
+ higher: 99999,
22
+ high: 9999,
23
+ medium: 999
24
+ },
25
+ apiKey: {
26
+ 'flowgpt': '',
27
+
28
+ }
29
+ };
30
+
31
+
32
+ export {appModel}
public/ainote/notebin.js ADDED
@@ -0,0 +1,295 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { utils } from "./utils.js";
2
+
3
+ function getCurrentLineString(element) {
4
+ const selection = window.getSelection();
5
+ const range = selection.getRangeAt(0);
6
+ const node = range.startContainer;
7
+ const offset = range.startOffset;
8
+
9
+ // If the selection is inside a text node
10
+ if (node.nodeType === Node.TEXT_NODE) {
11
+ const text = node.textContent;
12
+ const lineStart = text.lastIndexOf('\n', offset) + 1;
13
+ const lineEnd = text.indexOf('\n', offset);
14
+ const line = lineEnd === -1 ? text.slice(lineStart) : text.slice(lineStart, lineEnd);
15
+ return line;
16
+ }
17
+
18
+ // If the selection is inside an element node
19
+ const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT);
20
+ let currentNode, currentLine = '';
21
+
22
+ while (currentNode = walker.nextNode()) {
23
+ const text = currentNode.textContent;
24
+ const lines = text.split('\n');
25
+
26
+ for (let i = 0; i < lines.length; i++) {
27
+ if (range.intersectsNode(currentNode)) {
28
+ currentLine = lines[i];
29
+ break;
30
+ }
31
+ }
32
+
33
+ if (currentLine !== '') {
34
+ break;
35
+ }
36
+ }
37
+
38
+ return currentLine;
39
+ }
40
+
41
+
42
+ let url_div=document.querySelector('#url_div');
43
+ url_div.innerText=window.location.href;
44
+ url_div.addEventListener('click',()=>{
45
+ url_div.scrollIntoView({ behavior: 'smooth' });
46
+ })
47
+
48
+
49
+
50
+
51
+ function createLastButton(cmd, name = cmd) {
52
+ const button = document.createElement('button');
53
+
54
+ button.className = 'toastui-editor-toolbar-icons last';
55
+ button.style.backgroundImage = 'none';
56
+ button.style.margin = '0';
57
+ button.style.fontSize='x-large';
58
+ button.innerHTML = `<b>${name}</b>`;
59
+ button.addEventListener('click', () => {
60
+ editor.exec(cmd);
61
+ });
62
+
63
+ return button;
64
+ }
65
+
66
+ let editorContainer=document.querySelector('#notebin_editor');
67
+ window.tuieditor = window.editor = new toastui.Editor({
68
+ el: document.querySelector('#notebin_editor'),
69
+ previewStyle: 'tab',
70
+ height: window.innerHeight * 0.8 + 'px',
71
+ initialValue: '\n\n\n\n\n\n',
72
+ customHTMLSanitizer: html => html,
73
+ toolbarItems: [
74
+ [{
75
+ el: createLastButton('undo', '⤺'),
76
+ command: 'undo',
77
+ tooltip: 'Undo'
78
+ },
79
+ {
80
+ el: createLastButton('redo', '⤻'),
81
+ command: 'redo',
82
+ tooltip: 'Redo'
83
+ }
84
+ ],
85
+ ['heading'],
86
+ //[ 'bold', 'italic', 'strike'],
87
+ // ['hr', 'quote'],
88
+ // ['ul', 'ol', 'task', 'indent', 'outdent'],
89
+ // ['table', 'image', 'link'],
90
+ ['image'],
91
+ ['code', 'codeblock'],
92
+
93
+ ],
94
+ });
95
+
96
+ setTimeout(() => {
97
+
98
+ tuieditor.focus();
99
+ tuieditor.moveCursorToStart(true);
100
+
101
+ window.tuieditor.mdEditor.el.addEventListener('focus', (event) => {
102
+ // Log the event and the pasted data
103
+ console.log('focus event triggered:', event);
104
+ syncNote();
105
+ });
106
+
107
+
108
+ window.tuieditor.mdEditor.el.addEventListener('keydown', function(event) {
109
+ if (event.key === 'Enter' && event.ctrlKey) {
110
+ // Your code here
111
+ let currentLineString=getCurrentLineString(editorContainer);
112
+ console.log('Ctrl + Enter was pressed:',currentLineString);
113
+ let prompt = ' ';
114
+ let selectText = window.getSelection().toString();
115
+ utils.displayMarkdown(`${prompt} **${selectText.length >= 1 ? selectText : currentLineString}** ...`);
116
+ utils.AIComplete(`${prompt} **${selectText.length >= 1 ? selectText : currentLineString}** `);
117
+ }
118
+ });
119
+
120
+ }, 1000);
121
+
122
+ // editor.insertToolbarItem({ groupIndex: 0, itemIndex: 0 }, {
123
+ // name: 'myItem',
124
+ // tooltip: 'Custom Button',
125
+ // command: 'bold',
126
+ // text: '@',
127
+ // className: 'toastui-editor-toolbar-icons first',
128
+ // style: { backgroundImage: 'none' }
129
+ // });
130
+
131
+
132
+ let editorModel = {
133
+ value: null,
134
+ lastChangeTime: 0,
135
+ noteid: ''
136
+ }
137
+
138
+
139
+ // Create a new custom event
140
+ const editorchange = new CustomEvent('editorchange', {
141
+ detail: {
142
+ // Include any data you want to pass with the event
143
+ message: 'Editor content has changed'
144
+ },
145
+ bubbles: true,
146
+ cancelable: true
147
+ });
148
+
149
+ document.addEventListener('editorchange', ()=>{
150
+ console.log('editorchange');
151
+ editorModel.lastChangeTime=Date.now();
152
+ syncNote();
153
+
154
+ })
155
+
156
+ let setChangeTimeoutid=0;
157
+ document.addEventListener('keydown', ()=>{
158
+ console.log('keydown');
159
+ clearTimeout(setChangeTimeoutid);
160
+ setChangeTimeoutid=setTimeout(() => {
161
+ document.body.dispatchEvent(editorchange)
162
+
163
+ }, 5000);
164
+
165
+ })
166
+
167
+ document.body.addEventListener('paste', (event) => {
168
+ // Log the event and the pasted data
169
+ console.log('Paste event triggered:', event);
170
+ console.log('Pasted data:', event.clipboardData.getData('text'));
171
+ document.body.dispatchEvent(editorchange)
172
+
173
+ });
174
+
175
+ document.body.addEventListener('pointerdown', (event) => {
176
+ // Log the event and the pasted data
177
+ console.log('pointerdown event triggered:', event);
178
+ syncNote();
179
+ });
180
+
181
+
182
+
183
+
184
+
185
+ function getUrlParameter(name) {
186
+ name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
187
+ var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
188
+ var results = regex.exec(location.search);
189
+ return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
190
+ }
191
+
192
+ function setUrlParameter(paramName, paramValue) {
193
+ const url = new URL(window.location.href);
194
+ url.searchParams.set(paramName, paramValue);
195
+ history.pushState({}, "", url);
196
+ }
197
+
198
+ let noteid = getUrlParameter('noteid');
199
+ console.log(noteid);
200
+
201
+
202
+
203
+ async function initEditorModel() {
204
+ editorModel.noteid= getUrlParameter('noteid') || Date.now();
205
+ setUrlParameter('noteid', editorModel.noteid);
206
+ console.log('initEditorModel',editorModel);
207
+ getNote();
208
+
209
+ }
210
+
211
+
212
+ initEditorModel();
213
+
214
+
215
+ setInterval(async () => {
216
+ // saveNote();
217
+ }, 3000)
218
+
219
+
220
+ async function getNote(){
221
+ let res = await fetch(`/kv/get?key=${editorModel.noteid}`);
222
+ res = await res.json();
223
+ console.log('getNote:', res);
224
+ if (res) {
225
+ res=res.value;
226
+ editorModel.value = res.text;
227
+ editorModel.lastChangeTime=res.lastChangeTime || 0;
228
+ tuieditor.setMarkdown(res.text)
229
+ }
230
+ }
231
+
232
+ async function saveNote() {
233
+ let form = new FormData();
234
+ form.append('key', noteid);
235
+ form.append('value', JSON.stringify({
236
+ text: tuieditor.getMarkdown(),
237
+ lastChangeTime: editorModel.lastChangeTime
238
+ }))
239
+
240
+ await fetch('/kv/set',
241
+ {
242
+ method: 'post',
243
+ body: form
244
+ }
245
+ )
246
+ console.log('note saved')
247
+
248
+ }
249
+
250
+
251
+ async function syncNote(){
252
+ try {
253
+ let res = await fetch(`/kv/get?key=${editorModel.noteid}`);
254
+ res = await res.json();
255
+ console.log('getNote in syncNote:', res);
256
+ if (res) {
257
+ res=res.value;
258
+ if(res.lastChangeTime>editorModel.lastChangeTime){
259
+ console.log(res.lastChangeTime,editorModel.lastChangeTime);
260
+ editorModel.value = res.text;
261
+ editorModel.lastChangeTime=res.lastChangeTime || 0;
262
+ tuieditor.setMarkdown(res.text);
263
+
264
+ }
265
+ else{
266
+ saveNote();
267
+ }
268
+ }
269
+
270
+ } catch (error) {
271
+ console.log('syncNote eroor:',error);
272
+ saveNote();
273
+ }
274
+
275
+ }
276
+
277
+
278
+
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+
287
+
288
+
289
+
290
+
291
+
292
+
293
+
294
+
295
+
public/ainote/package-lock.json ADDED
@@ -0,0 +1,1102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "nodejs",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 2,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "nodejs",
9
+ "version": "1.0.0",
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "@types/node": "^18.0.6",
13
+ "vite": "^5.2.10"
14
+ }
15
+ },
16
+ "node_modules/@esbuild/aix-ppc64": {
17
+ "version": "0.20.2",
18
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
19
+ "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
20
+ "cpu": [
21
+ "ppc64"
22
+ ],
23
+ "optional": true,
24
+ "os": [
25
+ "aix"
26
+ ],
27
+ "engines": {
28
+ "node": ">=12"
29
+ }
30
+ },
31
+ "node_modules/@esbuild/android-arm": {
32
+ "version": "0.20.2",
33
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
34
+ "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
35
+ "cpu": [
36
+ "arm"
37
+ ],
38
+ "optional": true,
39
+ "os": [
40
+ "android"
41
+ ],
42
+ "engines": {
43
+ "node": ">=12"
44
+ }
45
+ },
46
+ "node_modules/@esbuild/android-arm64": {
47
+ "version": "0.20.2",
48
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
49
+ "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
50
+ "cpu": [
51
+ "arm64"
52
+ ],
53
+ "optional": true,
54
+ "os": [
55
+ "android"
56
+ ],
57
+ "engines": {
58
+ "node": ">=12"
59
+ }
60
+ },
61
+ "node_modules/@esbuild/android-x64": {
62
+ "version": "0.20.2",
63
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
64
+ "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
65
+ "cpu": [
66
+ "x64"
67
+ ],
68
+ "optional": true,
69
+ "os": [
70
+ "android"
71
+ ],
72
+ "engines": {
73
+ "node": ">=12"
74
+ }
75
+ },
76
+ "node_modules/@esbuild/darwin-arm64": {
77
+ "version": "0.20.2",
78
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
79
+ "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
80
+ "cpu": [
81
+ "arm64"
82
+ ],
83
+ "optional": true,
84
+ "os": [
85
+ "darwin"
86
+ ],
87
+ "engines": {
88
+ "node": ">=12"
89
+ }
90
+ },
91
+ "node_modules/@esbuild/darwin-x64": {
92
+ "version": "0.20.2",
93
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
94
+ "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
95
+ "cpu": [
96
+ "x64"
97
+ ],
98
+ "optional": true,
99
+ "os": [
100
+ "darwin"
101
+ ],
102
+ "engines": {
103
+ "node": ">=12"
104
+ }
105
+ },
106
+ "node_modules/@esbuild/freebsd-arm64": {
107
+ "version": "0.20.2",
108
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
109
+ "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
110
+ "cpu": [
111
+ "arm64"
112
+ ],
113
+ "optional": true,
114
+ "os": [
115
+ "freebsd"
116
+ ],
117
+ "engines": {
118
+ "node": ">=12"
119
+ }
120
+ },
121
+ "node_modules/@esbuild/freebsd-x64": {
122
+ "version": "0.20.2",
123
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
124
+ "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
125
+ "cpu": [
126
+ "x64"
127
+ ],
128
+ "optional": true,
129
+ "os": [
130
+ "freebsd"
131
+ ],
132
+ "engines": {
133
+ "node": ">=12"
134
+ }
135
+ },
136
+ "node_modules/@esbuild/linux-arm": {
137
+ "version": "0.20.2",
138
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
139
+ "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
140
+ "cpu": [
141
+ "arm"
142
+ ],
143
+ "optional": true,
144
+ "os": [
145
+ "linux"
146
+ ],
147
+ "engines": {
148
+ "node": ">=12"
149
+ }
150
+ },
151
+ "node_modules/@esbuild/linux-arm64": {
152
+ "version": "0.20.2",
153
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
154
+ "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
155
+ "cpu": [
156
+ "arm64"
157
+ ],
158
+ "optional": true,
159
+ "os": [
160
+ "linux"
161
+ ],
162
+ "engines": {
163
+ "node": ">=12"
164
+ }
165
+ },
166
+ "node_modules/@esbuild/linux-ia32": {
167
+ "version": "0.20.2",
168
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
169
+ "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
170
+ "cpu": [
171
+ "ia32"
172
+ ],
173
+ "optional": true,
174
+ "os": [
175
+ "linux"
176
+ ],
177
+ "engines": {
178
+ "node": ">=12"
179
+ }
180
+ },
181
+ "node_modules/@esbuild/linux-loong64": {
182
+ "version": "0.20.2",
183
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
184
+ "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
185
+ "cpu": [
186
+ "loong64"
187
+ ],
188
+ "optional": true,
189
+ "os": [
190
+ "linux"
191
+ ],
192
+ "engines": {
193
+ "node": ">=12"
194
+ }
195
+ },
196
+ "node_modules/@esbuild/linux-mips64el": {
197
+ "version": "0.20.2",
198
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
199
+ "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
200
+ "cpu": [
201
+ "mips64el"
202
+ ],
203
+ "optional": true,
204
+ "os": [
205
+ "linux"
206
+ ],
207
+ "engines": {
208
+ "node": ">=12"
209
+ }
210
+ },
211
+ "node_modules/@esbuild/linux-ppc64": {
212
+ "version": "0.20.2",
213
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
214
+ "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
215
+ "cpu": [
216
+ "ppc64"
217
+ ],
218
+ "optional": true,
219
+ "os": [
220
+ "linux"
221
+ ],
222
+ "engines": {
223
+ "node": ">=12"
224
+ }
225
+ },
226
+ "node_modules/@esbuild/linux-riscv64": {
227
+ "version": "0.20.2",
228
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
229
+ "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
230
+ "cpu": [
231
+ "riscv64"
232
+ ],
233
+ "optional": true,
234
+ "os": [
235
+ "linux"
236
+ ],
237
+ "engines": {
238
+ "node": ">=12"
239
+ }
240
+ },
241
+ "node_modules/@esbuild/linux-s390x": {
242
+ "version": "0.20.2",
243
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
244
+ "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
245
+ "cpu": [
246
+ "s390x"
247
+ ],
248
+ "optional": true,
249
+ "os": [
250
+ "linux"
251
+ ],
252
+ "engines": {
253
+ "node": ">=12"
254
+ }
255
+ },
256
+ "node_modules/@esbuild/linux-x64": {
257
+ "version": "0.20.2",
258
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
259
+ "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
260
+ "cpu": [
261
+ "x64"
262
+ ],
263
+ "optional": true,
264
+ "os": [
265
+ "linux"
266
+ ],
267
+ "engines": {
268
+ "node": ">=12"
269
+ }
270
+ },
271
+ "node_modules/@esbuild/netbsd-x64": {
272
+ "version": "0.20.2",
273
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
274
+ "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
275
+ "cpu": [
276
+ "x64"
277
+ ],
278
+ "optional": true,
279
+ "os": [
280
+ "netbsd"
281
+ ],
282
+ "engines": {
283
+ "node": ">=12"
284
+ }
285
+ },
286
+ "node_modules/@esbuild/openbsd-x64": {
287
+ "version": "0.20.2",
288
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
289
+ "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
290
+ "cpu": [
291
+ "x64"
292
+ ],
293
+ "optional": true,
294
+ "os": [
295
+ "openbsd"
296
+ ],
297
+ "engines": {
298
+ "node": ">=12"
299
+ }
300
+ },
301
+ "node_modules/@esbuild/sunos-x64": {
302
+ "version": "0.20.2",
303
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
304
+ "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
305
+ "cpu": [
306
+ "x64"
307
+ ],
308
+ "optional": true,
309
+ "os": [
310
+ "sunos"
311
+ ],
312
+ "engines": {
313
+ "node": ">=12"
314
+ }
315
+ },
316
+ "node_modules/@esbuild/win32-arm64": {
317
+ "version": "0.20.2",
318
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
319
+ "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
320
+ "cpu": [
321
+ "arm64"
322
+ ],
323
+ "optional": true,
324
+ "os": [
325
+ "win32"
326
+ ],
327
+ "engines": {
328
+ "node": ">=12"
329
+ }
330
+ },
331
+ "node_modules/@esbuild/win32-ia32": {
332
+ "version": "0.20.2",
333
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
334
+ "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
335
+ "cpu": [
336
+ "ia32"
337
+ ],
338
+ "optional": true,
339
+ "os": [
340
+ "win32"
341
+ ],
342
+ "engines": {
343
+ "node": ">=12"
344
+ }
345
+ },
346
+ "node_modules/@esbuild/win32-x64": {
347
+ "version": "0.20.2",
348
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
349
+ "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
350
+ "cpu": [
351
+ "x64"
352
+ ],
353
+ "optional": true,
354
+ "os": [
355
+ "win32"
356
+ ],
357
+ "engines": {
358
+ "node": ">=12"
359
+ }
360
+ },
361
+ "node_modules/@rollup/rollup-android-arm-eabi": {
362
+ "version": "4.16.4",
363
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz",
364
+ "integrity": "sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==",
365
+ "cpu": [
366
+ "arm"
367
+ ],
368
+ "optional": true,
369
+ "os": [
370
+ "android"
371
+ ]
372
+ },
373
+ "node_modules/@rollup/rollup-android-arm64": {
374
+ "version": "4.16.4",
375
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz",
376
+ "integrity": "sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==",
377
+ "cpu": [
378
+ "arm64"
379
+ ],
380
+ "optional": true,
381
+ "os": [
382
+ "android"
383
+ ]
384
+ },
385
+ "node_modules/@rollup/rollup-darwin-arm64": {
386
+ "version": "4.16.4",
387
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz",
388
+ "integrity": "sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==",
389
+ "cpu": [
390
+ "arm64"
391
+ ],
392
+ "optional": true,
393
+ "os": [
394
+ "darwin"
395
+ ]
396
+ },
397
+ "node_modules/@rollup/rollup-darwin-x64": {
398
+ "version": "4.16.4",
399
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz",
400
+ "integrity": "sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==",
401
+ "cpu": [
402
+ "x64"
403
+ ],
404
+ "optional": true,
405
+ "os": [
406
+ "darwin"
407
+ ]
408
+ },
409
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
410
+ "version": "4.16.4",
411
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz",
412
+ "integrity": "sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==",
413
+ "cpu": [
414
+ "arm"
415
+ ],
416
+ "optional": true,
417
+ "os": [
418
+ "linux"
419
+ ]
420
+ },
421
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
422
+ "version": "4.16.4",
423
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz",
424
+ "integrity": "sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==",
425
+ "cpu": [
426
+ "arm"
427
+ ],
428
+ "optional": true,
429
+ "os": [
430
+ "linux"
431
+ ]
432
+ },
433
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
434
+ "version": "4.16.4",
435
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz",
436
+ "integrity": "sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==",
437
+ "cpu": [
438
+ "arm64"
439
+ ],
440
+ "optional": true,
441
+ "os": [
442
+ "linux"
443
+ ]
444
+ },
445
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
446
+ "version": "4.16.4",
447
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz",
448
+ "integrity": "sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==",
449
+ "cpu": [
450
+ "arm64"
451
+ ],
452
+ "optional": true,
453
+ "os": [
454
+ "linux"
455
+ ]
456
+ },
457
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
458
+ "version": "4.16.4",
459
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz",
460
+ "integrity": "sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==",
461
+ "cpu": [
462
+ "ppc64"
463
+ ],
464
+ "optional": true,
465
+ "os": [
466
+ "linux"
467
+ ]
468
+ },
469
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
470
+ "version": "4.16.4",
471
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz",
472
+ "integrity": "sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==",
473
+ "cpu": [
474
+ "riscv64"
475
+ ],
476
+ "optional": true,
477
+ "os": [
478
+ "linux"
479
+ ]
480
+ },
481
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
482
+ "version": "4.16.4",
483
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz",
484
+ "integrity": "sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==",
485
+ "cpu": [
486
+ "s390x"
487
+ ],
488
+ "optional": true,
489
+ "os": [
490
+ "linux"
491
+ ]
492
+ },
493
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
494
+ "version": "4.16.4",
495
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz",
496
+ "integrity": "sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==",
497
+ "cpu": [
498
+ "x64"
499
+ ],
500
+ "optional": true,
501
+ "os": [
502
+ "linux"
503
+ ]
504
+ },
505
+ "node_modules/@rollup/rollup-linux-x64-musl": {
506
+ "version": "4.16.4",
507
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz",
508
+ "integrity": "sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==",
509
+ "cpu": [
510
+ "x64"
511
+ ],
512
+ "optional": true,
513
+ "os": [
514
+ "linux"
515
+ ]
516
+ },
517
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
518
+ "version": "4.16.4",
519
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz",
520
+ "integrity": "sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==",
521
+ "cpu": [
522
+ "arm64"
523
+ ],
524
+ "optional": true,
525
+ "os": [
526
+ "win32"
527
+ ]
528
+ },
529
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
530
+ "version": "4.16.4",
531
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz",
532
+ "integrity": "sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==",
533
+ "cpu": [
534
+ "ia32"
535
+ ],
536
+ "optional": true,
537
+ "os": [
538
+ "win32"
539
+ ]
540
+ },
541
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
542
+ "version": "4.16.4",
543
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.4.tgz",
544
+ "integrity": "sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==",
545
+ "cpu": [
546
+ "x64"
547
+ ],
548
+ "optional": true,
549
+ "os": [
550
+ "win32"
551
+ ]
552
+ },
553
+ "node_modules/@types/estree": {
554
+ "version": "1.0.5",
555
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
556
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="
557
+ },
558
+ "node_modules/@types/node": {
559
+ "version": "18.0.6",
560
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.6.tgz",
561
+ "integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw=="
562
+ },
563
+ "node_modules/esbuild": {
564
+ "version": "0.20.2",
565
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
566
+ "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
567
+ "hasInstallScript": true,
568
+ "bin": {
569
+ "esbuild": "bin/esbuild"
570
+ },
571
+ "engines": {
572
+ "node": ">=12"
573
+ },
574
+ "optionalDependencies": {
575
+ "@esbuild/aix-ppc64": "0.20.2",
576
+ "@esbuild/android-arm": "0.20.2",
577
+ "@esbuild/android-arm64": "0.20.2",
578
+ "@esbuild/android-x64": "0.20.2",
579
+ "@esbuild/darwin-arm64": "0.20.2",
580
+ "@esbuild/darwin-x64": "0.20.2",
581
+ "@esbuild/freebsd-arm64": "0.20.2",
582
+ "@esbuild/freebsd-x64": "0.20.2",
583
+ "@esbuild/linux-arm": "0.20.2",
584
+ "@esbuild/linux-arm64": "0.20.2",
585
+ "@esbuild/linux-ia32": "0.20.2",
586
+ "@esbuild/linux-loong64": "0.20.2",
587
+ "@esbuild/linux-mips64el": "0.20.2",
588
+ "@esbuild/linux-ppc64": "0.20.2",
589
+ "@esbuild/linux-riscv64": "0.20.2",
590
+ "@esbuild/linux-s390x": "0.20.2",
591
+ "@esbuild/linux-x64": "0.20.2",
592
+ "@esbuild/netbsd-x64": "0.20.2",
593
+ "@esbuild/openbsd-x64": "0.20.2",
594
+ "@esbuild/sunos-x64": "0.20.2",
595
+ "@esbuild/win32-arm64": "0.20.2",
596
+ "@esbuild/win32-ia32": "0.20.2",
597
+ "@esbuild/win32-x64": "0.20.2"
598
+ }
599
+ },
600
+ "node_modules/fsevents": {
601
+ "version": "2.3.3",
602
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
603
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
604
+ "hasInstallScript": true,
605
+ "optional": true,
606
+ "os": [
607
+ "darwin"
608
+ ],
609
+ "engines": {
610
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
611
+ }
612
+ },
613
+ "node_modules/nanoid": {
614
+ "version": "3.3.7",
615
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
616
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
617
+ "funding": [
618
+ {
619
+ "type": "github",
620
+ "url": "https://github.com/sponsors/ai"
621
+ }
622
+ ],
623
+ "bin": {
624
+ "nanoid": "bin/nanoid.cjs"
625
+ },
626
+ "engines": {
627
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
628
+ }
629
+ },
630
+ "node_modules/picocolors": {
631
+ "version": "1.0.0",
632
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
633
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
634
+ },
635
+ "node_modules/postcss": {
636
+ "version": "8.4.38",
637
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
638
+ "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
639
+ "funding": [
640
+ {
641
+ "type": "opencollective",
642
+ "url": "https://opencollective.com/postcss/"
643
+ },
644
+ {
645
+ "type": "tidelift",
646
+ "url": "https://tidelift.com/funding/github/npm/postcss"
647
+ },
648
+ {
649
+ "type": "github",
650
+ "url": "https://github.com/sponsors/ai"
651
+ }
652
+ ],
653
+ "dependencies": {
654
+ "nanoid": "^3.3.7",
655
+ "picocolors": "^1.0.0",
656
+ "source-map-js": "^1.2.0"
657
+ },
658
+ "engines": {
659
+ "node": "^10 || ^12 || >=14"
660
+ }
661
+ },
662
+ "node_modules/rollup": {
663
+ "version": "4.16.4",
664
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz",
665
+ "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==",
666
+ "dependencies": {
667
+ "@types/estree": "1.0.5"
668
+ },
669
+ "bin": {
670
+ "rollup": "dist/bin/rollup"
671
+ },
672
+ "engines": {
673
+ "node": ">=18.0.0",
674
+ "npm": ">=8.0.0"
675
+ },
676
+ "optionalDependencies": {
677
+ "@rollup/rollup-android-arm-eabi": "4.16.4",
678
+ "@rollup/rollup-android-arm64": "4.16.4",
679
+ "@rollup/rollup-darwin-arm64": "4.16.4",
680
+ "@rollup/rollup-darwin-x64": "4.16.4",
681
+ "@rollup/rollup-linux-arm-gnueabihf": "4.16.4",
682
+ "@rollup/rollup-linux-arm-musleabihf": "4.16.4",
683
+ "@rollup/rollup-linux-arm64-gnu": "4.16.4",
684
+ "@rollup/rollup-linux-arm64-musl": "4.16.4",
685
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4",
686
+ "@rollup/rollup-linux-riscv64-gnu": "4.16.4",
687
+ "@rollup/rollup-linux-s390x-gnu": "4.16.4",
688
+ "@rollup/rollup-linux-x64-gnu": "4.16.4",
689
+ "@rollup/rollup-linux-x64-musl": "4.16.4",
690
+ "@rollup/rollup-win32-arm64-msvc": "4.16.4",
691
+ "@rollup/rollup-win32-ia32-msvc": "4.16.4",
692
+ "@rollup/rollup-win32-x64-msvc": "4.16.4",
693
+ "fsevents": "~2.3.2"
694
+ }
695
+ },
696
+ "node_modules/source-map-js": {
697
+ "version": "1.2.0",
698
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
699
+ "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
700
+ "engines": {
701
+ "node": ">=0.10.0"
702
+ }
703
+ },
704
+ "node_modules/vite": {
705
+ "version": "5.2.10",
706
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz",
707
+ "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==",
708
+ "dependencies": {
709
+ "esbuild": "^0.20.1",
710
+ "postcss": "^8.4.38",
711
+ "rollup": "^4.13.0"
712
+ },
713
+ "bin": {
714
+ "vite": "bin/vite.js"
715
+ },
716
+ "engines": {
717
+ "node": "^18.0.0 || >=20.0.0"
718
+ },
719
+ "funding": {
720
+ "url": "https://github.com/vitejs/vite?sponsor=1"
721
+ },
722
+ "optionalDependencies": {
723
+ "fsevents": "~2.3.3"
724
+ },
725
+ "peerDependencies": {
726
+ "@types/node": "^18.0.0 || >=20.0.0",
727
+ "less": "*",
728
+ "lightningcss": "^1.21.0",
729
+ "sass": "*",
730
+ "stylus": "*",
731
+ "sugarss": "*",
732
+ "terser": "^5.4.0"
733
+ },
734
+ "peerDependenciesMeta": {
735
+ "@types/node": {
736
+ "optional": true
737
+ },
738
+ "less": {
739
+ "optional": true
740
+ },
741
+ "lightningcss": {
742
+ "optional": true
743
+ },
744
+ "sass": {
745
+ "optional": true
746
+ },
747
+ "stylus": {
748
+ "optional": true
749
+ },
750
+ "sugarss": {
751
+ "optional": true
752
+ },
753
+ "terser": {
754
+ "optional": true
755
+ }
756
+ }
757
+ }
758
+ },
759
+ "dependencies": {
760
+ "@esbuild/aix-ppc64": {
761
+ "version": "0.20.2",
762
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
763
+ "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
764
+ "optional": true
765
+ },
766
+ "@esbuild/android-arm": {
767
+ "version": "0.20.2",
768
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
769
+ "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
770
+ "optional": true
771
+ },
772
+ "@esbuild/android-arm64": {
773
+ "version": "0.20.2",
774
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
775
+ "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
776
+ "optional": true
777
+ },
778
+ "@esbuild/android-x64": {
779
+ "version": "0.20.2",
780
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
781
+ "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
782
+ "optional": true
783
+ },
784
+ "@esbuild/darwin-arm64": {
785
+ "version": "0.20.2",
786
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
787
+ "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
788
+ "optional": true
789
+ },
790
+ "@esbuild/darwin-x64": {
791
+ "version": "0.20.2",
792
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
793
+ "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
794
+ "optional": true
795
+ },
796
+ "@esbuild/freebsd-arm64": {
797
+ "version": "0.20.2",
798
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
799
+ "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
800
+ "optional": true
801
+ },
802
+ "@esbuild/freebsd-x64": {
803
+ "version": "0.20.2",
804
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
805
+ "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
806
+ "optional": true
807
+ },
808
+ "@esbuild/linux-arm": {
809
+ "version": "0.20.2",
810
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
811
+ "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
812
+ "optional": true
813
+ },
814
+ "@esbuild/linux-arm64": {
815
+ "version": "0.20.2",
816
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
817
+ "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
818
+ "optional": true
819
+ },
820
+ "@esbuild/linux-ia32": {
821
+ "version": "0.20.2",
822
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
823
+ "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
824
+ "optional": true
825
+ },
826
+ "@esbuild/linux-loong64": {
827
+ "version": "0.20.2",
828
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
829
+ "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
830
+ "optional": true
831
+ },
832
+ "@esbuild/linux-mips64el": {
833
+ "version": "0.20.2",
834
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
835
+ "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
836
+ "optional": true
837
+ },
838
+ "@esbuild/linux-ppc64": {
839
+ "version": "0.20.2",
840
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
841
+ "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
842
+ "optional": true
843
+ },
844
+ "@esbuild/linux-riscv64": {
845
+ "version": "0.20.2",
846
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
847
+ "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
848
+ "optional": true
849
+ },
850
+ "@esbuild/linux-s390x": {
851
+ "version": "0.20.2",
852
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
853
+ "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
854
+ "optional": true
855
+ },
856
+ "@esbuild/linux-x64": {
857
+ "version": "0.20.2",
858
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
859
+ "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
860
+ "optional": true
861
+ },
862
+ "@esbuild/netbsd-x64": {
863
+ "version": "0.20.2",
864
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
865
+ "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
866
+ "optional": true
867
+ },
868
+ "@esbuild/openbsd-x64": {
869
+ "version": "0.20.2",
870
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
871
+ "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
872
+ "optional": true
873
+ },
874
+ "@esbuild/sunos-x64": {
875
+ "version": "0.20.2",
876
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
877
+ "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
878
+ "optional": true
879
+ },
880
+ "@esbuild/win32-arm64": {
881
+ "version": "0.20.2",
882
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
883
+ "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
884
+ "optional": true
885
+ },
886
+ "@esbuild/win32-ia32": {
887
+ "version": "0.20.2",
888
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
889
+ "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
890
+ "optional": true
891
+ },
892
+ "@esbuild/win32-x64": {
893
+ "version": "0.20.2",
894
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
895
+ "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
896
+ "optional": true
897
+ },
898
+ "@rollup/rollup-android-arm-eabi": {
899
+ "version": "4.16.4",
900
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz",
901
+ "integrity": "sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==",
902
+ "optional": true
903
+ },
904
+ "@rollup/rollup-android-arm64": {
905
+ "version": "4.16.4",
906
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz",
907
+ "integrity": "sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==",
908
+ "optional": true
909
+ },
910
+ "@rollup/rollup-darwin-arm64": {
911
+ "version": "4.16.4",
912
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz",
913
+ "integrity": "sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==",
914
+ "optional": true
915
+ },
916
+ "@rollup/rollup-darwin-x64": {
917
+ "version": "4.16.4",
918
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz",
919
+ "integrity": "sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==",
920
+ "optional": true
921
+ },
922
+ "@rollup/rollup-linux-arm-gnueabihf": {
923
+ "version": "4.16.4",
924
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz",
925
+ "integrity": "sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==",
926
+ "optional": true
927
+ },
928
+ "@rollup/rollup-linux-arm-musleabihf": {
929
+ "version": "4.16.4",
930
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz",
931
+ "integrity": "sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==",
932
+ "optional": true
933
+ },
934
+ "@rollup/rollup-linux-arm64-gnu": {
935
+ "version": "4.16.4",
936
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz",
937
+ "integrity": "sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==",
938
+ "optional": true
939
+ },
940
+ "@rollup/rollup-linux-arm64-musl": {
941
+ "version": "4.16.4",
942
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz",
943
+ "integrity": "sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==",
944
+ "optional": true
945
+ },
946
+ "@rollup/rollup-linux-powerpc64le-gnu": {
947
+ "version": "4.16.4",
948
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz",
949
+ "integrity": "sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==",
950
+ "optional": true
951
+ },
952
+ "@rollup/rollup-linux-riscv64-gnu": {
953
+ "version": "4.16.4",
954
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz",
955
+ "integrity": "sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==",
956
+ "optional": true
957
+ },
958
+ "@rollup/rollup-linux-s390x-gnu": {
959
+ "version": "4.16.4",
960
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz",
961
+ "integrity": "sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==",
962
+ "optional": true
963
+ },
964
+ "@rollup/rollup-linux-x64-gnu": {
965
+ "version": "4.16.4",
966
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz",
967
+ "integrity": "sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==",
968
+ "optional": true
969
+ },
970
+ "@rollup/rollup-linux-x64-musl": {
971
+ "version": "4.16.4",
972
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz",
973
+ "integrity": "sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==",
974
+ "optional": true
975
+ },
976
+ "@rollup/rollup-win32-arm64-msvc": {
977
+ "version": "4.16.4",
978
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz",
979
+ "integrity": "sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==",
980
+ "optional": true
981
+ },
982
+ "@rollup/rollup-win32-ia32-msvc": {
983
+ "version": "4.16.4",
984
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz",
985
+ "integrity": "sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==",
986
+ "optional": true
987
+ },
988
+ "@rollup/rollup-win32-x64-msvc": {
989
+ "version": "4.16.4",
990
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.4.tgz",
991
+ "integrity": "sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==",
992
+ "optional": true
993
+ },
994
+ "@types/estree": {
995
+ "version": "1.0.5",
996
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
997
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="
998
+ },
999
+ "@types/node": {
1000
+ "version": "18.0.6",
1001
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.6.tgz",
1002
+ "integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw=="
1003
+ },
1004
+ "esbuild": {
1005
+ "version": "0.20.2",
1006
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
1007
+ "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
1008
+ "requires": {
1009
+ "@esbuild/aix-ppc64": "0.20.2",
1010
+ "@esbuild/android-arm": "0.20.2",
1011
+ "@esbuild/android-arm64": "0.20.2",
1012
+ "@esbuild/android-x64": "0.20.2",
1013
+ "@esbuild/darwin-arm64": "0.20.2",
1014
+ "@esbuild/darwin-x64": "0.20.2",
1015
+ "@esbuild/freebsd-arm64": "0.20.2",
1016
+ "@esbuild/freebsd-x64": "0.20.2",
1017
+ "@esbuild/linux-arm": "0.20.2",
1018
+ "@esbuild/linux-arm64": "0.20.2",
1019
+ "@esbuild/linux-ia32": "0.20.2",
1020
+ "@esbuild/linux-loong64": "0.20.2",
1021
+ "@esbuild/linux-mips64el": "0.20.2",
1022
+ "@esbuild/linux-ppc64": "0.20.2",
1023
+ "@esbuild/linux-riscv64": "0.20.2",
1024
+ "@esbuild/linux-s390x": "0.20.2",
1025
+ "@esbuild/linux-x64": "0.20.2",
1026
+ "@esbuild/netbsd-x64": "0.20.2",
1027
+ "@esbuild/openbsd-x64": "0.20.2",
1028
+ "@esbuild/sunos-x64": "0.20.2",
1029
+ "@esbuild/win32-arm64": "0.20.2",
1030
+ "@esbuild/win32-ia32": "0.20.2",
1031
+ "@esbuild/win32-x64": "0.20.2"
1032
+ }
1033
+ },
1034
+ "fsevents": {
1035
+ "version": "2.3.3",
1036
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1037
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1038
+ "optional": true
1039
+ },
1040
+ "nanoid": {
1041
+ "version": "3.3.7",
1042
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
1043
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="
1044
+ },
1045
+ "picocolors": {
1046
+ "version": "1.0.0",
1047
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
1048
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
1049
+ },
1050
+ "postcss": {
1051
+ "version": "8.4.38",
1052
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
1053
+ "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
1054
+ "requires": {
1055
+ "nanoid": "^3.3.7",
1056
+ "picocolors": "^1.0.0",
1057
+ "source-map-js": "^1.2.0"
1058
+ }
1059
+ },
1060
+ "rollup": {
1061
+ "version": "4.16.4",
1062
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz",
1063
+ "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==",
1064
+ "requires": {
1065
+ "@rollup/rollup-android-arm-eabi": "4.16.4",
1066
+ "@rollup/rollup-android-arm64": "4.16.4",
1067
+ "@rollup/rollup-darwin-arm64": "4.16.4",
1068
+ "@rollup/rollup-darwin-x64": "4.16.4",
1069
+ "@rollup/rollup-linux-arm-gnueabihf": "4.16.4",
1070
+ "@rollup/rollup-linux-arm-musleabihf": "4.16.4",
1071
+ "@rollup/rollup-linux-arm64-gnu": "4.16.4",
1072
+ "@rollup/rollup-linux-arm64-musl": "4.16.4",
1073
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4",
1074
+ "@rollup/rollup-linux-riscv64-gnu": "4.16.4",
1075
+ "@rollup/rollup-linux-s390x-gnu": "4.16.4",
1076
+ "@rollup/rollup-linux-x64-gnu": "4.16.4",
1077
+ "@rollup/rollup-linux-x64-musl": "4.16.4",
1078
+ "@rollup/rollup-win32-arm64-msvc": "4.16.4",
1079
+ "@rollup/rollup-win32-ia32-msvc": "4.16.4",
1080
+ "@rollup/rollup-win32-x64-msvc": "4.16.4",
1081
+ "@types/estree": "1.0.5",
1082
+ "fsevents": "~2.3.2"
1083
+ }
1084
+ },
1085
+ "source-map-js": {
1086
+ "version": "1.2.0",
1087
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
1088
+ "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg=="
1089
+ },
1090
+ "vite": {
1091
+ "version": "5.2.10",
1092
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz",
1093
+ "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==",
1094
+ "requires": {
1095
+ "esbuild": "^0.20.1",
1096
+ "fsevents": "~2.3.3",
1097
+ "postcss": "^8.4.38",
1098
+ "rollup": "^4.13.0"
1099
+ }
1100
+ }
1101
+ }
1102
+ }
public/ainote/package.json ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "nodejs",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "test": "echo \"Error: no test specified\" && exit 1",
8
+ "start": "vite"
9
+ },
10
+ "keywords": [],
11
+ "author": "",
12
+ "license": "ISC",
13
+ "dependencies": {
14
+ "@types/node": "^18.0.6",
15
+ "vite": "^5.2.10"
16
+ }
17
+ }
public/ainote/start.sh ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ npx -y vite --host 0.0.0.0
2
+
3
+
public/ainote/test.html ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Document</title>
8
+ <style>
9
+ #textarea2{
10
+ overflow: hidden;
11
+ }
12
+ </style>
13
+ </head>
14
+ <body>
15
+ <h1>test</h1>
16
+ <pre>
17
+ https://5173-01hm8s5jycsmrc8k2gbqz5e1wf.cloudspaces.litng.ai/test.html
18
+
19
+ </pre>
20
+ <textarea id="textarea1" name="testtextarea" id="testtextarea " cols="30" rows="10"></textarea> <br>
21
+ <textarea id="textarea2" name="testtextarea" id="testtextarea " cols="300" rows="10"></textarea> <br>
22
+
23
+ <input id="input1" type="text" placeholder="input1"> <br>
24
+ <input id="input2" type="number" placeholder="input2" > <br>
25
+
26
+ <input id="fileinput" type="file" /> <br>
27
+ <br><button id="start">start</button>
28
+ <button id="stop">stop</button>
29
+
30
+ </body>
31
+
32
+
33
+ <script src="./index.js"></script>
34
+ <script src="./test.js"></script>
35
+ <script>
36
+ let startButton=document.querySelector('#start');
37
+ let stopButton=document.querySelector('#stop');
38
+
39
+ let rec=new Recorder();
40
+
41
+
42
+ document.querySelector('#start').addEventListener('click',async ()=>{
43
+
44
+ console.log('start');
45
+ let blob=await rec.startRecording(stopButton)
46
+
47
+ // rec.startRecording(document.body,playAudioBlob)
48
+ // rec.startRecording(document.body,blobToBase64)
49
+
50
+ console.log('got blob',blob)
51
+ playAudioBlob(blob)
52
+ console.log(await blobToBase64(blob) );
53
+ sendAudioToLeptonWhisperApi(blob);
54
+ //let transcribe=await whisperjaxws(blob);
55
+
56
+ })
57
+
58
+
59
+
60
+ document.querySelector('#stop').addEventListener('click',()=>{
61
+ rec.stopRecording();
62
+
63
+ })
64
+
65
+ document.body.addEventListener('focus',()=>{
66
+ console.log('focus');
67
+ })
68
+
69
+ </script>
70
+ </html>
public/ainote/test/test.html ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Document</title>
8
+ <style>
9
+
10
+ </style>
11
+ </head>
12
+ <body>
13
+ <h1>test</h1>
14
+
15
+ <div id="mdcontainer">md container</div>
16
+
17
+ <br><button id="start">start</button>
18
+ <button id="stop">stop</button>
19
+ <button id="testButton">test</button>
20
+
21
+ <button>else</button> <br>
22
+ <input id="fileinput" type="file" /> <br>
23
+
24
+
25
+ <textarea id="textarea1" name="testtextarea" style="width:100%;height:20vh;" ></textarea> <br>
26
+ <textarea id="textarea2" name="testtextarea" style="width:100%;height:20vh;" ></textarea> <br>
27
+
28
+ <input id="input1" type="text" placeholder="input1"> <br>
29
+ <input id="input2" type="number" placeholder="input2" > <br>
30
+
31
+
32
+ <div id='editableDiv' editable>
33
+ <div>
34
+ <div>
35
+ this div, his grandparen is editable, so he is editable too
36
+ </div>
37
+ </div>
38
+ </div>
39
+ <script>
40
+ const div = document.getElementById("editableDiv");
41
+ div.contentEditable = true;
42
+ </script>
43
+
44
+
45
+
46
+
47
+ <textarea id="textarea2" name="testtextarea" style="width:100%;height:90vh;" ></textarea> <br>
48
+
49
+ <pre>
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+ </pre>
74
+
75
+
76
+ </body>
77
+
78
+
79
+ <script src="../index.js"></script>
80
+ <script src="./test.js"></script>
81
+ <script>
82
+
83
+
84
+
85
+ </script>
86
+ </html>
public/ainote/test/test.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ let startButton = document.querySelector("#start");
2
+ let stopButton = document.querySelector("#stop");
3
+ let testButton = document.querySelector("#testButton");
4
+
5
+ let textarea = document.querySelector("textarea");
6
+ const fileInput = document.getElementById("fileinput");
7
+ let editableDiv = document.querySelector("#editableDiv");
8
+ editableDiv.isContentEditable;
9
+
10
+ let mdcontainer=document.querySelector('#mdcontainer');
11
+
12
+ devilentLIBS.disableSelect(startButton);
13
+ devilentLIBS.disableSelect(stopButton);
14
+ devilentLIBS.disableSelect(testButton);
15
+
16
+
17
+ devilentLIBS.renderMarkdown('# Sure, \n\n #here a simple Python code to add two numbers with detailed comments:```python\n# This program adds two numbers\n# Get the first number from user input\n num1 = float(input("Enter the first number: "))\n# Get the second number from user input\n <div>this div</div>```', mdcontainer);
18
+
19
+
public/ainote/test/transcribe.html ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Clean and Beautiful Page</title>
8
+ <style>
9
+ body {
10
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
11
+ background-color: #f7f7f7;
12
+ margin: 0;
13
+ padding: 20px;
14
+ line-height: 1.6;
15
+ }
16
+ h1 {
17
+ color: #333;
18
+ }
19
+ button {
20
+ background-color: #5cb85c;
21
+ border: none;
22
+ padding: 10px 15px;
23
+ margin: 10px 5px 20px 0;
24
+ border-radius: 4px;
25
+ cursor: pointer;
26
+ transition: background-color 0.3s ease;
27
+ }
28
+ button:hover {
29
+ background-color: #4cae4c;
30
+ }
31
+ input[type="file"] {
32
+ margin-bottom: 15px;
33
+ }
34
+ textarea {
35
+ width: 100%;
36
+ height: 20vh;
37
+ margin-bottom: 15px;
38
+ padding: 10px;
39
+ border-radius: 4px;
40
+ border: 1px solid #ccc;
41
+ resize: vertical;
42
+ }
43
+ input[type="text"],
44
+ input[type="number"] {
45
+ width: calc(100% - 22px);
46
+ padding: 10px;
47
+ margin-bottom: 15px;
48
+ border-radius: 4px;
49
+ border: 1px solid #ccc;
50
+ }
51
+ #editableDiv {
52
+ margin-bottom: 15px;
53
+ padding: 10px;
54
+ background-color: #fff;
55
+ border: 1px dashed #5cb85c;
56
+ border-radius: 4px;
57
+ }
58
+ pre {
59
+ background-color: #efefef;
60
+ padding: 10px;
61
+ border-radius: 4px;
62
+ overflow-x: auto;
63
+ }
64
+ </style>
65
+ </head>
66
+ <body>
67
+ <h1>Test Page</h1>
68
+
69
+ <button id="start">Start</button>
70
+ <button id="stop">Stop</button>
71
+ <button id="testButton">Test</button>
72
+ <button>Else</button>
73
+
74
+ <input id="fileinput" type="file">
75
+
76
+ <textarea id="textarea1" name="testtextarea"></textarea>
77
+ <textarea id="textarea2" name="testtextarea"></textarea>
78
+
79
+ <input id="input1" type="text" placeholder="input1">
80
+ <input id="input2" type="number" placeholder="input2">
81
+
82
+ <div id='editableDiv'>
83
+ <p>This div, its grandparent is editable, so it is editable too</p>
84
+ </div>
85
+
86
+ <textarea id="textarea3" name="testtextarea" style="height:90vh;"></textarea>
87
+
88
+ <pre>
89
+ <!-- Your preformatted text here, if needed. -->
90
+ </pre>
91
+
92
+ <script>
93
+ const div = document.getElementById("editableDiv");
94
+ div.contentEditable = true;
95
+ </script>
96
+
97
+ <script src="../index.js"></script>
98
+ <script src="./transcribe.js"></script>
99
+ </body>
100
+ </html>
public/ainote/test/transcribe.js ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ console.log('start transcribex.js')
2
+ let startButton = document.querySelector("#start");
3
+ let stopButton = document.querySelector("#stop");
4
+ let testButton = document.querySelector("#testButton");
5
+
6
+ let textarea = document.querySelector("textarea");
7
+ const fileInput = document.getElementById("fileinput");
8
+ let editableDiv = document.querySelector("#editableDiv");
9
+ editableDiv.isContentEditable;
10
+
11
+ devilentLIBS.disableSelect(startButton);
12
+ devilentLIBS.disableSelect(stopButton);
13
+ devilentLIBS.disableSelect(testButton);
14
+
15
+ testButton.addEventListener("pointerdown", () => {
16
+ deletePreviousWord(document.activeElement);
17
+ //
18
+ });
19
+
20
+ function playandTranscribe(blob) {
21
+ devilentLIBS.playAudioBlob(blob);
22
+
23
+ function dipslayResult(text, name) {
24
+ textarea.value = name + ": " + text + "\n\n" + textarea.value;
25
+ }
26
+
27
+ setTimeout(async () => {
28
+ let response = await whisperjaxws(blob);
29
+ dipslayResult(response, "whisperjaxws");
30
+ }, 85);
31
+
32
+ setTimeout(async () => {
33
+ let response = await sendAudioToLeptonWhisperApi(blob);
34
+ dipslayResult(response, "leptonwhisperapi");
35
+ }, 90);
36
+ setTimeout(async () => {
37
+ let response = await sendAudioToHFWhisperApi(blob);
38
+ dipslayResult(response.text, "hfwhisperapi");
39
+ }, 100);
40
+ setTimeout(async () => {
41
+ let response = await sendAudioToCFWhisperApi(blob);
42
+ dipslayResult(response.text, "cfwhisperapi");
43
+ }, 110);
44
+ }
45
+
46
+ let rec = new devilentLIBS.Recorder();
47
+
48
+ document.querySelector("#start").addEventListener("click", async () => {
49
+ console.log("start");
50
+ textarea.value = "";
51
+ let blob = await rec.startRecording(stopButton);
52
+
53
+ // rec.startRecording(document.body,playAudioBlob)
54
+ // rec.startRecording(document.body,blobToBase64)
55
+
56
+ playandTranscribe(blob);
57
+ });
58
+
59
+ document.querySelector("#stop").addEventListener("click", () => {
60
+ rec.stopRecording();
61
+ });
62
+
63
+ fileInput.addEventListener("change", function (event) {
64
+ const file = event.target.files[0];
65
+ if (file) {
66
+ console.log("File name:", file.name);
67
+ console.log("File size:", file.size, "bytes");
68
+ console.log("File type:", file.type);
69
+ playandTranscribe(file);
70
+ // You can add further logic to process the file here, e.g., upload it to a server
71
+ }
72
+ });
73
+
74
+
public/ainote/test/transcribex.html ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Clean and Beautiful Page</title>
8
+ <style>
9
+ body {
10
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
11
+ background-color: #f7f7f7;
12
+ margin: 0;
13
+ padding: 20px;
14
+ line-height: 1.6;
15
+ }
16
+ h1 {
17
+ color: #333;
18
+ }
19
+ button {
20
+ background-color: #5cb85c;
21
+ border: none;
22
+ padding: 10px 15px;
23
+ margin: 10px 5px 20px 0;
24
+ border-radius: 4px;
25
+ cursor: pointer;
26
+ transition: background-color 0.3s ease;
27
+ }
28
+ button:hover {
29
+ background-color: #4cae4c;
30
+ }
31
+ input[type="file"] {
32
+ margin-bottom: 15px;
33
+ }
34
+ textarea {
35
+ width: 100%;
36
+ height: 20vh;
37
+ margin-bottom: 15px;
38
+ padding: 10px;
39
+ border-radius: 4px;
40
+ border: 1px solid #ccc;
41
+ resize: vertical;
42
+ }
43
+ input[type="text"],
44
+ input[type="number"] {
45
+ width: calc(100% - 22px);
46
+ padding: 10px;
47
+ margin-bottom: 15px;
48
+ border-radius: 4px;
49
+ border: 1px solid #ccc;
50
+ }
51
+ #editableDiv {
52
+ margin-bottom: 15px;
53
+ padding: 10px;
54
+ background-color: #fff;
55
+ border: 1px dashed #5cb85c;
56
+ border-radius: 4px;
57
+ }
58
+ pre {
59
+ background-color: #efefef;
60
+ padding: 10px;
61
+ border-radius: 4px;
62
+ overflow-x: auto;
63
+ }
64
+ </style>
65
+ </head>
66
+ <body>
67
+ <h1>Test Page</h1>
68
+
69
+ <button id="start">Start</button>
70
+ <button id="stop">Stop</button>
71
+ <button id="testButton">Test</button>
72
+ <button>Else</button>
73
+
74
+ <input id="fileinput" type="file">
75
+
76
+ <textarea id="textarea1" name="testtextarea"></textarea>
77
+ <textarea id="textarea2" name="testtextarea"></textarea>
78
+
79
+ <input id="input1" type="text" placeholder="input1">
80
+ <input id="input2" type="number" placeholder="input2">
81
+
82
+ <div id='editableDiv'>
83
+ <p>This div, its grandparent is editable, so it is editable too</p>
84
+ </div>
85
+
86
+ <textarea id="textarea3" name="testtextarea" style="height:90vh;"></textarea>
87
+
88
+ <pre>
89
+ <!-- Your preformatted text here, if needed. -->
90
+ </pre>
91
+
92
+ <script>
93
+ const div = document.getElementById("editableDiv");
94
+ div.contentEditable = true;
95
+ </script>
96
+
97
+ <script src="../index.js"></script>
98
+ <script src="./transcribex.js"></script>
99
+ </body>
100
+ </html>
public/ainote/test/transcribex.js ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ console.log('start transcribex.js')
2
+ let startButton = document.querySelector("#start");
3
+ let stopButton = document.querySelector("#stop");
4
+ let testButton = document.querySelector("#testButton");
5
+
6
+ let textarea = document.querySelector("textarea");
7
+ const fileInput = document.getElementById("fileinput");
8
+ let editableDiv = document.querySelector("#editableDiv");
9
+ editableDiv.isContentEditable;
10
+
11
+ devilentLIBS.disableSelect(startButton);
12
+ devilentLIBS.disableSelect(stopButton);
13
+ devilentLIBS.disableSelect(testButton);
14
+
15
+ testButton.addEventListener("pointerdown", () => {
16
+ deletePreviousWord(document.activeElement);
17
+ //
18
+ });
19
+
20
+ function playandTranscribe(blob,autoPlay=false) {
21
+ devilentLIBS.playAudioBlob(blob,autoPlay=false);
22
+
23
+ function dipslayResult(text, name) {
24
+ textarea.value = name + ": " + text + "\n\n" + textarea.value;
25
+ }
26
+
27
+ setTimeout(async () => {
28
+ let response = await whisperjaxws(blob);
29
+ dipslayResult(response, "whisperjaxws");
30
+ }, 85);
31
+
32
+ setTimeout(async () => {
33
+ let response = await sendAudioToLeptonWhisperApi(blob);
34
+ dipslayResult(response, "leptonwhisperapi");
35
+ }, 90);
36
+ setTimeout(async () => {
37
+ let response = await sendAudioToHFWhisperApi(blob);
38
+ dipslayResult(response.text, "hfwhisperapi");
39
+ }, 100);
40
+ setTimeout(async () => {
41
+ let response = await sendAudioToCFWhisperApi(blob);
42
+ dipslayResult(response.text, "cfwhisperapi");
43
+ }, 110);
44
+ }
45
+
46
+ let rec = new devilentLIBS.Recorder();
47
+
48
+ document.querySelector("#start").addEventListener("click", async () => {
49
+ console.log("start");
50
+ textarea.value = "";
51
+ let blob = await rec.startRecordingWithSilenceDetection(stopButton,(audioBlob)=>{
52
+ playandTranscribe(audioBlob,autoPlay=false);
53
+
54
+ });
55
+
56
+
57
+ });
58
+
59
+ document.querySelector("#stop").addEventListener("click", () => {
60
+ rec.stopRecording();
61
+ });
62
+
63
+ fileInput.addEventListener("change", function (event) {
64
+ const file = event.target.files[0];
65
+ if (file) {
66
+ console.log("File name:", file.name);
67
+ console.log("File size:", file.size, "bytes");
68
+ console.log("File type:", file.type);
69
+ playandTranscribe(file);
70
+ // You can add further logic to process the file here, e.g., upload it to a server
71
+ }
72
+ });
73
+
74
+
public/ainote/utils.js ADDED
@@ -0,0 +1,886 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ const utils = {
3
+ Recorder: class Recorder {
4
+ constructor() {
5
+ this.isRecording = false;
6
+ this.mediaRecorder;
7
+ this.encodeType = "audio/mpeg";
8
+ this.language = "en";
9
+ this.recordingColor = "lightblue";
10
+ this.autoStop=true;
11
+ }
12
+
13
+ async startRecording(
14
+ targetElement,
15
+ silenceHandler = () => {
16
+ console.log("silence detect");
17
+ },
18
+ autoStop = true
19
+ ) {
20
+ targetElement = targetElement || document.querySelector(`#whisper_voice_button`);
21
+
22
+ this.stopRecording();
23
+ console.log("start recording");
24
+ return navigator.mediaDevices
25
+ .getUserMedia({ audio: true })
26
+ .then((stream) => {
27
+ this.mediaRecorder = new MediaRecorder(stream);
28
+
29
+ let silenceStart = Date.now();
30
+ let silenceDuration = 0;
31
+
32
+ let mediaRecorder = this.mediaRecorder;
33
+ let audioChunks = [];
34
+ mediaRecorder.start();
35
+ this.isRecording = true;
36
+ targetElement.style.backgroundColor = "rgba(173, 216, 230, 0.3)";
37
+
38
+ let volumeInterval;
39
+ let audioContext;
40
+ audioContext = new AudioContext();
41
+ const analyser = audioContext.createAnalyser();
42
+ const microphone = audioContext.createMediaStreamSource(
43
+ mediaRecorder.stream
44
+ );
45
+ microphone.connect(analyser);
46
+ analyser.fftSize = 512;
47
+ const bufferLength = analyser.frequencyBinCount;
48
+ const dataArray = new Uint8Array(bufferLength);
49
+
50
+ const updateButtonFontSize = () => {
51
+ analyser.getByteFrequencyData(dataArray);
52
+ let sum = 0;
53
+ for (let i = 0; i < bufferLength; i++) {
54
+ sum += dataArray[i];
55
+ }
56
+ let averageVolume = sum / bufferLength;
57
+ if (averageVolume < 10) {
58
+ silenceDuration = Date.now() - silenceStart;
59
+ if (silenceDuration > 1000) {
60
+ silenceHandler();
61
+ }
62
+ } else {
63
+ silenceStart = Date.now();
64
+ }
65
+
66
+ let scale = 3 + averageVolume / 15;
67
+ targetElement.style.transform = `scale(${scale})`;
68
+ };
69
+
70
+ volumeInterval = setInterval(updateButtonFontSize, 100);
71
+
72
+ mediaRecorder.addEventListener("dataavailable", (event) => {
73
+ console.log("dataavailable");
74
+ audioChunks.push(event.data);
75
+ });
76
+
77
+ return new Promise((resolve, reject) => {
78
+ mediaRecorder.addEventListener("stop", async () => {
79
+ this.isRecording = false;
80
+ console.log("stop");
81
+ clearInterval(volumeInterval);
82
+ const audioBlob = new Blob(audioChunks, {
83
+ type: this.encodeType,
84
+ });
85
+ targetElement.style.transform = `scale(1)`;
86
+ targetElement.style.background = "transparent";
87
+
88
+ audioContext?.close();
89
+ mediaRecorder.stream.getTracks().forEach((track) => track.stop());
90
+ console.log("resolved ");
91
+ resolve(audioBlob);
92
+ });
93
+ });
94
+ })
95
+ .catch((error) => {
96
+ if (
97
+ error.name === "PermissionDeniedError" ||
98
+ error.name === "NotAllowedError"
99
+ ) {
100
+ console.error("User denied permission to access audio");
101
+ console.log("Audio permission denied");
102
+ } else {
103
+ console.error(
104
+ "An error occurred while accessing the audio device",
105
+ error
106
+ );
107
+ }
108
+ });
109
+ }
110
+
111
+ async startRecordingWithSilenceDetection(
112
+ targetElement,silenceHandler = () => console.log("silence detect")) {
113
+
114
+ let autoStop = this.autoStop || true;
115
+ this.stopRecording();
116
+ console.log("start recording");
117
+ return navigator.mediaDevices
118
+ .getUserMedia({ audio: true })
119
+ .then((stream) => {
120
+ this.mediaRecorder = new MediaRecorder(stream);
121
+
122
+ let startTime = Date.now();
123
+
124
+ let isSilent = false;
125
+ let isLongSilent = true;
126
+ let silenceStart = Date.now();
127
+ let silenceDuration = 0;
128
+
129
+ let mediaRecorder = this.mediaRecorder;
130
+ let audioChunks = [];
131
+ mediaRecorder.start();
132
+ this.isRecording = true;
133
+ targetElement.style.backgroundColor = "rgba(173, 216, 230, 0.3)";
134
+
135
+ let volumeInterval;
136
+ let audioContext;
137
+ audioContext = new AudioContext();
138
+ const analyser = audioContext.createAnalyser();
139
+ const microphone = audioContext.createMediaStreamSource(
140
+ mediaRecorder.stream
141
+ );
142
+ microphone.connect(analyser);
143
+ analyser.fftSize = 512;
144
+ const bufferLength = analyser.frequencyBinCount;
145
+ const dataArray = new Uint8Array(bufferLength);
146
+
147
+ const handleAudioData = () => {
148
+ analyser.getByteFrequencyData(dataArray);
149
+ let sum = 0;
150
+ for (let i = 0; i < bufferLength; i++) {
151
+ sum += dataArray[i];
152
+ }
153
+ let averageVolume = sum / bufferLength;
154
+
155
+ if (averageVolume < 15) {
156
+ if (isSilent) {
157
+ silenceDuration = Date.now() - silenceStart;
158
+ if (silenceDuration > 3000) {
159
+ isLongSilent = true;
160
+ mediaRecorder.requestData();
161
+ silenceStart = Date.now();
162
+ }
163
+ } else {
164
+ silenceDuration = Date.now() - silenceStart;
165
+ if (silenceDuration > 1000) {
166
+ isSilent = true;
167
+ console.log('change isSilent to true');
168
+
169
+ mediaRecorder.requestData();
170
+ }
171
+ }
172
+ } else {
173
+ isSilent = false;
174
+ isLongSilent = false;
175
+ silenceStart = Date.now();
176
+ }
177
+
178
+ let scale = 3 + averageVolume / 15;
179
+ targetElement.style.transform = `scale(${scale})`;
180
+ };
181
+ volumeInterval = setInterval(handleAudioData, 100);
182
+
183
+ let counter = 0;
184
+ let firstdata;
185
+ setTimeout(() => {
186
+ mediaRecorder.requestData();
187
+ }, 200);
188
+ mediaRecorder.addEventListener("dataavailable", (event) => {
189
+ if (autoStop === true) {
190
+ if (Date.now() - startTime > 600000) {
191
+ mediaRecorder.stop();
192
+ }
193
+ }
194
+ counter++;
195
+ if (counter <= 1) {
196
+ firstdata = event.data;
197
+ if (event.data.size > 0) {
198
+ audioChunks.push(event.data);
199
+ }
200
+ return;
201
+ }
202
+ console.log("dataavailable", event.data);
203
+ if (isLongSilent) {
204
+ console.log("dataavailable,Long silent will do noting", event.data);
205
+ return;
206
+ }
207
+
208
+ silenceHandler(new Blob([firstdata, event.data], { type: mediaRecorder.mimeType }));
209
+ });
210
+
211
+ return new Promise((resolve, reject) => {
212
+ mediaRecorder.addEventListener("stop", async () => {
213
+ this.isRecording = false;
214
+ console.log("stop");
215
+ clearInterval(volumeInterval);
216
+ const audioBlob = new Blob(audioChunks, {
217
+ type: this.encodeType,
218
+ });
219
+ targetElement.style.transform = `scale(1)`;
220
+ targetElement.style.background = "transparent";
221
+
222
+ audioContext?.close();
223
+ mediaRecorder.stream.getTracks().forEach((track) => track.stop());
224
+ console.log("resolved ");
225
+ resolve(audioBlob);
226
+ });
227
+ });
228
+ })
229
+ .catch((error) => {
230
+ if (
231
+ error.name === "PermissionDeniedError" ||
232
+ error.name === "NotAllowedError"
233
+ ) {
234
+ console.error("User denied permission to access audio");
235
+ showNotification("Audio permission denied");
236
+ } else {
237
+ console.error(
238
+ "An error occurred while accessing the audio device",
239
+ error
240
+ );
241
+ showNotification("Error accessing audio device");
242
+ }
243
+ });
244
+ }
245
+
246
+ stopRecording() {
247
+ this.isRecording = false;
248
+
249
+ this.mediaRecorder?.stop();
250
+ this.mediaRecorder?.audioContext?.close();
251
+ this.mediaRecorder?.stream?.getTracks().forEach((track) => track.stop());
252
+ }
253
+ },
254
+ tts: function synthesizeSpeech(text = 'test text', voice = 'alloy') {
255
+ let url = `https://tts.grapee.ddnsfree.com/tts/${encodeURIComponent(text)}`;
256
+
257
+ let container = document.getElementById("devlent_tts_container");
258
+ if (!container) {
259
+ container = document.createElement("div");
260
+ container.id = "devlent_tts_container";
261
+ document.body.appendChild(container);
262
+ }
263
+
264
+ let audio = document.getElementById("tts_audio");
265
+ if (!audio) {
266
+ audio = document.createElement("audio");
267
+ audio.id = "tts_audio";
268
+ container.appendChild(audio);
269
+
270
+ let button = document.createElement("button");
271
+ button.innerHTML = "x";
272
+ button.style.backgroundColor = 'transparent';
273
+ button.style.marginLeft = '10px';
274
+
275
+ button.addEventListener('pointerdown', () => container.style.display = "none")
276
+ let br = document.createElement('br');
277
+
278
+ container.prepend(br);
279
+ container.prepend(button);
280
+ }
281
+
282
+ container.style.display = "block";
283
+ container.style.position = "fixed";
284
+ container.style.bottom = "0";
285
+ container.style.right = "0";
286
+ container.style.height = 'fit-content'
287
+
288
+ if (!text) return;
289
+ audio.src = url;
290
+ audio.controls = true;
291
+ audio.autoplay = true;
292
+
293
+ utils.dragElement(container, container)
294
+ },
295
+ stt: async (audioBlob) => {
296
+ const formData = new FormData();
297
+ formData.append("file", audioBlob, "audio.mp3");
298
+ formData.append("model", "whisper-large-v3");
299
+
300
+ try {
301
+ const response = await fetch('/openai/v1/audio/transcriptions', {
302
+ method: 'POST',
303
+ body: formData
304
+ });
305
+
306
+ if (!response.ok) {
307
+ throw new Error(`Error: ${response.status} ${response.statusText}`);
308
+ }
309
+
310
+ const data = await response.json();
311
+ return data;
312
+ } catch (error) {
313
+ console.error('There was an error with the transcription request:', error);
314
+ }
315
+
316
+
317
+ },
318
+
319
+ checkValidString(str) {
320
+ if (str === undefined || str === null || str.trim() === "") {
321
+ return false;
322
+ }
323
+ if (str === "undefined" || str === "null") {
324
+ return false;
325
+ }
326
+ return true;
327
+ },
328
+ getCurrentLineString(element) {
329
+ const selection = window.getSelection();
330
+ const range = selection.getRangeAt(0);
331
+ const node = range.startContainer;
332
+ const offset = range.startOffset;
333
+
334
+ if (node.nodeType === Node.TEXT_NODE) {
335
+ const text = node.textContent;
336
+ const lineStart = text.lastIndexOf('\n', offset) + 1;
337
+ const lineEnd = text.indexOf('\n', offset);
338
+ const line = lineEnd === -1 ? text.slice(lineStart) : text.slice(lineStart, lineEnd);
339
+ return line;
340
+ }
341
+
342
+ const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT);
343
+ let currentNode, currentLine = '';
344
+
345
+ while (currentNode = walker.nextNode()) {
346
+ const text = currentNode.textContent;
347
+ const lines = text.split('\n');
348
+
349
+ for (let i = 0; i < lines.length; i++) {
350
+ if (range.intersectsNode(currentNode)) {
351
+ currentLine = lines[i];
352
+ break;
353
+ }
354
+ }
355
+
356
+ if (currentLine !== '') {
357
+ break;
358
+ }
359
+ }
360
+
361
+ return currentLine;
362
+ },
363
+ isEditableElement: function isEditableElement(element) {
364
+ while (element) {
365
+ if (element.contentEditable === "true") {
366
+ return true;
367
+ }
368
+ element = element.parentElement;
369
+ }
370
+ return false;
371
+ },
372
+ disableSelect: function disableSelect(element) {
373
+ element.style.userSelect = "none";
374
+
375
+ element.addEventListener("pointerdown", (e) => {
376
+ e.preventDefault();
377
+ });
378
+ },
379
+ getSelectionText: function getSelectionText() {
380
+ let activeElement = document.activeElement;
381
+ if (activeElement && activeElement.value) {
382
+ return activeElement.value.substring(
383
+ activeElement.selectionStart,
384
+ activeElement.selectionEnd
385
+ );
386
+ } else {
387
+ return window.getSelection().toString();
388
+ }
389
+ },
390
+ makeButtonFeedback: function makeButtonFeedback(button) {
391
+ let originalColor = button.style.backgroundColor || "white";
392
+
393
+ button.addEventListener("pointerdown", function () {
394
+ button.style.backgroundColor = "lightblue";
395
+ });
396
+ button.addEventListener("pointerup", function () {
397
+ setTimeout(() => { button.style.backgroundColor = originalColor; }, 1000)
398
+ });
399
+
400
+ button.addEventListener("pointercancel", function () {
401
+ setTimeout(() => { button.style.backgroundColor = originalColor; }, 1000)
402
+ });
403
+ },
404
+ showToast: function showToast(
405
+ text,
406
+ x = 0,
407
+ y = 0,
408
+ w = 200,
409
+ h = 0,
410
+ duration = 1000,
411
+ zIndex = 9999
412
+ ) {
413
+ const textArea = document.createElement("textarea");
414
+ textArea.value = text;
415
+ textArea.style.width = w + "px";
416
+ textArea.style.height = h === 0 ? "auto" : h + "px";
417
+ textArea.style.borderWidth = "0";
418
+ textArea.style.outline = "none";
419
+ textArea.style.position = "fixed";
420
+ textArea.style.left = x + "px";
421
+ textArea.style.top = y + "px";
422
+ textArea.style.zIndex = zIndex;
423
+ textArea.disabled = true;
424
+ document.body.appendChild(textArea);
425
+ setTimeout(() => {
426
+ document.body.removeChild(textArea);
427
+ }, duration);
428
+ },
429
+ copyToClipboard: function copyToClipboard(text) {
430
+ const textArea = document.createElement("textarea");
431
+ textArea.value = text;
432
+ textArea.style.width = "50%";
433
+ textArea.style.height = "100px";
434
+ textArea.style.borderWidth = "0";
435
+ textArea.style.outline = "none";
436
+ textArea.style.position = "fixed";
437
+ textArea.style.left = "0";
438
+ textArea.style.top = "0";
439
+ textArea.style.zIndex = "9999999";
440
+ document.body.appendChild(textArea);
441
+ textArea.select();
442
+ document.execCommand("copy");
443
+ textArea.disabled = true;
444
+ textArea.value = "copyed to clipboard \n" + textArea.value;
445
+ textArea.scrollTo(10000, 100000);
446
+ setTimeout(() => {
447
+ document.body.removeChild(textArea);
448
+ }, 4000);
449
+ },
450
+
451
+ writeText: function writeText(targetElement, text, prefix = " ", endfix = " ") {
452
+ console.log("writeText(): ", targetElement);
453
+ document.execCommand("insertText", false, `${prefix}${text}${endfix}`) || utils.copyToClipboard(text);
454
+ },
455
+ dragElement: function dragElement(elmnt, movableElmnt = elmnt.parentElement, speed = 1) {
456
+ elmnt.style.touchAction = "none";
457
+ let pos1 = 0,
458
+ pos2 = 0,
459
+ pos3 = 0,
460
+ pos4 = 0;
461
+
462
+ let rmShadeTimeout;
463
+ let shadeDiv;
464
+
465
+ elmnt.addEventListener("pointerdown", (e) => {
466
+ dragMouseDown(e);
467
+ });
468
+
469
+ function dragMouseDown(e) {
470
+ e = e || window.event;
471
+ e.preventDefault();
472
+
473
+ pos3 = e.clientX;
474
+ pos4 = e.clientY;
475
+ document.body.addEventListener("pointermove", elementDrag);
476
+ document.body.addEventListener("pointerup", closeDragElement);
477
+
478
+ shadeDiv =
479
+ document.querySelector("#shadeDivForDragElement") ||
480
+ document.createElement("div");
481
+ shadeDiv.id = "shadeDivForDragElement";
482
+ shadeDiv.style.width = "300vw";
483
+ shadeDiv.style.height = "300vh";
484
+ shadeDiv.style.position = "fixed";
485
+ shadeDiv.style.top = "0";
486
+ shadeDiv.style.left = "0";
487
+ shadeDiv.style.backgroundColor = "rgb(230,230,230,0.2)";
488
+ shadeDiv.style.zIndex = 100000;
489
+ document.body.appendChild(shadeDiv);
490
+ rmShadeTimeout = setTimeout(() => {
491
+ let shadeDiv = document.querySelector("#shadeDivForDragElement");
492
+ shadeDiv && document.body.removeChild(shadeDiv);
493
+ }, 10000);
494
+ }
495
+
496
+ function elementDrag(e) {
497
+ e = e || window.event;
498
+ e.preventDefault();
499
+ pos1 = pos3 - e.clientX;
500
+ pos2 = pos4 - e.clientY;
501
+
502
+ movableElmnt.style.position = "fixed";
503
+ movableElmnt.style.top = e.clientY - elmnt.clientHeight / 2 + "px";
504
+ movableElmnt.style.left = e.clientX - elmnt.clientWidth / 2 + "px";
505
+ }
506
+
507
+ function closeDragElement() {
508
+ console.log("closeDragElement(): pointerup");
509
+ document.body.removeEventListener("pointermove", elementDrag);
510
+ document.body.removeEventListener("pointerup", closeDragElement);
511
+
512
+ document.body.removeChild(
513
+ document.querySelector("#shadeDivForDragElement")
514
+ );
515
+ }
516
+ },
517
+
518
+ renderMarkdown(mdString, targetElement) {
519
+ let headerPattern = /^(#{1,6})\s*(.*)$/gm;
520
+ const boldPattern = /\*\*(.*?)\*\*/g;
521
+ const linkPattern = /\[(.*?)\]\((.*?)\)/g;
522
+ const newlinePattern = /(?:\n)/g;
523
+ const inlineCodePattern = /`(.*?)`/g;
524
+ const codeBlockPattern = /```(\w+)?\n(.*?)```/gs;
525
+
526
+ let html = mdString;
527
+
528
+ let parts = html.split("```");
529
+ for (let i = 0; i < parts.length; i++) {
530
+ if (i % 2 === 0) {
531
+ parts[i] = parts[i].replace(headerPattern, (match, hash, content) => {
532
+ const level = hash.length;
533
+ return `<h${level}>${content}</h${level}>`;
534
+ });
535
+ parts[i] = parts[i].replace(newlinePattern, (match, hash, content) => {
536
+ const level = hash.length;
537
+ return `<br>`;
538
+ });
539
+ }
540
+ }
541
+ html = parts.join("```");
542
+
543
+ html = html.replace(boldPattern, "<strong>$1</strong>");
544
+ html = html.replace(linkPattern, '<a href="$2">$1</a>');
545
+
546
+ html = html.replace(codeBlockPattern, (match, language, code) => {
547
+ return `
548
+ <div class="code-block">
549
+ <button class="copy-code-btn">Copy</button>
550
+ <button class="insert-code-btn">Insert</button>
551
+ <pre id='devilentCodePre'><xmp>${code}</xmp></pre>
552
+ </div>
553
+ `;
554
+ });
555
+
556
+ html = html.replace(inlineCodePattern, "<code>$1</code>");
557
+
558
+ targetElement.innerHTML = html;
559
+
560
+ const buttons = targetElement.querySelectorAll(".code-block button");
561
+ buttons.forEach((btn) => {
562
+ btn.addEventListener("pointerdown", (e) => {
563
+ e.preventDefault();
564
+
565
+ const code = btn.parentElement.querySelector("pre").innerText;
566
+ if (btn.classList.contains("copy-code-btn")) {
567
+ utils.copyToClipboard(code);
568
+ } else if (btn.classList.contains("insert-code-btn")) {
569
+ console.log("insert button down");
570
+ utils.writeText(document.activeElement, code, "", "");
571
+ }
572
+ });
573
+ });
574
+
575
+ const copyButton = document.createElement("button");
576
+ copyButton.innerText = "Copy";
577
+ copyButton.addEventListener("pointerdown", (e) => {
578
+ e.preventDefault();
579
+ e.stopPropagation();
580
+
581
+ utils.copyToClipboard(mdString);
582
+ });
583
+
584
+ const insertButton = document.createElement("button");
585
+ insertButton.innerText = "Insert";
586
+ insertButton.addEventListener("pointerdown", (e) => {
587
+ e.preventDefault();
588
+ e.stopPropagation();
589
+
590
+ utils.writeText(document.activeElement, mdString, "", "");
591
+ });
592
+ copyButton.classList.add("copy-btn");
593
+ insertButton.classList.add("insert-btn");
594
+
595
+ let editButton = document.createElement("button");
596
+ editButton.innerText = "Edit";
597
+ editButton.addEventListener("pointerdown", (e) => {
598
+ e.preventDefault();
599
+ if (targetElement.isEditableElement) {
600
+ targetElement.setAttribute('contenteditable', 'false');
601
+ }
602
+ else {
603
+ targetElement.setAttribute('contenteditable', 'true');
604
+ }
605
+ });
606
+ editButton.classList.add("copy-btn");
607
+
608
+ const closeButton = document.createElement("button");
609
+ closeButton.innerText = "Close";
610
+ closeButton.addEventListener("pointerdown", (e) => {
611
+ e.preventDefault();
612
+ targetElement.remove();
613
+ });
614
+ closeButton.classList.add("copy-btn");
615
+
616
+ let buttonContainer = document.createElement("div");
617
+ buttonContainer.classList.add("button-container");
618
+
619
+ buttonContainer.appendChild(copyButton);
620
+ buttonContainer.appendChild(insertButton);
621
+ buttonContainer.appendChild(closeButton);
622
+ buttonContainer.appendChild(editButton);
623
+
624
+ const parentElement = targetElement;
625
+
626
+ buttonContainer.style.width = "100%";
627
+ buttonContainer.style.backgroundColor = parentElement.style.backgroundColor;
628
+ buttonContainer.style.color =
629
+ "lighten(" + buttonContainer.style.backgroundColor + ", 20%)";
630
+
631
+ targetElement.prepend(buttonContainer);
632
+ utils.dragElement(buttonContainer, targetElement);
633
+
634
+ targetElement.classList.add("markdown-container");
635
+ let markdownContainers =
636
+ document.getElementsByClassName("markdown-container");
637
+
638
+ for (let i = 0; i < markdownContainers.length; i++) {
639
+ markdownContainers[i].style.fontFamily = "Arial, sans-serif";
640
+ markdownContainers[i].style.lineHeight = "1.6";
641
+ markdownContainers[i].style.maxWidth = "800px";
642
+ markdownContainers[i].style.margin = "0 auto";
643
+ markdownContainers[i].style.padding = "0px";
644
+ markdownContainers[i].style.backgroundColor = "azure";
645
+ markdownContainers[i].style.overflow = "auto";
646
+ markdownContainers[i].style.boxShadow = "0px 0px 50px rgba(0, 0, 0, 0.4)";
647
+ }
648
+
649
+ let codeBlocks = document.getElementsByClassName("code-block");
650
+ for (let i = 0; i < codeBlocks.length; i++) {
651
+ codeBlocks[i].style.position = "relative";
652
+ }
653
+
654
+ let insertCodeBtns = document.getElementsByClassName("insert-code-btn");
655
+ let codecopyBtns = document.getElementsByClassName("copy-code-btn");
656
+
657
+ for (let i = 0; i < codecopyBtns.length; i++) {
658
+ codecopyBtns[i].style.top = "0";
659
+ codecopyBtns[i].style.position = "absolute";
660
+ codecopyBtns[i].style.right = "0";
661
+ codecopyBtns[i].style.margin = "5px";
662
+ codecopyBtns[i].style.padding = "2px 5px";
663
+ codecopyBtns[i].style.fontSize = "12px";
664
+ codecopyBtns[i].style.border = "none";
665
+ codecopyBtns[i].style.borderRadius = "3px";
666
+ codecopyBtns[i].style.backgroundColor = "#007bff";
667
+ codecopyBtns[i].style.color = "white";
668
+ codecopyBtns[i].style.cursor = "pointer";
669
+ }
670
+
671
+ for (let i = 0; i < insertCodeBtns.length; i++) {
672
+ insertCodeBtns[i].style.position = "absolute";
673
+ insertCodeBtns[i].style.top = "0";
674
+ insertCodeBtns[i].style.right = "50px";
675
+ insertCodeBtns[i].style.margin = "5px";
676
+ insertCodeBtns[i].style.padding = "2px 5px";
677
+ insertCodeBtns[i].style.fontSize = "12px";
678
+ insertCodeBtns[i].style.border = "none";
679
+ insertCodeBtns[i].style.borderRadius = "3px";
680
+ insertCodeBtns[i].style.backgroundColor = "#007bff";
681
+ insertCodeBtns[i].style.color = "white";
682
+ insertCodeBtns[i].style.cursor = "pointer";
683
+ }
684
+
685
+ let copyBtns = document.getElementsByClassName("copy-btn");
686
+ let insertBtns = document.getElementsByClassName("insert-btn");
687
+
688
+ for (let i = 0; i < copyBtns.length; i++) {
689
+ copyBtns[i].style.margin = "5px";
690
+ copyBtns[i].style.padding = "2px 5px";
691
+ copyBtns[i].style.fontSize = "12px";
692
+ copyBtns[i].style.border = "none";
693
+ copyBtns[i].style.borderRadius = "3px";
694
+ copyBtns[i].style.backgroundColor = "#007bff";
695
+ copyBtns[i].style.color = "white";
696
+ copyBtns[i].style.cursor = "pointer";
697
+ }
698
+
699
+ for (let i = 0; i < insertBtns.length; i++) {
700
+ insertBtns[i].style.margin = "5px";
701
+ insertBtns[i].style.padding = "2px 5px";
702
+ insertBtns[i].style.fontSize = "12px";
703
+ insertBtns[i].style.border = "none";
704
+ insertBtns[i].style.borderRadius = "3px";
705
+ insertBtns[i].style.backgroundColor = "#007bff";
706
+ insertBtns[i].style.color = "white";
707
+ insertBtns[i].style.cursor = "pointer";
708
+ }
709
+
710
+ let pres = targetElement.getElementsByTagName("pre");
711
+ for (let i = 0; i < pres.length; i++) {
712
+ pres[i].style.backgroundColor = "#f7f7f7";
713
+ pres[i].style.borderRadius = "5px";
714
+ pres[i].style.padding = "10px";
715
+ pres[i].style.whiteSpace = "pre-wrap";
716
+ pres[i].style.wordBreak = "break-all";
717
+ }
718
+
719
+ let codes = targetElement.getElementsByTagName("code");
720
+ for (let i = 0; i < codes.length; i++) {
721
+ codes[i].style.backgroundColor = "#f1f1f1";
722
+ codes[i].style.borderRadius = "3px";
723
+ codes[i].style.padding = "2px 5px";
724
+ codes[i].style.fontFamily = "'Courier New', Courier, monospace";
725
+ }
726
+ },
727
+ displayMarkdown(mdString) {
728
+ let containerID = "ai_input_md_dispalyer";
729
+
730
+ let container = document.getElementById(containerID);
731
+ if (container === null) {
732
+ container =
733
+ document.getElementById(containerID) || document.createElement("div");
734
+ container.id = containerID;
735
+ document.body.appendChild(container);
736
+
737
+ container.style.zIndex = "100000";
738
+ container.style.position = "fixed";
739
+ container.style.top = "85vh";
740
+ container.style.left = "0";
741
+ container.style.height = "40vh";
742
+ container.style.width = "80vw";
743
+ container.style.backgroundColor = "rgba{20,20,50,1}";
744
+ }
745
+
746
+ utils.renderMarkdown(mdString, container);
747
+ let div = document.createElement('div');
748
+ div.style.height = '3000px';
749
+ container.appendChild(div)
750
+ },
751
+ moveElementNearMouse: (mElem, targetElement, alwayInWindow = true, event) => {
752
+ let x = event.clientX + 200;
753
+ let y = event.clientY - 20;
754
+ console.log('moveElementNearMouse: ', x, y);
755
+ if (alwayInWindow) {
756
+ x = Math.abs(x);
757
+ y = Math.abs(y);
758
+ x = Math.min(x, window.innerWidth - mElem.clientWidth);
759
+ y = Math.min(y, window.innerHeight - 10 - mElem.clientHeight);
760
+ }
761
+ mElem.style.left = x + "px";
762
+ mElem.style.top = y + "px";
763
+ },
764
+ addEventListenerForActualClick(element, handler) {
765
+ let initialX, initialY;
766
+ let startTime;
767
+
768
+ element.addEventListener("pointerdown", (event) => {
769
+ initialX = event.clientX;
770
+ initialY = event.clientY;
771
+ startTime = Date.now();
772
+ });
773
+ element.addEventListener("pointerup", (event) => {
774
+ const deltaX = Math.abs(event.clientX - initialX);
775
+ const deltaY = Math.abs(event.clientY - initialY);
776
+
777
+ if (deltaX <= 10 && deltaY <= 10 && Date.now() - startTime < 1000) {
778
+ console.log(
779
+ "Minimal mouse movement (< 10px in either direction) and short duration click detected."
780
+ );
781
+ handler(event);
782
+ }
783
+ });
784
+ },
785
+ sendKeyEvent(element, key, modifiers) {
786
+ const eventDown = new KeyboardEvent("keydown", {
787
+ key: key,
788
+ code: key.toUpperCase(),
789
+ bubbles: true,
790
+ cancelable: true,
791
+ ...modifiers,
792
+ });
793
+ const eventUp = new KeyboardEvent("keyup", {
794
+ key: key,
795
+ code: key.toUpperCase(),
796
+ bubbles: true,
797
+ cancelable: true,
798
+ ...modifiers,
799
+ });
800
+
801
+ element.dispatchEvent(eventDown);
802
+ element.dispatchEvent(eventUp);
803
+ },
804
+ blobToBase64: function blobToBase64(blob) {
805
+ if (!(blob instanceof Blob)) {
806
+ throw new TypeError("Parameter must be a Blob object.");
807
+ }
808
+
809
+ if (!blob.size) {
810
+ throw new Error("Empty Blob provided.");
811
+ }
812
+
813
+ return new Promise((resolve, reject) => {
814
+ const reader = new FileReader();
815
+ reader.onload = () => resolve(reader.result.split(",")[1]);
816
+ reader.onerror = reject;
817
+ reader.readAsDataURL(blob);
818
+ });
819
+ },
820
+
821
+ playAudioBlob: function playAudioBlob(blob, autoPlay = true) {
822
+ const audio = new Audio();
823
+ audio.src = URL.createObjectURL(blob);
824
+ audio.controls = true;
825
+ document.body.prepend(audio);
826
+
827
+ if (autoPlay === true) {
828
+ audio
829
+ .play()
830
+ .then(() => {
831
+ console.log("Audio played successfully!");
832
+ })
833
+ .catch((error) => {
834
+ console.error("Error playing audio:", error);
835
+ });
836
+ }
837
+ },
838
+
839
+
840
+ async AIComplete(userText, option = {
841
+ url: '/openai/v1/chat/completions',
842
+ model: 'llama3-8b-8192',
843
+ max_tokens: 8000,
844
+ }) {
845
+ console.log("AIcomplete(): ", userText);
846
+ if (utils.checkValidString(userText) === false) {
847
+ return;
848
+ }
849
+ let response = await fetch(
850
+ option.url,
851
+ {
852
+ headers: {
853
+ accept: "*/*",
854
+ "content-type": "application/json",
855
+ },
856
+ body: JSON.stringify({
857
+ messages: [{
858
+ "role": "system",
859
+ "content": "be concise and clear."
860
+ },
861
+ { role: "user", content: userText }],
862
+ model: option.model,
863
+ tools: [],
864
+ temperature: 0.7,
865
+ top_p: 0.8,
866
+ max_tokens: option.max_tokens || 1000000,
867
+ }),
868
+ method: "POST",
869
+ }
870
+ );
871
+ response = await response.json();
872
+ let responseMessage = response?.choices[0]?.message?.content;
873
+
874
+ console.log("[leptonComplete(text)]", responseMessage);
875
+ let mdContainer = document.createElement("div");
876
+ document.body.appendChild(mdContainer);
877
+ utils.displayMarkdown(userText + "\n\n" + option.model + '\n' + responseMessage);
878
+ return response;
879
+
880
+ }
881
+ };
882
+
883
+ // ... (Other external API functions: sendAudioToApi, whisperjaxws,
884
+ // sendAudioToCFWhisperApi, sendAudioToHFWhisperApi) ...
885
+
886
+ export { utils };
public/ainote/view.js ADDED
@@ -0,0 +1,280 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { appModel } from './model.js';
2
+ import {utils} from './utils.js';
3
+ import {controller } from './controller.js'
4
+
5
+ const view = {
6
+ elem: {
7
+ currentInputElem: null,
8
+ voiceButton: null,
9
+ },
10
+ recorder: null,
11
+
12
+ async init() {
13
+ this.recorder = new utils.Recorder();
14
+ this.elem.voiceButton = this.createButton();
15
+
16
+
17
+ appModel.keepButtonAliveInterval = setInterval(() => {
18
+ const whisperButton = document.getElementById("whisper_voice_button");
19
+
20
+ if (!whisperButton) {
21
+ this.createButton();
22
+ }
23
+ }, 2000);
24
+ },
25
+
26
+ createButton() {
27
+ if (document.getElementById("whisper_voice_button")) {
28
+ return;
29
+ }
30
+
31
+ let button = document.createElement("button");
32
+ this.elem.voiceButton = button;
33
+
34
+ button.id = appModel.voice_button_id;
35
+ button.innerText = "◯";
36
+ button.type = "button";
37
+ button.classList.add("speech-to-text-button");
38
+ button.style.top = window.innerHeight - 100 + "px";
39
+ button.style.left = "0";
40
+ button.style.width = "40px";
41
+ button.style.height = button.style.width;
42
+ button.style.fontSize = "30px";
43
+ button.style.padding = "0";
44
+ button.style.border = "0px";
45
+ button.style.color = "blue";
46
+ button.style.background = "transparent";
47
+ button.style.zIndex = 1000000;
48
+ button.style.position = "fixed";
49
+ button.style.borderRadius = "50%";
50
+ button.style.userSelect = "none";
51
+ button.style.touchAction = "none";
52
+
53
+ document.body.appendChild(button);
54
+
55
+ utils.dragElement(button, button);
56
+
57
+ button.addEventListener("click", () => {
58
+ console.log("createButton():clicked");
59
+ });
60
+
61
+ button.addEventListener("pointerdown", async (event) => {
62
+ event.preventDefault();
63
+ controller.handleRecording(event);
64
+ });
65
+
66
+ button.addEventListener("pointerup", () => {
67
+ console.log("createButton pointerup");
68
+ controller.stopRecording();
69
+ });
70
+
71
+ utils.addEventListenerForActualClick(button, (event) => {
72
+ let clientX = event?.clientX;
73
+ let clientY = event?.clientY;
74
+ this.createMenu(clientX + 50, clientY + 50);
75
+ });
76
+
77
+ utils.addEventListenerForActualClick(document.body, (event) => {
78
+ if (view.recorder.isRecording) return;
79
+
80
+ if (event.target.tagName === "INPUT" &&
81
+ appModel.supportedInputTypeList.includes(event.target.type)) {
82
+ utils.moveElementNearMouse(button, event.target, true, event);
83
+ } else if (event.target.tagName === "TEXTAREA" ||
84
+ utils.isEditableElement(event.target)) {
85
+ utils.moveElementNearMouse(button, event.target, true, event);
86
+ }
87
+ });
88
+
89
+ window.addEventListener("resize", () => {
90
+ let buttonPos = button.getBoundingClientRect();
91
+ if (buttonPos.top > window.innerHeight - buttonPos.height) {
92
+ button.style.top = window.innerHeight - buttonPos.height + "px";
93
+ }
94
+ });
95
+
96
+ return button;
97
+ },
98
+
99
+ createMenu(x, y, id = "webai_input_menu") {
100
+ const windowWidth = window.innerWidth;
101
+ const windowHeight = window.innerHeight;
102
+
103
+ let menuContainer = document.getElementById(id);
104
+ if (menuContainer) {
105
+ menuContainer.style.left =
106
+ Math.min(x, windowWidth - menuContainer.offsetWidth * 0.5) + "px";
107
+ menuContainer.style.top =
108
+ Math.min(y, windowHeight - menuContainer.offsetHeight) - 100 + "px";
109
+ menuContainer.style.zIndex = "99999";
110
+
111
+ return;
112
+ }
113
+
114
+ menuContainer = document.createElement("div");
115
+ document.body.appendChild(menuContainer);
116
+
117
+ menuContainer.id = id;
118
+ menuContainer.style.zIndex = "99999";
119
+ menuContainer.style.position = "fixed";
120
+ menuContainer.style.backgroundColor = "white";
121
+ menuContainer.style.boxShadow = "0 2px 5px rgba(0, 0, 0, 0.1)";
122
+ menuContainer.style.borderRadius = "4px";
123
+ menuContainer.style.display = "flex";
124
+ menuContainer.style.flexDirection = "column";
125
+ menuContainer.style.alignItems = "flex-start";
126
+ menuContainer.style.padding = "10px";
127
+ menuContainer.style.left =
128
+ Math.min(x, windowWidth - menuContainer.offsetWidth) + "px";
129
+ menuContainer.style.top =
130
+ Math.min(y, windowHeight - menuContainer.offsetHeight) - 100 + "px";
131
+ menuContainer.style.opacity = '0.7'
132
+ utils.disableSelect(menuContainer);
133
+
134
+ menuContainer.style.maxHeight = "60vh";
135
+ menuContainer.style.overflowY = "auto";
136
+
137
+ menuContainer.style.cssText += `
138
+ scrollbar-width: thin;
139
+ scrollbar-color: rgba(0, 0, 0, 0.3) transparent;
140
+ `;
141
+ menuContainer.style.msOverflowStyle = "none";
142
+
143
+ function createMenuItem(textContent, handler) {
144
+ const menuItem = document.createElement("button");
145
+ utils.makeButtonFeedback(menuItem);
146
+ menuContainer.appendChild(menuItem);
147
+ menuItem.style.cssText = `
148
+ background-color: white;
149
+ border: none;
150
+ font-size: 14px;
151
+ width: 80px;
152
+ text-align: left;
153
+ cursor: pointer;
154
+ margin-bottom: 0;
155
+ margin-top: 0;
156
+ padding: 5px 10px;
157
+ color: #333;
158
+ transition: background-color 0.3s ease;
159
+ display: flex;
160
+ align-items: center;
161
+ justify-content: flex-start;
162
+ border-radius: 4px;
163
+ `;
164
+
165
+ menuItem.textContent = textContent;
166
+ menuItem.addEventListener("pointerdown", (event) => {
167
+ event.preventDefault();
168
+ if (handler) {
169
+ handler();
170
+ }
171
+ });
172
+
173
+ return menuItem;
174
+ }
175
+
176
+ const removeMenuItem = createMenuItem("Remove Menu");
177
+ removeMenuItem.addEventListener("pointerdown", () =>
178
+ menuContainer.remove()
179
+ );
180
+ menuContainer.appendChild(removeMenuItem);
181
+
182
+ const closeButton = createMenuItem("Close");
183
+ closeButton.addEventListener("pointerdown", () => {
184
+ if (confirm("remove the AI tool now?")) {
185
+ clearInterval(appModel.keepButtonAliveInterval);
186
+ view.elem.voiceButton.remove();
187
+ menuContainer.remove();
188
+ }
189
+ });
190
+ menuContainer.appendChild(closeButton);
191
+
192
+ createMenuItem("TTS", () => {
193
+ let currentLineString = utils.getCurrentLineString(document.activeElement);
194
+ let selectText = window.getSelection().toString();
195
+ let ttstext=selectText.length >= 1 ? selectText : currentLineString;
196
+ utils.tts(
197
+ ttstext,
198
+ "de-DE-SeraphinaMultilingualNeural"
199
+ );
200
+ });
201
+
202
+ const startMenuItem = createMenuItem("Start");
203
+ menuContainer.appendChild(startMenuItem);
204
+ startMenuItem.addEventListener("pointerdown", () => {
205
+ view.elem.voiceButton.style.top = '0px';
206
+ view.elem.voiceButton.style.left = window.innerWidth * 0.8 + 'px';
207
+ appModel.isRecording = true;
208
+ controller.startRecordingWithSilenceDetection();
209
+ });
210
+
211
+ let copyButton = createMenuItem("Copy");
212
+ menuContainer.appendChild(copyButton);
213
+ copyButton.addEventListener("pointerdown", (e) => {
214
+ e.preventDefault();
215
+ if(window.getSelection().toString().length > 0){
216
+ document.execCommand("copy") ;
217
+ }
218
+ else{
219
+ utils.copyToClipboard(utils.getCurrentLineString(document.activeElement));
220
+
221
+ }
222
+ utils.showToast("Copied to clipboard");
223
+ });
224
+
225
+ createMenuItem("Cut", () => {
226
+
227
+ document.execCommand("copy");
228
+ document.execCommand("delete");
229
+ utils.showToast("Cut to clipboard");
230
+ });
231
+
232
+ let pasteButton = createMenuItem("Paste");
233
+ menuContainer.appendChild(pasteButton);
234
+ pasteButton.addEventListener("pointerdown", async (e) => {
235
+ e.preventDefault();
236
+ try {
237
+ const text = await navigator.clipboard.readText();
238
+ utils.writeText(document.activeElement, text);
239
+ console.log("Clipboard text:", text);
240
+ } catch (err) {
241
+ console.error("Clipboard access denied:", err);
242
+ }
243
+ });
244
+
245
+ let enterButton = createMenuItem("Enter");
246
+ menuContainer.appendChild(enterButton);
247
+ enterButton.addEventListener("pointerdown", (e) => {
248
+ e.preventDefault();
249
+ document.execCommand("insertText", false, "\n");
250
+ });
251
+
252
+ createMenuItem("Correct", () => {
253
+ let correctPrompt =
254
+ 'correct mistakes of the text, put the corrected text in the codeblock:\n ';
255
+ controller.chat(correctPrompt);
256
+ });
257
+
258
+ let askButton = createMenuItem("Ask");
259
+ askButton.style.touchAction='none';
260
+ menuContainer.appendChild(askButton);
261
+ askButton.addEventListener("pointerdown", (e) => {
262
+ e.preventDefault();
263
+ controller.ask();
264
+
265
+ document.body.addEventListener("pointerup", () => {
266
+ controller.stopRecording();
267
+ }, { once: true });
268
+ });
269
+
270
+ menuContainer.style.left =
271
+ Math.min(x, windowWidth - menuContainer.offsetWidth * 0.5) + "px";
272
+ menuContainer.style.top =
273
+ Math.min(y, windowHeight - menuContainer.offsetHeight) - 100 + "px";
274
+ document.body.appendChild(menuContainer);
275
+ },
276
+
277
+
278
+ };
279
+
280
+ export { view };
public/ainote/vite.config.js ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // // vite.config.js
2
+ // export default {
3
+ // // config options
4
+ // build: {
5
+ // rollupOptions: {
6
+ // output: {
7
+ // entryFileNames: 'index.js'
8
+ // }
9
+ // }
10
+ // }
11
+
12
+ // }
public/bear58.png ADDED
public/build.sh ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ echo '(() => {' >./dist/index.js
2
+
3
+ cat index.js >>./dist/index.js
4
+
5
+ echo '})();' >> ./dist/index.js
6
+
7
+ cp esltool.js dist/
public/controller.js ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import { appModel } from './model.js';
3
+ import { utils } from './utils.js';
4
+ import { view } from './view.js';
5
+
6
+ const controller = {
7
+
8
+ async handleRecording(event) {
9
+ let startTime = Date.now();
10
+ let audioblob = await view.recorder.startRecording(view.elem.voiceButton);
11
+
12
+ if (Date.now() - startTime < appModel.minimalRecordTime) {
13
+ utils.showToast("time too short, this will not transcribe");
14
+ return;
15
+ }
16
+
17
+ let transcribe = await utils.stt(audioblob);
18
+ if (!transcribe.text) {
19
+ console.log("transcribe failed, try alternative way");
20
+ transcribe = await whisperjaxws(audioblob); // Replace with your alternative transcription
21
+ }
22
+ utils.writeText(document.activeElement, transcribe.text);
23
+ },
24
+
25
+ async startRecordingWithSilenceDetection(event) {
26
+ let startTime = Date.now();
27
+ let finalAudioblob = await view.recorder.startRecordingWithSilenceDetection(
28
+ view.elem.voiceButton,
29
+ (audioBlob) => {
30
+ utils.stt(audioBlob).then((transcribe) => {
31
+ if (transcribe === false) {
32
+ console.log("transcribe failed, try alternative way");
33
+ whisperjaxws(audioBlob).then((transcribe) => { // Replace with your alternative transcription
34
+ utils.writeText(document.activeElement, transcribe);
35
+ });
36
+ } else {
37
+ utils.writeText(document.activeElement, transcribe.text);
38
+ }
39
+ });
40
+ }
41
+ );
42
+
43
+ if (Date.now() - startTime < appModel.minimalRecordTime) {
44
+ utils.showToast("time too short, this will not transcribe");
45
+ return;
46
+ }
47
+
48
+ let transcribe = await utils.sendAudioToLeptonWhisperApi(finalAudioblob);
49
+ if (!transcribe) {
50
+ console.log("transcribe failed, try alternative way");
51
+ transcribe = await whisperjaxws(finalAudioblob); // Replace with your alternative transcription
52
+ }
53
+ utils.writeText(document.activeElement, transcribe.text);
54
+ },
55
+
56
+ stopRecording(safeStop = true) {
57
+ appModel.isRecording = false;
58
+ if (safeStop) {
59
+ setTimeout(() => {
60
+ console.log("safeStop");
61
+ view.recorder.stopRecording();
62
+ }, 500);
63
+ } else {
64
+ view.recorder.stopRecording();
65
+ }
66
+ },
67
+
68
+ async chat(message) {
69
+ let selectText = window.getSelection().toString();
70
+ let currentLineString = utils.getCurrentLineString(document.activeElement);
71
+
72
+ prompt=`${message} ${selectText.length >= 1 ? selectText : currentLineString} `
73
+
74
+ let userText = prompt;
75
+
76
+ if (!utils.checkValidString(userText)) {
77
+ console.log("chat(): invalid userText:", userText);
78
+ return;
79
+ }
80
+
81
+ utils.displayMarkdown(userText + " \n please wait");
82
+ utils.AIComplete(userText,appModel.llm_model_info); // Replace with your LLM API call
83
+ },
84
+
85
+ async ask() {
86
+ if (appModel.isRecording) {
87
+ utils.AIComplete(utils.getSelectionText(),appModel.llm_model_info);
88
+ return;
89
+ }
90
+
91
+ let startTime = Date.now();
92
+ let audioblob = await view.recorder.startRecording(view.elem.voiceButton);
93
+
94
+ if (Date.now() - startTime < appModel.minimalRecordTime) {
95
+ utils.showToast("time too short, this will not transcribe");
96
+ console.log("ask():", utils.getSelectionText());
97
+ utils.AIComplete(utils.getSelectionText(),appModel.llm_model_info);
98
+
99
+ return;
100
+ }
101
+
102
+ let transcribe = await utils.stt(audioblob);
103
+ if (!transcribe) {
104
+ console.log("transcribe failed, try alternative way");
105
+ transcribe = await whisperjaxws(audioblob); // Replace with your alternative transcription
106
+ }
107
+ let selectionString = window.getSelection().toString();
108
+ let userText = utils.checkValidString(selectionString)
109
+ ? `"${selectionString}" ${transcribe.text}`
110
+ : transcribe.text;
111
+
112
+ if (!utils.checkValidString(userText)) {
113
+ console.log("ask(): invalid userText:", userText);
114
+ return;
115
+ }
116
+
117
+ utils.displayMarkdown(userText + " please wait");
118
+ utils.AIComplete(userText); // Replace with your LLM API call
119
+ },
120
+ };
121
+
122
+ // ... (whisperjaxws function or other external APIs) ...
123
+
124
+ export { controller };
public/esltool.js ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { utils } from "./utils.js";
2
+ import { view } from "./view.js";
3
+
4
+
5
+ let config = {
6
+ first_language: 'にほんご',
7
+ second_language: 'English'
8
+ }
9
+
10
+
11
+
12
+ // Create toolbar element
13
+ const toolbar = document.createElement("div");
14
+ toolbar.id = "esl-toolbar";
15
+ toolbar.style.position = "fixed"; // Make it stick to the top
16
+ toolbar.style.top = "0"; // Position at the very top
17
+ toolbar.style.left = "0"; // Position at the leftmost side
18
+ toolbar.style.width = "100%"; // Make it span the entire width
19
+ toolbar.style.backgroundColor = "lightgray"; // Example background color
20
+ toolbar.style.padding = "10px"; // Add some padding
21
+
22
+ // Create buttons
23
+
24
+ const askButton = document.createElement("button");
25
+ askButton.id = "ask-btn";
26
+ askButton.textContent = "Ask";
27
+
28
+
29
+
30
+ const correctBtn = document.createElement("button");
31
+ correctBtn.id = "correct-btn";
32
+ correctBtn.textContent = "Correct";
33
+
34
+ const translateBtn = document.createElement("button");
35
+ translateBtn.id = "translate-btn";
36
+ translateBtn.textContent = "Translate";
37
+
38
+ const explainBtn = document.createElement("button");
39
+ explainBtn.id = "explain-btn";
40
+ explainBtn.textContent = "Explain";
41
+
42
+ const defineBtn = document.createElement("button");
43
+ defineBtn.id = "define-btn";
44
+ defineBtn.textContent = "Define";
45
+
46
+
47
+ const removeButton = document.createElement("button");
48
+ removeButton.id = "remove-btn";
49
+ removeButton.textContent = "Hide";
50
+
51
+ // Append buttons to toolbar
52
+ toolbar.appendChild(askButton);
53
+ toolbar.appendChild(correctBtn);
54
+ toolbar.appendChild(translateBtn);
55
+ toolbar.appendChild(explainBtn);
56
+ toolbar.appendChild(defineBtn);
57
+ toolbar.appendChild(removeButton);
58
+
59
+
60
+ // Create content area
61
+ const contentArea = document.createElement("div");
62
+ contentArea.id = "content";
63
+ contentArea.contentEditable = true; // Allow user to select text
64
+
65
+ // Append toolbar and content area to the body
66
+ document.body.appendChild(toolbar);
67
+ document.body.appendChild(contentArea);
68
+
69
+ // Function to get selected text
70
+ function getSelectedText() {
71
+ return window.getSelection().toString();
72
+ }
73
+
74
+ // Implement functionalities for each button (same as before)
75
+
76
+ function ask(prompt) {
77
+
78
+ let currentLineString = utils.getCurrentLineString(document.activeElement);
79
+ let selectText = window.getSelection().toString();
80
+ prompt=`${prompt} **${selectText.length >= 1 ? selectText : currentLineString}** `
81
+ utils.displayMarkdown(prompt+'...');
82
+ utils.AIComplete(prompt,{
83
+ url: '/openai/v1/chat/completions',
84
+ model: 'llama3-8b-8192',
85
+ max_tokens:8000,
86
+ });
87
+ }
88
+
89
+ askButton.addEventListener("click", () => {
90
+ ask(' ');
91
+
92
+ });
93
+
94
+
95
+ // Correct Button:
96
+ correctBtn.addEventListener("click", () => {
97
+ ask('correct mistakes of the text: \n');
98
+ });
99
+
100
+ // Translate Button:
101
+ translateBtn.addEventListener("click", () => {
102
+ ask(`translate to ${config.first_language}:\n `);
103
+ });
104
+
105
+ // Explain Button:
106
+ explainBtn.addEventListener("click", () => {
107
+ ask('explain this for english seconds language learner in simple english:\n ');
108
+
109
+ });
110
+
111
+ // Define Button:
112
+ defineBtn.addEventListener("click", () => {
113
+ ask('define the word , first in simple english , and give some usage example:\n ' )
114
+ });
115
+
116
+ removeButton.addEventListener('click', () => toolbar.style.display = 'none')
117
+
118
+ // Style the toolbar
119
+ toolbar.style.position = "fixed";
120
+ toolbar.style.top = "0%";
121
+ toolbar.style.left = "0";
122
+ toolbar.style.width = "wrap-content";
123
+ toolbar.style.backgroundColor = "black"; // Light gray background
124
+ toolbar.style.padding = "5px";
125
+ toolbar.style.boxShadow = "0 2px 4px rgba(0, 0, 0, 0.1)"; // Add a subtle shadow
126
+
127
+ // Style the buttons
128
+ const buttonStyles = {
129
+ backgroundColor: "black", // Green background
130
+ border: "none",
131
+ color: "white",
132
+ padding: "2px",
133
+ textAlign: "center",
134
+ textDecoration: "none",
135
+ display: "inline-block",
136
+ fontSize: "small",
137
+ margin: "2px",
138
+ cursor: "pointer",
139
+ borderRadius: "5px", // Rounded corners
140
+ };
141
+
142
+ // Apply styles to each button
143
+ for (const button of [askButton, correctBtn, translateBtn, explainBtn, defineBtn, removeButton]) {
144
+ Object.assign(button.style, buttonStyles);
145
+ utils.makeButtonFeedback(button);
146
+ }
147
+
148
+
149
+
150
+ setTimeout(() => {
151
+ utils.displayMarkdown(`
152
+ hello, this is note for language learner
153
+ code will display like this:
154
+ \`\`\`
155
+ this code
156
+ \`\`\`
157
+ `)
158
+ view.createMenu(window.innerWidth*0.9, 300);
159
+
160
+ }, 1000);
public/favicon.ico ADDED
public/icon/icons8-microsoft-edge-192.png ADDED
public/icon/icons8-microsoft-edge-512.png ADDED
public/index.html ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <link rel="manifest" href="./manifest.json">
8
+ <link rel="stylesheet" href="./libs/toastui-editor.min.css" />
9
+
10
+ <title>groqnote</title>
11
+ <style>
12
+ body {
13
+ font-family: Arial, sans-serif;
14
+ background-color: #f4f4f4;
15
+ }
16
+
17
+ #testLinkContainer a {
18
+ width: fit-content;
19
+ display: inline-block;
20
+ margin-bottom: 10px;
21
+ color: #333;
22
+ text-decoration: none;
23
+ background-color: #ddd;
24
+ padding: 10px;
25
+ border-radius: 5px;
26
+ }
27
+ #testLinkContainer a:hover {
28
+ background-color: #eee;
29
+ }
30
+ textarea {
31
+ width: 90%;
32
+ height: 40vh;
33
+ margin-bottom: 20px;
34
+ padding: 10px;
35
+ border-radius: 5px;
36
+ border: 1px solid #ccc;
37
+ }
38
+ input {
39
+ display: block;
40
+ margin-bottom: 20px;
41
+ padding: 10px;
42
+ border-radius: 5px;
43
+ border: 1px solid #ccc;
44
+ }
45
+ #editableDiv {
46
+ padding: 20px;
47
+ border: 1px solid #ccc;
48
+ border-radius: 5px;
49
+ background-color: #fff;
50
+ }
51
+ #editableDiv div {
52
+ padding: 10px;
53
+ }
54
+ </style>
55
+ </head>
56
+ <body>
57
+ <div style="height: 30vh;"></div>
58
+ share the note via url:
59
+ <div id="url_div"></div>
60
+ <div id="notebin_editor"></div>
61
+
62
+
63
+ <div style="height: 300vh;"></div>
64
+
65
+
66
+
67
+ <script src="./index.js" type="module"></script>
68
+ <script src="./esltool.js" type="module"></script>
69
+ <script src="./libs/toastui-editor-all.min.js"></script>
70
+ <script type="module" src="./notebin.js"></script>
71
+
72
+ </body>
73
+ </html>
public/index.js ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { view } from './view.js';
2
+
3
+ view.init();
4
+
5
+ // Register service worker
6
+ if ('serviceWorker' in navigator) {
7
+ window.addEventListener('load', () => {
8
+ navigator.serviceWorker.register('service-worker.js')
9
+ .then(registration => {
10
+ console.log('Service Worker registered with scope: ', registration.scope);
11
+ })
12
+ .catch(err => {
13
+ console.log('Service Worker registration failed: ', err);
14
+ });
15
+ });
16
+ }
17
+
18
+
19
+ const button = document.createElement('button');
20
+ button.id = 'clearCacheButton';
21
+ button.textContent = 'v0.2';
22
+
23
+ // Set the button styles
24
+ Object.assign(button.style, {
25
+ position: 'fixed',
26
+ bottom: '0px',
27
+ right: '0px',
28
+ padding: '10px 20px',
29
+ backgroundColor: '#f44336', // Red background
30
+ color: 'white', // White text
31
+ border: 'none',
32
+ borderRadius: '5px',
33
+ cursor: 'pointer',
34
+ boxShadow: '0px 4px 6px rgba(0, 0, 0, 0.1)'
35
+ });
36
+
37
+
38
+ // Add click event to clear cache
39
+ button.addEventListener('click', () => {
40
+ if (window.confirm("updated?")) {
41
+ caches.keys().then(names => {
42
+ for (let name of names)
43
+ caches.delete(name);
44
+ });
45
+ // Get all registered service workers
46
+ navigator.serviceWorker.getRegistrations().then(function (registrations) {
47
+ // Loop through all registrations
48
+ for (let registration of registrations) {
49
+ // Check if the service worker's scope matches the desired scope
50
+ if (registration.scope === '/service-worker.js') {
51
+ // Unregister the service worker
52
+ registration.unregister().then(function () {
53
+ console.log('Service worker unregistered.');
54
+ }).catch(function (error) {
55
+ console.error('Error unregistering service worker:', error);
56
+ });
57
+ break;
58
+ }
59
+ }
60
+ });
61
+
62
+
63
+ alert('updated!');
64
+ }
65
+ });
66
+
67
+ // Append the button to the container
68
+ document.body.appendChild(button);
public/libs/toastui-editor-all.min.js ADDED
The diff for this file is too large to render. See raw diff
 
public/libs/toastui-editor.min.css ADDED
The diff for this file is too large to render. See raw diff
 
public/manifest.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "short_name": "aiinput",
3
+ "name": "aiinput",
4
+ "description": "input use AI ",
5
+ "icons": [
6
+ {
7
+ "src": "./icon/icons8-microsoft-edge-192.png",
8
+ "sizes": "192x192",
9
+ "type": "image/png"
10
+ },
11
+ {
12
+ "src": "./icon/icons8-microsoft-edge-512.png",
13
+ "sizes": "512x512",
14
+ "type": "image/png"
15
+ }
16
+ ],
17
+ "start_url": "./",
18
+ "background_color": "#ffffff",
19
+ "display": "standalone",
20
+ "scope": "/",
21
+ "theme_color": "#ffffff"
22
+ }
public/model.js ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ const appModel = {
3
+ api_url: "",
4
+ api_key: "",
5
+ voice_button_id: "whisper_voice_button",
6
+ transcribeProvider: "lepton_whisper",
7
+ language: "",
8
+ supportedInputTypeList: ["text", "number", "tel", "search", "url", "email"],
9
+ buttonBackgroundColor: "lightblue",
10
+ minimalRecordTime: 2000,
11
+ keepButtonAliveInterval: 0,
12
+ isRecording: false,
13
+ llm_model_info: {
14
+ url: '/openai/v1/chat/completions',
15
+ model: 'llama3-8b-8192',
16
+ max_tokens:8000,
17
+ },
18
+
19
+ zIndex: {
20
+ highest: 999999,
21
+ higher: 99999,
22
+ high: 9999,
23
+ medium: 999
24
+ },
25
+ apiKey: {
26
+ 'flowgpt': '',
27
+
28
+ }
29
+ };
30
+
31
+
32
+ export {appModel}
public/notebin.js ADDED
@@ -0,0 +1,295 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { utils } from "./utils.js";
2
+
3
+ function getCurrentLineString(element) {
4
+ const selection = window.getSelection();
5
+ const range = selection.getRangeAt(0);
6
+ const node = range.startContainer;
7
+ const offset = range.startOffset;
8
+
9
+ // If the selection is inside a text node
10
+ if (node.nodeType === Node.TEXT_NODE) {
11
+ const text = node.textContent;
12
+ const lineStart = text.lastIndexOf('\n', offset) + 1;
13
+ const lineEnd = text.indexOf('\n', offset);
14
+ const line = lineEnd === -1 ? text.slice(lineStart) : text.slice(lineStart, lineEnd);
15
+ return line;
16
+ }
17
+
18
+ // If the selection is inside an element node
19
+ const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT);
20
+ let currentNode, currentLine = '';
21
+
22
+ while (currentNode = walker.nextNode()) {
23
+ const text = currentNode.textContent;
24
+ const lines = text.split('\n');
25
+
26
+ for (let i = 0; i < lines.length; i++) {
27
+ if (range.intersectsNode(currentNode)) {
28
+ currentLine = lines[i];
29
+ break;
30
+ }
31
+ }
32
+
33
+ if (currentLine !== '') {
34
+ break;
35
+ }
36
+ }
37
+
38
+ return currentLine;
39
+ }
40
+
41
+
42
+ let url_div=document.querySelector('#url_div');
43
+ url_div.innerText=window.location.href;
44
+ url_div.addEventListener('click',()=>{
45
+ url_div.scrollIntoView({ behavior: 'smooth' });
46
+ })
47
+
48
+
49
+
50
+
51
+ function createLastButton(cmd, name = cmd) {
52
+ const button = document.createElement('button');
53
+
54
+ button.className = 'toastui-editor-toolbar-icons last';
55
+ button.style.backgroundImage = 'none';
56
+ button.style.margin = '0';
57
+ button.style.fontSize='x-large';
58
+ button.innerHTML = `<b>${name}</b>`;
59
+ button.addEventListener('click', () => {
60
+ editor.exec(cmd);
61
+ });
62
+
63
+ return button;
64
+ }
65
+
66
+ let editorContainer=document.querySelector('#notebin_editor');
67
+ window.tuieditor = window.editor = new toastui.Editor({
68
+ el: document.querySelector('#notebin_editor'),
69
+ previewStyle: 'tab',
70
+ height: window.innerHeight * 0.8 + 'px',
71
+ initialValue: '\n\n\n\n\n\n',
72
+ customHTMLSanitizer: html => html,
73
+ toolbarItems: [
74
+ [{
75
+ el: createLastButton('undo', '⤺'),
76
+ command: 'undo',
77
+ tooltip: 'Undo'
78
+ },
79
+ {
80
+ el: createLastButton('redo', '⤻'),
81
+ command: 'redo',
82
+ tooltip: 'Redo'
83
+ }
84
+ ],
85
+ ['heading'],
86
+ //[ 'bold', 'italic', 'strike'],
87
+ // ['hr', 'quote'],
88
+ // ['ul', 'ol', 'task', 'indent', 'outdent'],
89
+ // ['table', 'image', 'link'],
90
+ ['image'],
91
+ ['code', 'codeblock'],
92
+
93
+ ],
94
+ });
95
+
96
+ setTimeout(() => {
97
+
98
+ tuieditor.focus();
99
+ tuieditor.moveCursorToStart(true);
100
+
101
+ window.tuieditor.mdEditor.el.addEventListener('focus', (event) => {
102
+ // Log the event and the pasted data
103
+ console.log('focus event triggered:', event);
104
+ syncNote();
105
+ });
106
+
107
+
108
+ window.tuieditor.mdEditor.el.addEventListener('keydown', function(event) {
109
+ if (event.key === 'Enter' && event.ctrlKey) {
110
+ // Your code here
111
+ let currentLineString=getCurrentLineString(editorContainer);
112
+ console.log('Ctrl + Enter was pressed:',currentLineString);
113
+ let prompt = ' ';
114
+ let selectText = window.getSelection().toString();
115
+ utils.displayMarkdown(`${prompt} **${selectText.length >= 1 ? selectText : currentLineString}** ...`);
116
+ utils.AIComplete(`${prompt} **${selectText.length >= 1 ? selectText : currentLineString}** `);
117
+ }
118
+ });
119
+
120
+ }, 1000);
121
+
122
+ // editor.insertToolbarItem({ groupIndex: 0, itemIndex: 0 }, {
123
+ // name: 'myItem',
124
+ // tooltip: 'Custom Button',
125
+ // command: 'bold',
126
+ // text: '@',
127
+ // className: 'toastui-editor-toolbar-icons first',
128
+ // style: { backgroundImage: 'none' }
129
+ // });
130
+
131
+
132
+ let editorModel = {
133
+ value: null,
134
+ lastChangeTime: 0,
135
+ noteid: ''
136
+ }
137
+
138
+
139
+ // Create a new custom event
140
+ const editorchange = new CustomEvent('editorchange', {
141
+ detail: {
142
+ // Include any data you want to pass with the event
143
+ message: 'Editor content has changed'
144
+ },
145
+ bubbles: true,
146
+ cancelable: true
147
+ });
148
+
149
+ document.addEventListener('editorchange', ()=>{
150
+ console.log('editorchange');
151
+ editorModel.lastChangeTime=Date.now();
152
+ syncNote();
153
+
154
+ })
155
+
156
+ let setChangeTimeoutid=0;
157
+ document.addEventListener('keydown', ()=>{
158
+ console.log('keydown');
159
+ clearTimeout(setChangeTimeoutid);
160
+ setChangeTimeoutid=setTimeout(() => {
161
+ document.body.dispatchEvent(editorchange)
162
+
163
+ }, 5000);
164
+
165
+ })
166
+
167
+ document.body.addEventListener('paste', (event) => {
168
+ // Log the event and the pasted data
169
+ console.log('Paste event triggered:', event);
170
+ console.log('Pasted data:', event.clipboardData.getData('text'));
171
+ document.body.dispatchEvent(editorchange)
172
+
173
+ });
174
+
175
+ document.body.addEventListener('pointerdown', (event) => {
176
+ // Log the event and the pasted data
177
+ console.log('pointerdown event triggered:', event);
178
+ syncNote();
179
+ });
180
+
181
+
182
+
183
+
184
+
185
+ function getUrlParameter(name) {
186
+ name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
187
+ var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
188
+ var results = regex.exec(location.search);
189
+ return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
190
+ }
191
+
192
+ function setUrlParameter(paramName, paramValue) {
193
+ const url = new URL(window.location.href);
194
+ url.searchParams.set(paramName, paramValue);
195
+ history.pushState({}, "", url);
196
+ }
197
+
198
+ let noteid = getUrlParameter('noteid');
199
+ console.log(noteid);
200
+
201
+
202
+
203
+ async function initEditorModel() {
204
+ editorModel.noteid= getUrlParameter('noteid') || Date.now();
205
+ setUrlParameter('noteid', editorModel.noteid);
206
+ console.log('initEditorModel',editorModel);
207
+ getNote();
208
+
209
+ }
210
+
211
+
212
+ initEditorModel();
213
+
214
+
215
+ setInterval(async () => {
216
+ // saveNote();
217
+ }, 3000)
218
+
219
+
220
+ async function getNote(){
221
+ let res = await fetch(`/kv/get?key=${editorModel.noteid}`);
222
+ res = await res.json();
223
+ console.log('getNote:', res);
224
+ if (res) {
225
+ res=res.value;
226
+ editorModel.value = res.text;
227
+ editorModel.lastChangeTime=res.lastChangeTime || 0;
228
+ tuieditor.setMarkdown(res.text)
229
+ }
230
+ }
231
+
232
+ async function saveNote() {
233
+ let form = new FormData();
234
+ form.append('key', noteid);
235
+ form.append('value', JSON.stringify({
236
+ text: tuieditor.getMarkdown(),
237
+ lastChangeTime: editorModel.lastChangeTime
238
+ }))
239
+
240
+ await fetch('/kv/set',
241
+ {
242
+ method: 'post',
243
+ body: form
244
+ }
245
+ )
246
+ console.log('note saved')
247
+
248
+ }
249
+
250
+
251
+ async function syncNote(){
252
+ try {
253
+ let res = await fetch(`/kv/get?key=${editorModel.noteid}`);
254
+ res = await res.json();
255
+ console.log('getNote in syncNote:', res);
256
+ if (res) {
257
+ res=res.value;
258
+ if(res.lastChangeTime>editorModel.lastChangeTime){
259
+ console.log(res.lastChangeTime,editorModel.lastChangeTime);
260
+ editorModel.value = res.text;
261
+ editorModel.lastChangeTime=res.lastChangeTime || 0;
262
+ tuieditor.setMarkdown(res.text);
263
+
264
+ }
265
+ else{
266
+ saveNote();
267
+ }
268
+ }
269
+
270
+ } catch (error) {
271
+ console.log('syncNote eroor:',error);
272
+ saveNote();
273
+ }
274
+
275
+ }
276
+
277
+
278
+
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+
287
+
288
+
289
+
290
+
291
+
292
+
293
+
294
+
295
+
public/package-lock.json ADDED
@@ -0,0 +1,1102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "nodejs",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 2,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "nodejs",
9
+ "version": "1.0.0",
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "@types/node": "^18.0.6",
13
+ "vite": "^5.2.10"
14
+ }
15
+ },
16
+ "node_modules/@esbuild/aix-ppc64": {
17
+ "version": "0.20.2",
18
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
19
+ "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
20
+ "cpu": [
21
+ "ppc64"
22
+ ],
23
+ "optional": true,
24
+ "os": [
25
+ "aix"
26
+ ],
27
+ "engines": {
28
+ "node": ">=12"
29
+ }
30
+ },
31
+ "node_modules/@esbuild/android-arm": {
32
+ "version": "0.20.2",
33
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
34
+ "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
35
+ "cpu": [
36
+ "arm"
37
+ ],
38
+ "optional": true,
39
+ "os": [
40
+ "android"
41
+ ],
42
+ "engines": {
43
+ "node": ">=12"
44
+ }
45
+ },
46
+ "node_modules/@esbuild/android-arm64": {
47
+ "version": "0.20.2",
48
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
49
+ "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
50
+ "cpu": [
51
+ "arm64"
52
+ ],
53
+ "optional": true,
54
+ "os": [
55
+ "android"
56
+ ],
57
+ "engines": {
58
+ "node": ">=12"
59
+ }
60
+ },
61
+ "node_modules/@esbuild/android-x64": {
62
+ "version": "0.20.2",
63
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
64
+ "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
65
+ "cpu": [
66
+ "x64"
67
+ ],
68
+ "optional": true,
69
+ "os": [
70
+ "android"
71
+ ],
72
+ "engines": {
73
+ "node": ">=12"
74
+ }
75
+ },
76
+ "node_modules/@esbuild/darwin-arm64": {
77
+ "version": "0.20.2",
78
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
79
+ "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
80
+ "cpu": [
81
+ "arm64"
82
+ ],
83
+ "optional": true,
84
+ "os": [
85
+ "darwin"
86
+ ],
87
+ "engines": {
88
+ "node": ">=12"
89
+ }
90
+ },
91
+ "node_modules/@esbuild/darwin-x64": {
92
+ "version": "0.20.2",
93
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
94
+ "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
95
+ "cpu": [
96
+ "x64"
97
+ ],
98
+ "optional": true,
99
+ "os": [
100
+ "darwin"
101
+ ],
102
+ "engines": {
103
+ "node": ">=12"
104
+ }
105
+ },
106
+ "node_modules/@esbuild/freebsd-arm64": {
107
+ "version": "0.20.2",
108
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
109
+ "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
110
+ "cpu": [
111
+ "arm64"
112
+ ],
113
+ "optional": true,
114
+ "os": [
115
+ "freebsd"
116
+ ],
117
+ "engines": {
118
+ "node": ">=12"
119
+ }
120
+ },
121
+ "node_modules/@esbuild/freebsd-x64": {
122
+ "version": "0.20.2",
123
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
124
+ "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
125
+ "cpu": [
126
+ "x64"
127
+ ],
128
+ "optional": true,
129
+ "os": [
130
+ "freebsd"
131
+ ],
132
+ "engines": {
133
+ "node": ">=12"
134
+ }
135
+ },
136
+ "node_modules/@esbuild/linux-arm": {
137
+ "version": "0.20.2",
138
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
139
+ "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
140
+ "cpu": [
141
+ "arm"
142
+ ],
143
+ "optional": true,
144
+ "os": [
145
+ "linux"
146
+ ],
147
+ "engines": {
148
+ "node": ">=12"
149
+ }
150
+ },
151
+ "node_modules/@esbuild/linux-arm64": {
152
+ "version": "0.20.2",
153
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
154
+ "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
155
+ "cpu": [
156
+ "arm64"
157
+ ],
158
+ "optional": true,
159
+ "os": [
160
+ "linux"
161
+ ],
162
+ "engines": {
163
+ "node": ">=12"
164
+ }
165
+ },
166
+ "node_modules/@esbuild/linux-ia32": {
167
+ "version": "0.20.2",
168
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
169
+ "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
170
+ "cpu": [
171
+ "ia32"
172
+ ],
173
+ "optional": true,
174
+ "os": [
175
+ "linux"
176
+ ],
177
+ "engines": {
178
+ "node": ">=12"
179
+ }
180
+ },
181
+ "node_modules/@esbuild/linux-loong64": {
182
+ "version": "0.20.2",
183
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
184
+ "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
185
+ "cpu": [
186
+ "loong64"
187
+ ],
188
+ "optional": true,
189
+ "os": [
190
+ "linux"
191
+ ],
192
+ "engines": {
193
+ "node": ">=12"
194
+ }
195
+ },
196
+ "node_modules/@esbuild/linux-mips64el": {
197
+ "version": "0.20.2",
198
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
199
+ "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
200
+ "cpu": [
201
+ "mips64el"
202
+ ],
203
+ "optional": true,
204
+ "os": [
205
+ "linux"
206
+ ],
207
+ "engines": {
208
+ "node": ">=12"
209
+ }
210
+ },
211
+ "node_modules/@esbuild/linux-ppc64": {
212
+ "version": "0.20.2",
213
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
214
+ "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
215
+ "cpu": [
216
+ "ppc64"
217
+ ],
218
+ "optional": true,
219
+ "os": [
220
+ "linux"
221
+ ],
222
+ "engines": {
223
+ "node": ">=12"
224
+ }
225
+ },
226
+ "node_modules/@esbuild/linux-riscv64": {
227
+ "version": "0.20.2",
228
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
229
+ "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
230
+ "cpu": [
231
+ "riscv64"
232
+ ],
233
+ "optional": true,
234
+ "os": [
235
+ "linux"
236
+ ],
237
+ "engines": {
238
+ "node": ">=12"
239
+ }
240
+ },
241
+ "node_modules/@esbuild/linux-s390x": {
242
+ "version": "0.20.2",
243
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
244
+ "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
245
+ "cpu": [
246
+ "s390x"
247
+ ],
248
+ "optional": true,
249
+ "os": [
250
+ "linux"
251
+ ],
252
+ "engines": {
253
+ "node": ">=12"
254
+ }
255
+ },
256
+ "node_modules/@esbuild/linux-x64": {
257
+ "version": "0.20.2",
258
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
259
+ "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
260
+ "cpu": [
261
+ "x64"
262
+ ],
263
+ "optional": true,
264
+ "os": [
265
+ "linux"
266
+ ],
267
+ "engines": {
268
+ "node": ">=12"
269
+ }
270
+ },
271
+ "node_modules/@esbuild/netbsd-x64": {
272
+ "version": "0.20.2",
273
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
274
+ "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
275
+ "cpu": [
276
+ "x64"
277
+ ],
278
+ "optional": true,
279
+ "os": [
280
+ "netbsd"
281
+ ],
282
+ "engines": {
283
+ "node": ">=12"
284
+ }
285
+ },
286
+ "node_modules/@esbuild/openbsd-x64": {
287
+ "version": "0.20.2",
288
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
289
+ "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
290
+ "cpu": [
291
+ "x64"
292
+ ],
293
+ "optional": true,
294
+ "os": [
295
+ "openbsd"
296
+ ],
297
+ "engines": {
298
+ "node": ">=12"
299
+ }
300
+ },
301
+ "node_modules/@esbuild/sunos-x64": {
302
+ "version": "0.20.2",
303
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
304
+ "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
305
+ "cpu": [
306
+ "x64"
307
+ ],
308
+ "optional": true,
309
+ "os": [
310
+ "sunos"
311
+ ],
312
+ "engines": {
313
+ "node": ">=12"
314
+ }
315
+ },
316
+ "node_modules/@esbuild/win32-arm64": {
317
+ "version": "0.20.2",
318
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
319
+ "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
320
+ "cpu": [
321
+ "arm64"
322
+ ],
323
+ "optional": true,
324
+ "os": [
325
+ "win32"
326
+ ],
327
+ "engines": {
328
+ "node": ">=12"
329
+ }
330
+ },
331
+ "node_modules/@esbuild/win32-ia32": {
332
+ "version": "0.20.2",
333
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
334
+ "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
335
+ "cpu": [
336
+ "ia32"
337
+ ],
338
+ "optional": true,
339
+ "os": [
340
+ "win32"
341
+ ],
342
+ "engines": {
343
+ "node": ">=12"
344
+ }
345
+ },
346
+ "node_modules/@esbuild/win32-x64": {
347
+ "version": "0.20.2",
348
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
349
+ "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
350
+ "cpu": [
351
+ "x64"
352
+ ],
353
+ "optional": true,
354
+ "os": [
355
+ "win32"
356
+ ],
357
+ "engines": {
358
+ "node": ">=12"
359
+ }
360
+ },
361
+ "node_modules/@rollup/rollup-android-arm-eabi": {
362
+ "version": "4.16.4",
363
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz",
364
+ "integrity": "sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==",
365
+ "cpu": [
366
+ "arm"
367
+ ],
368
+ "optional": true,
369
+ "os": [
370
+ "android"
371
+ ]
372
+ },
373
+ "node_modules/@rollup/rollup-android-arm64": {
374
+ "version": "4.16.4",
375
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz",
376
+ "integrity": "sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==",
377
+ "cpu": [
378
+ "arm64"
379
+ ],
380
+ "optional": true,
381
+ "os": [
382
+ "android"
383
+ ]
384
+ },
385
+ "node_modules/@rollup/rollup-darwin-arm64": {
386
+ "version": "4.16.4",
387
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz",
388
+ "integrity": "sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==",
389
+ "cpu": [
390
+ "arm64"
391
+ ],
392
+ "optional": true,
393
+ "os": [
394
+ "darwin"
395
+ ]
396
+ },
397
+ "node_modules/@rollup/rollup-darwin-x64": {
398
+ "version": "4.16.4",
399
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz",
400
+ "integrity": "sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==",
401
+ "cpu": [
402
+ "x64"
403
+ ],
404
+ "optional": true,
405
+ "os": [
406
+ "darwin"
407
+ ]
408
+ },
409
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
410
+ "version": "4.16.4",
411
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz",
412
+ "integrity": "sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==",
413
+ "cpu": [
414
+ "arm"
415
+ ],
416
+ "optional": true,
417
+ "os": [
418
+ "linux"
419
+ ]
420
+ },
421
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
422
+ "version": "4.16.4",
423
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz",
424
+ "integrity": "sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==",
425
+ "cpu": [
426
+ "arm"
427
+ ],
428
+ "optional": true,
429
+ "os": [
430
+ "linux"
431
+ ]
432
+ },
433
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
434
+ "version": "4.16.4",
435
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz",
436
+ "integrity": "sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==",
437
+ "cpu": [
438
+ "arm64"
439
+ ],
440
+ "optional": true,
441
+ "os": [
442
+ "linux"
443
+ ]
444
+ },
445
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
446
+ "version": "4.16.4",
447
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz",
448
+ "integrity": "sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==",
449
+ "cpu": [
450
+ "arm64"
451
+ ],
452
+ "optional": true,
453
+ "os": [
454
+ "linux"
455
+ ]
456
+ },
457
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
458
+ "version": "4.16.4",
459
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz",
460
+ "integrity": "sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==",
461
+ "cpu": [
462
+ "ppc64"
463
+ ],
464
+ "optional": true,
465
+ "os": [
466
+ "linux"
467
+ ]
468
+ },
469
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
470
+ "version": "4.16.4",
471
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz",
472
+ "integrity": "sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==",
473
+ "cpu": [
474
+ "riscv64"
475
+ ],
476
+ "optional": true,
477
+ "os": [
478
+ "linux"
479
+ ]
480
+ },
481
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
482
+ "version": "4.16.4",
483
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz",
484
+ "integrity": "sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==",
485
+ "cpu": [
486
+ "s390x"
487
+ ],
488
+ "optional": true,
489
+ "os": [
490
+ "linux"
491
+ ]
492
+ },
493
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
494
+ "version": "4.16.4",
495
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz",
496
+ "integrity": "sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==",
497
+ "cpu": [
498
+ "x64"
499
+ ],
500
+ "optional": true,
501
+ "os": [
502
+ "linux"
503
+ ]
504
+ },
505
+ "node_modules/@rollup/rollup-linux-x64-musl": {
506
+ "version": "4.16.4",
507
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz",
508
+ "integrity": "sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==",
509
+ "cpu": [
510
+ "x64"
511
+ ],
512
+ "optional": true,
513
+ "os": [
514
+ "linux"
515
+ ]
516
+ },
517
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
518
+ "version": "4.16.4",
519
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz",
520
+ "integrity": "sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==",
521
+ "cpu": [
522
+ "arm64"
523
+ ],
524
+ "optional": true,
525
+ "os": [
526
+ "win32"
527
+ ]
528
+ },
529
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
530
+ "version": "4.16.4",
531
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz",
532
+ "integrity": "sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==",
533
+ "cpu": [
534
+ "ia32"
535
+ ],
536
+ "optional": true,
537
+ "os": [
538
+ "win32"
539
+ ]
540
+ },
541
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
542
+ "version": "4.16.4",
543
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.4.tgz",
544
+ "integrity": "sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==",
545
+ "cpu": [
546
+ "x64"
547
+ ],
548
+ "optional": true,
549
+ "os": [
550
+ "win32"
551
+ ]
552
+ },
553
+ "node_modules/@types/estree": {
554
+ "version": "1.0.5",
555
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
556
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="
557
+ },
558
+ "node_modules/@types/node": {
559
+ "version": "18.0.6",
560
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.6.tgz",
561
+ "integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw=="
562
+ },
563
+ "node_modules/esbuild": {
564
+ "version": "0.20.2",
565
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
566
+ "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
567
+ "hasInstallScript": true,
568
+ "bin": {
569
+ "esbuild": "bin/esbuild"
570
+ },
571
+ "engines": {
572
+ "node": ">=12"
573
+ },
574
+ "optionalDependencies": {
575
+ "@esbuild/aix-ppc64": "0.20.2",
576
+ "@esbuild/android-arm": "0.20.2",
577
+ "@esbuild/android-arm64": "0.20.2",
578
+ "@esbuild/android-x64": "0.20.2",
579
+ "@esbuild/darwin-arm64": "0.20.2",
580
+ "@esbuild/darwin-x64": "0.20.2",
581
+ "@esbuild/freebsd-arm64": "0.20.2",
582
+ "@esbuild/freebsd-x64": "0.20.2",
583
+ "@esbuild/linux-arm": "0.20.2",
584
+ "@esbuild/linux-arm64": "0.20.2",
585
+ "@esbuild/linux-ia32": "0.20.2",
586
+ "@esbuild/linux-loong64": "0.20.2",
587
+ "@esbuild/linux-mips64el": "0.20.2",
588
+ "@esbuild/linux-ppc64": "0.20.2",
589
+ "@esbuild/linux-riscv64": "0.20.2",
590
+ "@esbuild/linux-s390x": "0.20.2",
591
+ "@esbuild/linux-x64": "0.20.2",
592
+ "@esbuild/netbsd-x64": "0.20.2",
593
+ "@esbuild/openbsd-x64": "0.20.2",
594
+ "@esbuild/sunos-x64": "0.20.2",
595
+ "@esbuild/win32-arm64": "0.20.2",
596
+ "@esbuild/win32-ia32": "0.20.2",
597
+ "@esbuild/win32-x64": "0.20.2"
598
+ }
599
+ },
600
+ "node_modules/fsevents": {
601
+ "version": "2.3.3",
602
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
603
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
604
+ "hasInstallScript": true,
605
+ "optional": true,
606
+ "os": [
607
+ "darwin"
608
+ ],
609
+ "engines": {
610
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
611
+ }
612
+ },
613
+ "node_modules/nanoid": {
614
+ "version": "3.3.7",
615
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
616
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
617
+ "funding": [
618
+ {
619
+ "type": "github",
620
+ "url": "https://github.com/sponsors/ai"
621
+ }
622
+ ],
623
+ "bin": {
624
+ "nanoid": "bin/nanoid.cjs"
625
+ },
626
+ "engines": {
627
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
628
+ }
629
+ },
630
+ "node_modules/picocolors": {
631
+ "version": "1.0.0",
632
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
633
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
634
+ },
635
+ "node_modules/postcss": {
636
+ "version": "8.4.38",
637
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
638
+ "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
639
+ "funding": [
640
+ {
641
+ "type": "opencollective",
642
+ "url": "https://opencollective.com/postcss/"
643
+ },
644
+ {
645
+ "type": "tidelift",
646
+ "url": "https://tidelift.com/funding/github/npm/postcss"
647
+ },
648
+ {
649
+ "type": "github",
650
+ "url": "https://github.com/sponsors/ai"
651
+ }
652
+ ],
653
+ "dependencies": {
654
+ "nanoid": "^3.3.7",
655
+ "picocolors": "^1.0.0",
656
+ "source-map-js": "^1.2.0"
657
+ },
658
+ "engines": {
659
+ "node": "^10 || ^12 || >=14"
660
+ }
661
+ },
662
+ "node_modules/rollup": {
663
+ "version": "4.16.4",
664
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz",
665
+ "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==",
666
+ "dependencies": {
667
+ "@types/estree": "1.0.5"
668
+ },
669
+ "bin": {
670
+ "rollup": "dist/bin/rollup"
671
+ },
672
+ "engines": {
673
+ "node": ">=18.0.0",
674
+ "npm": ">=8.0.0"
675
+ },
676
+ "optionalDependencies": {
677
+ "@rollup/rollup-android-arm-eabi": "4.16.4",
678
+ "@rollup/rollup-android-arm64": "4.16.4",
679
+ "@rollup/rollup-darwin-arm64": "4.16.4",
680
+ "@rollup/rollup-darwin-x64": "4.16.4",
681
+ "@rollup/rollup-linux-arm-gnueabihf": "4.16.4",
682
+ "@rollup/rollup-linux-arm-musleabihf": "4.16.4",
683
+ "@rollup/rollup-linux-arm64-gnu": "4.16.4",
684
+ "@rollup/rollup-linux-arm64-musl": "4.16.4",
685
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4",
686
+ "@rollup/rollup-linux-riscv64-gnu": "4.16.4",
687
+ "@rollup/rollup-linux-s390x-gnu": "4.16.4",
688
+ "@rollup/rollup-linux-x64-gnu": "4.16.4",
689
+ "@rollup/rollup-linux-x64-musl": "4.16.4",
690
+ "@rollup/rollup-win32-arm64-msvc": "4.16.4",
691
+ "@rollup/rollup-win32-ia32-msvc": "4.16.4",
692
+ "@rollup/rollup-win32-x64-msvc": "4.16.4",
693
+ "fsevents": "~2.3.2"
694
+ }
695
+ },
696
+ "node_modules/source-map-js": {
697
+ "version": "1.2.0",
698
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
699
+ "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
700
+ "engines": {
701
+ "node": ">=0.10.0"
702
+ }
703
+ },
704
+ "node_modules/vite": {
705
+ "version": "5.2.10",
706
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz",
707
+ "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==",
708
+ "dependencies": {
709
+ "esbuild": "^0.20.1",
710
+ "postcss": "^8.4.38",
711
+ "rollup": "^4.13.0"
712
+ },
713
+ "bin": {
714
+ "vite": "bin/vite.js"
715
+ },
716
+ "engines": {
717
+ "node": "^18.0.0 || >=20.0.0"
718
+ },
719
+ "funding": {
720
+ "url": "https://github.com/vitejs/vite?sponsor=1"
721
+ },
722
+ "optionalDependencies": {
723
+ "fsevents": "~2.3.3"
724
+ },
725
+ "peerDependencies": {
726
+ "@types/node": "^18.0.0 || >=20.0.0",
727
+ "less": "*",
728
+ "lightningcss": "^1.21.0",
729
+ "sass": "*",
730
+ "stylus": "*",
731
+ "sugarss": "*",
732
+ "terser": "^5.4.0"
733
+ },
734
+ "peerDependenciesMeta": {
735
+ "@types/node": {
736
+ "optional": true
737
+ },
738
+ "less": {
739
+ "optional": true
740
+ },
741
+ "lightningcss": {
742
+ "optional": true
743
+ },
744
+ "sass": {
745
+ "optional": true
746
+ },
747
+ "stylus": {
748
+ "optional": true
749
+ },
750
+ "sugarss": {
751
+ "optional": true
752
+ },
753
+ "terser": {
754
+ "optional": true
755
+ }
756
+ }
757
+ }
758
+ },
759
+ "dependencies": {
760
+ "@esbuild/aix-ppc64": {
761
+ "version": "0.20.2",
762
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
763
+ "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
764
+ "optional": true
765
+ },
766
+ "@esbuild/android-arm": {
767
+ "version": "0.20.2",
768
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
769
+ "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
770
+ "optional": true
771
+ },
772
+ "@esbuild/android-arm64": {
773
+ "version": "0.20.2",
774
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
775
+ "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
776
+ "optional": true
777
+ },
778
+ "@esbuild/android-x64": {
779
+ "version": "0.20.2",
780
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
781
+ "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
782
+ "optional": true
783
+ },
784
+ "@esbuild/darwin-arm64": {
785
+ "version": "0.20.2",
786
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
787
+ "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
788
+ "optional": true
789
+ },
790
+ "@esbuild/darwin-x64": {
791
+ "version": "0.20.2",
792
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
793
+ "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
794
+ "optional": true
795
+ },
796
+ "@esbuild/freebsd-arm64": {
797
+ "version": "0.20.2",
798
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
799
+ "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
800
+ "optional": true
801
+ },
802
+ "@esbuild/freebsd-x64": {
803
+ "version": "0.20.2",
804
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
805
+ "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
806
+ "optional": true
807
+ },
808
+ "@esbuild/linux-arm": {
809
+ "version": "0.20.2",
810
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
811
+ "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
812
+ "optional": true
813
+ },
814
+ "@esbuild/linux-arm64": {
815
+ "version": "0.20.2",
816
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
817
+ "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
818
+ "optional": true
819
+ },
820
+ "@esbuild/linux-ia32": {
821
+ "version": "0.20.2",
822
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
823
+ "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
824
+ "optional": true
825
+ },
826
+ "@esbuild/linux-loong64": {
827
+ "version": "0.20.2",
828
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
829
+ "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
830
+ "optional": true
831
+ },
832
+ "@esbuild/linux-mips64el": {
833
+ "version": "0.20.2",
834
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
835
+ "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
836
+ "optional": true
837
+ },
838
+ "@esbuild/linux-ppc64": {
839
+ "version": "0.20.2",
840
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
841
+ "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
842
+ "optional": true
843
+ },
844
+ "@esbuild/linux-riscv64": {
845
+ "version": "0.20.2",
846
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
847
+ "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
848
+ "optional": true
849
+ },
850
+ "@esbuild/linux-s390x": {
851
+ "version": "0.20.2",
852
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
853
+ "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
854
+ "optional": true
855
+ },
856
+ "@esbuild/linux-x64": {
857
+ "version": "0.20.2",
858
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
859
+ "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
860
+ "optional": true
861
+ },
862
+ "@esbuild/netbsd-x64": {
863
+ "version": "0.20.2",
864
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
865
+ "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
866
+ "optional": true
867
+ },
868
+ "@esbuild/openbsd-x64": {
869
+ "version": "0.20.2",
870
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
871
+ "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
872
+ "optional": true
873
+ },
874
+ "@esbuild/sunos-x64": {
875
+ "version": "0.20.2",
876
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
877
+ "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
878
+ "optional": true
879
+ },
880
+ "@esbuild/win32-arm64": {
881
+ "version": "0.20.2",
882
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
883
+ "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
884
+ "optional": true
885
+ },
886
+ "@esbuild/win32-ia32": {
887
+ "version": "0.20.2",
888
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
889
+ "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
890
+ "optional": true
891
+ },
892
+ "@esbuild/win32-x64": {
893
+ "version": "0.20.2",
894
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
895
+ "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
896
+ "optional": true
897
+ },
898
+ "@rollup/rollup-android-arm-eabi": {
899
+ "version": "4.16.4",
900
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz",
901
+ "integrity": "sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==",
902
+ "optional": true
903
+ },
904
+ "@rollup/rollup-android-arm64": {
905
+ "version": "4.16.4",
906
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz",
907
+ "integrity": "sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==",
908
+ "optional": true
909
+ },
910
+ "@rollup/rollup-darwin-arm64": {
911
+ "version": "4.16.4",
912
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz",
913
+ "integrity": "sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==",
914
+ "optional": true
915
+ },
916
+ "@rollup/rollup-darwin-x64": {
917
+ "version": "4.16.4",
918
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz",
919
+ "integrity": "sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==",
920
+ "optional": true
921
+ },
922
+ "@rollup/rollup-linux-arm-gnueabihf": {
923
+ "version": "4.16.4",
924
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz",
925
+ "integrity": "sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==",
926
+ "optional": true
927
+ },
928
+ "@rollup/rollup-linux-arm-musleabihf": {
929
+ "version": "4.16.4",
930
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz",
931
+ "integrity": "sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==",
932
+ "optional": true
933
+ },
934
+ "@rollup/rollup-linux-arm64-gnu": {
935
+ "version": "4.16.4",
936
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz",
937
+ "integrity": "sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==",
938
+ "optional": true
939
+ },
940
+ "@rollup/rollup-linux-arm64-musl": {
941
+ "version": "4.16.4",
942
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz",
943
+ "integrity": "sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==",
944
+ "optional": true
945
+ },
946
+ "@rollup/rollup-linux-powerpc64le-gnu": {
947
+ "version": "4.16.4",
948
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz",
949
+ "integrity": "sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==",
950
+ "optional": true
951
+ },
952
+ "@rollup/rollup-linux-riscv64-gnu": {
953
+ "version": "4.16.4",
954
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz",
955
+ "integrity": "sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==",
956
+ "optional": true
957
+ },
958
+ "@rollup/rollup-linux-s390x-gnu": {
959
+ "version": "4.16.4",
960
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz",
961
+ "integrity": "sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==",
962
+ "optional": true
963
+ },
964
+ "@rollup/rollup-linux-x64-gnu": {
965
+ "version": "4.16.4",
966
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz",
967
+ "integrity": "sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==",
968
+ "optional": true
969
+ },
970
+ "@rollup/rollup-linux-x64-musl": {
971
+ "version": "4.16.4",
972
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz",
973
+ "integrity": "sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==",
974
+ "optional": true
975
+ },
976
+ "@rollup/rollup-win32-arm64-msvc": {
977
+ "version": "4.16.4",
978
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz",
979
+ "integrity": "sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==",
980
+ "optional": true
981
+ },
982
+ "@rollup/rollup-win32-ia32-msvc": {
983
+ "version": "4.16.4",
984
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz",
985
+ "integrity": "sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==",
986
+ "optional": true
987
+ },
988
+ "@rollup/rollup-win32-x64-msvc": {
989
+ "version": "4.16.4",
990
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.4.tgz",
991
+ "integrity": "sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==",
992
+ "optional": true
993
+ },
994
+ "@types/estree": {
995
+ "version": "1.0.5",
996
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
997
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="
998
+ },
999
+ "@types/node": {
1000
+ "version": "18.0.6",
1001
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.6.tgz",
1002
+ "integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw=="
1003
+ },
1004
+ "esbuild": {
1005
+ "version": "0.20.2",
1006
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
1007
+ "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
1008
+ "requires": {
1009
+ "@esbuild/aix-ppc64": "0.20.2",
1010
+ "@esbuild/android-arm": "0.20.2",
1011
+ "@esbuild/android-arm64": "0.20.2",
1012
+ "@esbuild/android-x64": "0.20.2",
1013
+ "@esbuild/darwin-arm64": "0.20.2",
1014
+ "@esbuild/darwin-x64": "0.20.2",
1015
+ "@esbuild/freebsd-arm64": "0.20.2",
1016
+ "@esbuild/freebsd-x64": "0.20.2",
1017
+ "@esbuild/linux-arm": "0.20.2",
1018
+ "@esbuild/linux-arm64": "0.20.2",
1019
+ "@esbuild/linux-ia32": "0.20.2",
1020
+ "@esbuild/linux-loong64": "0.20.2",
1021
+ "@esbuild/linux-mips64el": "0.20.2",
1022
+ "@esbuild/linux-ppc64": "0.20.2",
1023
+ "@esbuild/linux-riscv64": "0.20.2",
1024
+ "@esbuild/linux-s390x": "0.20.2",
1025
+ "@esbuild/linux-x64": "0.20.2",
1026
+ "@esbuild/netbsd-x64": "0.20.2",
1027
+ "@esbuild/openbsd-x64": "0.20.2",
1028
+ "@esbuild/sunos-x64": "0.20.2",
1029
+ "@esbuild/win32-arm64": "0.20.2",
1030
+ "@esbuild/win32-ia32": "0.20.2",
1031
+ "@esbuild/win32-x64": "0.20.2"
1032
+ }
1033
+ },
1034
+ "fsevents": {
1035
+ "version": "2.3.3",
1036
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1037
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1038
+ "optional": true
1039
+ },
1040
+ "nanoid": {
1041
+ "version": "3.3.7",
1042
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
1043
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="
1044
+ },
1045
+ "picocolors": {
1046
+ "version": "1.0.0",
1047
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
1048
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
1049
+ },
1050
+ "postcss": {
1051
+ "version": "8.4.38",
1052
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
1053
+ "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
1054
+ "requires": {
1055
+ "nanoid": "^3.3.7",
1056
+ "picocolors": "^1.0.0",
1057
+ "source-map-js": "^1.2.0"
1058
+ }
1059
+ },
1060
+ "rollup": {
1061
+ "version": "4.16.4",
1062
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz",
1063
+ "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==",
1064
+ "requires": {
1065
+ "@rollup/rollup-android-arm-eabi": "4.16.4",
1066
+ "@rollup/rollup-android-arm64": "4.16.4",
1067
+ "@rollup/rollup-darwin-arm64": "4.16.4",
1068
+ "@rollup/rollup-darwin-x64": "4.16.4",
1069
+ "@rollup/rollup-linux-arm-gnueabihf": "4.16.4",
1070
+ "@rollup/rollup-linux-arm-musleabihf": "4.16.4",
1071
+ "@rollup/rollup-linux-arm64-gnu": "4.16.4",
1072
+ "@rollup/rollup-linux-arm64-musl": "4.16.4",
1073
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4",
1074
+ "@rollup/rollup-linux-riscv64-gnu": "4.16.4",
1075
+ "@rollup/rollup-linux-s390x-gnu": "4.16.4",
1076
+ "@rollup/rollup-linux-x64-gnu": "4.16.4",
1077
+ "@rollup/rollup-linux-x64-musl": "4.16.4",
1078
+ "@rollup/rollup-win32-arm64-msvc": "4.16.4",
1079
+ "@rollup/rollup-win32-ia32-msvc": "4.16.4",
1080
+ "@rollup/rollup-win32-x64-msvc": "4.16.4",
1081
+ "@types/estree": "1.0.5",
1082
+ "fsevents": "~2.3.2"
1083
+ }
1084
+ },
1085
+ "source-map-js": {
1086
+ "version": "1.2.0",
1087
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
1088
+ "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg=="
1089
+ },
1090
+ "vite": {
1091
+ "version": "5.2.10",
1092
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz",
1093
+ "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==",
1094
+ "requires": {
1095
+ "esbuild": "^0.20.1",
1096
+ "fsevents": "~2.3.3",
1097
+ "postcss": "^8.4.38",
1098
+ "rollup": "^4.13.0"
1099
+ }
1100
+ }
1101
+ }
1102
+ }
public/package.json ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "nodejs",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "test": "echo \"Error: no test specified\" && exit 1",
8
+ "start": "vite"
9
+ },
10
+ "keywords": [],
11
+ "author": "",
12
+ "license": "ISC",
13
+ "dependencies": {
14
+ "@types/node": "^18.0.6",
15
+ "vite": "^5.2.10"
16
+ }
17
+ }