├── .github └── ISSUE_TEMPLATE │ ├── 01_bug-report.md │ ├── 02_feature-request.md │ └── 03_public_instance.md ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Cartograph.md ├── LICENSE ├── README.md ├── backend ├── Cargo.lock ├── Cargo.toml ├── config.example.json ├── migrations │ └── 000_single_view.sql ├── schema.sql └── src │ ├── config.rs │ ├── main.rs │ ├── models.rs │ └── routes.rs ├── example.nginx └── frontend ├── .prettierrc.json ├── .yarnrc.yml ├── config.example.json ├── favicon.svg ├── fonts ├── CartographCF-Regular.woff2 ├── CartographCF-RegularItalic.woff2 └── FiraCode-VF.woff2 ├── index.html ├── index.pug ├── min └── rosepine.min.css ├── package.json ├── src ├── env.d.ts ├── icons.ts ├── index.ts └── tsconfig.json ├── style ├── font-fira.scss ├── font.scss ├── style.scss └── tooltip.scss ├── vite.config.ts └── yarn.lock /.github/ISSUE_TEMPLATE/01_bug-report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 🐛 Bug Report 3 | about: Create a report to help us improve 4 | title: '🐛 ' 5 | labels: bug 6 | assignees: '' 7 | --- 8 | 9 | 13 | 14 | ## 💡 Summary 15 | 16 | 17 | 18 | ## 🥰 Expected Behavior 19 | 20 | 21 | 22 | ## 🤬 Actual Behavior 23 | 24 | 25 | 26 | ## 📝 Steps to Reproduce 27 | 28 | 1. 29 | 2. 30 | 3. 31 | 32 | ## 📌 Environment 33 | 34 | 35 | 36 | zer0bin version: 37 | Your OS: 38 | Your browser: 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/02_feature-request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: ✨ Feature Request 3 | about: Suggest an idea for this project 4 | title: '✨ ' 5 | labels: feature request 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## Summary 11 | 12 | 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/03_public_instance.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 🚀 Public instance 3 | about: Submit a public instance 4 | title: '🚀 ' 5 | labels: public instance 6 | 7 | --- 8 | 9 | 12 | 13 | ## Details 14 | 15 | - Domain name: 16 | - What country is the server in: 17 | - What server hardware/provider is the server on: 18 | - Are you using CloudFlare or any Google services (domain, DNS, etc): 19 | - What version of zer0bin is it running: 20 | - Have you made any modifications to zer0bin? If so, what?: 21 | - What are the ratelimits: 22 | - What is the expiration time of pastes: 23 | - What is the max paste size: 24 | 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | **/target/ 2 | **/.yarn 3 | **/node_modules/ 4 | **/dist/ 5 | **/.parcel-cache/ 6 | **/config.json 7 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | - Demonstrating empathy and kindness toward other people 21 | - Being respectful of differing opinions, viewpoints, and experiences 22 | - Giving and gracefully accepting constructive feedback 23 | - Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | - Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | - The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | - Trolling, insulting or derogatory comments, and personal or political attacks 33 | - Public or private harassment 34 | - Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | - Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | dominic@domm.me. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing Guidelines 2 | 3 | - Follow the repository structure 4 | - Commit messages must be descriptive and concise 5 | - Your code must be formatted with the formatters we use 6 | - The frontend must use our `prettier` config 7 | - The backend must use `rustfmt` 8 | - The frontend must be installed with `yarn` and compiled with `parcel` 9 | - Additional frontend packages must not be considered bloated 10 | - All commits must follow [Conventional Commits](https://marketplace.visualstudio.com/items?itemName=vivaxy.vscode-conventional-commits) 11 | -------------------------------------------------------------------------------- /Cartograph.md: -------------------------------------------------------------------------------- 1 | "Wait, but isn't Cartograph CF a paid font you need a license for?" 2 | 3 | ![You](https://c.tenor.com/Mxgk7rxrzq8AAAAC/lithiumare-kiracord.gif) 4 | 5 | # Ok but fr 6 | 7 | People have been pirating Cartograph CF for a looong time, but if you would like to use Fira Code (a free font) instead: 8 | 1. `cd frontend` 9 | 2. `mv style/font-fira.scss style/font.scss` 10 | 3. Rebuild frontend 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2022 Domterion, ThatOneCalculator 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 |
7 |
8 | Just a place to paste 9 |
10 |
11 |

12 | 13 | Stargazers 14 | 15 | Wiki 16 | 17 | Releases 18 | 19 | License 20 | 21 | Issues 22 |

23 |
24 |
25 | 26 | # Features 27 | 28 | - ✨ Code highlighting and line numbers (default) 29 | - 📖 Markdown rendering (click the Markdown button) 30 | - 🔥 Single-view pastes (click the Fire button) 31 | - ‍🧑‍💻 [CLI Client](https://github.com/zer0bin-dev/zer0) 32 | - 🚀 Easily selfhostable 33 | - 👀 View counter 34 | - ⌨️ Keybinds 35 | - Ctrl + S: save paste 36 | - Ctrl + N: new paste 37 | - Ctrl + D: duplicate paste 38 | - Ctrl + M: toggle markdown mode 39 | - 📱 Mobile-friendly UI 40 | - 🧈 Super smooth scrolling 41 | - 🖼️ Badge generation for stats (seen below) 42 | 43 | # Public instances 44 | 45 | Submit your public instance [here](https://github.com/Domterion/zer0bin/issues/new?assignees=&labels=&template=03_public_instance.md&title=%F0%9F%9A%80+)! 46 | 47 | | URL | Expiration | Max paste size | Total Pastes | Version | Country | 48 | | ---------------------------------------------- | ---------- | -------------- | -------------------------------------------- | --------------------------------------------- | ------- | 49 | | [paste.mint.lgbt](https://paste.mint.lgbt) | 30 days | 50,000 chars | ![pastes](https://paste.mint.lgbt/api/b/t) | ![version](https://paste.mint.lgbt/api/b/v) | 🇨🇱 Chile | 50 | 51 | 52 | # Technologies used 53 | 54 | ### Frontend: 55 | 56 |
57 | 58 | ### Backend: 59 | 60 | 61 | 62 | ### Misc: 63 | 64 | 65 | 66 | ###### (Sorta) made with [Skill Icons](https://skillicons.dev/) 67 | 68 | # More info 69 | 70 | ### Looking for API reference, self-hosting instructions, and/or benchmarks? 71 | 72 | 73 | Stargazers 74 | 75 | # Contributing 76 | 77 | See [CONTRIBUTING.md](./CONTRIBUTING.md) 78 | -------------------------------------------------------------------------------- /backend/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "actix-codec" 7 | version = "0.5.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "57a7559404a7f3573127aab53c08ce37a6c6a315c374a31070f3c91cd1b4a7fe" 10 | dependencies = [ 11 | "bitflags", 12 | "bytes", 13 | "futures-core", 14 | "futures-sink", 15 | "log", 16 | "memchr", 17 | "pin-project-lite", 18 | "tokio", 19 | "tokio-util", 20 | ] 21 | 22 | [[package]] 23 | name = "actix-cors" 24 | version = "0.6.1" 25 | source = "registry+https://github.com/rust-lang/crates.io-index" 26 | checksum = "414360eed71ba2d5435b185ba43ecbe281dfab5df3898286d6b7be8074372c92" 27 | dependencies = [ 28 | "actix-utils", 29 | "actix-web", 30 | "derive_more", 31 | "futures-util", 32 | "log", 33 | "once_cell", 34 | "smallvec", 35 | ] 36 | 37 | [[package]] 38 | name = "actix-governor" 39 | version = "0.3.0" 40 | source = "registry+https://github.com/rust-lang/crates.io-index" 41 | checksum = "5c301a901d90b7a1ea575aacd21ac02d1210f546f00f2291cdfada51c76f92de" 42 | dependencies = [ 43 | "actix-http", 44 | "actix-web", 45 | "futures", 46 | "governor", 47 | ] 48 | 49 | [[package]] 50 | name = "actix-http" 51 | version = "3.0.4" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "a5885cb81a0d4d0d322864bea1bb6c2a8144626b4fdc625d4c51eba197e7797a" 54 | dependencies = [ 55 | "actix-codec", 56 | "actix-rt", 57 | "actix-service", 58 | "actix-utils", 59 | "ahash", 60 | "base64", 61 | "bitflags", 62 | "brotli", 63 | "bytes", 64 | "bytestring", 65 | "derive_more", 66 | "encoding_rs", 67 | "flate2", 68 | "futures-core", 69 | "h2", 70 | "http", 71 | "httparse", 72 | "httpdate", 73 | "itoa 1.0.1", 74 | "language-tags", 75 | "local-channel", 76 | "log", 77 | "mime", 78 | "percent-encoding", 79 | "pin-project-lite", 80 | "rand", 81 | "sha-1 0.10.0", 82 | "smallvec", 83 | "zstd", 84 | ] 85 | 86 | [[package]] 87 | name = "actix-macros" 88 | version = "0.2.3" 89 | source = "registry+https://github.com/rust-lang/crates.io-index" 90 | checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6" 91 | dependencies = [ 92 | "quote", 93 | "syn", 94 | ] 95 | 96 | [[package]] 97 | name = "actix-router" 98 | version = "0.5.0" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "eb60846b52c118f2f04a56cc90880a274271c489b2498623d58176f8ca21fa80" 101 | dependencies = [ 102 | "bytestring", 103 | "firestorm", 104 | "http", 105 | "log", 106 | "regex", 107 | "serde", 108 | ] 109 | 110 | [[package]] 111 | name = "actix-rt" 112 | version = "2.7.0" 113 | source = "registry+https://github.com/rust-lang/crates.io-index" 114 | checksum = "7ea16c295198e958ef31930a6ef37d0fb64e9ca3b6116e6b93a8bdae96ee1000" 115 | dependencies = [ 116 | "actix-macros", 117 | "futures-core", 118 | "tokio", 119 | ] 120 | 121 | [[package]] 122 | name = "actix-server" 123 | version = "2.1.1" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | checksum = "0da34f8e659ea1b077bb4637948b815cd3768ad5a188fdcd74ff4d84240cd824" 126 | dependencies = [ 127 | "actix-rt", 128 | "actix-service", 129 | "actix-utils", 130 | "futures-core", 131 | "futures-util", 132 | "mio", 133 | "num_cpus", 134 | "socket2", 135 | "tokio", 136 | "tracing", 137 | ] 138 | 139 | [[package]] 140 | name = "actix-service" 141 | version = "2.0.2" 142 | source = "registry+https://github.com/rust-lang/crates.io-index" 143 | checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" 144 | dependencies = [ 145 | "futures-core", 146 | "paste", 147 | "pin-project-lite", 148 | ] 149 | 150 | [[package]] 151 | name = "actix-utils" 152 | version = "3.0.0" 153 | source = "registry+https://github.com/rust-lang/crates.io-index" 154 | checksum = "e491cbaac2e7fc788dfff99ff48ef317e23b3cf63dbaf7aaab6418f40f92aa94" 155 | dependencies = [ 156 | "local-waker", 157 | "pin-project-lite", 158 | ] 159 | 160 | [[package]] 161 | name = "actix-web" 162 | version = "4.0.1" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | checksum = "f4e5ebffd51d50df56a3ae0de0e59487340ca456f05dd0b90c0a7a6dd6a74d31" 165 | dependencies = [ 166 | "actix-codec", 167 | "actix-http", 168 | "actix-macros", 169 | "actix-router", 170 | "actix-rt", 171 | "actix-server", 172 | "actix-service", 173 | "actix-utils", 174 | "actix-web-codegen", 175 | "ahash", 176 | "bytes", 177 | "bytestring", 178 | "cfg-if", 179 | "cookie", 180 | "derive_more", 181 | "encoding_rs", 182 | "futures-core", 183 | "futures-util", 184 | "itoa 1.0.1", 185 | "language-tags", 186 | "log", 187 | "mime", 188 | "once_cell", 189 | "pin-project-lite", 190 | "regex", 191 | "serde", 192 | "serde_json", 193 | "serde_urlencoded", 194 | "smallvec", 195 | "socket2", 196 | "time 0.3.9", 197 | "url", 198 | ] 199 | 200 | [[package]] 201 | name = "actix-web-codegen" 202 | version = "4.0.0" 203 | source = "registry+https://github.com/rust-lang/crates.io-index" 204 | checksum = "7525bedf54704abb1d469e88d7e7e9226df73778798a69cea5022d53b2ae91bc" 205 | dependencies = [ 206 | "actix-router", 207 | "proc-macro2", 208 | "quote", 209 | "syn", 210 | ] 211 | 212 | [[package]] 213 | name = "adler" 214 | version = "1.0.2" 215 | source = "registry+https://github.com/rust-lang/crates.io-index" 216 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 217 | 218 | [[package]] 219 | name = "ahash" 220 | version = "0.7.6" 221 | source = "registry+https://github.com/rust-lang/crates.io-index" 222 | checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" 223 | dependencies = [ 224 | "getrandom", 225 | "once_cell", 226 | "version_check", 227 | ] 228 | 229 | [[package]] 230 | name = "aho-corasick" 231 | version = "0.7.18" 232 | source = "registry+https://github.com/rust-lang/crates.io-index" 233 | checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" 234 | dependencies = [ 235 | "memchr", 236 | ] 237 | 238 | [[package]] 239 | name = "alloc-no-stdlib" 240 | version = "2.0.3" 241 | source = "registry+https://github.com/rust-lang/crates.io-index" 242 | checksum = "35ef4730490ad1c4eae5c4325b2a95f521d023e5c885853ff7aca0a6a1631db3" 243 | 244 | [[package]] 245 | name = "alloc-stdlib" 246 | version = "0.2.1" 247 | source = "registry+https://github.com/rust-lang/crates.io-index" 248 | checksum = "697ed7edc0f1711de49ce108c541623a0af97c6c60b2f6e2b65229847ac843c2" 249 | dependencies = [ 250 | "alloc-no-stdlib", 251 | ] 252 | 253 | [[package]] 254 | name = "atoi" 255 | version = "0.4.0" 256 | source = "registry+https://github.com/rust-lang/crates.io-index" 257 | checksum = "616896e05fc0e2649463a93a15183c6a16bf03413a7af88ef1285ddedfa9cda5" 258 | dependencies = [ 259 | "num-traits", 260 | ] 261 | 262 | [[package]] 263 | name = "autocfg" 264 | version = "1.1.0" 265 | source = "registry+https://github.com/rust-lang/crates.io-index" 266 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 267 | 268 | [[package]] 269 | name = "backend" 270 | version = "1.1.1" 271 | dependencies = [ 272 | "actix-cors", 273 | "actix-governor", 274 | "actix-rt", 275 | "actix-web", 276 | "badge-maker", 277 | "chrono", 278 | "nanoid", 279 | "serde", 280 | "serde_json", 281 | "sqlx", 282 | ] 283 | 284 | [[package]] 285 | name = "badge-maker" 286 | version = "0.2.1" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "383647c1ae7388c2801ef995f6de2f9551a361ad637f2a0e4fea41c51dd37b81" 289 | dependencies = [ 290 | "aho-corasick", 291 | "bincode", 292 | "itoa 0.4.8", 293 | "lazy_static", 294 | "regex", 295 | "seahash", 296 | "serde", 297 | "thiserror", 298 | ] 299 | 300 | [[package]] 301 | name = "base64" 302 | version = "0.13.0" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 305 | 306 | [[package]] 307 | name = "bincode" 308 | version = "1.3.3" 309 | source = "registry+https://github.com/rust-lang/crates.io-index" 310 | checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" 311 | dependencies = [ 312 | "serde", 313 | ] 314 | 315 | [[package]] 316 | name = "bitflags" 317 | version = "1.3.2" 318 | source = "registry+https://github.com/rust-lang/crates.io-index" 319 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 320 | 321 | [[package]] 322 | name = "block-buffer" 323 | version = "0.9.0" 324 | source = "registry+https://github.com/rust-lang/crates.io-index" 325 | checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" 326 | dependencies = [ 327 | "generic-array", 328 | ] 329 | 330 | [[package]] 331 | name = "block-buffer" 332 | version = "0.10.2" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" 335 | dependencies = [ 336 | "generic-array", 337 | ] 338 | 339 | [[package]] 340 | name = "brotli" 341 | version = "3.3.4" 342 | source = "registry+https://github.com/rust-lang/crates.io-index" 343 | checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" 344 | dependencies = [ 345 | "alloc-no-stdlib", 346 | "alloc-stdlib", 347 | "brotli-decompressor", 348 | ] 349 | 350 | [[package]] 351 | name = "brotli-decompressor" 352 | version = "2.3.2" 353 | source = "registry+https://github.com/rust-lang/crates.io-index" 354 | checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80" 355 | dependencies = [ 356 | "alloc-no-stdlib", 357 | "alloc-stdlib", 358 | ] 359 | 360 | [[package]] 361 | name = "bumpalo" 362 | version = "3.9.1" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" 365 | 366 | [[package]] 367 | name = "byteorder" 368 | version = "1.4.3" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 371 | 372 | [[package]] 373 | name = "bytes" 374 | version = "1.1.0" 375 | source = "registry+https://github.com/rust-lang/crates.io-index" 376 | checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" 377 | 378 | [[package]] 379 | name = "bytestring" 380 | version = "1.0.0" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "90706ba19e97b90786e19dc0d5e2abd80008d99d4c0c5d1ad0b5e72cec7c494d" 383 | dependencies = [ 384 | "bytes", 385 | ] 386 | 387 | [[package]] 388 | name = "cc" 389 | version = "1.0.73" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" 392 | dependencies = [ 393 | "jobserver", 394 | ] 395 | 396 | [[package]] 397 | name = "cfg-if" 398 | version = "1.0.0" 399 | source = "registry+https://github.com/rust-lang/crates.io-index" 400 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 401 | 402 | [[package]] 403 | name = "chrono" 404 | version = "0.4.19" 405 | source = "registry+https://github.com/rust-lang/crates.io-index" 406 | checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" 407 | dependencies = [ 408 | "libc", 409 | "num-integer", 410 | "num-traits", 411 | "serde", 412 | "time 0.1.44", 413 | "winapi", 414 | ] 415 | 416 | [[package]] 417 | name = "convert_case" 418 | version = "0.4.0" 419 | source = "registry+https://github.com/rust-lang/crates.io-index" 420 | checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 421 | 422 | [[package]] 423 | name = "cookie" 424 | version = "0.16.0" 425 | source = "registry+https://github.com/rust-lang/crates.io-index" 426 | checksum = "94d4706de1b0fa5b132270cddffa8585166037822e260a944fe161acd137ca05" 427 | dependencies = [ 428 | "percent-encoding", 429 | "time 0.3.9", 430 | "version_check", 431 | ] 432 | 433 | [[package]] 434 | name = "cpufeatures" 435 | version = "0.2.2" 436 | source = "registry+https://github.com/rust-lang/crates.io-index" 437 | checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" 438 | dependencies = [ 439 | "libc", 440 | ] 441 | 442 | [[package]] 443 | name = "crc" 444 | version = "2.1.0" 445 | source = "registry+https://github.com/rust-lang/crates.io-index" 446 | checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23" 447 | dependencies = [ 448 | "crc-catalog", 449 | ] 450 | 451 | [[package]] 452 | name = "crc-catalog" 453 | version = "1.1.1" 454 | source = "registry+https://github.com/rust-lang/crates.io-index" 455 | checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" 456 | 457 | [[package]] 458 | name = "crc32fast" 459 | version = "1.3.2" 460 | source = "registry+https://github.com/rust-lang/crates.io-index" 461 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 462 | dependencies = [ 463 | "cfg-if", 464 | ] 465 | 466 | [[package]] 467 | name = "crossbeam-queue" 468 | version = "0.3.5" 469 | source = "registry+https://github.com/rust-lang/crates.io-index" 470 | checksum = "1f25d8400f4a7a5778f0e4e52384a48cbd9b5c495d110786187fc750075277a2" 471 | dependencies = [ 472 | "cfg-if", 473 | "crossbeam-utils", 474 | ] 475 | 476 | [[package]] 477 | name = "crossbeam-utils" 478 | version = "0.8.8" 479 | source = "registry+https://github.com/rust-lang/crates.io-index" 480 | checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" 481 | dependencies = [ 482 | "cfg-if", 483 | "lazy_static", 484 | ] 485 | 486 | [[package]] 487 | name = "crypto-common" 488 | version = "0.1.3" 489 | source = "registry+https://github.com/rust-lang/crates.io-index" 490 | checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" 491 | dependencies = [ 492 | "generic-array", 493 | "typenum", 494 | ] 495 | 496 | [[package]] 497 | name = "crypto-mac" 498 | version = "0.11.1" 499 | source = "registry+https://github.com/rust-lang/crates.io-index" 500 | checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" 501 | dependencies = [ 502 | "generic-array", 503 | "subtle", 504 | ] 505 | 506 | [[package]] 507 | name = "dashmap" 508 | version = "5.2.0" 509 | source = "registry+https://github.com/rust-lang/crates.io-index" 510 | checksum = "4c8858831f7781322e539ea39e72449c46b059638250c14344fec8d0aa6e539c" 511 | dependencies = [ 512 | "cfg-if", 513 | "num_cpus", 514 | "parking_lot 0.12.0", 515 | ] 516 | 517 | [[package]] 518 | name = "derive_more" 519 | version = "0.99.17" 520 | source = "registry+https://github.com/rust-lang/crates.io-index" 521 | checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" 522 | dependencies = [ 523 | "convert_case", 524 | "proc-macro2", 525 | "quote", 526 | "rustc_version", 527 | "syn", 528 | ] 529 | 530 | [[package]] 531 | name = "digest" 532 | version = "0.9.0" 533 | source = "registry+https://github.com/rust-lang/crates.io-index" 534 | checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" 535 | dependencies = [ 536 | "generic-array", 537 | ] 538 | 539 | [[package]] 540 | name = "digest" 541 | version = "0.10.3" 542 | source = "registry+https://github.com/rust-lang/crates.io-index" 543 | checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" 544 | dependencies = [ 545 | "block-buffer 0.10.2", 546 | "crypto-common", 547 | ] 548 | 549 | [[package]] 550 | name = "dirs" 551 | version = "4.0.0" 552 | source = "registry+https://github.com/rust-lang/crates.io-index" 553 | checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" 554 | dependencies = [ 555 | "dirs-sys", 556 | ] 557 | 558 | [[package]] 559 | name = "dirs-sys" 560 | version = "0.3.7" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" 563 | dependencies = [ 564 | "libc", 565 | "redox_users", 566 | "winapi", 567 | ] 568 | 569 | [[package]] 570 | name = "dotenv" 571 | version = "0.15.0" 572 | source = "registry+https://github.com/rust-lang/crates.io-index" 573 | checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" 574 | 575 | [[package]] 576 | name = "either" 577 | version = "1.6.1" 578 | source = "registry+https://github.com/rust-lang/crates.io-index" 579 | checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" 580 | 581 | [[package]] 582 | name = "encoding_rs" 583 | version = "0.8.30" 584 | source = "registry+https://github.com/rust-lang/crates.io-index" 585 | checksum = "7896dc8abb250ffdda33912550faa54c88ec8b998dec0b2c55ab224921ce11df" 586 | dependencies = [ 587 | "cfg-if", 588 | ] 589 | 590 | [[package]] 591 | name = "firestorm" 592 | version = "0.5.0" 593 | source = "registry+https://github.com/rust-lang/crates.io-index" 594 | checksum = "4d3d6188b8804df28032815ea256b6955c9625c24da7525f387a7af02fbb8f01" 595 | 596 | [[package]] 597 | name = "flate2" 598 | version = "1.0.22" 599 | source = "registry+https://github.com/rust-lang/crates.io-index" 600 | checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" 601 | dependencies = [ 602 | "cfg-if", 603 | "crc32fast", 604 | "libc", 605 | "miniz_oxide", 606 | ] 607 | 608 | [[package]] 609 | name = "fnv" 610 | version = "1.0.7" 611 | source = "registry+https://github.com/rust-lang/crates.io-index" 612 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 613 | 614 | [[package]] 615 | name = "form_urlencoded" 616 | version = "1.0.1" 617 | source = "registry+https://github.com/rust-lang/crates.io-index" 618 | checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" 619 | dependencies = [ 620 | "matches", 621 | "percent-encoding", 622 | ] 623 | 624 | [[package]] 625 | name = "futures" 626 | version = "0.3.21" 627 | source = "registry+https://github.com/rust-lang/crates.io-index" 628 | checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" 629 | dependencies = [ 630 | "futures-channel", 631 | "futures-core", 632 | "futures-executor", 633 | "futures-io", 634 | "futures-sink", 635 | "futures-task", 636 | "futures-util", 637 | ] 638 | 639 | [[package]] 640 | name = "futures-channel" 641 | version = "0.3.21" 642 | source = "registry+https://github.com/rust-lang/crates.io-index" 643 | checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" 644 | dependencies = [ 645 | "futures-core", 646 | "futures-sink", 647 | ] 648 | 649 | [[package]] 650 | name = "futures-core" 651 | version = "0.3.21" 652 | source = "registry+https://github.com/rust-lang/crates.io-index" 653 | checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" 654 | 655 | [[package]] 656 | name = "futures-executor" 657 | version = "0.3.21" 658 | source = "registry+https://github.com/rust-lang/crates.io-index" 659 | checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" 660 | dependencies = [ 661 | "futures-core", 662 | "futures-task", 663 | "futures-util", 664 | ] 665 | 666 | [[package]] 667 | name = "futures-intrusive" 668 | version = "0.4.0" 669 | source = "registry+https://github.com/rust-lang/crates.io-index" 670 | checksum = "62007592ac46aa7c2b6416f7deb9a8a8f63a01e0f1d6e1787d5630170db2b63e" 671 | dependencies = [ 672 | "futures-core", 673 | "lock_api", 674 | "parking_lot 0.11.2", 675 | ] 676 | 677 | [[package]] 678 | name = "futures-io" 679 | version = "0.3.21" 680 | source = "registry+https://github.com/rust-lang/crates.io-index" 681 | checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" 682 | 683 | [[package]] 684 | name = "futures-macro" 685 | version = "0.3.21" 686 | source = "registry+https://github.com/rust-lang/crates.io-index" 687 | checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" 688 | dependencies = [ 689 | "proc-macro2", 690 | "quote", 691 | "syn", 692 | ] 693 | 694 | [[package]] 695 | name = "futures-sink" 696 | version = "0.3.21" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" 699 | 700 | [[package]] 701 | name = "futures-task" 702 | version = "0.3.21" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" 705 | 706 | [[package]] 707 | name = "futures-timer" 708 | version = "3.0.2" 709 | source = "registry+https://github.com/rust-lang/crates.io-index" 710 | checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" 711 | 712 | [[package]] 713 | name = "futures-util" 714 | version = "0.3.21" 715 | source = "registry+https://github.com/rust-lang/crates.io-index" 716 | checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" 717 | dependencies = [ 718 | "futures-channel", 719 | "futures-core", 720 | "futures-io", 721 | "futures-macro", 722 | "futures-sink", 723 | "futures-task", 724 | "memchr", 725 | "pin-project-lite", 726 | "pin-utils", 727 | "slab", 728 | ] 729 | 730 | [[package]] 731 | name = "generic-array" 732 | version = "0.14.5" 733 | source = "registry+https://github.com/rust-lang/crates.io-index" 734 | checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" 735 | dependencies = [ 736 | "typenum", 737 | "version_check", 738 | ] 739 | 740 | [[package]] 741 | name = "getrandom" 742 | version = "0.2.6" 743 | source = "registry+https://github.com/rust-lang/crates.io-index" 744 | checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" 745 | dependencies = [ 746 | "cfg-if", 747 | "libc", 748 | "wasi 0.10.0+wasi-snapshot-preview1", 749 | ] 750 | 751 | [[package]] 752 | name = "governor" 753 | version = "0.4.2" 754 | source = "registry+https://github.com/rust-lang/crates.io-index" 755 | checksum = "19775995ee20209163239355bc3ad2f33f83da35d9ef72dea26e5af753552c87" 756 | dependencies = [ 757 | "dashmap", 758 | "futures", 759 | "futures-timer", 760 | "no-std-compat", 761 | "nonzero_ext", 762 | "parking_lot 0.12.0", 763 | "quanta", 764 | "rand", 765 | "smallvec", 766 | ] 767 | 768 | [[package]] 769 | name = "h2" 770 | version = "0.3.13" 771 | source = "registry+https://github.com/rust-lang/crates.io-index" 772 | checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" 773 | dependencies = [ 774 | "bytes", 775 | "fnv", 776 | "futures-core", 777 | "futures-sink", 778 | "futures-util", 779 | "http", 780 | "indexmap", 781 | "slab", 782 | "tokio", 783 | "tokio-util", 784 | "tracing", 785 | ] 786 | 787 | [[package]] 788 | name = "hashbrown" 789 | version = "0.11.2" 790 | source = "registry+https://github.com/rust-lang/crates.io-index" 791 | checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" 792 | dependencies = [ 793 | "ahash", 794 | ] 795 | 796 | [[package]] 797 | name = "hashlink" 798 | version = "0.7.0" 799 | source = "registry+https://github.com/rust-lang/crates.io-index" 800 | checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf" 801 | dependencies = [ 802 | "hashbrown", 803 | ] 804 | 805 | [[package]] 806 | name = "heck" 807 | version = "0.3.3" 808 | source = "registry+https://github.com/rust-lang/crates.io-index" 809 | checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" 810 | dependencies = [ 811 | "unicode-segmentation", 812 | ] 813 | 814 | [[package]] 815 | name = "hermit-abi" 816 | version = "0.1.19" 817 | source = "registry+https://github.com/rust-lang/crates.io-index" 818 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 819 | dependencies = [ 820 | "libc", 821 | ] 822 | 823 | [[package]] 824 | name = "hex" 825 | version = "0.4.3" 826 | source = "registry+https://github.com/rust-lang/crates.io-index" 827 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 828 | 829 | [[package]] 830 | name = "hmac" 831 | version = "0.11.0" 832 | source = "registry+https://github.com/rust-lang/crates.io-index" 833 | checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" 834 | dependencies = [ 835 | "crypto-mac", 836 | "digest 0.9.0", 837 | ] 838 | 839 | [[package]] 840 | name = "http" 841 | version = "0.2.6" 842 | source = "registry+https://github.com/rust-lang/crates.io-index" 843 | checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" 844 | dependencies = [ 845 | "bytes", 846 | "fnv", 847 | "itoa 1.0.1", 848 | ] 849 | 850 | [[package]] 851 | name = "httparse" 852 | version = "1.6.0" 853 | source = "registry+https://github.com/rust-lang/crates.io-index" 854 | checksum = "9100414882e15fb7feccb4897e5f0ff0ff1ca7d1a86a23208ada4d7a18e6c6c4" 855 | 856 | [[package]] 857 | name = "httpdate" 858 | version = "1.0.2" 859 | source = "registry+https://github.com/rust-lang/crates.io-index" 860 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 861 | 862 | [[package]] 863 | name = "idna" 864 | version = "0.2.3" 865 | source = "registry+https://github.com/rust-lang/crates.io-index" 866 | checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" 867 | dependencies = [ 868 | "matches", 869 | "unicode-bidi", 870 | "unicode-normalization", 871 | ] 872 | 873 | [[package]] 874 | name = "indexmap" 875 | version = "1.8.1" 876 | source = "registry+https://github.com/rust-lang/crates.io-index" 877 | checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" 878 | dependencies = [ 879 | "autocfg", 880 | "hashbrown", 881 | ] 882 | 883 | [[package]] 884 | name = "instant" 885 | version = "0.1.12" 886 | source = "registry+https://github.com/rust-lang/crates.io-index" 887 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 888 | dependencies = [ 889 | "cfg-if", 890 | ] 891 | 892 | [[package]] 893 | name = "itertools" 894 | version = "0.10.3" 895 | source = "registry+https://github.com/rust-lang/crates.io-index" 896 | checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" 897 | dependencies = [ 898 | "either", 899 | ] 900 | 901 | [[package]] 902 | name = "itoa" 903 | version = "0.4.8" 904 | source = "registry+https://github.com/rust-lang/crates.io-index" 905 | checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" 906 | 907 | [[package]] 908 | name = "itoa" 909 | version = "1.0.1" 910 | source = "registry+https://github.com/rust-lang/crates.io-index" 911 | checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" 912 | 913 | [[package]] 914 | name = "jobserver" 915 | version = "0.1.24" 916 | source = "registry+https://github.com/rust-lang/crates.io-index" 917 | checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" 918 | dependencies = [ 919 | "libc", 920 | ] 921 | 922 | [[package]] 923 | name = "js-sys" 924 | version = "0.3.56" 925 | source = "registry+https://github.com/rust-lang/crates.io-index" 926 | checksum = "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04" 927 | dependencies = [ 928 | "wasm-bindgen", 929 | ] 930 | 931 | [[package]] 932 | name = "language-tags" 933 | version = "0.3.2" 934 | source = "registry+https://github.com/rust-lang/crates.io-index" 935 | checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" 936 | 937 | [[package]] 938 | name = "lazy_static" 939 | version = "1.4.0" 940 | source = "registry+https://github.com/rust-lang/crates.io-index" 941 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 942 | 943 | [[package]] 944 | name = "libc" 945 | version = "0.2.121" 946 | source = "registry+https://github.com/rust-lang/crates.io-index" 947 | checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f" 948 | 949 | [[package]] 950 | name = "local-channel" 951 | version = "0.1.2" 952 | source = "registry+https://github.com/rust-lang/crates.io-index" 953 | checksum = "6246c68cf195087205a0512559c97e15eaf95198bf0e206d662092cdcb03fe9f" 954 | dependencies = [ 955 | "futures-core", 956 | "futures-sink", 957 | "futures-util", 958 | "local-waker", 959 | ] 960 | 961 | [[package]] 962 | name = "local-waker" 963 | version = "0.1.2" 964 | source = "registry+https://github.com/rust-lang/crates.io-index" 965 | checksum = "902eb695eb0591864543cbfbf6d742510642a605a61fc5e97fe6ceb5a30ac4fb" 966 | 967 | [[package]] 968 | name = "lock_api" 969 | version = "0.4.7" 970 | source = "registry+https://github.com/rust-lang/crates.io-index" 971 | checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" 972 | dependencies = [ 973 | "autocfg", 974 | "scopeguard", 975 | ] 976 | 977 | [[package]] 978 | name = "log" 979 | version = "0.4.16" 980 | source = "registry+https://github.com/rust-lang/crates.io-index" 981 | checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" 982 | dependencies = [ 983 | "cfg-if", 984 | ] 985 | 986 | [[package]] 987 | name = "mach" 988 | version = "0.3.2" 989 | source = "registry+https://github.com/rust-lang/crates.io-index" 990 | checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" 991 | dependencies = [ 992 | "libc", 993 | ] 994 | 995 | [[package]] 996 | name = "matches" 997 | version = "0.1.9" 998 | source = "registry+https://github.com/rust-lang/crates.io-index" 999 | checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" 1000 | 1001 | [[package]] 1002 | name = "md-5" 1003 | version = "0.9.1" 1004 | source = "registry+https://github.com/rust-lang/crates.io-index" 1005 | checksum = "7b5a279bb9607f9f53c22d496eade00d138d1bdcccd07d74650387cf94942a15" 1006 | dependencies = [ 1007 | "block-buffer 0.9.0", 1008 | "digest 0.9.0", 1009 | "opaque-debug", 1010 | ] 1011 | 1012 | [[package]] 1013 | name = "memchr" 1014 | version = "2.4.1" 1015 | source = "registry+https://github.com/rust-lang/crates.io-index" 1016 | checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" 1017 | 1018 | [[package]] 1019 | name = "mime" 1020 | version = "0.3.16" 1021 | source = "registry+https://github.com/rust-lang/crates.io-index" 1022 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 1023 | 1024 | [[package]] 1025 | name = "minimal-lexical" 1026 | version = "0.2.1" 1027 | source = "registry+https://github.com/rust-lang/crates.io-index" 1028 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1029 | 1030 | [[package]] 1031 | name = "miniz_oxide" 1032 | version = "0.4.4" 1033 | source = "registry+https://github.com/rust-lang/crates.io-index" 1034 | checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" 1035 | dependencies = [ 1036 | "adler", 1037 | "autocfg", 1038 | ] 1039 | 1040 | [[package]] 1041 | name = "mio" 1042 | version = "0.8.2" 1043 | source = "registry+https://github.com/rust-lang/crates.io-index" 1044 | checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" 1045 | dependencies = [ 1046 | "libc", 1047 | "log", 1048 | "miow", 1049 | "ntapi", 1050 | "wasi 0.11.0+wasi-snapshot-preview1", 1051 | "winapi", 1052 | ] 1053 | 1054 | [[package]] 1055 | name = "miow" 1056 | version = "0.3.7" 1057 | source = "registry+https://github.com/rust-lang/crates.io-index" 1058 | checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" 1059 | dependencies = [ 1060 | "winapi", 1061 | ] 1062 | 1063 | [[package]] 1064 | name = "nanoid" 1065 | version = "0.4.0" 1066 | source = "registry+https://github.com/rust-lang/crates.io-index" 1067 | checksum = "3ffa00dec017b5b1a8b7cf5e2c008bfda1aa7e0697ac1508b491fdf2622fb4d8" 1068 | dependencies = [ 1069 | "rand", 1070 | ] 1071 | 1072 | [[package]] 1073 | name = "no-std-compat" 1074 | version = "0.4.1" 1075 | source = "registry+https://github.com/rust-lang/crates.io-index" 1076 | checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" 1077 | 1078 | [[package]] 1079 | name = "nom" 1080 | version = "7.1.1" 1081 | source = "registry+https://github.com/rust-lang/crates.io-index" 1082 | checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" 1083 | dependencies = [ 1084 | "memchr", 1085 | "minimal-lexical", 1086 | ] 1087 | 1088 | [[package]] 1089 | name = "nonzero_ext" 1090 | version = "0.3.0" 1091 | source = "registry+https://github.com/rust-lang/crates.io-index" 1092 | checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" 1093 | 1094 | [[package]] 1095 | name = "ntapi" 1096 | version = "0.3.7" 1097 | source = "registry+https://github.com/rust-lang/crates.io-index" 1098 | checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" 1099 | dependencies = [ 1100 | "winapi", 1101 | ] 1102 | 1103 | [[package]] 1104 | name = "num-integer" 1105 | version = "0.1.44" 1106 | source = "registry+https://github.com/rust-lang/crates.io-index" 1107 | checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" 1108 | dependencies = [ 1109 | "autocfg", 1110 | "num-traits", 1111 | ] 1112 | 1113 | [[package]] 1114 | name = "num-traits" 1115 | version = "0.2.14" 1116 | source = "registry+https://github.com/rust-lang/crates.io-index" 1117 | checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" 1118 | dependencies = [ 1119 | "autocfg", 1120 | ] 1121 | 1122 | [[package]] 1123 | name = "num_cpus" 1124 | version = "1.13.1" 1125 | source = "registry+https://github.com/rust-lang/crates.io-index" 1126 | checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" 1127 | dependencies = [ 1128 | "hermit-abi", 1129 | "libc", 1130 | ] 1131 | 1132 | [[package]] 1133 | name = "num_threads" 1134 | version = "0.1.5" 1135 | source = "registry+https://github.com/rust-lang/crates.io-index" 1136 | checksum = "aba1801fb138d8e85e11d0fc70baf4fe1cdfffda7c6cd34a854905df588e5ed0" 1137 | dependencies = [ 1138 | "libc", 1139 | ] 1140 | 1141 | [[package]] 1142 | name = "once_cell" 1143 | version = "1.10.0" 1144 | source = "registry+https://github.com/rust-lang/crates.io-index" 1145 | checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" 1146 | 1147 | [[package]] 1148 | name = "opaque-debug" 1149 | version = "0.3.0" 1150 | source = "registry+https://github.com/rust-lang/crates.io-index" 1151 | checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" 1152 | 1153 | [[package]] 1154 | name = "parking_lot" 1155 | version = "0.11.2" 1156 | source = "registry+https://github.com/rust-lang/crates.io-index" 1157 | checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" 1158 | dependencies = [ 1159 | "instant", 1160 | "lock_api", 1161 | "parking_lot_core 0.8.5", 1162 | ] 1163 | 1164 | [[package]] 1165 | name = "parking_lot" 1166 | version = "0.12.0" 1167 | source = "registry+https://github.com/rust-lang/crates.io-index" 1168 | checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" 1169 | dependencies = [ 1170 | "lock_api", 1171 | "parking_lot_core 0.9.2", 1172 | ] 1173 | 1174 | [[package]] 1175 | name = "parking_lot_core" 1176 | version = "0.8.5" 1177 | source = "registry+https://github.com/rust-lang/crates.io-index" 1178 | checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" 1179 | dependencies = [ 1180 | "cfg-if", 1181 | "instant", 1182 | "libc", 1183 | "redox_syscall", 1184 | "smallvec", 1185 | "winapi", 1186 | ] 1187 | 1188 | [[package]] 1189 | name = "parking_lot_core" 1190 | version = "0.9.2" 1191 | source = "registry+https://github.com/rust-lang/crates.io-index" 1192 | checksum = "995f667a6c822200b0433ac218e05582f0e2efa1b922a3fd2fbaadc5f87bab37" 1193 | dependencies = [ 1194 | "cfg-if", 1195 | "libc", 1196 | "redox_syscall", 1197 | "smallvec", 1198 | "windows-sys", 1199 | ] 1200 | 1201 | [[package]] 1202 | name = "paste" 1203 | version = "1.0.7" 1204 | source = "registry+https://github.com/rust-lang/crates.io-index" 1205 | checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" 1206 | 1207 | [[package]] 1208 | name = "percent-encoding" 1209 | version = "2.1.0" 1210 | source = "registry+https://github.com/rust-lang/crates.io-index" 1211 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 1212 | 1213 | [[package]] 1214 | name = "pin-project-lite" 1215 | version = "0.2.8" 1216 | source = "registry+https://github.com/rust-lang/crates.io-index" 1217 | checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" 1218 | 1219 | [[package]] 1220 | name = "pin-utils" 1221 | version = "0.1.0" 1222 | source = "registry+https://github.com/rust-lang/crates.io-index" 1223 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1224 | 1225 | [[package]] 1226 | name = "ppv-lite86" 1227 | version = "0.2.16" 1228 | source = "registry+https://github.com/rust-lang/crates.io-index" 1229 | checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" 1230 | 1231 | [[package]] 1232 | name = "proc-macro2" 1233 | version = "1.0.36" 1234 | source = "registry+https://github.com/rust-lang/crates.io-index" 1235 | checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" 1236 | dependencies = [ 1237 | "unicode-xid", 1238 | ] 1239 | 1240 | [[package]] 1241 | name = "quanta" 1242 | version = "0.9.3" 1243 | source = "registry+https://github.com/rust-lang/crates.io-index" 1244 | checksum = "20afe714292d5e879d8b12740aa223c6a88f118af41870e8b6196e39a02238a8" 1245 | dependencies = [ 1246 | "crossbeam-utils", 1247 | "libc", 1248 | "mach", 1249 | "once_cell", 1250 | "raw-cpuid", 1251 | "wasi 0.10.0+wasi-snapshot-preview1", 1252 | "web-sys", 1253 | "winapi", 1254 | ] 1255 | 1256 | [[package]] 1257 | name = "quote" 1258 | version = "1.0.17" 1259 | source = "registry+https://github.com/rust-lang/crates.io-index" 1260 | checksum = "632d02bff7f874a36f33ea8bb416cd484b90cc66c1194b1a1110d067a7013f58" 1261 | dependencies = [ 1262 | "proc-macro2", 1263 | ] 1264 | 1265 | [[package]] 1266 | name = "rand" 1267 | version = "0.8.5" 1268 | source = "registry+https://github.com/rust-lang/crates.io-index" 1269 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1270 | dependencies = [ 1271 | "libc", 1272 | "rand_chacha", 1273 | "rand_core", 1274 | ] 1275 | 1276 | [[package]] 1277 | name = "rand_chacha" 1278 | version = "0.3.1" 1279 | source = "registry+https://github.com/rust-lang/crates.io-index" 1280 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1281 | dependencies = [ 1282 | "ppv-lite86", 1283 | "rand_core", 1284 | ] 1285 | 1286 | [[package]] 1287 | name = "rand_core" 1288 | version = "0.6.3" 1289 | source = "registry+https://github.com/rust-lang/crates.io-index" 1290 | checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" 1291 | dependencies = [ 1292 | "getrandom", 1293 | ] 1294 | 1295 | [[package]] 1296 | name = "raw-cpuid" 1297 | version = "10.3.0" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | checksum = "738bc47119e3eeccc7e94c4a506901aea5e7b4944ecd0829cbebf4af04ceda12" 1300 | dependencies = [ 1301 | "bitflags", 1302 | ] 1303 | 1304 | [[package]] 1305 | name = "redox_syscall" 1306 | version = "0.2.13" 1307 | source = "registry+https://github.com/rust-lang/crates.io-index" 1308 | checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" 1309 | dependencies = [ 1310 | "bitflags", 1311 | ] 1312 | 1313 | [[package]] 1314 | name = "redox_users" 1315 | version = "0.4.3" 1316 | source = "registry+https://github.com/rust-lang/crates.io-index" 1317 | checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" 1318 | dependencies = [ 1319 | "getrandom", 1320 | "redox_syscall", 1321 | "thiserror", 1322 | ] 1323 | 1324 | [[package]] 1325 | name = "regex" 1326 | version = "1.5.5" 1327 | source = "registry+https://github.com/rust-lang/crates.io-index" 1328 | checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" 1329 | dependencies = [ 1330 | "aho-corasick", 1331 | "memchr", 1332 | "regex-syntax", 1333 | ] 1334 | 1335 | [[package]] 1336 | name = "regex-syntax" 1337 | version = "0.6.25" 1338 | source = "registry+https://github.com/rust-lang/crates.io-index" 1339 | checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" 1340 | 1341 | [[package]] 1342 | name = "ring" 1343 | version = "0.16.20" 1344 | source = "registry+https://github.com/rust-lang/crates.io-index" 1345 | checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" 1346 | dependencies = [ 1347 | "cc", 1348 | "libc", 1349 | "once_cell", 1350 | "spin", 1351 | "untrusted", 1352 | "web-sys", 1353 | "winapi", 1354 | ] 1355 | 1356 | [[package]] 1357 | name = "rustc_version" 1358 | version = "0.4.0" 1359 | source = "registry+https://github.com/rust-lang/crates.io-index" 1360 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 1361 | dependencies = [ 1362 | "semver", 1363 | ] 1364 | 1365 | [[package]] 1366 | name = "rustls" 1367 | version = "0.19.1" 1368 | source = "registry+https://github.com/rust-lang/crates.io-index" 1369 | checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" 1370 | dependencies = [ 1371 | "base64", 1372 | "log", 1373 | "ring", 1374 | "sct", 1375 | "webpki", 1376 | ] 1377 | 1378 | [[package]] 1379 | name = "ryu" 1380 | version = "1.0.9" 1381 | source = "registry+https://github.com/rust-lang/crates.io-index" 1382 | checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" 1383 | 1384 | [[package]] 1385 | name = "scopeguard" 1386 | version = "1.1.0" 1387 | source = "registry+https://github.com/rust-lang/crates.io-index" 1388 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 1389 | 1390 | [[package]] 1391 | name = "sct" 1392 | version = "0.6.1" 1393 | source = "registry+https://github.com/rust-lang/crates.io-index" 1394 | checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" 1395 | dependencies = [ 1396 | "ring", 1397 | "untrusted", 1398 | ] 1399 | 1400 | [[package]] 1401 | name = "seahash" 1402 | version = "4.1.0" 1403 | source = "registry+https://github.com/rust-lang/crates.io-index" 1404 | checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" 1405 | 1406 | [[package]] 1407 | name = "semver" 1408 | version = "1.0.7" 1409 | source = "registry+https://github.com/rust-lang/crates.io-index" 1410 | checksum = "d65bd28f48be7196d222d95b9243287f48d27aca604e08497513019ff0502cc4" 1411 | 1412 | [[package]] 1413 | name = "serde" 1414 | version = "1.0.136" 1415 | source = "registry+https://github.com/rust-lang/crates.io-index" 1416 | checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" 1417 | dependencies = [ 1418 | "serde_derive", 1419 | ] 1420 | 1421 | [[package]] 1422 | name = "serde_derive" 1423 | version = "1.0.136" 1424 | source = "registry+https://github.com/rust-lang/crates.io-index" 1425 | checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" 1426 | dependencies = [ 1427 | "proc-macro2", 1428 | "quote", 1429 | "syn", 1430 | ] 1431 | 1432 | [[package]] 1433 | name = "serde_json" 1434 | version = "1.0.79" 1435 | source = "registry+https://github.com/rust-lang/crates.io-index" 1436 | checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" 1437 | dependencies = [ 1438 | "itoa 1.0.1", 1439 | "ryu", 1440 | "serde", 1441 | ] 1442 | 1443 | [[package]] 1444 | name = "serde_urlencoded" 1445 | version = "0.7.1" 1446 | source = "registry+https://github.com/rust-lang/crates.io-index" 1447 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1448 | dependencies = [ 1449 | "form_urlencoded", 1450 | "itoa 1.0.1", 1451 | "ryu", 1452 | "serde", 1453 | ] 1454 | 1455 | [[package]] 1456 | name = "sha-1" 1457 | version = "0.9.8" 1458 | source = "registry+https://github.com/rust-lang/crates.io-index" 1459 | checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" 1460 | dependencies = [ 1461 | "block-buffer 0.9.0", 1462 | "cfg-if", 1463 | "cpufeatures", 1464 | "digest 0.9.0", 1465 | "opaque-debug", 1466 | ] 1467 | 1468 | [[package]] 1469 | name = "sha-1" 1470 | version = "0.10.0" 1471 | source = "registry+https://github.com/rust-lang/crates.io-index" 1472 | checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" 1473 | dependencies = [ 1474 | "cfg-if", 1475 | "cpufeatures", 1476 | "digest 0.10.3", 1477 | ] 1478 | 1479 | [[package]] 1480 | name = "sha2" 1481 | version = "0.9.9" 1482 | source = "registry+https://github.com/rust-lang/crates.io-index" 1483 | checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" 1484 | dependencies = [ 1485 | "block-buffer 0.9.0", 1486 | "cfg-if", 1487 | "cpufeatures", 1488 | "digest 0.9.0", 1489 | "opaque-debug", 1490 | ] 1491 | 1492 | [[package]] 1493 | name = "signal-hook-registry" 1494 | version = "1.4.0" 1495 | source = "registry+https://github.com/rust-lang/crates.io-index" 1496 | checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" 1497 | dependencies = [ 1498 | "libc", 1499 | ] 1500 | 1501 | [[package]] 1502 | name = "slab" 1503 | version = "0.4.6" 1504 | source = "registry+https://github.com/rust-lang/crates.io-index" 1505 | checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" 1506 | 1507 | [[package]] 1508 | name = "smallvec" 1509 | version = "1.8.0" 1510 | source = "registry+https://github.com/rust-lang/crates.io-index" 1511 | checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" 1512 | 1513 | [[package]] 1514 | name = "socket2" 1515 | version = "0.4.4" 1516 | source = "registry+https://github.com/rust-lang/crates.io-index" 1517 | checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" 1518 | dependencies = [ 1519 | "libc", 1520 | "winapi", 1521 | ] 1522 | 1523 | [[package]] 1524 | name = "spin" 1525 | version = "0.5.2" 1526 | source = "registry+https://github.com/rust-lang/crates.io-index" 1527 | checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 1528 | 1529 | [[package]] 1530 | name = "sqlformat" 1531 | version = "0.1.8" 1532 | source = "registry+https://github.com/rust-lang/crates.io-index" 1533 | checksum = "b4b7922be017ee70900be125523f38bdd644f4f06a1b16e8fa5a8ee8c34bffd4" 1534 | dependencies = [ 1535 | "itertools", 1536 | "nom", 1537 | "unicode_categories", 1538 | ] 1539 | 1540 | [[package]] 1541 | name = "sqlx" 1542 | version = "0.5.11" 1543 | source = "registry+https://github.com/rust-lang/crates.io-index" 1544 | checksum = "fc15591eb44ffb5816a4a70a7efd5dd87bfd3aa84c4c200401c4396140525826" 1545 | dependencies = [ 1546 | "sqlx-core", 1547 | "sqlx-macros", 1548 | ] 1549 | 1550 | [[package]] 1551 | name = "sqlx-core" 1552 | version = "0.5.11" 1553 | source = "registry+https://github.com/rust-lang/crates.io-index" 1554 | checksum = "195183bf6ff8328bb82c0511a83faf60aacf75840103388851db61d7a9854ae3" 1555 | dependencies = [ 1556 | "ahash", 1557 | "atoi", 1558 | "base64", 1559 | "bitflags", 1560 | "byteorder", 1561 | "bytes", 1562 | "chrono", 1563 | "crc", 1564 | "crossbeam-queue", 1565 | "dirs", 1566 | "either", 1567 | "futures-channel", 1568 | "futures-core", 1569 | "futures-intrusive", 1570 | "futures-util", 1571 | "hashlink", 1572 | "hex", 1573 | "hmac", 1574 | "indexmap", 1575 | "itoa 1.0.1", 1576 | "libc", 1577 | "log", 1578 | "md-5", 1579 | "memchr", 1580 | "once_cell", 1581 | "paste", 1582 | "percent-encoding", 1583 | "rand", 1584 | "rustls", 1585 | "serde", 1586 | "serde_json", 1587 | "sha-1 0.9.8", 1588 | "sha2", 1589 | "smallvec", 1590 | "sqlformat", 1591 | "sqlx-rt", 1592 | "stringprep", 1593 | "thiserror", 1594 | "tokio-stream", 1595 | "url", 1596 | "webpki", 1597 | "webpki-roots", 1598 | "whoami", 1599 | ] 1600 | 1601 | [[package]] 1602 | name = "sqlx-macros" 1603 | version = "0.5.11" 1604 | source = "registry+https://github.com/rust-lang/crates.io-index" 1605 | checksum = "eee35713129561f5e55c554bba1c378e2a7e67f81257b7311183de98c50e6f94" 1606 | dependencies = [ 1607 | "dotenv", 1608 | "either", 1609 | "heck", 1610 | "once_cell", 1611 | "proc-macro2", 1612 | "quote", 1613 | "sha2", 1614 | "sqlx-core", 1615 | "sqlx-rt", 1616 | "syn", 1617 | "url", 1618 | ] 1619 | 1620 | [[package]] 1621 | name = "sqlx-rt" 1622 | version = "0.5.11" 1623 | source = "registry+https://github.com/rust-lang/crates.io-index" 1624 | checksum = "b555e70fbbf84e269ec3858b7a6515bcfe7a166a7cc9c636dd6efd20431678b6" 1625 | dependencies = [ 1626 | "once_cell", 1627 | "tokio", 1628 | "tokio-rustls", 1629 | ] 1630 | 1631 | [[package]] 1632 | name = "stringprep" 1633 | version = "0.1.2" 1634 | source = "registry+https://github.com/rust-lang/crates.io-index" 1635 | checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1" 1636 | dependencies = [ 1637 | "unicode-bidi", 1638 | "unicode-normalization", 1639 | ] 1640 | 1641 | [[package]] 1642 | name = "subtle" 1643 | version = "2.4.1" 1644 | source = "registry+https://github.com/rust-lang/crates.io-index" 1645 | checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" 1646 | 1647 | [[package]] 1648 | name = "syn" 1649 | version = "1.0.90" 1650 | source = "registry+https://github.com/rust-lang/crates.io-index" 1651 | checksum = "704df27628939572cd88d33f171cd6f896f4eaca85252c6e0a72d8d8287ee86f" 1652 | dependencies = [ 1653 | "proc-macro2", 1654 | "quote", 1655 | "unicode-xid", 1656 | ] 1657 | 1658 | [[package]] 1659 | name = "thiserror" 1660 | version = "1.0.30" 1661 | source = "registry+https://github.com/rust-lang/crates.io-index" 1662 | checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" 1663 | dependencies = [ 1664 | "thiserror-impl", 1665 | ] 1666 | 1667 | [[package]] 1668 | name = "thiserror-impl" 1669 | version = "1.0.30" 1670 | source = "registry+https://github.com/rust-lang/crates.io-index" 1671 | checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" 1672 | dependencies = [ 1673 | "proc-macro2", 1674 | "quote", 1675 | "syn", 1676 | ] 1677 | 1678 | [[package]] 1679 | name = "time" 1680 | version = "0.1.44" 1681 | source = "registry+https://github.com/rust-lang/crates.io-index" 1682 | checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" 1683 | dependencies = [ 1684 | "libc", 1685 | "wasi 0.10.0+wasi-snapshot-preview1", 1686 | "winapi", 1687 | ] 1688 | 1689 | [[package]] 1690 | name = "time" 1691 | version = "0.3.9" 1692 | source = "registry+https://github.com/rust-lang/crates.io-index" 1693 | checksum = "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd" 1694 | dependencies = [ 1695 | "itoa 1.0.1", 1696 | "libc", 1697 | "num_threads", 1698 | "time-macros", 1699 | ] 1700 | 1701 | [[package]] 1702 | name = "time-macros" 1703 | version = "0.2.4" 1704 | source = "registry+https://github.com/rust-lang/crates.io-index" 1705 | checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" 1706 | 1707 | [[package]] 1708 | name = "tinyvec" 1709 | version = "1.5.1" 1710 | source = "registry+https://github.com/rust-lang/crates.io-index" 1711 | checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" 1712 | dependencies = [ 1713 | "tinyvec_macros", 1714 | ] 1715 | 1716 | [[package]] 1717 | name = "tinyvec_macros" 1718 | version = "0.1.0" 1719 | source = "registry+https://github.com/rust-lang/crates.io-index" 1720 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 1721 | 1722 | [[package]] 1723 | name = "tokio" 1724 | version = "1.17.0" 1725 | source = "registry+https://github.com/rust-lang/crates.io-index" 1726 | checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee" 1727 | dependencies = [ 1728 | "bytes", 1729 | "libc", 1730 | "memchr", 1731 | "mio", 1732 | "num_cpus", 1733 | "once_cell", 1734 | "parking_lot 0.12.0", 1735 | "pin-project-lite", 1736 | "signal-hook-registry", 1737 | "socket2", 1738 | "winapi", 1739 | ] 1740 | 1741 | [[package]] 1742 | name = "tokio-rustls" 1743 | version = "0.22.0" 1744 | source = "registry+https://github.com/rust-lang/crates.io-index" 1745 | checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" 1746 | dependencies = [ 1747 | "rustls", 1748 | "tokio", 1749 | "webpki", 1750 | ] 1751 | 1752 | [[package]] 1753 | name = "tokio-stream" 1754 | version = "0.1.8" 1755 | source = "registry+https://github.com/rust-lang/crates.io-index" 1756 | checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" 1757 | dependencies = [ 1758 | "futures-core", 1759 | "pin-project-lite", 1760 | "tokio", 1761 | ] 1762 | 1763 | [[package]] 1764 | name = "tokio-util" 1765 | version = "0.7.1" 1766 | source = "registry+https://github.com/rust-lang/crates.io-index" 1767 | checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" 1768 | dependencies = [ 1769 | "bytes", 1770 | "futures-core", 1771 | "futures-sink", 1772 | "pin-project-lite", 1773 | "tokio", 1774 | "tracing", 1775 | ] 1776 | 1777 | [[package]] 1778 | name = "tracing" 1779 | version = "0.1.32" 1780 | source = "registry+https://github.com/rust-lang/crates.io-index" 1781 | checksum = "4a1bdf54a7c28a2bbf701e1d2233f6c77f473486b94bee4f9678da5a148dca7f" 1782 | dependencies = [ 1783 | "cfg-if", 1784 | "log", 1785 | "pin-project-lite", 1786 | "tracing-attributes", 1787 | "tracing-core", 1788 | ] 1789 | 1790 | [[package]] 1791 | name = "tracing-attributes" 1792 | version = "0.1.20" 1793 | source = "registry+https://github.com/rust-lang/crates.io-index" 1794 | checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b" 1795 | dependencies = [ 1796 | "proc-macro2", 1797 | "quote", 1798 | "syn", 1799 | ] 1800 | 1801 | [[package]] 1802 | name = "tracing-core" 1803 | version = "0.1.24" 1804 | source = "registry+https://github.com/rust-lang/crates.io-index" 1805 | checksum = "90442985ee2f57c9e1b548ee72ae842f4a9a20e3f417cc38dbc5dc684d9bb4ee" 1806 | dependencies = [ 1807 | "lazy_static", 1808 | ] 1809 | 1810 | [[package]] 1811 | name = "typenum" 1812 | version = "1.15.0" 1813 | source = "registry+https://github.com/rust-lang/crates.io-index" 1814 | checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" 1815 | 1816 | [[package]] 1817 | name = "unicode-bidi" 1818 | version = "0.3.7" 1819 | source = "registry+https://github.com/rust-lang/crates.io-index" 1820 | checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" 1821 | 1822 | [[package]] 1823 | name = "unicode-normalization" 1824 | version = "0.1.19" 1825 | source = "registry+https://github.com/rust-lang/crates.io-index" 1826 | checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" 1827 | dependencies = [ 1828 | "tinyvec", 1829 | ] 1830 | 1831 | [[package]] 1832 | name = "unicode-segmentation" 1833 | version = "1.9.0" 1834 | source = "registry+https://github.com/rust-lang/crates.io-index" 1835 | checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" 1836 | 1837 | [[package]] 1838 | name = "unicode-xid" 1839 | version = "0.2.2" 1840 | source = "registry+https://github.com/rust-lang/crates.io-index" 1841 | checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" 1842 | 1843 | [[package]] 1844 | name = "unicode_categories" 1845 | version = "0.1.1" 1846 | source = "registry+https://github.com/rust-lang/crates.io-index" 1847 | checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" 1848 | 1849 | [[package]] 1850 | name = "untrusted" 1851 | version = "0.7.1" 1852 | source = "registry+https://github.com/rust-lang/crates.io-index" 1853 | checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" 1854 | 1855 | [[package]] 1856 | name = "url" 1857 | version = "2.2.2" 1858 | source = "registry+https://github.com/rust-lang/crates.io-index" 1859 | checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" 1860 | dependencies = [ 1861 | "form_urlencoded", 1862 | "idna", 1863 | "matches", 1864 | "percent-encoding", 1865 | ] 1866 | 1867 | [[package]] 1868 | name = "version_check" 1869 | version = "0.9.4" 1870 | source = "registry+https://github.com/rust-lang/crates.io-index" 1871 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1872 | 1873 | [[package]] 1874 | name = "wasi" 1875 | version = "0.10.0+wasi-snapshot-preview1" 1876 | source = "registry+https://github.com/rust-lang/crates.io-index" 1877 | checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" 1878 | 1879 | [[package]] 1880 | name = "wasi" 1881 | version = "0.11.0+wasi-snapshot-preview1" 1882 | source = "registry+https://github.com/rust-lang/crates.io-index" 1883 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1884 | 1885 | [[package]] 1886 | name = "wasm-bindgen" 1887 | version = "0.2.79" 1888 | source = "registry+https://github.com/rust-lang/crates.io-index" 1889 | checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" 1890 | dependencies = [ 1891 | "cfg-if", 1892 | "wasm-bindgen-macro", 1893 | ] 1894 | 1895 | [[package]] 1896 | name = "wasm-bindgen-backend" 1897 | version = "0.2.79" 1898 | source = "registry+https://github.com/rust-lang/crates.io-index" 1899 | checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca" 1900 | dependencies = [ 1901 | "bumpalo", 1902 | "lazy_static", 1903 | "log", 1904 | "proc-macro2", 1905 | "quote", 1906 | "syn", 1907 | "wasm-bindgen-shared", 1908 | ] 1909 | 1910 | [[package]] 1911 | name = "wasm-bindgen-macro" 1912 | version = "0.2.79" 1913 | source = "registry+https://github.com/rust-lang/crates.io-index" 1914 | checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" 1915 | dependencies = [ 1916 | "quote", 1917 | "wasm-bindgen-macro-support", 1918 | ] 1919 | 1920 | [[package]] 1921 | name = "wasm-bindgen-macro-support" 1922 | version = "0.2.79" 1923 | source = "registry+https://github.com/rust-lang/crates.io-index" 1924 | checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" 1925 | dependencies = [ 1926 | "proc-macro2", 1927 | "quote", 1928 | "syn", 1929 | "wasm-bindgen-backend", 1930 | "wasm-bindgen-shared", 1931 | ] 1932 | 1933 | [[package]] 1934 | name = "wasm-bindgen-shared" 1935 | version = "0.2.79" 1936 | source = "registry+https://github.com/rust-lang/crates.io-index" 1937 | checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2" 1938 | 1939 | [[package]] 1940 | name = "web-sys" 1941 | version = "0.3.56" 1942 | source = "registry+https://github.com/rust-lang/crates.io-index" 1943 | checksum = "c060b319f29dd25724f09a2ba1418f142f539b2be99fbf4d2d5a8f7330afb8eb" 1944 | dependencies = [ 1945 | "js-sys", 1946 | "wasm-bindgen", 1947 | ] 1948 | 1949 | [[package]] 1950 | name = "webpki" 1951 | version = "0.21.4" 1952 | source = "registry+https://github.com/rust-lang/crates.io-index" 1953 | checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" 1954 | dependencies = [ 1955 | "ring", 1956 | "untrusted", 1957 | ] 1958 | 1959 | [[package]] 1960 | name = "webpki-roots" 1961 | version = "0.21.1" 1962 | source = "registry+https://github.com/rust-lang/crates.io-index" 1963 | checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" 1964 | dependencies = [ 1965 | "webpki", 1966 | ] 1967 | 1968 | [[package]] 1969 | name = "whoami" 1970 | version = "1.2.1" 1971 | source = "registry+https://github.com/rust-lang/crates.io-index" 1972 | checksum = "524b58fa5a20a2fb3014dd6358b70e6579692a56ef6fce928834e488f42f65e8" 1973 | dependencies = [ 1974 | "wasm-bindgen", 1975 | "web-sys", 1976 | ] 1977 | 1978 | [[package]] 1979 | name = "winapi" 1980 | version = "0.3.9" 1981 | source = "registry+https://github.com/rust-lang/crates.io-index" 1982 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1983 | dependencies = [ 1984 | "winapi-i686-pc-windows-gnu", 1985 | "winapi-x86_64-pc-windows-gnu", 1986 | ] 1987 | 1988 | [[package]] 1989 | name = "winapi-i686-pc-windows-gnu" 1990 | version = "0.4.0" 1991 | source = "registry+https://github.com/rust-lang/crates.io-index" 1992 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1993 | 1994 | [[package]] 1995 | name = "winapi-x86_64-pc-windows-gnu" 1996 | version = "0.4.0" 1997 | source = "registry+https://github.com/rust-lang/crates.io-index" 1998 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1999 | 2000 | [[package]] 2001 | name = "windows-sys" 2002 | version = "0.34.0" 2003 | source = "registry+https://github.com/rust-lang/crates.io-index" 2004 | checksum = "5acdd78cb4ba54c0045ac14f62d8f94a03d10047904ae2a40afa1e99d8f70825" 2005 | dependencies = [ 2006 | "windows_aarch64_msvc", 2007 | "windows_i686_gnu", 2008 | "windows_i686_msvc", 2009 | "windows_x86_64_gnu", 2010 | "windows_x86_64_msvc", 2011 | ] 2012 | 2013 | [[package]] 2014 | name = "windows_aarch64_msvc" 2015 | version = "0.34.0" 2016 | source = "registry+https://github.com/rust-lang/crates.io-index" 2017 | checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" 2018 | 2019 | [[package]] 2020 | name = "windows_i686_gnu" 2021 | version = "0.34.0" 2022 | source = "registry+https://github.com/rust-lang/crates.io-index" 2023 | checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" 2024 | 2025 | [[package]] 2026 | name = "windows_i686_msvc" 2027 | version = "0.34.0" 2028 | source = "registry+https://github.com/rust-lang/crates.io-index" 2029 | checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" 2030 | 2031 | [[package]] 2032 | name = "windows_x86_64_gnu" 2033 | version = "0.34.0" 2034 | source = "registry+https://github.com/rust-lang/crates.io-index" 2035 | checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" 2036 | 2037 | [[package]] 2038 | name = "windows_x86_64_msvc" 2039 | version = "0.34.0" 2040 | source = "registry+https://github.com/rust-lang/crates.io-index" 2041 | checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" 2042 | 2043 | [[package]] 2044 | name = "zstd" 2045 | version = "0.10.0+zstd.1.5.2" 2046 | source = "registry+https://github.com/rust-lang/crates.io-index" 2047 | checksum = "3b1365becbe415f3f0fcd024e2f7b45bacfb5bdd055f0dc113571394114e7bdd" 2048 | dependencies = [ 2049 | "zstd-safe", 2050 | ] 2051 | 2052 | [[package]] 2053 | name = "zstd-safe" 2054 | version = "4.1.4+zstd.1.5.2" 2055 | source = "registry+https://github.com/rust-lang/crates.io-index" 2056 | checksum = "2f7cd17c9af1a4d6c24beb1cc54b17e2ef7b593dc92f19e9d9acad8b182bbaee" 2057 | dependencies = [ 2058 | "libc", 2059 | "zstd-sys", 2060 | ] 2061 | 2062 | [[package]] 2063 | name = "zstd-sys" 2064 | version = "1.6.3+zstd.1.5.2" 2065 | source = "registry+https://github.com/rust-lang/crates.io-index" 2066 | checksum = "fc49afa5c8d634e75761feda8c592051e7eeb4683ba827211eb0d731d3402ea8" 2067 | dependencies = [ 2068 | "cc", 2069 | "libc", 2070 | ] 2071 | -------------------------------------------------------------------------------- /backend/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "backend" 3 | version = "1.1.1" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | serde = { version = "1.0", features = ["derive"] } 10 | serde_json = "1.0" 11 | 12 | actix-rt = "2.6.0" 13 | actix-web = "4.0.0-rc.1" 14 | actix-cors = "0.6.0" 15 | actix-governor = "0.3.0" 16 | 17 | badge-maker = "0.2.1" 18 | 19 | sqlx = { version = "0.5.11", features = ["runtime-tokio-rustls", "postgres", "chrono"] } 20 | 21 | chrono = { version = "0.4.19", features = ["serde"] } 22 | 23 | nanoid = "0.4.0" 24 | 25 | [profile.release] 26 | codegen-units = 1 27 | debug = false 28 | incremental = false 29 | lto = true 30 | opt-level = 3 31 | panic = "abort" 32 | debug-assertions = false 33 | 34 | [[bin]] 35 | name = "zer0bin-bin" 36 | path = "src/main.rs" 37 | -------------------------------------------------------------------------------- /backend/config.example.json: -------------------------------------------------------------------------------- 1 | { 2 | "server": { 3 | "backend_host": "127.0.0.1", 4 | "backend_port": 8000 5 | }, 6 | "pastes": { 7 | "character_limit": 50000, 8 | "days_til_expiration": 30, 9 | "id_length": 6 10 | }, 11 | "ratelimits": { 12 | "seconds_in_between_pastes": 2, 13 | "allowed_pastes_before_ratelimit": 5 14 | }, 15 | "databases": { 16 | "postgres_uri": "postgres://postgres:postgres@localhost:5432/zer0bin" 17 | }, 18 | "logging": { 19 | "on_post_paste": true, 20 | "on_get_paste": true 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /backend/migrations/000_single_view.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE pastes ADD column single_view BOOLEAN DEFAULT false; 2 | -------------------------------------------------------------------------------- /backend/schema.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS pastes ( 2 | "id" TEXT PRIMARY KEY, 3 | "content" TEXT NOT NULL, 4 | "views" BIGINT DEFAULT 0, 5 | "expires_at" TIMESTAMP WITHOUT TIME ZONE, 6 | "created_at" TIMESTAMP WITHOUT TIME ZONE DEFAULT(NOW() AT TIME ZONE 'utc') 7 | ); 8 | 9 | CREATE OR REPLACE FUNCTION deleteExpiredPastes() RETURNS trigger AS $pastes_expire$ BEGIN 10 | DELETE FROM pastes 11 | WHERE "expires_at" IS NOT NULL 12 | AND "expires_at" < now() AT TIME ZONE 'utc'; 13 | RETURN NEW; 14 | END; 15 | $pastes_expire$ LANGUAGE plpgsql; 16 | 17 | CREATE TRIGGER checkPastes BEFORE 18 | INSERT 19 | OR 20 | UPDATE ON pastes FOR STATEMENT EXECUTE PROCEDURE deleteExpiredPastes(); 21 | -------------------------------------------------------------------------------- /backend/src/config.rs: -------------------------------------------------------------------------------- 1 | use std::{fs::File, path::PathBuf}; 2 | 3 | use serde::{Deserialize, Serialize}; 4 | 5 | #[derive(Serialize, Deserialize, Clone)] 6 | pub struct Config { 7 | pub server: ServerConfig, 8 | pub pastes: PastesConfig, 9 | pub ratelimits: RatelimitsConifg, 10 | pub databases: DatabasesConfig, 11 | pub logging: LoggingConfig 12 | } 13 | 14 | #[derive(Serialize, Deserialize, Clone)] 15 | pub struct ServerConfig { 16 | pub backend_host: String, 17 | pub backend_port: u16, 18 | } 19 | 20 | #[derive(Serialize, Deserialize, Clone)] 21 | pub struct RatelimitsConifg { 22 | pub seconds_in_between_pastes: u64, 23 | pub allowed_pastes_before_ratelimit: u32, 24 | } 25 | 26 | #[derive(Serialize, Deserialize, Clone)] 27 | pub struct PastesConfig { 28 | pub character_limit: usize, 29 | pub days_til_expiration: i64, 30 | pub id_length: usize, 31 | } 32 | 33 | #[derive(Serialize, Deserialize, Clone)] 34 | pub struct DatabasesConfig { 35 | pub postgres_uri: String, 36 | } 37 | 38 | #[derive(Serialize, Deserialize, Clone)] 39 | pub struct LoggingConfig { 40 | pub on_post_paste: bool, 41 | pub on_get_paste: bool 42 | } 43 | 44 | pub fn load(path: PathBuf) -> Config { 45 | let file = File::open(path).expect("Failed to load config"); 46 | serde_json::from_reader(file).unwrap() 47 | } 48 | -------------------------------------------------------------------------------- /backend/src/main.rs: -------------------------------------------------------------------------------- 1 | mod config; 2 | mod models; 3 | mod routes; 4 | 5 | use std::{io, path::Path, path::PathBuf}; 6 | 7 | use actix_cors::Cors; 8 | use actix_governor::{Governor, GovernorConfigBuilder}; 9 | use actix_web::{ 10 | web::{self, Data}, 11 | App, HttpServer, 12 | }; 13 | use config::Config; 14 | 15 | use sqlx::{migrate::Migrator, postgres::PgPoolOptions, PgPool}; 16 | 17 | use crate::routes::{ 18 | get_paste, get_raw_paste, get_stats, get_total_pastes_badge, get_version_badge, new_paste, 19 | }; 20 | 21 | #[derive(Clone)] 22 | pub struct AppState { 23 | pub config: Config, 24 | pub pool: PgPool, 25 | } 26 | 27 | pub async fn migrations(pool: &PgPool) -> Result<(), sqlx::Error> { 28 | Migrator::new(Path::new("./migrations")) 29 | .await? 30 | .run(pool) 31 | .await?; 32 | 33 | Ok(()) 34 | } 35 | 36 | #[actix_rt::main] 37 | async fn main() -> io::Result<()> { 38 | let config = config::load(PathBuf::from("config.json")); 39 | 40 | let db_uri = &config.databases.postgres_uri.to_string(); 41 | 42 | let pool = PgPoolOptions::new() 43 | .max_connections(100) 44 | .connect(db_uri) 45 | .await 46 | .expect("Failed to connect to database"); 47 | 48 | migrations(&pool).await.expect("Failed to run migrations"); 49 | 50 | let address = format!( 51 | "{}:{}", 52 | config.server.backend_host, config.server.backend_port 53 | ); 54 | 55 | let paste_governor = GovernorConfigBuilder::default() 56 | .per_second(config.ratelimits.seconds_in_between_pastes) 57 | .burst_size(config.ratelimits.allowed_pastes_before_ratelimit) 58 | .finish() 59 | .unwrap(); 60 | 61 | let state = AppState { config, pool }; 62 | 63 | println!("🚀 zer0bin is running on {address}"); 64 | 65 | HttpServer::new(move || { 66 | let cors = Cors::default() 67 | .allow_any_header() 68 | .allow_any_method() 69 | .allow_any_origin() 70 | .send_wildcard() 71 | .max_age(3600); 72 | 73 | App::new() 74 | .wrap(cors) 75 | .app_data(Data::new(state.clone())) 76 | .service(get_stats) 77 | .service( 78 | web::scope("/p") 79 | .wrap(Governor::new(&paste_governor)) 80 | .service(get_paste) 81 | .service(new_paste) 82 | .service(get_raw_paste), 83 | ) 84 | .service( 85 | web::scope("/b") 86 | .service(get_version_badge) 87 | .service(get_total_pastes_badge), 88 | ) 89 | }) 90 | .bind(address)? 91 | .run() 92 | .await 93 | } 94 | -------------------------------------------------------------------------------- /backend/src/models.rs: -------------------------------------------------------------------------------- 1 | use chrono::NaiveDateTime; 2 | use serde::{Deserialize, Serialize}; 3 | use sqlx::FromRow; 4 | 5 | #[derive(FromRow)] 6 | pub struct Paste { 7 | pub id: String, 8 | pub content: String, 9 | pub views: i64, 10 | pub single_view: bool, 11 | pub expires_at: Option, 12 | } 13 | 14 | #[derive(Deserialize)] 15 | pub struct PartialPaste { 16 | pub content: String, 17 | pub single_view: bool 18 | } 19 | 20 | #[derive(Serialize)] 21 | pub struct ApiResponse { 22 | pub success: bool, 23 | pub data: T, 24 | } 25 | 26 | #[derive(Serialize)] 27 | pub struct NewPasteResponse { 28 | pub id: String, 29 | pub content: String, 30 | pub single_view: bool, 31 | } 32 | 33 | #[derive(Serialize)] 34 | pub struct GetPasteResponse { 35 | pub id: String, 36 | pub content: String, 37 | pub views: i64, 38 | pub single_view: bool, 39 | pub expires_at: Option, 40 | } 41 | 42 | #[derive(Serialize)] 43 | pub struct GetStatsResponse { 44 | pub count: i64, 45 | pub version: String, 46 | } 47 | 48 | #[derive(Serialize)] 49 | pub struct ApiError { 50 | pub message: String, 51 | } 52 | -------------------------------------------------------------------------------- /backend/src/routes.rs: -------------------------------------------------------------------------------- 1 | use actix_web::{ 2 | get, post, 3 | web::{self}, 4 | HttpResponse, Responder, 5 | }; 6 | 7 | use badge_maker::{BadgeBuilder, Style}; 8 | 9 | use chrono::Duration; 10 | use nanoid::nanoid; 11 | use sqlx::{postgres::PgRow, types::chrono::Utc, Row}; 12 | 13 | use crate::{ 14 | models::{ 15 | ApiError, ApiResponse, GetPasteResponse, GetStatsResponse, NewPasteResponse, PartialPaste, 16 | Paste, 17 | }, 18 | AppState, 19 | }; 20 | 21 | // Pastes 22 | 23 | #[get("/{id}")] 24 | pub async fn get_paste(state: web::Data, id: web::Path) -> impl Responder { 25 | let id = id.into_inner(); 26 | 27 | let res: Result = 28 | sqlx::query_as::<_, Paste>(r#"SELECT * FROM pastes WHERE "id" = $1"#) 29 | .bind(id.clone()) 30 | .fetch_one(&state.pool) 31 | .await; 32 | 33 | match res { 34 | Ok(p) => { 35 | // Only increment views if its not a single view paste 36 | if p.single_view { 37 | let _ = sqlx::query(r#"DELETE FROM pastes WHERE "id" = $1"#) 38 | .bind(id.clone()) 39 | .execute(&state.pool) 40 | .await; 41 | } else { 42 | let _ = sqlx::query(r#"UPDATE pastes SET "views" = "views" + 1 WHERE "id" = $1"#) 43 | .bind(id.clone()) 44 | .execute(&state.pool) 45 | .await; 46 | } 47 | 48 | if state.config.logging.on_get_paste { 49 | println!("[GET] id={} views={} single_view={}", id, p.views + 1, p.single_view); 50 | } 51 | 52 | HttpResponse::Ok().json(ApiResponse { 53 | success: true, 54 | data: GetPasteResponse { 55 | id: p.id, 56 | content: p.content, 57 | views: p.views + 1, 58 | single_view: p.single_view, 59 | expires_at: p.expires_at, 60 | }, 61 | }) 62 | } 63 | Err(e) => match e { 64 | sqlx::Error::RowNotFound => { 65 | return HttpResponse::InternalServerError().json(ApiResponse { 66 | success: false, 67 | data: ApiError { 68 | message: format!("Paste {id} wasnt found."), 69 | }, 70 | }); 71 | } 72 | _ => { 73 | eprintln!("Error occurred while getting paste: {:?}", e); 74 | 75 | HttpResponse::InternalServerError().json(ApiResponse { 76 | success: false, 77 | data: ApiError { 78 | message: "Unknown error occurred, please try again.".to_string(), 79 | }, 80 | }) 81 | } 82 | }, 83 | } 84 | } 85 | 86 | #[get("/r/{id}")] 87 | pub async fn get_raw_paste(state: web::Data, id: web::Path) -> impl Responder { 88 | let id = id.into_inner(); 89 | 90 | let res: Result = 91 | sqlx::query_as::<_, Paste>(r#"SELECT * FROM pastes WHERE "id" = $1"#) 92 | .bind(id.clone()) 93 | .fetch_one(&state.pool) 94 | .await; 95 | 96 | match res { 97 | Ok(p) => { 98 | if p.single_view { 99 | let _ = sqlx::query(r#"DELETE FROM pastes WHERE "id" = $1"#) 100 | .bind(id.clone()) 101 | .execute(&state.pool) 102 | .await; 103 | } else { 104 | let _ = sqlx::query(r#"UPDATE pastes SET "views" = "views" + 1 WHERE "id" = $1"#) 105 | .bind(id.clone()) 106 | .execute(&state.pool) 107 | .await; 108 | } 109 | 110 | if state.config.logging.on_get_paste { 111 | println!("[GET] raw id={} views={} single_view={}", id, p.views + 1, p.single_view); 112 | } 113 | 114 | HttpResponse::Ok() 115 | .content_type("text/plain") 116 | .body(p.content) 117 | } 118 | Err(e) => match e { 119 | sqlx::Error::RowNotFound => { 120 | return HttpResponse::InternalServerError().json(ApiResponse { 121 | success: false, 122 | data: ApiError { 123 | message: format!("Paste {id} wasnt found."), 124 | }, 125 | }); 126 | } 127 | _ => { 128 | eprintln!("Error occurred while getting paste: {:?}", e); 129 | 130 | HttpResponse::InternalServerError().json(ApiResponse { 131 | success: false, 132 | data: ApiError { 133 | message: "Unknown error occurred, please try again.".to_string(), 134 | }, 135 | }) 136 | } 137 | }, 138 | } 139 | } 140 | 141 | #[post("/n")] 142 | pub async fn new_paste( 143 | state: web::Data, 144 | data: web::Json, 145 | ) -> impl Responder { 146 | if data.content.is_empty() || data.content.len() > state.config.pastes.character_limit { 147 | let character_limit = state.config.pastes.character_limit; 148 | 149 | return HttpResponse::BadRequest().json(ApiResponse { 150 | success: false, 151 | data: ApiError { 152 | message: format!("Maximum file length exceeded, maximum is {character_limit} characters. Or the content is blank.."), 153 | }, 154 | }); 155 | } 156 | 157 | let length = state.config.pastes.id_length; 158 | let id = nanoid!(length); 159 | 160 | let expires_at = if state.config.pastes.days_til_expiration == -1 { 161 | None 162 | } else { 163 | Some(Utc::now() + Duration::days(state.config.pastes.days_til_expiration)) 164 | }; 165 | 166 | let content = data.content.clone(); 167 | let single_view = data.single_view; 168 | 169 | let res = 170 | sqlx::query(r#"INSERT INTO pastes("id", "content", "single_view", "expires_at") VALUES ($1, $2, $3, $4)"#) 171 | .bind(id.clone()) 172 | .bind(content.clone()) 173 | .bind(single_view) 174 | .bind(expires_at) 175 | .execute(&state.pool) 176 | .await; 177 | 178 | match res { 179 | Ok(_) => { 180 | if state.config.logging.on_post_paste { 181 | println!("[POST] id={} length={} single_view={}", id, content.len(), single_view); 182 | } 183 | HttpResponse::Ok().json(ApiResponse { 184 | success: true, 185 | data: NewPasteResponse { 186 | id, 187 | content, 188 | single_view, 189 | }, 190 | }) 191 | } 192 | Err(e) => { 193 | eprintln!("Error occurred while creating paste: {:?}", e); 194 | 195 | HttpResponse::InternalServerError().json(ApiResponse { 196 | success: false, 197 | data: ApiError { 198 | message: "Unknown error occurred, please try again.".to_string(), 199 | }, 200 | }) 201 | } 202 | } 203 | } 204 | 205 | // Stats 206 | 207 | #[get("/s")] 208 | pub async fn get_stats(state: web::Data) -> impl Responder { 209 | let version = env!("CARGO_PKG_VERSION").to_string(); 210 | // TODO: Maybe there's a less hacky way to do this..? 211 | let count: Result = sqlx::query(r#"SELECT COUNT(*) FROM pastes"#) 212 | .try_map(|row: PgRow| row.try_get::("count")) 213 | .fetch_one(&state.pool) 214 | .await; 215 | 216 | if let Err(e) = count { 217 | eprintln!("Error occurred while retrieving paste count: {:?}", e); 218 | 219 | return HttpResponse::InternalServerError().json(ApiResponse { 220 | success: false, 221 | data: ApiError { 222 | message: "Error occurred while retrieving paste count, please try again." 223 | .to_string(), 224 | }, 225 | }); 226 | } 227 | 228 | HttpResponse::Ok().json(ApiResponse { 229 | success: true, 230 | data: GetStatsResponse { 231 | count: count.unwrap(), 232 | version, 233 | }, 234 | }) 235 | } 236 | 237 | // Badges 238 | 239 | #[get("/v")] 240 | pub async fn get_version_badge() -> impl Responder { 241 | let version = env!("CARGO_PKG_VERSION").to_string(); 242 | 243 | let badge = BadgeBuilder::new() 244 | .label("version") 245 | .message(&version) 246 | .color_parse("#31748f") 247 | .label_color_parse("#191724") 248 | .style(Style::FlatSquare) 249 | .build() 250 | .expect("Failed to build badge") 251 | .svg(); 252 | 253 | HttpResponse::Ok().content_type("image/svg+xml").body(badge) 254 | } 255 | 256 | #[get("/t")] 257 | pub async fn get_total_pastes_badge(state: web::Data) -> impl Responder { 258 | let count: Result = sqlx::query(r#"SELECT COUNT(*) FROM pastes"#) 259 | .try_map(|row: PgRow| row.try_get::("count")) 260 | .fetch_one(&state.pool) 261 | .await; 262 | 263 | if let Err(e) = count { 264 | eprintln!("Error occurred while retrieving paste count: {:?}", e); 265 | 266 | return HttpResponse::InternalServerError().json(ApiResponse { 267 | success: false, 268 | data: ApiError { 269 | message: "Error occurred while retrieving paste count, please try again." 270 | .to_string(), 271 | }, 272 | }); 273 | } 274 | 275 | let badge = BadgeBuilder::new() 276 | .label("total pastes") 277 | .message(&count.unwrap().to_string()) 278 | .color_parse("#ebbcba") 279 | .label_color_parse("#191724") 280 | .style(Style::FlatSquare) 281 | .build() 282 | .expect("Failed to build badge") 283 | .svg(); 284 | 285 | HttpResponse::Ok().content_type("image/svg+xml").body(badge) 286 | } 287 | -------------------------------------------------------------------------------- /example.nginx: -------------------------------------------------------------------------------- 1 | # replace `example.tld` with your domain 2 | # replace `/location/of/zer0bin` with the location of the zer0bin folder 3 | # comment out line 15 and uncomment line 16 if you have the nginx brotoli plugin 4 | # uncomment lines 51 and 52 if you have letsencrypt certs 5 | 6 | server { 7 | server_name example.tld; 8 | return 301 https://example.tld$request_uri; 9 | } 10 | 11 | server { 12 | listen 443; 13 | server_name example.tld; 14 | 15 | gzip_static on; 16 | # brotli on; 17 | 18 | root /location/of/zer0bin/frontend/dist; 19 | 20 | rewrite ^/(?!.*api)(?!.*\.).*$ /index.html; 21 | 22 | location / { 23 | index index.html; 24 | expires 30d; 25 | add_header Cache-Control "public, no-transform"; 26 | } 27 | 28 | location ~ \.(css|js|html) { 29 | try_files $uri =404; 30 | expires 30d; 31 | add_header Cache-Control "public, no-transform"; 32 | } 33 | 34 | location ^~ /.well-known/ { 35 | alias /var/www/.well-known/; 36 | } 37 | 38 | location /api/ { 39 | add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 40 | add_header 'Access-Control-Allow-Origin' '*'; 41 | proxy_pass http://localhost:8000/; 42 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 43 | proxy_set_header Host $host; 44 | add_header Last-Modified $date_gmt; 45 | add_header Cache-Control 'no-store, no-cache'; 46 | if_modified_since off; 47 | expires off; 48 | etag off; 49 | } 50 | 51 | # ssl_certificate /etc/letsencrypt/live/example.tld/fullchain.pem; 52 | # ssl_certificate_key /etc/letsencrypt/live/example.tld/privkey.pem; 53 | } 54 | -------------------------------------------------------------------------------- /frontend/.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "trailingComma": "es5", 4 | "tabWidth": 4, 5 | "semi": false, 6 | "singleQuote": false 7 | } -------------------------------------------------------------------------------- /frontend/.yarnrc.yml: -------------------------------------------------------------------------------- 1 | nodeLinker: node-modules 2 | -------------------------------------------------------------------------------- /frontend/config.example.json: -------------------------------------------------------------------------------- 1 | { 2 | "api_url": "https://yourdomain.tld/api", 3 | "confetti_chance": "10" 4 | } 5 | -------------------------------------------------------------------------------- /frontend/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 19 | 21 | 25 | 28 | 31 | 34 | 35 | 37 | 41 | 42 | 50 | 54 | 59 | 63 | 68 | 73 | 74 | 76 | 80 | 84 | 85 | 96 | 98 | 102 | 106 | 107 | 108 | 126 | 133 | 146 | 151 | 154 | 160 | 163 | 168 | 173 | 178 | 183 | 188 | 193 | 194 | 195 | 196 | -------------------------------------------------------------------------------- /frontend/fonts/CartographCF-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zer0bin-dev/zer0bin/832ccc3e887fe22f83530d369a1b34a228cfa070/frontend/fonts/CartographCF-Regular.woff2 -------------------------------------------------------------------------------- /frontend/fonts/CartographCF-RegularItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zer0bin-dev/zer0bin/832ccc3e887fe22f83530d369a1b34a228cfa070/frontend/fonts/CartographCF-RegularItalic.woff2 -------------------------------------------------------------------------------- /frontend/fonts/FiraCode-VF.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zer0bin-dev/zer0bin/832ccc3e887fe22f83530d369a1b34a228cfa070/frontend/fonts/FiraCode-VF.woff2 -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /frontend/index.pug: -------------------------------------------------------------------------------- 1 | != '\n' 9 | 10 | html(lang='en') 11 | head 12 | meta(charset='UTF-8') 13 | meta(name='viewport' content='width=device-width, initial-scale=1.0') 14 | title zer0bin 15 | meta(name='theme-color' content='#90BDC9') 16 | meta(name='keywords' content='zerobin, zer0bin, paste, paste bin, pastebin, pastebin alternative, foss pastebin, open source pastebin, free pastebin, ghostbin, hastebin, pastebin.com, free pastebin online, paste online, github paste, github gist, github gist paste') 17 | meta(name='darkreader' content='NO-DARKREADER-PLUGIN') 18 | meta(name='title' content='zer0bin') 19 | meta(name='description' content='🖊 Just a place to paste') 20 | meta(property='og:type' content='website') 21 | meta(property='og:title' content='zer0bin') 22 | meta(property='og:description' content='🖊 Just a place to paste') 23 | meta(property='og:image' content='https://raw.githubusercontent.com/zer0bin-dev/.github/main/zer0bin.png') 24 | meta(property='twitter:title' content='zer0bin') 25 | meta(property='twitter:description' content='🖊 Just a place to paste') 26 | meta(property='twitter:image' content='https://raw.githubusercontent.com/zer0bin-dev/.github/main/zer0bin.png') 27 | 28 | body 29 | ul.noselect#messages 30 | .button-wrapper.noselect() 31 | a.logo.noselect(href='/') zer0bin 32 | .buttons.noselect 33 | button#save-button.btn(aria-label='Save') 34 | button#markdown-button.btn(aria-label='Markdown') 35 | button#single-view-button.btn(aria-label='Single View') 36 | //- .fireBody(style='visibility: hidden') 37 | //- - var parts = 20; 38 | //- - while (parts--) { 39 | //- .particle 40 | //- - } 41 | button#new-button.btn(aria-label='New paste') 42 | button#copy-button.btn(aria-label='Copy') 43 | button#share-button.btn(aria-label='Share') 44 | a(href='https://github.com/zer0bin-dev/zer0bin' aria-label='GitHub repo') 45 | button#github-button.btn(aria-label='GitHub') 46 | span.viewcounter.noselect#viewcounter-label(style='visibility: hidden; display: none') Views:  47 | span.viewcounter.noselect#viewcounter-count(style='visibility: hidden; display: none') 48 | 49 | .bottom-button-wrapper 50 | button#hide-button.btn(aria-label='Hide') 51 | 52 | .scrollbar-container 53 | .wrapper 54 | .line-numbers.noselect 55 | pre#code-view-pre(style='visibility: hidden') 56 | code#code-view 57 | textarea#text-area(spellcheck='false' autofocus='' name='value' aria-label='Paste input area' disabled='' style='visibility: hidden') -------------------------------------------------------------------------------- /frontend/min/rosepine.min.css: -------------------------------------------------------------------------------- 1 | pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#191724}.hljs,.hljs-subst{color:#e0def4}.hljs-selector-tag{color:#9ccfd8}.hljs-selector-id{color:#c4a7e7;font-weight:700}.hljs-selector-attr,.hljs-selector-class{color:#c4a7e7}.hljs-property,.hljs-selector-pseudo{color:#ebbcba}.hljs-addition{background-color:rgba(156,207,216,.5)}.hljs-deletion{background-color:rgba(235,111,146,.5)}.hljs-built_in,.hljs-class,.hljs-type{color:#c4a7e7}.hljs-function,.hljs-function>.hljs-title,.hljs-title.hljs-function{color:#ebbcba}.hljs-keyword,.hljs-literal,.hljs-symbol{color:#9ccfd8}.hljs-number{color:#f6c177}.hljs-regexp{color:#f6c177}.hljs-string{color:#9ccfd8}.hljs-title{color:#c4a7e7}.hljs-params{color:#e0def4}.hljs-bullet{color:#9ccfd8}.hljs-code{color:#c4a7e7}.hljs-emphasis{font-style:italic}.hljs-formula{color:#c4a7e7}.hljs-strong{font-weight:700}.hljs-link:hover{text-decoration:underline}.hljs-comment,.hljs-quote{color:#6e6a86}.hljs-doctag{color:#c4a7e7}.hljs-meta,.hljs-meta .hljs-keyword{color:#31748f}.hljs-meta .hljs-string{color:#9ccfd8}.hljs-attr{color:#c4a7e7}.hljs-attribute{color:#e0def4}.hljs-name{color:#9ccfd8}.hljs-section{color:#ebbcba}.hljs-tag{color:#9ccfd8}.hljs-template-variable,.hljs-variable{color:#e0def4}.hljs-template-tag{color:#31748f}.language-abnf .hljs-attribute{color:#ebbcba}.language-abnf .hljs-symbol{color:#f6c177}.language-apache .hljs-attribute{color:#ebbcba}.language-apache .hljs-section{color:#9ccfd8}.language-arduino .hljs-built_in{color:#ebbcba}.language-aspectj .hljs-meta{color:#eb6f92}.language-aspectj>.hljs-title{color:#ebbcba}.language-bnf .hljs-attribute{color:#c4a7e7}.language-clojure .hljs-name{color:#ebbcba}.language-clojure .hljs-symbol{color:#f6c177}.language-coq .hljs-built_in{color:#ebbcba}.language-cpp .hljs-meta .hljs-string{color:#c4a7e7}.language-css .hljs-built_in{color:#ebbcba}.language-css .hljs-keyword{color:#eb6f92}.language-diff .hljs-meta,.language-ebnf .hljs-attribute{color:#c4a7e7}.language-glsl .hljs-built_in{color:#ebbcba}.language-groovy .hljs-meta:not(:first-child),.language-haxe .hljs-meta,.language-java .hljs-meta{color:#eb6f92}.language-ldif .hljs-attribute{color:#c4a7e7}.language-lisp .hljs-name,.language-lua .hljs-built_in,.language-moonscript .hljs-built_in,.language-nginx .hljs-attribute{color:#ebbcba}.language-nginx .hljs-section{color:#31748f}.language-pf .hljs-built_in,.language-processing .hljs-built_in{color:#ebbcba}.language-scss .hljs-keyword,.language-stylus .hljs-keyword{color:#9ccfd8}.language-swift .hljs-meta{color:#eb6f92}.language-vim .hljs-built_in{color:#ebbcba;font-style:italic}.language-yaml .hljs-meta{color:#eb6f92} 2 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "zer0bin", 3 | "source": "index.pug", 4 | "version": "1.1.1", 5 | "browserslist": "> 0.5%, last 2 versions, not dead", 6 | "license": "MIT", 7 | "scripts": { 8 | "dev": "vite", 9 | "build": "vite build", 10 | "preview": "vite preview" 11 | }, 12 | "devDependencies": { 13 | "@types/core-js": "^2.5.5", 14 | "@types/node": "^17.0.21", 15 | "pug": "^3.0.2", 16 | "sass": "^1.50.0", 17 | "vite": "^2.9.0", 18 | "vite-plugin-compression": "^0.5.1", 19 | "vite-plugin-pug": "^0.3.1" 20 | }, 21 | "description": "just a place to paste", 22 | "repository": "https://github.com/zer0bin-dev/zer0bin", 23 | "author": "Domterion, ThatOneCalculator", 24 | "dependencies": { 25 | "@ant-design/icons-svg": "^4.2.1", 26 | "highlight.js": "^11.5.0", 27 | "js-confetti": "^0.10.2", 28 | "marked": "^4.0.12", 29 | "no-darkreader": "^1.0.1", 30 | "smooth-scrollbar": "^8.7.4", 31 | "tippy.js": "^6.3.7" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /frontend/src/env.d.ts: -------------------------------------------------------------------------------- 1 | declare const API_URL: string 2 | declare const CONFETTI_CHANCE: string 3 | -------------------------------------------------------------------------------- /frontend/src/icons.ts: -------------------------------------------------------------------------------- 1 | import { 2 | SaveOutlined, 3 | FileAddOutlined, 4 | GithubOutlined, 5 | CopyOutlined, 6 | ForkOutlined, 7 | HeartOutlined, 8 | StarOutlined, 9 | EyeOutlined, 10 | EyeInvisibleOutlined, 11 | FireOutlined, 12 | FileMarkdownOutlined, 13 | ShareAltOutlined, 14 | } from "@ant-design/icons-svg" 15 | import { renderIconDefinitionToSVGElement } from "@ant-design/icons-svg/es/helpers" 16 | import tippy from "tippy.js" 17 | import "../style/tooltip.scss" 18 | import "tippy.js/animations/scale.css" 19 | import { IconDefinition } from "@ant-design/icons-svg/lib/types" 20 | 21 | const saveButton = document.getElementById("save-button") 22 | const newButton = document.getElementById("new-button") 23 | const copyButton = document.getElementById("copy-button") 24 | const hideButton = document.getElementById("hide-button") 25 | const githubButton = document.getElementById("github-button") 26 | const shareButton = document.getElementById("share-button") 27 | const markdownButton = ( 28 | document.getElementById("markdown-button") 29 | ) 30 | 31 | const singleViewButton = ( 32 | document.getElementById("single-view-button") 33 | ) 34 | 35 | const extraSVGAttrs = { 36 | width: "1em", 37 | height: "1em", 38 | fill: "currentColor", 39 | } 40 | function renderIcon(elem: HTMLButtonElement, icon: IconDefinition) { 41 | elem.innerHTML += renderIconDefinitionToSVGElement(icon, { 42 | extraSVGAttrs: extraSVGAttrs, 43 | }) 44 | } 45 | 46 | renderIcon(saveButton, SaveOutlined) 47 | renderIcon(newButton, FileAddOutlined) 48 | renderIcon(copyButton, CopyOutlined) 49 | renderIcon(githubButton, GithubOutlined) 50 | renderIcon(hideButton, EyeInvisibleOutlined) 51 | renderIcon(markdownButton, FileMarkdownOutlined) 52 | renderIcon(singleViewButton, FireOutlined) 53 | renderIcon(shareButton, ShareAltOutlined) 54 | 55 | tippy("#save-button", { 56 | content: "Save paste
Ctrl + S", 57 | placement: "bottom", 58 | animation: "scale", 59 | theme: "rosepine", 60 | allowHTML: true, 61 | }) 62 | 63 | tippy("#markdown-button", { 64 | content: "Markdown mode
Ctrl + M", 65 | placement: "bottom", 66 | animation: "scale", 67 | theme: "rosepine", 68 | allowHTML: true, 69 | }) 70 | 71 | tippy("#single-view-button", { 72 | content: 73 | "Single view
Deletes after seen 👻", 74 | placement: "bottom", 75 | animation: "scale", 76 | theme: "rosepine", 77 | allowHTML: true, 78 | }) 79 | 80 | tippy("#new-button", { 81 | content: "New paste
Ctrl + N", 82 | placement: "bottom", 83 | animation: "scale", 84 | theme: "rosepine", 85 | allowHTML: true, 86 | }) 87 | 88 | tippy("#copy-button", { 89 | content: "Duplicate paste
Ctrl + D", 90 | placement: "bottom", 91 | animation: "scale", 92 | theme: "rosepine", 93 | allowHTML: true, 94 | }) 95 | 96 | tippy("#share-button", { 97 | content: `Share paste
Copies URL`, 98 | placement: "top", 99 | animation: "scale", 100 | theme: "rosepine", 101 | allowHTML: true, 102 | }) 103 | 104 | tippy("#github-button", { 105 | content: `GitHub
106 | ${renderIconDefinitionToSVGElement(StarOutlined, { 107 | extraSVGAttrs: extraSVGAttrs, 108 | })} ${renderIconDefinitionToSVGElement(ForkOutlined, { 109 | extraSVGAttrs: extraSVGAttrs, 110 | })} ${renderIconDefinitionToSVGElement(HeartOutlined, { 111 | extraSVGAttrs: extraSVGAttrs, 112 | })}`, 113 | placement: "bottom", 114 | animation: "scale", 115 | theme: "rosepine", 116 | allowHTML: true, 117 | }) 118 | 119 | tippy("#hide-button", { 120 | content: "Hide the button pane", 121 | placement: "top", 122 | animation: "scale", 123 | theme: "rosepine", 124 | allowHTML: true, 125 | }) 126 | 127 | const observer = new MutationObserver(callback) 128 | 129 | function callback() { 130 | let theme = "" 131 | 132 | if (window.location.pathname == "/") { 133 | theme = "rosepine" 134 | } else { 135 | theme = "rosepine-extended" 136 | } 137 | 138 | document.querySelectorAll("button").forEach(function (btn) { 139 | //@ts-ignore 140 | btn._tippy.setProps({ theme: theme }) 141 | }) 142 | } 143 | 144 | observer.observe(document.getElementById("code-view-pre"), { 145 | attributes: true, 146 | }) 147 | 148 | export function toggleHiddenIcon(hidden: boolean) { 149 | if (!hidden) { 150 | hideButton.innerHTML = renderIconDefinitionToSVGElement( 151 | EyeInvisibleOutlined, 152 | { 153 | extraSVGAttrs: extraSVGAttrs, 154 | } 155 | ) 156 | } else { 157 | hideButton.innerHTML = renderIconDefinitionToSVGElement(EyeOutlined, { 158 | extraSVGAttrs: extraSVGAttrs, 159 | }) 160 | } 161 | } 162 | -------------------------------------------------------------------------------- /frontend/src/index.ts: -------------------------------------------------------------------------------- 1 | import "no-darkreader" 2 | 3 | import { marked } from "marked" 4 | import JSConfetti from "js-confetti" 5 | import Scrollbar from "smooth-scrollbar" 6 | 7 | import "./icons" 8 | import hljs from "highlight.js/lib/common" 9 | // import hljs from "../min/highlight.min" 10 | 11 | import "../min/rosepine.min.css" 12 | import { toggleHiddenIcon } from "./icons" 13 | 14 | let rawContent = "" 15 | let buttonPaneHidden = false 16 | let isMarkdown = false 17 | let singleView = false 18 | 19 | const jsConfetti = new JSConfetti() 20 | 21 | const lineNumbers = document.querySelector(".line-numbers") 22 | const wrapper = document.querySelector(".wrapper") 23 | const buttonWrapper = document.querySelector(".button-wrapper") 24 | const editor = document.getElementById("text-area") 25 | const codeViewPre = document.getElementById("code-view-pre") 26 | const codeView = document.getElementById("code-view") 27 | const messages = document.getElementById("messages") 28 | const viewCounterLabel = ( 29 | document.getElementById("viewcounter-label") 30 | ) 31 | const viewCounter = ( 32 | document.getElementById("viewcounter-count") 33 | ) 34 | const saveButton = document.getElementById("save-button") 35 | const newButton = document.getElementById("new-button") 36 | const copyButton = document.getElementById("copy-button") 37 | const hideButton = document.getElementById("hide-button") 38 | const shareButton = document.getElementById("share-button") 39 | const markdownButton = ( 40 | document.getElementById("markdown-button") 41 | ) 42 | const singleViewButton = ( 43 | document.getElementById("single-view-button") 44 | ) 45 | 46 | function hide(element: HTMLElement) { 47 | element.style.visibility = "hidden" 48 | element.style.opacity = "0" 49 | } 50 | 51 | function show(element: HTMLElement) { 52 | element.style.visibility = "visible" 53 | element.style.opacity = "1" 54 | } 55 | 56 | function disable(element: HTMLButtonElement) { 57 | element.disabled = true 58 | } 59 | 60 | function enable(element: HTMLButtonElement) { 61 | element.disabled = false 62 | } 63 | 64 | async function postPaste(content: string, callback: Function) { 65 | const payload = { content, single_view: singleView } 66 | await fetch(`${API_URL}/p/n`, { 67 | method: "POST", 68 | headers: { 69 | "Content-Type": "application/json", 70 | }, 71 | body: JSON.stringify(payload), 72 | }) 73 | .then((response) => response.json()) 74 | .then((data) => { 75 | if (data["success"]) { 76 | callback(null, data) 77 | return 78 | } 79 | 80 | callback(data || { data: { message: "An unkown error occured!" } }) 81 | }) 82 | .catch(() => { 83 | callback({ 84 | data: { message: "An API error occurred, please try again." }, 85 | }) 86 | }) 87 | } 88 | 89 | async function getPaste(id: string, callback: Function) { 90 | await fetch(`${API_URL}/p/${id}`, { 91 | method: "GET", 92 | headers: { 93 | "Content-Type": "application/json", 94 | }, 95 | referrerPolicy: "no-referrer", 96 | }) 97 | .then((response) => response.json()) 98 | .then((data) => { 99 | if (data["success"]) { 100 | callback(null, data) 101 | return 102 | } 103 | callback(data || { data: { message: "An unkown error occured!" } }) 104 | }) 105 | .catch(() => { 106 | callback({ 107 | data: { message: "An API error occurred, please try again." }, 108 | }) 109 | }) 110 | } 111 | 112 | function newPaste() { 113 | Scrollbar.destroyAll() 114 | 115 | lineNumbers.innerHTML = ">" 116 | 117 | enable(saveButton) 118 | disable(newButton) 119 | disable(copyButton) 120 | disable(shareButton) 121 | enable(singleViewButton) 122 | 123 | editor.value = "" 124 | rawContent = "" 125 | 126 | wrapper.classList.add("text-area-proper") 127 | show(editor) 128 | editor.disabled = false 129 | hide(codeViewPre) 130 | hide(viewCounterLabel) 131 | hide(viewCounter) 132 | viewCounterLabel.style.display = "none" 133 | viewCounter.style.display = "none" 134 | } 135 | 136 | function addMessage(message: string) { 137 | let msg = document.createElement("li") 138 | msg.innerHTML = message 139 | messages.insertBefore(msg, messages.firstChild) 140 | 141 | setTimeout(function () { 142 | msg.classList.add("fadeOut"), 143 | function () { 144 | msg.remove() 145 | } 146 | }, 3000) 147 | } 148 | 149 | function viewPaste(content: string, views: string, singleView: boolean) { 150 | lineNumbers.innerHTML = "" 151 | if ( 152 | content.startsWith("---") || 153 | content.startsWith("md ") || 154 | content.startsWith("md\n") 155 | ) { 156 | codeView.innerHTML = marked.parse(content.substring(3)) 157 | } else { 158 | for (let i = 1; i <= content.split("\n").length; i++) { 159 | lineNumbers.innerHTML = lineNumbers.innerHTML + `${i}
` 160 | } 161 | codeView.innerHTML = hljs.highlightAuto(content).value 162 | } 163 | 164 | if (singleView) { 165 | show(singleViewButton.firstElementChild as HTMLElement) 166 | singleViewButton.lastElementChild.classList.add("fire") 167 | addMessage("This is a single-view paste!") 168 | } 169 | 170 | enable(shareButton) 171 | shareButton.addEventListener("click", function () { 172 | const url = window.location.toString() 173 | if (navigator.canShare) { 174 | navigator.share({ 175 | title: "zer0bin paste", 176 | url: url, 177 | }) 178 | } else { 179 | navigator.clipboard.writeText(url) 180 | addMessage("Copied URL to clipboard!") 181 | } 182 | }) 183 | 184 | disable(saveButton) 185 | disable(markdownButton) 186 | enable(newButton) 187 | enable(copyButton) 188 | disable(singleViewButton) 189 | 190 | hide(editor) 191 | show(codeViewPre) 192 | show(viewCounterLabel) 193 | show(viewCounter) 194 | viewCounterLabel.style.display = null 195 | viewCounter.style.display = null 196 | 197 | viewCounter.textContent = views 198 | 199 | try { 200 | wrapper.classList.remove("text-area-proper") 201 | } catch (error) {} 202 | 203 | Scrollbar.init(document.querySelector(".scrollbar-container")) 204 | } 205 | 206 | async function savePaste() { 207 | if (editor.value === "") { 208 | return 209 | } 210 | const val: string = editor.value?.toString()! 211 | 212 | await postPaste(val, function (err, res) { 213 | if (err) { 214 | addMessage(err["data"]["message"]) 215 | } else { 216 | window.history.pushState(null, "", `/${res["data"]["id"]}`) 217 | 218 | rawContent = res["data"]["content"] 219 | viewPaste(rawContent, "0", res["data"]["single_view"]) 220 | 221 | const rand = Math.floor( 222 | Math.random() * parseInt(CONFETTI_CHANCE ?? "10") * 6 223 | ) 224 | 225 | if (rand < 5) { 226 | jsConfetti.addConfetti({ 227 | confettiColors: [ 228 | "#eb6f92", 229 | "#f6c177", 230 | "#ebbcba", 231 | "#31748f", 232 | "#9ccfd8", 233 | "#c4a7e7", 234 | ], 235 | }) 236 | } else if (rand === 5) { 237 | jsConfetti.addConfetti({ 238 | emojis: ["🦀"], 239 | }) 240 | } else if (rand === 6) { 241 | jsConfetti.addConfetti({ 242 | emojis: ["🐈", "🧶", "📦"], 243 | }) 244 | } 245 | } 246 | }) 247 | } 248 | 249 | async function duplicatePaste() { 250 | const content = rawContent 251 | window.history.pushState(null, "", "/") 252 | newPaste() 253 | 254 | rawContent = content 255 | editor.value = content 256 | } 257 | 258 | function toggleMarkdown() { 259 | let val = editor.value 260 | markdownButton.lastElementChild.classList.toggle("markdown") 261 | if (isMarkdown) { 262 | isMarkdown = false 263 | val = val.substring(val.indexOf("\n") + 1) 264 | } else { 265 | isMarkdown = true 266 | val = `---\n${val}` 267 | } 268 | } 269 | 270 | saveButton.addEventListener("click", async function () { 271 | await savePaste() 272 | }) 273 | 274 | document.addEventListener("keydown", (e) => { 275 | if (e.ctrlKey && e.code === "KeyS") { 276 | e.preventDefault() 277 | savePaste() 278 | } else if (e.ctrlKey && e.code === "KeyN") { 279 | e.preventDefault() 280 | newPaste() 281 | } else if (e.ctrlKey && e.code === "KeyD") { 282 | e.preventDefault() 283 | duplicatePaste() 284 | } else if (e.ctrlKey && e.code === "KeyM") { 285 | e.preventDefault() 286 | toggleMarkdown() 287 | } 288 | }) 289 | 290 | editor.addEventListener( 291 | "keydown", 292 | function (e: KeyboardEvent) { 293 | if (e.code == "Tab") { 294 | e.preventDefault() 295 | 296 | let start: number = this.selectionStart 297 | let end: number = this.selectionEnd 298 | 299 | this.value = 300 | this.value.substring(0, start) + 301 | "\t" + 302 | this.value.substring(end) 303 | 304 | this.selectionStart = this.selectionEnd = start + 1 305 | } 306 | }, 307 | false 308 | ) 309 | 310 | copyButton.addEventListener("click", async function () { 311 | await duplicatePaste() 312 | }) 313 | 314 | newButton.addEventListener("click", function () { 315 | window.location.href = "/" 316 | }) 317 | 318 | hideButton.addEventListener("click", function () { 319 | if (!buttonPaneHidden) { 320 | buttonPaneHidden = true 321 | hide(buttonWrapper) 322 | } else { 323 | buttonPaneHidden = false 324 | show(buttonWrapper) 325 | } 326 | 327 | toggleHiddenIcon(buttonPaneHidden) 328 | }) 329 | 330 | markdownButton.addEventListener("click", function () { 331 | toggleMarkdown() 332 | }) 333 | 334 | singleViewButton.addEventListener("click", function () { 335 | singleViewButton.lastElementChild.classList.toggle("fire") 336 | if (singleView) { 337 | singleView = false 338 | hide(singleViewButton.firstElementChild as HTMLElement) 339 | } else { 340 | singleView = true 341 | show(singleViewButton.firstElementChild as HTMLElement) 342 | } 343 | }) 344 | 345 | async function handlePopstate() { 346 | const path = window.location.pathname 347 | 348 | if (path == "/") { 349 | newPaste() 350 | } else { 351 | const split = path.split("/") 352 | const id = split[split.length - 1] 353 | 354 | await getPaste(id, function (err, res) { 355 | if (err) { 356 | window.history.pushState(null, "", `/`) 357 | newPaste() 358 | } else { 359 | rawContent = res["data"]["content"] 360 | viewPaste( 361 | rawContent, 362 | res["data"]["views"].toString(), 363 | res["data"]["single_view"] 364 | ) 365 | } 366 | }) 367 | } 368 | } 369 | 370 | window.addEventListener("popstate", async () => { 371 | await handlePopstate() 372 | }) 373 | 374 | document.addEventListener( 375 | "DOMContentLoaded", 376 | async () => { 377 | await handlePopstate() 378 | }, 379 | false 380 | ) 381 | -------------------------------------------------------------------------------- /frontend/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | 5 | /* Projects */ 6 | // "incremental": true, /* Enable incremental compilation */ 7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 8 | // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ 9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ 10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 12 | 13 | /* Language and Environment */ 14 | "target": "es5" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, 15 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 16 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 17 | // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ 18 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 19 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ 20 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 21 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ 22 | // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ 23 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 24 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 25 | 26 | /* Modules */ 27 | "module": "esnext" /* Specify what module code is generated. */, 28 | // "rootDir": "./", /* Specify the root folder within your source files. */ 29 | "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */, 30 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 31 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 32 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 33 | // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ 34 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 35 | "allowUmdGlobalAccess": true /* Allow accessing UMD globals from modules. */, 36 | "resolveJsonModule": true /* Enable importing .json files */, 37 | // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ 38 | 39 | /* JavaScript Support */ 40 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ 41 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 42 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ 43 | 44 | /* Emit */ 45 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 46 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 47 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 48 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 49 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ 50 | // "outDir": "./", /* Specify an output folder for all emitted files. */ 51 | // "removeComments": true, /* Disable emitting comments. */ 52 | // "noEmit": true, /* Disable emitting files from a compilation. */ 53 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 54 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ 55 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 56 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 57 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 58 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 59 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 60 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 61 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 62 | // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ 63 | // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ 64 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 65 | // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ 66 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 67 | // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ 68 | 69 | /* Interop Constraints */ 70 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 71 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 72 | "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */, 73 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 74 | "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, 75 | 76 | /* Type Checking */ 77 | "strict": false /* Enable all strict type-checking options. */, 78 | "noImplicitAny": false /* Enable error reporting for expressions and declarations with an implied `any` type.. */, 79 | // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ 80 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 81 | // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ 82 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 83 | // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ 84 | // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ 85 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 86 | // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ 87 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ 88 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 89 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 90 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 91 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ 92 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 93 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ 94 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 95 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 96 | 97 | /* Completeness */ 98 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 99 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /frontend/style/font-fira.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: "Cartograph CF"; 3 | src: url("../fonts/FiraCode-VF.woff2") format("woff2"); 4 | font-weight: normal; 5 | font-style: normal; 6 | font-display: swap; 7 | } 8 | -------------------------------------------------------------------------------- /frontend/style/font.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: "Cartograph CF"; 3 | src: url("../fonts/CartographCF-Regular.woff2") format("woff2"); 4 | font-weight: normal; 5 | font-style: normal; 6 | font-display: swap; 7 | } 8 | @font-face { 9 | font-family: "Cartograph CF"; 10 | src: url("../fonts/CartographCF-RegularItalic.woff2") format("woff2"); 11 | font-weight: normal; 12 | font-style: italic; 13 | font-display: swap; 14 | } 15 | -------------------------------------------------------------------------------- /frontend/style/style.scss: -------------------------------------------------------------------------------- 1 | $love: #eb6f92; 2 | $gold: #f6c177; 3 | $rose: #ebbcba; 4 | $pine: #31748f; 5 | $foam: #9ccfd8; 6 | $iris: #c4a7e7; 7 | $text: #e0def4; 8 | $subtle: #908caa; 9 | $muted: #6e6a86; 10 | $highlight: #403d52; 11 | $bg_base: #191724; 12 | $bg_surface: #1f1d2e; 13 | $bg_trans: rgba(31, 29, 46, 0.8); 14 | $font-mono: "Cartograph CF", ui-monospace, SFMono-Regular, Menlo, Monaco, 15 | Consolas, "Liberation Mono", "Courier New", monospace; 16 | 17 | @import "./font.scss"; 18 | 19 | @keyframes rainbow { 20 | 0%, 21 | 100% { 22 | background-position: 0 0; 23 | } 24 | 50% { 25 | background-position: 100% 0; 26 | } 27 | } 28 | .fadeOut { 29 | visibility: hidden; 30 | opacity: 0; 31 | transition: visibility 0s 3s, opacity 2s linear; 32 | } 33 | body { 34 | height: 100%; 35 | background-color: $bg_base; 36 | margin: 0; 37 | } 38 | html { 39 | height: 100%; 40 | } 41 | pre { 42 | margin: 0; 43 | } 44 | @mixin selection { 45 | ::-moz-selection { 46 | @content; 47 | } 48 | ::selection { 49 | @content; 50 | } 51 | } 52 | @include selection { 53 | color: $text; 54 | background: $highlight; 55 | } 56 | .noselect { 57 | user-select: none; 58 | -webkit-user-select: none; 59 | -khtml-user-select: none; 60 | -moz-user-select: none; 61 | -ms-user-select: none; 62 | } 63 | .wrapper .scroll-content { 64 | display: flex; 65 | } 66 | .scrollbar-container { 67 | height: 100%; 68 | } 69 | .wrapper { 70 | display: flex; 71 | padding: 1rem 0.5rem; 72 | font-size: 1rem; 73 | } 74 | .text-area-proper { 75 | height: calc(100% - 2rem); 76 | } 77 | .line-numbers { 78 | color: $subtle; 79 | font-family: $font-mono; 80 | text-align: end; 81 | user-select: none; 82 | font-size: 15px; 83 | padding-right: 11px; 84 | line-height: 1.5em; 85 | } 86 | #code-view-pre { 87 | font-family: $font-mono; 88 | padding-top: 0; 89 | padding-bottom: 0; 90 | font-size: 15px; 91 | -webkit-text-size-adjust: none; 92 | line-height: 1.5em; 93 | } 94 | #code-view { 95 | font-family: $font-mono; 96 | padding-top: 0; 97 | padding-bottom: 0; 98 | line-height: 1.5em; 99 | } 100 | .viewcounter { 101 | font-size: 12px; 102 | font-family: $font-mono; 103 | margin-top: 0px; 104 | margin-bottom: 0px; 105 | } 106 | #viewcounter-label { 107 | color: $subtle; 108 | } 109 | #viewcounter-count { 110 | color: $rose; 111 | } 112 | code { 113 | color: $text; 114 | } 115 | textarea { 116 | background-color: transparent; 117 | resize: none; 118 | width: 100%; 119 | height: 100%; 120 | padding: 0; 121 | margin: 0; 122 | border: none; 123 | outline: 0; 124 | color: $text; 125 | font-family: $font-mono; 126 | font-size: 15px; 127 | } 128 | .button-wrapper { 129 | position: fixed !important; 130 | top: 0; 131 | right: 0; 132 | padding: 0.7rem 0.7rem 0.5rem 0.7rem; 133 | background-color: $bg_surface; 134 | border-bottom-left-radius: 10px; 135 | z-index: 10; 136 | transition: opacity 0.2s, visibility 0.2s; 137 | } 138 | .buttons { 139 | display: flex; 140 | > * { 141 | + { 142 | * { 143 | padding: 0.1rem 0.1rem 0.1rem 0.1rem; 144 | } 145 | } 146 | } 147 | } 148 | a { 149 | color: $pine; 150 | &:visited { 151 | color: $iris; 152 | } 153 | &:hover { 154 | &:not(.logo) { 155 | color: $foam; 156 | } 157 | } 158 | } 159 | .btn { 160 | cursor: pointer; 161 | background: 0 0; 162 | color: $foam; 163 | padding: 5px 5px 5px 5px; 164 | font-size: 1rem; 165 | border: none; 166 | transition: background-color 0.2s ease-in-out; 167 | display: inline-block; 168 | text-decoration: none; 169 | &:hover { 170 | color: $text; 171 | } 172 | &:disabled { 173 | color: $muted; 174 | } 175 | transition: all 0.2s ease-in; 176 | } 177 | .btn[disabled] { 178 | color: $muted; 179 | cursor: auto; 180 | } 181 | .bottom-button-wrapper { 182 | position: fixed !important; 183 | bottom: 0; 184 | right: 0; 185 | padding: 1rem 1rem 0.5rem 1rem; 186 | z-index: 10; 187 | 188 | .btn { 189 | color: $muted; 190 | &:hover { 191 | color: $gold; 192 | } 193 | } 194 | } 195 | // #share-button { 196 | // position: fixed !important; 197 | // bottom: 0; 198 | // left: 0; 199 | // z-index: 10; 200 | // color: $muted; 201 | // &:hover { 202 | // color: $rose; 203 | // } 204 | // padding: 10px; 205 | // } 206 | .keybind { 207 | color: $subtle; 208 | font-size: 11px; 209 | font-family: $font-mono; 210 | } 211 | .logo { 212 | font-size: 1.8rem; 213 | font-weight: 700; 214 | text-align: center; 215 | text-decoration: none; 216 | width: 100%; 217 | font-family: $font-mono; 218 | display: inline-block; 219 | background: linear-gradient( 220 | to right, 221 | $love, 222 | $gold, 223 | $rose, 224 | $pine, 225 | $foam, 226 | $iris 227 | ); 228 | -webkit-background-clip: text; 229 | background-clip: text; 230 | color: transparent; 231 | animation: rainbow 120s linear infinite; 232 | background-size: 400% 100%; 233 | &:hover { 234 | animation: rainbow 3s ease infinite !important; 235 | } 236 | } 237 | .markdown { 238 | color: $iris; 239 | } 240 | .fire { 241 | color: $love; 242 | } 243 | // $dur: 1s; 244 | // $blur: 0.02em; 245 | // $fireRad: 3em; 246 | // $parts: 20; 247 | // $partSize: 5em; 248 | // .fireBody { 249 | // font-size: 3px; 250 | // filter: blur($blur); 251 | // -webkit-filter: blur($blur); 252 | // margin: 2em auto 0 auto; 253 | // position: absolute; 254 | // width: 6em; 255 | // height: 5em; 256 | // z-index: 0; 257 | // opacity: 0.5; 258 | // } 259 | // .particle { 260 | // animation: rise $dur ease-in infinite; 261 | // background-image: radial-gradient($love 100%, $love 100%); 262 | // border-radius: 50%; 263 | // mix-blend-mode: screen; 264 | // opacity: 0; 265 | // position: absolute; 266 | // bottom: 0; 267 | // width: $partSize; 268 | // height: $partSize; 269 | // @for $p from 1 through $parts { 270 | // &:nth-of-type(#{$p}) { 271 | // animation-delay: $dur * random(); 272 | // left: calc((100% - #{$partSize}) * calc(($p - 1) / $parts)); 273 | // } 274 | // } 275 | // } 276 | // @keyframes rise { 277 | // from { 278 | // opacity: 0; 279 | // transform: translateY(0) scale(1); 280 | // } 281 | // 25% { 282 | // opacity: 1; 283 | // } 284 | // to { 285 | // opacity: 0; 286 | // transform: translateY(-10em) scale(0); 287 | // } 288 | // } 289 | #messages { 290 | position: absolute; 291 | top: 0; 292 | right: 168px; 293 | z-index: 1000; 294 | padding: 0; 295 | margin: 0; 296 | list-style: none; 297 | width: 400px; 298 | li { 299 | background-color: $bg_trans; 300 | font-size: 13px; 301 | font-family: $font-mono; 302 | color: $text; 303 | padding: 7px; 304 | } 305 | } 306 | @media only screen and (hover: none) and (pointer: coarse) { 307 | .button-wrapper { 308 | opacity: 0.8; 309 | } 310 | } 311 | -------------------------------------------------------------------------------- /frontend/style/tooltip.scss: -------------------------------------------------------------------------------- 1 | $text: #e0def4; 2 | $bg: #26233a; 3 | $font-mono: "Cartograph CF", ui-monospace, SFMono-Regular, Menlo, Monaco, 4 | Consolas, "Liberation Mono", "Courier New", monospace; 5 | 6 | @import "./font.scss"; 7 | 8 | .rosepine-parent { 9 | color: $text; 10 | background-color: $bg; 11 | opacity: 0.8; 12 | padding: 10px; 13 | font-family: $font-mono; 14 | font-size: 13px; 15 | border-radius: 10px; 16 | > .tippy-backdrop { 17 | background-color: $bg; 18 | } 19 | > .tippy-svg-arrow { 20 | fill: $bg; 21 | } 22 | } 23 | .tippy-box[data-theme~="rosepine"] { 24 | @extend .rosepine-parent; 25 | margin-top: 0.3rem; 26 | } 27 | .tippy-box[data-theme~="rosepine-extended"] { 28 | @extend .rosepine-parent; 29 | margin-top: 2rem; 30 | } 31 | -------------------------------------------------------------------------------- /frontend/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig, loadEnv } from "vite" 2 | import pugPlugin from "vite-plugin-pug" 3 | import viteCompression from "vite-plugin-compression" 4 | import { createRequire } from "module" 5 | 6 | export default defineConfig(async ({ mode }) => { 7 | let config: any 8 | const env = loadEnv(mode, process.cwd(), "") 9 | 10 | try { 11 | // @ts-ignore 12 | 13 | // lazy hack so vite doesn't emit: 14 | // [rollup-plugin-dynamic-import-variables] Unexpected token (46:55) 15 | // file: zer0bin/frontend/src/index.ts:46:55 16 | // error during build: 17 | // SyntaxError: Unexpected token (46:55) 18 | 19 | const _config = await import("./config.json") 20 | config = { 21 | api_url: JSON.stringify(_config.api_url), 22 | confetti_chance: JSON.stringify(_config.confetti_chance), 23 | } 24 | } catch (e) { 25 | config = { 26 | api_url: JSON.stringify(env.ZEROBIN_API_URL ?? env.API_URL), 27 | confetti_chance: JSON.stringify( 28 | env.ZEROBIN_CONFETTI_CHANCE ?? env.CONFETTI_CHANCE 29 | ), 30 | } 31 | } 32 | 33 | return { 34 | plugins: [pugPlugin(), viteCompression()], 35 | define: { 36 | API_URL: config.api_url, 37 | CONFETTI_CHANCE: config.confetti_chance, 38 | }, 39 | } 40 | }) 41 | -------------------------------------------------------------------------------- /frontend/yarn.lock: -------------------------------------------------------------------------------- 1 | # This file is generated by running "yarn install" inside your project. 2 | # Manual changes might be lost - proceed with caution! 3 | 4 | __metadata: 5 | version: 6 6 | cacheKey: 8 7 | 8 | "@ant-design/icons-svg@npm:^4.2.1": 9 | version: 4.2.1 10 | resolution: "@ant-design/icons-svg@npm:4.2.1" 11 | checksum: c1fa1bbeb0c58209e2c5d49ce001543823ae2d8326e1c7aafb992deac7aaa901a44f9a16151ad919d2628dbe3d783b325ed2b9440436002225801332323296d4 12 | languageName: node 13 | linkType: hard 14 | 15 | "@babel/helper-validator-identifier@npm:^7.16.7": 16 | version: 7.16.7 17 | resolution: "@babel/helper-validator-identifier@npm:7.16.7" 18 | checksum: dbb3db9d184343152520a209b5684f5e0ed416109cde82b428ca9c759c29b10c7450657785a8b5c5256aa74acc6da491c1f0cf6b784939f7931ef82982051b69 19 | languageName: node 20 | linkType: hard 21 | 22 | "@babel/parser@npm:^7.6.0, @babel/parser@npm:^7.9.6": 23 | version: 7.17.9 24 | resolution: "@babel/parser@npm:7.17.9" 25 | bin: 26 | parser: ./bin/babel-parser.js 27 | checksum: ea59c985ebfae7c0299c8ea63ed34903202f51665db8d59c55b4366e20270b74d7367a2c211fdd2db20f25750df89adcc85ab6c8692061c6459a88efb79f43e6 28 | languageName: node 29 | linkType: hard 30 | 31 | "@babel/types@npm:^7.6.1, @babel/types@npm:^7.8.3, @babel/types@npm:^7.9.6": 32 | version: 7.17.0 33 | resolution: "@babel/types@npm:7.17.0" 34 | dependencies: 35 | "@babel/helper-validator-identifier": ^7.16.7 36 | to-fast-properties: ^2.0.0 37 | checksum: 12e5a287986fe557188e87b2c5202223f1dc83d9239a196ab936fdb9f8c1eb0be717ff19f934b5fad4e29a75586d5798f74bed209bccea1c20376b9952056f0e 38 | languageName: node 39 | linkType: hard 40 | 41 | "@gar/promisify@npm:^1.1.3": 42 | version: 1.1.3 43 | resolution: "@gar/promisify@npm:1.1.3" 44 | checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1 45 | languageName: node 46 | linkType: hard 47 | 48 | "@npmcli/fs@npm:^2.1.0": 49 | version: 2.1.0 50 | resolution: "@npmcli/fs@npm:2.1.0" 51 | dependencies: 52 | "@gar/promisify": ^1.1.3 53 | semver: ^7.3.5 54 | checksum: 6ec6d678af6da49f9dac50cd882d7f661934dd278972ffbaacde40d9eaa2871292d634000a0cca9510f6fc29855fbd4af433e1adbff90a524ec3eaf140f1219b 55 | languageName: node 56 | linkType: hard 57 | 58 | "@npmcli/move-file@npm:^1.1.2": 59 | version: 1.1.2 60 | resolution: "@npmcli/move-file@npm:1.1.2" 61 | dependencies: 62 | mkdirp: ^1.0.4 63 | rimraf: ^3.0.2 64 | checksum: c96381d4a37448ea280951e46233f7e541058cf57a57d4094dd4bdcaae43fa5872b5f2eb6bfb004591a68e29c5877abe3cdc210cb3588cbf20ab2877f31a7de7 65 | languageName: node 66 | linkType: hard 67 | 68 | "@popperjs/core@npm:^2.9.0": 69 | version: 2.11.4 70 | resolution: "@popperjs/core@npm:2.11.4" 71 | checksum: 36168d274aa164368a50aef2e7b2f858e1b9145d9250af9dc1315ff719d874a367177760f8285efb75c8cf48267194a50e7dc9cdb41bf0b1958c38805c13564c 72 | languageName: node 73 | linkType: hard 74 | 75 | "@tootallnate/once@npm:2": 76 | version: 2.0.0 77 | resolution: "@tootallnate/once@npm:2.0.0" 78 | checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 79 | languageName: node 80 | linkType: hard 81 | 82 | "@types/core-js@npm:^2.5.5": 83 | version: 2.5.5 84 | resolution: "@types/core-js@npm:2.5.5" 85 | checksum: 54eb91dc52206d8e524771cd079be4bed6a41947d08183a7954df7a3dc25ae21c8b7176143dc7203df82a6e5ff1df8998edc8d407c4a082bdbf0ede35369c5c3 86 | languageName: node 87 | linkType: hard 88 | 89 | "@types/node@npm:^17.0.21": 90 | version: 17.0.23 91 | resolution: "@types/node@npm:17.0.23" 92 | checksum: a3517554737cbb042e76c30d0e5482192ac4d9bea0eeb086e2622d9cabf460a0eb52a696b99fcd18e7fcc93c96db6cc7ae507f6608f256ef0b5c1d8c87a5a470 93 | languageName: node 94 | linkType: hard 95 | 96 | "abbrev@npm:1": 97 | version: 1.1.1 98 | resolution: "abbrev@npm:1.1.1" 99 | checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 100 | languageName: node 101 | linkType: hard 102 | 103 | "acorn@npm:^7.1.1": 104 | version: 7.4.1 105 | resolution: "acorn@npm:7.4.1" 106 | bin: 107 | acorn: bin/acorn 108 | checksum: 1860f23c2107c910c6177b7b7be71be350db9e1080d814493fae143ae37605189504152d1ba8743ba3178d0b37269ce1ffc42b101547fdc1827078f82671e407 109 | languageName: node 110 | linkType: hard 111 | 112 | "agent-base@npm:6, agent-base@npm:^6.0.2": 113 | version: 6.0.2 114 | resolution: "agent-base@npm:6.0.2" 115 | dependencies: 116 | debug: 4 117 | checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d 118 | languageName: node 119 | linkType: hard 120 | 121 | "agentkeepalive@npm:^4.2.1": 122 | version: 4.2.1 123 | resolution: "agentkeepalive@npm:4.2.1" 124 | dependencies: 125 | debug: ^4.1.0 126 | depd: ^1.1.2 127 | humanize-ms: ^1.2.1 128 | checksum: 39cb49ed8cf217fd6da058a92828a0a84e0b74c35550f82ee0a10e1ee403c4b78ade7948be2279b188b7a7303f5d396ea2738b134731e464bf28de00a4f72a18 129 | languageName: node 130 | linkType: hard 131 | 132 | "aggregate-error@npm:^3.0.0": 133 | version: 3.1.0 134 | resolution: "aggregate-error@npm:3.1.0" 135 | dependencies: 136 | clean-stack: ^2.0.0 137 | indent-string: ^4.0.0 138 | checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 139 | languageName: node 140 | linkType: hard 141 | 142 | "ansi-regex@npm:^5.0.1": 143 | version: 5.0.1 144 | resolution: "ansi-regex@npm:5.0.1" 145 | checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b 146 | languageName: node 147 | linkType: hard 148 | 149 | "ansi-styles@npm:^4.1.0": 150 | version: 4.3.0 151 | resolution: "ansi-styles@npm:4.3.0" 152 | dependencies: 153 | color-convert: ^2.0.1 154 | checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 155 | languageName: node 156 | linkType: hard 157 | 158 | "anymatch@npm:~3.1.2": 159 | version: 3.1.2 160 | resolution: "anymatch@npm:3.1.2" 161 | dependencies: 162 | normalize-path: ^3.0.0 163 | picomatch: ^2.0.4 164 | checksum: 985163db2292fac9e5a1e072bf99f1b5baccf196e4de25a0b0b81865ebddeb3b3eb4480734ef0a2ac8c002845396b91aa89121f5b84f93981a4658164a9ec6e9 165 | languageName: node 166 | linkType: hard 167 | 168 | "aproba@npm:^1.0.3 || ^2.0.0": 169 | version: 2.0.0 170 | resolution: "aproba@npm:2.0.0" 171 | checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 172 | languageName: node 173 | linkType: hard 174 | 175 | "are-we-there-yet@npm:^3.0.0": 176 | version: 3.0.0 177 | resolution: "are-we-there-yet@npm:3.0.0" 178 | dependencies: 179 | delegates: ^1.0.0 180 | readable-stream: ^3.6.0 181 | checksum: 348edfdd931b0b50868b55402c01c3f64df1d4c229ab6f063539a5025fd6c5f5bb8a0cab409bbed8d75d34762d22aa91b7c20b4204eb8177063158d9ba792981 182 | languageName: node 183 | linkType: hard 184 | 185 | "asap@npm:~2.0.3": 186 | version: 2.0.6 187 | resolution: "asap@npm:2.0.6" 188 | checksum: b296c92c4b969e973260e47523207cd5769abd27c245a68c26dc7a0fe8053c55bb04360237cb51cab1df52be939da77150ace99ad331fb7fb13b3423ed73ff3d 189 | languageName: node 190 | linkType: hard 191 | 192 | "assert-never@npm:^1.2.1": 193 | version: 1.2.1 194 | resolution: "assert-never@npm:1.2.1" 195 | checksum: ea4f1756d90f55254c4dc7a20d6c5d5bc169160562aefe3d8756b598c10e695daf568f21b6d6b12245d7f3782d3ff83ef6a01ab75d487adfc6909470a813bf8c 196 | languageName: node 197 | linkType: hard 198 | 199 | "babel-walk@npm:3.0.0-canary-5": 200 | version: 3.0.0-canary-5 201 | resolution: "babel-walk@npm:3.0.0-canary-5" 202 | dependencies: 203 | "@babel/types": ^7.9.6 204 | checksum: 6fe7ee3889343a6602f665c28ea135956a0767d7f7ca5fc1d72c5243e2f6e9d8a64f51254bf2fd0cce47b79fceeccf7a357f37cfa755a509dfb930a21151837c 205 | languageName: node 206 | linkType: hard 207 | 208 | "balanced-match@npm:^1.0.0": 209 | version: 1.0.2 210 | resolution: "balanced-match@npm:1.0.2" 211 | checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 212 | languageName: node 213 | linkType: hard 214 | 215 | "binary-extensions@npm:^2.0.0": 216 | version: 2.2.0 217 | resolution: "binary-extensions@npm:2.2.0" 218 | checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 219 | languageName: node 220 | linkType: hard 221 | 222 | "brace-expansion@npm:^1.1.7": 223 | version: 1.1.11 224 | resolution: "brace-expansion@npm:1.1.11" 225 | dependencies: 226 | balanced-match: ^1.0.0 227 | concat-map: 0.0.1 228 | checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 229 | languageName: node 230 | linkType: hard 231 | 232 | "braces@npm:~3.0.2": 233 | version: 3.0.2 234 | resolution: "braces@npm:3.0.2" 235 | dependencies: 236 | fill-range: ^7.0.1 237 | checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 238 | languageName: node 239 | linkType: hard 240 | 241 | "cacache@npm:^16.0.0": 242 | version: 16.0.3 243 | resolution: "cacache@npm:16.0.3" 244 | dependencies: 245 | "@npmcli/fs": ^2.1.0 246 | "@npmcli/move-file": ^1.1.2 247 | chownr: ^2.0.0 248 | fs-minipass: ^2.1.0 249 | glob: ^7.2.0 250 | infer-owner: ^1.0.4 251 | lru-cache: ^7.7.1 252 | minipass: ^3.1.6 253 | minipass-collect: ^1.0.2 254 | minipass-flush: ^1.0.5 255 | minipass-pipeline: ^1.2.4 256 | mkdirp: ^1.0.4 257 | p-map: ^4.0.0 258 | promise-inflight: ^1.0.1 259 | rimraf: ^3.0.2 260 | ssri: ^8.0.1 261 | tar: ^6.1.11 262 | unique-filename: ^1.1.1 263 | checksum: 9bb9a0bd1b8bee3284c6fa9dcb4b28a62b528dd181f7cd482319611b5d6df295a3594dcefc24d1a4f16162bac50d6facc183ed21935f3d09af6d16f620ea54d3 264 | languageName: node 265 | linkType: hard 266 | 267 | "call-bind@npm:^1.0.2": 268 | version: 1.0.2 269 | resolution: "call-bind@npm:1.0.2" 270 | dependencies: 271 | function-bind: ^1.1.1 272 | get-intrinsic: ^1.0.2 273 | checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 274 | languageName: node 275 | linkType: hard 276 | 277 | "chalk@npm:^4.1.2": 278 | version: 4.1.2 279 | resolution: "chalk@npm:4.1.2" 280 | dependencies: 281 | ansi-styles: ^4.1.0 282 | supports-color: ^7.1.0 283 | checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc 284 | languageName: node 285 | linkType: hard 286 | 287 | "character-parser@npm:^2.2.0": 288 | version: 2.2.0 289 | resolution: "character-parser@npm:2.2.0" 290 | dependencies: 291 | is-regex: ^1.0.3 292 | checksum: 71826fae509d4dc3ef07c2e824da9c8853f910ba0d8fe699edaab263051fd3b8db77bb96e46ed896bb36ed1d86108e6d6ceedff436bec7786ba7f0b585a0bc93 293 | languageName: node 294 | linkType: hard 295 | 296 | "chokidar@npm:>=3.0.0 <4.0.0": 297 | version: 3.5.3 298 | resolution: "chokidar@npm:3.5.3" 299 | dependencies: 300 | anymatch: ~3.1.2 301 | braces: ~3.0.2 302 | fsevents: ~2.3.2 303 | glob-parent: ~5.1.2 304 | is-binary-path: ~2.1.0 305 | is-glob: ~4.0.1 306 | normalize-path: ~3.0.0 307 | readdirp: ~3.6.0 308 | dependenciesMeta: 309 | fsevents: 310 | optional: true 311 | checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c 312 | languageName: node 313 | linkType: hard 314 | 315 | "chownr@npm:^2.0.0": 316 | version: 2.0.0 317 | resolution: "chownr@npm:2.0.0" 318 | checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f 319 | languageName: node 320 | linkType: hard 321 | 322 | "clean-stack@npm:^2.0.0": 323 | version: 2.2.0 324 | resolution: "clean-stack@npm:2.2.0" 325 | checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 326 | languageName: node 327 | linkType: hard 328 | 329 | "color-convert@npm:^2.0.1": 330 | version: 2.0.1 331 | resolution: "color-convert@npm:2.0.1" 332 | dependencies: 333 | color-name: ~1.1.4 334 | checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 335 | languageName: node 336 | linkType: hard 337 | 338 | "color-name@npm:~1.1.4": 339 | version: 1.1.4 340 | resolution: "color-name@npm:1.1.4" 341 | checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 342 | languageName: node 343 | linkType: hard 344 | 345 | "color-support@npm:^1.1.3": 346 | version: 1.1.3 347 | resolution: "color-support@npm:1.1.3" 348 | bin: 349 | color-support: bin.js 350 | checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b 351 | languageName: node 352 | linkType: hard 353 | 354 | "concat-map@npm:0.0.1": 355 | version: 0.0.1 356 | resolution: "concat-map@npm:0.0.1" 357 | checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af 358 | languageName: node 359 | linkType: hard 360 | 361 | "console-control-strings@npm:^1.1.0": 362 | version: 1.1.0 363 | resolution: "console-control-strings@npm:1.1.0" 364 | checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed 365 | languageName: node 366 | linkType: hard 367 | 368 | "constantinople@npm:^4.0.1": 369 | version: 4.0.1 370 | resolution: "constantinople@npm:4.0.1" 371 | dependencies: 372 | "@babel/parser": ^7.6.0 373 | "@babel/types": ^7.6.1 374 | checksum: 8f70f16ddf97cdc263ca16b398bc52470c25e2ec5ed27bc015f251b849597223ce3a123e6924f43efddeb75422c1f55b7e56e0e2e594e4dd2964bfc9392b9b82 375 | languageName: node 376 | linkType: hard 377 | 378 | "core-js@npm:^3.6.4": 379 | version: 3.21.1 380 | resolution: "core-js@npm:3.21.1" 381 | checksum: d68eddd831340ad5b24ac29c72fda022a43b17f194c4278b6b875a843283d316502cb4abd07f28631d6ebc4387f66aa06e2b1b3c8fd7e08096a751b5c63f6889 382 | languageName: node 383 | linkType: hard 384 | 385 | "debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.3": 386 | version: 4.3.4 387 | resolution: "debug@npm:4.3.4" 388 | dependencies: 389 | ms: 2.1.2 390 | peerDependenciesMeta: 391 | supports-color: 392 | optional: true 393 | checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 394 | languageName: node 395 | linkType: hard 396 | 397 | "delegates@npm:^1.0.0": 398 | version: 1.0.0 399 | resolution: "delegates@npm:1.0.0" 400 | checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd 401 | languageName: node 402 | linkType: hard 403 | 404 | "depd@npm:^1.1.2": 405 | version: 1.1.2 406 | resolution: "depd@npm:1.1.2" 407 | checksum: 6b406620d269619852885ce15965272b829df6f409724415e0002c8632ab6a8c0a08ec1f0bd2add05dc7bd7507606f7e2cc034fa24224ab829580040b835ecd9 408 | languageName: node 409 | linkType: hard 410 | 411 | "doctypes@npm:^1.1.0": 412 | version: 1.1.0 413 | resolution: "doctypes@npm:1.1.0" 414 | checksum: 6e6c2d1a80f2072dc4831994c914c44455e341c5ab18c16797368a0afd59d7c22f3335805ba2c1dd2931e9539d1ba8b613b7650dc63f6ab56b77b8d888055de8 415 | languageName: node 416 | linkType: hard 417 | 418 | "emoji-regex@npm:^8.0.0": 419 | version: 8.0.0 420 | resolution: "emoji-regex@npm:8.0.0" 421 | checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 422 | languageName: node 423 | linkType: hard 424 | 425 | "encoding@npm:^0.1.13": 426 | version: 0.1.13 427 | resolution: "encoding@npm:0.1.13" 428 | dependencies: 429 | iconv-lite: ^0.6.2 430 | checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f 431 | languageName: node 432 | linkType: hard 433 | 434 | "env-paths@npm:^2.2.0": 435 | version: 2.2.1 436 | resolution: "env-paths@npm:2.2.1" 437 | checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e 438 | languageName: node 439 | linkType: hard 440 | 441 | "err-code@npm:^2.0.2": 442 | version: 2.0.3 443 | resolution: "err-code@npm:2.0.3" 444 | checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 445 | languageName: node 446 | linkType: hard 447 | 448 | "esbuild-android-64@npm:0.14.34": 449 | version: 0.14.34 450 | resolution: "esbuild-android-64@npm:0.14.34" 451 | conditions: os=android & cpu=x64 452 | languageName: node 453 | linkType: hard 454 | 455 | "esbuild-android-arm64@npm:0.14.34": 456 | version: 0.14.34 457 | resolution: "esbuild-android-arm64@npm:0.14.34" 458 | conditions: os=android & cpu=arm64 459 | languageName: node 460 | linkType: hard 461 | 462 | "esbuild-darwin-64@npm:0.14.34": 463 | version: 0.14.34 464 | resolution: "esbuild-darwin-64@npm:0.14.34" 465 | conditions: os=darwin & cpu=x64 466 | languageName: node 467 | linkType: hard 468 | 469 | "esbuild-darwin-arm64@npm:0.14.34": 470 | version: 0.14.34 471 | resolution: "esbuild-darwin-arm64@npm:0.14.34" 472 | conditions: os=darwin & cpu=arm64 473 | languageName: node 474 | linkType: hard 475 | 476 | "esbuild-freebsd-64@npm:0.14.34": 477 | version: 0.14.34 478 | resolution: "esbuild-freebsd-64@npm:0.14.34" 479 | conditions: os=freebsd & cpu=x64 480 | languageName: node 481 | linkType: hard 482 | 483 | "esbuild-freebsd-arm64@npm:0.14.34": 484 | version: 0.14.34 485 | resolution: "esbuild-freebsd-arm64@npm:0.14.34" 486 | conditions: os=freebsd & cpu=arm64 487 | languageName: node 488 | linkType: hard 489 | 490 | "esbuild-linux-32@npm:0.14.34": 491 | version: 0.14.34 492 | resolution: "esbuild-linux-32@npm:0.14.34" 493 | conditions: os=linux & cpu=ia32 494 | languageName: node 495 | linkType: hard 496 | 497 | "esbuild-linux-64@npm:0.14.34": 498 | version: 0.14.34 499 | resolution: "esbuild-linux-64@npm:0.14.34" 500 | conditions: os=linux & cpu=x64 501 | languageName: node 502 | linkType: hard 503 | 504 | "esbuild-linux-arm64@npm:0.14.34": 505 | version: 0.14.34 506 | resolution: "esbuild-linux-arm64@npm:0.14.34" 507 | conditions: os=linux & cpu=arm64 508 | languageName: node 509 | linkType: hard 510 | 511 | "esbuild-linux-arm@npm:0.14.34": 512 | version: 0.14.34 513 | resolution: "esbuild-linux-arm@npm:0.14.34" 514 | conditions: os=linux & cpu=arm 515 | languageName: node 516 | linkType: hard 517 | 518 | "esbuild-linux-mips64le@npm:0.14.34": 519 | version: 0.14.34 520 | resolution: "esbuild-linux-mips64le@npm:0.14.34" 521 | conditions: os=linux & cpu=mips64el 522 | languageName: node 523 | linkType: hard 524 | 525 | "esbuild-linux-ppc64le@npm:0.14.34": 526 | version: 0.14.34 527 | resolution: "esbuild-linux-ppc64le@npm:0.14.34" 528 | conditions: os=linux & cpu=ppc64 529 | languageName: node 530 | linkType: hard 531 | 532 | "esbuild-linux-riscv64@npm:0.14.34": 533 | version: 0.14.34 534 | resolution: "esbuild-linux-riscv64@npm:0.14.34" 535 | conditions: os=linux & cpu=riscv64 536 | languageName: node 537 | linkType: hard 538 | 539 | "esbuild-linux-s390x@npm:0.14.34": 540 | version: 0.14.34 541 | resolution: "esbuild-linux-s390x@npm:0.14.34" 542 | conditions: os=linux & cpu=s390x 543 | languageName: node 544 | linkType: hard 545 | 546 | "esbuild-netbsd-64@npm:0.14.34": 547 | version: 0.14.34 548 | resolution: "esbuild-netbsd-64@npm:0.14.34" 549 | conditions: os=netbsd & cpu=x64 550 | languageName: node 551 | linkType: hard 552 | 553 | "esbuild-openbsd-64@npm:0.14.34": 554 | version: 0.14.34 555 | resolution: "esbuild-openbsd-64@npm:0.14.34" 556 | conditions: os=openbsd & cpu=x64 557 | languageName: node 558 | linkType: hard 559 | 560 | "esbuild-sunos-64@npm:0.14.34": 561 | version: 0.14.34 562 | resolution: "esbuild-sunos-64@npm:0.14.34" 563 | conditions: os=sunos & cpu=x64 564 | languageName: node 565 | linkType: hard 566 | 567 | "esbuild-windows-32@npm:0.14.34": 568 | version: 0.14.34 569 | resolution: "esbuild-windows-32@npm:0.14.34" 570 | conditions: os=win32 & cpu=ia32 571 | languageName: node 572 | linkType: hard 573 | 574 | "esbuild-windows-64@npm:0.14.34": 575 | version: 0.14.34 576 | resolution: "esbuild-windows-64@npm:0.14.34" 577 | conditions: os=win32 & cpu=x64 578 | languageName: node 579 | linkType: hard 580 | 581 | "esbuild-windows-arm64@npm:0.14.34": 582 | version: 0.14.34 583 | resolution: "esbuild-windows-arm64@npm:0.14.34" 584 | conditions: os=win32 & cpu=arm64 585 | languageName: node 586 | linkType: hard 587 | 588 | "esbuild@npm:^0.14.27": 589 | version: 0.14.34 590 | resolution: "esbuild@npm:0.14.34" 591 | dependencies: 592 | esbuild-android-64: 0.14.34 593 | esbuild-android-arm64: 0.14.34 594 | esbuild-darwin-64: 0.14.34 595 | esbuild-darwin-arm64: 0.14.34 596 | esbuild-freebsd-64: 0.14.34 597 | esbuild-freebsd-arm64: 0.14.34 598 | esbuild-linux-32: 0.14.34 599 | esbuild-linux-64: 0.14.34 600 | esbuild-linux-arm: 0.14.34 601 | esbuild-linux-arm64: 0.14.34 602 | esbuild-linux-mips64le: 0.14.34 603 | esbuild-linux-ppc64le: 0.14.34 604 | esbuild-linux-riscv64: 0.14.34 605 | esbuild-linux-s390x: 0.14.34 606 | esbuild-netbsd-64: 0.14.34 607 | esbuild-openbsd-64: 0.14.34 608 | esbuild-sunos-64: 0.14.34 609 | esbuild-windows-32: 0.14.34 610 | esbuild-windows-64: 0.14.34 611 | esbuild-windows-arm64: 0.14.34 612 | dependenciesMeta: 613 | esbuild-android-64: 614 | optional: true 615 | esbuild-android-arm64: 616 | optional: true 617 | esbuild-darwin-64: 618 | optional: true 619 | esbuild-darwin-arm64: 620 | optional: true 621 | esbuild-freebsd-64: 622 | optional: true 623 | esbuild-freebsd-arm64: 624 | optional: true 625 | esbuild-linux-32: 626 | optional: true 627 | esbuild-linux-64: 628 | optional: true 629 | esbuild-linux-arm: 630 | optional: true 631 | esbuild-linux-arm64: 632 | optional: true 633 | esbuild-linux-mips64le: 634 | optional: true 635 | esbuild-linux-ppc64le: 636 | optional: true 637 | esbuild-linux-riscv64: 638 | optional: true 639 | esbuild-linux-s390x: 640 | optional: true 641 | esbuild-netbsd-64: 642 | optional: true 643 | esbuild-openbsd-64: 644 | optional: true 645 | esbuild-sunos-64: 646 | optional: true 647 | esbuild-windows-32: 648 | optional: true 649 | esbuild-windows-64: 650 | optional: true 651 | esbuild-windows-arm64: 652 | optional: true 653 | bin: 654 | esbuild: bin/esbuild 655 | checksum: 2f50fc1d48a307c8e1a4ca790e448fd4742aea0405d424989eb03e0b435faa6f5184b14a8244ab17611f91238605bb129e53a6d2e157f44eacea67e5c648bdae 656 | languageName: node 657 | linkType: hard 658 | 659 | "fill-range@npm:^7.0.1": 660 | version: 7.0.1 661 | resolution: "fill-range@npm:7.0.1" 662 | dependencies: 663 | to-regex-range: ^5.0.1 664 | checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 665 | languageName: node 666 | linkType: hard 667 | 668 | "fs-extra@npm:^10.0.0": 669 | version: 10.0.1 670 | resolution: "fs-extra@npm:10.0.1" 671 | dependencies: 672 | graceful-fs: ^4.2.0 673 | jsonfile: ^6.0.1 674 | universalify: ^2.0.0 675 | checksum: c1faaa5eb9e1c5c7c7ff09f966e93922ecb068ae1b04801cfc983ef05fcc1f66bfbb8d8d0b745c910014c7a2e7317fb6cf3bfe7390450c1157e3cc1a218f221d 676 | languageName: node 677 | linkType: hard 678 | 679 | "fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": 680 | version: 2.1.0 681 | resolution: "fs-minipass@npm:2.1.0" 682 | dependencies: 683 | minipass: ^3.0.0 684 | checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 685 | languageName: node 686 | linkType: hard 687 | 688 | "fs.realpath@npm:^1.0.0": 689 | version: 1.0.0 690 | resolution: "fs.realpath@npm:1.0.0" 691 | checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 692 | languageName: node 693 | linkType: hard 694 | 695 | "fsevents@npm:~2.3.2": 696 | version: 2.3.2 697 | resolution: "fsevents@npm:2.3.2" 698 | dependencies: 699 | node-gyp: latest 700 | checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f 701 | conditions: os=darwin 702 | languageName: node 703 | linkType: hard 704 | 705 | "fsevents@patch:fsevents@~2.3.2#~builtin": 706 | version: 2.3.2 707 | resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=18f3a7" 708 | dependencies: 709 | node-gyp: latest 710 | conditions: os=darwin 711 | languageName: node 712 | linkType: hard 713 | 714 | "function-bind@npm:^1.1.1": 715 | version: 1.1.1 716 | resolution: "function-bind@npm:1.1.1" 717 | checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a 718 | languageName: node 719 | linkType: hard 720 | 721 | "gauge@npm:^4.0.0": 722 | version: 4.0.3 723 | resolution: "gauge@npm:4.0.3" 724 | dependencies: 725 | aproba: ^1.0.3 || ^2.0.0 726 | color-support: ^1.1.3 727 | console-control-strings: ^1.1.0 728 | has-unicode: ^2.0.1 729 | signal-exit: ^3.0.7 730 | string-width: ^4.2.3 731 | strip-ansi: ^6.0.1 732 | wide-align: ^1.1.5 733 | checksum: baf982238a5270def90a4895f2e083b5cf8e6f7df20b53b24a932845aec363a6cf411f88b33dcb016a43c9334fdfccd956e4514ee875d70af016bf6fead3d3ae 734 | languageName: node 735 | linkType: hard 736 | 737 | "get-intrinsic@npm:^1.0.2": 738 | version: 1.1.1 739 | resolution: "get-intrinsic@npm:1.1.1" 740 | dependencies: 741 | function-bind: ^1.1.1 742 | has: ^1.0.3 743 | has-symbols: ^1.0.1 744 | checksum: a9fe2ca8fa3f07f9b0d30fb202bcd01f3d9b9b6b732452e79c48e79f7d6d8d003af3f9e38514250e3553fdc83c61650851cb6870832ac89deaaceb08e3721a17 745 | languageName: node 746 | linkType: hard 747 | 748 | "glob-parent@npm:~5.1.2": 749 | version: 5.1.2 750 | resolution: "glob-parent@npm:5.1.2" 751 | dependencies: 752 | is-glob: ^4.0.1 753 | checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e 754 | languageName: node 755 | linkType: hard 756 | 757 | "glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.2.0": 758 | version: 7.2.0 759 | resolution: "glob@npm:7.2.0" 760 | dependencies: 761 | fs.realpath: ^1.0.0 762 | inflight: ^1.0.4 763 | inherits: 2 764 | minimatch: ^3.0.4 765 | once: ^1.3.0 766 | path-is-absolute: ^1.0.0 767 | checksum: 78a8ea942331f08ed2e055cb5b9e40fe6f46f579d7fd3d694f3412fe5db23223d29b7fee1575440202e9a7ff9a72ab106a39fee39934c7bedafe5e5f8ae20134 768 | languageName: node 769 | linkType: hard 770 | 771 | "graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0": 772 | version: 4.2.10 773 | resolution: "graceful-fs@npm:4.2.10" 774 | checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da 775 | languageName: node 776 | linkType: hard 777 | 778 | "graceful-fs@npm:^4.2.6": 779 | version: 4.2.9 780 | resolution: "graceful-fs@npm:4.2.9" 781 | checksum: 68ea4e07ff2c041ada184f9278b830375f8e0b75154e3f080af6b70f66172fabb4108d19b3863a96b53fc068a310b9b6493d86d1291acc5f3861eb4b79d26ad6 782 | languageName: node 783 | linkType: hard 784 | 785 | "has-flag@npm:^4.0.0": 786 | version: 4.0.0 787 | resolution: "has-flag@npm:4.0.0" 788 | checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad 789 | languageName: node 790 | linkType: hard 791 | 792 | "has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2": 793 | version: 1.0.3 794 | resolution: "has-symbols@npm:1.0.3" 795 | checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 796 | languageName: node 797 | linkType: hard 798 | 799 | "has-tostringtag@npm:^1.0.0": 800 | version: 1.0.0 801 | resolution: "has-tostringtag@npm:1.0.0" 802 | dependencies: 803 | has-symbols: ^1.0.2 804 | checksum: cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c 805 | languageName: node 806 | linkType: hard 807 | 808 | "has-unicode@npm:^2.0.1": 809 | version: 2.0.1 810 | resolution: "has-unicode@npm:2.0.1" 811 | checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 812 | languageName: node 813 | linkType: hard 814 | 815 | "has@npm:^1.0.3": 816 | version: 1.0.3 817 | resolution: "has@npm:1.0.3" 818 | dependencies: 819 | function-bind: ^1.1.1 820 | checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 821 | languageName: node 822 | linkType: hard 823 | 824 | "highlight.js@npm:^11.5.0": 825 | version: 11.5.0 826 | resolution: "highlight.js@npm:11.5.0" 827 | checksum: a4339278d5be464fa29047fd00bc91f3d3966f5acbbb861ec51a09f3eea7c79ca63c2e0a2ba0c7b3d3663ee56b11c6470ab2759c7278e0d11af5cb0efa26e6eb 828 | languageName: node 829 | linkType: hard 830 | 831 | "http-cache-semantics@npm:^4.1.0": 832 | version: 4.1.0 833 | resolution: "http-cache-semantics@npm:4.1.0" 834 | checksum: 974de94a81c5474be07f269f9fd8383e92ebb5a448208223bfb39e172a9dbc26feff250192ecc23b9593b3f92098e010406b0f24bd4d588d631f80214648ed42 835 | languageName: node 836 | linkType: hard 837 | 838 | "http-proxy-agent@npm:^5.0.0": 839 | version: 5.0.0 840 | resolution: "http-proxy-agent@npm:5.0.0" 841 | dependencies: 842 | "@tootallnate/once": 2 843 | agent-base: 6 844 | debug: 4 845 | checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 846 | languageName: node 847 | linkType: hard 848 | 849 | "https-proxy-agent@npm:^5.0.0": 850 | version: 5.0.0 851 | resolution: "https-proxy-agent@npm:5.0.0" 852 | dependencies: 853 | agent-base: 6 854 | debug: 4 855 | checksum: 165bfb090bd26d47693597661298006841ab733d0c7383a8cb2f17373387a94c903a3ac687090aa739de05e379ab6f868bae84ab4eac288ad85c328cd1ec9e53 856 | languageName: node 857 | linkType: hard 858 | 859 | "humanize-ms@npm:^1.2.1": 860 | version: 1.2.1 861 | resolution: "humanize-ms@npm:1.2.1" 862 | dependencies: 863 | ms: ^2.0.0 864 | checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 865 | languageName: node 866 | linkType: hard 867 | 868 | "iconv-lite@npm:^0.6.2": 869 | version: 0.6.3 870 | resolution: "iconv-lite@npm:0.6.3" 871 | dependencies: 872 | safer-buffer: ">= 2.1.2 < 3.0.0" 873 | checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf 874 | languageName: node 875 | linkType: hard 876 | 877 | "immutable@npm:^4.0.0": 878 | version: 4.0.0 879 | resolution: "immutable@npm:4.0.0" 880 | checksum: 4b5e9181e4d5fa06728a481835ec09c86367e5d03268666c95b522b7644ab891098022e4479a43c4c81a68f2ed82f10751ce5d33e208d7b873b6e7f9dfaf4d87 881 | languageName: node 882 | linkType: hard 883 | 884 | "imurmurhash@npm:^0.1.4": 885 | version: 0.1.4 886 | resolution: "imurmurhash@npm:0.1.4" 887 | checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 888 | languageName: node 889 | linkType: hard 890 | 891 | "indent-string@npm:^4.0.0": 892 | version: 4.0.0 893 | resolution: "indent-string@npm:4.0.0" 894 | checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 895 | languageName: node 896 | linkType: hard 897 | 898 | "infer-owner@npm:^1.0.4": 899 | version: 1.0.4 900 | resolution: "infer-owner@npm:1.0.4" 901 | checksum: 181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89 902 | languageName: node 903 | linkType: hard 904 | 905 | "inflight@npm:^1.0.4": 906 | version: 1.0.6 907 | resolution: "inflight@npm:1.0.6" 908 | dependencies: 909 | once: ^1.3.0 910 | wrappy: 1 911 | checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd 912 | languageName: node 913 | linkType: hard 914 | 915 | "inherits@npm:2, inherits@npm:^2.0.3": 916 | version: 2.0.4 917 | resolution: "inherits@npm:2.0.4" 918 | checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 919 | languageName: node 920 | linkType: hard 921 | 922 | "ip@npm:^1.1.5": 923 | version: 1.1.5 924 | resolution: "ip@npm:1.1.5" 925 | checksum: 30133981f082a060a32644f6a7746e9ba7ac9e2bc07ecc8bbdda3ee8ca9bec1190724c390e45a1ee7695e7edfd2a8f7dda2c104ec5f7ac5068c00648504c7e5a 926 | languageName: node 927 | linkType: hard 928 | 929 | "is-binary-path@npm:~2.1.0": 930 | version: 2.1.0 931 | resolution: "is-binary-path@npm:2.1.0" 932 | dependencies: 933 | binary-extensions: ^2.0.0 934 | checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c 935 | languageName: node 936 | linkType: hard 937 | 938 | "is-core-module@npm:^2.8.1": 939 | version: 2.8.1 940 | resolution: "is-core-module@npm:2.8.1" 941 | dependencies: 942 | has: ^1.0.3 943 | checksum: 418b7bc10768a73c41c7ef497e293719604007f88934a6ffc5f7c78702791b8528102fb4c9e56d006d69361549b3d9519440214a74aefc7e0b79e5e4411d377f 944 | languageName: node 945 | linkType: hard 946 | 947 | "is-expression@npm:^4.0.0": 948 | version: 4.0.0 949 | resolution: "is-expression@npm:4.0.0" 950 | dependencies: 951 | acorn: ^7.1.1 952 | object-assign: ^4.1.1 953 | checksum: 0f01d0ff53fbbec36abae8fbb7ef056c6d024f7128646856a3e6c500b205788d3e0f337025e72df979d7d7cf4674a00370633d7f8974c668b2d3fdb7e8a83bdb 954 | languageName: node 955 | linkType: hard 956 | 957 | "is-extglob@npm:^2.1.1": 958 | version: 2.1.1 959 | resolution: "is-extglob@npm:2.1.1" 960 | checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 961 | languageName: node 962 | linkType: hard 963 | 964 | "is-fullwidth-code-point@npm:^3.0.0": 965 | version: 3.0.0 966 | resolution: "is-fullwidth-code-point@npm:3.0.0" 967 | checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 968 | languageName: node 969 | linkType: hard 970 | 971 | "is-glob@npm:^4.0.1, is-glob@npm:~4.0.1": 972 | version: 4.0.3 973 | resolution: "is-glob@npm:4.0.3" 974 | dependencies: 975 | is-extglob: ^2.1.1 976 | checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 977 | languageName: node 978 | linkType: hard 979 | 980 | "is-lambda@npm:^1.0.1": 981 | version: 1.0.1 982 | resolution: "is-lambda@npm:1.0.1" 983 | checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 984 | languageName: node 985 | linkType: hard 986 | 987 | "is-number@npm:^7.0.0": 988 | version: 7.0.0 989 | resolution: "is-number@npm:7.0.0" 990 | checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a 991 | languageName: node 992 | linkType: hard 993 | 994 | "is-promise@npm:^2.0.0": 995 | version: 2.2.2 996 | resolution: "is-promise@npm:2.2.2" 997 | checksum: 18bf7d1c59953e0ad82a1ed963fb3dc0d135c8f299a14f89a17af312fc918373136e56028e8831700e1933519630cc2fd4179a777030330fde20d34e96f40c78 998 | languageName: node 999 | linkType: hard 1000 | 1001 | "is-regex@npm:^1.0.3": 1002 | version: 1.1.4 1003 | resolution: "is-regex@npm:1.1.4" 1004 | dependencies: 1005 | call-bind: ^1.0.2 1006 | has-tostringtag: ^1.0.0 1007 | checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 1008 | languageName: node 1009 | linkType: hard 1010 | 1011 | "isexe@npm:^2.0.0": 1012 | version: 2.0.0 1013 | resolution: "isexe@npm:2.0.0" 1014 | checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 1015 | languageName: node 1016 | linkType: hard 1017 | 1018 | "js-confetti@npm:^0.10.2": 1019 | version: 0.10.2 1020 | resolution: "js-confetti@npm:0.10.2" 1021 | checksum: 110c87ea18eb350819093cd5d27f8c880d14e327592a7df853db65604d33416f10a8ce6dde1fbcf00ff50972e56eea0f74d5f05346dcca74d685aeae01b3917e 1022 | languageName: node 1023 | linkType: hard 1024 | 1025 | "js-stringify@npm:^1.0.2": 1026 | version: 1.0.2 1027 | resolution: "js-stringify@npm:1.0.2" 1028 | checksum: f9701d9e535d3ac0f62bbf2624b76c5d0af5b889187232817ae284a41ba21fd7a8b464c2dce3815d8cf52c8bea3480be6b368cfc2c67da799cad458058e8bbf5 1029 | languageName: node 1030 | linkType: hard 1031 | 1032 | "jsonfile@npm:^6.0.1": 1033 | version: 6.1.0 1034 | resolution: "jsonfile@npm:6.1.0" 1035 | dependencies: 1036 | graceful-fs: ^4.1.6 1037 | universalify: ^2.0.0 1038 | dependenciesMeta: 1039 | graceful-fs: 1040 | optional: true 1041 | checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 1042 | languageName: node 1043 | linkType: hard 1044 | 1045 | "jstransformer@npm:1.0.0": 1046 | version: 1.0.0 1047 | resolution: "jstransformer@npm:1.0.0" 1048 | dependencies: 1049 | is-promise: ^2.0.0 1050 | promise: ^7.0.1 1051 | checksum: 1e019fde17a38766a5b96bccf0738156badc60cfa61e2ba8a8bbd3b855e7d5d7e17492b8a66e4aaabc39483e335d23217343ae32d0f7e5a81af42a95c3e075f9 1052 | languageName: node 1053 | linkType: hard 1054 | 1055 | "lodash-es@npm:^4.17.21": 1056 | version: 4.17.21 1057 | resolution: "lodash-es@npm:4.17.21" 1058 | checksum: 05cbffad6e2adbb331a4e16fbd826e7faee403a1a04873b82b42c0f22090f280839f85b95393f487c1303c8a3d2a010048bf06151a6cbe03eee4d388fb0a12d2 1059 | languageName: node 1060 | linkType: hard 1061 | 1062 | "lru-cache@npm:^6.0.0": 1063 | version: 6.0.0 1064 | resolution: "lru-cache@npm:6.0.0" 1065 | dependencies: 1066 | yallist: ^4.0.0 1067 | checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 1068 | languageName: node 1069 | linkType: hard 1070 | 1071 | "lru-cache@npm:^7.5.1, lru-cache@npm:^7.7.1": 1072 | version: 7.7.1 1073 | resolution: "lru-cache@npm:7.7.1" 1074 | checksum: f362c5a2cfa8ad6fe557ec43dc1b7a9695cce84a5652a43ff813609f782f5da576631e7dfad41878bf19a7a69438f38375178635ee80de269aa314280ca2f59e 1075 | languageName: node 1076 | linkType: hard 1077 | 1078 | "make-fetch-happen@npm:^10.0.3": 1079 | version: 10.0.6 1080 | resolution: "make-fetch-happen@npm:10.0.6" 1081 | dependencies: 1082 | agentkeepalive: ^4.2.1 1083 | cacache: ^16.0.0 1084 | http-cache-semantics: ^4.1.0 1085 | http-proxy-agent: ^5.0.0 1086 | https-proxy-agent: ^5.0.0 1087 | is-lambda: ^1.0.1 1088 | lru-cache: ^7.5.1 1089 | minipass: ^3.1.6 1090 | minipass-collect: ^1.0.2 1091 | minipass-fetch: ^2.0.3 1092 | minipass-flush: ^1.0.5 1093 | minipass-pipeline: ^1.2.4 1094 | negotiator: ^0.6.3 1095 | promise-retry: ^2.0.1 1096 | socks-proxy-agent: ^6.1.1 1097 | ssri: ^8.0.1 1098 | checksum: cf3e745567f114bf161e13dbde402cff916482930936c102543b5c6e5e6409921b05d38d6400c92ed0b43011b185c8f39a9f504c9a1bdb956eeeed39929451a6 1099 | languageName: node 1100 | linkType: hard 1101 | 1102 | "marked@npm:^4.0.12": 1103 | version: 4.0.12 1104 | resolution: "marked@npm:4.0.12" 1105 | bin: 1106 | marked: bin/marked.js 1107 | checksum: 7575117f85a8986652f3ac8b8a7b95056c4c5fce01a1fc76dc4c7960412cb4c9bd9da8133487159b6b3ff84f52b543dfe9a36f826a5f358892b5ec4b6824f192 1108 | languageName: node 1109 | linkType: hard 1110 | 1111 | "minimatch@npm:^3.0.4": 1112 | version: 3.1.2 1113 | resolution: "minimatch@npm:3.1.2" 1114 | dependencies: 1115 | brace-expansion: ^1.1.7 1116 | checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a 1117 | languageName: node 1118 | linkType: hard 1119 | 1120 | "minipass-collect@npm:^1.0.2": 1121 | version: 1.0.2 1122 | resolution: "minipass-collect@npm:1.0.2" 1123 | dependencies: 1124 | minipass: ^3.0.0 1125 | checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 1126 | languageName: node 1127 | linkType: hard 1128 | 1129 | "minipass-fetch@npm:^2.0.3": 1130 | version: 2.0.3 1131 | resolution: "minipass-fetch@npm:2.0.3" 1132 | dependencies: 1133 | encoding: ^0.1.13 1134 | minipass: ^3.1.6 1135 | minipass-sized: ^1.0.3 1136 | minizlib: ^2.1.2 1137 | dependenciesMeta: 1138 | encoding: 1139 | optional: true 1140 | checksum: 78a4a509b1e73f5e63b84065969790373b36b04da586744815c7f7f80013f1d786797842cc33cfa517eba0ad2f2142eb0ac808c46738da1c53e0e3aeed81df11 1141 | languageName: node 1142 | linkType: hard 1143 | 1144 | "minipass-flush@npm:^1.0.5": 1145 | version: 1.0.5 1146 | resolution: "minipass-flush@npm:1.0.5" 1147 | dependencies: 1148 | minipass: ^3.0.0 1149 | checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf 1150 | languageName: node 1151 | linkType: hard 1152 | 1153 | "minipass-pipeline@npm:^1.2.4": 1154 | version: 1.2.4 1155 | resolution: "minipass-pipeline@npm:1.2.4" 1156 | dependencies: 1157 | minipass: ^3.0.0 1158 | checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b 1159 | languageName: node 1160 | linkType: hard 1161 | 1162 | "minipass-sized@npm:^1.0.3": 1163 | version: 1.0.3 1164 | resolution: "minipass-sized@npm:1.0.3" 1165 | dependencies: 1166 | minipass: ^3.0.0 1167 | checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 1168 | languageName: node 1169 | linkType: hard 1170 | 1171 | "minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": 1172 | version: 3.1.6 1173 | resolution: "minipass@npm:3.1.6" 1174 | dependencies: 1175 | yallist: ^4.0.0 1176 | checksum: 57a04041413a3531a65062452cb5175f93383ef245d6f4a2961d34386eb9aa8ac11ac7f16f791f5e8bbaf1dfb1ef01596870c88e8822215db57aa591a5bb0a77 1177 | languageName: node 1178 | linkType: hard 1179 | 1180 | "minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": 1181 | version: 2.1.2 1182 | resolution: "minizlib@npm:2.1.2" 1183 | dependencies: 1184 | minipass: ^3.0.0 1185 | yallist: ^4.0.0 1186 | checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 1187 | languageName: node 1188 | linkType: hard 1189 | 1190 | "mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": 1191 | version: 1.0.4 1192 | resolution: "mkdirp@npm:1.0.4" 1193 | bin: 1194 | mkdirp: bin/cmd.js 1195 | checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f 1196 | languageName: node 1197 | linkType: hard 1198 | 1199 | "ms@npm:2.1.2": 1200 | version: 2.1.2 1201 | resolution: "ms@npm:2.1.2" 1202 | checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f 1203 | languageName: node 1204 | linkType: hard 1205 | 1206 | "ms@npm:^2.0.0": 1207 | version: 2.1.3 1208 | resolution: "ms@npm:2.1.3" 1209 | checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d 1210 | languageName: node 1211 | linkType: hard 1212 | 1213 | "nanoid@npm:^3.3.1": 1214 | version: 3.3.2 1215 | resolution: "nanoid@npm:3.3.2" 1216 | bin: 1217 | nanoid: bin/nanoid.cjs 1218 | checksum: 376717f0685251fad77850bd84c6b8d57837c71eeb1c05be7c742140cc1835a5a2953562add05166d6dbc8fb65f3fdffa356213037b967a470e1691dc3e7b9cc 1219 | languageName: node 1220 | linkType: hard 1221 | 1222 | "negotiator@npm:^0.6.3": 1223 | version: 0.6.3 1224 | resolution: "negotiator@npm:0.6.3" 1225 | checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 1226 | languageName: node 1227 | linkType: hard 1228 | 1229 | "no-darkreader@npm:^1.0.1": 1230 | version: 1.0.2 1231 | resolution: "no-darkreader@npm:1.0.2" 1232 | checksum: f91b8f68397c5e3b1ce954a8b00174da30f649c33734b497c47c50d50923a9b42058eed81a8c3c3f5c9bac7b4161a9944f672f5601ad29161401226dc87920f9 1233 | languageName: node 1234 | linkType: hard 1235 | 1236 | "node-gyp@npm:latest": 1237 | version: 9.0.0 1238 | resolution: "node-gyp@npm:9.0.0" 1239 | dependencies: 1240 | env-paths: ^2.2.0 1241 | glob: ^7.1.4 1242 | graceful-fs: ^4.2.6 1243 | make-fetch-happen: ^10.0.3 1244 | nopt: ^5.0.0 1245 | npmlog: ^6.0.0 1246 | rimraf: ^3.0.2 1247 | semver: ^7.3.5 1248 | tar: ^6.1.2 1249 | which: ^2.0.2 1250 | bin: 1251 | node-gyp: bin/node-gyp.js 1252 | checksum: 4d8ef8860f7e4f4d86c91db3f519d26ed5cc23b48fe54543e2afd86162b4acbd14f21de42a5db344525efb69a991e021b96a68c70c6e2d5f4a5cb770793da6d3 1253 | languageName: node 1254 | linkType: hard 1255 | 1256 | "nopt@npm:^5.0.0": 1257 | version: 5.0.0 1258 | resolution: "nopt@npm:5.0.0" 1259 | dependencies: 1260 | abbrev: 1 1261 | bin: 1262 | nopt: bin/nopt.js 1263 | checksum: d35fdec187269503843924e0114c0c6533fb54bbf1620d0f28b4b60ba01712d6687f62565c55cc20a504eff0fbe5c63e22340c3fad549ad40469ffb611b04f2f 1264 | languageName: node 1265 | linkType: hard 1266 | 1267 | "normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": 1268 | version: 3.0.0 1269 | resolution: "normalize-path@npm:3.0.0" 1270 | checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 1271 | languageName: node 1272 | linkType: hard 1273 | 1274 | "npmlog@npm:^6.0.0": 1275 | version: 6.0.1 1276 | resolution: "npmlog@npm:6.0.1" 1277 | dependencies: 1278 | are-we-there-yet: ^3.0.0 1279 | console-control-strings: ^1.1.0 1280 | gauge: ^4.0.0 1281 | set-blocking: ^2.0.0 1282 | checksum: f1a4078a73ebc89896a832bbf869f491c32ecb12e0434b9a7499878ce8f29f22e72befe3c53cd8cdc9dbf4b4057297e783ab0b6746a8b067734de6205af4d538 1283 | languageName: node 1284 | linkType: hard 1285 | 1286 | "object-assign@npm:^4.1.1": 1287 | version: 4.1.1 1288 | resolution: "object-assign@npm:4.1.1" 1289 | checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f 1290 | languageName: node 1291 | linkType: hard 1292 | 1293 | "once@npm:^1.3.0": 1294 | version: 1.4.0 1295 | resolution: "once@npm:1.4.0" 1296 | dependencies: 1297 | wrappy: 1 1298 | checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 1299 | languageName: node 1300 | linkType: hard 1301 | 1302 | "p-map@npm:^4.0.0": 1303 | version: 4.0.0 1304 | resolution: "p-map@npm:4.0.0" 1305 | dependencies: 1306 | aggregate-error: ^3.0.0 1307 | checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c 1308 | languageName: node 1309 | linkType: hard 1310 | 1311 | "path-is-absolute@npm:^1.0.0": 1312 | version: 1.0.1 1313 | resolution: "path-is-absolute@npm:1.0.1" 1314 | checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 1315 | languageName: node 1316 | linkType: hard 1317 | 1318 | "path-parse@npm:^1.0.7": 1319 | version: 1.0.7 1320 | resolution: "path-parse@npm:1.0.7" 1321 | checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a 1322 | languageName: node 1323 | linkType: hard 1324 | 1325 | "picocolors@npm:^1.0.0": 1326 | version: 1.0.0 1327 | resolution: "picocolors@npm:1.0.0" 1328 | checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 1329 | languageName: node 1330 | linkType: hard 1331 | 1332 | "picomatch@npm:^2.0.4, picomatch@npm:^2.2.1": 1333 | version: 2.3.1 1334 | resolution: "picomatch@npm:2.3.1" 1335 | checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf 1336 | languageName: node 1337 | linkType: hard 1338 | 1339 | "postcss@npm:^8.4.12": 1340 | version: 8.4.12 1341 | resolution: "postcss@npm:8.4.12" 1342 | dependencies: 1343 | nanoid: ^3.3.1 1344 | picocolors: ^1.0.0 1345 | source-map-js: ^1.0.2 1346 | checksum: 248e3d0f9bbb8efaafcfda7f91627a29bdc9a19f456896886330beb28c5abea0e14c7901b35191928602e2eccbed496b1e94097d27a0b2a980854cd00c7a835f 1347 | languageName: node 1348 | linkType: hard 1349 | 1350 | "promise-inflight@npm:^1.0.1": 1351 | version: 1.0.1 1352 | resolution: "promise-inflight@npm:1.0.1" 1353 | checksum: 22749483091d2c594261517f4f80e05226d4d5ecc1fc917e1886929da56e22b5718b7f2a75f3807e7a7d471bc3be2907fe92e6e8f373ddf5c64bae35b5af3981 1354 | languageName: node 1355 | linkType: hard 1356 | 1357 | "promise-retry@npm:^2.0.1": 1358 | version: 2.0.1 1359 | resolution: "promise-retry@npm:2.0.1" 1360 | dependencies: 1361 | err-code: ^2.0.2 1362 | retry: ^0.12.0 1363 | checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 1364 | languageName: node 1365 | linkType: hard 1366 | 1367 | "promise@npm:^7.0.1": 1368 | version: 7.3.1 1369 | resolution: "promise@npm:7.3.1" 1370 | dependencies: 1371 | asap: ~2.0.3 1372 | checksum: 475bb069130179fbd27ed2ab45f26d8862376a137a57314cf53310bdd85cc986a826fd585829be97ebc0aaf10e9d8e68be1bfe5a4a0364144b1f9eedfa940cf1 1373 | languageName: node 1374 | linkType: hard 1375 | 1376 | "pug-attrs@npm:^3.0.0": 1377 | version: 3.0.0 1378 | resolution: "pug-attrs@npm:3.0.0" 1379 | dependencies: 1380 | constantinople: ^4.0.1 1381 | js-stringify: ^1.0.2 1382 | pug-runtime: ^3.0.0 1383 | checksum: 2ca2d34de3065239f01f0fc3c0e104c17f7a7105684d088bb71df623005a45f40a2301e65f49ec4581bb31794c74e691862643d4e34062d1509e92fa56a15aa5 1384 | languageName: node 1385 | linkType: hard 1386 | 1387 | "pug-code-gen@npm:^3.0.2": 1388 | version: 3.0.2 1389 | resolution: "pug-code-gen@npm:3.0.2" 1390 | dependencies: 1391 | constantinople: ^4.0.1 1392 | doctypes: ^1.1.0 1393 | js-stringify: ^1.0.2 1394 | pug-attrs: ^3.0.0 1395 | pug-error: ^2.0.0 1396 | pug-runtime: ^3.0.0 1397 | void-elements: ^3.1.0 1398 | with: ^7.0.0 1399 | checksum: 1644d3a4d673392794248749eb146299704639a8197746454b7d03b240b83ee102f25b76d203381501e283be3927ab01eb3f4563ff51c45a478de1f3435a400d 1400 | languageName: node 1401 | linkType: hard 1402 | 1403 | "pug-error@npm:^2.0.0": 1404 | version: 2.0.0 1405 | resolution: "pug-error@npm:2.0.0" 1406 | checksum: c5372d018c897c1d6a141dd803c50957feecfda1f3d84a6adc6149801315d6c7f8c28b05f3e186d98d774fc9718699d1e1caa675630dd3c4453f8c5ec4e4a986 1407 | languageName: node 1408 | linkType: hard 1409 | 1410 | "pug-filters@npm:^4.0.0": 1411 | version: 4.0.0 1412 | resolution: "pug-filters@npm:4.0.0" 1413 | dependencies: 1414 | constantinople: ^4.0.1 1415 | jstransformer: 1.0.0 1416 | pug-error: ^2.0.0 1417 | pug-walk: ^2.0.0 1418 | resolve: ^1.15.1 1419 | checksum: 44eb3273195e3f42f034ad81109452236377780557eaf5a28db6e478f297675e19b8598cca9de65a0ba9c1d57e2ca2a93e332f0ab4be79dc5dd042375228cdff 1420 | languageName: node 1421 | linkType: hard 1422 | 1423 | "pug-lexer@npm:^5.0.1": 1424 | version: 5.0.1 1425 | resolution: "pug-lexer@npm:5.0.1" 1426 | dependencies: 1427 | character-parser: ^2.2.0 1428 | is-expression: ^4.0.0 1429 | pug-error: ^2.0.0 1430 | checksum: afdd2f43f2c3ba96001a7b734c0c3bc745eb5d7dd68c787c2690c606d34573ca46ba807e4b4c7e70db9b4556fb938625dbb9c25b79cdb8857868e6deb2574d3e 1431 | languageName: node 1432 | linkType: hard 1433 | 1434 | "pug-linker@npm:^4.0.0": 1435 | version: 4.0.0 1436 | resolution: "pug-linker@npm:4.0.0" 1437 | dependencies: 1438 | pug-error: ^2.0.0 1439 | pug-walk: ^2.0.0 1440 | checksum: 7433aa65181cd5b7bc631ab5f14baae7496fd8da98608cbd55bbea9bc72fe69a863e72026781a9fe76ab429d7037465b942145455420ee1178e2875ec87a1e12 1441 | languageName: node 1442 | linkType: hard 1443 | 1444 | "pug-load@npm:^3.0.0": 1445 | version: 3.0.0 1446 | resolution: "pug-load@npm:3.0.0" 1447 | dependencies: 1448 | object-assign: ^4.1.1 1449 | pug-walk: ^2.0.0 1450 | checksum: 1800ec51994c92338401bcf79bbfa0d5ef9aa312bc415c2618263d6c04d1d7c5be5ac4a333c47a0eaa823f6231b4ade1a1c40f5784b99eb576d25853597bff2f 1451 | languageName: node 1452 | linkType: hard 1453 | 1454 | "pug-parser@npm:^6.0.0": 1455 | version: 6.0.0 1456 | resolution: "pug-parser@npm:6.0.0" 1457 | dependencies: 1458 | pug-error: ^2.0.0 1459 | token-stream: 1.0.0 1460 | checksum: a6954d1383601233ec9d58e8fb22339f4809cf938272db16c551d8574566f388af3bf5560ec95ad5e23902bc358e6fa857409e840de4ed1ff5120a1dd6892cca 1461 | languageName: node 1462 | linkType: hard 1463 | 1464 | "pug-runtime@npm:^3.0.0, pug-runtime@npm:^3.0.1": 1465 | version: 3.0.1 1466 | resolution: "pug-runtime@npm:3.0.1" 1467 | checksum: 48a71b587caa08a5bccf9c1164206a34067edc1d13c2164bebad2dc562b529317578f889a0c41f0e16ddab3853c599696ff29a085f2d4554b783228f0002c41b 1468 | languageName: node 1469 | linkType: hard 1470 | 1471 | "pug-strip-comments@npm:^2.0.0": 1472 | version: 2.0.0 1473 | resolution: "pug-strip-comments@npm:2.0.0" 1474 | dependencies: 1475 | pug-error: ^2.0.0 1476 | checksum: 2cfcbf506c14bb3e64204a1d93f12ca61658d2540475b0f0911c35531ad28421e8d1e73a646d841d58cfa2c20f8593c52e492dfe5b6bec968e20b614e4dea1e4 1477 | languageName: node 1478 | linkType: hard 1479 | 1480 | "pug-walk@npm:^2.0.0": 1481 | version: 2.0.0 1482 | resolution: "pug-walk@npm:2.0.0" 1483 | checksum: bee64e133b711e1ed58022c0869b59e62f9f3ebb7084293857f074120b3cb588e7b8f74c4566426bf2b26dc1ec176ca6b64a2d1e53782f3fbbe039c5d4816638 1484 | languageName: node 1485 | linkType: hard 1486 | 1487 | "pug@npm:^3.0.2": 1488 | version: 3.0.2 1489 | resolution: "pug@npm:3.0.2" 1490 | dependencies: 1491 | pug-code-gen: ^3.0.2 1492 | pug-filters: ^4.0.0 1493 | pug-lexer: ^5.0.1 1494 | pug-linker: ^4.0.0 1495 | pug-load: ^3.0.0 1496 | pug-parser: ^6.0.0 1497 | pug-runtime: ^3.0.1 1498 | pug-strip-comments: ^2.0.0 1499 | checksum: 3e1a3d48897c0c7dedd4f959ce8afaf6417a63756b149e1b5382bef16de5792ec7c7ae6a7d41641059cb149520f20b0d1ecf57014c0661526e96f0bad88541e5 1500 | languageName: node 1501 | linkType: hard 1502 | 1503 | "readable-stream@npm:^3.6.0": 1504 | version: 3.6.0 1505 | resolution: "readable-stream@npm:3.6.0" 1506 | dependencies: 1507 | inherits: ^2.0.3 1508 | string_decoder: ^1.1.1 1509 | util-deprecate: ^1.0.1 1510 | checksum: d4ea81502d3799439bb955a3a5d1d808592cf3133350ed352aeaa499647858b27b1c4013984900238b0873ec8d0d8defce72469fb7a83e61d53f5ad61cb80dc8 1511 | languageName: node 1512 | linkType: hard 1513 | 1514 | "readdirp@npm:~3.6.0": 1515 | version: 3.6.0 1516 | resolution: "readdirp@npm:3.6.0" 1517 | dependencies: 1518 | picomatch: ^2.2.1 1519 | checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 1520 | languageName: node 1521 | linkType: hard 1522 | 1523 | "resolve@npm:^1.15.1, resolve@npm:^1.22.0": 1524 | version: 1.22.0 1525 | resolution: "resolve@npm:1.22.0" 1526 | dependencies: 1527 | is-core-module: ^2.8.1 1528 | path-parse: ^1.0.7 1529 | supports-preserve-symlinks-flag: ^1.0.0 1530 | bin: 1531 | resolve: bin/resolve 1532 | checksum: a2d14cc437b3a23996f8c7367eee5c7cf8149c586b07ca2ae00e96581ce59455555a1190be9aa92154785cf9f2042646c200d0e00e0bbd2b8a995a93a0ed3e4e 1533 | languageName: node 1534 | linkType: hard 1535 | 1536 | "resolve@patch:resolve@^1.15.1#~builtin, resolve@patch:resolve@^1.22.0#~builtin": 1537 | version: 1.22.0 1538 | resolution: "resolve@patch:resolve@npm%3A1.22.0#~builtin::version=1.22.0&hash=07638b" 1539 | dependencies: 1540 | is-core-module: ^2.8.1 1541 | path-parse: ^1.0.7 1542 | supports-preserve-symlinks-flag: ^1.0.0 1543 | bin: 1544 | resolve: bin/resolve 1545 | checksum: c79ecaea36c872ee4a79e3db0d3d4160b593f2ca16e031d8283735acd01715a203607e9ded3f91f68899c2937fa0d49390cddbe0fb2852629212f3cda283f4a7 1546 | languageName: node 1547 | linkType: hard 1548 | 1549 | "retry@npm:^0.12.0": 1550 | version: 0.12.0 1551 | resolution: "retry@npm:0.12.0" 1552 | checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c 1553 | languageName: node 1554 | linkType: hard 1555 | 1556 | "rimraf@npm:^3.0.2": 1557 | version: 3.0.2 1558 | resolution: "rimraf@npm:3.0.2" 1559 | dependencies: 1560 | glob: ^7.1.3 1561 | bin: 1562 | rimraf: bin.js 1563 | checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 1564 | languageName: node 1565 | linkType: hard 1566 | 1567 | "rollup@npm:^2.59.0": 1568 | version: 2.70.1 1569 | resolution: "rollup@npm:2.70.1" 1570 | dependencies: 1571 | fsevents: ~2.3.2 1572 | dependenciesMeta: 1573 | fsevents: 1574 | optional: true 1575 | bin: 1576 | rollup: dist/bin/rollup 1577 | checksum: 06c62933e6e81a1c8c684d7d576e507081aabdb63cc0c91bca86b7348b66df03b77827068e4990b8b6c738bd3ef66dcc8c7ed7e0ea40b736068e7618f693133e 1578 | languageName: node 1579 | linkType: hard 1580 | 1581 | "safe-buffer@npm:~5.2.0": 1582 | version: 5.2.1 1583 | resolution: "safe-buffer@npm:5.2.1" 1584 | checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 1585 | languageName: node 1586 | linkType: hard 1587 | 1588 | "safer-buffer@npm:>= 2.1.2 < 3.0.0": 1589 | version: 2.1.2 1590 | resolution: "safer-buffer@npm:2.1.2" 1591 | checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 1592 | languageName: node 1593 | linkType: hard 1594 | 1595 | "sass@npm:^1.50.0": 1596 | version: 1.50.0 1597 | resolution: "sass@npm:1.50.0" 1598 | dependencies: 1599 | chokidar: ">=3.0.0 <4.0.0" 1600 | immutable: ^4.0.0 1601 | source-map-js: ">=0.6.2 <2.0.0" 1602 | bin: 1603 | sass: sass.js 1604 | checksum: 43738cc83a3921731456f769aba190277f0620f8b80c14426ab098be9ab8dc8465957f5bf2edbcffda189edb3024ed83dee2cb8cd580459ca4984a9fc88c18f7 1605 | languageName: node 1606 | linkType: hard 1607 | 1608 | "semver@npm:^7.3.5": 1609 | version: 7.3.5 1610 | resolution: "semver@npm:7.3.5" 1611 | dependencies: 1612 | lru-cache: ^6.0.0 1613 | bin: 1614 | semver: bin/semver.js 1615 | checksum: 5eafe6102bea2a7439897c1856362e31cc348ccf96efd455c8b5bc2c61e6f7e7b8250dc26b8828c1d76a56f818a7ee907a36ae9fb37a599d3d24609207001d60 1616 | languageName: node 1617 | linkType: hard 1618 | 1619 | "set-blocking@npm:^2.0.0": 1620 | version: 2.0.0 1621 | resolution: "set-blocking@npm:2.0.0" 1622 | checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 1623 | languageName: node 1624 | linkType: hard 1625 | 1626 | "signal-exit@npm:^3.0.7": 1627 | version: 3.0.7 1628 | resolution: "signal-exit@npm:3.0.7" 1629 | checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 1630 | languageName: node 1631 | linkType: hard 1632 | 1633 | "smart-buffer@npm:^4.2.0": 1634 | version: 4.2.0 1635 | resolution: "smart-buffer@npm:4.2.0" 1636 | checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b 1637 | languageName: node 1638 | linkType: hard 1639 | 1640 | "smooth-scrollbar@npm:^8.7.4": 1641 | version: 8.7.4 1642 | resolution: "smooth-scrollbar@npm:8.7.4" 1643 | dependencies: 1644 | core-js: ^3.6.4 1645 | lodash-es: ^4.17.21 1646 | tslib: ^1.10.0 1647 | checksum: 4e32db9a87a7971329e49ae7ccbe9fc1b7169309e56aa86380348442e5fbf1bc5756eba0b24e1099b141925872e748d177735af7307752990d0f712d9d599520 1648 | languageName: node 1649 | linkType: hard 1650 | 1651 | "socks-proxy-agent@npm:^6.1.1": 1652 | version: 6.1.1 1653 | resolution: "socks-proxy-agent@npm:6.1.1" 1654 | dependencies: 1655 | agent-base: ^6.0.2 1656 | debug: ^4.3.1 1657 | socks: ^2.6.1 1658 | checksum: 9a8a4f791bba0060315cf7291ca6f9db37d6fc280fd0860d73d8887d3efe4c22e823aa25a8d5375f6079279f8dc91b50c075345179bf832bfe3c7c26d3582e3c 1659 | languageName: node 1660 | linkType: hard 1661 | 1662 | "socks@npm:^2.6.1": 1663 | version: 2.6.2 1664 | resolution: "socks@npm:2.6.2" 1665 | dependencies: 1666 | ip: ^1.1.5 1667 | smart-buffer: ^4.2.0 1668 | checksum: dd9194293059d737759d5c69273850ad4149f448426249325c4bea0e340d1cf3d266c3b022694b0dcf5d31f759de23657244c481fc1e8322add80b7985c36b5e 1669 | languageName: node 1670 | linkType: hard 1671 | 1672 | "source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.2": 1673 | version: 1.0.2 1674 | resolution: "source-map-js@npm:1.0.2" 1675 | checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c 1676 | languageName: node 1677 | linkType: hard 1678 | 1679 | "ssri@npm:^8.0.1": 1680 | version: 8.0.1 1681 | resolution: "ssri@npm:8.0.1" 1682 | dependencies: 1683 | minipass: ^3.1.1 1684 | checksum: bc447f5af814fa9713aa201ec2522208ae0f4d8f3bda7a1f445a797c7b929a02720436ff7c478fb5edc4045adb02b1b88d2341b436a80798734e2494f1067b36 1685 | languageName: node 1686 | linkType: hard 1687 | 1688 | "string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.2.3": 1689 | version: 4.2.3 1690 | resolution: "string-width@npm:4.2.3" 1691 | dependencies: 1692 | emoji-regex: ^8.0.0 1693 | is-fullwidth-code-point: ^3.0.0 1694 | strip-ansi: ^6.0.1 1695 | checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb 1696 | languageName: node 1697 | linkType: hard 1698 | 1699 | "string_decoder@npm:^1.1.1": 1700 | version: 1.3.0 1701 | resolution: "string_decoder@npm:1.3.0" 1702 | dependencies: 1703 | safe-buffer: ~5.2.0 1704 | checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 1705 | languageName: node 1706 | linkType: hard 1707 | 1708 | "strip-ansi@npm:^6.0.1": 1709 | version: 6.0.1 1710 | resolution: "strip-ansi@npm:6.0.1" 1711 | dependencies: 1712 | ansi-regex: ^5.0.1 1713 | checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c 1714 | languageName: node 1715 | linkType: hard 1716 | 1717 | "supports-color@npm:^7.1.0": 1718 | version: 7.2.0 1719 | resolution: "supports-color@npm:7.2.0" 1720 | dependencies: 1721 | has-flag: ^4.0.0 1722 | checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a 1723 | languageName: node 1724 | linkType: hard 1725 | 1726 | "supports-preserve-symlinks-flag@npm:^1.0.0": 1727 | version: 1.0.0 1728 | resolution: "supports-preserve-symlinks-flag@npm:1.0.0" 1729 | checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae 1730 | languageName: node 1731 | linkType: hard 1732 | 1733 | "tar@npm:^6.1.11, tar@npm:^6.1.2": 1734 | version: 6.1.11 1735 | resolution: "tar@npm:6.1.11" 1736 | dependencies: 1737 | chownr: ^2.0.0 1738 | fs-minipass: ^2.0.0 1739 | minipass: ^3.0.0 1740 | minizlib: ^2.1.1 1741 | mkdirp: ^1.0.3 1742 | yallist: ^4.0.0 1743 | checksum: a04c07bb9e2d8f46776517d4618f2406fb977a74d914ad98b264fc3db0fe8224da5bec11e5f8902c5b9bcb8ace22d95fbe3c7b36b8593b7dfc8391a25898f32f 1744 | languageName: node 1745 | linkType: hard 1746 | 1747 | "tippy.js@npm:^6.3.7": 1748 | version: 6.3.7 1749 | resolution: "tippy.js@npm:6.3.7" 1750 | dependencies: 1751 | "@popperjs/core": ^2.9.0 1752 | checksum: cac955318a65288e8d2dca05059878b003c6e66f92c94f7810f5bc5448eb6646abdf7dacc9bd00020e2611592598d0aae3a28ec9a45349a159603c3fdddce5fb 1753 | languageName: node 1754 | linkType: hard 1755 | 1756 | "to-fast-properties@npm:^2.0.0": 1757 | version: 2.0.0 1758 | resolution: "to-fast-properties@npm:2.0.0" 1759 | checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 1760 | languageName: node 1761 | linkType: hard 1762 | 1763 | "to-regex-range@npm:^5.0.1": 1764 | version: 5.0.1 1765 | resolution: "to-regex-range@npm:5.0.1" 1766 | dependencies: 1767 | is-number: ^7.0.0 1768 | checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed 1769 | languageName: node 1770 | linkType: hard 1771 | 1772 | "token-stream@npm:1.0.0": 1773 | version: 1.0.0 1774 | resolution: "token-stream@npm:1.0.0" 1775 | checksum: e8adb56f31b813b6157130e7fc2fe14eb60e7cbf7b746e70e8293c7e55664d8e7ad5d93d7ae3aa4cad7fcb2b0aaf59dad6f2fd4ee0269204e55af5b05bc369e2 1776 | languageName: node 1777 | linkType: hard 1778 | 1779 | "tslib@npm:^1.10.0": 1780 | version: 1.14.1 1781 | resolution: "tslib@npm:1.14.1" 1782 | checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd 1783 | languageName: node 1784 | linkType: hard 1785 | 1786 | "unique-filename@npm:^1.1.1": 1787 | version: 1.1.1 1788 | resolution: "unique-filename@npm:1.1.1" 1789 | dependencies: 1790 | unique-slug: ^2.0.0 1791 | checksum: cf4998c9228cc7647ba7814e255dec51be43673903897b1786eff2ac2d670f54d4d733357eb08dea969aa5e6875d0e1bd391d668fbdb5a179744e7c7551a6f80 1792 | languageName: node 1793 | linkType: hard 1794 | 1795 | "unique-slug@npm:^2.0.0": 1796 | version: 2.0.2 1797 | resolution: "unique-slug@npm:2.0.2" 1798 | dependencies: 1799 | imurmurhash: ^0.1.4 1800 | checksum: 5b6876a645da08d505dedb970d1571f6cebdf87044cb6b740c8dbb24f0d6e1dc8bdbf46825fd09f994d7cf50760e6f6e063cfa197d51c5902c00a861702eb75a 1801 | languageName: node 1802 | linkType: hard 1803 | 1804 | "universalify@npm:^2.0.0": 1805 | version: 2.0.0 1806 | resolution: "universalify@npm:2.0.0" 1807 | checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44 1808 | languageName: node 1809 | linkType: hard 1810 | 1811 | "util-deprecate@npm:^1.0.1": 1812 | version: 1.0.2 1813 | resolution: "util-deprecate@npm:1.0.2" 1814 | checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 1815 | languageName: node 1816 | linkType: hard 1817 | 1818 | "vite-plugin-compression@npm:^0.5.1": 1819 | version: 0.5.1 1820 | resolution: "vite-plugin-compression@npm:0.5.1" 1821 | dependencies: 1822 | chalk: ^4.1.2 1823 | debug: ^4.3.3 1824 | fs-extra: ^10.0.0 1825 | peerDependencies: 1826 | vite: ">=2.0.0" 1827 | checksum: 55f01e7d6c9203776245614d30fa14df995bdf3cdb12ea4e2c0b9120741b74bd010b3aa5c467316f008aceaea6e2fd18fb394143cce06d22da9787d722da5223 1828 | languageName: node 1829 | linkType: hard 1830 | 1831 | "vite-plugin-pug@npm:^0.3.1": 1832 | version: 0.3.1 1833 | resolution: "vite-plugin-pug@npm:0.3.1" 1834 | dependencies: 1835 | pug: ^3.0.2 1836 | peerDependencies: 1837 | picocolors: ~1 1838 | vite: ~2 1839 | checksum: 2e19995257f29bb55198d3c7d38e0043f17303ffe19c6ae413ecefaa032714efb1b25e8fc180ed7d66d2e5b8ca8df89ac310813a81d9042a3bb4f81ddea088bd 1840 | languageName: node 1841 | linkType: hard 1842 | 1843 | "vite@npm:^2.9.0": 1844 | version: 2.9.1 1845 | resolution: "vite@npm:2.9.1" 1846 | dependencies: 1847 | esbuild: ^0.14.27 1848 | fsevents: ~2.3.2 1849 | postcss: ^8.4.12 1850 | resolve: ^1.22.0 1851 | rollup: ^2.59.0 1852 | peerDependencies: 1853 | less: "*" 1854 | sass: "*" 1855 | stylus: "*" 1856 | dependenciesMeta: 1857 | fsevents: 1858 | optional: true 1859 | peerDependenciesMeta: 1860 | less: 1861 | optional: true 1862 | sass: 1863 | optional: true 1864 | stylus: 1865 | optional: true 1866 | bin: 1867 | vite: bin/vite.js 1868 | checksum: 0f0ac9337fa5c17faa4a59831a2df17475563b23a6162e86b2b60b19835ca1277f3249ea7a6608880354b39caf05779e9bad1e3b1f5b27010deced224aae47ea 1869 | languageName: node 1870 | linkType: hard 1871 | 1872 | "void-elements@npm:^3.1.0": 1873 | version: 3.1.0 1874 | resolution: "void-elements@npm:3.1.0" 1875 | checksum: 0390f818107fa8fce55bb0a5c3f661056001c1d5a2a48c28d582d4d847347c2ab5b7f8272314cac58acf62345126b6b09bea623a185935f6b1c3bbce0dfd7f7f 1876 | languageName: node 1877 | linkType: hard 1878 | 1879 | "which@npm:^2.0.2": 1880 | version: 2.0.2 1881 | resolution: "which@npm:2.0.2" 1882 | dependencies: 1883 | isexe: ^2.0.0 1884 | bin: 1885 | node-which: ./bin/node-which 1886 | checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 1887 | languageName: node 1888 | linkType: hard 1889 | 1890 | "wide-align@npm:^1.1.5": 1891 | version: 1.1.5 1892 | resolution: "wide-align@npm:1.1.5" 1893 | dependencies: 1894 | string-width: ^1.0.2 || 2 || 3 || 4 1895 | checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 1896 | languageName: node 1897 | linkType: hard 1898 | 1899 | "with@npm:^7.0.0": 1900 | version: 7.0.2 1901 | resolution: "with@npm:7.0.2" 1902 | dependencies: 1903 | "@babel/parser": ^7.9.6 1904 | "@babel/types": ^7.9.6 1905 | assert-never: ^1.2.1 1906 | babel-walk: 3.0.0-canary-5 1907 | checksum: a00fe87b736e434bd8b9d3e62ddcd664bde7d3990a011a0f1bdeb499db0d6c28e6d2ef921dcc47650b8d436eee55459bcae8fab4ce1ed89f4926ddda407ab755 1908 | languageName: node 1909 | linkType: hard 1910 | 1911 | "wrappy@npm:1": 1912 | version: 1.0.2 1913 | resolution: "wrappy@npm:1.0.2" 1914 | checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 1915 | languageName: node 1916 | linkType: hard 1917 | 1918 | "yallist@npm:^4.0.0": 1919 | version: 4.0.0 1920 | resolution: "yallist@npm:4.0.0" 1921 | checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 1922 | languageName: node 1923 | linkType: hard 1924 | 1925 | "zer0bin@workspace:.": 1926 | version: 0.0.0-use.local 1927 | resolution: "zer0bin@workspace:." 1928 | dependencies: 1929 | "@ant-design/icons-svg": ^4.2.1 1930 | "@types/core-js": ^2.5.5 1931 | "@types/node": ^17.0.21 1932 | highlight.js: ^11.5.0 1933 | js-confetti: ^0.10.2 1934 | marked: ^4.0.12 1935 | no-darkreader: ^1.0.1 1936 | pug: ^3.0.2 1937 | sass: ^1.50.0 1938 | smooth-scrollbar: ^8.7.4 1939 | tippy.js: ^6.3.7 1940 | vite: ^2.9.0 1941 | vite-plugin-compression: ^0.5.1 1942 | vite-plugin-pug: ^0.3.1 1943 | languageName: unknown 1944 | linkType: soft 1945 | --------------------------------------------------------------------------------