commit 60d5f6bf300c22d3c419ae65cf1c384aa953ec94 Author: MeowcaTheoRange Date: Sun Oct 6 02:20:01 2024 -0500 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f90dc05 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +comms.db +.env \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d5a544e --- /dev/null +++ b/LICENSE @@ -0,0 +1,47 @@ +THE KARKAT PUBLIC LICENSE (KKPL) +Version 2.2, January 2024 + +Copyright (C) 2023-2024 MeowcaTheoRange + + +THIS LICENSE GRANTS PERMISSION TO ANY +TROLL, HUMAN, GROUP, OR ANY OTHER +LEGALLY RECOGNIZED ENTITY ("YOU") TO +MODIFY, USE, AND DISTRIBUTE +("SCHMEEVE", "SCHMEEVING") THIS WORK +WITHIN THE DESIRED SCOPE DEFINED BELOW, +AS LONG AS THE KARKAT PUBLIC LICENSE +PERSISTS WITHIN. + +BY SCHMEEVING THIS WORK, YOU AGREE TO +BE BOUND BY THIS LICENSE'S TERMS AND +CONDITIONS: + +0. YOU WON'T BE A WUSS ABOUT THIS + LICENSE. +1. YOU WILL ONLY SCHMEEVE WITHIN THE + WORK'S DESIRED SCOPE FOR THIS + LICENSE. +2. YOU ACKNOWLEDGE THAT THE DEFINED + SCOPE OF THIS WORK COMES WITH NO + WARRANTY. +3. YOU FROND PROMISE THAT YOU WON'T + SUE IF YOUR COMPUTER EXPLODES + BECAUSE OF THIS PROGRAM. +4. YOU AGREE THAT KARKAT IS THE BEST + HACKER ON ALTERNIA. +5. YOU AGREE THAT BY WRITING IN THE + FORM BELOW, YOU ARE THE RIGHTFUL + OWNER OF THIS WORK. + +WHAT PARTS OF THE WORK DOES THIS DAMNED +LICENSE APPLY TO: + All of it, except where otherwise clarified (/assets/fonts/, for example) +WRITE THE WORK'S NAME HERE: + THE KARKAT PUBLIC LICENSE (KKPL) + (Version 2.2, January 2024) +WRITE THE NAME(S) OF THE WORK'S +AUTHOR(S) HERE: + MeowcaTheoRange + +FUCK FUCK FUCK FUCK FUCK FUCK FUCK. \ No newline at end of file diff --git a/assets/elements.css b/assets/elements.css new file mode 100644 index 0000000..74df778 --- /dev/null +++ b/assets/elements.css @@ -0,0 +1,102 @@ +html, body { + height: 100%; + box-sizing: border-box; +} + +body { + height: 100%; + margin: 0 1rem; + box-sizing: border-box; +} + +main { + margin: 0 auto; + padding: 1rem 0; + max-width: 768px; +} + +header { + margin-block-end: 3rem; +} + +footer { + margin-block-start: 3rem; + margin-block-end: 2rem; +} + +h1, h2 { + margin: 1rem 0; +} + +h3, h4, h5, h6, p { + margin: 0.5rem 0; +} + +/* i hate styling this element */ +hr { + border: none; + background-color: currentColor; + color: inherit; + height: 1px; +} + +li { + margin: 0.5rem 0; +} + +section p { + white-space: pre-line; +} + +details summary { + list-style-type: none; +} + +summary::after { + cursor: pointer; + content: "(?)"; + margin-left: 0.5ch; + opacity: 0.5; + text-decoration: underline dotted; +} + +summary:hover::after { + opacity: 0.4; +} + +details[open] summary::after { + content: "(v)"; +} + +input[readonly], textarea[readonly] { + opacity: 0.5; +} + +input, textarea { + background-color: transparent; + color: inherit; + border: 1px solid currentColor; + padding: 4px 8px; + font: inherit; +} + +input[type=submit], +input[type=reset], +input[type=button] { + border: 2px solid currentColor; + cursor: pointer; + padding: 8px 16px; +} + +input[type=submit]:hover, +input[type=reset]:hover, +input[type=button]:hover, +a:hover, +button:hover { + opacity: 0.8; +} + +a { + color: currentColor; + font-weight: 500; +} \ No newline at end of file diff --git a/assets/fonts/Lexend/Lexend.ttf b/assets/fonts/Lexend/Lexend.ttf new file mode 100644 index 0000000..e895baf Binary files /dev/null and b/assets/fonts/Lexend/Lexend.ttf differ diff --git a/assets/fonts/RHD/RedHatDisplay.ttf b/assets/fonts/RHD/RedHatDisplay.ttf new file mode 100644 index 0000000..84abb78 Binary files /dev/null and b/assets/fonts/RHD/RedHatDisplay.ttf differ diff --git a/assets/fonts/RHT/RedHatText.ttf b/assets/fonts/RHT/RedHatText.ttf new file mode 100644 index 0000000..3b31882 Binary files /dev/null and b/assets/fonts/RHT/RedHatText.ttf differ diff --git a/assets/imgs/emailMatkap.png b/assets/imgs/emailMatkap.png new file mode 100644 index 0000000..38ffb7f Binary files /dev/null and b/assets/imgs/emailMatkap.png differ diff --git a/assets/imgs/examples/abtmtr_link.png b/assets/imgs/examples/abtmtr_link.png new file mode 100644 index 0000000..8b63f31 Binary files /dev/null and b/assets/imgs/examples/abtmtr_link.png differ diff --git a/assets/imgs/examples/sp_abtmtr_link.png b/assets/imgs/examples/sp_abtmtr_link.png new file mode 100644 index 0000000..852697e Binary files /dev/null and b/assets/imgs/examples/sp_abtmtr_link.png differ diff --git a/assets/imgs/examples/tc_abtmtr_link.png b/assets/imgs/examples/tc_abtmtr_link.png new file mode 100644 index 0000000..92ebbe9 Binary files /dev/null and b/assets/imgs/examples/tc_abtmtr_link.png differ diff --git a/assets/imgs/examples/tv_abtmtr_link.png b/assets/imgs/examples/tv_abtmtr_link.png new file mode 100644 index 0000000..5a08347 Binary files /dev/null and b/assets/imgs/examples/tv_abtmtr_link.png differ diff --git a/assets/imgs/homosuckMatkap.png b/assets/imgs/homosuckMatkap.png new file mode 100644 index 0000000..14f57da Binary files /dev/null and b/assets/imgs/homosuckMatkap.png differ diff --git a/assets/imgs/nsfwMatkap.png b/assets/imgs/nsfwMatkap.png new file mode 100644 index 0000000..c34116d Binary files /dev/null and b/assets/imgs/nsfwMatkap.png differ diff --git a/assets/imgs/perplexedPerson.png b/assets/imgs/perplexedPerson.png new file mode 100644 index 0000000..18c9d14 Binary files /dev/null and b/assets/imgs/perplexedPerson.png differ diff --git a/assets/imgs/pricing/type_all.png b/assets/imgs/pricing/type_all.png new file mode 100644 index 0000000..74d0961 Binary files /dev/null and b/assets/imgs/pricing/type_all.png differ diff --git a/assets/imgs/pricing/type_awesome.png b/assets/imgs/pricing/type_awesome.png new file mode 100644 index 0000000..805733e Binary files /dev/null and b/assets/imgs/pricing/type_awesome.png differ diff --git a/assets/imgs/pricing/type_basic.png b/assets/imgs/pricing/type_basic.png new file mode 100644 index 0000000..2b18cdf Binary files /dev/null and b/assets/imgs/pricing/type_basic.png differ diff --git a/assets/imgs/pricing/type_good.png b/assets/imgs/pricing/type_good.png new file mode 100644 index 0000000..efc4c37 Binary files /dev/null and b/assets/imgs/pricing/type_good.png differ diff --git a/assets/imgs/pricing/type_matkap.png b/assets/imgs/pricing/type_matkap.png new file mode 100644 index 0000000..32b8bbd Binary files /dev/null and b/assets/imgs/pricing/type_matkap.png differ diff --git a/assets/imgs/smellyCarrd.png b/assets/imgs/smellyCarrd.png new file mode 100644 index 0000000..a38fccd Binary files /dev/null and b/assets/imgs/smellyCarrd.png differ diff --git a/assets/imgs/trustmeMatkap.png b/assets/imgs/trustmeMatkap.png new file mode 100644 index 0000000..9c15a3a Binary files /dev/null and b/assets/imgs/trustmeMatkap.png differ diff --git a/assets/imgs/whatMatkap.png b/assets/imgs/whatMatkap.png new file mode 100644 index 0000000..80b273b Binary files /dev/null and b/assets/imgs/whatMatkap.png differ diff --git a/assets/layout.css b/assets/layout.css new file mode 100644 index 0000000..5eb695c --- /dev/null +++ b/assets/layout.css @@ -0,0 +1,107 @@ +.cakeView { + margin: 1em 0; +} + +.cakeView img { + float: inline-start; + object-fit: cover; + margin-inline-end: 1em; +} + +.cakeView p::after { + clear: both; + display: block; + content: ""; +} + +.compareView { + margin: 1em 0; +} + +.compareView img { + float: inline-end; + object-fit: cover; + margin-inline-end: 1em; +} + +.compareView ul::after { + clear: both; + display: block; + content: ""; +} + +.yesNoListView { + margin: 1em 0; +} + +.yesNoListView img { + float: inline-end; + object-fit: cover; + margin-inline-end: 1em; +} + +.yesNoListView ul::after { + clear: both; + display: block; + content: ""; +} + +.yesNoListView .yesNoListView_Yes { + list-style-type: "✅ "; +} + +.yesNoListView .yesNoListView_No { + list-style-type: "❌ "; +} + +.listView { + margin: 1em 0; +} + +.galleryView ul { + display: grid; + grid-auto-flow: column; + grid-auto-columns: 100%; + overflow: auto; + padding: 0; + scroll-snap-type: inline mandatory; + scroll-snap-stop: normal; +} + +.galleryView ul li { + scroll-snap-align: center; + list-style-type: none; + text-align: center; +} + +.galleryView ul li img { + max-width: 100%; + max-height: 500px; +} + +.linkView { + display: grid; + grid-auto-flow: column; + padding: 0; + margin: 1em 0; +} + +.linkView li { + display: inline-block; + text-align: center; +} + +.linkView .ticker { + opacity: 0.5; + user-select: none; +} + +.satisfiedBox { + margin: 2rem 0; + padding-inline-start: 1rem; +} + +.satisfiedBox h2::before { + content: "↗ "; + margin-inline-start: -1em; +} \ No newline at end of file diff --git a/assets/style.css b/assets/style.css new file mode 100644 index 0000000..18e0ad3 --- /dev/null +++ b/assets/style.css @@ -0,0 +1,58 @@ +@import url("/assets/styles/fade-in.css"); + +@font-face { + font-family: "Red Hat Display"; + src: url("/assets/fonts/RHD/RedHatDisplay.ttf"); +} + +@font-face { + font-family: "Red Hat Text"; + src: url("/assets/fonts/RHT/RedHatText.ttf"); +} + +body { + --bg: white; + background-color: white; + color: black; + font-family: "Red Hat Text"; +} + +h1, h2, h3, h4, h5, h6 { + font-family: "Red Hat Display"; +} + +@media (prefers-color-scheme: dark) { + body { + --bg: black; + background-color: black; + color: white; + } + + img:not(.screen) { + filter: invert(100%) hue-rotate(180deg); + } +} + +.yesNoListView { + border: 1px solid currentColor; + padding-top: 0; + padding-left: 1rem; + padding-right: 0; + padding-bottom: 0.5rem; +} + +.yesNoListView img { + margin-top: 1rem; +} + +.linkView { + margin: 0 1em; +} + +input[type=submit], +input[type=reset], +input[type=button], +a, +button { + transition: 0.25s opacity; +} \ No newline at end of file diff --git a/assets/styles/fade-in.css b/assets/styles/fade-in.css new file mode 100644 index 0000000..9da9444 --- /dev/null +++ b/assets/styles/fade-in.css @@ -0,0 +1,70 @@ +@keyframes fade-in-b { + 0% { + opacity: 0; + translate: 0 0.5rem; + } + 100% { + opacity: 1; + translate: 0; + } +} + +@keyframes fade-in { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +@media (prefers-reduced-motion: no-preference) { + main > *:not(h1):not(h2):not(h3) { + animation: fade-in-b 0.5s cubic-bezier(0.87, 0, 0.13, 1) both; + } + + main h1, + main h2, + main h3 { + animation: fade-in-b 0.625s cubic-bezier(0.87, 0, 0.13, 1) both; + } + + .linkView li.ticker { + animation: fade-in 0.5s cubic-bezier(0.87, 0, 0.13, 1) 0.5s both; + } + + .linkView li:not(.ticker) a { + display: inline-block; + transition: opacity 0.25s, translate 0.125s; + } + + .linkView li:not(.ticker) a:hover { + translate: 0 1px; + } + + .linkView li:not(.ticker) a:active { + opacity: 0.5; + translate: 0 2px; + } + + summary::after { + display: inline-block; + transition: opacity 0.25s, translate 0.125s; + } + + summary:hover::after { + translate: 0 -1px; + } + + summary:active::after { + translate: 0 -2px; + } + + details[open] summary:hover::after { + translate: 0 1px; + } + + details[open] summary:active::after { + translate: 0 2px; + } +} \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..8b2eaa0 --- /dev/null +++ b/index.js @@ -0,0 +1,52 @@ +import express from "express"; +import { config as dotenvConfig } from "dotenv"; +import path from "path"; + +dotenvConfig(); + +const __dirname = import.meta.dirname; + +const app = express(); + +app.set('trust proxy', true); +app.set('view engine', 'ejs'); +app.use('/assets', express.static('assets')); +app.set('views', path.join(__dirname, "views", "pages")); + +app.locals = { + __dirname +} + +app.get('/', async (req, res) => { + res.render('index'); +}) + +app.get('/whaticando', async (req, res) => { + res.render('whaticando'); +}) + +app.get('/tos', async (req, res) => { + res.render('tos'); +}) + +app.get('/pricing', async (req, res) => { + res.render('pricing'); +}) + +app.get('/contact', async (req, res) => { + res.render('contact'); +}) + +app.get("/favicon.ico", (req, res) => { + res.redirect("https://cdn.abtmtr.link/site_content/favicon.ico") +}) + +app.all('*', (req, res) => { + res.redirect("/"); +}) + +app.listen(process.env.PORT, () => { + const url = new URL("http://localhost/"); + url.port = process.env.PORT; + console.log(`Example app listening on ${url.toString()}`); +}); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..6f53f80 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1298 @@ +{ + "name": "sitecommssite", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "sitecommssite", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "dotenv": "^16.4.5", + "ejs": "^3.1.10", + "express": "^4.21.0" + }, + "devDependencies": { + "nodemon": "^3.1.7" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nodemon": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz", + "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "license": "MIT" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..8fbe4bf --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "sitecommssite", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "dev": "nodemon index.js" + }, + "nodemonConfig": { + "ignore": [ + "node_modules/**", + "comms.db", + "views/**" + ], + "ext": "*" + }, + "type": "module", + "license": "ISC", + "dependencies": { + "dotenv": "^16.4.5", + "ejs": "^3.1.10", + "express": "^4.21.0" + }, + "devDependencies": { + "nodemon": "^3.1.7" + } +} diff --git a/views/components/cakeView.ejs b/views/components/cakeView.ejs new file mode 100644 index 0000000..1ee2cd6 --- /dev/null +++ b/views/components/cakeView.ejs @@ -0,0 +1,5 @@ +
+

<%= title %>

+ <%= alt %> +

<%- description %>

+
\ No newline at end of file diff --git a/views/components/compareView.ejs b/views/components/compareView.ejs new file mode 100644 index 0000000..c1715aa --- /dev/null +++ b/views/components/compareView.ejs @@ -0,0 +1,18 @@ +
+ <%= alt %> +

<%= title %>

+
    + <% description.forEach(([ summary, content ]) => { %> +
  • + <% if (content) { %> +
    + <%= summary %> +

    <%= content %>

    +
    + <% } else { %> + <%= summary %> + <% } %> +
  • + <% }) %> +
+
\ No newline at end of file diff --git a/views/components/galleryView.ejs b/views/components/galleryView.ejs new file mode 100644 index 0000000..d25a4bc --- /dev/null +++ b/views/components/galleryView.ejs @@ -0,0 +1,13 @@ +
+

<%= title %>

+
    + <% images.forEach(([ img, desc, url ]) => { %> +
  • +
    + <%= desc %> +
    <%= desc %>
    +
    +
  • + <% }) %> +
+
\ No newline at end of file diff --git a/views/components/linkView.ejs b/views/components/linkView.ejs new file mode 100644 index 0000000..7d32679 --- /dev/null +++ b/views/components/linkView.ejs @@ -0,0 +1,7 @@ +
    +<% links.forEach(([ name, link ], i) => { %> +
  • <%= name %>
  • + <% if (i != links.length - 1) { %><% } %> + +<% }) %> +
\ No newline at end of file diff --git a/views/components/listView.ejs b/views/components/listView.ejs new file mode 100644 index 0000000..5a03e64 --- /dev/null +++ b/views/components/listView.ejs @@ -0,0 +1,17 @@ +
+

<%= title %>

+
    + <% description.forEach(([ summary, content ]) => { %> +
  • + <% if (content) { %> +
    + <%- summary %> +

    <%- content %>

    +
    + <% } else { %> + <%- summary %> + <% } %> +
  • + <% }) %> +
+
\ No newline at end of file diff --git a/views/components/specific/footer.ejs b/views/components/specific/footer.ejs new file mode 100644 index 0000000..19aed64 --- /dev/null +++ b/views/components/specific/footer.ejs @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/views/components/specific/header.ejs b/views/components/specific/header.ejs new file mode 100644 index 0000000..d367bb8 --- /dev/null +++ b/views/components/specific/header.ejs @@ -0,0 +1,12 @@ +
+

abtmtr.link site commissions

+ <%- include(__dirname + "/views/components/linkView.ejs", { + links: [ + ["home", "/"], + ["wicd", "/whaticando/"], + ["tos", "/tos/"], + ["pricing", "/pricing/"], + ["contact", "/contact/"], + ] + }) %> +
\ No newline at end of file diff --git a/views/components/yesNoListView.ejs b/views/components/yesNoListView.ejs new file mode 100644 index 0000000..63dc14c --- /dev/null +++ b/views/components/yesNoListView.ejs @@ -0,0 +1,31 @@ +
+ <%= alt %> +

<%= title %>

+

<%= description %>

+
    + <% yes.forEach(([ summary, content ]) => { %> +
  • + <% if (content) { %> +
    + <%- summary %> +

    <%- content %>

    +
    + <% } else { %> + <%- summary %> + <% } %> +
  • + <% }) %> + <% no.forEach(([ summary, content ]) => { %> +
  • + <% if (content) { %> +
    + <%- summary %> +

    <%- content %>

    +
    + <% } else { %> + <%- summary %> + <% } %> +
  • + <% }) %> +
+
\ No newline at end of file diff --git a/views/pages/contact.ejs b/views/pages/contact.ejs new file mode 100644 index 0000000..5d20ffe --- /dev/null +++ b/views/pages/contact.ejs @@ -0,0 +1,51 @@ + + + + + abtmtr.link site commissions + + + + + + +
+ <%- include(__dirname + "/views/components/specific/header.ejs") %> + <%- include(__dirname + "/views/components/cakeView.ejs", { + image: "/assets/imgs/emailMatkap.png", + alt: "matkap staring dazed at a physical letter with the letter \"E\" on it, signifying e-mail. he says \"WOW\" at it.", + title: "welcome to the contact page!", + description: `you made it! are you ready? +to make sure you are, so far you should know what you want, what i can do, have acknowledged my terms of service, have chosen a site type, and are sure that you want to continue with this commission request. + +got that? then go ahead and shoot me a request!` + }) %> +

use the contact form

+

if you're nervous about starting emails like I am sometimes, try this contact form.

+
+

+ + +

+

+ + +

+

+
+ +

+ +
+

email me directly

+

Or, if you're more confident, you can send me an email by yourself.

+

me@abtmtr.link

+ <%- include(__dirname + "/views/components/specific/footer.ejs") %> +
+ + \ No newline at end of file diff --git a/views/pages/index.ejs b/views/pages/index.ejs new file mode 100644 index 0000000..0a20287 --- /dev/null +++ b/views/pages/index.ejs @@ -0,0 +1,71 @@ + + + + + abtmtr.link site commissions + + + + + + +
+ <%- include(__dirname + "/views/components/specific/header.ejs") %> + <%- include(__dirname + "/views/components/cakeView.ejs", { + image: "/assets/imgs/homosuckMatkap.png", + alt: "matkap looking ridiculous with his hands in the air", + title: "hey, i'm MeowcaTheoRange.", + description: `i've got a feeling you want a good site that's special, performs well on all devices, and pleases new visitors and existing fans alike. + you want it to bring attention to what you do, what you dedicate yourself to, what you're passionate about, or what you're selling... but you don't quite have the know-how to get it done. + + don't worry - in that case, i've got your back!` + }) %> + <%- include(__dirname + "/views/components/compareView.ejs", { + image: "/assets/imgs/perplexedPerson.png", + alt: "some person looking perplexed at their computer loading a website", + title: "why you should consider my services", + description: [ + ["i know how to make sites perform well.", `i design my sites in HTML, only using JavaScript for flair and utility. this speeds up loading times by not requiring as much as a modern site would demand.`], + ["after i make wewbsite you can extend it i dont care"], + ["every single carrd pro feature is included in commission price except for the domain and hosting stuff i can't do that for you", + `if you'd like a form to send you an email, Google Analytics, or a special HTML thingy on your site, it'll run you no extra cost.`], + ["i am building the website for you"], + ["styling is separate from page content", `if you aren't sure about a color, the layout, or the font of a page, you won't have to go through every element to do it. changing any of these (even while I'm working on it) will run you no extra cost.`] + ] + }) %> + <%- include(__dirname + "/views/components/compareView.ejs", { + image: "/assets/imgs/smellyCarrd.png", + alt: "a large red no-entry symbol over a smelly computer with a carrd page on it", + title: "why you shouldn't use carrd", + description: [ + ["you've got a limited amount of elements", `if you've ever tried to seriously use carrd, you've probably hit the limits of elements at least once.`], + ["it's only one page", `fancy site transitions are nice, but it runs the cost of having *all of your site* on one page loaded at once, which isn't that good.`], + ["you still have to build your site yourself!"] + ] + }) %> + <%- include(__dirname + "/views/components/listView.ejs", { + title: "what you'll need", + description: [ + ["some idea of what you'll want your site to look like.", + `what colors? what font? what will the pages be? what will they look like? what content will they have? do you want anything to be interactive? any galleries? + + this is a storm of questions, sure, but they're only here to get you thinking.` + ], + ["some idea of what you'll want your site to do.", + `at the moment, i'm looking to work on commission sites specifically. i might be able to do other types of sites if requested, but anything personal is out of my scope.`], + ["the ability to send and recieve emails.", + `i don't have any social media other than FurAffinity. no Twitter, no Instagram, nothing. regarding commission requests, i'll only accept email.`], + ["the ability to send and recieve Cash App requests.", + `Stripe screwed me, PayPal exposes PII, and Ko-fi requires one of both. Cash App is sketch, sure, but it's one of the only ways i can get money into my bank account.`], + ["patience.", + `making a website takes a long time, and while (i think) i may be faster at it than most, i'll still need some time. i will send occasional updates about the site, though.`] + ] + }) %> +
+

is this looking good so far?

+

you should check out what i can do.

+
+ <%- include(__dirname + "/views/components/specific/footer.ejs") %> +
+ + \ No newline at end of file diff --git a/views/pages/pricing.ejs b/views/pages/pricing.ejs new file mode 100644 index 0000000..84cb487 --- /dev/null +++ b/views/pages/pricing.ejs @@ -0,0 +1,149 @@ + + + + + abtmtr.link site commissions + + + + + + +
+ <%- include(__dirname + "/views/components/specific/header.ejs") %> + <%- include(__dirname + "/views/components/cakeView.ejs", { + image: "/assets/imgs/trustmeMatkap.png", + alt: "matkap, wall-eyed, with a wide grin, top-hat, and an improperly-worn tie.", + title: "it's business time.", + description: `so, you've seen what i can do, and you've given what you want a little thought... now what's the cost of all of this? + +check out the site types and see what fits you.` + }) %> + <%- include(__dirname + "/views/components/compareView.ejs", { + image: "/assets/imgs/pricing/type_all.png", + alt: "matkap smiling at the viewer, with a browser on the other side. sparkles are around both.", + title: "all site types can/will include", + description: [ + ["a 404 page (not included in page count)", `let me know what you're using to host, and i'll adjust the file accordingly.`], + ["static assets (images, favicon, videos, JSON files, etc.)"], + ["HTML and CSS"], + ["no limits on page content"], + ["no limits on widgets, embeds, 88x31s, blinkies, whatever"], + ["no abtmtr.link watermark or whatever", "credit me if you want, though"], + ["no hosting on abtmtr.link"], + ] + }) %> +
+ <%- include(__dirname + "/views/components/yesNoListView.ejs", { + image: "/assets/imgs/pricing/type_basic.png", + alt: "some pages, and a browser accessing the first page in the list with a person extending their right arm up to the browser.", + title: "basic site ($20 USD)", + description: `the most basic site you can get from me. + +this site type is good if you just want a website. nothing sparkly, just a site that looks good and works well. +if you've got socials, a toyhouse, and a ko-fi, this can be your go-to. + +minimum deadline: 4 weeks +est. time: 1-2 weeks`, + yes: [ + ["3 pages max (incl. homepage)"], + ["HTML forms"], + ["Google Analytics (if you want)"], + ], + no: [ + ["JavaScript"], + ["subpages"], + ] + }) %> + <%- include(__dirname + "/views/components/yesNoListView.ejs", { + image: "/assets/imgs/pricing/type_good.png", + alt: "a couple pages, and a browser with a gallery and an advertisement with an among us crewmate and the word \"adversising [sic]\".", + title: "good site ($30 USD)", + description: `this site type is good if you don't need a lot out of your site. +if you already use some kind of commission management system, and are happy with just making your requests more parseable, this is a good pick for you. + +minimum deadline: 1 month +est. time: 2-4 weeks`, + yes: [ + ["Everything from basic site"], + ["5 pages max (incl. homepage)"], + ["basic JavaScript"], + ["JS forms"], + ["gallery views (image only)"], + ["subpages"], + ], + no: [ + ] + }) %> + <%- include(__dirname + "/views/components/yesNoListView.ejs", { + image: "/assets/imgs/pricing/type_awesome.png", + alt: "a portfolio website, with a sale dialog over it. the sale code is \"HIIIIALL\".", + title: "awesome site ($80 USD)", + description: `good site, but better. or: matkap special, but more basic. +the Nitro Basic of abtmtr.link's site commissions. + +this site type is good for an advanced commissions site - one that can count slots, availability, types of commissions, whatever you'll need. + +minimum deadline: 2 months +est. time: 1-2 months`, + yes: [ + ["Everything from good site"], + ["20 pages max (incl. homepage)"], + ["functional cookies, local storage, and session storage"], + ["Dynamic assets (fetch from other places/APIs)"], + ["framework usage (Next.js, React, EJS)"], + ], + no: [ + ] + }) %> + <%- include(__dirname + "/views/components/yesNoListView.ejs", { + image: "/assets/imgs/pricing/type_matkap.png", + alt: "matkap sitting wall-eyed at a computer, chewing on grass. he is coding a website displaying the word \"SITE.\" on the screen.", + title: "matkap special site ($100 USD)", + description: `channel the spirit of matkap and... eat grass or something. i don't know what he does. + +this site type is good for handling customer tickets/messages/whatever without requiring a Trello board. + +minimum deadline: 4 months +est. time: 2-3 months`, + yes: [ + ["Everything from awesome site"], + ["no page maximum"], + ["Forms with custom APIs"], + ["Express server"], + ["SQLite database"], + ], + no: [ + ] + }) %> +
+

or, i can quote you a site

+ <%- include(__dirname + "/views/components/yesNoListView.ejs", { + image: "/assets/imgs/pricing/type_all.png", + alt: "matkap smiling at the viewer, with a browser on the other side. sparkles are around both.", + title: "quoted site ($20+ USD)", + description: `oh god oh fuck it looks like i'll have to do some mental math. + +this site type is good if you need something specific. + +price depends on quoted content, plus the base fee. +(the quote itself is free i'm not gonna charge you for a damn email exchange) + +minimum deadline: ??? +est. time: ???`, + yes: [ + ["fuck around and find out"], + ], + no: [ + ["freedom from consequences"], + ] + }) %> +
+
+

does everything look OK?

+

feel free to go ahead and contact me.

+
+ <%- include(__dirname + "/views/components/specific/footer.ejs") %> +
+ + \ No newline at end of file diff --git a/views/pages/tos.ejs b/views/pages/tos.ejs new file mode 100644 index 0000000..f693727 --- /dev/null +++ b/views/pages/tos.ejs @@ -0,0 +1,47 @@ + + + + + abtmtr.link site commissions + + + + + + +
+ <%- include(__dirname + "/views/components/specific/header.ejs") %> + <%- include(__dirname + "/views/components/cakeView.ejs", { + image: "/assets/imgs/nsfwMatkap.png", + alt: "matkap, staring up at a black bar that says \"NSFW\" on it. he says \"OH NO\"...", + title: "let's set some boundaries.", + description: `i've gotta make sure you're picking up what i'm putting down. this is what you will agree to acknowledge when you contact me regarding site commissions. + +...all of it is incredibly important. please read this page.` + }) %> + <%- include(__dirname + "/views/components/listView.ejs", { + image: "/assets/imgs/pricing/type_all.png", + alt: "matkap smiling at the viewer, with a browser on the other side. sparkles are around both.", + title: "terms of service", + description: [ + ["i won't do NSFW. if you request NSFW from me, i will block your email address and your entire domain if applicable. don't do it. don't try me. I AM A MINOR!!!!"], + ["after i am done making your site, you can license it however you want and credit me if you want to.\nif the site contains any copyrighted content not owned or licensed by the party who will own the site, however, the site's license will be limited to All Rights Reserved."], + ["during the site's creation, the site is under my ownership. if the commission is cancelled, however, you can request that the site, finished or unfinished, have its ownership transfered to you."], + ["i'd prefer you to send me some design reference, but if you don't have one, i can try my best to cook one up for you."], + ["i have the right to deny or stop working on your commission at any time. if your commission is cancelled after payment, expect a refund within (at maximum) a few days."], + ["you also have the right to deny or cancel a commission at any point until styling and layout is finished. expect a refund at a reduced amount depending on when the cancellation was made."], + ["changes in styling and minor changes to the site's layout can be done at any point. major changes to site layout or scripts should be clarified before the site is finished."], + ["when you contact me, i'd like to know your payment details in advance so i can verify that money is being sent the right way (and for refunds). i'll let you know mine in further correspondence for security-adjacent verification purposes."], + ["if there's a deadline, please let me know. my minimum notice time is 2 weeks or longer depending on the site type. anything shorter will cause your commission to be declined."], + ["if i am uncomfortable doing certain things with your site, i will let you know.", "to keep it brief, i am uncomfortable with piracy, advertising, unimportant cookies, tracking, and dishonest phrasing."], + ["i will try to provide updates on progress as i work on your site. if you don't want updates, or want updates and confirmation to be sent to a different email, please let me know beforehand."] + ] + }) %> +
+

did'ya get all that?

+

then you're cleared to check out my prices.

+
+ <%- include(__dirname + "/views/components/specific/footer.ejs") %> +
+ + \ No newline at end of file diff --git a/views/pages/whaticando.ejs b/views/pages/whaticando.ejs new file mode 100644 index 0000000..1a4842a --- /dev/null +++ b/views/pages/whaticando.ejs @@ -0,0 +1,52 @@ + + + + + abtmtr.link site commissions + + + + + + +
+ <%- include(__dirname + "/views/components/specific/header.ejs") %> + <%- include(__dirname + "/views/components/cakeView.ejs", { + image: "/assets/imgs/whatMatkap.png", + alt: "matkap with a double-chin looking wall-eyed over the viewer, mouth open and drooling.", + title: "here's what i can do.", + description: `now you're sold... maybe you even know what you need. here's what i can do in terms of site design!` + }) %> + <%- include(__dirname + "/views/components/listView.ejs", { + title: "i can make functional sites!", + description: [ + ["i've had 4 years of experience in web design, and have been programming my whole life."], + ["i'm good at CSS and styling", "if you can put it on a piece of paper, i can probably do it in CSS."], + ["i can make your site work well", "i'm not scared to write a little javascript, and i'll do anything in my toolset to make sure your site works consistently."], + ["i can make your site speedy", "to be honest, my biggest pet peeve is slow websites. i focus on making sure things are fast and performant."], + ["i can also use frameworks, if you want", "i've had experience in Next.js, React in general, and EJS (my favourite)."] + ] + }) %> + <%- include(__dirname + "/views/components/listView.ejs", { + title: "i'm very versatile!", + description: [ + ["i've got experience in frontend and backend. i know my stuff and if you want a backend with your site, i can help you with that!"], + ["i'm a very fast learner, so if you want something new that i don't already know, i'll probably be able to implement it effectively."], + ] + }) %> + <%- include(__dirname + "/views/components/galleryView.ejs", { + title: "examples", + images: [ + ["/assets/imgs/examples/abtmtr_link.png", "my personal site, abtmtr.link. a good example of a functional site without a lick of frontend JavaScript.", "https://abtmtr.link/"], + ["/assets/imgs/examples/sp_abtmtr_link.png", "sp.abtmtr.link, utilizing SVGs and JavaScript to make visualizations.", "https://sp.abtmtr.link/"], + ["/assets/imgs/examples/tc_abtmtr_link.png", "tc.abtmtr.link (once trollcall.xyz), a now defunct character publishing site.", "https://tc.abtmtr.link/"], + ] + }) %> +
+

like what you see?

+

continue by making sure you're aware of my terms of service.

+
+ <%- include(__dirname + "/views/components/specific/footer.ejs") %> +
+ + \ No newline at end of file