diff --git a/.eleventy.js b/.eleventy.js index dd54d44..2d679c3 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -7,6 +7,29 @@ module.exports = function (eleventyConfig) { eleventyConfig.addPassthroughCopy({ 'src/static/scss': '/static/scss' }) eleventyConfig.addPassthroughCopy({ 'src/static/files': '/static/files' }) eleventyConfig.addPassthroughCopy({ 'src/ads.txt': '/ads.txt' }) + + const markdownItAnchor = require('markdown-it-anchor'); + const markdownItToc = require('markdown-it-table-of-contents'); + const markdownItInclude = require('markdown-it-include'); + const markdownIt = require("markdown-it"); + + let options = { + html: true + }; + + // use markdown-it plugins + let libmarkdownIt = markdownIt(options) + .use(markdownItAnchor, { + permalink: true, + permalinkClass: "direct-link", + permalinkSymbol: "🔗" + }) + .use(markdownItToc, { + includeLevel: [2, 3] + }) + .use(markdownItInclude); + + eleventyConfig.setLibrary("md", libmarkdownIt); return { dir: { diff --git a/out.md b/out.md new file mode 100644 index 0000000..a20b960 --- /dev/null +++ b/out.md @@ -0,0 +1,14 @@ +- **Case** - the part of the keyboard that holds the plate and the PCB. +- **Dampeners** - the part of the keyboard that reduces the sound of the switches. They can be foam, o-rings, or springs. +- **Firmware** - the software that runs on the keyboard. It's usually open source, and you can customize it (most of the time it's gonna be QMK). +- **Gasket mount** - a way to mount the PCB to the case. It's usually done with rubber gaskets.- **Hotswap PCB** - PCB that allows you to mount switches without soldering. +- **Keycaps** - the part of the keyboard that you press. They come in different shapes, sizes, and colors. +- **LEDs** - the part of the keyboard that lights up the keycaps. They can be RGB, single color, or even no LEDs. +- **Layout** - literally the layout of the keyboard. It can be 60%, 65%, 75%, 80%, 90%, 100%, TKL, 1800, 1900, etc. (more on that later), there is also a distinction between ANSI and ISO layouts. +- **Mounting style** - how the plate or PCB is secured in the keyboard housing. (more on that here** - [keyboard-university](https://www.keyboard.university/200-courses/keyboard-mounting-styles-4lpp7)) +- **PCB** - the part of the keyboard that holds the switches and the diodes. It's also where the microcontroller is. +- **Plate** - the part of the keyboard that holds the switches and the keycaps. It can be made of different materials (aluminum, FR4, polycarbonate, etc.) +- **Solder PCB** - PCB that requires you to solder the switches to the PCB. Then, you can't remove the switches (unless you desolder them). +- **Stabilizers** - the part of the keyboard that holds the keycaps in place. They are used for the spacebar, the shift keys and the enter. +- **Switches** - the part of the keyboard that registers the keypresses. There are a lot of different types of switches, and they all have different characteristics. +- **Weight** - the part of the keyboard that goes underneath the case. diff --git a/package-lock.json b/package-lock.json index 562701a..5c696a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,55 +9,62 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@splinetool/runtime": "^0.9.130" + "@splinetool/runtime": "^0.9.130", + "eleventy": "^1.0.6", + "markdown-it-anchor": "^8.6.6", + "markdown-it-emoji": "^2.0.2", + "markdown-it-include": "^2.0.0", + "markdown-it-table-of-contents": "^0.6.0" }, "devDependencies": { - "@11ty/eleventy": "^1.0.0" + "@11ty/eleventy": "^1.0.2" } }, "node_modules/@11ty/dependency-tree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-2.0.0.tgz", - "integrity": "sha512-tYrGX3Tvccufy2jaYDkYpjBmVP1LeQq6b/d0r4GYThTXL4f3ZR7yMAl/0r8h9xvnsP+gkO53wfnV7s8cXcCtEg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-2.0.1.tgz", + "integrity": "sha512-5R+DsT9LJ9tXiSQ4y+KLFppCkQyXhzAm1AIuBWE/sbU0hSXY5pkhoqQYEcPJQFg/nglL+wD55iv2j+7O96UAvg==", "dev": true }, "node_modules/@11ty/eleventy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-1.0.0.tgz", - "integrity": "sha512-UMZghkMFwovu3Vh6DzjJ9GbcBnlE3nydGmLAti2AB1d6etQE+jXgfuHNxOyV1em33ywsBgGUCtLmLHaaTSU+Nw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-1.0.2.tgz", + "integrity": "sha512-03ER4zukR6BgwppI5DHRE11lc+8B0fWsBrqacVWo3o49QkdEFXnEWjhyI9qd9LrPlgQHK2/MYyxuOvNwecyCLQ==", "dev": true, "dependencies": { - "@11ty/dependency-tree": "^2.0.0", + "@11ty/dependency-tree": "^2.0.1", + "@11ty/eleventy-utils": "^1.0.1", "@iarna/toml": "^2.2.5", "@sindresorhus/slugify": "^1.1.2", - "browser-sync": "^2.27.7", - "chokidar": "^3.5.2", - "debug": "^4.3.3", + "browser-sync": "^2.27.10", + "chokidar": "^3.5.3", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", "dependency-graph": "^0.11.0", - "ejs": "^3.1.6", - "fast-glob": "^3.2.9", - "graceful-fs": "^4.2.9", + "ejs": "^3.1.8", + "fast-glob": "^3.2.11", + "graceful-fs": "^4.2.10", "gray-matter": "^4.0.3", "hamljs": "^0.6.2", "handlebars": "^4.7.7", "is-glob": "^4.0.3", - "kleur": "^4.1.4 ", - "liquidjs": "^9.32.0", + "kleur": "^4.1.5", + "liquidjs": "^9.40.0", "lodash": "^4.17.21", - "luxon": "^2.3.0", + "luxon": "^2.5.0", "markdown-it": "^12.3.2", - "minimist": "^1.2.5", + "minimist": "^1.2.6", "moo": "^0.5.1", "multimatch": "^5.0.0", "mustache": "^4.2.0", "normalize-path": "^3.0.0", "nunjucks": "^3.2.3", - "path-to-regexp": "^6.2.0", + "path-to-regexp": "^6.2.1", "please-upgrade-node": "^3.2.0", "pretty": "^2.0.0", "pug": "^3.0.2", - "recursive-copy": "^2.0.13", - "semver": "^7.3.5", + "recursive-copy": "^2.0.14", + "semver": "^7.3.7", "slugify": "^1.6.5" }, "bin": { @@ -71,6 +78,22 @@ "url": "https://opencollective.com/11ty" } }, + "node_modules/@11ty/eleventy-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-1.0.1.tgz", + "integrity": "sha512-HPpCTz4PzudcQU+i+x6GSNHVqgnvRhnVYg5dLKaAoRWLN966odAGsBxKSyhF8i1MdlOPtsytYb2AGWP7jISC5w==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, "node_modules/@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", @@ -187,6 +210,12 @@ "node": ">=8" } }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true + }, "node_modules/@splinetool/runtime": { "version": "0.9.130", "resolved": "https://registry.npmjs.org/@splinetool/runtime/-/runtime-0.9.130.tgz", @@ -195,12 +224,55 @@ "on-change": "^4.0.0" } }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", + "peer": true + }, + "node_modules/@types/markdown-it": { + "version": "12.2.3", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", + "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "peer": true, + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", + "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", + "peer": true + }, "node_modules/@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, + "node_modules/@types/node": { + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", + "dev": true + }, "node_modules/a-sync-waterfall": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", @@ -214,13 +286,13 @@ "dev": true }, "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "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==", "dev": true, "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { "node": ">= 0.6" @@ -238,12 +310,6 @@ "node": ">=0.4.0" } }, - "node_modules/after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -254,15 +320,18 @@ } }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/anymatch": { @@ -308,18 +377,12 @@ "node_modules/array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, "node_modules/arrify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", @@ -342,15 +405,15 @@ "dev": true }, "node_modules/async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, "node_modules/async-each-series": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", - "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", + "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", "dev": true, "engines": { "node": ">=0.8.0" @@ -377,27 +440,12 @@ "node": ">= 10.0.0" } }, - "node_modules/backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, "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==", "dev": true }, - "node_modules/base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", @@ -410,7 +458,7 @@ "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, "node_modules/binary-extensions": { @@ -422,12 +470,6 @@ "node": ">=8" } }, - "node_modules/blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -451,13 +493,13 @@ } }, "node_modules/browser-sync": { - "version": "2.27.7", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.27.7.tgz", - "integrity": "sha512-9ElnnA/u+s2Jd+IgY+2SImB+sAEIteHsMG0NR96m7Ph/wztpvJCUpyC2on1KqmG9iAp941j+5jfmd34tEguGbg==", + "version": "2.27.11", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.27.11.tgz", + "integrity": "sha512-U5f9u97OYJH66T0MGWWzG9rOQTW6ZmDMj97vsmtqwNS03JAwdLVES8eel2lD3rvAqQCNAFqaJ74NMacBI57vJg==", "dev": true, "dependencies": { - "browser-sync-client": "^2.27.7", - "browser-sync-ui": "^2.27.7", + "browser-sync-client": "^2.27.11", + "browser-sync-ui": "^2.27.11", "bs-recipes": "1.3.4", "bs-snippet-injector": "^2.0.1", "chokidar": "^3.5.1", @@ -474,8 +516,8 @@ "localtunnel": "^2.0.1", "micromatch": "^4.0.2", "opn": "5.3.0", - "portscanner": "2.1.1", - "qs": "6.2.3", + "portscanner": "2.2.0", + "qs": "^6.11.0", "raw-body": "^2.3.2", "resp-modifier": "6.0.2", "rx": "4.1.0", @@ -483,9 +525,9 @@ "serve-index": "1.9.1", "serve-static": "1.13.2", "server-destroy": "1.0.1", - "socket.io": "2.4.0", + "socket.io": "^4.4.1", "ua-parser-js": "1.0.2", - "yargs": "^15.4.1" + "yargs": "^17.3.1" }, "bin": { "browser-sync": "dist/bin.js" @@ -495,50 +537,51 @@ } }, "node_modules/browser-sync-client": { - "version": "2.27.7", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.7.tgz", - "integrity": "sha512-wKg9UP9a4sCIkBBAXUdbkdWFJzfSAQizGh+nC19W9y9zOo9s5jqeYRFUUbs7x5WKhjtspT+xetVp9AtBJ6BmWg==", + "version": "2.27.11", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.11.tgz", + "integrity": "sha512-okMNfD2NasL/XD1/BclP3onXjhahisk3e/kTQ5HPDT/lLqdBqNDd6QFcjI5I1ak7na2hxKQSLjryql+7fp5gKQ==", "dev": true, "dependencies": { "etag": "1.8.1", "fresh": "0.5.2", "mitt": "^1.1.3", - "rxjs": "^5.5.6" + "rxjs": "^5.5.6", + "typescript": "^4.6.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/browser-sync-ui": { - "version": "2.27.7", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.7.tgz", - "integrity": "sha512-Bt4OQpx9p18OIzk0KKyu7jqlvmjacasUlk8ARY3uuIyiFWSBiRgr2i6XY8dEMF14DtbooaEBOpHEu9VCYvMcCw==", + "version": "2.27.11", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.11.tgz", + "integrity": "sha512-1T/Y8Pp1R68aUL7zVSFq0nxtr258xWd/nTasCAHX2M6EsGaswVOFtXsw3bKqsr35z+J+LfVfOdz1HFLYKxdgrA==", "dev": true, "dependencies": { "async-each-series": "0.1.1", "connect-history-api-fallback": "^1", "immutable": "^3", "server-destroy": "1.0.1", - "socket.io-client": "^2.4.0", + "socket.io-client": "^4.4.1", "stream-throttle": "^0.1.3" } }, "node_modules/bs-recipes": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", - "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", + "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==", "dev": true }, "node_modules/bs-snippet-injector": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", - "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", + "integrity": "sha512-4u8IgB+L9L+S5hknOj3ddNSb42436gsnGm1AuM15B7CdbkpQTyVWgIM5/JUBiKiRwGOR86uo0Lu/OsX+SAlJmw==", "dev": true }, "node_modules/bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "engines": { "node": ">= 0.8" @@ -557,36 +600,20 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/character-parser": { @@ -626,29 +653,35 @@ } }, "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/commander": { @@ -660,24 +693,6 @@ "node": ">= 6" } }, - "node_modules/component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "node_modules/component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -723,7 +738,7 @@ "node_modules/connect": { "version": "3.6.6", "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", "dev": true, "dependencies": { "debug": "2.6.9", @@ -756,7 +771,7 @@ "node_modules/connect/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/constantinople": { @@ -770,65 +785,65 @@ } }, "node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true, "engines": { "node": ">= 0.6" } }, - "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, "dependencies": { - "ms": "2.1.2" + "object-assign": "^4", + "vary": "^1" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 0.10" } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" + "ms": "2.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/dependency-graph": { @@ -843,13 +858,13 @@ "node_modules/destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", "dev": true }, "node_modules/dev-ip": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", - "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", + "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", "dev": true, "bin": { "dev-ip": "lib/dev-ip.js" @@ -927,16 +942,16 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, "node_modules/ejs": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", - "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", "dev": true, "dependencies": { - "jake": "^10.6.1" + "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" @@ -945,6 +960,12 @@ "node": ">=0.10.0" } }, + "node_modules/eleventy": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/eleventy/-/eleventy-1.0.6.tgz", + "integrity": "sha512-IzaPK0P5eF/jm5qdOzrzq2947FFRKpZwHT8AR1WpGI4tTpkLnzwQF02p9m0o5XQQ4dypBExp69fUHViEiHUWpQ==", + "hasInstallScript": true + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -954,91 +975,59 @@ "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, "engines": { "node": ">= 0.8" } }, "node_modules/engine.io": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", - "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", + "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", "dev": true, "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.4.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "~7.4.2" + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" }, "engines": { - "node": ">=8.0.0" + "node": ">=10.0.0" } }, "node_modules/engine.io-client": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.2.tgz", - "integrity": "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==", - "dev": true, - "dependencies": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.6.2", - "yeast": "0.1.2" - } - }, - "node_modules/engine.io-client/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz", + "integrity": "sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw==", "dev": true, "dependencies": { - "ms": "2.0.0" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3", + "xmlhttprequest-ssl": "~2.0.0" } }, - "node_modules/engine.io-client/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "node_modules/engine.io-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", - "dev": true, - "dependencies": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "node_modules/engine.io/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", + "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", "dev": true, - "dependencies": { - "ms": "^2.1.1" + "engines": { + "node": ">=10.0.0" } }, "node_modules/entities": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "dev": true, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -1067,7 +1056,7 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, "node_modules/escape-string-regexp": { @@ -1098,7 +1087,7 @@ "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, "engines": { "node": ">= 0.6" @@ -1148,12 +1137,33 @@ } }, "node_modules/filelist": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", - "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "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==", "dev": true, "dependencies": { - "minimatch": "^3.0.4" + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/fill-range": { @@ -1171,7 +1181,7 @@ "node_modules/finalhandler": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", "dev": true, "dependencies": { "debug": "2.6.9", @@ -1198,26 +1208,13 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/follow-redirects": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", - "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true, "funding": [ { @@ -1237,7 +1234,7 @@ "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, "engines": { "node": ">= 0.6" @@ -1246,7 +1243,7 @@ "node_modules/fs-extra": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", "dev": true, "dependencies": { "graceful-fs": "^4.1.2", @@ -1335,48 +1332,10 @@ "node": ">= 6" } }, - "node_modules/globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "dependencies": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/globby/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/globby/node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "node_modules/gray-matter": { @@ -1436,7 +1395,7 @@ "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dev": true, "dependencies": { "ansi-regex": "^2.0.0" @@ -1448,34 +1407,19 @@ "node_modules/has-ansi/node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "dependencies": { - "isarray": "2.0.1" - } - }, - "node_modules/has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-symbols": { @@ -1506,28 +1450,28 @@ } }, "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "dependencies": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/http-errors/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/http-proxy": { @@ -1559,18 +1503,12 @@ "node_modules/immutable": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1690,39 +1628,6 @@ "lodash.isfinite": "^3.3.2" } }, - "node_modules/is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "dependencies": { - "is-path-inside": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "dependencies": { - "path-is-inside": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", @@ -1757,26 +1662,26 @@ "node_modules/is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", "dev": true, "engines": { "node": ">=4" } }, - "node_modules/isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "node_modules/jake": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", - "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", "dev": true, "dependencies": { - "async": "0.9.x", - "chalk": "^2.4.2", + "async": "^3.2.3", + "chalk": "^4.0.2", "filelist": "^1.0.1", "minimatch": "^3.0.4" }, @@ -1784,7 +1689,7 @@ "jake": "bin/cli.js" }, "engines": { - "node": "*" + "node": ">=10" } }, "node_modules/js-beautify": { @@ -1829,7 +1734,7 @@ "node_modules/jsonfile": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", "dev": true, "optionalDependencies": { "graceful-fs": "^4.1.6" @@ -1848,7 +1753,7 @@ "node_modules/junk": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/junk/-/junk-1.0.3.tgz", - "integrity": "sha1-h75jSIZJy9ym9Tqzm+yczSNH9ZI=", + "integrity": "sha512-3KF80UaaSSxo8jVnRYtMKNGFOoVPBdkkVPsw+Ad0y4oxKXPduS6G6iHkrf69yJVff/VAaYXkV42rtZ7daJxU3w==", "dev": true, "engines": { "node": ">=0.10.0" @@ -1864,9 +1769,9 @@ } }, "node_modules/kleur": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz", - "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "dev": true, "engines": { "node": ">=6" @@ -1882,15 +1787,14 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "dev": true, "dependencies": { "uc.micro": "^1.0.1" } }, "node_modules/liquidjs": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-9.34.0.tgz", - "integrity": "sha512-LIOqPT3hvnmJQKwhJwBLcEwaEthdWJH2uvNjC9Q6K/n25+tuXQuvd/bwH1WwWBtBpzvESjcDWdM2SHpRlTLvqg==", + "version": "9.43.0", + "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-9.43.0.tgz", + "integrity": "sha512-qZZuL5Emja2UgCqiLewiw9bvwZQwm19TTGFxDkonVzB4YSTOZ8tuTVo/7Uu/AeW1cL2Qb/at3DSoV8wwyFXQCw==", "dev": true, "bin": { "liquid": "bin/liquid.js", @@ -1922,21 +1826,6 @@ "node": ">=8.3.0" } }, - "node_modules/localtunnel/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/localtunnel/node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -1948,24 +1837,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/localtunnel/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/localtunnel/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==", - "dev": true - }, "node_modules/localtunnel/node_modules/debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", @@ -1983,32 +1854,6 @@ } } }, - "node_modules/localtunnel/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/localtunnel/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/localtunnel/node_modules/yargs": { "version": "17.1.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", @@ -2036,18 +1881,6 @@ "node": ">=10" } }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -2063,7 +1896,7 @@ "node_modules/lodash.isfinite": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", + "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", "dev": true }, "node_modules/lru-cache": { @@ -2077,9 +1910,9 @@ } }, "node_modules/luxon": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.3.0.tgz", - "integrity": "sha512-gv6jZCV+gGIrVKhO90yrsn8qXPKD8HYZJtrUDSfEbow8Tkw84T9OnCyJhWvnJIaIF/tBuiAjZuQHUt1LddX2mg==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.5.2.tgz", + "integrity": "sha512-Yg7/RDp4nedqmLgyH0LwgGRvMEKVzKbUdkBYyCosbHgJ+kaOUx0qzSiSatVc3DFygnirTPYnMM2P5dg2uH1WvA==", "dev": true, "engines": { "node": ">=12" @@ -2089,7 +1922,6 @@ "version": "12.3.2", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "dev": true, "dependencies": { "argparse": "^2.0.1", "entities": "~2.1.0", @@ -2101,16 +1933,48 @@ "markdown-it": "bin/markdown-it.js" } }, + "node_modules/markdown-it-anchor": { + "version": "8.6.6", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.6.tgz", + "integrity": "sha512-jRW30YGywD2ESXDc+l17AiritL0uVaSnWsb26f+68qaW9zgbIIr1f4v2Nsvc0+s0Z2N3uX6t/yAw7BwCQ1wMsA==", + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + } + }, + "node_modules/markdown-it-emoji": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz", + "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==" + }, + "node_modules/markdown-it-include": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-include/-/markdown-it-include-2.0.0.tgz", + "integrity": "sha512-wfgIX92ZEYahYWiCk6Jx36XmHvAimeHN420csOWgfyZjpf171Y0xREqZWcm/Rwjzyd0RLYryY+cbNmrkYW2MDw==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "markdown-it": ">=8.4.2" + } + }, + "node_modules/markdown-it-table-of-contents": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/markdown-it-table-of-contents/-/markdown-it-table-of-contents-0.6.0.tgz", + "integrity": "sha512-jHvEjZVEibyW97zEYg19mZCIXO16lHbvRaPDkEuOfMPBmzlI7cYczMZLMfUvwkhdOVQpIxu3gx6mgaw46KsNsQ==", + "engines": { + "node": ">6.4.0" + } + }, "node_modules/markdown-it/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/maximatch": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/maximatch/-/maximatch-0.1.0.tgz", - "integrity": "sha1-hs2NawTJ8wfAWmuUGZBtA2D7E6I=", + "integrity": "sha512-9ORVtDUFk4u/NFfo0vG/ND/z7UQCVZBL539YW0+U1I7H1BkZwizcPx5foFv7LCPcBnm2U6RjFnQOsIvN4/Vm2A==", "dev": true, "dependencies": { "array-differ": "^1.0.0", @@ -2125,7 +1989,7 @@ "node_modules/maximatch/node_modules/array-differ": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -2134,7 +1998,7 @@ "node_modules/maximatch/node_modules/array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "dev": true, "dependencies": { "array-uniq": "^1.0.1" @@ -2146,7 +2010,7 @@ "node_modules/maximatch/node_modules/arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -2155,8 +2019,7 @@ "node_modules/mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", - "dev": true + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" }, "node_modules/merge2": { "version": "1.4.1", @@ -2190,30 +2053,30 @@ } }, "node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "dependencies": { - "mime-db": "1.51.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -2223,10 +2086,13 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/mitt": { "version": "1.2.0", @@ -2235,12 +2101,12 @@ "dev": true }, "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -2287,9 +2153,9 @@ } }, "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, "engines": { "node": ">= 0.6" @@ -2359,6 +2225,15 @@ "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-change": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/on-change/-/on-change-4.0.1.tgz", @@ -2373,7 +2248,7 @@ "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "dev": true, "dependencies": { "ee-first": "1.1.1" @@ -2394,7 +2269,7 @@ "node_modules/openurl": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", - "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", + "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", "dev": true }, "node_modules/opn": { @@ -2409,54 +2284,6 @@ "node": ">=4" } }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", - "dev": true - }, - "node_modules/parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", - "dev": true - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -2466,15 +2293,6 @@ "node": ">= 0.8" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -2484,11 +2302,14 @@ "node": ">=0.10.0" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } }, "node_modules/path-parse": { "version": "1.0.7", @@ -2497,9 +2318,9 @@ "dev": true }, "node_modules/path-to-regexp": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", - "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", "dev": true }, "node_modules/picomatch": { @@ -2517,33 +2338,12 @@ "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/please-upgrade-node": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", @@ -2554,12 +2354,12 @@ } }, "node_modules/portscanner": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", - "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", + "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", "dev": true, "dependencies": { - "async": "1.5.2", + "async": "^2.6.0", "is-number-like": "^1.0.3" }, "engines": { @@ -2568,10 +2368,13 @@ } }, "node_modules/portscanner/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } }, "node_modules/pretty": { "version": "2.0.0", @@ -2605,7 +2408,7 @@ "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true }, "node_modules/pseudomap": { @@ -2739,12 +2542,18 @@ "dev": true }, "node_modules/qs": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", - "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/queue-microtask": { @@ -2777,13 +2586,13 @@ } }, "node_modules/raw-body": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", - "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, "dependencies": { - "bytes": "3.1.1", - "http-errors": "1.8.1", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -2804,12 +2613,11 @@ } }, "node_modules/recursive-copy": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/recursive-copy/-/recursive-copy-2.0.13.tgz", - "integrity": "sha512-BjmE6R/dOImStEku+017L3Z0I6u/lA+SVr1sySWbTLjmQKDTESNmJ9WBZP8wbN5FuvqNvSYvRKA/IKQhAjqnpQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/recursive-copy/-/recursive-copy-2.0.14.tgz", + "integrity": "sha512-K8WNY8f8naTpfbA+RaXmkaQuD1IeW9EgNEfyGxSqqTQukpVtoOKros9jUqbpEsSw59YOmpd8nCBgtqJZy5nvog==", "dev": true, "dependencies": { - "del": "^2.2.0", "errno": "^0.1.2", "graceful-fs": "^4.1.4", "junk": "^1.0.1", @@ -2817,28 +2625,23 @@ "mkdirp": "^0.5.1", "pify": "^2.3.0", "promise": "^7.0.1", + "rimraf": "^2.7.1", "slash": "^1.0.0" } }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, "node_modules/resolve": { @@ -2861,7 +2664,7 @@ "node_modules/resp-modifier": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", - "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", + "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", "dev": true, "dependencies": { "debug": "^2.2.0", @@ -2883,7 +2686,7 @@ "node_modules/resp-modifier/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/reusify": { @@ -2934,7 +2737,7 @@ "node_modules/rx": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==", "dev": true }, "node_modules/rxjs": { @@ -2969,9 +2772,9 @@ } }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -3040,10 +2843,19 @@ "ms": "2.0.0" } }, + "node_modules/send/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/send/node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, "dependencies": { "depd": "~1.1.2", @@ -3058,13 +2870,13 @@ "node_modules/send/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "dev": true }, "node_modules/send/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/send/node_modules/setprototypeof": { @@ -3085,7 +2897,7 @@ "node_modules/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, "dependencies": { "accepts": "~1.3.4", @@ -3109,10 +2921,19 @@ "ms": "2.0.0" } }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, "dependencies": { "depd": "~1.1.2", @@ -3127,13 +2948,13 @@ "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "dev": true }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/serve-index/node_modules/setprototypeof": { @@ -3145,7 +2966,7 @@ "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, "engines": { "node": ">= 0.6" @@ -3169,13 +2990,7 @@ "node_modules/server-destroy": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", - "dev": true - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", "dev": true }, "node_modules/setprototypeof": { @@ -3184,6 +2999,41 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/sigmund": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", @@ -3193,7 +3043,7 @@ "node_modules/slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -3209,105 +3059,54 @@ } }, "node_modules/socket.io": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.0.tgz", - "integrity": "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz", + "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==", "dev": true, "dependencies": { - "debug": "~4.1.0", - "engine.io": "~3.5.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.4.0", - "socket.io-parser": "~3.4.0" + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.2.1", + "socket.io-adapter": "~2.4.0", + "socket.io-parser": "~4.2.1" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", - "dev": true - }, - "node_modules/socket.io-client": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", - "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", - "dev": true, - "dependencies": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.5.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - } - }, - "node_modules/socket.io-client/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/socket.io-client/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", "dev": true }, - "node_modules/socket.io-client/node_modules/socket.io-parser": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", - "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", + "node_modules/socket.io-client": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.4.tgz", + "integrity": "sha512-ZpKteoA06RzkD32IbqILZ+Cnst4xewU7ZYK12aS1mzHftFFjpoMz69IuhP/nL25pJfao/amoPI527KnuhFm01g==", "dev": true, "dependencies": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.2.3", + "socket.io-parser": "~4.2.1" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", - "dev": true, - "dependencies": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" - } - }, - "node_modules/socket.io-parser/node_modules/component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", + "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", "dev": true, "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/socket.io/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/source-map": { @@ -3328,7 +3127,7 @@ "node_modules/statuses": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", "dev": true, "engines": { "node": ">= 0.6" @@ -3337,7 +3136,7 @@ "node_modules/stream-throttle": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", - "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", "dev": true, "dependencies": { "commander": "^2.2.0", @@ -3392,15 +3191,15 @@ } }, "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==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -3418,7 +3217,7 @@ "node_modules/symbol-observable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==", "dev": true, "engines": { "node": ">=0.10.0" @@ -3437,7 +3236,7 @@ "node_modules/tfunk/node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -3446,7 +3245,7 @@ "node_modules/tfunk/node_modules/ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -3455,7 +3254,7 @@ "node_modules/tfunk/node_modules/chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, "dependencies": { "ansi-styles": "^2.2.1", @@ -3471,7 +3270,7 @@ "node_modules/tfunk/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" @@ -3480,7 +3279,7 @@ "node_modules/tfunk/node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "dependencies": { "ansi-regex": "^2.0.0" @@ -3492,18 +3291,12 @@ "node_modules/tfunk/node_modules/supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true, "engines": { "node": ">=0.8.0" } }, - "node_modules/to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -3540,6 +3333,19 @@ "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=", "dev": true }, + "node_modules/typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/ua-parser-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz", @@ -3562,8 +3368,7 @@ "node_modules/uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, "node_modules/uglify-js": { "version": "3.15.0", @@ -3590,7 +3395,7 @@ "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, "engines": { "node": ">= 0.8" @@ -3599,12 +3404,21 @@ "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, "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==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/void-elements": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", @@ -3614,11 +3428,20 @@ "node": ">=0.10.0" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } }, "node_modules/with": { "version": "7.0.2", @@ -3642,9 +3465,9 @@ "dev": true }, "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", @@ -3652,42 +3475,12 @@ "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/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==", - "dev": true - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -3695,12 +3488,12 @@ "dev": true }, "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "dev": true, "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", @@ -3716,19 +3509,22 @@ } }, "node_modules/xmlhttprequest-ssl": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", - "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } }, "node_modules/yallist": { "version": "2.1.2", @@ -3737,94 +3533,91 @@ "dev": true }, "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=8" + "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, "engines": { - "node": ">=6" + "node": ">=12" } - }, - "node_modules/yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true } }, "dependencies": { "@11ty/dependency-tree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-2.0.0.tgz", - "integrity": "sha512-tYrGX3Tvccufy2jaYDkYpjBmVP1LeQq6b/d0r4GYThTXL4f3ZR7yMAl/0r8h9xvnsP+gkO53wfnV7s8cXcCtEg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-2.0.1.tgz", + "integrity": "sha512-5R+DsT9LJ9tXiSQ4y+KLFppCkQyXhzAm1AIuBWE/sbU0hSXY5pkhoqQYEcPJQFg/nglL+wD55iv2j+7O96UAvg==", "dev": true }, "@11ty/eleventy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-1.0.0.tgz", - "integrity": "sha512-UMZghkMFwovu3Vh6DzjJ9GbcBnlE3nydGmLAti2AB1d6etQE+jXgfuHNxOyV1em33ywsBgGUCtLmLHaaTSU+Nw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-1.0.2.tgz", + "integrity": "sha512-03ER4zukR6BgwppI5DHRE11lc+8B0fWsBrqacVWo3o49QkdEFXnEWjhyI9qd9LrPlgQHK2/MYyxuOvNwecyCLQ==", "dev": true, "requires": { - "@11ty/dependency-tree": "^2.0.0", + "@11ty/dependency-tree": "^2.0.1", + "@11ty/eleventy-utils": "^1.0.1", "@iarna/toml": "^2.2.5", "@sindresorhus/slugify": "^1.1.2", - "browser-sync": "^2.27.7", - "chokidar": "^3.5.2", - "debug": "^4.3.3", + "browser-sync": "^2.27.10", + "chokidar": "^3.5.3", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", "dependency-graph": "^0.11.0", - "ejs": "^3.1.6", - "fast-glob": "^3.2.9", - "graceful-fs": "^4.2.9", + "ejs": "^3.1.8", + "fast-glob": "^3.2.11", + "graceful-fs": "^4.2.10", "gray-matter": "^4.0.3", "hamljs": "^0.6.2", "handlebars": "^4.7.7", "is-glob": "^4.0.3", - "kleur": "^4.1.4 ", - "liquidjs": "^9.32.0", + "kleur": "^4.1.5", + "liquidjs": "^9.40.0", "lodash": "^4.17.21", - "luxon": "^2.3.0", + "luxon": "^2.5.0", "markdown-it": "^12.3.2", - "minimist": "^1.2.5", + "minimist": "^1.2.6", "moo": "^0.5.1", "multimatch": "^5.0.0", "mustache": "^4.2.0", "normalize-path": "^3.0.0", "nunjucks": "^3.2.3", - "path-to-regexp": "^6.2.0", + "path-to-regexp": "^6.2.1", "please-upgrade-node": "^3.2.0", "pretty": "^2.0.0", "pug": "^3.0.2", - "recursive-copy": "^2.0.13", - "semver": "^7.3.5", + "recursive-copy": "^2.0.14", + "semver": "^7.3.7", "slugify": "^1.6.5" } }, + "@11ty/eleventy-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-1.0.1.tgz", + "integrity": "sha512-HPpCTz4PzudcQU+i+x6GSNHVqgnvRhnVYg5dLKaAoRWLN966odAGsBxKSyhF8i1MdlOPtsytYb2AGWP7jISC5w==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0" + } + }, "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", @@ -3907,6 +3700,12 @@ } } }, + "@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true + }, "@splinetool/runtime": { "version": "0.9.130", "resolved": "https://registry.npmjs.org/@splinetool/runtime/-/runtime-0.9.130.tgz", @@ -3915,12 +3714,55 @@ "on-change": "^4.0.0" } }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/linkify-it": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", + "peer": true + }, + "@types/markdown-it": { + "version": "12.2.3", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", + "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "peer": true, + "requires": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "@types/mdurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", + "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", + "peer": true + }, "@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, + "@types/node": { + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", + "dev": true + }, "a-sync-waterfall": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", @@ -3934,13 +3776,13 @@ "dev": true }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "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==", "dev": true, "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "acorn": { @@ -3949,12 +3791,6 @@ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -3962,12 +3798,12 @@ "dev": true }, "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" } }, "anymatch": { @@ -4004,13 +3840,7 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true }, "arrify": { @@ -4032,15 +3862,15 @@ "dev": true }, "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, "async-each-series": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", - "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", + "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", "dev": true }, "axios": { @@ -4061,24 +3891,12 @@ "@babel/types": "^7.9.6" } }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", - "dev": true - }, "base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", @@ -4088,7 +3906,7 @@ "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, "binary-extensions": { @@ -4097,12 +3915,6 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4123,13 +3935,13 @@ } }, "browser-sync": { - "version": "2.27.7", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.27.7.tgz", - "integrity": "sha512-9ElnnA/u+s2Jd+IgY+2SImB+sAEIteHsMG0NR96m7Ph/wztpvJCUpyC2on1KqmG9iAp941j+5jfmd34tEguGbg==", + "version": "2.27.11", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.27.11.tgz", + "integrity": "sha512-U5f9u97OYJH66T0MGWWzG9rOQTW6ZmDMj97vsmtqwNS03JAwdLVES8eel2lD3rvAqQCNAFqaJ74NMacBI57vJg==", "dev": true, "requires": { - "browser-sync-client": "^2.27.7", - "browser-sync-ui": "^2.27.7", + "browser-sync-client": "^2.27.11", + "browser-sync-ui": "^2.27.11", "bs-recipes": "1.3.4", "bs-snippet-injector": "^2.0.1", "chokidar": "^3.5.1", @@ -4146,8 +3958,8 @@ "localtunnel": "^2.0.1", "micromatch": "^4.0.2", "opn": "5.3.0", - "portscanner": "2.1.1", - "qs": "6.2.3", + "portscanner": "2.2.0", + "qs": "^6.11.0", "raw-body": "^2.3.2", "resp-modifier": "6.0.2", "rx": "4.1.0", @@ -4155,53 +3967,54 @@ "serve-index": "1.9.1", "serve-static": "1.13.2", "server-destroy": "1.0.1", - "socket.io": "2.4.0", + "socket.io": "^4.4.1", "ua-parser-js": "1.0.2", - "yargs": "^15.4.1" + "yargs": "^17.3.1" } }, "browser-sync-client": { - "version": "2.27.7", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.7.tgz", - "integrity": "sha512-wKg9UP9a4sCIkBBAXUdbkdWFJzfSAQizGh+nC19W9y9zOo9s5jqeYRFUUbs7x5WKhjtspT+xetVp9AtBJ6BmWg==", + "version": "2.27.11", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.11.tgz", + "integrity": "sha512-okMNfD2NasL/XD1/BclP3onXjhahisk3e/kTQ5HPDT/lLqdBqNDd6QFcjI5I1ak7na2hxKQSLjryql+7fp5gKQ==", "dev": true, "requires": { "etag": "1.8.1", "fresh": "0.5.2", "mitt": "^1.1.3", - "rxjs": "^5.5.6" + "rxjs": "^5.5.6", + "typescript": "^4.6.2" } }, "browser-sync-ui": { - "version": "2.27.7", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.7.tgz", - "integrity": "sha512-Bt4OQpx9p18OIzk0KKyu7jqlvmjacasUlk8ARY3uuIyiFWSBiRgr2i6XY8dEMF14DtbooaEBOpHEu9VCYvMcCw==", + "version": "2.27.11", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.11.tgz", + "integrity": "sha512-1T/Y8Pp1R68aUL7zVSFq0nxtr258xWd/nTasCAHX2M6EsGaswVOFtXsw3bKqsr35z+J+LfVfOdz1HFLYKxdgrA==", "dev": true, "requires": { "async-each-series": "0.1.1", "connect-history-api-fallback": "^1", "immutable": "^3", "server-destroy": "1.0.1", - "socket.io-client": "^2.4.0", + "socket.io-client": "^4.4.1", "stream-throttle": "^0.1.3" } }, "bs-recipes": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", - "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", + "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==", "dev": true }, "bs-snippet-injector": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", - "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", + "integrity": "sha512-4u8IgB+L9L+S5hknOj3ddNSb42436gsnGm1AuM15B7CdbkpQTyVWgIM5/JUBiKiRwGOR86uo0Lu/OsX+SAlJmw==", "dev": true }, "bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true }, "call-bind": { @@ -4214,29 +4027,14 @@ "get-intrinsic": "^1.0.2" } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, "character-parser": { @@ -4265,29 +4063,29 @@ } }, "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "requires": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" } }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "commander": { @@ -4296,24 +4094,6 @@ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -4355,7 +4135,7 @@ "connect": { "version": "3.6.6", "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", "dev": true, "requires": { "debug": "2.6.9", @@ -4376,7 +4156,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -4398,45 +4178,45 @@ } }, "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, "requires": { - "ms": "2.1.2" + "object-assign": "^4", + "vary": "^1" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" + "ms": "2.1.2" } }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, "dependency-graph": { @@ -4448,13 +4228,13 @@ "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", "dev": true }, "dev-ip": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", - "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", + "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", "dev": true }, "dlv": { @@ -4516,18 +4296,23 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, "ejs": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", - "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", "dev": true, "requires": { - "jake": "^10.6.1" + "jake": "^10.8.5" } }, + "eleventy": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/eleventy/-/eleventy-1.0.6.tgz", + "integrity": "sha512-IzaPK0P5eF/jm5qdOzrzq2947FFRKpZwHT8AR1WpGI4tTpkLnzwQF02p9m0o5XQQ4dypBExp69fUHViEiHUWpQ==" + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -4537,88 +4322,50 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true }, "engine.io": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", - "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", + "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", "dev": true, "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.4.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "~7.4.2" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" } }, "engine.io-client": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.2.tgz", - "integrity": "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz", + "integrity": "sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw==", "dev": true, "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.6.2", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3", + "xmlhttprequest-ssl": "~2.0.0" } }, "engine.io-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", + "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "dev": true }, "entities": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "dev": true + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" }, "errno": { "version": "0.1.8", @@ -4638,7 +4385,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, "escape-string-regexp": { @@ -4656,7 +4403,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true }, "eventemitter3": { @@ -4697,12 +4444,32 @@ } }, "filelist": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", - "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "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==", "dev": true, "requires": { - "minimatch": "^3.0.4" + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "fill-range": { @@ -4717,7 +4484,7 @@ "finalhandler": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", "dev": true, "requires": { "debug": "2.6.9", @@ -4741,37 +4508,27 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, "follow-redirects": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", - "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true }, "fs-extra": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -4838,41 +4595,10 @@ "is-glob": "^4.0.1" } }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - } - } - }, "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "gray-matter": { @@ -4918,7 +4644,7 @@ "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -4927,30 +4653,15 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true } } }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "requires": { - "isarray": "2.0.1" - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "has-symbols": { @@ -4969,22 +4680,22 @@ } }, "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "requires": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" }, "dependencies": { "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true } } @@ -5012,13 +4723,7 @@ "immutable": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", "dev": true }, "inflight": { @@ -5119,30 +4824,6 @@ "lodash.isfinite": "^3.3.2" } }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, "is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", @@ -5168,23 +4849,23 @@ "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", "dev": true }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "jake": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", - "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", "dev": true, "requires": { - "async": "0.9.x", - "chalk": "^2.4.2", + "async": "^3.2.3", + "chalk": "^4.0.2", "filelist": "^1.0.1", "minimatch": "^3.0.4" } @@ -5220,7 +4901,7 @@ "jsonfile": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", "dev": true, "requires": { "graceful-fs": "^4.1.6" @@ -5239,7 +4920,7 @@ "junk": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/junk/-/junk-1.0.3.tgz", - "integrity": "sha1-h75jSIZJy9ym9Tqzm+yczSNH9ZI=", + "integrity": "sha512-3KF80UaaSSxo8jVnRYtMKNGFOoVPBdkkVPsw+Ad0y4oxKXPduS6G6iHkrf69yJVff/VAaYXkV42rtZ7daJxU3w==", "dev": true }, "kind-of": { @@ -5249,9 +4930,9 @@ "dev": true }, "kleur": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz", - "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "dev": true }, "limiter": { @@ -5264,15 +4945,14 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "dev": true, "requires": { "uc.micro": "^1.0.1" } }, "liquidjs": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-9.34.0.tgz", - "integrity": "sha512-LIOqPT3hvnmJQKwhJwBLcEwaEthdWJH2uvNjC9Q6K/n25+tuXQuvd/bwH1WwWBtBpzvESjcDWdM2SHpRlTLvqg==", + "version": "9.43.0", + "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-9.43.0.tgz", + "integrity": "sha512-qZZuL5Emja2UgCqiLewiw9bvwZQwm19TTGFxDkonVzB4YSTOZ8tuTVo/7Uu/AeW1cL2Qb/at3DSoV8wwyFXQCw==", "dev": true }, "localtunnel": { @@ -5287,15 +4967,6 @@ "yargs": "17.1.1" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -5307,21 +4978,6 @@ "wrap-ansi": "^7.0.0" } }, - "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==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "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==", - "dev": true - }, "debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", @@ -5331,23 +4987,6 @@ "ms": "2.1.2" } }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, "yargs": { "version": "17.1.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", @@ -5371,15 +5010,6 @@ } } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -5395,7 +5025,7 @@ "lodash.isfinite": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", + "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", "dev": true }, "lru-cache": { @@ -5409,16 +5039,15 @@ } }, "luxon": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.3.0.tgz", - "integrity": "sha512-gv6jZCV+gGIrVKhO90yrsn8qXPKD8HYZJtrUDSfEbow8Tkw84T9OnCyJhWvnJIaIF/tBuiAjZuQHUt1LddX2mg==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.5.2.tgz", + "integrity": "sha512-Yg7/RDp4nedqmLgyH0LwgGRvMEKVzKbUdkBYyCosbHgJ+kaOUx0qzSiSatVc3DFygnirTPYnMM2P5dg2uH1WvA==", "dev": true }, "markdown-it": { "version": "12.3.2", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "dev": true, "requires": { "argparse": "^2.0.1", "entities": "~2.1.0", @@ -5430,15 +5059,36 @@ "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" } } }, + "markdown-it-anchor": { + "version": "8.6.6", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.6.tgz", + "integrity": "sha512-jRW30YGywD2ESXDc+l17AiritL0uVaSnWsb26f+68qaW9zgbIIr1f4v2Nsvc0+s0Z2N3uX6t/yAw7BwCQ1wMsA==", + "requires": {} + }, + "markdown-it-emoji": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz", + "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==" + }, + "markdown-it-include": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-include/-/markdown-it-include-2.0.0.tgz", + "integrity": "sha512-wfgIX92ZEYahYWiCk6Jx36XmHvAimeHN420csOWgfyZjpf171Y0xREqZWcm/Rwjzyd0RLYryY+cbNmrkYW2MDw==", + "requires": {} + }, + "markdown-it-table-of-contents": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/markdown-it-table-of-contents/-/markdown-it-table-of-contents-0.6.0.tgz", + "integrity": "sha512-jHvEjZVEibyW97zEYg19mZCIXO16lHbvRaPDkEuOfMPBmzlI7cYczMZLMfUvwkhdOVQpIxu3gx6mgaw46KsNsQ==" + }, "maximatch": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/maximatch/-/maximatch-0.1.0.tgz", - "integrity": "sha1-hs2NawTJ8wfAWmuUGZBtA2D7E6I=", + "integrity": "sha512-9ORVtDUFk4u/NFfo0vG/ND/z7UQCVZBL539YW0+U1I7H1BkZwizcPx5foFv7LCPcBnm2U6RjFnQOsIvN4/Vm2A==", "dev": true, "requires": { "array-differ": "^1.0.0", @@ -5450,13 +5100,13 @@ "array-differ": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", "dev": true }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "dev": true, "requires": { "array-uniq": "^1.0.1" @@ -5465,7 +5115,7 @@ "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true } } @@ -5473,8 +5123,7 @@ "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", - "dev": true + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" }, "merge2": { "version": "1.4.1", @@ -5499,33 +5148,33 @@ "dev": true }, "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true }, "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "requires": { - "mime-db": "1.51.0" + "mime-db": "1.52.0" } }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", "dev": true }, "mitt": { @@ -5535,12 +5184,12 @@ "dev": true }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "moo": { @@ -5575,9 +5224,9 @@ "dev": true }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true }, "neo-async": { @@ -5618,6 +5267,12 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true + }, "on-change": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/on-change/-/on-change-4.0.1.tgz", @@ -5626,7 +5281,7 @@ "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "dev": true, "requires": { "ee-first": "1.1.1" @@ -5644,7 +5299,7 @@ "openurl": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", - "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", + "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", "dev": true }, "opn": { @@ -5656,64 +5311,22 @@ "is-wsl": "^1.1.0" } }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", - "dev": true - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", - "dev": true - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { @@ -5723,9 +5336,9 @@ "dev": true }, "path-to-regexp": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", - "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", "dev": true }, "picomatch": { @@ -5737,24 +5350,9 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, "please-upgrade-node": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", @@ -5765,20 +5363,23 @@ } }, "portscanner": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", - "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", + "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", "dev": true, "requires": { - "async": "1.5.2", + "async": "^2.6.0", "is-number-like": "^1.0.3" }, "dependencies": { "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } } } }, @@ -5811,7 +5412,7 @@ "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true }, "pseudomap": { @@ -5945,10 +5546,13 @@ "dev": true }, "qs": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", - "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", - "dev": true + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } }, "queue-microtask": { "version": "1.2.3", @@ -5963,13 +5567,13 @@ "dev": true }, "raw-body": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", - "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, "requires": { - "bytes": "3.1.1", - "http-errors": "1.8.1", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } @@ -5984,12 +5588,11 @@ } }, "recursive-copy": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/recursive-copy/-/recursive-copy-2.0.13.tgz", - "integrity": "sha512-BjmE6R/dOImStEku+017L3Z0I6u/lA+SVr1sySWbTLjmQKDTESNmJ9WBZP8wbN5FuvqNvSYvRKA/IKQhAjqnpQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/recursive-copy/-/recursive-copy-2.0.14.tgz", + "integrity": "sha512-K8WNY8f8naTpfbA+RaXmkaQuD1IeW9EgNEfyGxSqqTQukpVtoOKros9jUqbpEsSw59YOmpd8nCBgtqJZy5nvog==", "dev": true, "requires": { - "del": "^2.2.0", "errno": "^0.1.2", "graceful-fs": "^4.1.4", "junk": "^1.0.1", @@ -5997,25 +5600,20 @@ "mkdirp": "^0.5.1", "pify": "^2.3.0", "promise": "^7.0.1", + "rimraf": "^2.7.1", "slash": "^1.0.0" } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, "resolve": { @@ -6032,7 +5630,7 @@ "resp-modifier": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", - "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", + "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", "dev": true, "requires": { "debug": "^2.2.0", @@ -6051,7 +5649,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -6083,7 +5681,7 @@ "rx": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==", "dev": true }, "rxjs": { @@ -6112,9 +5710,9 @@ } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -6173,10 +5771,16 @@ "ms": "2.0.0" } }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, "requires": { "depd": "~1.1.2", @@ -6188,13 +5792,13 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "dev": true }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "setprototypeof": { @@ -6214,7 +5818,7 @@ "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, "requires": { "accepts": "~1.3.4", @@ -6235,10 +5839,16 @@ "ms": "2.0.0" } }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, "requires": { "depd": "~1.1.2", @@ -6250,13 +5860,13 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "dev": true }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "setprototypeof": { @@ -6268,7 +5878,7 @@ "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true } } @@ -6288,13 +5898,7 @@ "server-destroy": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", "dev": true }, "setprototypeof": { @@ -6303,6 +5907,32 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "sigmund": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", @@ -6312,7 +5942,7 @@ "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", "dev": true }, "slugify": { @@ -6322,109 +5952,45 @@ "dev": true }, "socket.io": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.0.tgz", - "integrity": "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz", + "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==", "dev": true, "requires": { - "debug": "~4.1.0", - "engine.io": "~3.5.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.4.0", - "socket.io-parser": "~3.4.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.2.1", + "socket.io-adapter": "~2.4.0", + "socket.io-parser": "~4.2.1" } }, "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", "dev": true }, "socket.io-client": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", - "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.4.tgz", + "integrity": "sha512-ZpKteoA06RzkD32IbqILZ+Cnst4xewU7ZYK12aS1mzHftFFjpoMz69IuhP/nL25pJfao/amoPI527KnuhFm01g==", "dev": true, "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.5.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "socket.io-parser": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", - "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" - } - } + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.2.3", + "socket.io-parser": "~4.2.1" } }, "socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", + "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", "dev": true, "requires": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" } }, "source-map": { @@ -6442,13 +6008,13 @@ "statuses": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", "dev": true }, "stream-throttle": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", - "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", "dev": true, "requires": { "commander": "^2.2.0", @@ -6490,12 +6056,12 @@ "dev": true }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } }, "supports-preserve-symlinks-flag": { @@ -6507,7 +6073,7 @@ "symbol-observable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==", "dev": true }, "tfunk": { @@ -6523,19 +6089,19 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, "requires": { "ansi-styles": "^2.2.1", @@ -6548,13 +6114,13 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -6563,17 +6129,11 @@ "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true } } }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -6601,6 +6161,12 @@ "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=", "dev": true }, + "typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true + }, "ua-parser-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz", @@ -6610,8 +6176,7 @@ "uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, "uglify-js": { "version": "3.15.0", @@ -6629,13 +6194,19 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, "void-elements": { @@ -6644,11 +6215,14 @@ "integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=", "dev": true }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } }, "with": { "version": "7.0.2", @@ -6669,40 +6243,14 @@ "dev": true }, "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "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==", - "dev": true - } } }, "wrappy": { @@ -6712,22 +6260,22 @@ "dev": true }, "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "dev": true, "requires": {} }, "xmlhttprequest-ssl": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", - "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", "dev": true }, "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yallist": { @@ -6737,38 +6285,24 @@ "dev": true }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true } } diff --git a/package.json b/package.json index 3456095..5be6b76 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,8 @@ "doc": "docs" }, "scripts": { - "start": "eleventy --serve", - "build": "eleventy", + "start": "./sort_md_files.sh && eleventy --serve", + "build": "./sort_md_files.sh && eleventy", "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { @@ -23,9 +23,14 @@ }, "homepage": "https://github.com/PLsergent/plsergent.github.io#readme", "devDependencies": { - "@11ty/eleventy": "^1.0.0" + "@11ty/eleventy": "^1.0.2" }, "dependencies": { - "@splinetool/runtime": "^0.9.130" + "@splinetool/runtime": "^0.9.130", + "eleventy": "^1.0.6", + "markdown-it-anchor": "^8.6.6", + "markdown-it-emoji": "^2.0.2", + "markdown-it-include": "^2.0.0", + "markdown-it-table-of-contents": "^0.6.0" } } diff --git a/public/blog/_include-posts/keyboard-guide/tosort_general-voc/index.html b/public/blog/_include-posts/keyboard-guide/tosort_general-voc/index.html new file mode 100644 index 0000000..6a41938 --- /dev/null +++ b/public/blog/_include-posts/keyboard-guide/tosort_general-voc/index.html @@ -0,0 +1,12 @@ + diff --git a/public/blog/_include-posts/keyboard-guide/tosort_keyboard-voc/index.html b/public/blog/_include-posts/keyboard-guide/tosort_keyboard-voc/index.html new file mode 100644 index 0000000..f07e1a1 --- /dev/null +++ b/public/blog/_include-posts/keyboard-guide/tosort_keyboard-voc/index.html @@ -0,0 +1,19 @@ + diff --git a/public/blog/_include-posts/keyboard-guide/tosort_keycaps-voc/index.html b/public/blog/_include-posts/keyboard-guide/tosort_keycaps-voc/index.html new file mode 100644 index 0000000..3e43727 --- /dev/null +++ b/public/blog/_include-posts/keyboard-guide/tosort_keycaps-voc/index.html @@ -0,0 +1,11 @@ + diff --git a/public/blog/_include-posts/keyboard-guide/tosort_switches-voc/index.html b/public/blog/_include-posts/keyboard-guide/tosort_switches-voc/index.html new file mode 100644 index 0000000..0bb05fb --- /dev/null +++ b/public/blog/_include-posts/keyboard-guide/tosort_switches-voc/index.html @@ -0,0 +1,20 @@ + diff --git a/public/blog/index.html b/public/blog/index.html index de3b9af..750578f 100644 --- a/public/blog/index.html +++ b/public/blog/index.html @@ -124,6 +124,17 @@
My journey as a developer
+
+
+ ... +
+
Mechanical keyboard guide
+

Get started with custom mechanical keyboards

+ Read +
+
+
+ diff --git a/public/blog/posts/01-my-journey/index.html b/public/blog/posts/01-my-journey/index.html index 6070bdf..2a6a54a 100644 --- a/public/blog/posts/01-my-journey/index.html +++ b/public/blog/posts/01-my-journey/index.html @@ -100,6 +100,11 @@
+ + + @@ -116,7 +121,7 @@
-

My journey as a developer

+

My journey as a developer

Why did I choose computer science?

@@ -127,8 +132,15 @@
Why did I choose computer science?
...
+ Back to blog + + + + Next post + -

My journey as a developer

+ +

My journey as a developer 🔗

Since my young age I've been interested in computer science stuff, science and anything that had to do with creating. I did a lot of Lego for instance.

I was around 13 years old when I first ask my father about programming. Back then I simply copied and pasted code in Visual Basic to create for example a breakout game. This interest also came from the fact that I was playing a lot of video games at the time.

Later on, I paid less attention to computer science to focus more on video making. Could be about video games, but I was also making videos relating school trips. I keep a very good memory of those moments because I got to present my work in front of all the parents and students.

@@ -148,6 +160,10 @@

My journey as a developer

Back to blog + + Next post + +
diff --git a/public/blog/posts/02-keyboard-guide/index.html b/public/blog/posts/02-keyboard-guide/index.html new file mode 100644 index 0000000..06c6df0 --- /dev/null +++ b/public/blog/posts/02-keyboard-guide/index.html @@ -0,0 +1,646 @@ + + + + + + PL Sergent | Mechanical keyboard guide + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + + + + + + +
+ + + +
+
+

Mechanical keyboard guide

+
Get started with custom mechanical keyboards
+
+
+
+
+
+
+
+ ... +
+ Back to blog + + + Previous post + + + + +

Mechanical keyboard guide 🔗

+

+
+

❔Why? 🔗

+

Mechanical keyboards have been around for a while now. Starting from the 80s, with a famous keyboard: the IBM model M.

+ibm-model-m +

IBM model M

+

Even today people are nostalgic about this keyboard and still use it: Why I use a 20-year-old IBM Model M keyboard, but why?

+

The main reason is the feel of the keyboard. Mechanical keyboards are more tactile and more responsive than membrane keyboards. The keys are more solid and more durable. The sound is also different, it's more clicky and loud.

+

Nowadays, mechanical keyboards are also widespread but mainly in the gaming community. And if you don't like flashy RGB, with questionable design choices, it's hard to see yourself using a mechanical keyboard, especially if you're not a gamer. That's why most people won't pay attention to mechanical keyboards and prefer to use membrane/butterfly keyboards, also because they don't care about having a great keyboard right? But those who are using their keyboards daily don't know what they're missing, because having a mechanical keyboard with a nice design is possible.

+

I got into this hobby about 3 years ago, when I was stuck between having to use a membrane Dell keyboard and a flashy and loud gamer mechanical keyboard. I was looking for something in between, and I found it.

+
+

TLDR; 🏷️ If you are stuck between a membrane keyboard and a gamer mechanical keyboard, you should consider a custom mechanical keyboard especially if you use a keyboard daily. I'll list the reasons below.

+
+

🔝The design 🔗

+

Designs of custom mechanical keyboards (keebs) are wide and varied. As the name suggests you can do anything you want, find your style, and make it your own. But if you search online, you'll find out that most custom keebs are very neat and clean. The aesthetic is very important for the community, and it's a big part of the hobby. You can find a lot of inspiration on r/mechanicalkeyboards.

+

That's one of the things that inspired me, I felt like the keebs were fitting my style more than the gamer ones without being a membrane cheap keyboard. It becomes more than just a keyboard, it's a piece of art.

+ibm-model-m +

Tofu60 2.0 - KBDfans

+
+

TLDR; 🏷️ Keebs are beautiful, elegant and clean. They are a piece of art, and they can fit your style.

+
+

🔝The feel 🔗

+

The feel of a custom mechanical keyboard is very different from a membrane or laptop keyboard. Most people prefer when the keys are low profile, but the feeling you get from a good keeb is unmatched.

+

The main reason is that you're getting a more pronounced tactile feedback. This has been made possible by the switches. They give a less mushy feel, every keypress can be clearly felt, making them perfect for precise and accurate typing. It's also more satisfying to type on.

+

Cherry is one of the pioneers in the domain. If you want to know more about the history of switches you can read this article and this article. Cherry designed his first switch in the '60s and received a patent in 1974. The first Cherry MX switch was released in 1984. The MX switch is still used today, and it's the most popular switch in the mechanical keyboard community.

+cherry-mx-switches +tangerine-switches +oil_king-switches +nk_cream-switches +

Cherry MX switch - brown / C³Equalz X TKC Tangerine Switches / Gateron Oil King / NovelKey Cream

+
+

TLDR; 🏷️ The feel of a keeb is very different from a membrane or laptop keyboard. It's more tactile and responsive, and it's perfect for precise and accurate typing. It's also more satisfying to type on, thanks to the switches.

+
+

🔝The sound 🔗

+

The sound of a keeb is what stands out the most in my opinion. It's louder than a membrane/butterfly keyboard, but it's not as loud as a gamer mechanical keyboard. It's also a more precise and satisfying sound, without the plastic feels that other keyboards can have.

+

You can customize the sound by choosing the switches, adding foam dampeners, o-rings, keycaps, etc. You can also lube the switches, we'll talk about that later.

+

You can be team thocky, team clacky, or team clicky. It's all about personal preference, and you can find the sound that satisfies you the most.

+

In the first video below, you can see an example of a great keeb sound. The second video helps us remind that a keyboard sound depends on a lot of factors: the table, the deskmat, the microphone, etc...

+ + +
+

TLDR; 🏷️ The sound of a keeb is very satisfying, and you can customize it by choosing the switches, adding foam dampeners, o-rings, keycaps, etc.

+
+

🔝The customization 🔗

+

This is the main reason most people could get into this hobby, or even make just one keeb. You can customize everything. You can choose the switches, the keycaps, the cable, the plate, the case, the PCB, the stabilizers, the dampeners, the LEDs, the lube, etc. Most of the time a keyboard kit will come with the essential parts (PCB, plate, case).

+

You can create something unique in terms of design, sound, feel, and even weight. You can also choose the layout (more on that later), and add layers. You can also program macros and remap keys (using VIA or QMK configurator).

+

This ability to customize everything is what makes the hobby so interesting and addicting. You can create something unique that fits your style and needs. But it can also be overwhelming, with a lot of options and a lot of things to learn.

+
+

This is why I'm writing this guide, to help you get started.

+
+

🔜Where to start? 🔗

+

Learn the basics - keyboard university 🔗

+

While I was writing this guide I came across this awesome website keyboard university. It's a great resource for beginners, and it's a great place to start. I'll try to cover the most important things in this guide, but I highly recommend you check out the website. (Brought to you by thekey.company)

+

Gather information 🔗

+

The first crucial step of your journey to become a keeb enthusiast (or if you want to build just one keyboard) is to gather information by scrolling through social media, forums, videos, vendors' websites, etc. One of the great resources is the r/mechanicalkeyboards subreddit.

+

I'll list some of the resources in other sections of this guide:

+ +

You can also go on the forum geekhack. It's a great resource, but it can be overwhelming at first.

+

Master the vocabulary 🔗

+

The keeb community has its vocabulary. You'll need to learn it to understand what people are talking about. Here are some of the most important terms:

+

About keyboard itself

+
    +
  • Case - the part of the keyboard that holds the plate and the PCB.
  • +
  • Dampeners - the part of the keyboard that reduces the sound of the switches. They can be foam, o-rings, or springs.
  • +
  • Firmware - the software that runs on the keyboard. It's usually open source, and you can customize it (most of the time it's gonna be QMK).
  • +
  • Gasket mount - a way to mount the PCB to the case. It's usually done with rubber gaskets.
  • +
  • Holy mods - modding to make the stabilizers sound better using a bandaid and placing it inside the stem of the stabilizer. Youtube video
  • +
  • Hotswap PCB - PCB that allows you to mount switches without soldering.
  • +
  • Keycaps - the part of the keyboard that you press. They come in different shapes, sizes, and colors.
  • +
  • LEDs - the part of the keyboard that lights up the keycaps. They can be RGB, single color, or even no LEDs.
  • +
  • Layout - literally the layout of the keyboard. It can be 60%, 65%, 75%, 80%, 90%, 100%, TKL, 1800, 1900, etc. (more on that later), there is also a distinction between ANSI and ISO layouts (french people, drop the ISO and the AZERTY, trust me, you can still type in AZERTY on QWERTY keycaps).
  • +
  • Mounting style - how the plate or PCB is secured in the keyboard housing. (more on that here: keyboard-university)
  • +
  • PCB - the part of the keyboard that holds the switches and the diodes. It's also where the microcontroller is.
  • +
  • Plate - the part of the keyboard that holds the switches and the keycaps. It can be made of different materials (aluminum, FR4, polycarbonate, etc.)
  • +
  • Sockets - the part of the PCB that allows you to mount the switches without soldering (hotswap).
  • +
  • Solder PCB - PCB that requires you to solder the switches to the PCB. Then, you can't remove the switches (unless you desolder them). They usually give more options for the layout.
  • +
  • Stabilizers - the part of the keyboard that holds the keycaps in place. They are used for the spacebar, the shift keys and the enter.
  • +
  • Switches - the part of the keyboard that registers the keypresses. There are a lot of different types of switches, and they all have different characteristics.
  • +
  • Weight - the part of the keyboard that goes underneath the case.
  • +
+ansi_vs_iso +

ANSI vs ISO layouts

+
+

About the switches

+
    +
  • Actuation force - the force needed to press the switch to register the key press.
  • +
  • Actuation - the distance you need to press the switch to register the key press.
  • +
  • Bottom housing - the part of the switch that goes on the bottom.
  • +
  • Bottoming out - the distance you need to press the switch to bottom out.
  • +
  • Bump - the switch that has a bump. It can be tactile or clicky, linear switches don't have a bump.
  • +
  • Clacky - the switch that has a clacky sound (the sound also depends on other factors).
  • +
  • Clicky - the switch that has a tactile bump and a clicky sound. (ex: Gateron Blue)
  • +
  • Filming - the process of applying a film to the switch. It goes between the top and bottom housing. It helps reduce unwanted noise from the switch.
  • +
  • Linear - the switch that has a smooth and linear feel. (ex: Gateron Yellow)
  • +
  • Lube - the substance that is applied to the switch to make it feel and sound better.
  • +
  • Lubing - the process of applying lube to the switch.
  • +
  • Posttravel - the distance you need to press the switch after it registers the keypress.
  • +
  • Pretravel - the distance you need to press the switch before it registers the keypress.
  • +
  • Spring - the part of the switch that determines the force needed to press the switch. Placed between the stem and the bottom housing.
  • +
  • Stem - the part of the switch that goes between the top and bottom housing, and the spring.
  • +
  • Tactile - the switch that has a tactile bump. (ex: Gateron Brown)
  • +
  • Thocky - the switch that has a thocky sound (the sound also depends on other factors).
  • +
  • Top housing - the part of the switch that goes on top.
  • +
+switch_schema +

Switch schema - from keyboard university

+
+

About the keycaps

+
    +
  • ABS - the keycap that has an ABS material.
  • +
  • Double shot - the keycap that has been shot twice, once for the legends and once for the color. Usually means that it's better quality, for both the durability and the legends.
  • +
  • Dye sub - the process of printing the legends on the keycap. There are a lot of different methods, the most common one is dye sublimation.
  • +
  • GMK - is a very famous keycaps manufacturer. They have a lot of different keycap sets, and they are known for their high quality. But usually, you have to wait a lot of time to get your hands on them.
  • +
  • Keycap set - the set of keycaps that have the same color (actually depends but you got it), material, and profile.
  • +
  • Keycap width - the width of the keycap expressed in a unit U, which represents the width of a standard alpha keycap (keycap with a letter on it).
  • +
  • Material - the material of the keycap. There are a lot of different materials, the most common one is PBT.
  • +
  • PBT - the keycap that has a PBT material.
  • +
  • Profile - the shape of the keycap. There are a lot of different profiles, the most common one is the cherry profile. Pretty much all the keycaps can fit on a standard switch (with the cherry specification).
  • +
+switch_schema +

Keycaps sizes

+
+

About the hobby in general

+
    +
  • Deskmat - a mat that goes on your desk. Can be used for design, comfort, or sound purposes.
  • +
  • Foam - a material that is used to dampen the sound of the keyboard. Usually, it's used on the bottom of the keyboard.
  • +
  • Group buy - process to buy keebs related products where you pay upfront, and then the manufacturer will produce the product. Usually, you have to wait a lot of time, around 6 months to 1 year (sometimes up to 2 years for GMK sets). This is probably the most important thing you need to know about the hobby. If you want high-end/interesting products you'll have to do group buys. You can always buy cheaper things that are in stock, but you'll miss out on a lot of cool stuff (although buying an affordable in-stock keyboard can be a good idea at first to learn about the building mechanism and not all in-stock keebs are bad of course).
  • +
  • Interest check - a poll to see if there is enough interest in a product. Usually, it's used before a group buy to see if it is worth starting it. Watching for interest checks is a good way to know what products are coming out soon, and you can also support people that are trying to launch their products. You can find interest checks on geekhack and on Reddit r/mechanicalkeyboards.
  • +
  • Keeb enthusiast - a person who is passionate about keyboards.
  • +
  • Keeb - a keyboard.
  • +
  • Modding - action to modify a keyboard to make it better in terms of sound, feel, or aesthetics.
  • +
  • QMK - firmware that allows you to customize your keyboard. You can find it in most of the keyboards you'll find in the hobby. You can customize the firmware on tools like QMK Configurator or VIA. For beginners, I recommend using VIA, it's easier to use.
  • +
  • Sound test - a video that shows the sound of a keyboard. Usually, it's just a video of someone typing showcasing the result that he achieved.
  • +
  • VIA - free software that allows you to customize your keyboard. You can remap the keys directly on the firmware, meaning if you take your keyboard to another computer the changes will remain.
  • +
+
+

TLDR; 🏷️ You don't have to know everything, especially if you're looking to build just one keyboard. Just remember that the most beautiful keyboards that you can find will require that you participate in group buys. +Links of the section:

+ +
+

🦴Keyboard anatomy 🔗

+keyboard_parts +

Keyboard parts - Glorious

+
    +
  • Case - the shell of the keyboard, it can be made of plastic, aluminum, wood, polycarbonate, etc.
  • +
  • Plate - the plate is the part that holds the switches in place. Different types: aluminum, POM, FR4, carbon fiber, etc.
  • +
  • PCB - the PCB is the brain of the keyboard. It's the part that you plug into your computer. It can be hot-swappable or soldered.
  • +
  • Switches - the switches are the part that you press to type.
  • +
  • Keycaps - the keycaps are the part that you see and touch. They are made of ABS or PBT.
  • +
  • Stabilizers - the stabilizers are the parts that stabilize the longer keys (spacebar, enter, shift, etc.).
  • +
  • Foam - the foam is used to dampen the sound of the keyboard. There is foam for the plate, the PCB or the bottom case.
  • +
+

💰What to buy? 🔗

+

You're ready to buy your first keyboard? Good! But first, you need to know what you want. There are a lot of options out there and you need to know what you're aiming for. Here are some questions that you need to ask yourself:

+ +

I'll try to answer these questions in the following sections. But again, you'll have to do your research.

+

Budget 🔗

+

There is a large scale of prices for keyboards. Of course, if you want to get into the hobby and get a real custom keyboard there is some cost involved outside of the keyboard itself. You'll need to buy switches, keycaps, cables, tools, etc. But you can also get a good keyboard for a reasonable price (reasonable being a relative term).

+

Tools ~= 20€ to 75€ - Tools

+

Switches ~= 30€ to 70€ - Switches, also depend on the size of the board you want to build (60%, 65%, 75%, 80%, 90%, 100%)

+

Keycaps ~= 20€ to 150€ - Keycaps, hopefully, there are a lot of options around 50 to 100€, this is the range I would recommend since below 50€ the quality is usually pretty poor.

+

Extras ~= 0€ to 100€ - You can also get some fancy deskmats or other accessories. I would recommend getting a decent cable (25€) but you can also use the USB-C cable that you have at home (pretty much all wired keyboards are gonna use USBC).

+

Keyboard itself ~= 50€ to ♾️ - Usually includes the case, plate, PCB, stabilizers and foam pads, excluding switches, keycaps, cables, and tools. Different ranges are described below.

+
+

50€ to 150€ - Beginner/first keyboard, usually poor to okay quality

+

That's a dangerous price range because you can find decent boards but also pretty bad things. A lot of the time the keebs will be prebuilt (meaning no need to buy other parts). Those keyboards are mainly built of plastic. But there is some well know brand like Keychron that offers some decent boards at this price range. If you go for that I would highly recommend that you still open up the board to perform some modding.

+

There are still some options available on Aliexpress (rg61, tm680, Epomaker, bm65rgb, etc) that I don't particularly recommend.

+

As well as other vendors, here is a quick list of some options: Anne pro 2, Ducky, Varmilo, Leopold, D60Lite 👍, etc.

+

This price range is the one I would recommend for a first keyboard or if you're a beginner in the hobby.

+

TLDR; 🏷️ Good for beginners. You can get a decent keyboard for a reasonable price. But you'll need to do some research.

+
+
+
+

150€ to 350€ - Intermediate/advanced, can't go wrong here

+

You got your first custom keeb but now you want to go further (or maybe you're just rich)? Okay, this price range is perfect for intermediate/advanced keebs. Most of the well-known group buys will be in this range (QK, Zoom65, Tofu, KBD67, Modekeyboards, etc).

+

You'll be able to find a lot of options with high quality overall and interesting designs. The board will be made of aluminum, brass or polycarbonate. It will last longer, be more durable and most importantly, it will look better and cleaner. For instance, white plastic tends to become yellowish over time, but aluminum will stay white.

+

This price range is where you'll find most of the interesting boards on the market. Keep in mind that it's going to require you to join group buys and wait for the board to be produced. But it's worth it.

+

This might sound like a lot of money but if we compare it to gaming keyboards, some of them can cost up to 300€. In my opinion, a custom keyboard is a lot more interesting, beautiful, and high-standard, you can get a lot more out of it.

+

TLDR; 🏷️ Good for intermediate/advanced users. High standard, and beautiful boards. A lot of options. But you'll need to join group buys.

+
+
+
+

350€ to ♾️ - Veteran, to the moon, you can get anything

+

At this point, you either have a lot of money or you're a veteran in the hobby. For this price point, you can get pretty much anything you want. Crazy design, advanced features, and very high-quality/design.

+

Is it worth it to spend that much money on a keyboard? Probably not. But as with all hobbies, it's a matter of taste and what you want to do. If you want to get into the hobby and you're willing to spend that much money, go for it. But if you're just looking for a keyboard, you can get a lot of good options for a lot less.

+

At this point, you want to push the customization to the max and have a really unique board.

+

TLDR; 🏷️ Good for veterans. Crazy design, advanced features, and very high-quality/design. But probably not worth it, unless you fell in love with a specific board.

+
+

Wait time 🔗

+

Depending on the type of purchase you're doing you might experience some noticeable wait time. Here is a quick list of the different types of purchases and their wait time.

+

Groups buys 🔗

+

This is the most common way to get interesting stuff in the hobby. Group buys usually last a week or two, and at the end of this period, the vendor will pass the order to the manufacturer. The manufacturer will then produce the boards and send them to the vendor. The vendor will then ship the items to the customers. This process can take at least 4-5 months, sometimes up to a year or two. Note that the vendors in your region are not the ones who designed the items, they are just the middleman between you and the manufacturer.

+

Recap of the process (from the customer's perspective):

+
    +
  • Interest check [IC]: the designer of the items (board, keycaps, desk mat, etc) will post a thread on Reddit or other platforms to see if there is enough interest in the product. If there is enough interest, the designer will move on to the next step.
  • +
  • Group buy [GB]: the designer will contact vendors in various regions (note that each region has its own vendors) and will ask them to host the group buy. The vendors will then post the group buy on their websites and start collecting orders. The group buy will last a week or two, and at the end of this period, if there are enough orders, the vendor will pass the order to the manufacturer, otherwise, the group buy will be canceled and the vendor will refund the customers.
  • +
  • Waiting time: the manufacturer gets the orders and produces the number of boards that are needed. The manufacturer will then send the boards to the vendors (usually by boat). This process can take at least 4-5 months, sometimes up to a year or two.
  • +
  • Shipping: the vendor will ship the boards to the customers. This process can take a few days to a few weeks depending on the region.
  • +
+

As you can see the waiting time can be quite long. You need to know what you're getting yourself into because you're committing to a long-term project. What I recommend is that if you see a board that you are really interested in, you should join the group buy and in the meanwhile you can still order other boards that are in stock.

+geekhack +

You can find all the information about IC and incoming GB on geekhack

+

Pre-order 🔗

+

This is a bit different from group buys since this time the vendor will start manufacturing the boards independently from the number of orders. You're paying for a product that is not available yet but the production might already have started. Items that are in pre-order will be in-stock if the number of pre-orders did not exceed the expected stock. Meaning that in this scenario the vendor takes the risk of having too many boards. Usually, the vendor will give you a discount if you pre-order the item.

+

The waiting time in this case will vary depending on the progress of the production, the region, the shipping method, etc. But it will be much shorter than group buys. Still, count at least a few months.

+

In stock 🔗

+

If think you know where it's about to go. In-stock items are ready to be shipped. You can get them right away, although if you're ordering products from a different continent you might have to wait a few weeks.

+

Layout 🔗

+

When we talk about layouts it actually refers to two things: the size of the keyboard and the positioning of the keys.

+

The size of the keyboard is measured in percentage. The most common sizes are 60%, 65%, 75%, and 100%.

+

For the positioning of the keys, there are two main layouts: ANSI and ISO.

+

ANSI vs ISO 🔗

+

ANSI and ISO are abbreviations for two global standardization organizations - American National Standards Institute and International Organization for Standardization, respectively. These acronyms refer to keyboard layouts that specify the location and size of keys, distinct from logical layouts like QWERTY, Dvorak, Colemak, etc. ANSI and ISO keyboards vary in the arrangement of the Enter, Backslash, and Left Shift keys.

+ansi_vs_iso +

ANSI vs ISO layouts

+

In the hobby, you'll generally find ANSI layouts. ISO layouts are also not uncommon, but most of the time you'll have to use solder PCBs. Why's that? Because, since the ANSI layout is more common, the PCB is mostly designed for it. Also since hotswap PCBs use sockets they are less permissive because you have less space on the PCB. Where soldering PCBs only require holes (and no sockets), this way you can have multiple layouts on the same PCB. This also works for other particular layouts with split backspace, split left shift, etc.

+

My recommendation is to go for an ANSI layout if you're a beginner. Even if you're used to the ISO layout, the transition is easy and you'll have more options for the PCBs (and for the boards), and later for the keycaps.

+
+

TLDR; 🏷️ ANSI layout = US. ISO layout = EU. Go for ANSI if you're a beginner, you'll have more options for everything.

+
+layouts +

Some sizes of keyboards (YouTube video of Hardware Canucks)

+

Now we'll be talking about the size of the keyboard. Note that sometimes the size can affect the layout.

+

65% - 75% 🔗

+

65% and 75% keyboards are in the most common sizes you'll find (maybe with 60%). They are also the sizes I recommend if you're a beginner. They are compact but you'll have everything you need without making compromises.

+
    +
  • 65%: you get rid of the F-row (F1-F12) and the numpad. The arrow keys are integrated under the right shift key. This layout is the most common in the hobby and the perfect compromise between compactness and functionality.
  • +
  • 75%: you get rid of the numpad but you keep the F-row. The arrow keys are integrated under the right shift key. This layout is also very common and it's perfect if you want to keep the F-row. Although, the keyboard will be bigger of course.
  • +
+layouts +layouts +

65% and 75% layouts

+

60% - 40% 🔗

+

Although the 60% gained a lot of popularity in the last years, 60% and 40% keyboards are not as common as the 65% and 75%. Unlike the previous sizes, you'll have to make some compromises. They are both still usable but it's not for everyone.

+
    +
  • 60%: you get rid of the F-row (F1-F12), the numpad and the arrow keys. Although there are some compromises to make with this size, this is personally my favorite one in terms of design. You can find below different layouts for the 60% (I love the HHKB layout).
  • +
+layouts +

From Top to bottom: WK, WKL, HHKB +
+

+
    +
  • 40%: you get rid of the F-row (F1-F12), the numpad, the arrow keys and number row. This is one of the smallest size you can get. This size is also prone to ortholinear layouts. While being very small it is very practical to carry around.
  • +
+layouts +layouts +

40% layout

+

TKL - 100% 🔗

+

TKL and 100% keyboards are the biggest sizes you can get. They are not as common in the hobby but are pretty well known by the public since it's the original keyboard size. They are not as compact as the previous sizes but they are more functional.

+
    +
  • +

    TKL: you get rid of the numpad. Pretty much the same as the 75% but bigger.

    +
  • +
  • +

    100%: you get rid of nothing. This is the original keyboard size. You have everything you need and more. This is the most functional size you can get. Although, it's not as compact as the previous sizes. This size can also be found in the **1800 layout, which is a more compact alternative.

    +
  • +
+layouts +layouts +

1800 and TKL layouts

+

Alice - HHKB - Planck - Split 🔗

+

You can find other crazy layouts out there. They are pretty niche and not for everyone. I won't go into details for each of them but I'll give you a quick overview.

+
    +
  • Alice: a split keyboard with a curved layout. It's a very ergonomic layout. It's also a very compact layout. It's a very popular layout in the hobby.
  • +
+layouts +

Alice layout

+
    +
  • HHKB: Happy Hacking Keyboard, is a 60% layout with a split backspace and a split right shift.
  • +
+layouts +

HHKB layout

+
    +
  • Planck: a 40% layout with a ortholinear layout. It's a very compact layout.
  • +
+layouts +

Planck layout

+
    +
  • Split: a split keyboard. It's a very ergonomic layout for typing, you can find it in different shapes and sizes.
  • +
+layouts +

Split layout

+
+

TLDR; 🏷️ I would recommend starting with something like a 65% or 75% keyboard. They are pretty common and functional. It will leave you more options later to choose the keycaps.

+
+

Switches 🔗

+

As you understood, the switches are the heart of a mechanical keyboard. They are the ones that will make the difference between a membrane keyboard and a mechanical keyboard. There are a lot of different switches out there. I'll try to explain the main differences between them.

+

Linear - Tactile - Clicky 🔗

+

They are 3 main types of switches out there. They differ by the way they are built, and ultimately by the way they feel.

+switches +switches +

Switch types & stems

+
    +
  • +

    Linear - probably the most common type of switch, the activation is linear as the name suggested, meaning you're not going to experience a bump when pressing the key down. This type is also the most silent one. Widely used for gaming. The corresponding Cherry MX model for linear switches is Red.

    +
  • +
  • +

    Tactile - the activation is tactile, meaning you're going to experience a bump when pressing the key down. The corresponding Cherry MX model for tactile switches is Brown.

    +
  • +
  • +

    Clicky - the activation is clicky, meaning you're going to experience a bump and a click when pressing the key down. The corresponding Cherry MX model for clicky switches is Blue.

    +
  • +
+

Choosing a switch type is very subjective. It's all about personal preference. You can find a lot of switch testers out there to try different switches. You can also find a lot of switch sound tests on YouTube.

+ +

Switch parts 🔗

+

A switch is composed of different parts. The housing, the spring and the stem. The housing is the main part of the switch, it's the part that will be soldered to the PCB. The spring is the part that will give the switch its weight. The stem is the part that will be pressed.

+switches +

From left to right: top housing, stem, spring, bottom housing

+

The stem is the main difference between the different types of switches. The legs of the stem are making a switch linear, tactile or clicky.

+

The spring will change the weight of the switch. The heavier the spring, the harder it will be to press the switch. The lighter the spring, the easier it will be to press the switch. Usually, lighter weight is recommended for gaming, and heavier weight is recommended for typing. But again it's all about personal preference, you have to try it yourself to know what you like.

+

Recommendations 🔗

+

Don't overthink the choice of your switches. You can always try different things before making your choice, and as you're building more and more keyboards you'll be able to get comfortable with some types of switches and with a particular weight.

+

Personally, I use both tactile and linear switches. I think I do prefer the feeling of tactiles to type, but the sound of linears is more pleasant and thocky most of the time. I started with pretty light switches but, as time goes by, I tend to prefer heavier switches. So don't be afraid to try different things!

+

Brands 🔗

+

When you'll begin looking for switches chances are you'll come across the most famous brands being: Cherry, Gateron and Kailh. But don't be afraid to look for other brands that can be sometimes better than traditional ones. Here is some recommendations:

+

Linear

+
    +
  • Gateron milky yellow
  • +
  • Gateron oil king 🔥
  • +
  • Alpacas 🔥
  • +
+

Tactile

+
    +
  • Boba U4T 🔥
  • +
  • Holy pandas 🔥
  • +
  • Durock T1
  • +
+

Clicky

+
    +
  • Idk 🤷‍♂️
  • +
+
+

TLDR; 🏷️ Linear, tactile, clicky. My personal favorites are Boba U4T for tactiles and Alpacas for linears.

+
+

Keycaps 🔗

+

Now the fun part begins!

+keycaps +

Keycaps set

+

Keycaps are the plastic cap that will cover your switches. It will define the look of your keyboard, this is what you should spend the most time on. If you buy on good websites you don't have to worry much about the quality but you should still be careful about the compatibility of the keycaps with your keyboard. That's why I recommend going for 65% ANSI layout for your first keyboard. It's a pretty common layout and you'll have a lot of options for keycaps.

+

Pssst French people out there. Forgot about finding cool AZERTY keycaps, mostly it'll be QWERTY. But don't worry, you can still use the AZERTY layout on your keyboard. It's just a personal recommendation since it'll be a nightmare trying to find something AZERTY and if you do, most of the time, the quality will be poor. Just go for QWERTY if you matter about the aesthetic of your board!

+

Keyboard keycaps anatomy 🔗

+

Another steal from my friends @keyboard.university

+keycap_anatomy +
    +
  • Alphas - the main keys of the keyboard, the letters, numbers and spacebar.
  • +
  • Modifiers - the keys that modify the behavior of the keyboard, like the shift key, control key, tab, etc...
  • +
  • Navigation keys - the keys that are used to navigate through the computer, like the arrow keys, page up, page down, etc...
  • +
  • Function keys - the keys that are used to perform a specific function, like the F1, F2, F3, etc...
  • +
  • Numpad - the keys that are used to type numbers, and an extra enter key.
  • +
+

Material 🔗

+
    +
  • PBT
  • +
  • ABS
  • +
+

The only thing you should know is that PBT is very often a better choice. It's more durable, better quality, and it doesn't shine as much as ABS. But it's also more expensive. So if you're on a budget, ABS "doubleshot" keycaps are still a good choice.

+

Profile 🔗

+keycap_profiles +

Keycaps profiles @autonomous.ai

+

Profile is the shape of the keycaps. As you can see in the image above, the profile will make a keycap longer, shorter, more curved, etc... The shape also varies depending on the row of the keycaps. The row is the horizontal line of the keyboard. For instance, the top row will have higher keycaps with a different inclination than the bottom row.

+

Although there are flat profile keycaps like: DSA, XDA, R3 SA, etc...

+

The most common profile will be the Cherry profile and in my opinion, it's also the best looking one.

+

Size 🔗

+

See #master-the-vocabulary

+

When buying a keyboard you should find a picture of the possible layout of the keyboard. The numbers here represent the size of the keycaps that will fit the board. It's something you should pay attention to. If you want a particular design you'll have to make sure the keycaps set you're getting is compatible with your keyboard.

+tofu60 +

Possible layout of the tofu60 2.0

+

For instance, if I want a layout with a split backspace (so 2x 1u keys instead of the 2u backspace) I'll have to make sure the keycaps set I'm getting has 2x 1u keys for the backspace, with the correct profile and printed with the correct legend.

+

So let's say I want the split backspace. I'm looking at this set I like:

+keycaps_set +

Keycaps set compatibility checks

+

The blue arrow is pointing at the traditional 2u backspace. But you can see that there is a part under for extra keys. You can see on the left that we have the row numbers displayed so we know on which row the keycaps should go.

+

The red arrow points at the keycaps that will fit the split backspace. The 1u | / and the Delete key will go on the first row and the 1.75u Backspace key will go on the second row. So you should have something like this:

+keycaps_set +

Split backspace layout

+

This is an example to show you the work you'll have to do to check if the keycaps set you like will fit your board. But don't worry most of the time the sets will cover a wide variety of layouts, especially for the most common one (like 65%).

+

Brands/manufacturers 🔗

+

Like the boards, the keycaps are designed by independent designers that will follow a norm to fit a specific manufacturer.

+
    +
  • GMK: it's the reference for keycaps, GMK sets are known to be good quality but also to be pretty long to be delivered (for GBs).
  • +
  • ePBT: a lot of the time sponsored by KBDFans, with the PBTFans sets. They are also known to be good quality and cheaper than GMK.
  • +
  • JTK
  • +
  • Domikey
  • +
  • Geekark
  • +
  • Drop: more a reseller than a manufacturer, but they have their own keycaps sets.
  • +
+

Stabilizers 🔗

+

A quick overview of the stabilizers that are also important when buying a keyboard. Most of the time the keyboard kit should come with the stabilizers, but sometimes you'll have to buy them separately.

+

Stabilizers are used for keys that are longer than 2u. They are used to stabilize the keycaps and avoid wobble. They are also used for the spacebar.

+

If bought separately make sure you're getting the correct sizes for the layout you choose (see #size). The most common sizes are 2u, 2.25u, 2.75u, 6.25u and 7u.

+

Some stabilizers will be "clip-in" and some will be "screw-in". The clip-in are easier to install but the screw-in are more stable.

+stabs +

Stabilizers

+

Stabilizers usually require modding to be better. See #modding.

+

This video summarizes different brands of stabilizers:

+ +

PCB 🔗

+

The PCB is the brain of the keyboard. It's the circuit board that will connect the switches to the computer. It's also the part that will control the RGB and the programming of the keyboard.

+

The PCB is also the part that will determine the layout of the keyboard. So if you want a specific layout you'll have to make sure the PCB you're getting is compatible with it. But usually, the PCB is included when buying a keyboard kit, so you don't have to worry about it.

+

There are two types of PCBs:

+
    +
  • +

    Hotswap: you can swap the switches without having to desolder them. It's a good option if you want to try different switches or if you want to change them easily. But it's also a bit more expensive, and doesn't provide as many layout options as the solderable PCBs (due to the usage of sockets).

    +
  • +
  • +

    Solderable: you'll have to solder the switches to the PCB. It's a bit cheaper and you'll have more layout options. But you'll have to desolder the switches if you want to change them. Obviously, you'll need more tools and a bit more work.

    +
  • +
+

How to recognize a hotswap PCB? You'll see sockets on the PCB. On the other hand, a solderable PCB will have holes for the switches pins to go through, like this:

+hotswap_pcb +solderable_pcb +

Hotswap PCB vs Solderable PCB - Parallel keyboard

+

Plate 🔗

+

The plate is the part that will hold the switches in place. This part will have a great impact on the sound of the keyboard and the typing experience.

+plate +plate +

Plate - Parallel keyboard

+

The plate material will have a great impact on the sound of the keyboard. The most common materials are:

+
    +
  • Aluminum: most common material, pretty stiff and heavy.
  • +
  • Carbon fiber: light material.
  • +
  • POM: plastic material, flexible and deeper sound.
  • +
  • FR4: plastic material, middle way between POM and aluminum.
  • +
  • Brass: heavy metallic material.
  • +
  • Polycarbonate: plastic material, similar to POM.
  • +
+

Plastic material plates will tend to be more flexible and have a deeper sound than metallic ones.

+

Like everything else try them to see which one you prefer. See bellow videos to help you decide which one you should go for. I personally enjoy the POM and FR4 plates a lot.

+ + +

Prebuilt vs DIY 🔗

+

🛍️Where to buy? 🔗

+

👷How to build? 🔗

+

Tools 🔗

+

You can get a basic toolkit for around 20€. You can find a lot of options on Amazon. You'll eventually need a screwdriver for screw-in stabilizers, but for the keeb itself most of the time the necessary tools to screw/unscrew the case/plate are included. The wowstick is a really popular choice if you want to get a decent electric screwdriver.

+

Steps 🔗

+

Modding 🔗

+

📷Cool content creators 🔗

+

🔚Go further 🔗

+ +
+
+ +
+
+
+
+ +
+
+
+ + + diff --git a/public/blog/posts/keyboard-guide/keyboard-voc/index.html b/public/blog/posts/keyboard-guide/keyboard-voc/index.html new file mode 100644 index 0000000..a82aa33 --- /dev/null +++ b/public/blog/posts/keyboard-guide/keyboard-voc/index.html @@ -0,0 +1,175 @@ + + + + + + PL Sergent | + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + +
+ + + diff --git a/public/blog/posts/keyboard-guide/tosort_keyboard-voc/index.html b/public/blog/posts/keyboard-guide/tosort_keyboard-voc/index.html new file mode 100644 index 0000000..9bddd71 --- /dev/null +++ b/public/blog/posts/keyboard-guide/tosort_keyboard-voc/index.html @@ -0,0 +1,144 @@ + + + + + + PL Sergent | + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + +
+ + + diff --git a/public/blog/posts/keyboard-voc/index.html b/public/blog/posts/keyboard-voc/index.html new file mode 100644 index 0000000..a82aa33 --- /dev/null +++ b/public/blog/posts/keyboard-voc/index.html @@ -0,0 +1,175 @@ + + + + + + PL Sergent | + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + +
+ + + diff --git a/public/static/css/posts.css b/public/static/css/posts.css index 0236e06..ff12e68 100644 --- a/public/static/css/posts.css +++ b/public/static/css/posts.css @@ -1,3 +1,64 @@ .card-body a { text-decoration: underline; +} + +.text-pl { + color: #35283C; +} + +.card-body a.blog { + text-decoration: none; +} + +a.direct-link { + text-decoration: none; +} + +h1 { + font-size: 2.5rem; + font-weight: 600; + margin-bottom: 1rem; + margin-top: 1.2rem; + color: rgb(26, 26, 26); +} + +h2 { + font-size: 2rem; + font-weight: 600; + margin-bottom: 1rem; + margin-top: 3rem; + color: #40197e; +} + +h3 { + font-size: 1.5rem; + font-weight: 600; + margin-bottom: 1rem; + margin-top: 2.5rem; + color: #6535b1; +} + +h4 { + font-size: 1.25rem; + font-weight: 600; + margin-bottom: 1rem; + margin-top: 2rem; + color: #747474; +} + +.card-body p { + font-size: 19px; + color: #1d2122; + font-family: "Lato", sans-serif; +} + +#fixedbutton { + position: fixed; + bottom: 10px; + right: 20px; + z-index: 1000; + background-color: aliceblue; + color: #40197e; + display: none; + font-weight: 600; } \ No newline at end of file diff --git a/public/static/img/posts-img/IBM_Model_M.png b/public/static/img/posts-img/IBM_Model_M.png new file mode 100644 index 0000000..6b400c8 Binary files /dev/null and b/public/static/img/posts-img/IBM_Model_M.png differ diff --git a/public/static/img/posts-img/keyboard-guide.png b/public/static/img/posts-img/keyboard-guide.png new file mode 100644 index 0000000..725f211 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide.png differ diff --git a/public/static/img/posts-img/keyboard-guide/100_layout.png b/public/static/img/posts-img/keyboard-guide/100_layout.png new file mode 100644 index 0000000..600cb70 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/100_layout.png differ diff --git a/public/static/img/posts-img/keyboard-guide/100_layout.webp b/public/static/img/posts-img/keyboard-guide/100_layout.webp new file mode 100644 index 0000000..3fee5ce Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/100_layout.webp differ diff --git a/public/static/img/posts-img/keyboard-guide/40.jpg b/public/static/img/posts-img/keyboard-guide/40.jpg new file mode 100644 index 0000000..8169296 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/40.jpg differ diff --git a/public/static/img/posts-img/keyboard-guide/40_layout.png b/public/static/img/posts-img/keyboard-guide/40_layout.png new file mode 100644 index 0000000..dbddb2c Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/40_layout.png differ diff --git a/public/static/img/posts-img/keyboard-guide/40_layout_2.jpg b/public/static/img/posts-img/keyboard-guide/40_layout_2.jpg new file mode 100644 index 0000000..29bcf8c Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/40_layout_2.jpg differ diff --git a/public/static/img/posts-img/keyboard-guide/4160506ba710d0597871b5c845ef27a7069f829d_2_1024x711.jpeg b/public/static/img/posts-img/keyboard-guide/4160506ba710d0597871b5c845ef27a7069f829d_2_1024x711.jpeg new file mode 100644 index 0000000..baf69ca Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/4160506ba710d0597871b5c845ef27a7069f829d_2_1024x711.jpeg differ diff --git a/public/static/img/posts-img/keyboard-guide/5a129uawmycx.png b/public/static/img/posts-img/keyboard-guide/5a129uawmycx.png new file mode 100644 index 0000000..cffa18b Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/5a129uawmycx.png differ diff --git a/public/static/img/posts-img/keyboard-guide/60_diff_layout.jpg b/public/static/img/posts-img/keyboard-guide/60_diff_layout.jpg new file mode 100644 index 0000000..e34a0f5 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/60_diff_layout.jpg differ diff --git a/public/static/img/posts-img/keyboard-guide/60_layout.png b/public/static/img/posts-img/keyboard-guide/60_layout.png new file mode 100644 index 0000000..de00166 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/60_layout.png differ diff --git a/public/static/img/posts-img/keyboard-guide/60_layout.webp b/public/static/img/posts-img/keyboard-guide/60_layout.webp new file mode 100644 index 0000000..2c353af Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/60_layout.webp differ diff --git a/public/static/img/posts-img/keyboard-guide/65_layout.png b/public/static/img/posts-img/keyboard-guide/65_layout.png new file mode 100644 index 0000000..aae2e8b Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/65_layout.png differ diff --git a/public/static/img/posts-img/keyboard-guide/65_layout.webp b/public/static/img/posts-img/keyboard-guide/65_layout.webp new file mode 100644 index 0000000..442b66d Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/65_layout.webp differ diff --git a/public/static/img/posts-img/keyboard-guide/75_layout.png b/public/static/img/posts-img/keyboard-guide/75_layout.png new file mode 100644 index 0000000..07d0f51 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/75_layout.png differ diff --git a/public/static/img/posts-img/keyboard-guide/75_layout.webp b/public/static/img/posts-img/keyboard-guide/75_layout.webp new file mode 100644 index 0000000..462f27d Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/75_layout.webp differ diff --git a/public/static/img/posts-img/keyboard-guide/Equalz-interrupteur-Tangerine-lin-aire-5-broches-pour-clavier-m-canique-personnalis-Semi-Transparent-62g-67g.jpg b/public/static/img/posts-img/keyboard-guide/Equalz-interrupteur-Tangerine-lin-aire-5-broches-pour-clavier-m-canique-personnalis-Semi-Transparent-62g-67g.jpg new file mode 100644 index 0000000..9545616 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/Equalz-interrupteur-Tangerine-lin-aire-5-broches-pour-clavier-m-canique-personnalis-Semi-Transparent-62g-67g.jpg differ diff --git a/public/static/img/posts-img/keyboard-guide/GIF_MXRGB_Brown.gif b/public/static/img/posts-img/keyboard-guide/GIF_MXRGB_Brown.gif new file mode 100644 index 0000000..796851c Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/GIF_MXRGB_Brown.gif differ diff --git a/public/static/img/posts-img/keyboard-guide/IBM_Model_M.png b/public/static/img/posts-img/keyboard-guide/IBM_Model_M.png new file mode 100644 index 0000000..6b400c8 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/IBM_Model_M.png differ diff --git a/public/static/img/posts-img/keyboard-guide/alexotos_moontower.jpg b/public/static/img/posts-img/keyboard-guide/alexotos_moontower.jpg new file mode 100644 index 0000000..34fcf1b Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/alexotos_moontower.jpg differ diff --git a/public/static/img/posts-img/keyboard-guide/alice_layout.png b/public/static/img/posts-img/keyboard-guide/alice_layout.png new file mode 100644 index 0000000..ed2d11d Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/alice_layout.png differ diff --git a/public/static/img/posts-img/keyboard-guide/anatomy.jpg b/public/static/img/posts-img/keyboard-guide/anatomy.jpg new file mode 100644 index 0000000..93f85e0 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/anatomy.jpg differ diff --git a/public/static/img/posts-img/keyboard-guide/ansi_iso.png b/public/static/img/posts-img/keyboard-guide/ansi_iso.png new file mode 100644 index 0000000..976f85f Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/ansi_iso.png differ diff --git a/public/static/img/posts-img/keyboard-guide/cherryMX_brown.jpg b/public/static/img/posts-img/keyboard-guide/cherryMX_brown.jpg new file mode 100644 index 0000000..2ae6c26 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/cherryMX_brown.jpg differ diff --git a/public/static/img/posts-img/keyboard-guide/cherryMX_brown.png b/public/static/img/posts-img/keyboard-guide/cherryMX_brown.png new file mode 100644 index 0000000..ad820ac Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/cherryMX_brown.png differ diff --git a/public/static/img/posts-img/keyboard-guide/geekhack.png b/public/static/img/posts-img/keyboard-guide/geekhack.png new file mode 100644 index 0000000..ff14161 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/geekhack.png differ diff --git a/public/static/img/posts-img/keyboard-guide/gmmk-pro.png b/public/static/img/posts-img/keyboard-guide/gmmk-pro.png new file mode 100644 index 0000000..b24f64b Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/gmmk-pro.png differ diff --git a/public/static/img/posts-img/keyboard-guide/hhkb_layout.jpg b/public/static/img/posts-img/keyboard-guide/hhkb_layout.jpg new file mode 100644 index 0000000..7ac57a7 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/hhkb_layout.jpg differ diff --git a/public/static/img/posts-img/keyboard-guide/hotswap_pcb.jpg b/public/static/img/posts-img/keyboard-guide/hotswap_pcb.jpg new file mode 100644 index 0000000..5e204ce Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/hotswap_pcb.jpg differ diff --git a/public/static/img/posts-img/keyboard-guide/keyboard_parts.png b/public/static/img/posts-img/keyboard-guide/keyboard_parts.png new file mode 100644 index 0000000..c578936 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/keyboard_parts.png differ diff --git a/public/static/img/posts-img/keyboard-guide/keycaps.png b/public/static/img/posts-img/keyboard-guide/keycaps.png new file mode 100644 index 0000000..6f9b76e Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/keycaps.png differ diff --git a/public/static/img/posts-img/keyboard-guide/keycaps_profile.jpg b/public/static/img/posts-img/keyboard-guide/keycaps_profile.jpg new file mode 100644 index 0000000..598f7d6 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/keycaps_profile.jpg differ diff --git a/public/static/img/posts-img/keyboard-guide/layout_size.jpeg b/public/static/img/posts-img/keyboard-guide/layout_size.jpeg new file mode 100644 index 0000000..aeb53f1 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/layout_size.jpeg differ diff --git a/public/static/img/posts-img/keyboard-guide/layout_size_explained.png b/public/static/img/posts-img/keyboard-guide/layout_size_explained.png new file mode 100644 index 0000000..93544ff Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/layout_size_explained.png differ diff --git a/public/static/img/posts-img/keyboard-guide/layouts.jpg b/public/static/img/posts-img/keyboard-guide/layouts.jpg new file mode 100644 index 0000000..348a0af Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/layouts.jpg differ diff --git a/public/static/img/posts-img/keyboard-guide/layouts_60.jpg b/public/static/img/posts-img/keyboard-guide/layouts_60.jpg new file mode 100644 index 0000000..859fc94 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/layouts_60.jpg differ diff --git a/public/static/img/posts-img/keyboard-guide/nk_cream.jpg b/public/static/img/posts-img/keyboard-guide/nk_cream.jpg new file mode 100644 index 0000000..b9a79ea Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/nk_cream.jpg differ diff --git a/public/static/img/posts-img/keyboard-guide/oil_king.jpeg b/public/static/img/posts-img/keyboard-guide/oil_king.jpeg new file mode 100644 index 0000000..baf69ca Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/oil_king.jpeg differ diff --git a/public/static/img/posts-img/keyboard-guide/physical_keyboard_layouts_comparison_ansi_iso-1024x805.png b/public/static/img/posts-img/keyboard-guide/physical_keyboard_layouts_comparison_ansi_iso-1024x805.png new file mode 100644 index 0000000..976f85f Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/physical_keyboard_layouts_comparison_ansi_iso-1024x805.png differ diff --git a/public/static/img/posts-img/keyboard-guide/planck_layout.png b/public/static/img/posts-img/keyboard-guide/planck_layout.png new file mode 100644 index 0000000..cffa18b Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/planck_layout.png differ diff --git a/public/static/img/posts-img/keyboard-guide/plate1.png b/public/static/img/posts-img/keyboard-guide/plate1.png new file mode 100644 index 0000000..e796d7e Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/plate1.png differ diff --git a/public/static/img/posts-img/keyboard-guide/plate2.png b/public/static/img/posts-img/keyboard-guide/plate2.png new file mode 100644 index 0000000..9ffede2 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/plate2.png differ diff --git a/public/static/img/posts-img/keyboard-guide/solderable_pcb.jpg b/public/static/img/posts-img/keyboard-guide/solderable_pcb.jpg new file mode 100644 index 0000000..aa98741 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/solderable_pcb.jpg differ diff --git a/public/static/img/posts-img/keyboard-guide/split_backspace_layout.png b/public/static/img/posts-img/keyboard-guide/split_backspace_layout.png new file mode 100644 index 0000000..1b9bc92 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/split_backspace_layout.png differ diff --git a/public/static/img/posts-img/keyboard-guide/split_layout.jpg b/public/static/img/posts-img/keyboard-guide/split_layout.jpg new file mode 100644 index 0000000..87afa50 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/split_layout.jpg differ diff --git a/public/static/img/posts-img/keyboard-guide/stabs.png b/public/static/img/posts-img/keyboard-guide/stabs.png new file mode 100644 index 0000000..deef1e1 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/stabs.png differ diff --git a/public/static/img/posts-img/keyboard-guide/switch_schema.png b/public/static/img/posts-img/keyboard-guide/switch_schema.png new file mode 100644 index 0000000..a21cdb8 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/switch_schema.png differ diff --git a/public/static/img/posts-img/keyboard-guide/switches.gif b/public/static/img/posts-img/keyboard-guide/switches.gif new file mode 100644 index 0000000..00674f6 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/switches.gif differ diff --git a/public/static/img/posts-img/keyboard-guide/switches_part.jpg b/public/static/img/posts-img/keyboard-guide/switches_part.jpg new file mode 100644 index 0000000..dca706f Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/switches_part.jpg differ diff --git a/public/static/img/posts-img/keyboard-guide/switches_stem.jpeg b/public/static/img/posts-img/keyboard-guide/switches_stem.jpeg new file mode 100644 index 0000000..32765d3 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/switches_stem.jpeg differ diff --git a/public/static/img/posts-img/keyboard-guide/tangerine.jpg b/public/static/img/posts-img/keyboard-guide/tangerine.jpg new file mode 100644 index 0000000..9545616 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/tangerine.jpg differ diff --git a/public/static/img/posts-img/keyboard-guide/tkc_tangerine-linear-switch_diagram.png b/public/static/img/posts-img/keyboard-guide/tkc_tangerine-linear-switch_diagram.png new file mode 100644 index 0000000..a21cdb8 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/tkc_tangerine-linear-switch_diagram.png differ diff --git a/public/static/img/posts-img/keyboard-guide/tkl_layout.png b/public/static/img/posts-img/keyboard-guide/tkl_layout.png new file mode 100644 index 0000000..678ad1c Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/tkl_layout.png differ diff --git a/public/static/img/posts-img/keyboard-guide/tkl_layout_gmmk.png b/public/static/img/posts-img/keyboard-guide/tkl_layout_gmmk.png new file mode 100644 index 0000000..b24f64b Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/tkl_layout_gmmk.png differ diff --git a/public/static/img/posts-img/keyboard-guide/tlk_layout.webp b/public/static/img/posts-img/keyboard-guide/tlk_layout.webp new file mode 100644 index 0000000..e9c947b Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/tlk_layout.webp differ diff --git a/public/static/img/posts-img/keyboard-guide/tofu602.0.png b/public/static/img/posts-img/keyboard-guide/tofu602.0.png new file mode 100644 index 0000000..6d658b8 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/tofu602.0.png differ diff --git a/public/static/img/posts-img/keyboard-guide/tofu602.1.png b/public/static/img/posts-img/keyboard-guide/tofu602.1.png new file mode 100644 index 0000000..f1930e6 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/tofu602.1.png differ diff --git a/public/static/img/posts-img/keyboard-guide/tofu60_layout.png b/public/static/img/posts-img/keyboard-guide/tofu60_layout.png new file mode 100644 index 0000000..285f690 Binary files /dev/null and b/public/static/img/posts-img/keyboard-guide/tofu60_layout.png differ diff --git a/public/static/js/animation.js b/public/static/js/animation.js index b066bfc..be4e655 100644 --- a/public/static/js/animation.js +++ b/public/static/js/animation.js @@ -6,7 +6,7 @@ window.onload = function () { var sections = ["home", "about", "experiences", "skills", "hobbies", "contact"] - nextButton.addEventListener('click', event => { + nextButton.addEventListener('click', () => { var location = window.location.href.split("#")[1] if (!sections.includes(location)) { diff --git a/public/static/js/post.js b/public/static/js/post.js new file mode 100644 index 0000000..b72255a --- /dev/null +++ b/public/static/js/post.js @@ -0,0 +1,24 @@ +window.onload = function () { + var topButton = document.getElementById('fixedbutton'); + + function topFunction() { + document.body.scrollTop = 0; + document.documentElement.scrollTop = 0; + } + + topButton.addEventListener('click', () => { + topFunction(); + }); + + // on scroll + function scrollFunction() { + if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) { + topButton.style.display = "block"; + } else { + topButton.style.display = "none"; + } + } + + window.onscroll = function() {scrollFunction()}; +} + diff --git a/sort_md_files.sh b/sort_md_files.sh new file mode 100755 index 0000000..e5c392f --- /dev/null +++ b/sort_md_files.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +walk_dir () { + shopt -s nullglob dotglob + + for pathname in "$1"/*; do + if [ -d "$pathname" ]; then + walk_dir "$pathname" + else + case "$pathname" in + *tosort*.md) + slmd "$pathname" -o + esac + fi + done +} + +DIR=./src/blog/ + +walk_dir "$DIR" \ No newline at end of file diff --git a/src/_includes/post.njk b/src/_includes/post.njk index 2f9753d..4dcd3fe 100644 --- a/src/_includes/post.njk +++ b/src/_includes/post.njk @@ -4,6 +4,11 @@ layout: "base.njk" --- + + + {% set previousPost = collections.posts | getPreviousCollectionItem(page) %} {% set nextPost = collections.posts | getNextCollectionItem(page) %} @@ -20,7 +25,7 @@ layout: "base.njk"
-

{{ title }}

+

{{ title }}

{{ teaser }}

@@ -31,6 +36,17 @@ layout: "base.njk"
...
+ Back to blog + {% if previousPost %} + + Previous post + + {% endif %} + {% if nextPost %} + + Next post + + {% endif %} {{ content | safe }}
diff --git a/src/blog/_include-posts/keyboard-guide/tosort_general-voc.md b/src/blog/_include-posts/keyboard-guide/tosort_general-voc.md new file mode 100644 index 0000000..9e22357 --- /dev/null +++ b/src/blog/_include-posts/keyboard-guide/tosort_general-voc.md @@ -0,0 +1,10 @@ +- **Deskmat** - a mat that goes on your desk. Can be used for design, comfort, or sound purposes. +- **Foam** - a material that is used to dampen the sound of the keyboard. Usually, it's used on the bottom of the keyboard. +- **Group buy** - process to buy keebs related products where you pay upfront, and then the manufacturer will produce the product. Usually, you have to wait a lot of time, around 6 months to 1 year (sometimes up to 2 years for GMK sets). **This is probably the most important thing you need to know about the hobby**. If you want high-end/interesting products you'll have to do group buys. You can always buy cheaper things that are in stock, but you'll miss out on a lot of cool stuff (although buying an affordable in-stock keyboard can be a good idea at first to learn about the building mechanism and not all in-stock keebs are bad of course). +- **Interest check** - a poll to see if there is enough interest in a product. Usually, it's used before a group buy to see if it is worth starting it. Watching for interest checks is a good way to know what products are coming out soon, and you can also support people that are trying to launch their products. You can find interest checks on [geekhack](https://geekhack.org/index.php?board=132.0) and on Reddit [r/mechanicalkeyboards](https://www.reddit.com/r/MechanicalKeyboards/search/?q=IC&restrict_sr=1&sr_nsfw=&include_over_18=1&sort=new). +- **Keeb enthusiast** - a person who is passionate about keyboards. +- **Keeb** - a keyboard. +- **Modding** - action to modify a keyboard to make it better in terms of sound, feel, or aesthetics. +- **QMK** - firmware that allows you to customize your keyboard. You can find it in most of the keyboards you'll find in the hobby. You can customize the firmware on tools like [QMK Configurator](https://config.qmk.fm/#/) or [VIA](https://caniusevia.com/). **For beginners, I recommend using VIA, it's easier to use.** +- **Sound test** - a video that shows the sound of a keyboard. Usually, it's just a video of someone typing showcasing the result that he achieved. +- **VIA** - free software that allows you to customize your keyboard. You can remap the keys directly on the firmware, meaning if you take your keyboard to another computer the changes will remain. diff --git a/src/blog/_include-posts/keyboard-guide/tosort_keyboard-voc.md b/src/blog/_include-posts/keyboard-guide/tosort_keyboard-voc.md new file mode 100644 index 0000000..53c3ba4 --- /dev/null +++ b/src/blog/_include-posts/keyboard-guide/tosort_keyboard-voc.md @@ -0,0 +1,17 @@ +- **Case** - the part of the keyboard that holds the plate and the PCB. +- **Dampeners** - the part of the keyboard that reduces the sound of the switches. They can be foam, o-rings, or springs. +- **Firmware** - the software that runs on the keyboard. It's usually open source, and you can customize it (most of the time it's gonna be QMK). +- **Gasket mount** - a way to mount the PCB to the case. It's usually done with rubber gaskets. +- **Holy mods** - modding to make the stabilizers sound better using a bandaid and placing it inside the stem of the stabilizer. [Youtube video](https://www.youtube.com/watch?v=-vhpHjlkRgQ) +- **Hotswap PCB** - PCB that allows you to mount switches without soldering. +- **Keycaps** - the part of the keyboard that you press. They come in different shapes, sizes, and colors. +- **LEDs** - the part of the keyboard that lights up the keycaps. They can be RGB, single color, or even no LEDs. +- **Layout** - literally the layout of the keyboard. It can be 60%, 65%, 75%, 80%, 90%, 100%, TKL, 1800, 1900, etc. (more on that later), there is also a distinction between ANSI and ISO layouts (french people, drop the ISO and the AZERTY, trust me, you can still type in AZERTY on QWERTY keycaps). +- **Mounting style** - how the plate or PCB is secured in the keyboard housing. (more on that here: [keyboard-university](https://www.keyboard.university/200-courses/keyboard-mounting-styles-4lpp7)) +- **PCB** - the part of the keyboard that holds the switches and the diodes. It's also where the microcontroller is. +- **Plate** - the part of the keyboard that holds the switches and the keycaps. It can be made of different materials (aluminum, FR4, polycarbonate, etc.) +- **Sockets** - the part of the PCB that allows you to mount the switches without soldering (hotswap). +- **Solder PCB** - PCB that requires you to solder the switches to the PCB. Then, you can't remove the switches (unless you desolder them). They usually give more options for the layouts. +- **Stabilizers** - the part of the keyboard that holds the keycaps in place. They are used for the spacebar, the shift keys and the enter. +- **Switches** - the part of the keyboard that registers the keypresses. There are a lot of different types of switches, and they all have different characteristics. +- **Weight** - the part of the keyboard that goes underneath the case. diff --git a/src/blog/_include-posts/keyboard-guide/tosort_keycaps-voc.md b/src/blog/_include-posts/keyboard-guide/tosort_keycaps-voc.md new file mode 100644 index 0000000..33af1ac --- /dev/null +++ b/src/blog/_include-posts/keyboard-guide/tosort_keycaps-voc.md @@ -0,0 +1,9 @@ +- **ABS** - the keycap that has an **ABS material**. +- **Double shot** - the keycap that has been shot twice, once for the legends and once for the color. Usually means that it's better quality, for both the durability and the legends. +- **Dye sub** - the process of printing the legends on the keycap. There are a lot of different methods, the most common one is **dye sublimation**. +- **GMK** - is a very famous keycaps manufacturer. They have a lot of different keycap sets, and they are known for their high quality. But usually, you have to wait a lot of time to get your hands on them. +- **Keycap set** - the set of keycaps that have the same color (actually depends but you got it), material, and profile. +- **Keycap width** - the width of the keycap expressed in a unit _U_, which represents the width of a standard alpha keycap (keycap with a letter on it). +- **Material** - the material of the keycap. There are a lot of different materials, the most common one is **PBT**. +- **PBT** - the keycap that has a **PBT material**. +- **Profile** - the shape of the keycap. There are a lot of different profiles, the most common one is the **cherry profile**. Pretty much all the keycaps can fit on a standard switch (with the cherry specification). diff --git a/src/blog/_include-posts/keyboard-guide/tosort_switches-voc.md b/src/blog/_include-posts/keyboard-guide/tosort_switches-voc.md new file mode 100644 index 0000000..b35d4d6 --- /dev/null +++ b/src/blog/_include-posts/keyboard-guide/tosort_switches-voc.md @@ -0,0 +1,18 @@ +- **Actuation force** - the force needed to press the switch to register the key press. +- **Actuation** - the distance you need to press the switch to register the key press. +- **Bottom housing** - the part of the switch that goes on the bottom. +- **Bottoming out** - the distance you need to press the switch to bottom out. +- **Bump** - the switch that has a bump. It can be tactile or clicky, linear switches don't have a bump. +- **Clacky** - the switch that has a clacky sound (the sound also depends on other factors). +- **Clicky** - the switch that has a tactile bump and a clicky sound. (ex: Gateron Blue) +- **Filming** - the process of applying a film to the switch. It goes between the top and bottom housing. It helps reduce unwanted noise from the switch. +- **Linear** - the switch that has a smooth and linear feel. (ex: Gateron Yellow) +- **Lube** - the substance that is applied to the switch to make it feel and sound better. +- **Lubing** - the process of applying lube to the switch. +- **Posttravel** - the distance you need to press the switch after it registers the keypress. +- **Pretravel** - the distance you need to press the switch before it registers the keypress. +- **Spring** - the part of the switch that determines the force needed to press the switch. Placed between the stem and the bottom housing. +- **Stem** - the part of the switch that goes between the top and bottom housing, and the spring. +- **Tactile** - the switch that has a tactile bump. (ex: Gateron Brown) +- **Thocky** - the switch that has a thocky sound (the sound also depends on other factors). +- **Top housing** - the part of the switch that goes on top. diff --git a/src/blog/posts/02-keyboard-guide.md b/src/blog/posts/02-keyboard-guide.md new file mode 100644 index 0000000..b58535b --- /dev/null +++ b/src/blog/posts/02-keyboard-guide.md @@ -0,0 +1,625 @@ +--- +title: Mechanical keyboard guide +teaser: Get started with custom mechanical keyboards +img: keyboard-guide.png +layout: "post.njk" +--- + +# Mechanical keyboard guide + +[[toc]] + +--- + +## ❔Why? +Mechanical keyboards have been around for a while now. Starting from the 80s, with a famous keyboard: the IBM model M. + +ibm-model-m + +*IBM model M* + +Even today people are nostalgic about this keyboard and still use it: [Why I use a 20-year-old IBM Model M keyboard](https://arstechnica.com/gadgets/2018/11/why-i-use-a-20-year-old-ibm-model-m-keyboard/), but why? + +The main reason is the **feel** of the keyboard. Mechanical keyboards are **more tactile** and **more responsive** than membrane keyboards. The keys are **more solid** and **more durable**. The **sound** is also different, it's more **clicky** and **loud**. + +Nowadays, mechanical keyboards are also widespread but mainly in the gaming community. And if you don't like flashy RGB, with questionable design choices, it's hard to see yourself using a mechanical keyboard, especially if you're not a gamer. That's why most people won't pay attention to mechanical keyboards and prefer to use membrane/butterfly keyboards, also because they don't care about having a great keyboard right? But those who are using their keyboards daily don't know what they're missing, because having a mechanical keyboard with a nice design is possible. + +I got into this hobby about 3 years ago, when **I was stuck between having to use a membrane Dell keyboard and a flashy and loud gamer mechanical keyboard**. I was looking for something in between, and **I found it**. + +--- +***TLDR; 🏷️*** If you are stuck between a membrane keyboard and a gamer mechanical keyboard, you should consider a custom mechanical keyboard especially if you use a keyboard daily. I'll list the reasons below. + +--- + +### 🔝The design + +**Designs** of custom mechanical keyboards (keebs) are **wide and varied**. As the name suggests you can do anything you want, **find your style**, and make it your own. But if you search online, you'll find out that most custom keebs are **very neat and clean**. The aesthetic is very important for the community, and it's a big part of the hobby. You can find a lot of inspiration on **[r/mechanicalkeyboards](https://www.reddit.com/r/MechanicalKeyboards/)**. + +That's one of the things that inspired me, I felt like the keebs were fitting my style more than the gamer ones without being a membrane cheap keyboard. It becomes more than just a keyboard, it's a **piece of art**. + +ibm-model-m + +*Tofu60 2.0 - KBDfans* + +--- +***TLDR; 🏷️*** Keebs are beautiful, elegant and clean. They are a piece of art, and they can fit your style. + +--- + +### 🔝The feel + +**The feel** of a custom mechanical keyboard is **very different** from a membrane or laptop keyboard. Most people prefer when the keys are low profile, but the feeling you get from a good keeb is unmatched. + +The main reason is that you're getting a more pronounced **tactile feedback**. This has been made possible by the **switches**. They give a less *mushy* feel, every keypress can be clearly felt, making them perfect for precise and accurate typing. It's also more satisfying to type on. + +Cherry is one of the pioneers in the domain. If you want to know more about the history of switches you can read [this article](https://tedium.co/2018/07/19/cherry-mx-keyboard-history/) and [this article](https://keyboardsexpert.com/history-of-mechanical-keyboard-switches/). Cherry designed his first switch in the '60s and received a patent in 1974. The first Cherry MX switch was released in 1984. The MX switch is still used today, and it's the most popular switch in the mechanical keyboard community. + +cherry-mx-switches +tangerine-switches +oil_king-switches +nk_cream-switches + + +*Cherry MX switch - brown / C³Equalz X TKC Tangerine Switches / Gateron Oil King / NovelKey Cream* + +--- +***TLDR; 🏷️*** The feel of a keeb is very different from a membrane or laptop keyboard. It's more tactile and responsive, and it's perfect for precise and accurate typing. It's also more satisfying to type on, thanks to the switches. + +--- + +### 🔝The sound + +**The sound** of a keeb is what stands out the most in my opinion. It's louder than a membrane/butterfly keyboard, but it's not as loud as a gamer mechanical keyboard. It's also a more **precise** and **satisfying** sound, without the plastic feels that other keyboards can have. + +You can customize the sound by **choosing the switches**, **adding foam dampeners**, **o-rings**, **keycaps**, etc. You can also lube the switches, we'll talk about that later. + +You can be team **thocky**, team **clacky**, or team **clicky**. It's all about personal preference, and you can find the sound that satisfies you the most. + +In the **first video** below, you can see an example of a great keeb sound. The second video helps us remind that a keyboard sound **depends on a lot of factors**: the table, the deskmat, the microphone, etc... + + + + + + +--- +***TLDR; 🏷️*** The sound of a keeb is very satisfying, and you can customize it by choosing the switches, adding foam dampeners, o-rings, keycaps, etc. + +--- + +### 🔝The customization + +This is the main reason **most people** could get into this hobby, or even make just one keeb. **You can customize everything**. You can choose the **switches**, the **keycaps**, the **cable**, the **plate**, the **case**, the **PCB**, the **stabilizers**, the **dampeners**, the **LEDs**, the **lube**, etc. Most of the time a keyboard kit will come with the essential parts (PCB, plate, case). + +You can create something **unique** in terms of design, sound, feel, and even weight. You can also **choose the layout** (more on that later), and **add layers**. You can also **program macros** and **remap keys** (using [VIA](https://www.caniusevia.com/) or [QMK configurator](https://config.qmk.fm/)). + +This ability to customize everything is what makes the hobby so **interesting** and **addicting**. You can **create something unique** that fits your style and needs. But it can also be *overwhelming*, with a **lot of options** and a **lot of things to learn**. + +--- +This is why I'm writing this guide, to help you get started. + +--- + +## 🔜Where to start? + +### Learn the basics - [keyboard university](https://keyboard.university/) + +While I was writing this guide I came across this awesome website **[keyboard university](https://keyboard.university/)**. It's a great resource for beginners, and it's a great place to start. I'll try to cover the most important things in this guide, but I highly recommend you check out the website. (Brought to you by [thekey.company](https://thekey.company/)) + +### Gather information + +The first crucial step of your journey to become a **keeb enthusiast** (or if you want to build just one keyboard) is to **gather information** by scrolling through social media, forums, videos, vendors' websites, etc. One of the great resources is the [r/mechanicalkeyboards](https://www.reddit.com/r/MechanicalKeyboards/) subreddit. + +I'll list some of the resources in other sections of this guide: +- [vendors](#🛍%EF%B8%8Fwhere-to-buy%3F) +- [cool content creators](#📷cool-content-creators) + +You can also go on the forum [geekhack](https://geekhack.org/). It's a great resource, but it can be overwhelming at first. + +### Master the vocabulary + +The keeb community has its vocabulary. You'll need to learn it to understand what people are talking about. Here are some of the most important terms: + +**About keyboard itself** + +!!!include(./src/blog/_include-posts/keyboard-guide/tosort_keyboard-voc.md)!!! + +ansi_vs_iso + +*ANSI vs ISO layouts* + +--- + +**About the switches** + +!!!include(./src/blog/_include-posts/keyboard-guide/tosort_switches-voc.md)!!! + +switch_schema + +*Switch schema - from keyboard university* + +--- + +**About the keycaps** + +!!!include(./src/blog/_include-posts/keyboard-guide/tosort_keycaps-voc.md)!!! + +switch_schema + +*Keycaps sizes* + +--- + +**About the hobby in general** + +!!!include(./src/blog/_include-posts/keyboard-guide/tosort_general-voc.md)!!! + +--- +***TLDR; 🏷️*** You don't have to know everything, especially if you're looking to build just one keyboard. Just remember that the most beautiful keyboards that you can find will require that you participate in group buys. +Links of the section: +- [r/mechanicalkeyboards](https://www.reddit.com/r/MechanicalKeyboards/) +- [geekhack](https://geekhack.org/index.php?board=1.0) +- [VIA](https://caniusevia.com/) +- [QMK Configurator](https://config.qmk.fm/#/) + +--- + +### 🦴Keyboard anatomy + +keyboard_parts + +*Keyboard parts - Glorious* + +- **Case** - the shell of the keyboard, it can be made of plastic, aluminum, wood, polycarbonate, etc. +- **Plate** - the plate is the part that holds the switches in place. Different types: aluminum, POM, FR4, carbon fiber, etc. +- **PCB** - the PCB is the brain of the keyboard. It's the part that you plug into your computer. It can be hot-swappable or soldered. +- **Switches** - the switches are the part that you press to type. +- **Keycaps** - the keycaps are the part that you see and touch. They are made of ABS or PBT. +- **Stabilizers** - the stabilizers are the parts that stabilize the longer keys (spacebar, enter, shift, etc.). +- **Foam** - the foam is used to dampen the sound of the keyboard. There is foam for the plate, the PCB or the bottom case. + +## 💰What to buy? + +You're ready to buy your first keyboard? Good! But first, you need to know what you want. There are a lot of options out there and you need to know what you're aiming for. Here are some questions that you need to ask yourself: +- [What is your budget?](#budget) +- [How long are you willing to wait?](#wait-time) +- [What layout do you want?](#layout) +- [Hot-swappable or soldered?](#PCB) +- [What is your switch preference?](#switches) +- [What is your keycap design/profile preference?](#keycaps) +- [Do I want a prebuilt or a DIY keyboard?](#prebuilt-vs-diy) +... + +I'll try to answer these questions in the following sections. But again, you'll have to do your research. + +### Budget + +There is a **large scale of prices** for keyboards. Of course, if you want to get into the hobby and get a real custom keyboard there is some cost involved outside of the keyboard itself. You'll need to buy **switches**, **keycaps**, **cables**, **tools**, etc. But you can also get a good keyboard for a reasonable price (reasonable being a relative term). + +**Tools** ~= **20€ to 75€** - [Tools](#tools) + +**Switches** ~= **30€ to 70€** - [Switches](#switches), also depend on the size of the board you want to build (60%, 65%, 75%, 80%, 90%, 100%) + +**Keycaps** ~= **20€ to 150€** - [Keycaps](#keycaps), hopefully, there are a lot of options around 50 to 100€, this is the range I would recommend since below 50€ the quality is usually pretty poor. + +**Extras** ~= **0€ to 100€** - You can also get some fancy deskmats or other accessories. I would recommend getting a decent cable (25€) but you can also use the USB-C cable that you have at home (**pretty much all wired keyboards are gonna use USBC**). + +**Keyboard itself** ~= **50€ to ♾️** - Usually includes the case, plate, PCB, stabilizers and foam pads, **excluding** switches, keycaps, cables, and tools. Different ranges are described below. + +
+

50€ to 150€ - Beginner/first keyboard, usually poor to okay quality

+ +That's a dangerous price range because you can find decent boards but also pretty bad things. A lot of the time the keebs will be **prebuilt** (meaning no need to buy other parts). Those keyboards are **mainly built of plastic**. But there is some well know brand like [Keychron](https://www.keychron.com/) that offers some decent boards at this price range. If you go for that I would highly recommend that you still open up the board to perform some modding. + +There are still some options available on [Aliexpress](https://fr.aliexpress.com/) (rg61, tm680, Epomaker, bm65rgb, etc) that I don't particularly recommend. + +As well as other vendors, here is a quick list of some options: Anne pro 2, Ducky, Varmilo, Leopold, D60Lite 👍, etc. + +***This price range is the one I would recommend for a first keyboard or if you're a beginner in the hobby.*** + +***TLDR; 🏷️*** Good for beginners. You can get a decent keyboard for a reasonable price. But you'll need to do some research. + +
+ +
+ +
+

150€ to 350€ - Intermediate/advanced, can't go wrong here

+ +You got your first custom keeb but now you want to go further (or maybe you're just rich)? Okay, this price range is perfect for intermediate/advanced keebs. Most of the well-known group buys will be in this range (QK, Zoom65, Tofu, KBD67, Modekeyboards, etc). + +You'll be able to find a **lot of options** with **high quality** overall and **interesting designs**. The board will be made of **aluminum**, **brass** or **polycarbonate**. It will last longer, be more durable and most importantly, it will look better and cleaner. For instance, white plastic tends to become yellowish over time, but aluminum will stay white. + +This price range is where you'll find most of the interesting boards on the market. Keep in mind that it's going to require you to join group buys and wait for the board to be produced. But it's worth it. + +This might sound like a lot of money but if we compare it to gaming keyboards, some of them can cost up to 300€. In my opinion, a custom keyboard is a lot more interesting, beautiful, and high-standard, you can get a lot more out of it. + +***TLDR; 🏷️*** Good for intermediate/advanced users. High standard, and beautiful boards. A lot of options. But you'll need to join group buys. + +
+ +
+ +
+

350€ to ♾️ - Veteran, to the moon, you can get anything

+ +At this point, you either have a lot of money or you're a veteran in the hobby. For this price point, you can get pretty much anything you want. **Crazy design**, **advanced features**, and **very high-quality/design**. + +Is it worth it to spend that much money on a keyboard? **Probably not**. But as with all hobbies, it's a matter of taste and what you want to do. If you want to get into the hobby and you're willing to spend that much money, go for it. But if you're just looking for a keyboard, you can get a lot of good options for a lot less. + +At this point, you want to push the customization to the max and have a really unique board. + +***TLDR; 🏷️*** Good for veterans. Crazy design, advanced features, and very high-quality/design. But probably not worth it, unless you fell in love with a specific board. + +
+ +### Wait time + +Depending on the type of purchase you're doing you might experience some noticeable wait time. Here is a quick list of the different types of purchases and their wait time. + +#### Groups buys + +This is the most common way to get interesting stuff in the hobby. Group buys usually **last a week or two**, and at the end of this period, the vendor will pass the order to the manufacturer. The manufacturer will then produce the boards and send them to the vendor. The vendor will then ship the items to the customers. This process can take at least **4-5 months**, sometimes up to **a year or two**. Note that the vendors in your region are not the ones who designed the items, they are just the middleman between you and the manufacturer. + +Recap of the process (from the customer's perspective): +- **Interest check \[IC\]**: the designer of the items (board, keycaps, desk mat, etc) will post a thread on Reddit or other platforms to see if there is enough interest in the product. If there is enough interest, the designer will move on to the next step. +- **Group buy \[GB\]**: the designer will contact vendors in various regions (note that each region has its own vendors) and will ask them to host the group buy. The vendors will then post the group buy on their websites and start collecting orders. The group buy will last a week or two, and at the end of this period, if there are enough orders, the vendor will pass the order to the manufacturer, otherwise, the group buy will be canceled and the vendor will refund the customers. +- **Waiting time**: the manufacturer gets the orders and produces the number of boards that are needed. The manufacturer will then send the boards to the vendors (usually by boat). This process can take at least 4-5 months, sometimes up to a year or two. +- **Shipping**: the vendor will ship the boards to the customers. This process can take a few days to a few weeks depending on the region. + +As you can see the waiting time can be quite long. You need to know what you're getting yourself into because you're committing to a long-term project. What I recommend is that if you see a board that you are really interested in, you should join the group buy and in the meanwhile you can still order other boards that are in stock. + +geekhack + +*You can find all the information about IC and incoming GB on [geekhack](https://geekhack.org/)* + +#### Pre-order + +This is a bit different from group buys since this time the vendor will start manufacturing the boards **independently from the number of orders**. You're paying for a product that is not available yet but **the production might already have started**. Items that are in pre-order **will be in-stock** if the number of pre-orders did not exceed the expected stock. Meaning that in this scenario the vendor takes the risk of having too many boards. Usually, the vendor will give you a discount if you pre-order the item. + +The waiting time in this case will vary depending on the progress of the production, the region, the shipping method, etc. But it will be much shorter than group buys. Still, count at least a few months. + +#### In stock + +If think you know where it's about to go. In-stock items are ready to be shipped. You can get them right away, although if you're ordering products from a different continent you might have to wait a few weeks. + +### Layout + +When we talk about layouts it actually refers to two things: the **size** of the keyboard and the **positioning** of the keys. + +The size of the keyboard is measured in **percentage**. The most common sizes are 60%, 65%, 75%, and 100%. + +For the positioning of the keys, there are two main layouts: **ANSI** and **ISO**. + +#### ANSI vs ISO + +**ANSI** and **ISO** are abbreviations for two global standardization organizations - American National Standards Institute and International Organization for Standardization, respectively. These acronyms refer to keyboard layouts that specify the location and size of keys, distinct from logical layouts like QWERTY, Dvorak, Colemak, etc. ANSI and ISO keyboards vary in the arrangement of the Enter, Backslash, and Left Shift keys. + +ansi_vs_iso + +*ANSI vs ISO layouts* + +**In the hobby**, you'll generally find **ANSI** layouts. **ISO** layouts are also not uncommon, but most of the time you'll have to use **solder PCBs**. Why's that? Because, since the ANSI layout is **more common**, the PCB is mostly designed for it. Also since **hotswap PCBs** use **sockets** they are less permissive because you have **less space on the PCB**. Where soldering PCBs **only require holes** (and no sockets), this way you can have **multiple layouts on the same PCB**. This also works for other **particular layouts** with split backspace, split left shift, etc. + +My recommendation is to **go for an ANSI layout** if you're a beginner. Even if you're used to the ISO layout, the transition is easy and you'll have more options for the PCBs (and for the boards), and later for the keycaps. + +--- +***TLDR; 🏷️*** **ANSI** layout = **US**. **ISO** layout = **EU**. **Go for ANSI** if you're a beginner, you'll have more options for everything. + +--- + +layouts + +*Some sizes of keyboards ([YouTube video of Hardware Canucks](https://www.youtube.com/watch?v=DWYxofVGIB0))* + +Now we'll be talking about the **size** of the keyboard. Note that sometimes the size can affect the layout. + +#### 65% - 75% + +**65%** and **75%** keyboards are in the most common sizes you'll find (maybe with 60%). They are also the sizes I recommend if you're a beginner. They are **compact** but you'll have everything you need without making compromises. + +- 65%: you **get rid** of the **F-row** (F1-F12) and the **numpad**. The **arrow keys** are integrated under the right shift key. This layout is the **most common in the hobby** and the perfect compromise between **compactness** and **functionality**. +- 75%: you **get rid** of the **numpad** but you keep the **F-row**. The **arrow keys** are integrated under the right shift key. This layout is also very common and it's perfect if you want to keep the F-row. Although, the keyboard will be bigger of course. + +layouts +layouts + +*65% and 75% layouts* + +#### 60% - 40% + +Although the **60%** gained a lot of popularity in the last years, **60%** and **40%** keyboards are not as common as the **65%** and **75%**. Unlike the previous sizes, you'll have to make some compromises. They are both still usable but it's not for everyone. + +- 60%: you **get rid** of the **F-row** (F1-F12), the **numpad** and the **arrow keys**. Although there are some compromises to make with this size, this is personally my **favorite one** in terms of **design**. You can find below different layouts for the **60%** (I love the HHKB layout). + +layouts + +*From Top to bottom: WK, WKL, HHKB* +
+
+ +- 40%: you **get rid** of the **F-row** (F1-F12), the **numpad**, the **arrow keys** and **number row**. This is one of the **smallest size** you can get. This size is also prone to ortholinear layouts. While being very small it is very practical to carry around. + +layouts +layouts + +*40% layout* + +#### TKL - 100% + +**TKL** and **100%** keyboards are the **biggest sizes** you can get. They are **not as common** in the hobby but are pretty well known by the public since it's the original keyboard size. They are **not as compact** as the previous sizes but they are **more functional**. + +- TKL: you **get rid** of the **numpad**. Pretty much the same as the **75%** but bigger. + +- 100%: you **get rid** of nothing. This is the **original keyboard size**. You have everything you need and more. This is the **most functional** size you can get. Although, it's **not as compact** as the previous sizes. This size can also be found in the **1800 layout, which is a more compact alternative. + +layouts +layouts + +*1800 and TKL layouts* + + +#### Alice - HHKB - Planck - Split + +You can find other crazy layouts out there. They are pretty niche and not for everyone. I won't go into details for each of them but I'll give you a quick overview. + +- Alice: a **split** keyboard with a **curved** layout. It's a **very ergonomic** layout. It's also a **very compact** layout. It's a **very popular** layout in the hobby. + +layouts + +*Alice layout* + +- HHKB: **H**appy **H**acking **K**ey**b**oard, is a **60%** layout with a **split backspace** and a **split right shift**. + +layouts + +*HHKB layout* + +- Planck: a **40%** layout with a **ortholinear** layout. It's a **very compact** layout. + +layouts + +*Planck layout* + +- Split: a **split** keyboard. It's a **very ergonomic** layout for typing, you can find it in different shapes and sizes. + +layouts + +*Split layout* + +--- +***TLDR; 🏷️*** I would recommend starting with something like a 65% or 75% keyboard. They are pretty common and functional. It will leave you more options later to choose the keycaps. + +--- + +### Switches + +As you understood, the switches are the **heart** of a mechanical keyboard. They are the ones that will make the **difference between a membrane keyboard and a mechanical keyboard**. There are a lot of different switches out there. I'll try to explain the main differences between them. + +#### Linear - Tactile - Clicky + +They are 3 main types of switches out there. They differ by the way they are **built**, and ultimately by the way they **feel**. + +switches +switches + +*Switch types & stems* + +- **Linear** - probably the most common type of switch, the activation is **linear** as the name suggested, meaning you're not going to experience a bump when pressing the key down. This type is also the most silent one. Widely used for **gaming**. The corresponding Cherry MX model for linear switches is **Red**. + +- **Tactile** - the activation is **tactile**, meaning you're going to experience a **bump** when pressing the key down. The corresponding Cherry MX model for tactile switches is **Brown**. + +- **Clicky** - the activation is **clicky**, meaning you're going to experience a **bump** and a **click** when pressing the key down. The corresponding Cherry MX model for clicky switches is **Blue**. + +Choosing a switch type is **very subjective**. It's all about **personal preference**. You can find a lot of **switch testers** out there to try different switches. You can also find a lot of **switch sound tests** on YouTube. + + + +#### Switch parts + +A switch is composed of **different parts**. The **housing**, the **spring** and the **stem**. The **housing** is the **main part** of the switch, it's the **part that will be soldered** to the PCB. The **spring** is the **part that will give the switch its weight**. The **stem** is the **part that will be pressed**. + +switches + +*From left to right: top housing, stem, spring, bottom housing* + +The stem is the **main difference** between the different types of switches. The **legs** of the stem are making a switch linear, tactile or clicky. + +The spring will change the **weight** of the switch. The **heavier** the spring, the **harder** it will be to press the switch. The **lighter** the spring, the **easier** it will be to press the switch. Usually, lighter weight is recommended for gaming, and heavier weight is recommended for typing. But again it's all about **personal preference**, you have to try it yourself to know what you like. + +#### Recommendations + +Don't overthink the choice of your switches. You can always try different things before making your choice, and as you're building more and more keyboards you'll be able to get comfortable with some types of switches and with a particular weight. + +Personally, I use both **tactile** and **linear** switches. I think I do prefer the feeling of tactiles to type, but the sound of linears is more pleasant and **thocky** most of the time. I started with pretty light switches but, as time goes by, I tend to prefer heavier switches. So don't be afraid to try different things! + +#### Brands + +When you'll begin looking for switches chances are you'll come across the most famous brands being: **Cherry**, **Gateron** and **Kailh**. But don't be afraid to look for other brands that can be sometimes better than traditional ones. Here is some recommendations: + +Linear + +- Gateron milky yellow +- Gateron oil king 🔥 +- Alpacas 🔥 + +Tactile + +- Boba U4T 🔥 +- Holy pandas 🔥 +- Durock T1 + +Clicky + +- Idk 🤷‍♂️ + +--- +***TLDR; 🏷️*** Linear, tactile, clicky. My personal favorites are Boba U4T for tactiles and Alpacas for linears. + +--- + +### Keycaps + +Now the fun part begins! + +keycaps + +*Keycaps set* + +Keycaps are the plastic cap that will cover your switches. It will define the look of your keyboard, this is what you should **spend the most time on**. If you buy on good websites you don't have to worry much about the quality but you should still be careful about the **compatibility** of the keycaps with your keyboard. That's why I recommend going for **65% ANSI layout for your first keyboard**. It's a pretty common layout and you'll have a **lot of options** for keycaps. + +*Pssst French people out there. Forgot about finding cool AZERTY keycaps, mostly it'll be QWERTY. But don't worry, you can still use the AZERTY layout on your keyboard. It's just a personal recommendation since it'll be a nightmare trying to find something AZERTY and if you do, most of the time, the quality will be poor. Just go for QWERTY if you matter about the aesthetic of your board!* + +#### Keyboard keycaps anatomy + +Another steal from my friends **[@keyboard.university](https://www.keyboard.university/100-courses/keycaps-101-ydy8j)** + +keycap_anatomy + +- **Alphas** - the main keys of the keyboard, the letters, numbers and spacebar. +- **Modifiers** - the keys that modify the behavior of the keyboard, like the shift key, control key, tab, etc... +- **Navigation keys** - the keys that are used to navigate through the computer, like the arrow keys, page up, page down, etc... +- **Function keys** - the keys that are used to perform a specific function, like the F1, F2, F3, etc... +- **Numpad** - the keys that are used to type numbers, and an extra enter key. + + +#### Material + +- PBT +- ABS + +The only thing you should know is that **PBT is very often a better choice**. It's more durable, **better quality**, and it doesn't shine as much as ABS. But it's also more expensive. So if you're on a budget, ABS "doubleshot" keycaps are still a good choice. + +#### Profile + +keycap_profiles + +*Keycaps profiles [@autonomous.ai](https://www.autonomous.ai/ourblog/guide-of-keycap-profiles-and-materials)* + +Profile is the **shape** of the keycaps. As you can see in the image above, the profile will make a keycap longer, shorter, more curved, etc... The shape also varies depending on the row of the keycaps. The **row** is the **horizontal line** of the keyboard. For instance, the top row will have higher keycaps with a different inclination than the bottom row. + +Although there are **flat** profile keycaps like: DSA, XDA, R3 SA, etc... + +The most common profile will be the **Cherry profile** and in my opinion, it's also the best looking one. + +#### Size + +*See [#master-the-vocabulary](#master-the-vocabulary)* + +When buying a keyboard you should find a **picture** of the **possible layout of the keyboard**. The numbers here represent the size of the keycaps that will fit the board. It's something you should pay attention to. If you want a particular design you'll have to make sure the keycaps set you're getting is compatible with your keyboard. + +tofu60 + +*Possible layout of the tofu60 2.0* + +For instance, if I want a layout with a split backspace (so 2x 1u keys instead of the 2u backspace) I'll have to make sure the keycaps set I'm getting has 2x 1u keys for the backspace, with the correct **profile** and printed with the correct **legend**. + +So let's say I want the split backspace. I'm looking at this set I like: + +keycaps_set + +*Keycaps set compatibility checks* + +The blue arrow is pointing at the traditional 2u backspace. But you can see that there is a part under for extra keys. You can see **on the left** that we have the **row numbers** displayed so we know on which row the keycaps should go. + +The red arrow points at the keycaps that will fit the split backspace. The 1u ***| /*** and the ***Delete*** key will go on the **first row** and the 1.75u ***Backspace*** key will go on the **second row**. So you should have something like this: + +keycaps_set + +*Split backspace layout* + +This is an example to show you the work you'll have to do to **check if the keycaps set** you like will **fit your board**. But don't worry most of the time the **sets will cover a wide variety of layouts**, especially for the most common one (like 65%). + +#### Brands/manufacturers + +Like the boards, the keycaps are **designed by independent designers** that will follow a norm to fit a specific manufacturer. + +- **GMK**: it's the reference for keycaps, GMK sets are known to be good quality but also to be pretty long to be delivered (for GBs). +- **ePBT**: a lot of the time sponsored by [KBDFans](https://kbdfans.com), with the PBTFans sets. They are also known to be good quality and cheaper than GMK. +- JTK +- Domikey +- Geekark +- Drop: more a reseller than a manufacturer, but they have their own keycaps sets. + +### Stabilizers + +A quick overview of the **stabilizers** that are also important when buying a keyboard. Most of the time the keyboard kit **should come with the stabilizers**, but sometimes you'll have to buy them separately. + +Stabilizers are used for keys that are **longer than 2u**. They are used to stabilize the keycaps and avoid wobble. They are also used for the spacebar. + +If bought separately make sure you're getting the correct sizes for the layout you choose (see [#size](#size)). The most common sizes are 2u, 2.25u, 2.75u, 6.25u and 7u. + +Some stabilizers will be **"clip-in"** and some will be **"screw-in"**. The clip-in are easier to install but the screw-in are more stable. + +stabs + +*Stabilizers* + +Stabilizers usually require **modding** to be better. See [#modding](#modding). + +This video summarizes different brands of stabilizers: + + + +### PCB + +The **PCB** is the **brain** of the keyboard. It's the **circuit board** that will **connect** the **switches** to the **computer**. It's also the **part** that will **control** the **RGB** and the **programming** of the keyboard. + +The PCB is also the part that will **determine the layout** of the keyboard. So if you want a specific layout you'll have to make sure the PCB you're getting is compatible with it. But usually, the PCB is included when buying a keyboard kit, so you don't have to worry about it. + +There are two types of PCBs: + +- **Hotswap**: you can **swap** the **switches** without having to **desolder** them. It's a good option if you want to **try different switches** or if you want to **change** them **easily**. But it's also a **bit more expensive**, and doesn't provide as many layout options as the solderable PCBs (due to the usage of sockets). + +- **Solderable**: you'll have to **solder** the **switches** to the PCB. It's a **bit cheaper** and you'll have more layout options. But you'll have to **desolder** the switches if you want to change them. Obviously, you'll need more tools and a bit more work. + +How to recognize a hotswap PCB? You'll see **sockets** on the PCB. On the other hand, a solderable PCB will have **holes** for the **switches pins** to go through, like this: + +hotswap_pcb +solderable_pcb + +*Hotswap PCB vs Solderable PCB - [Parallel keyboard](https://parallel.limited/)* + +### Plate + +The **plate** is the **part** that will **hold** the **switches** in place. This part will have a great impact on the **sound** of the keyboard and the **typing experience**. + +plate +plate + +*Plate - [Parallel keyboard](https://parallel.limited/)* + +The **plate material** will have a great impact on the sound of the keyboard. The most common materials are: + +- **Aluminum**: most common material, pretty stiff and heavy. +- **Carbon fiber**: light material. +- **POM**: plastic material, flexible and deeper sound. +- **FR4**: plastic material, middle way between POM and aluminum. +- **Brass**: heavy metallic material. +- **Polycarbonate**: plastic material, similar to POM. + +Plastic material plates will tend to be more flexible and have a deeper sound than metallic ones. + +Like everything else try them to see which one you prefer. See bellow videos to help you decide which one you should go for. I personally enjoy the **POM** and **FR4** plates a lot. + + + + + +### Prebuilt vs DIY + +## 🛍️Where to buy? + +## 👷How to build? + +### Tools + +You can get a basic toolkit for around 20€. You can find a lot of options on [Amazon](https://www.amazon.com/s?k=keyboard+toolkit&__mk_fr_FR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&ref=nb_sb_noss_2). You'll eventually need a screwdriver for screw-in stabilizers, but for the keeb itself most of the time the necessary tools to screw/unscrew the case/plate are included. The [wowstick](https://www.amazon.com/Tournevis-%C3%A9lectrique-Wowstick-tournevis-lithium-ion/dp/B07H27G9NF?th=1) is a really popular choice if you want to get a decent electric screwdriver. + +### Steps + +### Modding + +## 📷Cool content creators + +## 🔚Go further diff --git a/src/static/css/posts.css b/src/static/css/posts.css index 0236e06..ff12e68 100644 --- a/src/static/css/posts.css +++ b/src/static/css/posts.css @@ -1,3 +1,64 @@ .card-body a { text-decoration: underline; +} + +.text-pl { + color: #35283C; +} + +.card-body a.blog { + text-decoration: none; +} + +a.direct-link { + text-decoration: none; +} + +h1 { + font-size: 2.5rem; + font-weight: 600; + margin-bottom: 1rem; + margin-top: 1.2rem; + color: rgb(26, 26, 26); +} + +h2 { + font-size: 2rem; + font-weight: 600; + margin-bottom: 1rem; + margin-top: 3rem; + color: #40197e; +} + +h3 { + font-size: 1.5rem; + font-weight: 600; + margin-bottom: 1rem; + margin-top: 2.5rem; + color: #6535b1; +} + +h4 { + font-size: 1.25rem; + font-weight: 600; + margin-bottom: 1rem; + margin-top: 2rem; + color: #747474; +} + +.card-body p { + font-size: 19px; + color: #1d2122; + font-family: "Lato", sans-serif; +} + +#fixedbutton { + position: fixed; + bottom: 10px; + right: 20px; + z-index: 1000; + background-color: aliceblue; + color: #40197e; + display: none; + font-weight: 600; } \ No newline at end of file diff --git a/src/static/img/posts-img/keyboard-guide.png b/src/static/img/posts-img/keyboard-guide.png new file mode 100644 index 0000000..725f211 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide.png differ diff --git a/src/static/img/posts-img/keyboard-guide/100_layout.png b/src/static/img/posts-img/keyboard-guide/100_layout.png new file mode 100644 index 0000000..600cb70 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/100_layout.png differ diff --git a/src/static/img/posts-img/keyboard-guide/40_layout.png b/src/static/img/posts-img/keyboard-guide/40_layout.png new file mode 100644 index 0000000..dbddb2c Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/40_layout.png differ diff --git a/src/static/img/posts-img/keyboard-guide/40_layout_2.jpg b/src/static/img/posts-img/keyboard-guide/40_layout_2.jpg new file mode 100644 index 0000000..29bcf8c Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/40_layout_2.jpg differ diff --git a/src/static/img/posts-img/keyboard-guide/60_diff_layout.jpg b/src/static/img/posts-img/keyboard-guide/60_diff_layout.jpg new file mode 100644 index 0000000..e34a0f5 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/60_diff_layout.jpg differ diff --git a/src/static/img/posts-img/keyboard-guide/60_layout.png b/src/static/img/posts-img/keyboard-guide/60_layout.png new file mode 100644 index 0000000..de00166 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/60_layout.png differ diff --git a/src/static/img/posts-img/keyboard-guide/65_layout.png b/src/static/img/posts-img/keyboard-guide/65_layout.png new file mode 100644 index 0000000..aae2e8b Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/65_layout.png differ diff --git a/src/static/img/posts-img/keyboard-guide/75_layout.png b/src/static/img/posts-img/keyboard-guide/75_layout.png new file mode 100644 index 0000000..07d0f51 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/75_layout.png differ diff --git a/src/static/img/posts-img/keyboard-guide/GIF_MXRGB_Brown.gif b/src/static/img/posts-img/keyboard-guide/GIF_MXRGB_Brown.gif new file mode 100644 index 0000000..796851c Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/GIF_MXRGB_Brown.gif differ diff --git a/src/static/img/posts-img/keyboard-guide/IBM_Model_M.png b/src/static/img/posts-img/keyboard-guide/IBM_Model_M.png new file mode 100644 index 0000000..6b400c8 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/IBM_Model_M.png differ diff --git a/src/static/img/posts-img/keyboard-guide/alexotos_moontower.jpg b/src/static/img/posts-img/keyboard-guide/alexotos_moontower.jpg new file mode 100644 index 0000000..34fcf1b Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/alexotos_moontower.jpg differ diff --git a/src/static/img/posts-img/keyboard-guide/alice_layout.png b/src/static/img/posts-img/keyboard-guide/alice_layout.png new file mode 100644 index 0000000..ed2d11d Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/alice_layout.png differ diff --git a/src/static/img/posts-img/keyboard-guide/anatomy.jpg b/src/static/img/posts-img/keyboard-guide/anatomy.jpg new file mode 100644 index 0000000..93f85e0 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/anatomy.jpg differ diff --git a/src/static/img/posts-img/keyboard-guide/ansi_iso.png b/src/static/img/posts-img/keyboard-guide/ansi_iso.png new file mode 100644 index 0000000..976f85f Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/ansi_iso.png differ diff --git a/src/static/img/posts-img/keyboard-guide/cherryMX_brown.jpg b/src/static/img/posts-img/keyboard-guide/cherryMX_brown.jpg new file mode 100644 index 0000000..2ae6c26 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/cherryMX_brown.jpg differ diff --git a/src/static/img/posts-img/keyboard-guide/cherryMX_brown.png b/src/static/img/posts-img/keyboard-guide/cherryMX_brown.png new file mode 100644 index 0000000..ad820ac Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/cherryMX_brown.png differ diff --git a/src/static/img/posts-img/keyboard-guide/geekhack.png b/src/static/img/posts-img/keyboard-guide/geekhack.png new file mode 100644 index 0000000..ff14161 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/geekhack.png differ diff --git a/src/static/img/posts-img/keyboard-guide/hhkb_layout.jpg b/src/static/img/posts-img/keyboard-guide/hhkb_layout.jpg new file mode 100644 index 0000000..7ac57a7 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/hhkb_layout.jpg differ diff --git a/src/static/img/posts-img/keyboard-guide/hotswap_pcb.jpg b/src/static/img/posts-img/keyboard-guide/hotswap_pcb.jpg new file mode 100644 index 0000000..5e204ce Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/hotswap_pcb.jpg differ diff --git a/src/static/img/posts-img/keyboard-guide/keyboard_parts.png b/src/static/img/posts-img/keyboard-guide/keyboard_parts.png new file mode 100644 index 0000000..c578936 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/keyboard_parts.png differ diff --git a/src/static/img/posts-img/keyboard-guide/keycaps.png b/src/static/img/posts-img/keyboard-guide/keycaps.png new file mode 100644 index 0000000..6f9b76e Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/keycaps.png differ diff --git a/src/static/img/posts-img/keyboard-guide/keycaps_profile.jpg b/src/static/img/posts-img/keyboard-guide/keycaps_profile.jpg new file mode 100644 index 0000000..598f7d6 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/keycaps_profile.jpg differ diff --git a/src/static/img/posts-img/keyboard-guide/layout_size.jpeg b/src/static/img/posts-img/keyboard-guide/layout_size.jpeg new file mode 100644 index 0000000..aeb53f1 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/layout_size.jpeg differ diff --git a/src/static/img/posts-img/keyboard-guide/layout_size_explained.png b/src/static/img/posts-img/keyboard-guide/layout_size_explained.png new file mode 100644 index 0000000..93544ff Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/layout_size_explained.png differ diff --git a/src/static/img/posts-img/keyboard-guide/layouts.jpg b/src/static/img/posts-img/keyboard-guide/layouts.jpg new file mode 100644 index 0000000..348a0af Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/layouts.jpg differ diff --git a/src/static/img/posts-img/keyboard-guide/layouts_60.jpg b/src/static/img/posts-img/keyboard-guide/layouts_60.jpg new file mode 100644 index 0000000..859fc94 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/layouts_60.jpg differ diff --git a/src/static/img/posts-img/keyboard-guide/nk_cream.jpg b/src/static/img/posts-img/keyboard-guide/nk_cream.jpg new file mode 100644 index 0000000..b9a79ea Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/nk_cream.jpg differ diff --git a/src/static/img/posts-img/keyboard-guide/oil_king.jpeg b/src/static/img/posts-img/keyboard-guide/oil_king.jpeg new file mode 100644 index 0000000..baf69ca Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/oil_king.jpeg differ diff --git a/src/static/img/posts-img/keyboard-guide/planck_layout.png b/src/static/img/posts-img/keyboard-guide/planck_layout.png new file mode 100644 index 0000000..cffa18b Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/planck_layout.png differ diff --git a/src/static/img/posts-img/keyboard-guide/plate1.png b/src/static/img/posts-img/keyboard-guide/plate1.png new file mode 100644 index 0000000..e796d7e Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/plate1.png differ diff --git a/src/static/img/posts-img/keyboard-guide/plate2.png b/src/static/img/posts-img/keyboard-guide/plate2.png new file mode 100644 index 0000000..9ffede2 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/plate2.png differ diff --git a/src/static/img/posts-img/keyboard-guide/solderable_pcb.jpg b/src/static/img/posts-img/keyboard-guide/solderable_pcb.jpg new file mode 100644 index 0000000..aa98741 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/solderable_pcb.jpg differ diff --git a/src/static/img/posts-img/keyboard-guide/split_backspace_layout.png b/src/static/img/posts-img/keyboard-guide/split_backspace_layout.png new file mode 100644 index 0000000..1b9bc92 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/split_backspace_layout.png differ diff --git a/src/static/img/posts-img/keyboard-guide/split_layout.jpg b/src/static/img/posts-img/keyboard-guide/split_layout.jpg new file mode 100644 index 0000000..87afa50 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/split_layout.jpg differ diff --git a/src/static/img/posts-img/keyboard-guide/stabs.png b/src/static/img/posts-img/keyboard-guide/stabs.png new file mode 100644 index 0000000..deef1e1 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/stabs.png differ diff --git a/src/static/img/posts-img/keyboard-guide/switch_schema.png b/src/static/img/posts-img/keyboard-guide/switch_schema.png new file mode 100644 index 0000000..a21cdb8 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/switch_schema.png differ diff --git a/src/static/img/posts-img/keyboard-guide/switches.gif b/src/static/img/posts-img/keyboard-guide/switches.gif new file mode 100644 index 0000000..00674f6 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/switches.gif differ diff --git a/src/static/img/posts-img/keyboard-guide/switches_part.jpg b/src/static/img/posts-img/keyboard-guide/switches_part.jpg new file mode 100644 index 0000000..dca706f Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/switches_part.jpg differ diff --git a/src/static/img/posts-img/keyboard-guide/switches_stem.jpeg b/src/static/img/posts-img/keyboard-guide/switches_stem.jpeg new file mode 100644 index 0000000..32765d3 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/switches_stem.jpeg differ diff --git a/src/static/img/posts-img/keyboard-guide/tangerine.jpg b/src/static/img/posts-img/keyboard-guide/tangerine.jpg new file mode 100644 index 0000000..9545616 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/tangerine.jpg differ diff --git a/src/static/img/posts-img/keyboard-guide/tkl_layout.png b/src/static/img/posts-img/keyboard-guide/tkl_layout.png new file mode 100644 index 0000000..678ad1c Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/tkl_layout.png differ diff --git a/src/static/img/posts-img/keyboard-guide/tkl_layout_gmmk.png b/src/static/img/posts-img/keyboard-guide/tkl_layout_gmmk.png new file mode 100644 index 0000000..b24f64b Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/tkl_layout_gmmk.png differ diff --git a/src/static/img/posts-img/keyboard-guide/tlk_layout.webp b/src/static/img/posts-img/keyboard-guide/tlk_layout.webp new file mode 100644 index 0000000..e9c947b Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/tlk_layout.webp differ diff --git a/src/static/img/posts-img/keyboard-guide/tofu602.0.png b/src/static/img/posts-img/keyboard-guide/tofu602.0.png new file mode 100644 index 0000000..6d658b8 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/tofu602.0.png differ diff --git a/src/static/img/posts-img/keyboard-guide/tofu602.1.png b/src/static/img/posts-img/keyboard-guide/tofu602.1.png new file mode 100644 index 0000000..f1930e6 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/tofu602.1.png differ diff --git a/src/static/img/posts-img/keyboard-guide/tofu60_layout.png b/src/static/img/posts-img/keyboard-guide/tofu60_layout.png new file mode 100644 index 0000000..285f690 Binary files /dev/null and b/src/static/img/posts-img/keyboard-guide/tofu60_layout.png differ diff --git a/src/static/js/animation.js b/src/static/js/animation.js index b066bfc..be4e655 100644 --- a/src/static/js/animation.js +++ b/src/static/js/animation.js @@ -6,7 +6,7 @@ window.onload = function () { var sections = ["home", "about", "experiences", "skills", "hobbies", "contact"] - nextButton.addEventListener('click', event => { + nextButton.addEventListener('click', () => { var location = window.location.href.split("#")[1] if (!sections.includes(location)) { diff --git a/src/static/js/post.js b/src/static/js/post.js new file mode 100644 index 0000000..b72255a --- /dev/null +++ b/src/static/js/post.js @@ -0,0 +1,24 @@ +window.onload = function () { + var topButton = document.getElementById('fixedbutton'); + + function topFunction() { + document.body.scrollTop = 0; + document.documentElement.scrollTop = 0; + } + + topButton.addEventListener('click', () => { + topFunction(); + }); + + // on scroll + function scrollFunction() { + if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) { + topButton.style.display = "block"; + } else { + topButton.style.display = "none"; + } + } + + window.onscroll = function() {scrollFunction()}; +} +