jbilcke-hf HF staff commited on
Commit
b2d7d99
0 Parent(s):

initial commit

Browse files
.dockerignore ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ node_modules
2
+ npm-debug.log
3
+ sandbox
.gitignore ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ node_modules
2
+ *.log
3
+ *.bin
4
+ .DS_Store
5
+ .venv
6
+ *.mp4
7
+ sandbox
8
+ scripts
.nvmrc ADDED
@@ -0,0 +1 @@
 
 
1
+ v18.16.0
Dockerfile ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM node:18
2
+ # try this maybe
3
+
4
+ ARG DEBIAN_FRONTEND=noninteractive
5
+
6
+ RUN apt update
7
+
8
+ # For FFMPEG and gl concat
9
+ RUN apt --yes install ffmpeg curl build-essential python3 python3-dev libx11-dev libxext-dev libxext6 libglu1-mesa-dev xvfb libxi-dev libglew-dev pkg-config
10
+
11
+ # For Puppeteer
12
+ RUN apt --yes install libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libgbm1 libasound2 libpangocairo-1.0-0 libxss1 libgtk-3-0
13
+
14
+ # Set up a new user named "user" with user ID 1000
15
+ RUN useradd -o -u 1000 user
16
+
17
+ # Switch to the "user" user
18
+ USER user
19
+
20
+ # Set home to the user's home directory
21
+ ENV HOME=/home/user \
22
+ PATH=/home/user/.local/bin:$PATH
23
+
24
+ # Set the working directory to the user's home directory
25
+ WORKDIR $HOME/app
26
+
27
+ # Install app dependencies
28
+ # A wildcard is used to ensure both package.json AND package-lock.json are copied
29
+ # where available (npm@5+)
30
+ COPY --chown=user package*.json $HOME/app
31
+
32
+ RUN npm install
33
+
34
+
35
+ # Copy the current directory contents into the container at $HOME/app setting the owner to the user
36
+ COPY --chown=user . $HOME/app
37
+
38
+ EXPOSE 7860
39
+
40
+ # we can't use this (it time out)
41
+ # CMD [ "xvfb-run", "-s", "-ac -screen 0 1920x1080x24", "npm", "run", "start" ]
42
+ CMD [ "npm", "run", "start" ]
LICENSE.txt ADDED
@@ -0,0 +1,201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright [yyyy] [name of copyright owner]
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
README.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Community API
3
+ emoji: 🎤
4
+ colorFrom: white
5
+ colorTo: black
6
+ sdk: docker
7
+ pinned: false
8
+ app_port: 7860
9
+ ---
10
+
11
+ A micro service to manage community posts
package-lock.json ADDED
@@ -0,0 +1,1834 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "community-api",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "community-api",
9
+ "version": "1.0.0",
10
+ "license": "Apache License",
11
+ "dependencies": {
12
+ "@gorgonjs/file-provider": "^1.4.1",
13
+ "@gorgonjs/gorgon": "^1.4.1",
14
+ "@types/express": "^4.17.17",
15
+ "@types/uuid": "^9.0.2",
16
+ "eventsource-parser": "^1.0.0",
17
+ "express": "^4.18.2",
18
+ "fs-extra": "^11.1.1",
19
+ "node-fetch": "^3.3.1",
20
+ "resize-base64": "^1.0.12",
21
+ "sharp": "^0.32.4",
22
+ "temp-dir": "^3.0.0",
23
+ "ts-node": "^10.9.1",
24
+ "uuid": "^9.0.0",
25
+ "yaml": "^2.3.1"
26
+ }
27
+ },
28
+ "node_modules/@cspotcode/source-map-support": {
29
+ "version": "0.8.1",
30
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
31
+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
32
+ "dependencies": {
33
+ "@jridgewell/trace-mapping": "0.3.9"
34
+ },
35
+ "engines": {
36
+ "node": ">=12"
37
+ }
38
+ },
39
+ "node_modules/@gorgonjs/file-provider": {
40
+ "version": "1.5.0",
41
+ "resolved": "https://registry.npmjs.org/@gorgonjs/file-provider/-/file-provider-1.5.0.tgz",
42
+ "integrity": "sha512-VhYEOH74qTySGoNo5RnNaL/i3RPOh16VJMtXsW9YceGS86eTM2wrgnJis71p16BZufmepJUQDU8QJoNvrYbuZg==",
43
+ "dependencies": {
44
+ "fast-glob": "^3.3.0"
45
+ },
46
+ "peerDependencies": {
47
+ "@gorgonjs/gorgon": "^1.5.0"
48
+ }
49
+ },
50
+ "node_modules/@gorgonjs/gorgon": {
51
+ "version": "1.5.0",
52
+ "resolved": "https://registry.npmjs.org/@gorgonjs/gorgon/-/gorgon-1.5.0.tgz",
53
+ "integrity": "sha512-xCOGgeYTkWx8IqJkUa42whTSLquJCiTtuScEVAuPxm6Yae8GsD0pibHqI0EW4VWdBlj5GJu3WjKWQx15/sVywA=="
54
+ },
55
+ "node_modules/@jridgewell/resolve-uri": {
56
+ "version": "3.1.1",
57
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
58
+ "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
59
+ "engines": {
60
+ "node": ">=6.0.0"
61
+ }
62
+ },
63
+ "node_modules/@jridgewell/sourcemap-codec": {
64
+ "version": "1.4.15",
65
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
66
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
67
+ },
68
+ "node_modules/@jridgewell/trace-mapping": {
69
+ "version": "0.3.9",
70
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
71
+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
72
+ "dependencies": {
73
+ "@jridgewell/resolve-uri": "^3.0.3",
74
+ "@jridgewell/sourcemap-codec": "^1.4.10"
75
+ }
76
+ },
77
+ "node_modules/@nodelib/fs.scandir": {
78
+ "version": "2.1.5",
79
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
80
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
81
+ "dependencies": {
82
+ "@nodelib/fs.stat": "2.0.5",
83
+ "run-parallel": "^1.1.9"
84
+ },
85
+ "engines": {
86
+ "node": ">= 8"
87
+ }
88
+ },
89
+ "node_modules/@nodelib/fs.stat": {
90
+ "version": "2.0.5",
91
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
92
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
93
+ "engines": {
94
+ "node": ">= 8"
95
+ }
96
+ },
97
+ "node_modules/@nodelib/fs.walk": {
98
+ "version": "1.2.8",
99
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
100
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
101
+ "dependencies": {
102
+ "@nodelib/fs.scandir": "2.1.5",
103
+ "fastq": "^1.6.0"
104
+ },
105
+ "engines": {
106
+ "node": ">= 8"
107
+ }
108
+ },
109
+ "node_modules/@tsconfig/node10": {
110
+ "version": "1.0.9",
111
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
112
+ "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA=="
113
+ },
114
+ "node_modules/@tsconfig/node12": {
115
+ "version": "1.0.11",
116
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
117
+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="
118
+ },
119
+ "node_modules/@tsconfig/node14": {
120
+ "version": "1.0.3",
121
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
122
+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="
123
+ },
124
+ "node_modules/@tsconfig/node16": {
125
+ "version": "1.0.4",
126
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
127
+ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="
128
+ },
129
+ "node_modules/@types/body-parser": {
130
+ "version": "1.19.2",
131
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
132
+ "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
133
+ "dependencies": {
134
+ "@types/connect": "*",
135
+ "@types/node": "*"
136
+ }
137
+ },
138
+ "node_modules/@types/connect": {
139
+ "version": "3.4.36",
140
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz",
141
+ "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==",
142
+ "dependencies": {
143
+ "@types/node": "*"
144
+ }
145
+ },
146
+ "node_modules/@types/express": {
147
+ "version": "4.17.17",
148
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz",
149
+ "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==",
150
+ "dependencies": {
151
+ "@types/body-parser": "*",
152
+ "@types/express-serve-static-core": "^4.17.33",
153
+ "@types/qs": "*",
154
+ "@types/serve-static": "*"
155
+ }
156
+ },
157
+ "node_modules/@types/express-serve-static-core": {
158
+ "version": "4.17.36",
159
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz",
160
+ "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==",
161
+ "dependencies": {
162
+ "@types/node": "*",
163
+ "@types/qs": "*",
164
+ "@types/range-parser": "*",
165
+ "@types/send": "*"
166
+ }
167
+ },
168
+ "node_modules/@types/http-errors": {
169
+ "version": "2.0.1",
170
+ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz",
171
+ "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ=="
172
+ },
173
+ "node_modules/@types/mime": {
174
+ "version": "1.3.2",
175
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
176
+ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
177
+ },
178
+ "node_modules/@types/node": {
179
+ "version": "20.6.0",
180
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz",
181
+ "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg=="
182
+ },
183
+ "node_modules/@types/qs": {
184
+ "version": "6.9.8",
185
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz",
186
+ "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg=="
187
+ },
188
+ "node_modules/@types/range-parser": {
189
+ "version": "1.2.4",
190
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
191
+ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
192
+ },
193
+ "node_modules/@types/send": {
194
+ "version": "0.17.1",
195
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz",
196
+ "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==",
197
+ "dependencies": {
198
+ "@types/mime": "^1",
199
+ "@types/node": "*"
200
+ }
201
+ },
202
+ "node_modules/@types/serve-static": {
203
+ "version": "1.15.2",
204
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz",
205
+ "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==",
206
+ "dependencies": {
207
+ "@types/http-errors": "*",
208
+ "@types/mime": "*",
209
+ "@types/node": "*"
210
+ }
211
+ },
212
+ "node_modules/@types/uuid": {
213
+ "version": "9.0.3",
214
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.3.tgz",
215
+ "integrity": "sha512-taHQQH/3ZyI3zP8M/puluDEIEvtQHVYcC6y3N8ijFtAd28+Ey/G4sg1u2gB01S8MwybLOKAp9/yCMu/uR5l3Ug=="
216
+ },
217
+ "node_modules/accepts": {
218
+ "version": "1.3.8",
219
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
220
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
221
+ "dependencies": {
222
+ "mime-types": "~2.1.34",
223
+ "negotiator": "0.6.3"
224
+ },
225
+ "engines": {
226
+ "node": ">= 0.6"
227
+ }
228
+ },
229
+ "node_modules/acorn": {
230
+ "version": "8.10.0",
231
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
232
+ "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
233
+ "bin": {
234
+ "acorn": "bin/acorn"
235
+ },
236
+ "engines": {
237
+ "node": ">=0.4.0"
238
+ }
239
+ },
240
+ "node_modules/acorn-walk": {
241
+ "version": "8.2.0",
242
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
243
+ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
244
+ "engines": {
245
+ "node": ">=0.4.0"
246
+ }
247
+ },
248
+ "node_modules/arg": {
249
+ "version": "4.1.3",
250
+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
251
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="
252
+ },
253
+ "node_modules/array-flatten": {
254
+ "version": "1.1.1",
255
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
256
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
257
+ },
258
+ "node_modules/b4a": {
259
+ "version": "1.6.4",
260
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz",
261
+ "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw=="
262
+ },
263
+ "node_modules/base64-js": {
264
+ "version": "1.5.1",
265
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
266
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
267
+ "funding": [
268
+ {
269
+ "type": "github",
270
+ "url": "https://github.com/sponsors/feross"
271
+ },
272
+ {
273
+ "type": "patreon",
274
+ "url": "https://www.patreon.com/feross"
275
+ },
276
+ {
277
+ "type": "consulting",
278
+ "url": "https://feross.org/support"
279
+ }
280
+ ]
281
+ },
282
+ "node_modules/bl": {
283
+ "version": "4.1.0",
284
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
285
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
286
+ "dependencies": {
287
+ "buffer": "^5.5.0",
288
+ "inherits": "^2.0.4",
289
+ "readable-stream": "^3.4.0"
290
+ }
291
+ },
292
+ "node_modules/bluebird": {
293
+ "version": "3.7.2",
294
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
295
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
296
+ },
297
+ "node_modules/body-parser": {
298
+ "version": "1.20.1",
299
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
300
+ "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
301
+ "dependencies": {
302
+ "bytes": "3.1.2",
303
+ "content-type": "~1.0.4",
304
+ "debug": "2.6.9",
305
+ "depd": "2.0.0",
306
+ "destroy": "1.2.0",
307
+ "http-errors": "2.0.0",
308
+ "iconv-lite": "0.4.24",
309
+ "on-finished": "2.4.1",
310
+ "qs": "6.11.0",
311
+ "raw-body": "2.5.1",
312
+ "type-is": "~1.6.18",
313
+ "unpipe": "1.0.0"
314
+ },
315
+ "engines": {
316
+ "node": ">= 0.8",
317
+ "npm": "1.2.8000 || >= 1.4.16"
318
+ }
319
+ },
320
+ "node_modules/braces": {
321
+ "version": "3.0.2",
322
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
323
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
324
+ "dependencies": {
325
+ "fill-range": "^7.0.1"
326
+ },
327
+ "engines": {
328
+ "node": ">=8"
329
+ }
330
+ },
331
+ "node_modules/buffer": {
332
+ "version": "5.7.1",
333
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
334
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
335
+ "funding": [
336
+ {
337
+ "type": "github",
338
+ "url": "https://github.com/sponsors/feross"
339
+ },
340
+ {
341
+ "type": "patreon",
342
+ "url": "https://www.patreon.com/feross"
343
+ },
344
+ {
345
+ "type": "consulting",
346
+ "url": "https://feross.org/support"
347
+ }
348
+ ],
349
+ "dependencies": {
350
+ "base64-js": "^1.3.1",
351
+ "ieee754": "^1.1.13"
352
+ }
353
+ },
354
+ "node_modules/bytes": {
355
+ "version": "3.1.2",
356
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
357
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
358
+ "engines": {
359
+ "node": ">= 0.8"
360
+ }
361
+ },
362
+ "node_modules/call-bind": {
363
+ "version": "1.0.2",
364
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
365
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
366
+ "dependencies": {
367
+ "function-bind": "^1.1.1",
368
+ "get-intrinsic": "^1.0.2"
369
+ },
370
+ "funding": {
371
+ "url": "https://github.com/sponsors/ljharb"
372
+ }
373
+ },
374
+ "node_modules/chownr": {
375
+ "version": "1.1.4",
376
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
377
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
378
+ },
379
+ "node_modules/color": {
380
+ "version": "4.2.3",
381
+ "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
382
+ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
383
+ "dependencies": {
384
+ "color-convert": "^2.0.1",
385
+ "color-string": "^1.9.0"
386
+ },
387
+ "engines": {
388
+ "node": ">=12.5.0"
389
+ }
390
+ },
391
+ "node_modules/color-convert": {
392
+ "version": "2.0.1",
393
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
394
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
395
+ "dependencies": {
396
+ "color-name": "~1.1.4"
397
+ },
398
+ "engines": {
399
+ "node": ">=7.0.0"
400
+ }
401
+ },
402
+ "node_modules/color-name": {
403
+ "version": "1.1.4",
404
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
405
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
406
+ },
407
+ "node_modules/color-string": {
408
+ "version": "1.9.1",
409
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
410
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
411
+ "dependencies": {
412
+ "color-name": "^1.0.0",
413
+ "simple-swizzle": "^0.2.2"
414
+ }
415
+ },
416
+ "node_modules/commander": {
417
+ "version": "2.20.3",
418
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
419
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
420
+ },
421
+ "node_modules/content-disposition": {
422
+ "version": "0.5.4",
423
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
424
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
425
+ "dependencies": {
426
+ "safe-buffer": "5.2.1"
427
+ },
428
+ "engines": {
429
+ "node": ">= 0.6"
430
+ }
431
+ },
432
+ "node_modules/content-type": {
433
+ "version": "1.0.5",
434
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
435
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
436
+ "engines": {
437
+ "node": ">= 0.6"
438
+ }
439
+ },
440
+ "node_modules/cookie": {
441
+ "version": "0.5.0",
442
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
443
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
444
+ "engines": {
445
+ "node": ">= 0.6"
446
+ }
447
+ },
448
+ "node_modules/cookie-signature": {
449
+ "version": "1.0.6",
450
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
451
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
452
+ },
453
+ "node_modules/create-readme": {
454
+ "version": "1.2.0",
455
+ "resolved": "https://registry.npmjs.org/create-readme/-/create-readme-1.2.0.tgz",
456
+ "integrity": "sha512-HK3Jpr+5qIYHJHFBeZs0SaLdu7gGHdqS3KORfu5Ivp64Pw+SRSPZ9e0p++NP8JlYeqycxFdVg5yTix0VM5kHFA==",
457
+ "dependencies": {
458
+ "bluebird": "^3.1.1",
459
+ "commander": "^2.9.0",
460
+ "debug": "^4.1.0",
461
+ "github-url-to-object": "^4.0.4",
462
+ "mustache": "^3.0.0",
463
+ "require-all": "^3.0.0"
464
+ },
465
+ "bin": {
466
+ "create-readme": "bin/create-readme.js"
467
+ }
468
+ },
469
+ "node_modules/create-readme/node_modules/debug": {
470
+ "version": "4.3.4",
471
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
472
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
473
+ "dependencies": {
474
+ "ms": "2.1.2"
475
+ },
476
+ "engines": {
477
+ "node": ">=6.0"
478
+ },
479
+ "peerDependenciesMeta": {
480
+ "supports-color": {
481
+ "optional": true
482
+ }
483
+ }
484
+ },
485
+ "node_modules/create-readme/node_modules/ms": {
486
+ "version": "2.1.2",
487
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
488
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
489
+ },
490
+ "node_modules/create-require": {
491
+ "version": "1.1.1",
492
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
493
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="
494
+ },
495
+ "node_modules/data-uri-to-buffer": {
496
+ "version": "4.0.1",
497
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
498
+ "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
499
+ "engines": {
500
+ "node": ">= 12"
501
+ }
502
+ },
503
+ "node_modules/debug": {
504
+ "version": "2.6.9",
505
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
506
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
507
+ "dependencies": {
508
+ "ms": "2.0.0"
509
+ }
510
+ },
511
+ "node_modules/decompress-response": {
512
+ "version": "6.0.0",
513
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
514
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
515
+ "dependencies": {
516
+ "mimic-response": "^3.1.0"
517
+ },
518
+ "engines": {
519
+ "node": ">=10"
520
+ },
521
+ "funding": {
522
+ "url": "https://github.com/sponsors/sindresorhus"
523
+ }
524
+ },
525
+ "node_modules/deep-extend": {
526
+ "version": "0.6.0",
527
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
528
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
529
+ "engines": {
530
+ "node": ">=4.0.0"
531
+ }
532
+ },
533
+ "node_modules/depd": {
534
+ "version": "2.0.0",
535
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
536
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
537
+ "engines": {
538
+ "node": ">= 0.8"
539
+ }
540
+ },
541
+ "node_modules/destroy": {
542
+ "version": "1.2.0",
543
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
544
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
545
+ "engines": {
546
+ "node": ">= 0.8",
547
+ "npm": "1.2.8000 || >= 1.4.16"
548
+ }
549
+ },
550
+ "node_modules/detect-libc": {
551
+ "version": "2.0.2",
552
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz",
553
+ "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==",
554
+ "engines": {
555
+ "node": ">=8"
556
+ }
557
+ },
558
+ "node_modules/diff": {
559
+ "version": "4.0.2",
560
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
561
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
562
+ "engines": {
563
+ "node": ">=0.3.1"
564
+ }
565
+ },
566
+ "node_modules/ee-first": {
567
+ "version": "1.1.1",
568
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
569
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
570
+ },
571
+ "node_modules/encodeurl": {
572
+ "version": "1.0.2",
573
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
574
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
575
+ "engines": {
576
+ "node": ">= 0.8"
577
+ }
578
+ },
579
+ "node_modules/end-of-stream": {
580
+ "version": "1.4.4",
581
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
582
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
583
+ "dependencies": {
584
+ "once": "^1.4.0"
585
+ }
586
+ },
587
+ "node_modules/escape-html": {
588
+ "version": "1.0.3",
589
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
590
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
591
+ },
592
+ "node_modules/etag": {
593
+ "version": "1.8.1",
594
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
595
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
596
+ "engines": {
597
+ "node": ">= 0.6"
598
+ }
599
+ },
600
+ "node_modules/eventsource-parser": {
601
+ "version": "1.0.0",
602
+ "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-1.0.0.tgz",
603
+ "integrity": "sha512-9jgfSCa3dmEme2ES3mPByGXfgZ87VbP97tng1G2nWwWx6bV2nYxm2AWCrbQjXToSe+yYlqaZNtxffR9IeQr95g==",
604
+ "engines": {
605
+ "node": ">=14.18"
606
+ }
607
+ },
608
+ "node_modules/expand-template": {
609
+ "version": "2.0.3",
610
+ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
611
+ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
612
+ "engines": {
613
+ "node": ">=6"
614
+ }
615
+ },
616
+ "node_modules/express": {
617
+ "version": "4.18.2",
618
+ "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
619
+ "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
620
+ "dependencies": {
621
+ "accepts": "~1.3.8",
622
+ "array-flatten": "1.1.1",
623
+ "body-parser": "1.20.1",
624
+ "content-disposition": "0.5.4",
625
+ "content-type": "~1.0.4",
626
+ "cookie": "0.5.0",
627
+ "cookie-signature": "1.0.6",
628
+ "debug": "2.6.9",
629
+ "depd": "2.0.0",
630
+ "encodeurl": "~1.0.2",
631
+ "escape-html": "~1.0.3",
632
+ "etag": "~1.8.1",
633
+ "finalhandler": "1.2.0",
634
+ "fresh": "0.5.2",
635
+ "http-errors": "2.0.0",
636
+ "merge-descriptors": "1.0.1",
637
+ "methods": "~1.1.2",
638
+ "on-finished": "2.4.1",
639
+ "parseurl": "~1.3.3",
640
+ "path-to-regexp": "0.1.7",
641
+ "proxy-addr": "~2.0.7",
642
+ "qs": "6.11.0",
643
+ "range-parser": "~1.2.1",
644
+ "safe-buffer": "5.2.1",
645
+ "send": "0.18.0",
646
+ "serve-static": "1.15.0",
647
+ "setprototypeof": "1.2.0",
648
+ "statuses": "2.0.1",
649
+ "type-is": "~1.6.18",
650
+ "utils-merge": "1.0.1",
651
+ "vary": "~1.1.2"
652
+ },
653
+ "engines": {
654
+ "node": ">= 0.10.0"
655
+ }
656
+ },
657
+ "node_modules/fast-fifo": {
658
+ "version": "1.3.2",
659
+ "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
660
+ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="
661
+ },
662
+ "node_modules/fast-glob": {
663
+ "version": "3.3.1",
664
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
665
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
666
+ "dependencies": {
667
+ "@nodelib/fs.stat": "^2.0.2",
668
+ "@nodelib/fs.walk": "^1.2.3",
669
+ "glob-parent": "^5.1.2",
670
+ "merge2": "^1.3.0",
671
+ "micromatch": "^4.0.4"
672
+ },
673
+ "engines": {
674
+ "node": ">=8.6.0"
675
+ }
676
+ },
677
+ "node_modules/fastq": {
678
+ "version": "1.15.0",
679
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
680
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
681
+ "dependencies": {
682
+ "reusify": "^1.0.4"
683
+ }
684
+ },
685
+ "node_modules/fetch-blob": {
686
+ "version": "3.2.0",
687
+ "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
688
+ "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
689
+ "funding": [
690
+ {
691
+ "type": "github",
692
+ "url": "https://github.com/sponsors/jimmywarting"
693
+ },
694
+ {
695
+ "type": "paypal",
696
+ "url": "https://paypal.me/jimmywarting"
697
+ }
698
+ ],
699
+ "dependencies": {
700
+ "node-domexception": "^1.0.0",
701
+ "web-streams-polyfill": "^3.0.3"
702
+ },
703
+ "engines": {
704
+ "node": "^12.20 || >= 14.13"
705
+ }
706
+ },
707
+ "node_modules/fill-range": {
708
+ "version": "7.0.1",
709
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
710
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
711
+ "dependencies": {
712
+ "to-regex-range": "^5.0.1"
713
+ },
714
+ "engines": {
715
+ "node": ">=8"
716
+ }
717
+ },
718
+ "node_modules/finalhandler": {
719
+ "version": "1.2.0",
720
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
721
+ "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
722
+ "dependencies": {
723
+ "debug": "2.6.9",
724
+ "encodeurl": "~1.0.2",
725
+ "escape-html": "~1.0.3",
726
+ "on-finished": "2.4.1",
727
+ "parseurl": "~1.3.3",
728
+ "statuses": "2.0.1",
729
+ "unpipe": "~1.0.0"
730
+ },
731
+ "engines": {
732
+ "node": ">= 0.8"
733
+ }
734
+ },
735
+ "node_modules/formdata-polyfill": {
736
+ "version": "4.0.10",
737
+ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
738
+ "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
739
+ "dependencies": {
740
+ "fetch-blob": "^3.1.2"
741
+ },
742
+ "engines": {
743
+ "node": ">=12.20.0"
744
+ }
745
+ },
746
+ "node_modules/forwarded": {
747
+ "version": "0.2.0",
748
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
749
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
750
+ "engines": {
751
+ "node": ">= 0.6"
752
+ }
753
+ },
754
+ "node_modules/fresh": {
755
+ "version": "0.5.2",
756
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
757
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
758
+ "engines": {
759
+ "node": ">= 0.6"
760
+ }
761
+ },
762
+ "node_modules/fs-constants": {
763
+ "version": "1.0.0",
764
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
765
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
766
+ },
767
+ "node_modules/fs-extra": {
768
+ "version": "11.1.1",
769
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz",
770
+ "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==",
771
+ "dependencies": {
772
+ "graceful-fs": "^4.2.0",
773
+ "jsonfile": "^6.0.1",
774
+ "universalify": "^2.0.0"
775
+ },
776
+ "engines": {
777
+ "node": ">=14.14"
778
+ }
779
+ },
780
+ "node_modules/function-bind": {
781
+ "version": "1.1.1",
782
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
783
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
784
+ },
785
+ "node_modules/get-intrinsic": {
786
+ "version": "1.2.1",
787
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
788
+ "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
789
+ "dependencies": {
790
+ "function-bind": "^1.1.1",
791
+ "has": "^1.0.3",
792
+ "has-proto": "^1.0.1",
793
+ "has-symbols": "^1.0.3"
794
+ },
795
+ "funding": {
796
+ "url": "https://github.com/sponsors/ljharb"
797
+ }
798
+ },
799
+ "node_modules/github-from-package": {
800
+ "version": "0.0.0",
801
+ "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
802
+ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="
803
+ },
804
+ "node_modules/github-url-to-object": {
805
+ "version": "4.0.6",
806
+ "resolved": "https://registry.npmjs.org/github-url-to-object/-/github-url-to-object-4.0.6.tgz",
807
+ "integrity": "sha512-NaqbYHMUAlPcmWFdrAB7bcxrNIiiJWJe8s/2+iOc9vlcHlwHqSGrPk+Yi3nu6ebTwgsZEa7igz+NH2vEq3gYwQ==",
808
+ "dependencies": {
809
+ "is-url": "^1.1.0"
810
+ }
811
+ },
812
+ "node_modules/glob-parent": {
813
+ "version": "5.1.2",
814
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
815
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
816
+ "dependencies": {
817
+ "is-glob": "^4.0.1"
818
+ },
819
+ "engines": {
820
+ "node": ">= 6"
821
+ }
822
+ },
823
+ "node_modules/graceful-fs": {
824
+ "version": "4.2.11",
825
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
826
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
827
+ },
828
+ "node_modules/has": {
829
+ "version": "1.0.3",
830
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
831
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
832
+ "dependencies": {
833
+ "function-bind": "^1.1.1"
834
+ },
835
+ "engines": {
836
+ "node": ">= 0.4.0"
837
+ }
838
+ },
839
+ "node_modules/has-proto": {
840
+ "version": "1.0.1",
841
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
842
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
843
+ "engines": {
844
+ "node": ">= 0.4"
845
+ },
846
+ "funding": {
847
+ "url": "https://github.com/sponsors/ljharb"
848
+ }
849
+ },
850
+ "node_modules/has-symbols": {
851
+ "version": "1.0.3",
852
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
853
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
854
+ "engines": {
855
+ "node": ">= 0.4"
856
+ },
857
+ "funding": {
858
+ "url": "https://github.com/sponsors/ljharb"
859
+ }
860
+ },
861
+ "node_modules/http-errors": {
862
+ "version": "2.0.0",
863
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
864
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
865
+ "dependencies": {
866
+ "depd": "2.0.0",
867
+ "inherits": "2.0.4",
868
+ "setprototypeof": "1.2.0",
869
+ "statuses": "2.0.1",
870
+ "toidentifier": "1.0.1"
871
+ },
872
+ "engines": {
873
+ "node": ">= 0.8"
874
+ }
875
+ },
876
+ "node_modules/iconv-lite": {
877
+ "version": "0.4.24",
878
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
879
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
880
+ "dependencies": {
881
+ "safer-buffer": ">= 2.1.2 < 3"
882
+ },
883
+ "engines": {
884
+ "node": ">=0.10.0"
885
+ }
886
+ },
887
+ "node_modules/ieee754": {
888
+ "version": "1.2.1",
889
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
890
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
891
+ "funding": [
892
+ {
893
+ "type": "github",
894
+ "url": "https://github.com/sponsors/feross"
895
+ },
896
+ {
897
+ "type": "patreon",
898
+ "url": "https://www.patreon.com/feross"
899
+ },
900
+ {
901
+ "type": "consulting",
902
+ "url": "https://feross.org/support"
903
+ }
904
+ ]
905
+ },
906
+ "node_modules/inherits": {
907
+ "version": "2.0.4",
908
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
909
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
910
+ },
911
+ "node_modules/ini": {
912
+ "version": "1.3.8",
913
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
914
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
915
+ },
916
+ "node_modules/ipaddr.js": {
917
+ "version": "1.9.1",
918
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
919
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
920
+ "engines": {
921
+ "node": ">= 0.10"
922
+ }
923
+ },
924
+ "node_modules/is-arrayish": {
925
+ "version": "0.3.2",
926
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
927
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
928
+ },
929
+ "node_modules/is-extglob": {
930
+ "version": "2.1.1",
931
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
932
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
933
+ "engines": {
934
+ "node": ">=0.10.0"
935
+ }
936
+ },
937
+ "node_modules/is-glob": {
938
+ "version": "4.0.3",
939
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
940
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
941
+ "dependencies": {
942
+ "is-extglob": "^2.1.1"
943
+ },
944
+ "engines": {
945
+ "node": ">=0.10.0"
946
+ }
947
+ },
948
+ "node_modules/is-number": {
949
+ "version": "7.0.0",
950
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
951
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
952
+ "engines": {
953
+ "node": ">=0.12.0"
954
+ }
955
+ },
956
+ "node_modules/is-url": {
957
+ "version": "1.2.4",
958
+ "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
959
+ "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
960
+ },
961
+ "node_modules/jsonfile": {
962
+ "version": "6.1.0",
963
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
964
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
965
+ "dependencies": {
966
+ "universalify": "^2.0.0"
967
+ },
968
+ "optionalDependencies": {
969
+ "graceful-fs": "^4.1.6"
970
+ }
971
+ },
972
+ "node_modules/lru-cache": {
973
+ "version": "6.0.0",
974
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
975
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
976
+ "dependencies": {
977
+ "yallist": "^4.0.0"
978
+ },
979
+ "engines": {
980
+ "node": ">=10"
981
+ }
982
+ },
983
+ "node_modules/make-error": {
984
+ "version": "1.3.6",
985
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
986
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
987
+ },
988
+ "node_modules/media-typer": {
989
+ "version": "0.3.0",
990
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
991
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
992
+ "engines": {
993
+ "node": ">= 0.6"
994
+ }
995
+ },
996
+ "node_modules/merge-descriptors": {
997
+ "version": "1.0.1",
998
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
999
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
1000
+ },
1001
+ "node_modules/merge2": {
1002
+ "version": "1.4.1",
1003
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
1004
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
1005
+ "engines": {
1006
+ "node": ">= 8"
1007
+ }
1008
+ },
1009
+ "node_modules/methods": {
1010
+ "version": "1.1.2",
1011
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1012
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
1013
+ "engines": {
1014
+ "node": ">= 0.6"
1015
+ }
1016
+ },
1017
+ "node_modules/micromatch": {
1018
+ "version": "4.0.5",
1019
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
1020
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
1021
+ "dependencies": {
1022
+ "braces": "^3.0.2",
1023
+ "picomatch": "^2.3.1"
1024
+ },
1025
+ "engines": {
1026
+ "node": ">=8.6"
1027
+ }
1028
+ },
1029
+ "node_modules/mime": {
1030
+ "version": "1.6.0",
1031
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1032
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
1033
+ "bin": {
1034
+ "mime": "cli.js"
1035
+ },
1036
+ "engines": {
1037
+ "node": ">=4"
1038
+ }
1039
+ },
1040
+ "node_modules/mime-db": {
1041
+ "version": "1.52.0",
1042
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1043
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1044
+ "engines": {
1045
+ "node": ">= 0.6"
1046
+ }
1047
+ },
1048
+ "node_modules/mime-types": {
1049
+ "version": "2.1.35",
1050
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1051
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1052
+ "dependencies": {
1053
+ "mime-db": "1.52.0"
1054
+ },
1055
+ "engines": {
1056
+ "node": ">= 0.6"
1057
+ }
1058
+ },
1059
+ "node_modules/mimic-response": {
1060
+ "version": "3.1.0",
1061
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
1062
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
1063
+ "engines": {
1064
+ "node": ">=10"
1065
+ },
1066
+ "funding": {
1067
+ "url": "https://github.com/sponsors/sindresorhus"
1068
+ }
1069
+ },
1070
+ "node_modules/minimist": {
1071
+ "version": "1.2.8",
1072
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
1073
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
1074
+ "funding": {
1075
+ "url": "https://github.com/sponsors/ljharb"
1076
+ }
1077
+ },
1078
+ "node_modules/mkdirp-classic": {
1079
+ "version": "0.5.3",
1080
+ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
1081
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
1082
+ },
1083
+ "node_modules/ms": {
1084
+ "version": "2.0.0",
1085
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1086
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
1087
+ },
1088
+ "node_modules/mustache": {
1089
+ "version": "3.2.1",
1090
+ "resolved": "https://registry.npmjs.org/mustache/-/mustache-3.2.1.tgz",
1091
+ "integrity": "sha512-RERvMFdLpaFfSRIEe632yDm5nsd0SDKn8hGmcUwswnyiE5mtdZLDybtHAz6hjJhawokF0hXvGLtx9mrQfm6FkA==",
1092
+ "bin": {
1093
+ "mustache": "bin/mustache"
1094
+ },
1095
+ "engines": {
1096
+ "npm": ">=1.4.0"
1097
+ }
1098
+ },
1099
+ "node_modules/napi-build-utils": {
1100
+ "version": "1.0.2",
1101
+ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
1102
+ "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="
1103
+ },
1104
+ "node_modules/negotiator": {
1105
+ "version": "0.6.3",
1106
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1107
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
1108
+ "engines": {
1109
+ "node": ">= 0.6"
1110
+ }
1111
+ },
1112
+ "node_modules/node-abi": {
1113
+ "version": "3.47.0",
1114
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz",
1115
+ "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==",
1116
+ "dependencies": {
1117
+ "semver": "^7.3.5"
1118
+ },
1119
+ "engines": {
1120
+ "node": ">=10"
1121
+ }
1122
+ },
1123
+ "node_modules/node-addon-api": {
1124
+ "version": "6.1.0",
1125
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz",
1126
+ "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA=="
1127
+ },
1128
+ "node_modules/node-domexception": {
1129
+ "version": "1.0.0",
1130
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
1131
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
1132
+ "funding": [
1133
+ {
1134
+ "type": "github",
1135
+ "url": "https://github.com/sponsors/jimmywarting"
1136
+ },
1137
+ {
1138
+ "type": "github",
1139
+ "url": "https://paypal.me/jimmywarting"
1140
+ }
1141
+ ],
1142
+ "engines": {
1143
+ "node": ">=10.5.0"
1144
+ }
1145
+ },
1146
+ "node_modules/node-fetch": {
1147
+ "version": "3.3.2",
1148
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
1149
+ "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
1150
+ "dependencies": {
1151
+ "data-uri-to-buffer": "^4.0.0",
1152
+ "fetch-blob": "^3.1.4",
1153
+ "formdata-polyfill": "^4.0.10"
1154
+ },
1155
+ "engines": {
1156
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
1157
+ },
1158
+ "funding": {
1159
+ "type": "opencollective",
1160
+ "url": "https://opencollective.com/node-fetch"
1161
+ }
1162
+ },
1163
+ "node_modules/object-inspect": {
1164
+ "version": "1.12.3",
1165
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
1166
+ "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
1167
+ "funding": {
1168
+ "url": "https://github.com/sponsors/ljharb"
1169
+ }
1170
+ },
1171
+ "node_modules/on-finished": {
1172
+ "version": "2.4.1",
1173
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1174
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1175
+ "dependencies": {
1176
+ "ee-first": "1.1.1"
1177
+ },
1178
+ "engines": {
1179
+ "node": ">= 0.8"
1180
+ }
1181
+ },
1182
+ "node_modules/once": {
1183
+ "version": "1.4.0",
1184
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1185
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1186
+ "dependencies": {
1187
+ "wrappy": "1"
1188
+ }
1189
+ },
1190
+ "node_modules/parseurl": {
1191
+ "version": "1.3.3",
1192
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1193
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1194
+ "engines": {
1195
+ "node": ">= 0.8"
1196
+ }
1197
+ },
1198
+ "node_modules/path-to-regexp": {
1199
+ "version": "0.1.7",
1200
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1201
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
1202
+ },
1203
+ "node_modules/picomatch": {
1204
+ "version": "2.3.1",
1205
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1206
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1207
+ "engines": {
1208
+ "node": ">=8.6"
1209
+ },
1210
+ "funding": {
1211
+ "url": "https://github.com/sponsors/jonschlinkert"
1212
+ }
1213
+ },
1214
+ "node_modules/prebuild-install": {
1215
+ "version": "7.1.1",
1216
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz",
1217
+ "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==",
1218
+ "dependencies": {
1219
+ "detect-libc": "^2.0.0",
1220
+ "expand-template": "^2.0.3",
1221
+ "github-from-package": "0.0.0",
1222
+ "minimist": "^1.2.3",
1223
+ "mkdirp-classic": "^0.5.3",
1224
+ "napi-build-utils": "^1.0.1",
1225
+ "node-abi": "^3.3.0",
1226
+ "pump": "^3.0.0",
1227
+ "rc": "^1.2.7",
1228
+ "simple-get": "^4.0.0",
1229
+ "tar-fs": "^2.0.0",
1230
+ "tunnel-agent": "^0.6.0"
1231
+ },
1232
+ "bin": {
1233
+ "prebuild-install": "bin.js"
1234
+ },
1235
+ "engines": {
1236
+ "node": ">=10"
1237
+ }
1238
+ },
1239
+ "node_modules/prebuild-install/node_modules/tar-fs": {
1240
+ "version": "2.1.1",
1241
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
1242
+ "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
1243
+ "dependencies": {
1244
+ "chownr": "^1.1.1",
1245
+ "mkdirp-classic": "^0.5.2",
1246
+ "pump": "^3.0.0",
1247
+ "tar-stream": "^2.1.4"
1248
+ }
1249
+ },
1250
+ "node_modules/prebuild-install/node_modules/tar-stream": {
1251
+ "version": "2.2.0",
1252
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
1253
+ "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
1254
+ "dependencies": {
1255
+ "bl": "^4.0.3",
1256
+ "end-of-stream": "^1.4.1",
1257
+ "fs-constants": "^1.0.0",
1258
+ "inherits": "^2.0.3",
1259
+ "readable-stream": "^3.1.1"
1260
+ },
1261
+ "engines": {
1262
+ "node": ">=6"
1263
+ }
1264
+ },
1265
+ "node_modules/proxy-addr": {
1266
+ "version": "2.0.7",
1267
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1268
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1269
+ "dependencies": {
1270
+ "forwarded": "0.2.0",
1271
+ "ipaddr.js": "1.9.1"
1272
+ },
1273
+ "engines": {
1274
+ "node": ">= 0.10"
1275
+ }
1276
+ },
1277
+ "node_modules/pump": {
1278
+ "version": "3.0.0",
1279
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
1280
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
1281
+ "dependencies": {
1282
+ "end-of-stream": "^1.1.0",
1283
+ "once": "^1.3.1"
1284
+ }
1285
+ },
1286
+ "node_modules/qs": {
1287
+ "version": "6.11.0",
1288
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
1289
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
1290
+ "dependencies": {
1291
+ "side-channel": "^1.0.4"
1292
+ },
1293
+ "engines": {
1294
+ "node": ">=0.6"
1295
+ },
1296
+ "funding": {
1297
+ "url": "https://github.com/sponsors/ljharb"
1298
+ }
1299
+ },
1300
+ "node_modules/queue-microtask": {
1301
+ "version": "1.2.3",
1302
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
1303
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
1304
+ "funding": [
1305
+ {
1306
+ "type": "github",
1307
+ "url": "https://github.com/sponsors/feross"
1308
+ },
1309
+ {
1310
+ "type": "patreon",
1311
+ "url": "https://www.patreon.com/feross"
1312
+ },
1313
+ {
1314
+ "type": "consulting",
1315
+ "url": "https://feross.org/support"
1316
+ }
1317
+ ]
1318
+ },
1319
+ "node_modules/queue-tick": {
1320
+ "version": "1.0.1",
1321
+ "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz",
1322
+ "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag=="
1323
+ },
1324
+ "node_modules/range-parser": {
1325
+ "version": "1.2.1",
1326
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1327
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1328
+ "engines": {
1329
+ "node": ">= 0.6"
1330
+ }
1331
+ },
1332
+ "node_modules/raw-body": {
1333
+ "version": "2.5.1",
1334
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
1335
+ "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
1336
+ "dependencies": {
1337
+ "bytes": "3.1.2",
1338
+ "http-errors": "2.0.0",
1339
+ "iconv-lite": "0.4.24",
1340
+ "unpipe": "1.0.0"
1341
+ },
1342
+ "engines": {
1343
+ "node": ">= 0.8"
1344
+ }
1345
+ },
1346
+ "node_modules/rc": {
1347
+ "version": "1.2.8",
1348
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
1349
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
1350
+ "dependencies": {
1351
+ "deep-extend": "^0.6.0",
1352
+ "ini": "~1.3.0",
1353
+ "minimist": "^1.2.0",
1354
+ "strip-json-comments": "~2.0.1"
1355
+ },
1356
+ "bin": {
1357
+ "rc": "cli.js"
1358
+ }
1359
+ },
1360
+ "node_modules/readable-stream": {
1361
+ "version": "3.6.2",
1362
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
1363
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
1364
+ "dependencies": {
1365
+ "inherits": "^2.0.3",
1366
+ "string_decoder": "^1.1.1",
1367
+ "util-deprecate": "^1.0.1"
1368
+ },
1369
+ "engines": {
1370
+ "node": ">= 6"
1371
+ }
1372
+ },
1373
+ "node_modules/require-all": {
1374
+ "version": "3.0.0",
1375
+ "resolved": "https://registry.npmjs.org/require-all/-/require-all-3.0.0.tgz",
1376
+ "integrity": "sha512-jPGN876lc5exWYrMcgZSd7U42P0PmVQzxnQB13fCSzmyGnqQWW4WUz5DosZ/qe24hz+5o9lSvW2epBNZ1xa6Fw==",
1377
+ "engines": {
1378
+ "node": ">= 0.8"
1379
+ }
1380
+ },
1381
+ "node_modules/resize-base64": {
1382
+ "version": "1.0.12",
1383
+ "resolved": "https://registry.npmjs.org/resize-base64/-/resize-base64-1.0.12.tgz",
1384
+ "integrity": "sha512-OIiowGyyrwzrwbufDLPpBfofuUAkPSA4OPzT5rTGxfU4iHszKYHNICd1uhnRNDBFnU08WU8mt94+OaBXgN+WMg==",
1385
+ "dependencies": {
1386
+ "create-readme": "^1.1.0"
1387
+ }
1388
+ },
1389
+ "node_modules/reusify": {
1390
+ "version": "1.0.4",
1391
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
1392
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
1393
+ "engines": {
1394
+ "iojs": ">=1.0.0",
1395
+ "node": ">=0.10.0"
1396
+ }
1397
+ },
1398
+ "node_modules/run-parallel": {
1399
+ "version": "1.2.0",
1400
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
1401
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
1402
+ "funding": [
1403
+ {
1404
+ "type": "github",
1405
+ "url": "https://github.com/sponsors/feross"
1406
+ },
1407
+ {
1408
+ "type": "patreon",
1409
+ "url": "https://www.patreon.com/feross"
1410
+ },
1411
+ {
1412
+ "type": "consulting",
1413
+ "url": "https://feross.org/support"
1414
+ }
1415
+ ],
1416
+ "dependencies": {
1417
+ "queue-microtask": "^1.2.2"
1418
+ }
1419
+ },
1420
+ "node_modules/safe-buffer": {
1421
+ "version": "5.2.1",
1422
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1423
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1424
+ "funding": [
1425
+ {
1426
+ "type": "github",
1427
+ "url": "https://github.com/sponsors/feross"
1428
+ },
1429
+ {
1430
+ "type": "patreon",
1431
+ "url": "https://www.patreon.com/feross"
1432
+ },
1433
+ {
1434
+ "type": "consulting",
1435
+ "url": "https://feross.org/support"
1436
+ }
1437
+ ]
1438
+ },
1439
+ "node_modules/safer-buffer": {
1440
+ "version": "2.1.2",
1441
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1442
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1443
+ },
1444
+ "node_modules/semver": {
1445
+ "version": "7.5.4",
1446
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
1447
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
1448
+ "dependencies": {
1449
+ "lru-cache": "^6.0.0"
1450
+ },
1451
+ "bin": {
1452
+ "semver": "bin/semver.js"
1453
+ },
1454
+ "engines": {
1455
+ "node": ">=10"
1456
+ }
1457
+ },
1458
+ "node_modules/send": {
1459
+ "version": "0.18.0",
1460
+ "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
1461
+ "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1462
+ "dependencies": {
1463
+ "debug": "2.6.9",
1464
+ "depd": "2.0.0",
1465
+ "destroy": "1.2.0",
1466
+ "encodeurl": "~1.0.2",
1467
+ "escape-html": "~1.0.3",
1468
+ "etag": "~1.8.1",
1469
+ "fresh": "0.5.2",
1470
+ "http-errors": "2.0.0",
1471
+ "mime": "1.6.0",
1472
+ "ms": "2.1.3",
1473
+ "on-finished": "2.4.1",
1474
+ "range-parser": "~1.2.1",
1475
+ "statuses": "2.0.1"
1476
+ },
1477
+ "engines": {
1478
+ "node": ">= 0.8.0"
1479
+ }
1480
+ },
1481
+ "node_modules/send/node_modules/ms": {
1482
+ "version": "2.1.3",
1483
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1484
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1485
+ },
1486
+ "node_modules/serve-static": {
1487
+ "version": "1.15.0",
1488
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
1489
+ "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
1490
+ "dependencies": {
1491
+ "encodeurl": "~1.0.2",
1492
+ "escape-html": "~1.0.3",
1493
+ "parseurl": "~1.3.3",
1494
+ "send": "0.18.0"
1495
+ },
1496
+ "engines": {
1497
+ "node": ">= 0.8.0"
1498
+ }
1499
+ },
1500
+ "node_modules/setprototypeof": {
1501
+ "version": "1.2.0",
1502
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1503
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1504
+ },
1505
+ "node_modules/sharp": {
1506
+ "version": "0.32.5",
1507
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.5.tgz",
1508
+ "integrity": "sha512-0dap3iysgDkNaPOaOL4X/0akdu0ma62GcdC2NBQ+93eqpePdDdr2/LM0sFdDSMmN7yS+odyZtPsb7tx/cYBKnQ==",
1509
+ "hasInstallScript": true,
1510
+ "dependencies": {
1511
+ "color": "^4.2.3",
1512
+ "detect-libc": "^2.0.2",
1513
+ "node-addon-api": "^6.1.0",
1514
+ "prebuild-install": "^7.1.1",
1515
+ "semver": "^7.5.4",
1516
+ "simple-get": "^4.0.1",
1517
+ "tar-fs": "^3.0.4",
1518
+ "tunnel-agent": "^0.6.0"
1519
+ },
1520
+ "engines": {
1521
+ "node": ">=14.15.0"
1522
+ },
1523
+ "funding": {
1524
+ "url": "https://opencollective.com/libvips"
1525
+ }
1526
+ },
1527
+ "node_modules/side-channel": {
1528
+ "version": "1.0.4",
1529
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
1530
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1531
+ "dependencies": {
1532
+ "call-bind": "^1.0.0",
1533
+ "get-intrinsic": "^1.0.2",
1534
+ "object-inspect": "^1.9.0"
1535
+ },
1536
+ "funding": {
1537
+ "url": "https://github.com/sponsors/ljharb"
1538
+ }
1539
+ },
1540
+ "node_modules/simple-concat": {
1541
+ "version": "1.0.1",
1542
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
1543
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
1544
+ "funding": [
1545
+ {
1546
+ "type": "github",
1547
+ "url": "https://github.com/sponsors/feross"
1548
+ },
1549
+ {
1550
+ "type": "patreon",
1551
+ "url": "https://www.patreon.com/feross"
1552
+ },
1553
+ {
1554
+ "type": "consulting",
1555
+ "url": "https://feross.org/support"
1556
+ }
1557
+ ]
1558
+ },
1559
+ "node_modules/simple-get": {
1560
+ "version": "4.0.1",
1561
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
1562
+ "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
1563
+ "funding": [
1564
+ {
1565
+ "type": "github",
1566
+ "url": "https://github.com/sponsors/feross"
1567
+ },
1568
+ {
1569
+ "type": "patreon",
1570
+ "url": "https://www.patreon.com/feross"
1571
+ },
1572
+ {
1573
+ "type": "consulting",
1574
+ "url": "https://feross.org/support"
1575
+ }
1576
+ ],
1577
+ "dependencies": {
1578
+ "decompress-response": "^6.0.0",
1579
+ "once": "^1.3.1",
1580
+ "simple-concat": "^1.0.0"
1581
+ }
1582
+ },
1583
+ "node_modules/simple-swizzle": {
1584
+ "version": "0.2.2",
1585
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
1586
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
1587
+ "dependencies": {
1588
+ "is-arrayish": "^0.3.1"
1589
+ }
1590
+ },
1591
+ "node_modules/statuses": {
1592
+ "version": "2.0.1",
1593
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1594
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1595
+ "engines": {
1596
+ "node": ">= 0.8"
1597
+ }
1598
+ },
1599
+ "node_modules/streamx": {
1600
+ "version": "2.15.1",
1601
+ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz",
1602
+ "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==",
1603
+ "dependencies": {
1604
+ "fast-fifo": "^1.1.0",
1605
+ "queue-tick": "^1.0.1"
1606
+ }
1607
+ },
1608
+ "node_modules/string_decoder": {
1609
+ "version": "1.3.0",
1610
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
1611
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
1612
+ "dependencies": {
1613
+ "safe-buffer": "~5.2.0"
1614
+ }
1615
+ },
1616
+ "node_modules/strip-json-comments": {
1617
+ "version": "2.0.1",
1618
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1619
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
1620
+ "engines": {
1621
+ "node": ">=0.10.0"
1622
+ }
1623
+ },
1624
+ "node_modules/tar-fs": {
1625
+ "version": "3.0.4",
1626
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz",
1627
+ "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==",
1628
+ "dependencies": {
1629
+ "mkdirp-classic": "^0.5.2",
1630
+ "pump": "^3.0.0",
1631
+ "tar-stream": "^3.1.5"
1632
+ }
1633
+ },
1634
+ "node_modules/tar-stream": {
1635
+ "version": "3.1.6",
1636
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz",
1637
+ "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==",
1638
+ "dependencies": {
1639
+ "b4a": "^1.6.4",
1640
+ "fast-fifo": "^1.2.0",
1641
+ "streamx": "^2.15.0"
1642
+ }
1643
+ },
1644
+ "node_modules/temp-dir": {
1645
+ "version": "3.0.0",
1646
+ "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz",
1647
+ "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==",
1648
+ "engines": {
1649
+ "node": ">=14.16"
1650
+ }
1651
+ },
1652
+ "node_modules/to-regex-range": {
1653
+ "version": "5.0.1",
1654
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1655
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1656
+ "dependencies": {
1657
+ "is-number": "^7.0.0"
1658
+ },
1659
+ "engines": {
1660
+ "node": ">=8.0"
1661
+ }
1662
+ },
1663
+ "node_modules/toidentifier": {
1664
+ "version": "1.0.1",
1665
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1666
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1667
+ "engines": {
1668
+ "node": ">=0.6"
1669
+ }
1670
+ },
1671
+ "node_modules/ts-node": {
1672
+ "version": "10.9.1",
1673
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
1674
+ "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
1675
+ "dependencies": {
1676
+ "@cspotcode/source-map-support": "^0.8.0",
1677
+ "@tsconfig/node10": "^1.0.7",
1678
+ "@tsconfig/node12": "^1.0.7",
1679
+ "@tsconfig/node14": "^1.0.0",
1680
+ "@tsconfig/node16": "^1.0.2",
1681
+ "acorn": "^8.4.1",
1682
+ "acorn-walk": "^8.1.1",
1683
+ "arg": "^4.1.0",
1684
+ "create-require": "^1.1.0",
1685
+ "diff": "^4.0.1",
1686
+ "make-error": "^1.1.1",
1687
+ "v8-compile-cache-lib": "^3.0.1",
1688
+ "yn": "3.1.1"
1689
+ },
1690
+ "bin": {
1691
+ "ts-node": "dist/bin.js",
1692
+ "ts-node-cwd": "dist/bin-cwd.js",
1693
+ "ts-node-esm": "dist/bin-esm.js",
1694
+ "ts-node-script": "dist/bin-script.js",
1695
+ "ts-node-transpile-only": "dist/bin-transpile.js",
1696
+ "ts-script": "dist/bin-script-deprecated.js"
1697
+ },
1698
+ "peerDependencies": {
1699
+ "@swc/core": ">=1.2.50",
1700
+ "@swc/wasm": ">=1.2.50",
1701
+ "@types/node": "*",
1702
+ "typescript": ">=2.7"
1703
+ },
1704
+ "peerDependenciesMeta": {
1705
+ "@swc/core": {
1706
+ "optional": true
1707
+ },
1708
+ "@swc/wasm": {
1709
+ "optional": true
1710
+ }
1711
+ }
1712
+ },
1713
+ "node_modules/tunnel-agent": {
1714
+ "version": "0.6.0",
1715
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1716
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
1717
+ "dependencies": {
1718
+ "safe-buffer": "^5.0.1"
1719
+ },
1720
+ "engines": {
1721
+ "node": "*"
1722
+ }
1723
+ },
1724
+ "node_modules/type-is": {
1725
+ "version": "1.6.18",
1726
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1727
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1728
+ "dependencies": {
1729
+ "media-typer": "0.3.0",
1730
+ "mime-types": "~2.1.24"
1731
+ },
1732
+ "engines": {
1733
+ "node": ">= 0.6"
1734
+ }
1735
+ },
1736
+ "node_modules/typescript": {
1737
+ "version": "5.2.2",
1738
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
1739
+ "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
1740
+ "peer": true,
1741
+ "bin": {
1742
+ "tsc": "bin/tsc",
1743
+ "tsserver": "bin/tsserver"
1744
+ },
1745
+ "engines": {
1746
+ "node": ">=14.17"
1747
+ }
1748
+ },
1749
+ "node_modules/universalify": {
1750
+ "version": "2.0.0",
1751
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
1752
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
1753
+ "engines": {
1754
+ "node": ">= 10.0.0"
1755
+ }
1756
+ },
1757
+ "node_modules/unpipe": {
1758
+ "version": "1.0.0",
1759
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1760
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1761
+ "engines": {
1762
+ "node": ">= 0.8"
1763
+ }
1764
+ },
1765
+ "node_modules/util-deprecate": {
1766
+ "version": "1.0.2",
1767
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1768
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
1769
+ },
1770
+ "node_modules/utils-merge": {
1771
+ "version": "1.0.1",
1772
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1773
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1774
+ "engines": {
1775
+ "node": ">= 0.4.0"
1776
+ }
1777
+ },
1778
+ "node_modules/uuid": {
1779
+ "version": "9.0.0",
1780
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
1781
+ "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==",
1782
+ "bin": {
1783
+ "uuid": "dist/bin/uuid"
1784
+ }
1785
+ },
1786
+ "node_modules/v8-compile-cache-lib": {
1787
+ "version": "3.0.1",
1788
+ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
1789
+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="
1790
+ },
1791
+ "node_modules/vary": {
1792
+ "version": "1.1.2",
1793
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1794
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1795
+ "engines": {
1796
+ "node": ">= 0.8"
1797
+ }
1798
+ },
1799
+ "node_modules/web-streams-polyfill": {
1800
+ "version": "3.2.1",
1801
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
1802
+ "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==",
1803
+ "engines": {
1804
+ "node": ">= 8"
1805
+ }
1806
+ },
1807
+ "node_modules/wrappy": {
1808
+ "version": "1.0.2",
1809
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1810
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
1811
+ },
1812
+ "node_modules/yallist": {
1813
+ "version": "4.0.0",
1814
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
1815
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
1816
+ },
1817
+ "node_modules/yaml": {
1818
+ "version": "2.3.2",
1819
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz",
1820
+ "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==",
1821
+ "engines": {
1822
+ "node": ">= 14"
1823
+ }
1824
+ },
1825
+ "node_modules/yn": {
1826
+ "version": "3.1.1",
1827
+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
1828
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
1829
+ "engines": {
1830
+ "node": ">=6"
1831
+ }
1832
+ }
1833
+ }
1834
+ }
package.json ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "community-api",
3
+ "version": "1.0.0",
4
+ "description": "A space to store community posts",
5
+ "main": "src/index.mts",
6
+ "scripts": {
7
+ "start": "node --loader ts-node/esm src/index.mts",
8
+ "docker": "npm run docker:build && npm run docker:run",
9
+ "docker:build": "docker build -t community-api .",
10
+ "docker:run": "docker run -it -p 7860:7860 community-api"
11
+ },
12
+ "author": "Julian Bilcke <julian.bilcke@huggingface.co>",
13
+ "license": "Apache License",
14
+ "dependencies": {
15
+ "@gorgonjs/file-provider": "^1.4.1",
16
+ "@gorgonjs/gorgon": "^1.4.1",
17
+ "@types/express": "^4.17.17",
18
+ "@types/uuid": "^9.0.2",
19
+ "eventsource-parser": "^1.0.0",
20
+ "express": "^4.18.2",
21
+ "fs-extra": "^11.1.1",
22
+ "node-fetch": "^3.3.1",
23
+ "resize-base64": "^1.0.12",
24
+ "sharp": "^0.32.4",
25
+ "temp-dir": "^3.0.0",
26
+ "ts-node": "^10.9.1",
27
+ "uuid": "^9.0.0",
28
+ "yaml": "^2.3.1"
29
+ }
30
+ }
samples/un-deux.wav ADDED
Binary file (184 kB). View file
 
src/config.mts ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ import path from "node:path"
2
+
3
+ export const storagePath = `${process.env.STORAGE_PATH || './sandbox'}`
4
+
5
+ export const postDirFilePath = path.join(storagePath, "posts")
6
+
7
+ export const shotFormatVersion = 1
8
+ export const sequenceFormatVersion = 1
src/core/deletePost.mts ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import tmpDir from "temp-dir"
2
+ import { validate as uuidValidate } from "uuid"
3
+
4
+ import { postDirFilePath } from "../config.mts"
5
+ import { deleteFilesWithName } from "../utils/deleteAllFilesWith.mts"
6
+
7
+
8
+ // note: we make sure appId and postId are *VALID*
9
+ // otherwise an attacker could try to delete important files!
10
+ export const deletePost = async (appId: string, postId?: string) => {
11
+ if (!uuidValidate(appId)) {
12
+ throw new Error(`fatal error: appId ${appId} is invalid!`)
13
+ }
14
+
15
+ if (postId && !uuidValidate(postId)) {
16
+ throw new Error(`fatal error: postId ${postId} is invalid!`)
17
+ }
18
+ const id = postId ? `${appId}_${postId}` : appId
19
+
20
+ // this should delete everything, including audio files
21
+ // however we still have some temporary files with a name that is unique:
22
+ // we should probably rename those
23
+ await deleteFilesWithName(tmpDir, id)
24
+ await deleteFilesWithName(postDirFilePath, id)
25
+ }
src/core/getAppPosts.mts ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import { postDirFilePath } from "../config.mts"
2
+ import { Post } from "../types.mts"
3
+
4
+ import { readPostFiles } from "./readPostFiles.mts"
5
+
6
+ export const getAppPosts = async (appId: string): Promise<Post[]> => {
7
+ const posts = await readPostFiles(postDirFilePath, appId)
8
+
9
+ return posts
10
+ }
src/core/getPost.mts ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import path from "node:path"
2
+
3
+ import { postDirFilePath } from "../config.mts"
4
+ import { readPostFile } from "./readPostFile.mts"
5
+ import { Post } from "../types.mts"
6
+
7
+ export const getPost = async (appId: string, postId: string): Promise<Post> => {
8
+ const postFileName = `${appId}_${postId}.json`
9
+
10
+ const postFilePath = path.join(postDirFilePath, postFileName)
11
+
12
+ try {
13
+ const post = await readPostFile(postFilePath)
14
+ return post
15
+ } catch (err) {
16
+ throw new Error(`couldn't find post ${postId} for app ${appId}`)
17
+ }
18
+ }
src/core/readPostFile.mts ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { promises as fs } from "node:fs"
2
+
3
+ import { Post } from "../types.mts"
4
+
5
+ export const readPostFile = async (postFilePath: string): Promise<Post> => {
6
+ const post = JSON.parse(
7
+ await fs.readFile(postFilePath, 'utf8')
8
+ ) as Post
9
+
10
+ return post
11
+ }
src/core/readPostFiles.mts ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import path from "node:path"
2
+ import { promises as fs } from "node:fs"
3
+
4
+ import { Post } from "../types.mts"
5
+ import { readPostFile } from "./readPostFile.mts"
6
+
7
+ export const readPostFiles = async (postDirFilePath: string, appId?: string): Promise<Post[]> => {
8
+
9
+ let postFiles: string[] = []
10
+ try {
11
+ const filesInDir = await fs.readdir(postDirFilePath)
12
+ // console.log("filesInDir:", filesInDir)
13
+
14
+ // we only keep valid files (in UUID.json format)
15
+ postFiles = filesInDir.filter(fileName =>
16
+ fileName.match(/[a-z0-9\-_]\.json/i) && (appId ? fileName.includes(appId): true)
17
+ )
18
+ } catch (err) {
19
+ console.log(`failed to read posts: ${err}`)
20
+ }
21
+
22
+ const posts: Post[] = []
23
+
24
+ for (const postFileName of postFiles) {
25
+ // console.log("postFileName:", postFileName)
26
+ const postFilePath = path.join(postDirFilePath, postFileName)
27
+ try {
28
+ const post = await readPostFile(postFilePath)
29
+ posts.push(post)
30
+ } catch (parsingErr) {
31
+ console.log(`failed to read ${postFileName}: ${parsingErr}`)
32
+ console.log(`deleting corrupted file ${postFileName}`)
33
+ try {
34
+ await fs.unlink(postFilePath)
35
+ } catch (unlinkErr) {
36
+ console.log(`failed to unlink ${postFileName}: ${unlinkErr}`)
37
+ }
38
+ }
39
+ }
40
+
41
+ return posts
42
+ }
src/core/savePost.mts ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { promises as fs } from "node:fs"
2
+ import path from "path"
3
+
4
+ import { Post } from "../types.mts"
5
+ import { postDirFilePath } from "../config.mts"
6
+
7
+ export const savePost = async (post: Post) => {
8
+ const fileName = `${post.appId}_${post.postId}.json`
9
+ const filePath = path.join(postDirFilePath, fileName)
10
+ await fs.writeFile(filePath, JSON.stringify(post, null, 2), "utf8")
11
+ }
src/index.mts ADDED
@@ -0,0 +1,193 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { validate as uuidValidate } from "uuid"
2
+ import express from "express"
3
+
4
+ import { hasValidAuthorization } from "./utils/hasValidAuthorization.mts"
5
+ import { initFolders } from "./initFolders.mts"
6
+ import { getValidNumber } from "./utils/getValidNumber.mts"
7
+ import { Post } from "./types.mts"
8
+ import { savePost } from "./core/savePost.mts"
9
+ import { getAppPosts } from "./core/getAppPosts.mts"
10
+ import { deletePost } from "./core/deletePost.mts"
11
+
12
+ initFolders()
13
+
14
+ const app = express()
15
+ const port = 7860
16
+
17
+ // fix this error: "PayloadTooLargeError: request entity too large"
18
+ // there are multiple version because.. yeah well, it's Express!
19
+ // app.use(bodyParser.json({limit: '50mb'}));
20
+ //app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));
21
+ app.use(express.json({limit: '50mb'}));
22
+ app.use(express.urlencoded({limit: '50mb', extended: true}));
23
+
24
+ app.post("/post", async (req, res) => {
25
+
26
+ if (!hasValidAuthorization(req.headers)) {
27
+ console.log("Invalid authorization")
28
+ res.status(401)
29
+ res.write(JSON.stringify({ error: "invalid token" }))
30
+ res.end()
31
+ return
32
+ }
33
+
34
+ const postId = `${req.body.postId || ""}`
35
+ const appId = `${req.body.appId || ""}`
36
+ const prompt = `${req.body.prompt || ""}`
37
+ const previewUrl = `${req.body.previewUrl || ""}`
38
+ const assetUrl = `${req.body.assetUrl || ""}`
39
+ const createdAt = `${req.body.createdAt || ""}`
40
+ const upvotes = getValidNumber(req.body.upvotes, 0, 1e15, 0)
41
+ const downvotes = getValidNumber(req.body.upvotes, 0, 1e15, 0)
42
+
43
+ if (!uuidValidate(postId)) {
44
+ console.error(`invalid postId ${postId}`)
45
+ res.status(400)
46
+ res.write(JSON.stringify({ error: `invalid postId ${postId}` }))
47
+ res.end()
48
+ return
49
+ }
50
+
51
+ if (!uuidValidate(appId)) {
52
+ console.error(`invalid appId ${appId}`)
53
+ res.status(400)
54
+ res.write(JSON.stringify({ error: `invalid appId ${appId}` }))
55
+ res.end()
56
+ return
57
+ }
58
+
59
+ if (!prompt.length) {
60
+ console.error(`invalid prompt length: cannot be zero`)
61
+ res.status(400)
62
+ res.write(JSON.stringify({ error: `invalid prompt length: cannot be zero` }))
63
+ res.end()
64
+ return
65
+ }
66
+
67
+ if (!previewUrl.length) {
68
+ console.error(`invalid preview URL length: cannot be zero`)
69
+ res.status(400)
70
+ res.write(JSON.stringify({ error: `invalid preview URL length: cannot be zero` }))
71
+ res.end()
72
+ return
73
+ }
74
+
75
+ if (!assetUrl.length) {
76
+ console.error(`invalid asset URL length: cannot be zero`)
77
+ res.status(400)
78
+ res.write(JSON.stringify({ error: `invalid asset URL length: cannot be zero` }))
79
+ res.end()
80
+ return
81
+ }
82
+
83
+ const post: Post = {
84
+ postId,
85
+ appId,
86
+ prompt,
87
+ previewUrl,
88
+ assetUrl,
89
+ createdAt,
90
+ upvotes,
91
+ downvotes,
92
+ }
93
+
94
+ try {
95
+ await savePost(post)
96
+ } catch (err) {
97
+ console.error(`failed to save the post: ${err}`)
98
+ res.status(400)
99
+ res.write(JSON.stringify({ error: `failed to save the post: ${err}` }))
100
+ res.end()
101
+ return
102
+ }
103
+
104
+ const cachedJson = JSON.stringify(post)
105
+ // console.log(`request ${request} is in cache!`)
106
+ res.status(200)
107
+ res.write(cachedJson)
108
+ res.end()
109
+ })
110
+
111
+ app.get("/posts/:appId", async (req, res) => {
112
+
113
+ const appId = `${req.params.appId}`
114
+
115
+ if (!uuidValidate(appId)) {
116
+ console.error("invalid appId")
117
+ res.status(400)
118
+ res.write(JSON.stringify({ error: `invalid appId` }))
119
+ res.end()
120
+ return
121
+ }
122
+
123
+ try {
124
+ const posts = await getAppPosts(appId)
125
+ res.status(200)
126
+ res.write(JSON.stringify({ posts }))
127
+ res.end()
128
+ return
129
+ } catch (err) {
130
+ const error = `failed to load the posts: ${err}`
131
+ console.error(error)
132
+ res.status(500)
133
+ res.write(JSON.stringify({ posts: [], error }))
134
+ res.end()
135
+ return
136
+ }
137
+ })
138
+
139
+ // get metadata (json)
140
+ app.delete("/posts/:appId/:postId", async (req, res) => {
141
+
142
+ if (!hasValidAuthorization(req.headers)) {
143
+ console.log("Invalid authorization")
144
+ res.status(401)
145
+ res.write(JSON.stringify({ error: "invalid token" }))
146
+ res.end()
147
+ return
148
+ }
149
+
150
+ const appId = req.params.appId
151
+
152
+ if (!uuidValidate(appId)) {
153
+ console.error("invalid appId")
154
+ res.status(400)
155
+ res.write(JSON.stringify({ error: `invalid appId` }))
156
+ res.end()
157
+ return
158
+ }
159
+
160
+ const postId = req.params.postId
161
+
162
+ if (!uuidValidate(postId)) {
163
+ console.error("invalid postId")
164
+ res.status(400)
165
+ res.write(JSON.stringify({ error: `invalid postId` }))
166
+ res.end()
167
+ return
168
+ }
169
+
170
+ try {
171
+ const post = await deletePost(appId, postId)
172
+ res.status(200)
173
+ res.write(JSON.stringify(post))
174
+ res.end()
175
+ } catch (err) {
176
+ console.error(err)
177
+ res.status(404)
178
+ res.write(JSON.stringify({ error: "couldn't delete this post" }))
179
+ res.end()
180
+ }
181
+ })
182
+
183
+ app.get("/", async (req, res) => {
184
+ // this is what users will see in the space - but no need to show something scary
185
+ res.status(200)
186
+ res.write(`<html><head></head><body>
187
+ Community is a micro-service used to manage community posts for my various spaces.
188
+ It is used by <a href="https://jbilcke-hf-panoremix.hf.space" target="_blank">Panoremix</a>, a generative panorama app.
189
+ </body></html>`)
190
+ res.end()
191
+ })
192
+
193
+ app.listen(port, () => { console.log(`Open http://localhost:${port}`) })
src/initFolders.mts ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ import {
2
+ postDirFilePath
3
+ } from "./config.mts"
4
+ import { createDirIfNeeded } from "./utils/createDirIfNeeded.mts"
5
+
6
+ export const initFolders = () => {
7
+ console.log(`initializing folders..`)
8
+ createDirIfNeeded(postDirFilePath)
9
+ }
src/types.mts ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+
3
+ export interface Post {
4
+ postId: string
5
+ appId: string
6
+ prompt: string
7
+ previewUrl: string
8
+ assetUrl: string
9
+ createdAt: string
10
+ upvotes: number
11
+ downvotes: number
12
+ }
13
+
14
+ export type PostAPIResponse = {
15
+ success?: boolean
16
+ error?: string
17
+ post: Post
18
+ }
19
+
20
+ export type PostAPIRequest = Partial<Post>
src/utils/createDirIfNeeded.mts ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ import { existsSync, mkdirSync } from "node:fs"
2
+
3
+ export const createDirIfNeeded = (dirPath: string) => {
4
+ if (!existsSync(dirPath)) {
5
+ mkdirSync(dirPath, { recursive: true })
6
+ }
7
+ }
src/utils/debouncePromise.mts ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+
3
+ Here's how you can use the `debouncePromise` function:
4
+
5
+ ```typescript
6
+ async function fetchData(query: string): Promise<string> {
7
+ // Simulating an API call
8
+ return new Promise((resolve) => {
9
+ setTimeout(() => {
10
+ resolve(`Results for ${query}`);
11
+ }, 500);
12
+ });
13
+ }
14
+
15
+ const debouncedFetchData = debouncePromise(fetchData, 300);
16
+
17
+ (async () => {
18
+ try {
19
+ console.log(await debouncedFetchData("query 1")); // This will be ignored
20
+ console.log(await debouncedFetchData("query 2")); // This will be ignored
21
+ console.log(await debouncedFetchData("query 3")); // This will return "Results for query 3"
22
+ } catch (error) {
23
+ console.error(error);
24
+ }
25
+ })();
26
+ ```
27
+
28
+ The `debouncePromise` function takes a Promise-based function `func` and a `wait` time as its arguments.
29
+ It returns a debounced version of the given function that, when called multiple times within the specified wait time, will only execute the last call.
30
+ */
31
+
32
+ type DebouncedFunction<T extends any[], R> = ((...args: T) => R) & {
33
+ clear: () => void
34
+ }
35
+
36
+ export function debouncePromise<T extends any[], R>(
37
+ func: (...args: T) => Promise<R>,
38
+ wait: number
39
+ ): DebouncedFunction<T, Promise<R | undefined>> {
40
+ let timeout: NodeJS.Timeout | undefined
41
+
42
+ const debounced = (...args: T) => {
43
+ return new Promise<R | undefined>((resolve, reject) => {
44
+ if (timeout) {
45
+ clearTimeout(timeout)
46
+ }
47
+
48
+ timeout = setTimeout(async () => {
49
+ try {
50
+ const result = await func(...args)
51
+ resolve(result)
52
+ } catch (error) {
53
+ reject(error)
54
+ }
55
+ }, wait)
56
+ })
57
+ }
58
+
59
+ debounced.clear = () => {
60
+ if (timeout) {
61
+ clearTimeout(timeout)
62
+ }
63
+ }
64
+
65
+ return debounced
66
+ }
src/utils/debounceSync.mts ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ type DebouncedFunctionSync<T extends any[], R> = ((...args: T) => R) & {
2
+ clear: () => void
3
+ }
4
+
5
+ /**
6
+ * Example usage:
7
+ * ```typescript
8
+ * function fetchDataSync(query: string): string {
9
+ * return `Results for ${query}`;
10
+ * }
11
+ *
12
+ * const debouncedFetchDataSync = debounceSync(fetchDataSync, 300);
13
+ *
14
+ * try {
15
+ * console.log(debouncedFetchDataSync("query 1")); // This will be ignored
16
+ * console.log(debouncedFetchDataSync("query 2")); // This will be ignored
17
+ * console.log(debouncedFetchDataSync("query 3")); // This will return "Results for query 3"
18
+ * } catch (error) {
19
+ * console.error(error);
20
+ * }
21
+ * ```
22
+ *
23
+ * Note that the synchronous version of the debounce function will return
24
+ * the result of the last function call or `undefined` if the function was
25
+ * not called within the specified wait time. You should also be aware that
26
+ * this synchronous version may cause blocking if the debounced function
27
+ * takes a long time to execute.
28
+ *
29
+ * @param func
30
+ * @param wait
31
+ * @returns
32
+ */
33
+ export function debounceSync<T extends any[], R>(
34
+ func: (...args: T) => R,
35
+ wait: number
36
+ ): DebouncedFunctionSync<T, R | undefined> {
37
+ let timeout: NodeJS.Timeout | undefined
38
+
39
+ const debounced = (...args: T): R | undefined => {
40
+ if (timeout) {
41
+ clearTimeout(timeout)
42
+ }
43
+
44
+ let result: R | undefined
45
+ timeout = setTimeout(() => {
46
+ result = func(...args)
47
+ }, wait)
48
+
49
+ return result
50
+ }
51
+
52
+ debounced.clear = () => {
53
+ if (timeout) {
54
+ clearTimeout(timeout)
55
+ }
56
+ }
57
+
58
+ return debounced
59
+ }
src/utils/deleteAllFilesWith.mts ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { promises as fs } from "node:fs"
2
+ import path from "node:path"
3
+
4
+ export const deleteFilesWithName = async (dir: string, name: string) => {
5
+ for (const file of await fs.readdir(dir)) {
6
+ if (file.includes(name)) {
7
+ const filePath = path.join(dir, file)
8
+ try {
9
+ await fs.unlink(filePath)
10
+ } catch (err) {
11
+ console.error(`failed to unlink file in ${filePath}: ${err}`)
12
+ }
13
+ }
14
+ }
15
+ }
src/utils/deleteFileIfExists.mts ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { existsSync, promises as fs } from "node:fs"
2
+
3
+ export const deleteFileIfExists = async (filePath: string) => {
4
+ // this function scares me a bit,
5
+ if (filePath === "/" || filePath === "~" || filePath === ".") {
6
+ throw new Error(`lol, no.`)
7
+ }
8
+
9
+ if (existsSync(filePath)) {
10
+ try {
11
+ await fs.unlink(filePath)
12
+ return true
13
+ } catch (err) {
14
+ console.log(`failed to delete file ${filePath}`)
15
+ }
16
+ }
17
+ return false
18
+ }
src/utils/downloadFileAsBase64.mts ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export const downloadImageAsBase64 = async (remoteUrl: string): Promise<string> => {
2
+ const controller = new AbortController()
3
+
4
+ // download the image
5
+ const response = await fetch(remoteUrl, {
6
+ signal: controller.signal
7
+ })
8
+
9
+ // get as Buffer
10
+ const arrayBuffer = await response.arrayBuffer()
11
+ const buffer = Buffer.from(arrayBuffer)
12
+
13
+ // convert it to base64
14
+ const base64 = buffer.toString('base64')
15
+
16
+ return base64
17
+ };
src/utils/downloadFileToTmp.mts ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import path from "node:path"
2
+ import fs from "node:fs"
3
+
4
+ import tmpDir from "temp-dir"
5
+
6
+ export const downloadFileToTmp = async (remoteUrl: string, fileName: string) => {
7
+
8
+ const filePath = path.resolve(tmpDir, fileName)
9
+
10
+ const controller = new AbortController()
11
+ const timeoutId = setTimeout(() => controller.abort(), 15 * 60 * 60 * 1000) // 15 minutes
12
+
13
+ // TODO finish the timeout?
14
+
15
+ // download the file
16
+ const response = await fetch(remoteUrl, {
17
+ signal: controller.signal
18
+ })
19
+
20
+ // write it to the disk
21
+ const arrayBuffer = await response.arrayBuffer()
22
+
23
+ await fs.promises.writeFile(
24
+ filePath,
25
+ Buffer.from(arrayBuffer)
26
+ )
27
+
28
+ return filePath
29
+ }
src/utils/getValidBoolean.mts ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ export const getValidBoolean = (something: any, defaultValue: boolean) => {
2
+ if (typeof something === "boolean") {
3
+ return something
4
+ }
5
+
6
+ const strValue = `${something || defaultValue}`.toLowerCase()
7
+
8
+ return strValue === "true" || strValue === "1" || strValue === "on"
9
+ }
src/utils/getValidNumber.mts ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ export const getValidNumber = (something: any, minValue: number, maxValue: number, defaultValue: number) => {
2
+ const strValue = `${something || defaultValue}`
3
+ const numValue = Number(strValue)
4
+ const isValid = !isNaN(numValue) && isFinite(numValue)
5
+ if (!isValid) {
6
+ return defaultValue
7
+ }
8
+ return Math.max(minValue, Math.min(maxValue, numValue))
9
+
10
+ }
src/utils/getValidResolution.mts ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { getValidNumber } from "./getValidNumber.mts"
2
+
3
+ export const getValidResolution = (something: any) => {
4
+ const strValue = `${something || ''}`
5
+ const chunks = strValue.split('x')
6
+
7
+ if (chunks.length !== 2) {
8
+ return `1280x720`
9
+ }
10
+
11
+ const [widthStr, heightStr] = chunks
12
+ const width = getValidNumber(widthStr, 256, 1280, 1280)
13
+ const height = getValidNumber(widthStr, 256, 720, 720)
14
+
15
+ return `${width}x${height}`
16
+ }
src/utils/hasValidAuthorization.mts ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import { IncomingHttpHeaders } from "node:http"
2
+
3
+ export const hasValidAuthorization = (headers: IncomingHttpHeaders) => {
4
+ const [_, token] = `${headers.authorization || ""}`.split(" ")
5
+ if (typeof token === "string" && token.trim() === process.env.SECRET_ACCESS_TOKEN.trim()) {
6
+ return true
7
+ }
8
+
9
+ return false
10
+ }
src/utils/hashRequest.mts ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { RenderRequest } from "../types.mts"
2
+ import { computeSha256 } from "./computeSha256.mts"
3
+
4
+ export function hashRequest(request: RenderRequest) {
5
+
6
+ // we ignore the commands associated to cache and stuff
7
+ const hashable = {
8
+ version: 1,
9
+ prompt: request.prompt,
10
+ segmentation: request.segmentation,
11
+ actionnables: request.actionnables,
12
+ nbFrames: request.nbFrames,
13
+ nbSteps: request.nbSteps,
14
+ // seed: request.seed,
15
+ width: request.width,
16
+ height: request.height,
17
+ projection: request.projection,
18
+ }
19
+
20
+ const requestJson = JSON.stringify(hashable)
21
+ const hash = computeSha256(requestJson)
22
+
23
+ return hash
24
+ }
src/utils/moveFile.mts ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { promises as fs } from "node:fs"
2
+
3
+ // a function to move a file
4
+ // this implementation is safe to use on a Hugging Face Space
5
+ // for instance when copying from one disk to another
6
+ // (we cannot use fs.rename in that case)
7
+ export const moveFile = async (sourceFilePath: string, targetFilePath: string) => {
8
+ await fs.copyFile(sourceFilePath, targetFilePath)
9
+ console.log(`moved file from ${sourceFilePath} to ${targetFilePath}`)
10
+ try {
11
+ await fs.unlink(sourceFilePath)
12
+ } catch (err) {
13
+ console.log("moveFile: failed to cleanup (no big deal..)")
14
+ }
15
+ }
src/utils/randomShuffle.mts ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ export function randomShuffle<T>(array: T[]): T[] {
2
+ for (let i = array.length - 1; i > 0; i--) {
3
+ const j = Math.floor(Math.random() * (i + 1));
4
+ [array[i], array[j]] = [array[j], array[i]];
5
+ }
6
+
7
+ return array
8
+ };
src/utils/sleep.mts ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ export const sleep = async (durationInMs: number) =>
2
+ new Promise((resolve) => {
3
+ setTimeout(() => {
4
+ resolve(true)
5
+ }, durationInMs)
6
+ })
tsconfig.json ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "allowJs": true,
4
+ "esModuleInterop": true,
5
+ "allowSyntheticDefaultImports": true,
6
+ "module": "nodenext",
7
+ "noEmit": true,
8
+ "allowImportingTsExtensions": true,
9
+ "target": "es2022"
10
+ },
11
+ "include": ["**/*.ts", "**/*.mts"],
12
+ }