diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..2661515
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,20 @@
+# Specify your website URL
+# APP_SITE=https://count.getloli.com
+
+# Application port
+APP_PORT=3000
+
+# Database type: either 'sqlite' or 'mongodb'
+DB_TYPE=sqlite
+
+# If using MongoDB, provide the connection string
+# DB_URL=mongodb://127.0.0.1:27017
+
+# Database write interval in seconds (0 for real-time)
+DB_INTERVAL=60
+
+# Log level: either 'debug' | 'info' | 'warn' | 'error' | 'none'
+LOG_LEVEL=debug
+
+# Google Analytics `G-Tag` ID
+# GA_ID=G-XXXX
diff --git a/.github/ISSUE_TEMPLATE/contribute-theme.yml b/.github/ISSUE_TEMPLATE/contribute-theme.yml
new file mode 100644
index 0000000..895d131
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/contribute-theme.yml
@@ -0,0 +1,39 @@
+name: Contribute Themes
+description: Contribute themes for everyone to use.
+title: "[Theme]: "
+labels: ["theme"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ ### Contribute themes is welcome! Please read this brief tips to get started:
+
+ - Create images of numbers from *0-9*, file type can be *jpeg, png, gif, webp*,
+ - Then named these images as *0.gif, 1.gif, ..., 9.gif* (or other extension).
+ - Try to ensure that each image has an equal height, and that the image size is not too large.
+ > Online image compressor: [TinyPNG](https://tinypng.com/) [Ezgif](https://ezgif.com/optimize)
+ - Then pack these images into a ZIP file.
+
+ Additionally, please refrain from using political figures or controversial figures or characters.
+ - type: checkboxes
+ id: tips
+ attributes:
+ label: Tips
+ options:
+ - label: I have read and understood the tips above
+ required: true
+ - type: input
+ id: name
+ attributes:
+ label: Theme Name
+ description: Describe this theme with a short name that can include letters, numbers, and hyphens
+ placeholder: ex. awesome
+ validations:
+ required: true
+ - type: textarea
+ id: theme
+ attributes:
+ label: Preview and ZIP file
+ description: Upload the theme preview, and ZIP file
+ validations:
+ required: true
diff --git a/.gitignore b/.gitignore
index b329f95..b079941 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,7 @@ count.db
# misc
.DS_Store
+.env
.env.local
.env.development.local
.env.test.local
diff --git a/README.md b/README.md
index a3d8cb3..99cf311 100644
--- a/README.md
+++ b/README.md
@@ -24,10 +24,245 @@ Multiple styles of Moe-Counters to choose from
##### gelbooru

+=======
+# *Moe Counter!*
+
+多种风格可选的萌萌计数器
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+More theme
+
+### *[Contribute themes is welcome!](https://github.com/journey-ad/Moe-Counter/issues/new?assignees=&labels=theme&projects=&template=contribute-theme.yml&title=%5BTheme%5D%3A+)*
+
+##### 3d-num
+
+
+
+##### ai-1
+
+
+
+##### asoul
+
+
+
+##### booru-ffsr
+
+
+
+##### booru-helltaker
+
+
+
+##### booru-huggboo
+
+
+
+##### booru-jaypee
+
+
+
+##### booru-koe
+
+
+
+##### booru-lewd
+
+
+
+##### booru-lisu
+
+
+
+##### booru-mjg
+
+
+
+##### booru-mof
+
+
+
+##### booru-nandroid
+
+
+
+##### booru-qualityhentais
+
+
+
+##### booru-r6gdrawfriends
+
+
+
+##### booru-rfck
+
+
+
+##### booru-smtg
+
+
+
+##### booru-snyde
+
+
+
+##### booru-the-collection
+
+
+
+##### booru-touhoulat
+
+
+
+##### booru-townofgravityfalls
+
+
+
+##### booru-twifanartsfw
+
+
+
+##### booru-ve
+
+
+
+##### booru-vivi
+
+
+
+##### booru-vp
+
+
+
+##### booru-yuyuyui
+
+
+
+##### capoo-1
+
+
+
+##### capoo-2
+
+
+
+##### e621
+
+
+
+##### food
+
+
+
+##### gelbooru
+
+
+
+##### green
+
+
+
+##### kasuterura-1
+
+
+
+##### kasuterura-2
+
+
+
+##### kasuterura-3
+
+
+
+##### kasuterura-4
+
+
+
+##### kyun
+
+
+
+##### love-and-deepspace
+
+
+
+##### minecraft
+
+
+
+##### moebooru
+
+
+
+##### morden-num
+
+
+
+##### nixietube-1
+
+
+
+##### nixietube-2
+
+
+
+##### normal-1
+
+
+
+##### normal-2
+
+
+
+##### original-new
+
+
+
+##### original-old
+
+
+
+##### rule34
+
+
+
+##### shimmie2
+
+
+
+##### sketch-1
+
+
+
+##### sketch-2
+
+
+
+
## Demo
[https://count.getloli.com](https://count.getloli.com)
+## How to use
+
+For information on counter usage and configuration, refer to the [demo website](https://count.getloli.com).
+
## Usage
### Install
@@ -38,14 +273,25 @@ Multiple styles of Moe-Counters to choose from
- Just hit the **Fork** button
- And hit the **Run** button
+#### Run on Glitch
+
+- Open [Glitch project](https://glitch.com/~moe-counter-api)
+- Just hit the **Remix your own** button
+- That's it!
+
#### Deploying on your own server
```shell
$ git clone https://github.com/journey-ad/Moe-Counter.git
$ cd Moe-Counter
+
$ yarn install
$ yarn start
+
+$ pnpm install
+
+$ pnpm run start
```
### Configuration
@@ -72,6 +318,30 @@ Replit can use Secrets, check [documentation](https://docs.replit.com/programmin
```
DB_URL="mongodb+srv://account:passwd@***.***.***.mongodb.net/db_count"
+=======
+Set `.env` file to specify the environment variables. *[.env.example](./.env.example)*
+
+```dosini
+# Specify your website URL
+# APP_SITE=https://count.getloli.com
+
+# Application port
+APP_PORT=3000
+
+# Database type: either 'sqlite' or 'mongodb'
+DB_TYPE=sqlite
+
+# If using MongoDB, provide the connection string
+# DB_URL=mongodb://127.0.0.1:27017
+
+# Database write interval in seconds (0 for real-time)
+DB_INTERVAL=60
+
+# Log level: either 'debug' | 'info' | 'warn' | 'error' | 'none'
+LOG_LEVEL=debug
+
+# Google Analytics `G-Tag` ID
+# GA_ID=G-XXXX
```
## Credits
@@ -86,3 +356,24 @@ DB_URL="mongodb+srv://account:passwd@***.***.***.mongodb.net/db_count"
## License
[](https://app.fossa.com/projects/git%2Bgithub.com%2Fjourney-ad%2FMoe-Counter?ref=badge_large)
+=======
+* [Glitch](https://glitch.com/)
+* [A-SOUL_Official](https://space.bilibili.com/703007996)
+* [moebooru](https://github.com/moebooru/moebooru)
+* gelbooru.com NSFW
+* [Icons8](https://icons8.com/icon/80355/star)
+* *And all booru site...*
+
+## License
+
+[MIT License](./LICENSE), excluding all themes
+
+---
+
+
+
+
+
+
+
+
diff --git a/assets/img/back-to-top.png b/assets/img/back-to-top.png
new file mode 100644
index 0000000..2aec0d6
Binary files /dev/null and b/assets/img/back-to-top.png differ
diff --git a/assets/img/failed.svg b/assets/img/failed.svg
new file mode 100644
index 0000000..35a9920
--- /dev/null
+++ b/assets/img/failed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/loading.svg b/assets/img/loading.svg
new file mode 100644
index 0000000..023b81b
--- /dev/null
+++ b/assets/img/loading.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/script.js b/assets/script.js
new file mode 100644
index 0000000..5c27b3d
--- /dev/null
+++ b/assets/script.js
@@ -0,0 +1,208 @@
+(function () {
+ const btn = document.getElementById('get');
+ const img = document.getElementById('result');
+ const code = document.getElementById('code');
+
+ const elements = {
+ name: document.getElementById('name'),
+ theme: document.getElementById('theme'),
+ padding: document.getElementById('padding'),
+ offset: document.getElementById('offset'),
+ align: document.getElementById('align'),
+ scale: document.getElementById('scale'),
+ pixelated: document.getElementById('pixelated'),
+ darkmode: document.getElementById('darkmode'),
+ num: document.getElementById('num'),
+ prefix: document.getElementById('prefix')
+ };
+
+ btn.addEventListener('click', throttle(handleButtonClick, 500));
+ code.addEventListener('click', selectCodeText);
+
+ const mainTitle = document.querySelector('#main_title i');
+ const themes = document.querySelector('#themes');
+ const moreTheme = document.querySelector('#more_theme');
+
+ mainTitle.addEventListener('click', throttle(() => party.sparkles(document.documentElement, { count: party.variation.range(40, 100) }), 1000));
+ moreTheme.addEventListener('click', scrollToThemes);
+
+ function handleButtonClick() {
+ const { name, theme, padding, offset, scale, pixelated, darkmode, num } = elements;
+ const nameValue = name.value.trim();
+
+ if (!nameValue) {
+ alert('Please input counter name.');
+ return;
+ }
+
+ const params = {
+ name: nameValue,
+ theme: theme.value || 'moebooru',
+ padding: padding.value || '7',
+ offset: offset.value || '0',
+ align: align.value || 'top',
+ scale: scale.value || '1',
+ pixelated: pixelated.checked ? '1' : '0',
+ darkmode: darkmode.value || 'auto'
+ };
+
+ if (num.value > 0) {
+ params.num = num.value;
+ }
+ if (prefix.value !== '') {
+ params.prefix = prefix.value;
+ }
+
+ const query = new URLSearchParams(params).toString();
+ const imgSrc = `${__global_data.site}/@${nameValue}?${query}`;
+
+ img.src = `${imgSrc}&_=${Math.random()}`;
+ btn.setAttribute('disabled', '');
+
+ img.onload = () => {
+ img.scrollIntoView({ block: 'start', behavior: 'smooth' });
+ code.textContent = imgSrc;
+ code.style.visibility = 'visible';
+ party.confetti(btn, { count: party.variation.range(20, 40) });
+ btn.removeAttribute('disabled');
+ };
+
+ img.onerror = async () => {
+ try {
+ const res = await fetch(img.src);
+ if (!res.ok) {
+ const { message } = await res.json();
+ alert(message);
+ }
+ } finally {
+ btn.removeAttribute('disabled');
+ }
+ };
+ }
+
+ function selectCodeText(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ const target = e.target;
+ const range = document.createRange();
+ const selection = window.getSelection();
+
+ range.selectNodeContents(target);
+ selection.removeAllRanges();
+ selection.addRange(range);
+ }
+
+ function scrollToThemes() {
+ if (!themes.hasAttribute('open')) {
+ party.sparkles(moreTheme.querySelector('h3'), { count: party.variation.range(20, 40) });
+ themes.scrollIntoView({ block: 'start', behavior: 'smooth' });
+ }
+ }
+
+ function throttle(fn, threshold = 250) {
+ let last, deferTimer;
+ return function (...args) {
+ const now = Date.now();
+ if (last && now < last + threshold) {
+ clearTimeout(deferTimer);
+ deferTimer = setTimeout(() => {
+ last = now;
+ fn.apply(this, args);
+ }, threshold);
+ } else {
+ last = now;
+ fn.apply(this, args);
+ }
+ };
+ }
+})();
+
+// Lazy Load
+(() => {
+ function lazyLoad(options = {}) {
+ const { selector = 'img[data-src]:not([src])', loading = '', failed = '', rootMargin = '200px', threshold = 0.01 } = options;
+
+ const images = document.querySelectorAll(selector);
+
+ const observer = new IntersectionObserver((entries, observer) => {
+ entries.forEach(entry => {
+ if (entry.isIntersecting) {
+ const img = entry.target;
+ observer.unobserve(img);
+
+ img.onerror = failed ? () => { img.src = failed; img.setAttribute('data-failed', ''); } : null;
+ img.src = img.getAttribute('data-src');
+ img.removeAttribute('data-loading');
+ }
+ });
+ }, { rootMargin, threshold });
+
+ images.forEach(img => {
+ if (loading) {
+ img.src = loading;
+ img.setAttribute('data-loading', '');
+ }
+ observer.observe(img);
+ });
+ }
+
+ const lazyLoadOptions = {
+ selector: 'img[data-src]:not([src])',
+ loading: `${__global_data.site}/img/loading.svg`,
+ failed: `${__global_data.site}/img/failed.svg`,
+ rootMargin: '200px',
+ threshold: 0.01
+ };
+
+ document.readyState === 'loading'
+ ? document.addEventListener("DOMContentLoaded", () => lazyLoad(lazyLoadOptions))
+ : lazyLoad(lazyLoadOptions);
+})();
+
+// Back to top
+(() => {
+ let isShow = false, lock = false;
+ const btn = document.querySelector('.back-to-top');
+
+ const handleScroll = () => {
+ if (lock) return;
+ if (document.body.scrollTop >= 1000) {
+ if (!isShow) {
+ btn.classList.add('load');
+ isShow = true;
+ }
+ } else if (isShow) {
+ btn.classList.remove('load');
+ isShow = false;
+ }
+ };
+
+ const handleClick = () => {
+ lock = true;
+ btn.classList.add('ani-leave');
+ window.scrollTo({ top: 0, behavior: 'smooth' });
+
+ setTimeout(() => {
+ btn.classList.remove('ani-leave');
+ btn.classList.add('leaved');
+ }, 390);
+
+ setTimeout(() => btn.classList.add('ending'), 120);
+ setTimeout(() => btn.classList.remove('load'), 1500);
+
+ setTimeout(() => {
+ lock = false;
+ isShow = false;
+ btn.classList.remove('leaved', 'ending');
+ }, 2000);
+ };
+
+ window.addEventListener('scroll', handleScroll);
+ btn.addEventListener('click', handleClick);
+})();
+
+// Prevent safari gesture
+(() => {
+ document.addEventListener('gesturestart', e => e.preventDefault());
+})();
diff --git a/assets/style.css b/assets/style.css
deleted file mode 100644
index 7a37b12..0000000
--- a/assets/style.css
+++ /dev/null
@@ -1,5 +0,0 @@
-@media screen and (max-width: 900px) {
- iframe {
- display: none;
- }
-}
\ No newline at end of file
diff --git a/assets/style.less b/assets/style.less
new file mode 100644
index 0000000..eeac11e
--- /dev/null
+++ b/assets/style.less
@@ -0,0 +1,243 @@
+html {
+ scroll-padding: 50px 0;
+}
+
+#main_title {
+ margin-top: 0.5em;
+}
+
+#themes {
+ margin-top: 2em;
+
+ & > p {
+ margin: 0;
+ }
+}
+
+#more_theme h3 {
+ display: inline-block;
+ margin: 0;
+ cursor: pointer;
+}
+
+#get {
+ margin-bottom: 1em;
+}
+
+#code {
+ visibility: hidden;
+ display: inline-block;
+ margin-bottom: 1em;
+}
+
+#result {
+ display: block;
+}
+
+.github {
+ margin-top: 2em;
+}
+
+code {
+ word-break: break-all;
+}
+
+input[type="checkbox"][role="switch"] {
+ height: 0;
+ width: 0;
+ visibility: hidden;
+
+ & + label {
+ cursor: pointer;
+ width: 3.6em;
+ height: 1.8em;
+ margin: 0;
+ background: grey;
+ display: block;
+ border-radius: 1.8em;
+ position: relative;
+ transition: 0.3s;
+
+ &:active:after {
+ width: 2.34em;
+ }
+
+ &:after {
+ content: "";
+ position: absolute;
+ top: 0.1em;
+ left: 0.1em;
+ width: 1.6em;
+ height: 1.6em;
+ background: #fff;
+ border-radius: 1.6em;
+ transition: 0.3s;
+ }
+
+ span {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 0 12.5%;
+ font-size: 10px;
+
+ &::before,
+ &::after {
+ display: block;
+ color: #fff;
+ font-weight: bold;
+ box-sizing: border-box;
+ }
+
+ &::before {
+ content: "ON";
+ }
+
+ &::after {
+ content: "OFF";
+ color: #ccc;
+ }
+ }
+ }
+
+ &:checked + label {
+ background: var(--b-btn-bg);
+
+ &:after {
+ left: calc(100% - 0.1em);
+ transform: translateX(-100%);
+ }
+ }
+}
+
+img[data-loading],
+img[data-failed] {
+ width: 40px;
+}
+
+details > summary {
+ list-style: none;
+
+ &::-webkit-details-marker,
+ &::marker {
+ display: none;
+ }
+}
+
+summary::before {
+ border-bottom: 6px solid transparent;
+ border-left: 10px solid var(--b-txt);
+ border-top: 6px solid transparent;
+ content: "";
+ display: inline-block;
+ height: 0;
+ margin-right: 10px;
+ position: relative;
+ transition: 0.2s;
+ width: 0;
+}
+
+details[open] summary::before {
+ transform: rotate(90deg);
+}
+
+h2,
+h3,
+h4,
+h5 {
+ margin: 1.5em 0 0.6em;
+}
+
+table {
+ tr {
+ .caption {
+ margin: 1em 0 0;
+ }
+ }
+}
+
+.back-to-top {
+ position: fixed;
+ z-index: 2;
+ right: -108px;
+ bottom: 0;
+ width: 108px;
+ height: 150px;
+ background: url("./img/back-to-top.png?v=1") no-repeat 0 0;
+ background-size: 108px 450px;
+ opacity: 0.6;
+ transition: opacity 0.3s, right 0.8s;
+ cursor: pointer;
+
+ &:hover {
+ background-position: 0 -150px;
+ opacity: 1;
+ }
+
+ &::after {
+ content: "";
+ position: fixed;
+ z-index: 2;
+ right: 0;
+ bottom: 0;
+ width: 108px;
+ height: 150px;
+ background: url("./img/back-to-top.png?v=1") no-repeat 0 0;
+ background-size: 108px 450px;
+ background-position: 0 -300px;
+ transition: opacity 0.3s;
+ opacity: 0;
+ pointer-events: none;
+ }
+
+ &.load {
+ right: 0;
+ }
+
+ &.ani-leave {
+ background-position: 0 -150px;
+ animation: ani-leave 390ms ease-in-out forwards;
+
+ @keyframes ani-leave {
+ 0% {
+ transform: translateX(0);
+ }
+
+ 100% {
+ transform: translateX(108px);
+ }
+ }
+ }
+
+ &.leaved,
+ &.ending {
+ pointer-events: none;
+ }
+
+ &.leaved {
+ background: none;
+ transition: none;
+ }
+
+ &.ending::after {
+ opacity: 1;
+ transition-delay: 0.35s;
+ }
+}
+
+@media screen and (min-width: 800px) {
+ body {
+ max-width: ~"min(90%, 800px)";
+ }
+}
+
+@media screen and (max-width: 900px) {
+ iframe {
+ display: none;
+ }
+}
diff --git a/assets/theme/3d-num/0.gif b/assets/theme/3d-num/0.gif
new file mode 100644
index 0000000..f8bf0fd
Binary files /dev/null and b/assets/theme/3d-num/0.gif differ
diff --git a/assets/theme/3d-num/1.gif b/assets/theme/3d-num/1.gif
new file mode 100644
index 0000000..4acaae8
Binary files /dev/null and b/assets/theme/3d-num/1.gif differ
diff --git a/assets/theme/3d-num/2.gif b/assets/theme/3d-num/2.gif
new file mode 100644
index 0000000..0640b3f
Binary files /dev/null and b/assets/theme/3d-num/2.gif differ
diff --git a/assets/theme/3d-num/3.gif b/assets/theme/3d-num/3.gif
new file mode 100644
index 0000000..7a9e794
Binary files /dev/null and b/assets/theme/3d-num/3.gif differ
diff --git a/assets/theme/3d-num/4.gif b/assets/theme/3d-num/4.gif
new file mode 100644
index 0000000..822e235
Binary files /dev/null and b/assets/theme/3d-num/4.gif differ
diff --git a/assets/theme/3d-num/5.gif b/assets/theme/3d-num/5.gif
new file mode 100644
index 0000000..7bba7c1
Binary files /dev/null and b/assets/theme/3d-num/5.gif differ
diff --git a/assets/theme/3d-num/6.gif b/assets/theme/3d-num/6.gif
new file mode 100644
index 0000000..7839936
Binary files /dev/null and b/assets/theme/3d-num/6.gif differ
diff --git a/assets/theme/3d-num/7.gif b/assets/theme/3d-num/7.gif
new file mode 100644
index 0000000..de7aa9e
Binary files /dev/null and b/assets/theme/3d-num/7.gif differ
diff --git a/assets/theme/3d-num/8.gif b/assets/theme/3d-num/8.gif
new file mode 100644
index 0000000..922efa3
Binary files /dev/null and b/assets/theme/3d-num/8.gif differ
diff --git a/assets/theme/3d-num/9.gif b/assets/theme/3d-num/9.gif
new file mode 100644
index 0000000..3d28498
Binary files /dev/null and b/assets/theme/3d-num/9.gif differ
diff --git a/assets/theme/ai-1/0.png b/assets/theme/ai-1/0.png
new file mode 100644
index 0000000..fced22b
Binary files /dev/null and b/assets/theme/ai-1/0.png differ
diff --git a/assets/theme/ai-1/1.png b/assets/theme/ai-1/1.png
new file mode 100644
index 0000000..2fdd640
Binary files /dev/null and b/assets/theme/ai-1/1.png differ
diff --git a/assets/theme/ai-1/2.png b/assets/theme/ai-1/2.png
new file mode 100644
index 0000000..db4bb49
Binary files /dev/null and b/assets/theme/ai-1/2.png differ
diff --git a/assets/theme/ai-1/3.png b/assets/theme/ai-1/3.png
new file mode 100644
index 0000000..36a8b11
Binary files /dev/null and b/assets/theme/ai-1/3.png differ
diff --git a/assets/theme/ai-1/4.png b/assets/theme/ai-1/4.png
new file mode 100644
index 0000000..5170f43
Binary files /dev/null and b/assets/theme/ai-1/4.png differ
diff --git a/assets/theme/ai-1/5.png b/assets/theme/ai-1/5.png
new file mode 100644
index 0000000..91698b3
Binary files /dev/null and b/assets/theme/ai-1/5.png differ
diff --git a/assets/theme/ai-1/6.png b/assets/theme/ai-1/6.png
new file mode 100644
index 0000000..082fad1
Binary files /dev/null and b/assets/theme/ai-1/6.png differ
diff --git a/assets/theme/ai-1/7.png b/assets/theme/ai-1/7.png
new file mode 100644
index 0000000..cbe848d
Binary files /dev/null and b/assets/theme/ai-1/7.png differ
diff --git a/assets/theme/ai-1/8.png b/assets/theme/ai-1/8.png
new file mode 100644
index 0000000..4e049b2
Binary files /dev/null and b/assets/theme/ai-1/8.png differ
diff --git a/assets/theme/ai-1/9.png b/assets/theme/ai-1/9.png
new file mode 100644
index 0000000..126b1a2
Binary files /dev/null and b/assets/theme/ai-1/9.png differ
diff --git a/assets/theme/booru-ffsr/0.gif b/assets/theme/booru-ffsr/0.gif
new file mode 100644
index 0000000..b56947a
Binary files /dev/null and b/assets/theme/booru-ffsr/0.gif differ
diff --git a/assets/theme/booru-ffsr/1.gif b/assets/theme/booru-ffsr/1.gif
new file mode 100644
index 0000000..8338811
Binary files /dev/null and b/assets/theme/booru-ffsr/1.gif differ
diff --git a/assets/theme/booru-ffsr/2.gif b/assets/theme/booru-ffsr/2.gif
new file mode 100644
index 0000000..db34ac4
Binary files /dev/null and b/assets/theme/booru-ffsr/2.gif differ
diff --git a/assets/theme/booru-ffsr/3.gif b/assets/theme/booru-ffsr/3.gif
new file mode 100644
index 0000000..900e836
Binary files /dev/null and b/assets/theme/booru-ffsr/3.gif differ
diff --git a/assets/theme/booru-ffsr/4.gif b/assets/theme/booru-ffsr/4.gif
new file mode 100644
index 0000000..d598a15
Binary files /dev/null and b/assets/theme/booru-ffsr/4.gif differ
diff --git a/assets/theme/booru-ffsr/5.gif b/assets/theme/booru-ffsr/5.gif
new file mode 100644
index 0000000..799afe7
Binary files /dev/null and b/assets/theme/booru-ffsr/5.gif differ
diff --git a/assets/theme/booru-ffsr/6.gif b/assets/theme/booru-ffsr/6.gif
new file mode 100644
index 0000000..23ff5ca
Binary files /dev/null and b/assets/theme/booru-ffsr/6.gif differ
diff --git a/assets/theme/booru-ffsr/7.gif b/assets/theme/booru-ffsr/7.gif
new file mode 100644
index 0000000..10b2f2f
Binary files /dev/null and b/assets/theme/booru-ffsr/7.gif differ
diff --git a/assets/theme/booru-ffsr/8.gif b/assets/theme/booru-ffsr/8.gif
new file mode 100644
index 0000000..02c530b
Binary files /dev/null and b/assets/theme/booru-ffsr/8.gif differ
diff --git a/assets/theme/booru-ffsr/9.gif b/assets/theme/booru-ffsr/9.gif
new file mode 100644
index 0000000..a886827
Binary files /dev/null and b/assets/theme/booru-ffsr/9.gif differ
diff --git a/assets/theme/booru-helltaker/0.gif b/assets/theme/booru-helltaker/0.gif
new file mode 100644
index 0000000..112ae96
Binary files /dev/null and b/assets/theme/booru-helltaker/0.gif differ
diff --git a/assets/theme/booru-helltaker/1.gif b/assets/theme/booru-helltaker/1.gif
new file mode 100644
index 0000000..8993c2f
Binary files /dev/null and b/assets/theme/booru-helltaker/1.gif differ
diff --git a/assets/theme/booru-helltaker/2.gif b/assets/theme/booru-helltaker/2.gif
new file mode 100644
index 0000000..8722806
Binary files /dev/null and b/assets/theme/booru-helltaker/2.gif differ
diff --git a/assets/theme/booru-helltaker/3.gif b/assets/theme/booru-helltaker/3.gif
new file mode 100644
index 0000000..71e6aa6
Binary files /dev/null and b/assets/theme/booru-helltaker/3.gif differ
diff --git a/assets/theme/booru-helltaker/4.gif b/assets/theme/booru-helltaker/4.gif
new file mode 100644
index 0000000..e952af7
Binary files /dev/null and b/assets/theme/booru-helltaker/4.gif differ
diff --git a/assets/theme/booru-helltaker/5.gif b/assets/theme/booru-helltaker/5.gif
new file mode 100644
index 0000000..461f390
Binary files /dev/null and b/assets/theme/booru-helltaker/5.gif differ
diff --git a/assets/theme/booru-helltaker/6.gif b/assets/theme/booru-helltaker/6.gif
new file mode 100644
index 0000000..de44f5a
Binary files /dev/null and b/assets/theme/booru-helltaker/6.gif differ
diff --git a/assets/theme/booru-helltaker/7.gif b/assets/theme/booru-helltaker/7.gif
new file mode 100644
index 0000000..8e30eb4
Binary files /dev/null and b/assets/theme/booru-helltaker/7.gif differ
diff --git a/assets/theme/booru-helltaker/8.gif b/assets/theme/booru-helltaker/8.gif
new file mode 100644
index 0000000..4db4abd
Binary files /dev/null and b/assets/theme/booru-helltaker/8.gif differ
diff --git a/assets/theme/booru-helltaker/9.gif b/assets/theme/booru-helltaker/9.gif
new file mode 100644
index 0000000..679cc9b
Binary files /dev/null and b/assets/theme/booru-helltaker/9.gif differ
diff --git a/assets/theme/booru-huggboo/0.gif b/assets/theme/booru-huggboo/0.gif
new file mode 100644
index 0000000..06118ad
Binary files /dev/null and b/assets/theme/booru-huggboo/0.gif differ
diff --git a/assets/theme/booru-huggboo/1.gif b/assets/theme/booru-huggboo/1.gif
new file mode 100644
index 0000000..744c363
Binary files /dev/null and b/assets/theme/booru-huggboo/1.gif differ
diff --git a/assets/theme/booru-huggboo/2.gif b/assets/theme/booru-huggboo/2.gif
new file mode 100644
index 0000000..79452e3
Binary files /dev/null and b/assets/theme/booru-huggboo/2.gif differ
diff --git a/assets/theme/booru-huggboo/3.gif b/assets/theme/booru-huggboo/3.gif
new file mode 100644
index 0000000..e74a450
Binary files /dev/null and b/assets/theme/booru-huggboo/3.gif differ
diff --git a/assets/theme/booru-huggboo/4.gif b/assets/theme/booru-huggboo/4.gif
new file mode 100644
index 0000000..26c20d4
Binary files /dev/null and b/assets/theme/booru-huggboo/4.gif differ
diff --git a/assets/theme/booru-huggboo/5.gif b/assets/theme/booru-huggboo/5.gif
new file mode 100644
index 0000000..9636b98
Binary files /dev/null and b/assets/theme/booru-huggboo/5.gif differ
diff --git a/assets/theme/booru-huggboo/6.gif b/assets/theme/booru-huggboo/6.gif
new file mode 100644
index 0000000..c0c4a16
Binary files /dev/null and b/assets/theme/booru-huggboo/6.gif differ
diff --git a/assets/theme/booru-huggboo/7.gif b/assets/theme/booru-huggboo/7.gif
new file mode 100644
index 0000000..d43c771
Binary files /dev/null and b/assets/theme/booru-huggboo/7.gif differ
diff --git a/assets/theme/booru-huggboo/8.gif b/assets/theme/booru-huggboo/8.gif
new file mode 100644
index 0000000..3721ed5
Binary files /dev/null and b/assets/theme/booru-huggboo/8.gif differ
diff --git a/assets/theme/booru-huggboo/9.gif b/assets/theme/booru-huggboo/9.gif
new file mode 100644
index 0000000..f1f224d
Binary files /dev/null and b/assets/theme/booru-huggboo/9.gif differ
diff --git a/assets/theme/booru-jaypee/0.gif b/assets/theme/booru-jaypee/0.gif
new file mode 100644
index 0000000..576c6aa
Binary files /dev/null and b/assets/theme/booru-jaypee/0.gif differ
diff --git a/assets/theme/booru-jaypee/1.gif b/assets/theme/booru-jaypee/1.gif
new file mode 100644
index 0000000..5490a01
Binary files /dev/null and b/assets/theme/booru-jaypee/1.gif differ
diff --git a/assets/theme/booru-jaypee/2.gif b/assets/theme/booru-jaypee/2.gif
new file mode 100644
index 0000000..276a535
Binary files /dev/null and b/assets/theme/booru-jaypee/2.gif differ
diff --git a/assets/theme/booru-jaypee/3.gif b/assets/theme/booru-jaypee/3.gif
new file mode 100644
index 0000000..2f0e693
Binary files /dev/null and b/assets/theme/booru-jaypee/3.gif differ
diff --git a/assets/theme/booru-jaypee/4.gif b/assets/theme/booru-jaypee/4.gif
new file mode 100644
index 0000000..b78acde
Binary files /dev/null and b/assets/theme/booru-jaypee/4.gif differ
diff --git a/assets/theme/booru-jaypee/5.gif b/assets/theme/booru-jaypee/5.gif
new file mode 100644
index 0000000..cb4ee1a
Binary files /dev/null and b/assets/theme/booru-jaypee/5.gif differ
diff --git a/assets/theme/booru-jaypee/6.gif b/assets/theme/booru-jaypee/6.gif
new file mode 100644
index 0000000..176217b
Binary files /dev/null and b/assets/theme/booru-jaypee/6.gif differ
diff --git a/assets/theme/booru-jaypee/7.gif b/assets/theme/booru-jaypee/7.gif
new file mode 100644
index 0000000..664cb4c
Binary files /dev/null and b/assets/theme/booru-jaypee/7.gif differ
diff --git a/assets/theme/booru-jaypee/8.gif b/assets/theme/booru-jaypee/8.gif
new file mode 100644
index 0000000..4eb459c
Binary files /dev/null and b/assets/theme/booru-jaypee/8.gif differ
diff --git a/assets/theme/booru-jaypee/9.gif b/assets/theme/booru-jaypee/9.gif
new file mode 100644
index 0000000..f7f1dba
Binary files /dev/null and b/assets/theme/booru-jaypee/9.gif differ
diff --git a/assets/theme/booru-koe/0.gif b/assets/theme/booru-koe/0.gif
new file mode 100644
index 0000000..b4f7357
Binary files /dev/null and b/assets/theme/booru-koe/0.gif differ
diff --git a/assets/theme/booru-koe/1.gif b/assets/theme/booru-koe/1.gif
new file mode 100644
index 0000000..e0bd727
Binary files /dev/null and b/assets/theme/booru-koe/1.gif differ
diff --git a/assets/theme/booru-koe/2.gif b/assets/theme/booru-koe/2.gif
new file mode 100644
index 0000000..0480e41
Binary files /dev/null and b/assets/theme/booru-koe/2.gif differ
diff --git a/assets/theme/booru-koe/3.gif b/assets/theme/booru-koe/3.gif
new file mode 100644
index 0000000..813c4fa
Binary files /dev/null and b/assets/theme/booru-koe/3.gif differ
diff --git a/assets/theme/booru-koe/4.gif b/assets/theme/booru-koe/4.gif
new file mode 100644
index 0000000..69fdfe0
Binary files /dev/null and b/assets/theme/booru-koe/4.gif differ
diff --git a/assets/theme/booru-koe/5.gif b/assets/theme/booru-koe/5.gif
new file mode 100644
index 0000000..2f7382c
Binary files /dev/null and b/assets/theme/booru-koe/5.gif differ
diff --git a/assets/theme/booru-koe/6.gif b/assets/theme/booru-koe/6.gif
new file mode 100644
index 0000000..d07dd74
Binary files /dev/null and b/assets/theme/booru-koe/6.gif differ
diff --git a/assets/theme/booru-koe/7.gif b/assets/theme/booru-koe/7.gif
new file mode 100644
index 0000000..3aef98d
Binary files /dev/null and b/assets/theme/booru-koe/7.gif differ
diff --git a/assets/theme/booru-koe/8.gif b/assets/theme/booru-koe/8.gif
new file mode 100644
index 0000000..5fc0447
Binary files /dev/null and b/assets/theme/booru-koe/8.gif differ
diff --git a/assets/theme/booru-koe/9.gif b/assets/theme/booru-koe/9.gif
new file mode 100644
index 0000000..f0a08c1
Binary files /dev/null and b/assets/theme/booru-koe/9.gif differ
diff --git a/assets/theme/booru-lewd/0.gif b/assets/theme/booru-lewd/0.gif
new file mode 100644
index 0000000..3512b00
Binary files /dev/null and b/assets/theme/booru-lewd/0.gif differ
diff --git a/assets/theme/booru-lewd/1.gif b/assets/theme/booru-lewd/1.gif
new file mode 100644
index 0000000..b292edd
Binary files /dev/null and b/assets/theme/booru-lewd/1.gif differ
diff --git a/assets/theme/booru-lewd/2.gif b/assets/theme/booru-lewd/2.gif
new file mode 100644
index 0000000..455dae3
Binary files /dev/null and b/assets/theme/booru-lewd/2.gif differ
diff --git a/assets/theme/booru-lewd/3.gif b/assets/theme/booru-lewd/3.gif
new file mode 100644
index 0000000..6d266c8
Binary files /dev/null and b/assets/theme/booru-lewd/3.gif differ
diff --git a/assets/theme/booru-lewd/4.gif b/assets/theme/booru-lewd/4.gif
new file mode 100644
index 0000000..7dec2c2
Binary files /dev/null and b/assets/theme/booru-lewd/4.gif differ
diff --git a/assets/theme/booru-lewd/5.gif b/assets/theme/booru-lewd/5.gif
new file mode 100644
index 0000000..e89449d
Binary files /dev/null and b/assets/theme/booru-lewd/5.gif differ
diff --git a/assets/theme/booru-lewd/6.gif b/assets/theme/booru-lewd/6.gif
new file mode 100644
index 0000000..3869b82
Binary files /dev/null and b/assets/theme/booru-lewd/6.gif differ
diff --git a/assets/theme/booru-lewd/7.gif b/assets/theme/booru-lewd/7.gif
new file mode 100644
index 0000000..5b29513
Binary files /dev/null and b/assets/theme/booru-lewd/7.gif differ
diff --git a/assets/theme/booru-lewd/8.gif b/assets/theme/booru-lewd/8.gif
new file mode 100644
index 0000000..e75867a
Binary files /dev/null and b/assets/theme/booru-lewd/8.gif differ
diff --git a/assets/theme/booru-lewd/9.gif b/assets/theme/booru-lewd/9.gif
new file mode 100644
index 0000000..7c01747
Binary files /dev/null and b/assets/theme/booru-lewd/9.gif differ
diff --git a/assets/theme/booru-lisu/0.gif b/assets/theme/booru-lisu/0.gif
new file mode 100644
index 0000000..b402b58
Binary files /dev/null and b/assets/theme/booru-lisu/0.gif differ
diff --git a/assets/theme/booru-lisu/1.gif b/assets/theme/booru-lisu/1.gif
new file mode 100644
index 0000000..f16b963
Binary files /dev/null and b/assets/theme/booru-lisu/1.gif differ
diff --git a/assets/theme/booru-lisu/2.gif b/assets/theme/booru-lisu/2.gif
new file mode 100644
index 0000000..f3c6a2b
Binary files /dev/null and b/assets/theme/booru-lisu/2.gif differ
diff --git a/assets/theme/booru-lisu/3.gif b/assets/theme/booru-lisu/3.gif
new file mode 100644
index 0000000..e537242
Binary files /dev/null and b/assets/theme/booru-lisu/3.gif differ
diff --git a/assets/theme/booru-lisu/4.gif b/assets/theme/booru-lisu/4.gif
new file mode 100644
index 0000000..d4ec013
Binary files /dev/null and b/assets/theme/booru-lisu/4.gif differ
diff --git a/assets/theme/booru-lisu/5.gif b/assets/theme/booru-lisu/5.gif
new file mode 100644
index 0000000..2015552
Binary files /dev/null and b/assets/theme/booru-lisu/5.gif differ
diff --git a/assets/theme/booru-lisu/6.gif b/assets/theme/booru-lisu/6.gif
new file mode 100644
index 0000000..11cd3d6
Binary files /dev/null and b/assets/theme/booru-lisu/6.gif differ
diff --git a/assets/theme/booru-lisu/7.gif b/assets/theme/booru-lisu/7.gif
new file mode 100644
index 0000000..3e7ed71
Binary files /dev/null and b/assets/theme/booru-lisu/7.gif differ
diff --git a/assets/theme/booru-lisu/8.gif b/assets/theme/booru-lisu/8.gif
new file mode 100644
index 0000000..de7effd
Binary files /dev/null and b/assets/theme/booru-lisu/8.gif differ
diff --git a/assets/theme/booru-lisu/9.gif b/assets/theme/booru-lisu/9.gif
new file mode 100644
index 0000000..3d7ff09
Binary files /dev/null and b/assets/theme/booru-lisu/9.gif differ
diff --git a/assets/theme/booru-mjg/0.gif b/assets/theme/booru-mjg/0.gif
new file mode 100644
index 0000000..e8cc6e8
Binary files /dev/null and b/assets/theme/booru-mjg/0.gif differ
diff --git a/assets/theme/booru-mjg/1.gif b/assets/theme/booru-mjg/1.gif
new file mode 100644
index 0000000..fda5361
Binary files /dev/null and b/assets/theme/booru-mjg/1.gif differ
diff --git a/assets/theme/booru-mjg/2.gif b/assets/theme/booru-mjg/2.gif
new file mode 100644
index 0000000..d79f246
Binary files /dev/null and b/assets/theme/booru-mjg/2.gif differ
diff --git a/assets/theme/booru-mjg/3.gif b/assets/theme/booru-mjg/3.gif
new file mode 100644
index 0000000..f6feb1c
Binary files /dev/null and b/assets/theme/booru-mjg/3.gif differ
diff --git a/assets/theme/booru-mjg/4.gif b/assets/theme/booru-mjg/4.gif
new file mode 100644
index 0000000..edbcb35
Binary files /dev/null and b/assets/theme/booru-mjg/4.gif differ
diff --git a/assets/theme/booru-mjg/5.gif b/assets/theme/booru-mjg/5.gif
new file mode 100644
index 0000000..2295251
Binary files /dev/null and b/assets/theme/booru-mjg/5.gif differ
diff --git a/assets/theme/booru-mjg/6.gif b/assets/theme/booru-mjg/6.gif
new file mode 100644
index 0000000..4424e7a
Binary files /dev/null and b/assets/theme/booru-mjg/6.gif differ
diff --git a/assets/theme/booru-mjg/7.gif b/assets/theme/booru-mjg/7.gif
new file mode 100644
index 0000000..7b16571
Binary files /dev/null and b/assets/theme/booru-mjg/7.gif differ
diff --git a/assets/theme/booru-mjg/8.gif b/assets/theme/booru-mjg/8.gif
new file mode 100644
index 0000000..4288c8c
Binary files /dev/null and b/assets/theme/booru-mjg/8.gif differ
diff --git a/assets/theme/booru-mjg/9.gif b/assets/theme/booru-mjg/9.gif
new file mode 100644
index 0000000..1848f2d
Binary files /dev/null and b/assets/theme/booru-mjg/9.gif differ
diff --git a/assets/theme/booru-mof/0.gif b/assets/theme/booru-mof/0.gif
new file mode 100644
index 0000000..6b2c17b
Binary files /dev/null and b/assets/theme/booru-mof/0.gif differ
diff --git a/assets/theme/booru-mof/1.gif b/assets/theme/booru-mof/1.gif
new file mode 100644
index 0000000..d263ceb
Binary files /dev/null and b/assets/theme/booru-mof/1.gif differ
diff --git a/assets/theme/booru-mof/2.gif b/assets/theme/booru-mof/2.gif
new file mode 100644
index 0000000..99b96d9
Binary files /dev/null and b/assets/theme/booru-mof/2.gif differ
diff --git a/assets/theme/booru-mof/3.gif b/assets/theme/booru-mof/3.gif
new file mode 100644
index 0000000..cea7c8e
Binary files /dev/null and b/assets/theme/booru-mof/3.gif differ
diff --git a/assets/theme/booru-mof/4.gif b/assets/theme/booru-mof/4.gif
new file mode 100644
index 0000000..507aca4
Binary files /dev/null and b/assets/theme/booru-mof/4.gif differ
diff --git a/assets/theme/booru-mof/5.gif b/assets/theme/booru-mof/5.gif
new file mode 100644
index 0000000..ba92142
Binary files /dev/null and b/assets/theme/booru-mof/5.gif differ
diff --git a/assets/theme/booru-mof/6.gif b/assets/theme/booru-mof/6.gif
new file mode 100644
index 0000000..ea9382f
Binary files /dev/null and b/assets/theme/booru-mof/6.gif differ
diff --git a/assets/theme/booru-mof/7.gif b/assets/theme/booru-mof/7.gif
new file mode 100644
index 0000000..d39cd57
Binary files /dev/null and b/assets/theme/booru-mof/7.gif differ
diff --git a/assets/theme/booru-mof/8.gif b/assets/theme/booru-mof/8.gif
new file mode 100644
index 0000000..72bf538
Binary files /dev/null and b/assets/theme/booru-mof/8.gif differ
diff --git a/assets/theme/booru-mof/9.gif b/assets/theme/booru-mof/9.gif
new file mode 100644
index 0000000..9c84686
Binary files /dev/null and b/assets/theme/booru-mof/9.gif differ
diff --git a/assets/theme/booru-nandroid/0.gif b/assets/theme/booru-nandroid/0.gif
new file mode 100644
index 0000000..619e282
Binary files /dev/null and b/assets/theme/booru-nandroid/0.gif differ
diff --git a/assets/theme/booru-nandroid/1.gif b/assets/theme/booru-nandroid/1.gif
new file mode 100644
index 0000000..4c6869c
Binary files /dev/null and b/assets/theme/booru-nandroid/1.gif differ
diff --git a/assets/theme/booru-nandroid/2.gif b/assets/theme/booru-nandroid/2.gif
new file mode 100644
index 0000000..9e3f13a
Binary files /dev/null and b/assets/theme/booru-nandroid/2.gif differ
diff --git a/assets/theme/booru-nandroid/3.gif b/assets/theme/booru-nandroid/3.gif
new file mode 100644
index 0000000..9273029
Binary files /dev/null and b/assets/theme/booru-nandroid/3.gif differ
diff --git a/assets/theme/booru-nandroid/4.gif b/assets/theme/booru-nandroid/4.gif
new file mode 100644
index 0000000..31e0968
Binary files /dev/null and b/assets/theme/booru-nandroid/4.gif differ
diff --git a/assets/theme/booru-nandroid/5.gif b/assets/theme/booru-nandroid/5.gif
new file mode 100644
index 0000000..b16053d
Binary files /dev/null and b/assets/theme/booru-nandroid/5.gif differ
diff --git a/assets/theme/booru-nandroid/6.gif b/assets/theme/booru-nandroid/6.gif
new file mode 100644
index 0000000..e17ff5b
Binary files /dev/null and b/assets/theme/booru-nandroid/6.gif differ
diff --git a/assets/theme/booru-nandroid/7.gif b/assets/theme/booru-nandroid/7.gif
new file mode 100644
index 0000000..d4ea05f
Binary files /dev/null and b/assets/theme/booru-nandroid/7.gif differ
diff --git a/assets/theme/booru-nandroid/8.gif b/assets/theme/booru-nandroid/8.gif
new file mode 100644
index 0000000..43d0ece
Binary files /dev/null and b/assets/theme/booru-nandroid/8.gif differ
diff --git a/assets/theme/booru-nandroid/9.gif b/assets/theme/booru-nandroid/9.gif
new file mode 100644
index 0000000..a368205
Binary files /dev/null and b/assets/theme/booru-nandroid/9.gif differ
diff --git a/assets/theme/booru-qualityhentais/0.gif b/assets/theme/booru-qualityhentais/0.gif
new file mode 100644
index 0000000..5c15df9
Binary files /dev/null and b/assets/theme/booru-qualityhentais/0.gif differ
diff --git a/assets/theme/booru-qualityhentais/1.gif b/assets/theme/booru-qualityhentais/1.gif
new file mode 100644
index 0000000..020c2d6
Binary files /dev/null and b/assets/theme/booru-qualityhentais/1.gif differ
diff --git a/assets/theme/booru-qualityhentais/2.gif b/assets/theme/booru-qualityhentais/2.gif
new file mode 100644
index 0000000..d4e4ccd
Binary files /dev/null and b/assets/theme/booru-qualityhentais/2.gif differ
diff --git a/assets/theme/booru-qualityhentais/3.gif b/assets/theme/booru-qualityhentais/3.gif
new file mode 100644
index 0000000..58a28b9
Binary files /dev/null and b/assets/theme/booru-qualityhentais/3.gif differ
diff --git a/assets/theme/booru-qualityhentais/4.gif b/assets/theme/booru-qualityhentais/4.gif
new file mode 100644
index 0000000..6ca30ca
Binary files /dev/null and b/assets/theme/booru-qualityhentais/4.gif differ
diff --git a/assets/theme/booru-qualityhentais/5.gif b/assets/theme/booru-qualityhentais/5.gif
new file mode 100644
index 0000000..1278970
Binary files /dev/null and b/assets/theme/booru-qualityhentais/5.gif differ
diff --git a/assets/theme/booru-qualityhentais/6.gif b/assets/theme/booru-qualityhentais/6.gif
new file mode 100644
index 0000000..239cf2d
Binary files /dev/null and b/assets/theme/booru-qualityhentais/6.gif differ
diff --git a/assets/theme/booru-qualityhentais/7.gif b/assets/theme/booru-qualityhentais/7.gif
new file mode 100644
index 0000000..8c49794
Binary files /dev/null and b/assets/theme/booru-qualityhentais/7.gif differ
diff --git a/assets/theme/booru-qualityhentais/8.gif b/assets/theme/booru-qualityhentais/8.gif
new file mode 100644
index 0000000..a61e96c
Binary files /dev/null and b/assets/theme/booru-qualityhentais/8.gif differ
diff --git a/assets/theme/booru-qualityhentais/9.gif b/assets/theme/booru-qualityhentais/9.gif
new file mode 100644
index 0000000..6f0cd76
Binary files /dev/null and b/assets/theme/booru-qualityhentais/9.gif differ
diff --git a/assets/theme/booru-r6gdrawfriends/0.gif b/assets/theme/booru-r6gdrawfriends/0.gif
new file mode 100644
index 0000000..a55b59d
Binary files /dev/null and b/assets/theme/booru-r6gdrawfriends/0.gif differ
diff --git a/assets/theme/booru-r6gdrawfriends/1.gif b/assets/theme/booru-r6gdrawfriends/1.gif
new file mode 100644
index 0000000..7907619
Binary files /dev/null and b/assets/theme/booru-r6gdrawfriends/1.gif differ
diff --git a/assets/theme/booru-r6gdrawfriends/2.gif b/assets/theme/booru-r6gdrawfriends/2.gif
new file mode 100644
index 0000000..ea1673b
Binary files /dev/null and b/assets/theme/booru-r6gdrawfriends/2.gif differ
diff --git a/assets/theme/booru-r6gdrawfriends/3.gif b/assets/theme/booru-r6gdrawfriends/3.gif
new file mode 100644
index 0000000..d559d70
Binary files /dev/null and b/assets/theme/booru-r6gdrawfriends/3.gif differ
diff --git a/assets/theme/booru-r6gdrawfriends/4.gif b/assets/theme/booru-r6gdrawfriends/4.gif
new file mode 100644
index 0000000..fde8c2a
Binary files /dev/null and b/assets/theme/booru-r6gdrawfriends/4.gif differ
diff --git a/assets/theme/booru-r6gdrawfriends/5.gif b/assets/theme/booru-r6gdrawfriends/5.gif
new file mode 100644
index 0000000..0268acb
Binary files /dev/null and b/assets/theme/booru-r6gdrawfriends/5.gif differ
diff --git a/assets/theme/booru-r6gdrawfriends/6.gif b/assets/theme/booru-r6gdrawfriends/6.gif
new file mode 100644
index 0000000..1aed6d6
Binary files /dev/null and b/assets/theme/booru-r6gdrawfriends/6.gif differ
diff --git a/assets/theme/booru-r6gdrawfriends/7.gif b/assets/theme/booru-r6gdrawfriends/7.gif
new file mode 100644
index 0000000..6e9791f
Binary files /dev/null and b/assets/theme/booru-r6gdrawfriends/7.gif differ
diff --git a/assets/theme/booru-r6gdrawfriends/8.gif b/assets/theme/booru-r6gdrawfriends/8.gif
new file mode 100644
index 0000000..f24a1e1
Binary files /dev/null and b/assets/theme/booru-r6gdrawfriends/8.gif differ
diff --git a/assets/theme/booru-r6gdrawfriends/9.gif b/assets/theme/booru-r6gdrawfriends/9.gif
new file mode 100644
index 0000000..4c4eed9
Binary files /dev/null and b/assets/theme/booru-r6gdrawfriends/9.gif differ
diff --git a/assets/theme/booru-rfck/0.gif b/assets/theme/booru-rfck/0.gif
new file mode 100644
index 0000000..e01ac20
Binary files /dev/null and b/assets/theme/booru-rfck/0.gif differ
diff --git a/assets/theme/booru-rfck/1.gif b/assets/theme/booru-rfck/1.gif
new file mode 100644
index 0000000..c5dfb12
Binary files /dev/null and b/assets/theme/booru-rfck/1.gif differ
diff --git a/assets/theme/booru-rfck/2.gif b/assets/theme/booru-rfck/2.gif
new file mode 100644
index 0000000..e32a7ac
Binary files /dev/null and b/assets/theme/booru-rfck/2.gif differ
diff --git a/assets/theme/booru-rfck/3.gif b/assets/theme/booru-rfck/3.gif
new file mode 100644
index 0000000..72b60f8
Binary files /dev/null and b/assets/theme/booru-rfck/3.gif differ
diff --git a/assets/theme/booru-rfck/4.gif b/assets/theme/booru-rfck/4.gif
new file mode 100644
index 0000000..b3220ce
Binary files /dev/null and b/assets/theme/booru-rfck/4.gif differ
diff --git a/assets/theme/booru-rfck/5.gif b/assets/theme/booru-rfck/5.gif
new file mode 100644
index 0000000..ec96be6
Binary files /dev/null and b/assets/theme/booru-rfck/5.gif differ
diff --git a/assets/theme/booru-rfck/6.gif b/assets/theme/booru-rfck/6.gif
new file mode 100644
index 0000000..a28424c
Binary files /dev/null and b/assets/theme/booru-rfck/6.gif differ
diff --git a/assets/theme/booru-rfck/7.gif b/assets/theme/booru-rfck/7.gif
new file mode 100644
index 0000000..affe337
Binary files /dev/null and b/assets/theme/booru-rfck/7.gif differ
diff --git a/assets/theme/booru-rfck/8.gif b/assets/theme/booru-rfck/8.gif
new file mode 100644
index 0000000..df42c09
Binary files /dev/null and b/assets/theme/booru-rfck/8.gif differ
diff --git a/assets/theme/booru-rfck/9.gif b/assets/theme/booru-rfck/9.gif
new file mode 100644
index 0000000..1866013
Binary files /dev/null and b/assets/theme/booru-rfck/9.gif differ
diff --git a/assets/theme/booru-smtg/0.gif b/assets/theme/booru-smtg/0.gif
new file mode 100644
index 0000000..20f40f0
Binary files /dev/null and b/assets/theme/booru-smtg/0.gif differ
diff --git a/assets/theme/booru-smtg/1.gif b/assets/theme/booru-smtg/1.gif
new file mode 100644
index 0000000..6c8afb6
Binary files /dev/null and b/assets/theme/booru-smtg/1.gif differ
diff --git a/assets/theme/booru-smtg/2.gif b/assets/theme/booru-smtg/2.gif
new file mode 100644
index 0000000..dff751a
Binary files /dev/null and b/assets/theme/booru-smtg/2.gif differ
diff --git a/assets/theme/booru-smtg/3.gif b/assets/theme/booru-smtg/3.gif
new file mode 100644
index 0000000..1343d80
Binary files /dev/null and b/assets/theme/booru-smtg/3.gif differ
diff --git a/assets/theme/booru-smtg/4.gif b/assets/theme/booru-smtg/4.gif
new file mode 100644
index 0000000..dce12ef
Binary files /dev/null and b/assets/theme/booru-smtg/4.gif differ
diff --git a/assets/theme/booru-smtg/5.gif b/assets/theme/booru-smtg/5.gif
new file mode 100644
index 0000000..cf1f986
Binary files /dev/null and b/assets/theme/booru-smtg/5.gif differ
diff --git a/assets/theme/booru-smtg/6.gif b/assets/theme/booru-smtg/6.gif
new file mode 100644
index 0000000..d1ca5a5
Binary files /dev/null and b/assets/theme/booru-smtg/6.gif differ
diff --git a/assets/theme/booru-smtg/7.gif b/assets/theme/booru-smtg/7.gif
new file mode 100644
index 0000000..49f25af
Binary files /dev/null and b/assets/theme/booru-smtg/7.gif differ
diff --git a/assets/theme/booru-smtg/8.gif b/assets/theme/booru-smtg/8.gif
new file mode 100644
index 0000000..be527bb
Binary files /dev/null and b/assets/theme/booru-smtg/8.gif differ
diff --git a/assets/theme/booru-smtg/9.gif b/assets/theme/booru-smtg/9.gif
new file mode 100644
index 0000000..357ebd6
Binary files /dev/null and b/assets/theme/booru-smtg/9.gif differ
diff --git a/assets/theme/booru-snyde/0.gif b/assets/theme/booru-snyde/0.gif
new file mode 100644
index 0000000..8ed0802
Binary files /dev/null and b/assets/theme/booru-snyde/0.gif differ
diff --git a/assets/theme/booru-snyde/1.gif b/assets/theme/booru-snyde/1.gif
new file mode 100644
index 0000000..cbe3ef5
Binary files /dev/null and b/assets/theme/booru-snyde/1.gif differ
diff --git a/assets/theme/booru-snyde/2.gif b/assets/theme/booru-snyde/2.gif
new file mode 100644
index 0000000..07c8338
Binary files /dev/null and b/assets/theme/booru-snyde/2.gif differ
diff --git a/assets/theme/booru-snyde/3.gif b/assets/theme/booru-snyde/3.gif
new file mode 100644
index 0000000..15bb5d3
Binary files /dev/null and b/assets/theme/booru-snyde/3.gif differ
diff --git a/assets/theme/booru-snyde/4.gif b/assets/theme/booru-snyde/4.gif
new file mode 100644
index 0000000..d8a4299
Binary files /dev/null and b/assets/theme/booru-snyde/4.gif differ
diff --git a/assets/theme/booru-snyde/5.gif b/assets/theme/booru-snyde/5.gif
new file mode 100644
index 0000000..1e056b9
Binary files /dev/null and b/assets/theme/booru-snyde/5.gif differ
diff --git a/assets/theme/booru-snyde/6.gif b/assets/theme/booru-snyde/6.gif
new file mode 100644
index 0000000..e428a15
Binary files /dev/null and b/assets/theme/booru-snyde/6.gif differ
diff --git a/assets/theme/booru-snyde/7.gif b/assets/theme/booru-snyde/7.gif
new file mode 100644
index 0000000..e21954f
Binary files /dev/null and b/assets/theme/booru-snyde/7.gif differ
diff --git a/assets/theme/booru-snyde/8.gif b/assets/theme/booru-snyde/8.gif
new file mode 100644
index 0000000..1f558bc
Binary files /dev/null and b/assets/theme/booru-snyde/8.gif differ
diff --git a/assets/theme/booru-snyde/9.gif b/assets/theme/booru-snyde/9.gif
new file mode 100644
index 0000000..b886f42
Binary files /dev/null and b/assets/theme/booru-snyde/9.gif differ
diff --git a/assets/theme/booru-the-collection/0.gif b/assets/theme/booru-the-collection/0.gif
new file mode 100644
index 0000000..e474210
Binary files /dev/null and b/assets/theme/booru-the-collection/0.gif differ
diff --git a/assets/theme/booru-the-collection/1.gif b/assets/theme/booru-the-collection/1.gif
new file mode 100644
index 0000000..7f6769c
Binary files /dev/null and b/assets/theme/booru-the-collection/1.gif differ
diff --git a/assets/theme/booru-the-collection/2.gif b/assets/theme/booru-the-collection/2.gif
new file mode 100644
index 0000000..9b5b830
Binary files /dev/null and b/assets/theme/booru-the-collection/2.gif differ
diff --git a/assets/theme/booru-the-collection/3.gif b/assets/theme/booru-the-collection/3.gif
new file mode 100644
index 0000000..a6ca42a
Binary files /dev/null and b/assets/theme/booru-the-collection/3.gif differ
diff --git a/assets/theme/booru-the-collection/4.gif b/assets/theme/booru-the-collection/4.gif
new file mode 100644
index 0000000..9ae9e09
Binary files /dev/null and b/assets/theme/booru-the-collection/4.gif differ
diff --git a/assets/theme/booru-the-collection/5.gif b/assets/theme/booru-the-collection/5.gif
new file mode 100644
index 0000000..34935fc
Binary files /dev/null and b/assets/theme/booru-the-collection/5.gif differ
diff --git a/assets/theme/booru-the-collection/6.gif b/assets/theme/booru-the-collection/6.gif
new file mode 100644
index 0000000..081c0cf
Binary files /dev/null and b/assets/theme/booru-the-collection/6.gif differ
diff --git a/assets/theme/booru-the-collection/7.gif b/assets/theme/booru-the-collection/7.gif
new file mode 100644
index 0000000..c8dfb36
Binary files /dev/null and b/assets/theme/booru-the-collection/7.gif differ
diff --git a/assets/theme/booru-the-collection/8.gif b/assets/theme/booru-the-collection/8.gif
new file mode 100644
index 0000000..4a33b29
Binary files /dev/null and b/assets/theme/booru-the-collection/8.gif differ
diff --git a/assets/theme/booru-the-collection/9.gif b/assets/theme/booru-the-collection/9.gif
new file mode 100644
index 0000000..250c103
Binary files /dev/null and b/assets/theme/booru-the-collection/9.gif differ
diff --git a/assets/theme/booru-touhoulat/0.gif b/assets/theme/booru-touhoulat/0.gif
new file mode 100644
index 0000000..ae67fe5
Binary files /dev/null and b/assets/theme/booru-touhoulat/0.gif differ
diff --git a/assets/theme/booru-touhoulat/1.gif b/assets/theme/booru-touhoulat/1.gif
new file mode 100644
index 0000000..d0d5875
Binary files /dev/null and b/assets/theme/booru-touhoulat/1.gif differ
diff --git a/assets/theme/booru-touhoulat/2.gif b/assets/theme/booru-touhoulat/2.gif
new file mode 100644
index 0000000..b32170e
Binary files /dev/null and b/assets/theme/booru-touhoulat/2.gif differ
diff --git a/assets/theme/booru-touhoulat/3.gif b/assets/theme/booru-touhoulat/3.gif
new file mode 100644
index 0000000..e1abc19
Binary files /dev/null and b/assets/theme/booru-touhoulat/3.gif differ
diff --git a/assets/theme/booru-touhoulat/4.gif b/assets/theme/booru-touhoulat/4.gif
new file mode 100644
index 0000000..b11eb37
Binary files /dev/null and b/assets/theme/booru-touhoulat/4.gif differ
diff --git a/assets/theme/booru-touhoulat/5.gif b/assets/theme/booru-touhoulat/5.gif
new file mode 100644
index 0000000..053163c
Binary files /dev/null and b/assets/theme/booru-touhoulat/5.gif differ
diff --git a/assets/theme/booru-touhoulat/6.gif b/assets/theme/booru-touhoulat/6.gif
new file mode 100644
index 0000000..61c11f1
Binary files /dev/null and b/assets/theme/booru-touhoulat/6.gif differ
diff --git a/assets/theme/booru-touhoulat/7.gif b/assets/theme/booru-touhoulat/7.gif
new file mode 100644
index 0000000..f878894
Binary files /dev/null and b/assets/theme/booru-touhoulat/7.gif differ
diff --git a/assets/theme/booru-touhoulat/8.gif b/assets/theme/booru-touhoulat/8.gif
new file mode 100644
index 0000000..a5a6ca3
Binary files /dev/null and b/assets/theme/booru-touhoulat/8.gif differ
diff --git a/assets/theme/booru-touhoulat/9.gif b/assets/theme/booru-touhoulat/9.gif
new file mode 100644
index 0000000..eb1d6b1
Binary files /dev/null and b/assets/theme/booru-touhoulat/9.gif differ
diff --git a/assets/theme/booru-townofgravityfalls/0.gif b/assets/theme/booru-townofgravityfalls/0.gif
new file mode 100644
index 0000000..18b6fb4
Binary files /dev/null and b/assets/theme/booru-townofgravityfalls/0.gif differ
diff --git a/assets/theme/booru-townofgravityfalls/1.gif b/assets/theme/booru-townofgravityfalls/1.gif
new file mode 100644
index 0000000..005098b
Binary files /dev/null and b/assets/theme/booru-townofgravityfalls/1.gif differ
diff --git a/assets/theme/booru-townofgravityfalls/2.gif b/assets/theme/booru-townofgravityfalls/2.gif
new file mode 100644
index 0000000..f257b68
Binary files /dev/null and b/assets/theme/booru-townofgravityfalls/2.gif differ
diff --git a/assets/theme/booru-townofgravityfalls/3.gif b/assets/theme/booru-townofgravityfalls/3.gif
new file mode 100644
index 0000000..1fd658a
Binary files /dev/null and b/assets/theme/booru-townofgravityfalls/3.gif differ
diff --git a/assets/theme/booru-townofgravityfalls/4.gif b/assets/theme/booru-townofgravityfalls/4.gif
new file mode 100644
index 0000000..5ec83f1
Binary files /dev/null and b/assets/theme/booru-townofgravityfalls/4.gif differ
diff --git a/assets/theme/booru-townofgravityfalls/5.gif b/assets/theme/booru-townofgravityfalls/5.gif
new file mode 100644
index 0000000..8c8f6c8
Binary files /dev/null and b/assets/theme/booru-townofgravityfalls/5.gif differ
diff --git a/assets/theme/booru-townofgravityfalls/6.gif b/assets/theme/booru-townofgravityfalls/6.gif
new file mode 100644
index 0000000..94804a5
Binary files /dev/null and b/assets/theme/booru-townofgravityfalls/6.gif differ
diff --git a/assets/theme/booru-townofgravityfalls/7.gif b/assets/theme/booru-townofgravityfalls/7.gif
new file mode 100644
index 0000000..cf5b389
Binary files /dev/null and b/assets/theme/booru-townofgravityfalls/7.gif differ
diff --git a/assets/theme/booru-townofgravityfalls/8.gif b/assets/theme/booru-townofgravityfalls/8.gif
new file mode 100644
index 0000000..c3d1a8e
Binary files /dev/null and b/assets/theme/booru-townofgravityfalls/8.gif differ
diff --git a/assets/theme/booru-townofgravityfalls/9.gif b/assets/theme/booru-townofgravityfalls/9.gif
new file mode 100644
index 0000000..1698633
Binary files /dev/null and b/assets/theme/booru-townofgravityfalls/9.gif differ
diff --git a/assets/theme/booru-twifanartsfw/0.gif b/assets/theme/booru-twifanartsfw/0.gif
new file mode 100644
index 0000000..1b3926b
Binary files /dev/null and b/assets/theme/booru-twifanartsfw/0.gif differ
diff --git a/assets/theme/booru-twifanartsfw/1.gif b/assets/theme/booru-twifanartsfw/1.gif
new file mode 100644
index 0000000..959317d
Binary files /dev/null and b/assets/theme/booru-twifanartsfw/1.gif differ
diff --git a/assets/theme/booru-twifanartsfw/2.gif b/assets/theme/booru-twifanartsfw/2.gif
new file mode 100644
index 0000000..b703ae6
Binary files /dev/null and b/assets/theme/booru-twifanartsfw/2.gif differ
diff --git a/assets/theme/booru-twifanartsfw/3.gif b/assets/theme/booru-twifanartsfw/3.gif
new file mode 100644
index 0000000..888acd9
Binary files /dev/null and b/assets/theme/booru-twifanartsfw/3.gif differ
diff --git a/assets/theme/booru-twifanartsfw/4.gif b/assets/theme/booru-twifanartsfw/4.gif
new file mode 100644
index 0000000..0e8a1be
Binary files /dev/null and b/assets/theme/booru-twifanartsfw/4.gif differ
diff --git a/assets/theme/booru-twifanartsfw/5.gif b/assets/theme/booru-twifanartsfw/5.gif
new file mode 100644
index 0000000..1baa8c7
Binary files /dev/null and b/assets/theme/booru-twifanartsfw/5.gif differ
diff --git a/assets/theme/booru-twifanartsfw/6.gif b/assets/theme/booru-twifanartsfw/6.gif
new file mode 100644
index 0000000..520d935
Binary files /dev/null and b/assets/theme/booru-twifanartsfw/6.gif differ
diff --git a/assets/theme/booru-twifanartsfw/7.gif b/assets/theme/booru-twifanartsfw/7.gif
new file mode 100644
index 0000000..79ac898
Binary files /dev/null and b/assets/theme/booru-twifanartsfw/7.gif differ
diff --git a/assets/theme/booru-twifanartsfw/8.gif b/assets/theme/booru-twifanartsfw/8.gif
new file mode 100644
index 0000000..7519e42
Binary files /dev/null and b/assets/theme/booru-twifanartsfw/8.gif differ
diff --git a/assets/theme/booru-twifanartsfw/9.gif b/assets/theme/booru-twifanartsfw/9.gif
new file mode 100644
index 0000000..da8c6fc
Binary files /dev/null and b/assets/theme/booru-twifanartsfw/9.gif differ
diff --git a/assets/theme/booru-ve/0.gif b/assets/theme/booru-ve/0.gif
new file mode 100644
index 0000000..57ae95c
Binary files /dev/null and b/assets/theme/booru-ve/0.gif differ
diff --git a/assets/theme/booru-ve/1.gif b/assets/theme/booru-ve/1.gif
new file mode 100644
index 0000000..e64b87a
Binary files /dev/null and b/assets/theme/booru-ve/1.gif differ
diff --git a/assets/theme/booru-ve/2.gif b/assets/theme/booru-ve/2.gif
new file mode 100644
index 0000000..b5ed6aa
Binary files /dev/null and b/assets/theme/booru-ve/2.gif differ
diff --git a/assets/theme/booru-ve/3.gif b/assets/theme/booru-ve/3.gif
new file mode 100644
index 0000000..30f375f
Binary files /dev/null and b/assets/theme/booru-ve/3.gif differ
diff --git a/assets/theme/booru-ve/4.gif b/assets/theme/booru-ve/4.gif
new file mode 100644
index 0000000..d16695f
Binary files /dev/null and b/assets/theme/booru-ve/4.gif differ
diff --git a/assets/theme/booru-ve/5.gif b/assets/theme/booru-ve/5.gif
new file mode 100644
index 0000000..c5c32c9
Binary files /dev/null and b/assets/theme/booru-ve/5.gif differ
diff --git a/assets/theme/booru-ve/6.gif b/assets/theme/booru-ve/6.gif
new file mode 100644
index 0000000..34cbafe
Binary files /dev/null and b/assets/theme/booru-ve/6.gif differ
diff --git a/assets/theme/booru-ve/7.gif b/assets/theme/booru-ve/7.gif
new file mode 100644
index 0000000..a24baea
Binary files /dev/null and b/assets/theme/booru-ve/7.gif differ
diff --git a/assets/theme/booru-ve/8.gif b/assets/theme/booru-ve/8.gif
new file mode 100644
index 0000000..28e9897
Binary files /dev/null and b/assets/theme/booru-ve/8.gif differ
diff --git a/assets/theme/booru-ve/9.gif b/assets/theme/booru-ve/9.gif
new file mode 100644
index 0000000..f24604a
Binary files /dev/null and b/assets/theme/booru-ve/9.gif differ
diff --git a/assets/theme/booru-vivi/0.gif b/assets/theme/booru-vivi/0.gif
new file mode 100644
index 0000000..04f4f31
Binary files /dev/null and b/assets/theme/booru-vivi/0.gif differ
diff --git a/assets/theme/booru-vivi/1.gif b/assets/theme/booru-vivi/1.gif
new file mode 100644
index 0000000..edbfb52
Binary files /dev/null and b/assets/theme/booru-vivi/1.gif differ
diff --git a/assets/theme/booru-vivi/2.gif b/assets/theme/booru-vivi/2.gif
new file mode 100644
index 0000000..72eaf9b
Binary files /dev/null and b/assets/theme/booru-vivi/2.gif differ
diff --git a/assets/theme/booru-vivi/3.gif b/assets/theme/booru-vivi/3.gif
new file mode 100644
index 0000000..7d082c2
Binary files /dev/null and b/assets/theme/booru-vivi/3.gif differ
diff --git a/assets/theme/booru-vivi/4.gif b/assets/theme/booru-vivi/4.gif
new file mode 100644
index 0000000..0a43674
Binary files /dev/null and b/assets/theme/booru-vivi/4.gif differ
diff --git a/assets/theme/booru-vivi/5.gif b/assets/theme/booru-vivi/5.gif
new file mode 100644
index 0000000..4a9a2fb
Binary files /dev/null and b/assets/theme/booru-vivi/5.gif differ
diff --git a/assets/theme/booru-vivi/6.gif b/assets/theme/booru-vivi/6.gif
new file mode 100644
index 0000000..6ecaaa3
Binary files /dev/null and b/assets/theme/booru-vivi/6.gif differ
diff --git a/assets/theme/booru-vivi/7.gif b/assets/theme/booru-vivi/7.gif
new file mode 100644
index 0000000..99ff77c
Binary files /dev/null and b/assets/theme/booru-vivi/7.gif differ
diff --git a/assets/theme/booru-vivi/8.gif b/assets/theme/booru-vivi/8.gif
new file mode 100644
index 0000000..08f181b
Binary files /dev/null and b/assets/theme/booru-vivi/8.gif differ
diff --git a/assets/theme/booru-vivi/9.gif b/assets/theme/booru-vivi/9.gif
new file mode 100644
index 0000000..385012c
Binary files /dev/null and b/assets/theme/booru-vivi/9.gif differ
diff --git a/assets/theme/booru-vp/0.gif b/assets/theme/booru-vp/0.gif
new file mode 100644
index 0000000..9e692e0
Binary files /dev/null and b/assets/theme/booru-vp/0.gif differ
diff --git a/assets/theme/booru-vp/1.gif b/assets/theme/booru-vp/1.gif
new file mode 100644
index 0000000..a3a21fb
Binary files /dev/null and b/assets/theme/booru-vp/1.gif differ
diff --git a/assets/theme/booru-vp/2.gif b/assets/theme/booru-vp/2.gif
new file mode 100644
index 0000000..6dc9915
Binary files /dev/null and b/assets/theme/booru-vp/2.gif differ
diff --git a/assets/theme/booru-vp/3.gif b/assets/theme/booru-vp/3.gif
new file mode 100644
index 0000000..6c3954b
Binary files /dev/null and b/assets/theme/booru-vp/3.gif differ
diff --git a/assets/theme/booru-vp/4.gif b/assets/theme/booru-vp/4.gif
new file mode 100644
index 0000000..f0f98cf
Binary files /dev/null and b/assets/theme/booru-vp/4.gif differ
diff --git a/assets/theme/booru-vp/5.gif b/assets/theme/booru-vp/5.gif
new file mode 100644
index 0000000..143b8a9
Binary files /dev/null and b/assets/theme/booru-vp/5.gif differ
diff --git a/assets/theme/booru-vp/6.gif b/assets/theme/booru-vp/6.gif
new file mode 100644
index 0000000..f7336f9
Binary files /dev/null and b/assets/theme/booru-vp/6.gif differ
diff --git a/assets/theme/booru-vp/7.gif b/assets/theme/booru-vp/7.gif
new file mode 100644
index 0000000..6c48e68
Binary files /dev/null and b/assets/theme/booru-vp/7.gif differ
diff --git a/assets/theme/booru-vp/8.gif b/assets/theme/booru-vp/8.gif
new file mode 100644
index 0000000..96ba6e4
Binary files /dev/null and b/assets/theme/booru-vp/8.gif differ
diff --git a/assets/theme/booru-vp/9.gif b/assets/theme/booru-vp/9.gif
new file mode 100644
index 0000000..9cf04c0
Binary files /dev/null and b/assets/theme/booru-vp/9.gif differ
diff --git a/assets/theme/booru-yuyuyui/0.gif b/assets/theme/booru-yuyuyui/0.gif
new file mode 100644
index 0000000..31d403f
Binary files /dev/null and b/assets/theme/booru-yuyuyui/0.gif differ
diff --git a/assets/theme/booru-yuyuyui/1.gif b/assets/theme/booru-yuyuyui/1.gif
new file mode 100644
index 0000000..cf79ba5
Binary files /dev/null and b/assets/theme/booru-yuyuyui/1.gif differ
diff --git a/assets/theme/booru-yuyuyui/2.gif b/assets/theme/booru-yuyuyui/2.gif
new file mode 100644
index 0000000..a5f2e87
Binary files /dev/null and b/assets/theme/booru-yuyuyui/2.gif differ
diff --git a/assets/theme/booru-yuyuyui/3.gif b/assets/theme/booru-yuyuyui/3.gif
new file mode 100644
index 0000000..c66a5f4
Binary files /dev/null and b/assets/theme/booru-yuyuyui/3.gif differ
diff --git a/assets/theme/booru-yuyuyui/4.gif b/assets/theme/booru-yuyuyui/4.gif
new file mode 100644
index 0000000..17d4a2e
Binary files /dev/null and b/assets/theme/booru-yuyuyui/4.gif differ
diff --git a/assets/theme/booru-yuyuyui/5.gif b/assets/theme/booru-yuyuyui/5.gif
new file mode 100644
index 0000000..facb651
Binary files /dev/null and b/assets/theme/booru-yuyuyui/5.gif differ
diff --git a/assets/theme/booru-yuyuyui/6.gif b/assets/theme/booru-yuyuyui/6.gif
new file mode 100644
index 0000000..a8335f1
Binary files /dev/null and b/assets/theme/booru-yuyuyui/6.gif differ
diff --git a/assets/theme/booru-yuyuyui/7.gif b/assets/theme/booru-yuyuyui/7.gif
new file mode 100644
index 0000000..3070f60
Binary files /dev/null and b/assets/theme/booru-yuyuyui/7.gif differ
diff --git a/assets/theme/booru-yuyuyui/8.gif b/assets/theme/booru-yuyuyui/8.gif
new file mode 100644
index 0000000..20e9e5e
Binary files /dev/null and b/assets/theme/booru-yuyuyui/8.gif differ
diff --git a/assets/theme/booru-yuyuyui/9.gif b/assets/theme/booru-yuyuyui/9.gif
new file mode 100644
index 0000000..9661f1d
Binary files /dev/null and b/assets/theme/booru-yuyuyui/9.gif differ
diff --git a/assets/theme/capoo-1/0.png b/assets/theme/capoo-1/0.png
new file mode 100644
index 0000000..11f20b9
Binary files /dev/null and b/assets/theme/capoo-1/0.png differ
diff --git a/assets/theme/capoo-1/1.png b/assets/theme/capoo-1/1.png
new file mode 100644
index 0000000..2b8b6d7
Binary files /dev/null and b/assets/theme/capoo-1/1.png differ
diff --git a/assets/theme/capoo-1/2.png b/assets/theme/capoo-1/2.png
new file mode 100644
index 0000000..d8e74eb
Binary files /dev/null and b/assets/theme/capoo-1/2.png differ
diff --git a/assets/theme/capoo-1/3.png b/assets/theme/capoo-1/3.png
new file mode 100644
index 0000000..d0fe84f
Binary files /dev/null and b/assets/theme/capoo-1/3.png differ
diff --git a/assets/theme/capoo-1/4.png b/assets/theme/capoo-1/4.png
new file mode 100644
index 0000000..96abaf6
Binary files /dev/null and b/assets/theme/capoo-1/4.png differ
diff --git a/assets/theme/capoo-1/5.png b/assets/theme/capoo-1/5.png
new file mode 100644
index 0000000..a4ec352
Binary files /dev/null and b/assets/theme/capoo-1/5.png differ
diff --git a/assets/theme/capoo-1/6.png b/assets/theme/capoo-1/6.png
new file mode 100644
index 0000000..3a500a5
Binary files /dev/null and b/assets/theme/capoo-1/6.png differ
diff --git a/assets/theme/capoo-1/7.png b/assets/theme/capoo-1/7.png
new file mode 100644
index 0000000..86ac3eb
Binary files /dev/null and b/assets/theme/capoo-1/7.png differ
diff --git a/assets/theme/capoo-1/8.png b/assets/theme/capoo-1/8.png
new file mode 100644
index 0000000..b7bb956
Binary files /dev/null and b/assets/theme/capoo-1/8.png differ
diff --git a/assets/theme/capoo-1/9.png b/assets/theme/capoo-1/9.png
new file mode 100644
index 0000000..e2ac236
Binary files /dev/null and b/assets/theme/capoo-1/9.png differ
diff --git a/assets/theme/capoo-2/0.png b/assets/theme/capoo-2/0.png
new file mode 100644
index 0000000..44b7fbc
Binary files /dev/null and b/assets/theme/capoo-2/0.png differ
diff --git a/assets/theme/capoo-2/1.png b/assets/theme/capoo-2/1.png
new file mode 100644
index 0000000..0aed967
Binary files /dev/null and b/assets/theme/capoo-2/1.png differ
diff --git a/assets/theme/capoo-2/2.png b/assets/theme/capoo-2/2.png
new file mode 100644
index 0000000..c5e68ce
Binary files /dev/null and b/assets/theme/capoo-2/2.png differ
diff --git a/assets/theme/capoo-2/3.png b/assets/theme/capoo-2/3.png
new file mode 100644
index 0000000..3f70ae6
Binary files /dev/null and b/assets/theme/capoo-2/3.png differ
diff --git a/assets/theme/capoo-2/4.png b/assets/theme/capoo-2/4.png
new file mode 100644
index 0000000..948f1a6
Binary files /dev/null and b/assets/theme/capoo-2/4.png differ
diff --git a/assets/theme/capoo-2/5.png b/assets/theme/capoo-2/5.png
new file mode 100644
index 0000000..75cefea
Binary files /dev/null and b/assets/theme/capoo-2/5.png differ
diff --git a/assets/theme/capoo-2/6.png b/assets/theme/capoo-2/6.png
new file mode 100644
index 0000000..02be5fc
Binary files /dev/null and b/assets/theme/capoo-2/6.png differ
diff --git a/assets/theme/capoo-2/7.png b/assets/theme/capoo-2/7.png
new file mode 100644
index 0000000..67a8a43
Binary files /dev/null and b/assets/theme/capoo-2/7.png differ
diff --git a/assets/theme/capoo-2/8.png b/assets/theme/capoo-2/8.png
new file mode 100644
index 0000000..8c7d7c1
Binary files /dev/null and b/assets/theme/capoo-2/8.png differ
diff --git a/assets/theme/capoo-2/9.png b/assets/theme/capoo-2/9.png
new file mode 100644
index 0000000..8372a8f
Binary files /dev/null and b/assets/theme/capoo-2/9.png differ
diff --git a/assets/theme/capoo-2/_end.png b/assets/theme/capoo-2/_end.png
new file mode 100644
index 0000000..3d9c180
Binary files /dev/null and b/assets/theme/capoo-2/_end.png differ
diff --git a/assets/theme/capoo-2/_start.png b/assets/theme/capoo-2/_start.png
new file mode 100644
index 0000000..926525f
Binary files /dev/null and b/assets/theme/capoo-2/_start.png differ
diff --git a/assets/theme/e621/0.gif b/assets/theme/e621/0.gif
new file mode 100644
index 0000000..3e52868
Binary files /dev/null and b/assets/theme/e621/0.gif differ
diff --git a/assets/theme/e621/1.gif b/assets/theme/e621/1.gif
new file mode 100644
index 0000000..085bdaf
Binary files /dev/null and b/assets/theme/e621/1.gif differ
diff --git a/assets/theme/e621/2.gif b/assets/theme/e621/2.gif
new file mode 100644
index 0000000..b423e02
Binary files /dev/null and b/assets/theme/e621/2.gif differ
diff --git a/assets/theme/e621/3.gif b/assets/theme/e621/3.gif
new file mode 100644
index 0000000..181f0c6
Binary files /dev/null and b/assets/theme/e621/3.gif differ
diff --git a/assets/theme/e621/4.gif b/assets/theme/e621/4.gif
new file mode 100644
index 0000000..d79f1d3
Binary files /dev/null and b/assets/theme/e621/4.gif differ
diff --git a/assets/theme/e621/5.gif b/assets/theme/e621/5.gif
new file mode 100644
index 0000000..2975b15
Binary files /dev/null and b/assets/theme/e621/5.gif differ
diff --git a/assets/theme/e621/6.gif b/assets/theme/e621/6.gif
new file mode 100644
index 0000000..5eb51e8
Binary files /dev/null and b/assets/theme/e621/6.gif differ
diff --git a/assets/theme/e621/7.gif b/assets/theme/e621/7.gif
new file mode 100644
index 0000000..d116a2e
Binary files /dev/null and b/assets/theme/e621/7.gif differ
diff --git a/assets/theme/e621/8.gif b/assets/theme/e621/8.gif
new file mode 100644
index 0000000..eebb03d
Binary files /dev/null and b/assets/theme/e621/8.gif differ
diff --git a/assets/theme/e621/9.gif b/assets/theme/e621/9.gif
new file mode 100644
index 0000000..2afe793
Binary files /dev/null and b/assets/theme/e621/9.gif differ
diff --git a/assets/theme/food/0.gif b/assets/theme/food/0.gif
new file mode 100644
index 0000000..7ceb025
Binary files /dev/null and b/assets/theme/food/0.gif differ
diff --git a/assets/theme/food/1.gif b/assets/theme/food/1.gif
new file mode 100644
index 0000000..8041cd9
Binary files /dev/null and b/assets/theme/food/1.gif differ
diff --git a/assets/theme/food/2.gif b/assets/theme/food/2.gif
new file mode 100644
index 0000000..471e3a9
Binary files /dev/null and b/assets/theme/food/2.gif differ
diff --git a/assets/theme/food/3.gif b/assets/theme/food/3.gif
new file mode 100644
index 0000000..d370542
Binary files /dev/null and b/assets/theme/food/3.gif differ
diff --git a/assets/theme/food/4.gif b/assets/theme/food/4.gif
new file mode 100644
index 0000000..b4390c9
Binary files /dev/null and b/assets/theme/food/4.gif differ
diff --git a/assets/theme/food/5.gif b/assets/theme/food/5.gif
new file mode 100644
index 0000000..8d705ba
Binary files /dev/null and b/assets/theme/food/5.gif differ
diff --git a/assets/theme/food/6.gif b/assets/theme/food/6.gif
new file mode 100644
index 0000000..5b7cfed
Binary files /dev/null and b/assets/theme/food/6.gif differ
diff --git a/assets/theme/food/7.gif b/assets/theme/food/7.gif
new file mode 100644
index 0000000..cc3c7cd
Binary files /dev/null and b/assets/theme/food/7.gif differ
diff --git a/assets/theme/food/8.gif b/assets/theme/food/8.gif
new file mode 100644
index 0000000..a68a267
Binary files /dev/null and b/assets/theme/food/8.gif differ
diff --git a/assets/theme/food/9.gif b/assets/theme/food/9.gif
new file mode 100644
index 0000000..0b270a6
Binary files /dev/null and b/assets/theme/food/9.gif differ
diff --git a/assets/theme/green/0.gif b/assets/theme/green/0.gif
new file mode 100644
index 0000000..bbb5e2c
Binary files /dev/null and b/assets/theme/green/0.gif differ
diff --git a/assets/theme/green/1.gif b/assets/theme/green/1.gif
new file mode 100644
index 0000000..3434acb
Binary files /dev/null and b/assets/theme/green/1.gif differ
diff --git a/assets/theme/green/2.gif b/assets/theme/green/2.gif
new file mode 100644
index 0000000..67b51cb
Binary files /dev/null and b/assets/theme/green/2.gif differ
diff --git a/assets/theme/green/3.gif b/assets/theme/green/3.gif
new file mode 100644
index 0000000..9248cd6
Binary files /dev/null and b/assets/theme/green/3.gif differ
diff --git a/assets/theme/green/4.gif b/assets/theme/green/4.gif
new file mode 100644
index 0000000..ca8ce58
Binary files /dev/null and b/assets/theme/green/4.gif differ
diff --git a/assets/theme/green/5.gif b/assets/theme/green/5.gif
new file mode 100644
index 0000000..91821bb
Binary files /dev/null and b/assets/theme/green/5.gif differ
diff --git a/assets/theme/green/6.gif b/assets/theme/green/6.gif
new file mode 100644
index 0000000..38b631c
Binary files /dev/null and b/assets/theme/green/6.gif differ
diff --git a/assets/theme/green/7.gif b/assets/theme/green/7.gif
new file mode 100644
index 0000000..f4b6908
Binary files /dev/null and b/assets/theme/green/7.gif differ
diff --git a/assets/theme/green/8.gif b/assets/theme/green/8.gif
new file mode 100644
index 0000000..12ac7ab
Binary files /dev/null and b/assets/theme/green/8.gif differ
diff --git a/assets/theme/green/9.gif b/assets/theme/green/9.gif
new file mode 100644
index 0000000..75e280f
Binary files /dev/null and b/assets/theme/green/9.gif differ
diff --git a/assets/theme/kasuterura-1/0.gif b/assets/theme/kasuterura-1/0.gif
new file mode 100644
index 0000000..3752006
Binary files /dev/null and b/assets/theme/kasuterura-1/0.gif differ
diff --git a/assets/theme/kasuterura-1/1.gif b/assets/theme/kasuterura-1/1.gif
new file mode 100644
index 0000000..3132407
Binary files /dev/null and b/assets/theme/kasuterura-1/1.gif differ
diff --git a/assets/theme/kasuterura-1/2.gif b/assets/theme/kasuterura-1/2.gif
new file mode 100644
index 0000000..377710c
Binary files /dev/null and b/assets/theme/kasuterura-1/2.gif differ
diff --git a/assets/theme/kasuterura-1/3.gif b/assets/theme/kasuterura-1/3.gif
new file mode 100644
index 0000000..b1beeef
Binary files /dev/null and b/assets/theme/kasuterura-1/3.gif differ
diff --git a/assets/theme/kasuterura-1/4.gif b/assets/theme/kasuterura-1/4.gif
new file mode 100644
index 0000000..2b8f901
Binary files /dev/null and b/assets/theme/kasuterura-1/4.gif differ
diff --git a/assets/theme/kasuterura-1/5.gif b/assets/theme/kasuterura-1/5.gif
new file mode 100644
index 0000000..44c55b0
Binary files /dev/null and b/assets/theme/kasuterura-1/5.gif differ
diff --git a/assets/theme/kasuterura-1/6.gif b/assets/theme/kasuterura-1/6.gif
new file mode 100644
index 0000000..e562e3a
Binary files /dev/null and b/assets/theme/kasuterura-1/6.gif differ
diff --git a/assets/theme/kasuterura-1/7.gif b/assets/theme/kasuterura-1/7.gif
new file mode 100644
index 0000000..97ef125
Binary files /dev/null and b/assets/theme/kasuterura-1/7.gif differ
diff --git a/assets/theme/kasuterura-1/8.gif b/assets/theme/kasuterura-1/8.gif
new file mode 100644
index 0000000..690bae5
Binary files /dev/null and b/assets/theme/kasuterura-1/8.gif differ
diff --git a/assets/theme/kasuterura-1/9.gif b/assets/theme/kasuterura-1/9.gif
new file mode 100644
index 0000000..bc81932
Binary files /dev/null and b/assets/theme/kasuterura-1/9.gif differ
diff --git a/assets/theme/kasuterura-2/0.gif b/assets/theme/kasuterura-2/0.gif
new file mode 100644
index 0000000..4b492d7
Binary files /dev/null and b/assets/theme/kasuterura-2/0.gif differ
diff --git a/assets/theme/kasuterura-2/1.gif b/assets/theme/kasuterura-2/1.gif
new file mode 100644
index 0000000..fbebe2e
Binary files /dev/null and b/assets/theme/kasuterura-2/1.gif differ
diff --git a/assets/theme/kasuterura-2/2.gif b/assets/theme/kasuterura-2/2.gif
new file mode 100644
index 0000000..f6d857f
Binary files /dev/null and b/assets/theme/kasuterura-2/2.gif differ
diff --git a/assets/theme/kasuterura-2/3.gif b/assets/theme/kasuterura-2/3.gif
new file mode 100644
index 0000000..9fb31d9
Binary files /dev/null and b/assets/theme/kasuterura-2/3.gif differ
diff --git a/assets/theme/kasuterura-2/4.gif b/assets/theme/kasuterura-2/4.gif
new file mode 100644
index 0000000..3d8acb2
Binary files /dev/null and b/assets/theme/kasuterura-2/4.gif differ
diff --git a/assets/theme/kasuterura-2/5.gif b/assets/theme/kasuterura-2/5.gif
new file mode 100644
index 0000000..b3b17e5
Binary files /dev/null and b/assets/theme/kasuterura-2/5.gif differ
diff --git a/assets/theme/kasuterura-2/6.gif b/assets/theme/kasuterura-2/6.gif
new file mode 100644
index 0000000..ef0e362
Binary files /dev/null and b/assets/theme/kasuterura-2/6.gif differ
diff --git a/assets/theme/kasuterura-2/7.gif b/assets/theme/kasuterura-2/7.gif
new file mode 100644
index 0000000..75a1eca
Binary files /dev/null and b/assets/theme/kasuterura-2/7.gif differ
diff --git a/assets/theme/kasuterura-2/8.gif b/assets/theme/kasuterura-2/8.gif
new file mode 100644
index 0000000..990eceb
Binary files /dev/null and b/assets/theme/kasuterura-2/8.gif differ
diff --git a/assets/theme/kasuterura-2/9.gif b/assets/theme/kasuterura-2/9.gif
new file mode 100644
index 0000000..67f815d
Binary files /dev/null and b/assets/theme/kasuterura-2/9.gif differ
diff --git a/assets/theme/kasuterura-3/0.gif b/assets/theme/kasuterura-3/0.gif
new file mode 100644
index 0000000..7f59a4e
Binary files /dev/null and b/assets/theme/kasuterura-3/0.gif differ
diff --git a/assets/theme/kasuterura-3/1.gif b/assets/theme/kasuterura-3/1.gif
new file mode 100644
index 0000000..d36c2dd
Binary files /dev/null and b/assets/theme/kasuterura-3/1.gif differ
diff --git a/assets/theme/kasuterura-3/2.gif b/assets/theme/kasuterura-3/2.gif
new file mode 100644
index 0000000..1429a70
Binary files /dev/null and b/assets/theme/kasuterura-3/2.gif differ
diff --git a/assets/theme/kasuterura-3/3.gif b/assets/theme/kasuterura-3/3.gif
new file mode 100644
index 0000000..defec3e
Binary files /dev/null and b/assets/theme/kasuterura-3/3.gif differ
diff --git a/assets/theme/kasuterura-3/4.gif b/assets/theme/kasuterura-3/4.gif
new file mode 100644
index 0000000..ccad315
Binary files /dev/null and b/assets/theme/kasuterura-3/4.gif differ
diff --git a/assets/theme/kasuterura-3/5.gif b/assets/theme/kasuterura-3/5.gif
new file mode 100644
index 0000000..83abf98
Binary files /dev/null and b/assets/theme/kasuterura-3/5.gif differ
diff --git a/assets/theme/kasuterura-3/6.gif b/assets/theme/kasuterura-3/6.gif
new file mode 100644
index 0000000..7423cc0
Binary files /dev/null and b/assets/theme/kasuterura-3/6.gif differ
diff --git a/assets/theme/kasuterura-3/7.gif b/assets/theme/kasuterura-3/7.gif
new file mode 100644
index 0000000..9490ef4
Binary files /dev/null and b/assets/theme/kasuterura-3/7.gif differ
diff --git a/assets/theme/kasuterura-3/8.gif b/assets/theme/kasuterura-3/8.gif
new file mode 100644
index 0000000..d137b96
Binary files /dev/null and b/assets/theme/kasuterura-3/8.gif differ
diff --git a/assets/theme/kasuterura-3/9.gif b/assets/theme/kasuterura-3/9.gif
new file mode 100644
index 0000000..e4c5665
Binary files /dev/null and b/assets/theme/kasuterura-3/9.gif differ
diff --git a/assets/theme/kasuterura-4/0.gif b/assets/theme/kasuterura-4/0.gif
new file mode 100644
index 0000000..9074f5d
Binary files /dev/null and b/assets/theme/kasuterura-4/0.gif differ
diff --git a/assets/theme/kasuterura-4/1.gif b/assets/theme/kasuterura-4/1.gif
new file mode 100644
index 0000000..f4d3fac
Binary files /dev/null and b/assets/theme/kasuterura-4/1.gif differ
diff --git a/assets/theme/kasuterura-4/2.gif b/assets/theme/kasuterura-4/2.gif
new file mode 100644
index 0000000..f188ed7
Binary files /dev/null and b/assets/theme/kasuterura-4/2.gif differ
diff --git a/assets/theme/kasuterura-4/3.gif b/assets/theme/kasuterura-4/3.gif
new file mode 100644
index 0000000..ee372c3
Binary files /dev/null and b/assets/theme/kasuterura-4/3.gif differ
diff --git a/assets/theme/kasuterura-4/4.gif b/assets/theme/kasuterura-4/4.gif
new file mode 100644
index 0000000..78bfc5f
Binary files /dev/null and b/assets/theme/kasuterura-4/4.gif differ
diff --git a/assets/theme/kasuterura-4/5.gif b/assets/theme/kasuterura-4/5.gif
new file mode 100644
index 0000000..9692534
Binary files /dev/null and b/assets/theme/kasuterura-4/5.gif differ
diff --git a/assets/theme/kasuterura-4/6.gif b/assets/theme/kasuterura-4/6.gif
new file mode 100644
index 0000000..b49d8ab
Binary files /dev/null and b/assets/theme/kasuterura-4/6.gif differ
diff --git a/assets/theme/kasuterura-4/7.gif b/assets/theme/kasuterura-4/7.gif
new file mode 100644
index 0000000..30d4920
Binary files /dev/null and b/assets/theme/kasuterura-4/7.gif differ
diff --git a/assets/theme/kasuterura-4/8.gif b/assets/theme/kasuterura-4/8.gif
new file mode 100644
index 0000000..a16938a
Binary files /dev/null and b/assets/theme/kasuterura-4/8.gif differ
diff --git a/assets/theme/kasuterura-4/9.gif b/assets/theme/kasuterura-4/9.gif
new file mode 100644
index 0000000..39f4cad
Binary files /dev/null and b/assets/theme/kasuterura-4/9.gif differ
diff --git a/assets/theme/kyun/0.gif b/assets/theme/kyun/0.gif
new file mode 100644
index 0000000..5738cb1
Binary files /dev/null and b/assets/theme/kyun/0.gif differ
diff --git a/assets/theme/kyun/1.gif b/assets/theme/kyun/1.gif
new file mode 100644
index 0000000..f111c3e
Binary files /dev/null and b/assets/theme/kyun/1.gif differ
diff --git a/assets/theme/kyun/2.gif b/assets/theme/kyun/2.gif
new file mode 100644
index 0000000..7d97836
Binary files /dev/null and b/assets/theme/kyun/2.gif differ
diff --git a/assets/theme/kyun/3.gif b/assets/theme/kyun/3.gif
new file mode 100644
index 0000000..960367a
Binary files /dev/null and b/assets/theme/kyun/3.gif differ
diff --git a/assets/theme/kyun/4.gif b/assets/theme/kyun/4.gif
new file mode 100644
index 0000000..8a8ce21
Binary files /dev/null and b/assets/theme/kyun/4.gif differ
diff --git a/assets/theme/kyun/5.gif b/assets/theme/kyun/5.gif
new file mode 100644
index 0000000..1a8a045
Binary files /dev/null and b/assets/theme/kyun/5.gif differ
diff --git a/assets/theme/kyun/6.gif b/assets/theme/kyun/6.gif
new file mode 100644
index 0000000..97bec27
Binary files /dev/null and b/assets/theme/kyun/6.gif differ
diff --git a/assets/theme/kyun/7.gif b/assets/theme/kyun/7.gif
new file mode 100644
index 0000000..a013c8d
Binary files /dev/null and b/assets/theme/kyun/7.gif differ
diff --git a/assets/theme/kyun/8.gif b/assets/theme/kyun/8.gif
new file mode 100644
index 0000000..11604b6
Binary files /dev/null and b/assets/theme/kyun/8.gif differ
diff --git a/assets/theme/kyun/9.gif b/assets/theme/kyun/9.gif
new file mode 100644
index 0000000..befbc15
Binary files /dev/null and b/assets/theme/kyun/9.gif differ
diff --git a/assets/theme/love-and-deepspace/0.png b/assets/theme/love-and-deepspace/0.png
new file mode 100644
index 0000000..47eb4cd
Binary files /dev/null and b/assets/theme/love-and-deepspace/0.png differ
diff --git a/assets/theme/love-and-deepspace/1.png b/assets/theme/love-and-deepspace/1.png
new file mode 100644
index 0000000..7b29bde
Binary files /dev/null and b/assets/theme/love-and-deepspace/1.png differ
diff --git a/assets/theme/love-and-deepspace/2.png b/assets/theme/love-and-deepspace/2.png
new file mode 100644
index 0000000..25394bc
Binary files /dev/null and b/assets/theme/love-and-deepspace/2.png differ
diff --git a/assets/theme/love-and-deepspace/3.png b/assets/theme/love-and-deepspace/3.png
new file mode 100644
index 0000000..67b6504
Binary files /dev/null and b/assets/theme/love-and-deepspace/3.png differ
diff --git a/assets/theme/love-and-deepspace/4.png b/assets/theme/love-and-deepspace/4.png
new file mode 100644
index 0000000..eb5c8d8
Binary files /dev/null and b/assets/theme/love-and-deepspace/4.png differ
diff --git a/assets/theme/love-and-deepspace/5.png b/assets/theme/love-and-deepspace/5.png
new file mode 100644
index 0000000..b45b3b5
Binary files /dev/null and b/assets/theme/love-and-deepspace/5.png differ
diff --git a/assets/theme/love-and-deepspace/6.png b/assets/theme/love-and-deepspace/6.png
new file mode 100644
index 0000000..ca37abd
Binary files /dev/null and b/assets/theme/love-and-deepspace/6.png differ
diff --git a/assets/theme/love-and-deepspace/7.png b/assets/theme/love-and-deepspace/7.png
new file mode 100644
index 0000000..6d04623
Binary files /dev/null and b/assets/theme/love-and-deepspace/7.png differ
diff --git a/assets/theme/love-and-deepspace/8.png b/assets/theme/love-and-deepspace/8.png
new file mode 100644
index 0000000..8ed6be1
Binary files /dev/null and b/assets/theme/love-and-deepspace/8.png differ
diff --git a/assets/theme/love-and-deepspace/9.png b/assets/theme/love-and-deepspace/9.png
new file mode 100644
index 0000000..86a109c
Binary files /dev/null and b/assets/theme/love-and-deepspace/9.png differ
diff --git a/assets/theme/minecraft/0.gif b/assets/theme/minecraft/0.gif
new file mode 100644
index 0000000..e1d6c2a
Binary files /dev/null and b/assets/theme/minecraft/0.gif differ
diff --git a/assets/theme/minecraft/1.gif b/assets/theme/minecraft/1.gif
new file mode 100644
index 0000000..cd9c278
Binary files /dev/null and b/assets/theme/minecraft/1.gif differ
diff --git a/assets/theme/minecraft/2.gif b/assets/theme/minecraft/2.gif
new file mode 100644
index 0000000..bc0bd21
Binary files /dev/null and b/assets/theme/minecraft/2.gif differ
diff --git a/assets/theme/minecraft/3.gif b/assets/theme/minecraft/3.gif
new file mode 100644
index 0000000..7546018
Binary files /dev/null and b/assets/theme/minecraft/3.gif differ
diff --git a/assets/theme/minecraft/4.gif b/assets/theme/minecraft/4.gif
new file mode 100644
index 0000000..af23f16
Binary files /dev/null and b/assets/theme/minecraft/4.gif differ
diff --git a/assets/theme/minecraft/5.gif b/assets/theme/minecraft/5.gif
new file mode 100644
index 0000000..e1764b8
Binary files /dev/null and b/assets/theme/minecraft/5.gif differ
diff --git a/assets/theme/minecraft/6.gif b/assets/theme/minecraft/6.gif
new file mode 100644
index 0000000..25e3d9d
Binary files /dev/null and b/assets/theme/minecraft/6.gif differ
diff --git a/assets/theme/minecraft/7.gif b/assets/theme/minecraft/7.gif
new file mode 100644
index 0000000..ceeb725
Binary files /dev/null and b/assets/theme/minecraft/7.gif differ
diff --git a/assets/theme/minecraft/8.gif b/assets/theme/minecraft/8.gif
new file mode 100644
index 0000000..a63ecfa
Binary files /dev/null and b/assets/theme/minecraft/8.gif differ
diff --git a/assets/theme/minecraft/9.gif b/assets/theme/minecraft/9.gif
new file mode 100644
index 0000000..9ea20c7
Binary files /dev/null and b/assets/theme/minecraft/9.gif differ
diff --git a/assets/theme/morden-num/0.gif b/assets/theme/morden-num/0.gif
new file mode 100644
index 0000000..de96eb4
Binary files /dev/null and b/assets/theme/morden-num/0.gif differ
diff --git a/assets/theme/morden-num/1.gif b/assets/theme/morden-num/1.gif
new file mode 100644
index 0000000..fa5985c
Binary files /dev/null and b/assets/theme/morden-num/1.gif differ
diff --git a/assets/theme/morden-num/2.gif b/assets/theme/morden-num/2.gif
new file mode 100644
index 0000000..c99dede
Binary files /dev/null and b/assets/theme/morden-num/2.gif differ
diff --git a/assets/theme/morden-num/3.gif b/assets/theme/morden-num/3.gif
new file mode 100644
index 0000000..f54e034
Binary files /dev/null and b/assets/theme/morden-num/3.gif differ
diff --git a/assets/theme/morden-num/4.gif b/assets/theme/morden-num/4.gif
new file mode 100644
index 0000000..af9af46
Binary files /dev/null and b/assets/theme/morden-num/4.gif differ
diff --git a/assets/theme/morden-num/5.gif b/assets/theme/morden-num/5.gif
new file mode 100644
index 0000000..709a666
Binary files /dev/null and b/assets/theme/morden-num/5.gif differ
diff --git a/assets/theme/morden-num/6.gif b/assets/theme/morden-num/6.gif
new file mode 100644
index 0000000..f022521
Binary files /dev/null and b/assets/theme/morden-num/6.gif differ
diff --git a/assets/theme/morden-num/7.gif b/assets/theme/morden-num/7.gif
new file mode 100644
index 0000000..5d5c144
Binary files /dev/null and b/assets/theme/morden-num/7.gif differ
diff --git a/assets/theme/morden-num/8.gif b/assets/theme/morden-num/8.gif
new file mode 100644
index 0000000..62a8ce1
Binary files /dev/null and b/assets/theme/morden-num/8.gif differ
diff --git a/assets/theme/morden-num/9.gif b/assets/theme/morden-num/9.gif
new file mode 100644
index 0000000..0a9b706
Binary files /dev/null and b/assets/theme/morden-num/9.gif differ
diff --git a/assets/theme/nixietube-1/0.gif b/assets/theme/nixietube-1/0.gif
new file mode 100644
index 0000000..6eaab21
Binary files /dev/null and b/assets/theme/nixietube-1/0.gif differ
diff --git a/assets/theme/nixietube-1/1.gif b/assets/theme/nixietube-1/1.gif
new file mode 100644
index 0000000..6e57b14
Binary files /dev/null and b/assets/theme/nixietube-1/1.gif differ
diff --git a/assets/theme/nixietube-1/2.gif b/assets/theme/nixietube-1/2.gif
new file mode 100644
index 0000000..6c9650c
Binary files /dev/null and b/assets/theme/nixietube-1/2.gif differ
diff --git a/assets/theme/nixietube-1/3.gif b/assets/theme/nixietube-1/3.gif
new file mode 100644
index 0000000..00082ae
Binary files /dev/null and b/assets/theme/nixietube-1/3.gif differ
diff --git a/assets/theme/nixietube-1/4.gif b/assets/theme/nixietube-1/4.gif
new file mode 100644
index 0000000..151678a
Binary files /dev/null and b/assets/theme/nixietube-1/4.gif differ
diff --git a/assets/theme/nixietube-1/5.gif b/assets/theme/nixietube-1/5.gif
new file mode 100644
index 0000000..e18a971
Binary files /dev/null and b/assets/theme/nixietube-1/5.gif differ
diff --git a/assets/theme/nixietube-1/6.gif b/assets/theme/nixietube-1/6.gif
new file mode 100644
index 0000000..6ca0a4c
Binary files /dev/null and b/assets/theme/nixietube-1/6.gif differ
diff --git a/assets/theme/nixietube-1/7.gif b/assets/theme/nixietube-1/7.gif
new file mode 100644
index 0000000..ea1d192
Binary files /dev/null and b/assets/theme/nixietube-1/7.gif differ
diff --git a/assets/theme/nixietube-1/8.gif b/assets/theme/nixietube-1/8.gif
new file mode 100644
index 0000000..2d80bcb
Binary files /dev/null and b/assets/theme/nixietube-1/8.gif differ
diff --git a/assets/theme/nixietube-1/9.gif b/assets/theme/nixietube-1/9.gif
new file mode 100644
index 0000000..8b50d79
Binary files /dev/null and b/assets/theme/nixietube-1/9.gif differ
diff --git a/assets/theme/nixietube-2/0.gif b/assets/theme/nixietube-2/0.gif
new file mode 100644
index 0000000..09f4728
Binary files /dev/null and b/assets/theme/nixietube-2/0.gif differ
diff --git a/assets/theme/nixietube-2/1.gif b/assets/theme/nixietube-2/1.gif
new file mode 100644
index 0000000..b6ac51e
Binary files /dev/null and b/assets/theme/nixietube-2/1.gif differ
diff --git a/assets/theme/nixietube-2/2.gif b/assets/theme/nixietube-2/2.gif
new file mode 100644
index 0000000..03c4184
Binary files /dev/null and b/assets/theme/nixietube-2/2.gif differ
diff --git a/assets/theme/nixietube-2/3.gif b/assets/theme/nixietube-2/3.gif
new file mode 100644
index 0000000..ee73ae1
Binary files /dev/null and b/assets/theme/nixietube-2/3.gif differ
diff --git a/assets/theme/nixietube-2/4.gif b/assets/theme/nixietube-2/4.gif
new file mode 100644
index 0000000..e7f84a3
Binary files /dev/null and b/assets/theme/nixietube-2/4.gif differ
diff --git a/assets/theme/nixietube-2/5.gif b/assets/theme/nixietube-2/5.gif
new file mode 100644
index 0000000..a88cbf3
Binary files /dev/null and b/assets/theme/nixietube-2/5.gif differ
diff --git a/assets/theme/nixietube-2/6.gif b/assets/theme/nixietube-2/6.gif
new file mode 100644
index 0000000..ddf25d2
Binary files /dev/null and b/assets/theme/nixietube-2/6.gif differ
diff --git a/assets/theme/nixietube-2/7.gif b/assets/theme/nixietube-2/7.gif
new file mode 100644
index 0000000..7a9042c
Binary files /dev/null and b/assets/theme/nixietube-2/7.gif differ
diff --git a/assets/theme/nixietube-2/8.gif b/assets/theme/nixietube-2/8.gif
new file mode 100644
index 0000000..72899ba
Binary files /dev/null and b/assets/theme/nixietube-2/8.gif differ
diff --git a/assets/theme/nixietube-2/9.gif b/assets/theme/nixietube-2/9.gif
new file mode 100644
index 0000000..c5e5be8
Binary files /dev/null and b/assets/theme/nixietube-2/9.gif differ
diff --git a/assets/theme/normal-1/0.gif b/assets/theme/normal-1/0.gif
new file mode 100644
index 0000000..ec1fa57
Binary files /dev/null and b/assets/theme/normal-1/0.gif differ
diff --git a/assets/theme/normal-1/1.gif b/assets/theme/normal-1/1.gif
new file mode 100644
index 0000000..b159e41
Binary files /dev/null and b/assets/theme/normal-1/1.gif differ
diff --git a/assets/theme/normal-1/2.gif b/assets/theme/normal-1/2.gif
new file mode 100644
index 0000000..e6ea87c
Binary files /dev/null and b/assets/theme/normal-1/2.gif differ
diff --git a/assets/theme/normal-1/3.gif b/assets/theme/normal-1/3.gif
new file mode 100644
index 0000000..78ed279
Binary files /dev/null and b/assets/theme/normal-1/3.gif differ
diff --git a/assets/theme/normal-1/4.gif b/assets/theme/normal-1/4.gif
new file mode 100644
index 0000000..7ec7cf6
Binary files /dev/null and b/assets/theme/normal-1/4.gif differ
diff --git a/assets/theme/normal-1/5.gif b/assets/theme/normal-1/5.gif
new file mode 100644
index 0000000..cccedbb
Binary files /dev/null and b/assets/theme/normal-1/5.gif differ
diff --git a/assets/theme/normal-1/6.gif b/assets/theme/normal-1/6.gif
new file mode 100644
index 0000000..b084443
Binary files /dev/null and b/assets/theme/normal-1/6.gif differ
diff --git a/assets/theme/normal-1/7.gif b/assets/theme/normal-1/7.gif
new file mode 100644
index 0000000..1240b82
Binary files /dev/null and b/assets/theme/normal-1/7.gif differ
diff --git a/assets/theme/normal-1/8.gif b/assets/theme/normal-1/8.gif
new file mode 100644
index 0000000..cebc3f7
Binary files /dev/null and b/assets/theme/normal-1/8.gif differ
diff --git a/assets/theme/normal-1/9.gif b/assets/theme/normal-1/9.gif
new file mode 100644
index 0000000..1502a50
Binary files /dev/null and b/assets/theme/normal-1/9.gif differ
diff --git a/assets/theme/normal-2/0.gif b/assets/theme/normal-2/0.gif
new file mode 100644
index 0000000..56d86e2
Binary files /dev/null and b/assets/theme/normal-2/0.gif differ
diff --git a/assets/theme/normal-2/1.gif b/assets/theme/normal-2/1.gif
new file mode 100644
index 0000000..cd7a820
Binary files /dev/null and b/assets/theme/normal-2/1.gif differ
diff --git a/assets/theme/normal-2/2.gif b/assets/theme/normal-2/2.gif
new file mode 100644
index 0000000..17c50d3
Binary files /dev/null and b/assets/theme/normal-2/2.gif differ
diff --git a/assets/theme/normal-2/3.gif b/assets/theme/normal-2/3.gif
new file mode 100644
index 0000000..bd2c86f
Binary files /dev/null and b/assets/theme/normal-2/3.gif differ
diff --git a/assets/theme/normal-2/4.gif b/assets/theme/normal-2/4.gif
new file mode 100644
index 0000000..5f62199
Binary files /dev/null and b/assets/theme/normal-2/4.gif differ
diff --git a/assets/theme/normal-2/5.gif b/assets/theme/normal-2/5.gif
new file mode 100644
index 0000000..5516670
Binary files /dev/null and b/assets/theme/normal-2/5.gif differ
diff --git a/assets/theme/normal-2/6.gif b/assets/theme/normal-2/6.gif
new file mode 100644
index 0000000..fa9133d
Binary files /dev/null and b/assets/theme/normal-2/6.gif differ
diff --git a/assets/theme/normal-2/7.gif b/assets/theme/normal-2/7.gif
new file mode 100644
index 0000000..58ba2d9
Binary files /dev/null and b/assets/theme/normal-2/7.gif differ
diff --git a/assets/theme/normal-2/8.gif b/assets/theme/normal-2/8.gif
new file mode 100644
index 0000000..6e74a7e
Binary files /dev/null and b/assets/theme/normal-2/8.gif differ
diff --git a/assets/theme/normal-2/9.gif b/assets/theme/normal-2/9.gif
new file mode 100644
index 0000000..be9bdb1
Binary files /dev/null and b/assets/theme/normal-2/9.gif differ
diff --git a/assets/theme/original-new/0.gif b/assets/theme/original-new/0.gif
new file mode 100644
index 0000000..f91f33e
Binary files /dev/null and b/assets/theme/original-new/0.gif differ
diff --git a/assets/theme/original-new/1.gif b/assets/theme/original-new/1.gif
new file mode 100644
index 0000000..d7a3ad7
Binary files /dev/null and b/assets/theme/original-new/1.gif differ
diff --git a/assets/theme/original-new/2.gif b/assets/theme/original-new/2.gif
new file mode 100644
index 0000000..8e6b2d6
Binary files /dev/null and b/assets/theme/original-new/2.gif differ
diff --git a/assets/theme/original-new/3.gif b/assets/theme/original-new/3.gif
new file mode 100644
index 0000000..ef84aa2
Binary files /dev/null and b/assets/theme/original-new/3.gif differ
diff --git a/assets/theme/original-new/4.gif b/assets/theme/original-new/4.gif
new file mode 100644
index 0000000..34cd750
Binary files /dev/null and b/assets/theme/original-new/4.gif differ
diff --git a/assets/theme/original-new/5.gif b/assets/theme/original-new/5.gif
new file mode 100644
index 0000000..5c2c7b5
Binary files /dev/null and b/assets/theme/original-new/5.gif differ
diff --git a/assets/theme/original-new/6.gif b/assets/theme/original-new/6.gif
new file mode 100644
index 0000000..01d39d9
Binary files /dev/null and b/assets/theme/original-new/6.gif differ
diff --git a/assets/theme/original-new/7.gif b/assets/theme/original-new/7.gif
new file mode 100644
index 0000000..eb13e32
Binary files /dev/null and b/assets/theme/original-new/7.gif differ
diff --git a/assets/theme/original-new/8.gif b/assets/theme/original-new/8.gif
new file mode 100644
index 0000000..40ad5dd
Binary files /dev/null and b/assets/theme/original-new/8.gif differ
diff --git a/assets/theme/original-new/9.gif b/assets/theme/original-new/9.gif
new file mode 100644
index 0000000..3614182
Binary files /dev/null and b/assets/theme/original-new/9.gif differ
diff --git a/assets/theme/original-old/0.gif b/assets/theme/original-old/0.gif
new file mode 100644
index 0000000..d158948
Binary files /dev/null and b/assets/theme/original-old/0.gif differ
diff --git a/assets/theme/original-old/1.gif b/assets/theme/original-old/1.gif
new file mode 100644
index 0000000..9ff460e
Binary files /dev/null and b/assets/theme/original-old/1.gif differ
diff --git a/assets/theme/original-old/2.gif b/assets/theme/original-old/2.gif
new file mode 100644
index 0000000..a5dbb78
Binary files /dev/null and b/assets/theme/original-old/2.gif differ
diff --git a/assets/theme/original-old/3.gif b/assets/theme/original-old/3.gif
new file mode 100644
index 0000000..3713eeb
Binary files /dev/null and b/assets/theme/original-old/3.gif differ
diff --git a/assets/theme/original-old/4.gif b/assets/theme/original-old/4.gif
new file mode 100644
index 0000000..990b9d7
Binary files /dev/null and b/assets/theme/original-old/4.gif differ
diff --git a/assets/theme/original-old/5.gif b/assets/theme/original-old/5.gif
new file mode 100644
index 0000000..ea049ac
Binary files /dev/null and b/assets/theme/original-old/5.gif differ
diff --git a/assets/theme/original-old/6.gif b/assets/theme/original-old/6.gif
new file mode 100644
index 0000000..b209ffb
Binary files /dev/null and b/assets/theme/original-old/6.gif differ
diff --git a/assets/theme/original-old/7.gif b/assets/theme/original-old/7.gif
new file mode 100644
index 0000000..91fbffd
Binary files /dev/null and b/assets/theme/original-old/7.gif differ
diff --git a/assets/theme/original-old/8.gif b/assets/theme/original-old/8.gif
new file mode 100644
index 0000000..4e029f2
Binary files /dev/null and b/assets/theme/original-old/8.gif differ
diff --git a/assets/theme/original-old/9.gif b/assets/theme/original-old/9.gif
new file mode 100644
index 0000000..d4ffaa1
Binary files /dev/null and b/assets/theme/original-old/9.gif differ
diff --git a/assets/theme/shimmie2/0.gif b/assets/theme/shimmie2/0.gif
new file mode 100644
index 0000000..8bf28b4
Binary files /dev/null and b/assets/theme/shimmie2/0.gif differ
diff --git a/assets/theme/shimmie2/1.gif b/assets/theme/shimmie2/1.gif
new file mode 100644
index 0000000..bfccd64
Binary files /dev/null and b/assets/theme/shimmie2/1.gif differ
diff --git a/assets/theme/shimmie2/2.gif b/assets/theme/shimmie2/2.gif
new file mode 100644
index 0000000..66b9bc6
Binary files /dev/null and b/assets/theme/shimmie2/2.gif differ
diff --git a/assets/theme/shimmie2/3.gif b/assets/theme/shimmie2/3.gif
new file mode 100644
index 0000000..6b1e98f
Binary files /dev/null and b/assets/theme/shimmie2/3.gif differ
diff --git a/assets/theme/shimmie2/4.gif b/assets/theme/shimmie2/4.gif
new file mode 100644
index 0000000..5dce74c
Binary files /dev/null and b/assets/theme/shimmie2/4.gif differ
diff --git a/assets/theme/shimmie2/5.gif b/assets/theme/shimmie2/5.gif
new file mode 100644
index 0000000..99d0a35
Binary files /dev/null and b/assets/theme/shimmie2/5.gif differ
diff --git a/assets/theme/shimmie2/6.gif b/assets/theme/shimmie2/6.gif
new file mode 100644
index 0000000..549f765
Binary files /dev/null and b/assets/theme/shimmie2/6.gif differ
diff --git a/assets/theme/shimmie2/7.gif b/assets/theme/shimmie2/7.gif
new file mode 100644
index 0000000..e6047a5
Binary files /dev/null and b/assets/theme/shimmie2/7.gif differ
diff --git a/assets/theme/shimmie2/8.gif b/assets/theme/shimmie2/8.gif
new file mode 100644
index 0000000..df2ad91
Binary files /dev/null and b/assets/theme/shimmie2/8.gif differ
diff --git a/assets/theme/shimmie2/9.gif b/assets/theme/shimmie2/9.gif
new file mode 100644
index 0000000..ca06c15
Binary files /dev/null and b/assets/theme/shimmie2/9.gif differ
diff --git a/assets/theme/sketch-1/0.png b/assets/theme/sketch-1/0.png
new file mode 100644
index 0000000..064e4df
Binary files /dev/null and b/assets/theme/sketch-1/0.png differ
diff --git a/assets/theme/sketch-1/1.png b/assets/theme/sketch-1/1.png
new file mode 100644
index 0000000..d2eb8a8
Binary files /dev/null and b/assets/theme/sketch-1/1.png differ
diff --git a/assets/theme/sketch-1/2.png b/assets/theme/sketch-1/2.png
new file mode 100644
index 0000000..0189ade
Binary files /dev/null and b/assets/theme/sketch-1/2.png differ
diff --git a/assets/theme/sketch-1/3.png b/assets/theme/sketch-1/3.png
new file mode 100644
index 0000000..f7a765e
Binary files /dev/null and b/assets/theme/sketch-1/3.png differ
diff --git a/assets/theme/sketch-1/4.png b/assets/theme/sketch-1/4.png
new file mode 100644
index 0000000..468eb01
Binary files /dev/null and b/assets/theme/sketch-1/4.png differ
diff --git a/assets/theme/sketch-1/5.png b/assets/theme/sketch-1/5.png
new file mode 100644
index 0000000..2e14547
Binary files /dev/null and b/assets/theme/sketch-1/5.png differ
diff --git a/assets/theme/sketch-1/6.png b/assets/theme/sketch-1/6.png
new file mode 100644
index 0000000..49ea931
Binary files /dev/null and b/assets/theme/sketch-1/6.png differ
diff --git a/assets/theme/sketch-1/7.png b/assets/theme/sketch-1/7.png
new file mode 100644
index 0000000..d69d6a6
Binary files /dev/null and b/assets/theme/sketch-1/7.png differ
diff --git a/assets/theme/sketch-1/8.png b/assets/theme/sketch-1/8.png
new file mode 100644
index 0000000..6c01f43
Binary files /dev/null and b/assets/theme/sketch-1/8.png differ
diff --git a/assets/theme/sketch-1/9.png b/assets/theme/sketch-1/9.png
new file mode 100644
index 0000000..03a0438
Binary files /dev/null and b/assets/theme/sketch-1/9.png differ
diff --git a/assets/theme/sketch-2/0.png b/assets/theme/sketch-2/0.png
new file mode 100644
index 0000000..95576fd
Binary files /dev/null and b/assets/theme/sketch-2/0.png differ
diff --git a/assets/theme/sketch-2/1.png b/assets/theme/sketch-2/1.png
new file mode 100644
index 0000000..4d2b879
Binary files /dev/null and b/assets/theme/sketch-2/1.png differ
diff --git a/assets/theme/sketch-2/2.png b/assets/theme/sketch-2/2.png
new file mode 100644
index 0000000..6d56cb1
Binary files /dev/null and b/assets/theme/sketch-2/2.png differ
diff --git a/assets/theme/sketch-2/3.png b/assets/theme/sketch-2/3.png
new file mode 100644
index 0000000..c4e474b
Binary files /dev/null and b/assets/theme/sketch-2/3.png differ
diff --git a/assets/theme/sketch-2/4.png b/assets/theme/sketch-2/4.png
new file mode 100644
index 0000000..7accc31
Binary files /dev/null and b/assets/theme/sketch-2/4.png differ
diff --git a/assets/theme/sketch-2/5.png b/assets/theme/sketch-2/5.png
new file mode 100644
index 0000000..16c644d
Binary files /dev/null and b/assets/theme/sketch-2/5.png differ
diff --git a/assets/theme/sketch-2/6.png b/assets/theme/sketch-2/6.png
new file mode 100644
index 0000000..2281dff
Binary files /dev/null and b/assets/theme/sketch-2/6.png differ
diff --git a/assets/theme/sketch-2/7.png b/assets/theme/sketch-2/7.png
new file mode 100644
index 0000000..940f08e
Binary files /dev/null and b/assets/theme/sketch-2/7.png differ
diff --git a/assets/theme/sketch-2/8.png b/assets/theme/sketch-2/8.png
new file mode 100644
index 0000000..f8e29cc
Binary files /dev/null and b/assets/theme/sketch-2/8.png differ
diff --git a/assets/theme/sketch-2/9.png b/assets/theme/sketch-2/9.png
new file mode 100644
index 0000000..8249bbe
Binary files /dev/null and b/assets/theme/sketch-2/9.png differ
diff --git a/config.yml b/config.yml
deleted file mode 100644
index a5070f3..0000000
--- a/config.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-app:
- # site: https://count.getloli.com # your website
- port: 3000
-
-db:
- type: sqlite # sqlite or mongodb
diff --git a/db/index.js b/db/index.js
index cc8adb0..efcdfb6 100644
--- a/db/index.js
+++ b/db/index.js
@@ -1,10 +1,8 @@
'use strict'
-const config = require('config-yml')
-
let db
-switch(config.db.type){
+switch(process.env.DB_TYPE){
case 'mongodb':
db = require('./mongodb')
break;
diff --git a/db/mongodb.js b/db/mongodb.js
index 4119c7a..a154b9a 100644
--- a/db/mongodb.js
+++ b/db/mongodb.js
@@ -1,55 +1,60 @@
-'use strict'
+"use strict";
-const mongoose = require('mongoose')
-const schema = require('./schema')
+const mongoose = require("mongoose");
+
+const schema = new mongoose.Schema(
+ {
+ name: { type: String, required: true },
+ num: { type: Number, required: true }
+ },
+ { collection: 'tb_count', versionKey: false }
+);
// the default mongodb url (local server)
-const mongodbURL = process.env.DB_URL || 'mongodb://127.0.0.1:27017'
+const mongodbURL = process.env.DB_URL || "mongodb://127.0.0.1:27017";
mongoose.connect(mongodbURL, {
useNewUrlParser: true,
useUnifiedTopology: true,
- useFindAndModify: false
-})
+ useFindAndModify: false,
+});
-const Count = mongoose.connection.model('Count', schema)
+const Count = mongoose.connection.model("Count", schema);
function getNum(name) {
- return Count
- .findOne({ name }, '-_id -__v')
- .exec()
+ return Count.findOne({ name }, "-_id -__v").exec();
}
function getAll() {
- return Count
- .find({ }, '-_id -__v')
- .exec()
+ return Count.find({}, "-_id -__v").exec();
}
function setNum(name, num) {
- return Count
- .findOneAndUpdate({ name }, { name, num }, { upsert: true })
- .exec()
+ return Count.findOneAndUpdate(
+ { name },
+ { name, num },
+ { upsert: true }
+ ).exec();
}
function setNumMulti(counters) {
- const bulkOps = counters.map(obj => {
- const { name, num } = obj
+ const bulkOps = counters.map((obj) => {
+ const { name, num } = obj;
return {
updateOne: {
filter: { name },
update: { name, num },
- upsert: true
- }
- }
- })
+ upsert: true,
+ },
+ };
+ });
- return Count.bulkWrite(bulkOps, { ordered : false })
+ return Count.bulkWrite(bulkOps, { ordered: false });
}
module.exports = {
getNum,
getAll,
setNum,
- setNumMulti
-}
+ setNumMulti,
+};
diff --git a/db/schema.js b/db/schema.js
deleted file mode 100644
index f558723..0000000
--- a/db/schema.js
+++ /dev/null
@@ -1,8 +0,0 @@
-'use strict'
-
-const mongoose = require('mongoose');
-
-module.exports = new mongoose.Schema({
- name: { type: String, required: true },
- num: { type: Number, required: true }
-}, { collection: 'tb_count', versionKey: false });
\ No newline at end of file
diff --git a/index.js b/index.js
index 77237b8..983add9 100644
--- a/index.js
+++ b/index.js
@@ -1,125 +1,162 @@
-'use strict'
+"use strict";
-const fs = require('fs')
-const config = require('config-yml')
-const express = require('express')
-const compression = require('compression')
+require('dotenv').config();
+const express = require("express");
+const compression = require("compression");
+const { z } = require("zod");
-const db = require('./db')
-const themify = require('./utils/themify')
+const db = require("./db");
+const { themeList, getCountImage } = require("./utils/themify");
+const { cors, ZodValid } = require("./utils/middleware");
+const { randomArray, logger } = require("./utils");
-const PLACES = 7
+const app = express();
-const app = express()
-
-app.use(express.static('assets'))
-app.use(compression())
-app.set('view engine', 'pug')
+app.use(express.static("assets"));
+app.use(compression());
+app.use(cors());
+app.set("view engine", "pug");
app.get('/', (req, res) => {
- const site = config.app.site || `${req.protocol}://${req.get('host')}`
- res.render('index', { site })
+ const site = process.env.APP_SITE || `${req.protocol}://${req.get('host')}`
+ const ga_id = process.env.GA_ID || null
+ res.render('index', {
+ site,
+ ga_id,
+ themeList,
+ })
});
// get the image
-app.get('/get/@:name', async (req, res) => {
- const { name } = req.params
- const { theme = 'moebooru' } = req.query
- let length = PLACES
+app.get(["/@:name", "/get/@:name"],
+ ZodValid({
+ params: z.object({
+ name: z.string().max(32),
+ }),
+ query: z.object({
+ theme: z.string().default("moebooru"),
+ padding: z.coerce.number().int().min(0).max(16).default(7),
+ offset: z.coerce.number().min(-500).max(500).default(0),
+ align: z.enum(["top", "center", "bottom"]).default("top"),
+ scale: z.coerce.number().min(0.1).max(2).default(1),
+ pixelated: z.enum(["0", "1"]).default("1"),
+ darkmode: z.enum(["0", "1", "auto"]).default("auto"),
- // This helps with GitHub's image cache
- res.set({
- 'content-type': 'image/svg+xml',
- 'cache-control': 'max-age=0, no-cache, no-store, must-revalidate'
- })
-
- const data = await getCountByName(name)
-
- if (name === 'demo') {
- res.set({
- 'cache-control': 'max-age=31536000'
+ // Unusual Options
+ num: z.coerce.number().int().min(0).max(1e15).default(0), // a carry-safe integer, less than `2^53-1`, and aesthetically pleasing in decimal.
+ prefix: z.coerce.number().int().min(-1).max(999999).default(-1)
})
- length = 10
+ }),
+ async (req, res) => {
+ const { name } = req.params;
+ let { theme = "moebooru", num = 0, ...rest } = req.query;
+
+ // This helps with GitHub's image cache
+ res.set({
+ "content-type": "image/svg+xml",
+ "cache-control": "max-age=0, no-cache, no-store, must-revalidate",
+ });
+
+ const data = await getCountByName(String(name), Number(num));
+
+ if (name === "demo") {
+ res.set("cache-control", "max-age=31536000");
+ }
+
+ if (theme === "random") {
+ theme = randomArray(Object.keys(themeList));
+ }
+
+ // Send the generated SVG as the result
+ const renderSvg = getCountImage({
+ count: data.num,
+ theme,
+ ...rest
+ });
+
+ res.send(renderSvg);
+
+ logger.debug(
+ data,
+ { theme, ...req.query },
+ `ip: ${req.headers['x-forwarded-for'] || req.connection.remoteAddress}`,
+ `ref: ${req.get("Referrer") || null}`,
+ `ua: ${req.get("User-Agent") || null}`
+ );
}
-
- // Send the generated SVG as the result
- const renderSvg = themify.getCountImage({ count: data.num, theme, length })
- res.send(renderSvg)
-
- console.log(data, `theme: ${theme}`, `ref: ${req.get('Referrer') || null}`, `ua: ${req.get('User-Agent') || null}`)
-})
+);
// JSON record
-app.get('/record/@:name', async (req, res) => {
- const { name } = req.params
+app.get("/record/@:name", async (req, res) => {
+ const { name } = req.params;
- const data = await getCountByName(name)
+ const data = await getCountByName(name);
- res.json(data)
-})
-
-app.get('/heart-beat', (req, res) => {
- res.set({
- 'cache-control': 'max-age=0, no-cache, no-store, must-revalidate'
- })
-
- res.send('alive')
- console.log('heart-beat')
+ res.json(data);
});
-const listener = app.listen(config.app.port || 3000, () => {
- console.log('Your app is listening on port ' + listener.address().port)
-})
+app.get("/heart-beat", (req, res) => {
+ res.set("cache-control", "max-age=0, no-cache, no-store, must-revalidate");
+ res.send("alive");
+ logger.debug("heart-beat");
+});
-let __cache_counter = {}, shouldPush = false
+const listener = app.listen(process.env.APP_PORT || 3000, () => {
+ logger.info("Your app is listening on port " + listener.address().port);
+});
-setInterval(() => {
- shouldPush = true
-}, 1000 * 60);
+let __cache_counter = {};
+let enablePushDelay = process.env.DB_INTERVAL > 0
+let needPush = false;
+
+if (enablePushDelay) {
+ setInterval(() => {
+ needPush = true;
+ }, 1000 * process.env.DB_INTERVAL);
+}
async function pushDB() {
- if (!shouldPush) return
+ if (Object.keys(__cache_counter).length === 0) return;
+ if (enablePushDelay && !needPush) return;
try {
- shouldPush = false
- if (Object.keys(__cache_counter).length === 0) return
+ needPush = false;
+ logger.info("pushDB", __cache_counter);
- console.log("pushDB", __cache_counter)
-
- const counters = Object.keys(__cache_counter).map(key => {
+ const counters = Object.keys(__cache_counter).map((key) => {
return {
name: key,
- num: __cache_counter[key]
- }
- })
+ num: __cache_counter[key],
+ };
+ });
- await db.setNumMulti(counters)
- __cache_counter = {}
+ await db.setNumMulti(counters);
+ __cache_counter = {};
} catch (error) {
- console.log("pushDB is error: ", error)
+ logger.error("pushDB is error: ", error);
}
}
-async function getCountByName(name) {
- const defaultCount = { name, num: 0 }
+async function getCountByName(name, num) {
+ const defaultCount = { name, num: 0 };
- if (name === 'demo') return { name, num: '0123456789' }
+ if (name === "demo") return { name, num: "0123456789" };
+
+ if (num > 0) { return { name, num } };
try {
if (!(name in __cache_counter)) {
- const counter = await db.getNum(name) || defaultCount
- __cache_counter[name] = counter.num + 1
+ const counter = (await db.getNum(name)) || defaultCount;
+ __cache_counter[name] = counter.num + 1;
} else {
- __cache_counter[name]++
+ __cache_counter[name]++;
}
- pushDB()
-
- return { name, num: __cache_counter[name] }
+ pushDB();
+ return { name, num: __cache_counter[name] };
} catch (error) {
- console.log("get count by name is error: ", error)
- return defaultCount
-
+ logger.error("get count by name is error: ", error);
+ return defaultCount;
}
}
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index 223cb5d..0000000
--- a/package-lock.json
+++ /dev/null
@@ -1,2091 +0,0 @@
-{
- "name": "kawaii-counter",
- "version": "1.0.0",
- "lockfileVersion": 1,
- "requires": true,
- "dependencies": {
- "@babel/helper-validator-identifier": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
- "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw=="
- },
- "@babel/parser": {
- "version": "7.11.0",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.0.tgz",
- "integrity": "sha512-qvRvi4oI8xii8NllyEc4MDJjuZiNaRzyb7Y7lup1NqJV8TZHF4O27CcP+72WPn/k1zkgJ6WJfnIbk4jTsVAZHw=="
- },
- "@babel/types": {
- "version": "7.11.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz",
- "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==",
- "requires": {
- "@babel/helper-validator-identifier": "^7.10.4",
- "lodash": "^4.17.19",
- "to-fast-properties": "^2.0.0"
- }
- },
- "abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
- },
- "accepts": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
- "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
- "requires": {
- "mime-types": "~2.1.24",
- "negotiator": "0.6.2"
- }
- },
- "acorn": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz",
- "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w=="
- },
- "ajv": {
- "version": "6.12.3",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
- "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
- "optional": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "aproba": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
- "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
- },
- "are-we-there-yet": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
- "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
- "requires": {
- "delegates": "^1.0.0",
- "readable-stream": "^2.0.6"
- }
- },
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
- },
- "asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
- },
- "asn1": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
- "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
- "optional": true,
- "requires": {
- "safer-buffer": "~2.1.0"
- }
- },
- "assert-never": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz",
- "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw=="
- },
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "optional": true
- },
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
- "optional": true
- },
- "aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
- "optional": true
- },
- "aws4": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
- "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==",
- "optional": true
- },
- "babel-walk": {
- "version": "3.0.0-canary-5",
- "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz",
- "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==",
- "requires": {
- "@babel/types": "^7.9.6"
- }
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
- "optional": true,
- "requires": {
- "tweetnacl": "^0.14.3"
- }
- },
- "bl": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz",
- "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==",
- "requires": {
- "readable-stream": "^2.3.5",
- "safe-buffer": "^5.1.1"
- }
- },
- "block-stream": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
- "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
- "optional": true,
- "requires": {
- "inherits": "~2.0.0"
- }
- },
- "bluebird": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
- "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
- },
- "body-parser": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
- "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
- "requires": {
- "bytes": "3.1.0",
- "content-type": "~1.0.4",
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "http-errors": "1.7.2",
- "iconv-lite": "0.4.24",
- "on-finished": "~2.3.0",
- "qs": "6.7.0",
- "raw-body": "2.4.0",
- "type-is": "~1.6.17"
- }
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "bson": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz",
- "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg=="
- },
- "bytes": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
- "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
- },
- "camelcase": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
- "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo="
- },
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
- "optional": true
- },
- "character-parser": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz",
- "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=",
- "requires": {
- "is-regex": "^1.0.3"
- }
- },
- "chownr": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
- "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
- },
- "cliui": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
- "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
- "requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wrap-ansi": "^2.0.0"
- }
- },
- "code-point-at": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
- },
- "combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "optional": true,
- "requires": {
- "delayed-stream": "~1.0.0"
- }
- },
- "compressible": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
- "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
- "requires": {
- "mime-db": ">= 1.43.0 < 2"
- }
- },
- "compression": {
- "version": "1.7.4",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
- "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
- "requires": {
- "accepts": "~1.3.5",
- "bytes": "3.0.0",
- "compressible": "~2.0.16",
- "debug": "2.6.9",
- "on-headers": "~1.0.2",
- "safe-buffer": "5.1.2",
- "vary": "~1.1.2"
- },
- "dependencies": {
- "bytes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
- "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
- }
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "config-yml": {
- "version": "0.10.3",
- "resolved": "https://registry.npmjs.org/config-yml/-/config-yml-0.10.3.tgz",
- "integrity": "sha512-OsFOdaVpC7o0lNLOT9HGicTEB/txYESVqsCpeXdU86i1OrcMR4QJ0qwkmVujOe54kYA0bkKFucF9WvjCFVOvqQ==",
- "requires": {
- "js-yaml": "^3.6.1",
- "lodash": "^4.13.1",
- "moment": "^2.13.0",
- "shelljs": "^0.7.0",
- "yargs": "^4.7.1"
- }
- },
- "console-control-strings": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
- "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
- },
- "constantinople": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz",
- "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==",
- "requires": {
- "@babel/parser": "^7.6.0",
- "@babel/types": "^7.6.1"
- }
- },
- "content-disposition": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
- "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
- "requires": {
- "safe-buffer": "5.1.2"
- }
- },
- "content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
- },
- "cookie": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
- "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
- },
- "cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "optional": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
- },
- "deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "optional": true
- },
- "delegates": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
- "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
- },
- "denque": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz",
- "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ=="
- },
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
- },
- "destroy": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
- "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
- },
- "detect-libc": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
- "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
- },
- "doctypes": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz",
- "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk="
- },
- "ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
- "optional": true,
- "requires": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
- },
- "encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
- },
- "error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "requires": {
- "is-arrayish": "^0.2.1"
- }
- },
- "escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
- },
- "esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
- },
- "etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
- },
- "express": {
- "version": "4.17.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
- "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
- "requires": {
- "accepts": "~1.3.7",
- "array-flatten": "1.1.1",
- "body-parser": "1.19.0",
- "content-disposition": "0.5.3",
- "content-type": "~1.0.4",
- "cookie": "0.4.0",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "~1.1.2",
- "fresh": "0.5.2",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "~2.3.0",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.5",
- "qs": "6.7.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.1.2",
- "send": "0.17.1",
- "serve-static": "1.14.1",
- "setprototypeof": "1.1.1",
- "statuses": "~1.5.0",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- }
- },
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "optional": true
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
- "optional": true
- },
- "fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "optional": true
- },
- "fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "optional": true
- },
- "finalhandler": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
- "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
- "requires": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "~2.3.0",
- "parseurl": "~1.3.3",
- "statuses": "~1.5.0",
- "unpipe": "~1.0.0"
- }
- },
- "find-up": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
- "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
- "requires": {
- "path-exists": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
- "optional": true
- },
- "form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "optional": true,
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- }
- },
- "forwarded": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
- "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
- },
- "fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
- },
- "fs-minipass": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
- "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
- "requires": {
- "minipass": "^2.6.0"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "fstream": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
- "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
- "optional": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "inherits": "~2.0.0",
- "mkdirp": ">=0.5 0",
- "rimraf": "2"
- }
- },
- "gauge": {
- "version": "2.7.4",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
- "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
- "requires": {
- "aproba": "^1.0.3",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.0",
- "object-assign": "^4.1.0",
- "signal-exit": "^3.0.0",
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wide-align": "^1.1.0"
- }
- },
- "get-caller-file": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
- "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w=="
- },
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "optional": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "graceful-fs": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
- "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
- },
- "har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
- "optional": true
- },
- "har-validator": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
- "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
- "optional": true,
- "requires": {
- "ajv": "^6.12.3",
- "har-schema": "^2.0.0"
- }
- },
- "has-symbols": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
- "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
- },
- "has-unicode": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
- "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
- },
- "hosted-git-info": {
- "version": "2.8.8",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
- "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg=="
- },
- "http-errors": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
- "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.1",
- "statuses": ">= 1.5.0 < 2",
- "toidentifier": "1.0.0"
- }
- },
- "http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
- "optional": true,
- "requires": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- }
- },
- "iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "ignore-walk": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz",
- "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==",
- "requires": {
- "minimatch": "^3.0.4"
- }
- },
- "image-size": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.8.3.tgz",
- "integrity": "sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==",
- "requires": {
- "queue": "6.0.1"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
- },
- "interpret": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
- "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA=="
- },
- "invert-kv": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
- "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
- },
- "ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
- },
- "is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
- },
- "is-expression": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz",
- "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==",
- "requires": {
- "acorn": "^7.1.1",
- "object-assign": "^4.1.1"
- }
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "is-promise": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
- "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
- },
- "is-regex": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz",
- "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==",
- "requires": {
- "has-symbols": "^1.0.1"
- }
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "optional": true
- },
- "is-utf8": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
- "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "optional": true
- },
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
- "optional": true
- },
- "js-stringify": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
- "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds="
- },
- "js-yaml": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
- "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
- "optional": true
- },
- "json-schema": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
- "optional": true
- },
- "json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "optional": true
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
- "optional": true
- },
- "jsprim": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
- "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
- "optional": true,
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.2.3",
- "verror": "1.10.0"
- }
- },
- "jstransformer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
- "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=",
- "requires": {
- "is-promise": "^2.0.0",
- "promise": "^7.0.1"
- }
- },
- "kareem": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz",
- "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw=="
- },
- "lcid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
- "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
- "requires": {
- "invert-kv": "^1.0.0"
- }
- },
- "load-json-file": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
- "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
- "requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0",
- "strip-bom": "^2.0.0"
- }
- },
- "lodash": {
- "version": "4.17.19",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
- "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
- },
- "lodash.assign": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
- "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc="
- },
- "media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
- },
- "memory-pager": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
- "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
- "optional": true
- },
- "merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
- },
- "methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
- },
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
- },
- "mime-db": {
- "version": "1.44.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
- "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
- },
- "mime-types": {
- "version": "2.1.27",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
- "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
- "requires": {
- "mime-db": "1.44.0"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "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=="
- },
- "minipass": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
- "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
- "requires": {
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.0"
- }
- },
- "minizlib": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
- "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
- "requires": {
- "minipass": "^2.9.0"
- }
- },
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "moment": {
- "version": "2.27.0",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz",
- "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ=="
- },
- "mongodb": {
- "version": "3.5.10",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.10.tgz",
- "integrity": "sha512-p/C48UvTU/dr/PQEDKfb9DsCVDJWXGmdJNFC+u5FPmTQVtog69X6D8vrWHz+sJx1zJnd96sjdh9ueo7bx2ILTw==",
- "requires": {
- "bl": "^2.2.0",
- "bson": "^1.1.4",
- "denque": "^1.4.1",
- "require_optional": "^1.0.1",
- "safe-buffer": "^5.1.2",
- "saslprep": "^1.0.0"
- }
- },
- "mongoose": {
- "version": "5.9.28",
- "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.9.28.tgz",
- "integrity": "sha512-A8lNRk4eCQDzk+DagSMYdH94LAYrbTK83LgrUlzqdig3YXvizW3DApJqOWQ5DdhuimvsfiD0Z5NTVzXl/rgi2w==",
- "requires": {
- "bson": "^1.1.4",
- "kareem": "2.3.1",
- "mongodb": "3.5.10",
- "mongoose-legacy-pluralize": "1.0.2",
- "mpath": "0.7.0",
- "mquery": "3.2.2",
- "ms": "2.1.2",
- "regexp-clone": "1.0.0",
- "safe-buffer": "5.2.1",
- "sift": "7.0.1",
- "sliced": "1.0.1"
- },
- "dependencies": {
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
- }
- }
- },
- "mongoose-legacy-pluralize": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz",
- "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ=="
- },
- "mpath": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.7.0.tgz",
- "integrity": "sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg=="
- },
- "mquery": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz",
- "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==",
- "requires": {
- "bluebird": "3.5.1",
- "debug": "3.1.0",
- "regexp-clone": "^1.0.0",
- "safe-buffer": "5.1.2",
- "sliced": "1.0.1"
- },
- "dependencies": {
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "requires": {
- "ms": "2.0.0"
- }
- }
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "needle": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.0.tgz",
- "integrity": "sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA==",
- "requires": {
- "debug": "^3.2.6",
- "iconv-lite": "^0.4.4",
- "sax": "^1.2.4"
- },
- "dependencies": {
- "debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- }
- }
- },
- "negotiator": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
- "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
- },
- "node-addon-api": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.0.tgz",
- "integrity": "sha512-ASCL5U13as7HhOExbT6OlWJJUV/lLzL2voOSP1UVehpRD8FbSrSDjfScK/KwAvVTI5AS6r4VwbOMlIqtvRidnA=="
- },
- "node-gyp": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
- "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
- "optional": true,
- "requires": {
- "fstream": "^1.0.0",
- "glob": "^7.0.3",
- "graceful-fs": "^4.1.2",
- "mkdirp": "^0.5.0",
- "nopt": "2 || 3",
- "npmlog": "0 || 1 || 2 || 3 || 4",
- "osenv": "0",
- "request": "^2.87.0",
- "rimraf": "2",
- "semver": "~5.3.0",
- "tar": "^2.0.0",
- "which": "1"
- }
- },
- "node-pre-gyp": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz",
- "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==",
- "requires": {
- "detect-libc": "^1.0.2",
- "mkdirp": "^0.5.1",
- "needle": "^2.2.1",
- "nopt": "^4.0.1",
- "npm-packlist": "^1.1.6",
- "npmlog": "^4.0.2",
- "rc": "^1.2.7",
- "rimraf": "^2.6.1",
- "semver": "^5.3.0",
- "tar": "^4"
- },
- "dependencies": {
- "nopt": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
- "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
- "requires": {
- "abbrev": "1",
- "osenv": "^0.1.4"
- }
- },
- "tar": {
- "version": "4.4.13",
- "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
- "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
- "requires": {
- "chownr": "^1.1.1",
- "fs-minipass": "^1.2.5",
- "minipass": "^2.8.6",
- "minizlib": "^1.2.1",
- "mkdirp": "^0.5.0",
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.3"
- }
- }
- }
- },
- "nopt": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
- "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
- "optional": true,
- "requires": {
- "abbrev": "1"
- }
- },
- "normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "requires": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "npm-bundled": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz",
- "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
- "requires": {
- "npm-normalize-package-bin": "^1.0.1"
- }
- },
- "npm-normalize-package-bin": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
- "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
- },
- "npm-packlist": {
- "version": "1.4.8",
- "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz",
- "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==",
- "requires": {
- "ignore-walk": "^3.0.1",
- "npm-bundled": "^1.0.1",
- "npm-normalize-package-bin": "^1.0.1"
- }
- },
- "npmlog": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
- "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
- "requires": {
- "are-we-there-yet": "~1.1.2",
- "console-control-strings": "~1.1.0",
- "gauge": "~2.7.3",
- "set-blocking": "~2.0.0"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
- },
- "oauth-sign": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
- "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
- "optional": true
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "on-finished": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
- "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "on-headers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
- "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
- },
- "os-locale": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
- "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
- "requires": {
- "lcid": "^1.0.0"
- }
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
- },
- "osenv": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
- "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
- "requires": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.0"
- }
- },
- "parse-json": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
- "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
- "requires": {
- "error-ex": "^1.2.0"
- }
- },
- "parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
- },
- "path-exists": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
- "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
- "requires": {
- "pinkie-promise": "^2.0.0"
- }
- },
- "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="
- },
- "path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
- },
- "path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
- },
- "path-type": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
- "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
- "requires": {
- "graceful-fs": "^4.1.2",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
- "optional": true
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- },
- "pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
- },
- "pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
- "requires": {
- "pinkie": "^2.0.0"
- }
- },
- "process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
- },
- "promise": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
- "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
- "requires": {
- "asap": "~2.0.3"
- }
- },
- "proxy-addr": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
- "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
- "requires": {
- "forwarded": "~0.1.2",
- "ipaddr.js": "1.9.1"
- }
- },
- "psl": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
- "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
- "optional": true
- },
- "pug": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.0.tgz",
- "integrity": "sha512-inmsJyFBSHZaiGLaguoFgJGViX0If6AcfcElimvwj9perqjDpUpw79UIEDZbWFmoGVidh08aoE+e8tVkjVJPCw==",
- "requires": {
- "pug-code-gen": "^3.0.0",
- "pug-filters": "^4.0.0",
- "pug-lexer": "^5.0.0",
- "pug-linker": "^4.0.0",
- "pug-load": "^3.0.0",
- "pug-parser": "^6.0.0",
- "pug-runtime": "^3.0.0",
- "pug-strip-comments": "^2.0.0"
- }
- },
- "pug-attrs": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz",
- "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==",
- "requires": {
- "constantinople": "^4.0.1",
- "js-stringify": "^1.0.2",
- "pug-runtime": "^3.0.0"
- }
- },
- "pug-code-gen": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.1.tgz",
- "integrity": "sha512-xJIGvmXTQlkJllq6hqxxjRWcay2F9CU69TuAuiVZgHK0afOhG5txrQOcZyaPHBvSWCU/QQOqEp5XCH94rRZpBQ==",
- "requires": {
- "constantinople": "^4.0.1",
- "doctypes": "^1.1.0",
- "js-stringify": "^1.0.2",
- "pug-attrs": "^3.0.0",
- "pug-error": "^2.0.0",
- "pug-runtime": "^3.0.0",
- "void-elements": "^3.1.0",
- "with": "^7.0.0"
- }
- },
- "pug-error": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz",
- "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ=="
- },
- "pug-filters": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz",
- "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==",
- "requires": {
- "constantinople": "^4.0.1",
- "jstransformer": "1.0.0",
- "pug-error": "^2.0.0",
- "pug-walk": "^2.0.0",
- "resolve": "^1.15.1"
- }
- },
- "pug-lexer": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.0.tgz",
- "integrity": "sha512-52xMk8nNpuyQ/M2wjZBN5gXQLIylaGkAoTk5Y1pBhVqaopaoj8Z0iVzpbFZAqitL4RHNVDZRnJDsqEYe99Ti0A==",
- "requires": {
- "character-parser": "^2.2.0",
- "is-expression": "^4.0.0",
- "pug-error": "^2.0.0"
- }
- },
- "pug-linker": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz",
- "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==",
- "requires": {
- "pug-error": "^2.0.0",
- "pug-walk": "^2.0.0"
- }
- },
- "pug-load": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz",
- "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==",
- "requires": {
- "object-assign": "^4.1.1",
- "pug-walk": "^2.0.0"
- }
- },
- "pug-parser": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz",
- "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==",
- "requires": {
- "pug-error": "^2.0.0",
- "token-stream": "1.0.0"
- }
- },
- "pug-runtime": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.0.tgz",
- "integrity": "sha512-GoEPcmQNnaTsePEdVA05bDpY+Op5VLHKayg08AQiqJBWU/yIaywEYv7TetC5dEQS3fzBBoyb2InDcZEg3mPTIA=="
- },
- "pug-strip-comments": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz",
- "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==",
- "requires": {
- "pug-error": "^2.0.0"
- }
- },
- "pug-walk": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz",
- "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ=="
- },
- "punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "optional": true
- },
- "qs": {
- "version": "6.7.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
- "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
- },
- "queue": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz",
- "integrity": "sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==",
- "requires": {
- "inherits": "~2.0.3"
- }
- },
- "range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
- },
- "raw-body": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
- "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
- "requires": {
- "bytes": "3.1.0",
- "http-errors": "1.7.2",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- }
- },
- "rc": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
- "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
- "requires": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- }
- },
- "read-pkg": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
- "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
- "requires": {
- "load-json-file": "^1.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^1.0.0"
- }
- },
- "read-pkg-up": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
- "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
- "requires": {
- "find-up": "^1.0.0",
- "read-pkg": "^1.0.0"
- }
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "rechoir": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
- "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
- "requires": {
- "resolve": "^1.1.6"
- }
- },
- "regexp-clone": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz",
- "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw=="
- },
- "request": {
- "version": "2.88.2",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
- "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
- "optional": true,
- "requires": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.3",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.5.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
- },
- "dependencies": {
- "qs": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
- "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
- "optional": true
- }
- }
- },
- "require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
- },
- "require-main-filename": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
- "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
- },
- "require_optional": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
- "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==",
- "requires": {
- "resolve-from": "^2.0.0",
- "semver": "^5.1.0"
- }
- },
- "resolve": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
- "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
- "requires": {
- "path-parse": "^1.0.6"
- }
- },
- "resolve-from": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
- "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
- },
- "rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "saslprep": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
- "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
- "optional": true,
- "requires": {
- "sparse-bitfield": "^3.0.3"
- }
- },
- "sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
- },
- "semver": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
- "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8="
- },
- "send": {
- "version": "0.17.1",
- "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
- "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
- "requires": {
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "destroy": "~1.0.4",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "~1.7.2",
- "mime": "1.6.0",
- "ms": "2.1.1",
- "on-finished": "~2.3.0",
- "range-parser": "~1.2.1",
- "statuses": "~1.5.0"
- },
- "dependencies": {
- "ms": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
- }
- }
- },
- "serve-static": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
- "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
- "requires": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.17.1"
- }
- },
- "set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
- },
- "setprototypeof": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
- "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
- },
- "shelljs": {
- "version": "0.7.8",
- "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz",
- "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=",
- "requires": {
- "glob": "^7.0.0",
- "interpret": "^1.0.0",
- "rechoir": "^0.6.2"
- }
- },
- "sift": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz",
- "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g=="
- },
- "signal-exit": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
- "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
- },
- "sliced": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
- "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E="
- },
- "sparse-bitfield": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
- "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
- "optional": true,
- "requires": {
- "memory-pager": "^1.0.2"
- }
- },
- "spdx-correct": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
- "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
- "requires": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-exceptions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
- "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A=="
- },
- "spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
- "requires": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-license-ids": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
- "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q=="
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
- },
- "sqlite3": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.0.tgz",
- "integrity": "sha512-rjvqHFUaSGnzxDy2AHCwhHy6Zp6MNJzCPGYju4kD8yi6bze4d1/zMTg6C7JI49b7/EM7jKMTvyfN/4ylBKdwfw==",
- "requires": {
- "node-addon-api": "2.0.0",
- "node-gyp": "3.x",
- "node-pre-gyp": "^0.11.0"
- }
- },
- "sshpk": {
- "version": "1.16.1",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
- "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
- "optional": true,
- "requires": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- }
- },
- "statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "strip-bom": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
- "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
- "requires": {
- "is-utf8": "^0.2.0"
- }
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
- },
- "tar": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz",
- "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==",
- "optional": true,
- "requires": {
- "block-stream": "*",
- "fstream": "^1.0.12",
- "inherits": "2"
- }
- },
- "to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
- },
- "toidentifier": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
- "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
- },
- "token-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz",
- "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ="
- },
- "tough-cookie": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
- "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
- "optional": true,
- "requires": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
- }
- },
- "tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
- "optional": true,
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
- "optional": true
- },
- "type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "requires": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- }
- },
- "unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
- },
- "uri-js": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
- "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
- "optional": true,
- "requires": {
- "punycode": "^2.1.0"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
- },
- "uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "optional": true
- },
- "validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
- "requires": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
- },
- "verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
- "optional": true,
- "requires": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
- "void-elements": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
- "integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk="
- },
- "which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "optional": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "which-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
- "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8="
- },
- "wide-align": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
- "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
- "requires": {
- "string-width": "^1.0.2 || 2"
- }
- },
- "window-size": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz",
- "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU="
- },
- "with": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz",
- "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==",
- "requires": {
- "@babel/parser": "^7.9.6",
- "@babel/types": "^7.9.6",
- "assert-never": "^1.2.1",
- "babel-walk": "3.0.0-canary-5"
- }
- },
- "wrap-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
- "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
- "requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "y18n": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
- },
- "yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
- },
- "yargs": {
- "version": "4.8.1",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz",
- "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=",
- "requires": {
- "cliui": "^3.2.0",
- "decamelize": "^1.1.1",
- "get-caller-file": "^1.0.1",
- "lodash.assign": "^4.0.3",
- "os-locale": "^1.4.0",
- "read-pkg-up": "^1.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
- "set-blocking": "^2.0.0",
- "string-width": "^1.0.1",
- "which-module": "^1.0.0",
- "window-size": "^0.2.0",
- "y18n": "^3.2.1",
- "yargs-parser": "^2.4.1"
- }
- },
- "yargs-parser": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz",
- "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=",
- "requires": {
- "camelcase": "^3.0.0",
- "lodash.assign": "^4.0.6"
- }
- }
- }
-}
diff --git a/package.json b/package.json
index df1b7d6..83187aa 100644
--- a/package.json
+++ b/package.json
@@ -11,13 +11,17 @@
"author": "journey-ad",
"license": "MIT",
"dependencies": {
- "better-sqlite3": "^8.1.0",
+ "better-sqlite3": "^8.2.0",
"compression": "^1.7.4",
- "config-yml": "^0.10.3",
- "express": "^4.17.1",
+ "dotenv": "^16.4.5",
+ "express": "^4.18.2",
"image-size": "^0.8.3",
"mime-types": "^2.1.27",
"mongoose": "^5.9.28",
- "pug": "^3.0.0"
+ "pug": "^3.0.0",
+ "zod": "^3.23.8"
+ },
+ "engines": {
+ "node": "16.x"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..dc08804
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,1273 @@
+lockfileVersion: '6.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+dependencies:
+ better-sqlite3:
+ specifier: ^8.2.0
+ version: 8.7.0
+ compression:
+ specifier: ^1.7.4
+ version: 1.7.4
+ dotenv:
+ specifier: ^16.4.5
+ version: 16.4.5
+ express:
+ specifier: ^4.18.2
+ version: 4.21.1
+ image-size:
+ specifier: ^0.8.3
+ version: 0.8.3
+ mime-types:
+ specifier: ^2.1.27
+ version: 2.1.35
+ mongoose:
+ specifier: ^5.9.28
+ version: 5.13.22
+ pug:
+ specifier: ^3.0.0
+ version: 3.0.3
+ zod:
+ specifier: ^3.23.8
+ version: 3.23.8
+
+packages:
+
+ /@babel/helper-string-parser@7.25.7:
+ resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==}
+ engines: {node: '>=6.9.0'}
+ dev: false
+
+ /@babel/helper-validator-identifier@7.25.7:
+ resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==}
+ engines: {node: '>=6.9.0'}
+ dev: false
+
+ /@babel/parser@7.25.8:
+ resolution: {integrity: sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+ dependencies:
+ '@babel/types': 7.25.8
+ dev: false
+
+ /@babel/types@7.25.8:
+ resolution: {integrity: sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-string-parser': 7.25.7
+ '@babel/helper-validator-identifier': 7.25.7
+ to-fast-properties: 2.0.0
+ dev: false
+
+ /@types/bson@4.0.5:
+ resolution: {integrity: sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg==}
+ dependencies:
+ '@types/node': 22.7.7
+ dev: false
+
+ /@types/mongodb@3.6.20:
+ resolution: {integrity: sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==}
+ dependencies:
+ '@types/bson': 4.0.5
+ '@types/node': 22.7.7
+ dev: false
+
+ /@types/node@22.7.7:
+ resolution: {integrity: sha512-SRxCrrg9CL/y54aiMCG3edPKdprgMVGDXjA3gB8UmmBW5TcXzRUYAh8EWzTnSJFAd1rgImPELza+A3bJ+qxz8Q==}
+ dependencies:
+ undici-types: 6.19.8
+ dev: false
+
+ /accepts@1.3.8:
+ resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-types: 2.1.35
+ negotiator: 0.6.3
+ dev: false
+
+ /acorn@7.4.1:
+ resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+ dev: false
+
+ /array-flatten@1.1.1:
+ resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
+ dev: false
+
+ /asap@2.0.6:
+ resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
+ dev: false
+
+ /assert-never@1.3.0:
+ resolution: {integrity: sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ==}
+ dev: false
+
+ /babel-walk@3.0.0-canary-5:
+ resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==}
+ engines: {node: '>= 10.0.0'}
+ dependencies:
+ '@babel/types': 7.25.8
+ dev: false
+
+ /base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+ dev: false
+
+ /better-sqlite3@8.7.0:
+ resolution: {integrity: sha512-99jZU4le+f3G6aIl6PmmV0cxUIWqKieHxsiF7G34CVFiE+/UabpYqkU0NJIkY/96mQKikHeBjtR27vFfs5JpEw==}
+ requiresBuild: true
+ dependencies:
+ bindings: 1.5.0
+ prebuild-install: 7.1.2
+ dev: false
+
+ /bindings@1.5.0:
+ resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
+ dependencies:
+ file-uri-to-path: 1.0.0
+ dev: false
+
+ /bl@2.2.1:
+ resolution: {integrity: sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==}
+ dependencies:
+ readable-stream: 2.3.8
+ safe-buffer: 5.2.1
+ dev: false
+
+ /bl@4.1.0:
+ resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+ dependencies:
+ buffer: 5.7.1
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ dev: false
+
+ /bluebird@3.5.1:
+ resolution: {integrity: sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==}
+ dev: false
+
+ /body-parser@1.20.3:
+ resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+ dependencies:
+ bytes: 3.1.2
+ content-type: 1.0.5
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ on-finished: 2.4.1
+ qs: 6.13.0
+ raw-body: 2.5.2
+ type-is: 1.6.18
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /bson@1.1.6:
+ resolution: {integrity: sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==}
+ engines: {node: '>=0.6.19'}
+ dev: false
+
+ /buffer@5.7.1:
+ resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+ dev: false
+
+ /bytes@3.0.0:
+ resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /bytes@3.1.2:
+ resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /call-bind@1.0.7:
+ resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.4
+ set-function-length: 1.2.2
+ dev: false
+
+ /character-parser@2.2.0:
+ resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==}
+ dependencies:
+ is-regex: 1.1.4
+ dev: false
+
+ /chownr@1.1.4:
+ resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
+ dev: false
+
+ /compressible@2.0.18:
+ resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-db: 1.53.0
+ dev: false
+
+ /compression@1.7.4:
+ resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ accepts: 1.3.8
+ bytes: 3.0.0
+ compressible: 2.0.18
+ debug: 2.6.9
+ on-headers: 1.0.2
+ safe-buffer: 5.1.2
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /constantinople@4.0.1:
+ resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==}
+ dependencies:
+ '@babel/parser': 7.25.8
+ '@babel/types': 7.25.8
+ dev: false
+
+ /content-disposition@0.5.4:
+ resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: false
+
+ /content-type@1.0.5:
+ resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /cookie-signature@1.0.6:
+ resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
+ dev: false
+
+ /cookie@0.7.1:
+ resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /core-util-is@1.0.3:
+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+ dev: false
+
+ /debug@2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.0.0
+ dev: false
+
+ /debug@3.1.0:
+ resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.0.0
+ dev: false
+
+ /decompress-response@6.0.0:
+ resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ mimic-response: 3.1.0
+ dev: false
+
+ /deep-extend@0.6.0:
+ resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
+ engines: {node: '>=4.0.0'}
+ dev: false
+
+ /define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ gopd: 1.0.1
+ dev: false
+
+ /denque@1.5.1:
+ resolution: {integrity: sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==}
+ engines: {node: '>=0.10'}
+ dev: false
+
+ /depd@2.0.0:
+ resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /destroy@1.2.0:
+ resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+ dev: false
+
+ /detect-libc@2.0.3:
+ resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /doctypes@1.1.0:
+ resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==}
+ dev: false
+
+ /dotenv@16.4.5:
+ resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /ee-first@1.1.1:
+ resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+ dev: false
+
+ /encodeurl@1.0.2:
+ resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /encodeurl@2.0.0:
+ resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /end-of-stream@1.4.4:
+ resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
+ dependencies:
+ once: 1.4.0
+ dev: false
+
+ /es-define-property@1.0.0:
+ resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ get-intrinsic: 1.2.4
+ dev: false
+
+ /es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+ dev: false
+
+ /escape-html@1.0.3:
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+ dev: false
+
+ /etag@1.8.1:
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /expand-template@2.0.3:
+ resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /express@4.21.1:
+ resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==}
+ engines: {node: '>= 0.10.0'}
+ dependencies:
+ accepts: 1.3.8
+ array-flatten: 1.1.1
+ body-parser: 1.20.3
+ content-disposition: 0.5.4
+ content-type: 1.0.5
+ cookie: 0.7.1
+ cookie-signature: 1.0.6
+ debug: 2.6.9
+ depd: 2.0.0
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ finalhandler: 1.3.1
+ fresh: 0.5.2
+ http-errors: 2.0.0
+ merge-descriptors: 1.0.3
+ methods: 1.1.2
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ path-to-regexp: 0.1.10
+ proxy-addr: 2.0.7
+ qs: 6.13.0
+ range-parser: 1.2.1
+ safe-buffer: 5.2.1
+ send: 0.19.0
+ serve-static: 1.16.2
+ setprototypeof: 1.2.0
+ statuses: 2.0.1
+ type-is: 1.6.18
+ utils-merge: 1.0.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /file-uri-to-path@1.0.0:
+ resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
+ dev: false
+
+ /finalhandler@1.3.1:
+ resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ debug: 2.6.9
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ statuses: 2.0.1
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /forwarded@0.2.0:
+ resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /fresh@0.5.2:
+ resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /fs-constants@1.0.0:
+ resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
+ dev: false
+
+ /function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+ dev: false
+
+ /get-intrinsic@1.2.4:
+ resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ has-proto: 1.0.3
+ has-symbols: 1.0.3
+ hasown: 2.0.2
+ dev: false
+
+ /github-from-package@0.0.0:
+ resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==}
+ dev: false
+
+ /gopd@1.0.1:
+ resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
+ dependencies:
+ get-intrinsic: 1.2.4
+ dev: false
+
+ /has-property-descriptors@1.0.2:
+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+ dependencies:
+ es-define-property: 1.0.0
+ dev: false
+
+ /has-proto@1.0.3:
+ resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
+ engines: {node: '>= 0.4'}
+ dev: false
+
+ /has-symbols@1.0.3:
+ resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
+ engines: {node: '>= 0.4'}
+ dev: false
+
+ /has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-symbols: 1.0.3
+ dev: false
+
+ /hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ function-bind: 1.1.2
+ dev: false
+
+ /http-errors@2.0.0:
+ resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ depd: 2.0.0
+ inherits: 2.0.4
+ setprototypeof: 1.2.0
+ statuses: 2.0.1
+ toidentifier: 1.0.1
+ dev: false
+
+ /iconv-lite@0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ safer-buffer: 2.1.2
+ dev: false
+
+ /ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+ dev: false
+
+ /image-size@0.8.3:
+ resolution: {integrity: sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==}
+ engines: {node: '>=6.9.0'}
+ hasBin: true
+ dependencies:
+ queue: 6.0.1
+ dev: false
+
+ /inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+ dev: false
+
+ /ini@1.3.8:
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+ dev: false
+
+ /ipaddr.js@1.9.1:
+ resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
+ engines: {node: '>= 0.10'}
+ dev: false
+
+ /is-core-module@2.15.1:
+ resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ hasown: 2.0.2
+ dev: false
+
+ /is-expression@4.0.0:
+ resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==}
+ dependencies:
+ acorn: 7.4.1
+ object-assign: 4.1.1
+ dev: false
+
+ /is-promise@2.2.2:
+ resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==}
+ dev: false
+
+ /is-regex@1.1.4:
+ resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ has-tostringtag: 1.0.2
+ dev: false
+
+ /isarray@1.0.0:
+ resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+ dev: false
+
+ /js-stringify@1.0.2:
+ resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==}
+ dev: false
+
+ /jstransformer@1.0.0:
+ resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==}
+ dependencies:
+ is-promise: 2.2.2
+ promise: 7.3.1
+ dev: false
+
+ /kareem@2.3.2:
+ resolution: {integrity: sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==}
+ dev: false
+
+ /media-typer@0.3.0:
+ resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /memory-pager@1.5.0:
+ resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==}
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /merge-descriptors@1.0.3:
+ resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
+ dev: false
+
+ /methods@1.1.2:
+ resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /mime-db@1.53.0:
+ resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-db: 1.52.0
+ dev: false
+
+ /mime@1.6.0:
+ resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: false
+
+ /mimic-response@3.1.0:
+ resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
+ engines: {node: '>=10'}
+ dev: false
+
+ /minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+ dev: false
+
+ /mkdirp-classic@0.5.3:
+ resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
+ dev: false
+
+ /mongodb@3.7.4:
+ resolution: {integrity: sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ aws4: '*'
+ bson-ext: '*'
+ kerberos: '*'
+ mongodb-client-encryption: '*'
+ mongodb-extjson: '*'
+ snappy: '*'
+ peerDependenciesMeta:
+ aws4:
+ optional: true
+ bson-ext:
+ optional: true
+ kerberos:
+ optional: true
+ mongodb-client-encryption:
+ optional: true
+ mongodb-extjson:
+ optional: true
+ snappy:
+ optional: true
+ dependencies:
+ bl: 2.2.1
+ bson: 1.1.6
+ denque: 1.5.1
+ optional-require: 1.1.8
+ safe-buffer: 5.2.1
+ optionalDependencies:
+ saslprep: 1.0.3
+ dev: false
+
+ /mongoose-legacy-pluralize@1.0.2(mongoose@5.13.22):
+ resolution: {integrity: sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==}
+ peerDependencies:
+ mongoose: '*'
+ dependencies:
+ mongoose: 5.13.22
+ dev: false
+
+ /mongoose@5.13.22:
+ resolution: {integrity: sha512-p51k/c4X/MfqeQ3I1ranlDiggLzNumZrTDD9CeezHwZxt2/btf+YZD7MCe07RAY2NgFYVMayq6jMamw02Jmf9w==}
+ engines: {node: '>=4.0.0'}
+ dependencies:
+ '@types/bson': 4.0.5
+ '@types/mongodb': 3.6.20
+ bson: 1.1.6
+ kareem: 2.3.2
+ mongodb: 3.7.4
+ mongoose-legacy-pluralize: 1.0.2(mongoose@5.13.22)
+ mpath: 0.8.4
+ mquery: 3.2.5
+ ms: 2.1.2
+ optional-require: 1.0.3
+ regexp-clone: 1.0.0
+ safe-buffer: 5.2.1
+ sift: 13.5.2
+ sliced: 1.0.1
+ transitivePeerDependencies:
+ - aws4
+ - bson-ext
+ - kerberos
+ - mongodb-client-encryption
+ - mongodb-extjson
+ - snappy
+ - supports-color
+ dev: false
+
+ /mpath@0.8.4:
+ resolution: {integrity: sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==}
+ engines: {node: '>=4.0.0'}
+ dev: false
+
+ /mquery@3.2.5:
+ resolution: {integrity: sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==}
+ engines: {node: '>=4.0.0'}
+ dependencies:
+ bluebird: 3.5.1
+ debug: 3.1.0
+ regexp-clone: 1.0.0
+ safe-buffer: 5.1.2
+ sliced: 1.0.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /ms@2.0.0:
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+ dev: false
+
+ /ms@2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+ dev: false
+
+ /ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ dev: false
+
+ /napi-build-utils@1.0.2:
+ resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==}
+ dev: false
+
+ /negotiator@0.6.3:
+ resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /node-abi@3.71.0:
+ resolution: {integrity: sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==}
+ engines: {node: '>=10'}
+ dependencies:
+ semver: 7.6.3
+ dev: false
+
+ /object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /object-inspect@1.13.2:
+ resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==}
+ engines: {node: '>= 0.4'}
+ dev: false
+
+ /on-finished@2.4.1:
+ resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ ee-first: 1.1.1
+ dev: false
+
+ /on-headers@1.0.2:
+ resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ dependencies:
+ wrappy: 1.0.2
+ dev: false
+
+ /optional-require@1.0.3:
+ resolution: {integrity: sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /optional-require@1.1.8:
+ resolution: {integrity: sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==}
+ engines: {node: '>=4'}
+ dependencies:
+ require-at: 1.0.6
+ dev: false
+
+ /parseurl@1.3.3:
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+ dev: false
+
+ /path-to-regexp@0.1.10:
+ resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==}
+ dev: false
+
+ /prebuild-install@7.1.2:
+ resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ detect-libc: 2.0.3
+ expand-template: 2.0.3
+ github-from-package: 0.0.0
+ minimist: 1.2.8
+ mkdirp-classic: 0.5.3
+ napi-build-utils: 1.0.2
+ node-abi: 3.71.0
+ pump: 3.0.2
+ rc: 1.2.8
+ simple-get: 4.0.1
+ tar-fs: 2.1.1
+ tunnel-agent: 0.6.0
+ dev: false
+
+ /process-nextick-args@2.0.1:
+ resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+ dev: false
+
+ /promise@7.3.1:
+ resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==}
+ dependencies:
+ asap: 2.0.6
+ dev: false
+
+ /proxy-addr@2.0.7:
+ resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
+ engines: {node: '>= 0.10'}
+ dependencies:
+ forwarded: 0.2.0
+ ipaddr.js: 1.9.1
+ dev: false
+
+ /pug-attrs@3.0.0:
+ resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==}
+ dependencies:
+ constantinople: 4.0.1
+ js-stringify: 1.0.2
+ pug-runtime: 3.0.1
+ dev: false
+
+ /pug-code-gen@3.0.3:
+ resolution: {integrity: sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==}
+ dependencies:
+ constantinople: 4.0.1
+ doctypes: 1.1.0
+ js-stringify: 1.0.2
+ pug-attrs: 3.0.0
+ pug-error: 2.1.0
+ pug-runtime: 3.0.1
+ void-elements: 3.1.0
+ with: 7.0.2
+ dev: false
+
+ /pug-error@2.1.0:
+ resolution: {integrity: sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==}
+ dev: false
+
+ /pug-filters@4.0.0:
+ resolution: {integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==}
+ dependencies:
+ constantinople: 4.0.1
+ jstransformer: 1.0.0
+ pug-error: 2.1.0
+ pug-walk: 2.0.0
+ resolve: 1.22.8
+ dev: false
+
+ /pug-lexer@5.0.1:
+ resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==}
+ dependencies:
+ character-parser: 2.2.0
+ is-expression: 4.0.0
+ pug-error: 2.1.0
+ dev: false
+
+ /pug-linker@4.0.0:
+ resolution: {integrity: sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==}
+ dependencies:
+ pug-error: 2.1.0
+ pug-walk: 2.0.0
+ dev: false
+
+ /pug-load@3.0.0:
+ resolution: {integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==}
+ dependencies:
+ object-assign: 4.1.1
+ pug-walk: 2.0.0
+ dev: false
+
+ /pug-parser@6.0.0:
+ resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==}
+ dependencies:
+ pug-error: 2.1.0
+ token-stream: 1.0.0
+ dev: false
+
+ /pug-runtime@3.0.1:
+ resolution: {integrity: sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==}
+ dev: false
+
+ /pug-strip-comments@2.0.0:
+ resolution: {integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==}
+ dependencies:
+ pug-error: 2.1.0
+ dev: false
+
+ /pug-walk@2.0.0:
+ resolution: {integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==}
+ dev: false
+
+ /pug@3.0.3:
+ resolution: {integrity: sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==}
+ dependencies:
+ pug-code-gen: 3.0.3
+ pug-filters: 4.0.0
+ pug-lexer: 5.0.1
+ pug-linker: 4.0.0
+ pug-load: 3.0.0
+ pug-parser: 6.0.0
+ pug-runtime: 3.0.1
+ pug-strip-comments: 2.0.0
+ dev: false
+
+ /pump@3.0.2:
+ resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==}
+ dependencies:
+ end-of-stream: 1.4.4
+ once: 1.4.0
+ dev: false
+
+ /qs@6.13.0:
+ resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
+ engines: {node: '>=0.6'}
+ dependencies:
+ side-channel: 1.0.6
+ dev: false
+
+ /queue@6.0.1:
+ resolution: {integrity: sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==}
+ dependencies:
+ inherits: 2.0.4
+ dev: false
+
+ /range-parser@1.2.1:
+ resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /raw-body@2.5.2:
+ resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ bytes: 3.1.2
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ unpipe: 1.0.0
+ dev: false
+
+ /rc@1.2.8:
+ resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
+ hasBin: true
+ dependencies:
+ deep-extend: 0.6.0
+ ini: 1.3.8
+ minimist: 1.2.8
+ strip-json-comments: 2.0.1
+ dev: false
+
+ /readable-stream@2.3.8:
+ resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+ dependencies:
+ core-util-is: 1.0.3
+ inherits: 2.0.4
+ isarray: 1.0.0
+ process-nextick-args: 2.0.1
+ safe-buffer: 5.1.2
+ string_decoder: 1.1.1
+ util-deprecate: 1.0.2
+ dev: false
+
+ /readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+ dev: false
+
+ /regexp-clone@1.0.0:
+ resolution: {integrity: sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==}
+ dev: false
+
+ /require-at@1.0.6:
+ resolution: {integrity: sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /resolve@1.22.8:
+ resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.15.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+ dev: false
+
+ /safe-buffer@5.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+ dev: false
+
+ /safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+ dev: false
+
+ /safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+ dev: false
+
+ /saslprep@1.0.3:
+ resolution: {integrity: sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==}
+ engines: {node: '>=6'}
+ requiresBuild: true
+ dependencies:
+ sparse-bitfield: 3.0.3
+ dev: false
+ optional: true
+
+ /semver@7.6.3:
+ resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dev: false
+
+ /send@0.19.0:
+ resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ etag: 1.8.1
+ fresh: 0.5.2
+ http-errors: 2.0.0
+ mime: 1.6.0
+ ms: 2.1.3
+ on-finished: 2.4.1
+ range-parser: 1.2.1
+ statuses: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /serve-static@1.16.2:
+ resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 0.19.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /set-function-length@1.2.2:
+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.4
+ gopd: 1.0.1
+ has-property-descriptors: 1.0.2
+ dev: false
+
+ /setprototypeof@1.2.0:
+ resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+ dev: false
+
+ /side-channel@1.0.6:
+ resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ object-inspect: 1.13.2
+ dev: false
+
+ /sift@13.5.2:
+ resolution: {integrity: sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==}
+ dev: false
+
+ /simple-concat@1.0.1:
+ resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==}
+ dev: false
+
+ /simple-get@4.0.1:
+ resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==}
+ dependencies:
+ decompress-response: 6.0.0
+ once: 1.4.0
+ simple-concat: 1.0.1
+ dev: false
+
+ /sliced@1.0.1:
+ resolution: {integrity: sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==}
+ dev: false
+
+ /sparse-bitfield@3.0.3:
+ resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==}
+ requiresBuild: true
+ dependencies:
+ memory-pager: 1.5.0
+ dev: false
+ optional: true
+
+ /statuses@2.0.1:
+ resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /string_decoder@1.1.1:
+ resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+ dependencies:
+ safe-buffer: 5.1.2
+ dev: false
+
+ /string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: false
+
+ /strip-json-comments@2.0.1:
+ resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+ dev: false
+
+ /tar-fs@2.1.1:
+ resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==}
+ dependencies:
+ chownr: 1.1.4
+ mkdirp-classic: 0.5.3
+ pump: 3.0.2
+ tar-stream: 2.2.0
+ dev: false
+
+ /tar-stream@2.2.0:
+ resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
+ engines: {node: '>=6'}
+ dependencies:
+ bl: 4.1.0
+ end-of-stream: 1.4.4
+ fs-constants: 1.0.0
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ dev: false
+
+ /to-fast-properties@2.0.0:
+ resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /toidentifier@1.0.1:
+ resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+ engines: {node: '>=0.6'}
+ dev: false
+
+ /token-stream@1.0.0:
+ resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==}
+ dev: false
+
+ /tunnel-agent@0.6.0:
+ resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: false
+
+ /type-is@1.6.18:
+ resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ media-typer: 0.3.0
+ mime-types: 2.1.35
+ dev: false
+
+ /undici-types@6.19.8:
+ resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
+ dev: false
+
+ /unpipe@1.0.0:
+ resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+ dev: false
+
+ /utils-merge@1.0.1:
+ resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
+ engines: {node: '>= 0.4.0'}
+ dev: false
+
+ /vary@1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /void-elements@3.1.0:
+ resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /with@7.0.2:
+ resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==}
+ engines: {node: '>= 10.0.0'}
+ dependencies:
+ '@babel/parser': 7.25.8
+ '@babel/types': 7.25.8
+ assert-never: 1.3.0
+ babel-walk: 3.0.0-canary-5
+ dev: false
+
+ /wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ dev: false
+
+ /zod@3.23.8:
+ resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==}
+ dev: false
diff --git a/utils/index.js b/utils/index.js
new file mode 100644
index 0000000..f369e06
--- /dev/null
+++ b/utils/index.js
@@ -0,0 +1,28 @@
+const log_level = process.env.LOG_LEVEL || 'info';
+
+const levels = ['none', 'error', 'warn', 'info', 'debug'];
+const currentLevelIndex = levels.indexOf(log_level);
+
+const buildLogMethod = (level) => (...args) => {
+ const levelIndex = levels.indexOf(level);
+ const shouldLog = levelIndex <= currentLevelIndex;
+
+ if (shouldLog) {
+ console[level](...args);
+ }
+};
+
+module.exports = {
+ randomArray: (arr) => {
+ return arr[Math.floor(Math.random() * arr.length)]
+ },
+ toFixed: (num, digits = 2) => {
+ return parseFloat(Number(num).toFixed(digits))
+ },
+ logger: {
+ debug: buildLogMethod('debug'),
+ info: buildLogMethod('info'),
+ warn: buildLogMethod('warn'),
+ error: buildLogMethod('error')
+ }
+}
diff --git a/utils/middleware.js b/utils/middleware.js
new file mode 100644
index 0000000..dc352e0
--- /dev/null
+++ b/utils/middleware.js
@@ -0,0 +1,83 @@
+function parseError(error) {
+ const err = JSON.parse(error)[0];
+
+ return {
+ code: 400,
+ message: `The field \`${err.path[0]}\` is invalid. ${err.message}`,
+ }
+}
+function validateInput(parseFn, input) {
+ const result = parseFn(input);
+ if (!result.success) {
+ return parseError(result.error);
+ }
+ return null;
+}
+
+module.exports = {
+ ZodValid: ({ headers, params, query, body }) => {
+ const handler = (req, res, next) => {
+ const validations = [
+ { input: req.headers, parseFn: headers?.safeParse },
+ { input: req.params, parseFn: params?.safeParse },
+ { input: req.query, parseFn: query?.safeParse },
+ { input: req.body, parseFn: body?.safeParse },
+ ];
+
+ for (const { input, parseFn } of validations) {
+ if (parseFn) {
+ const error = validateInput(parseFn, input);
+ if (error) {
+ return res.status(400).send(error);
+ }
+ }
+ }
+
+ next();
+ }
+
+ return handler
+ },
+ cors: ({ allowOrigins = '*', allowMethods = 'GET, POST, PUT, DELETE' } = {}) => {
+ const isOriginAllowed = (origin) => {
+ if (Array.isArray(allowOrigins)) {
+ return allowOrigins.includes(origin);
+ }
+ if (typeof allowOrigins === 'string') {
+ return allowOrigins === '*' || allowOrigins === origin;
+ }
+ return false;
+ };
+
+ const handler = (req, res, next) => {
+ const origin = req.headers.origin;
+
+ if (origin && isOriginAllowed(origin)) {
+ res.header("Access-Control-Allow-Origin", origin);
+ res.header("Access-Control-Allow-Credentials", "true");
+ } else {
+ return next();
+ }
+
+ if (req.method === "OPTIONS") {
+ const requestMethod = req.headers['access-control-request-method'];
+ if (requestMethod) {
+ res.header("Access-Control-Allow-Methods", requestMethod);
+ } else {
+ res.header("Access-Control-Allow-Methods", allowMethods);
+ }
+
+ const requestHeaders = req.headers['access-control-request-headers'];
+ if (requestHeaders) {
+ res.header("Access-Control-Allow-Headers", requestHeaders);
+ }
+
+ return res.sendStatus(204);
+ }
+
+ next();
+ };
+
+ return handler;
+ }
+}
diff --git a/utils/themify.js b/utils/themify.js
index 5487a83..ecbcd4d 100644
--- a/utils/themify.js
+++ b/utils/themify.js
@@ -4,20 +4,29 @@ const fs = require('fs')
const path = require('path')
const mimeType = require('mime-types')
const sizeOf = require('image-size')
+const { toFixed } = require('./index')
const themePath = path.resolve(__dirname, '../assets/theme')
+const imgExts = ['.jpg', '.jpeg', '.png', '.gif', '.webp']
const themeList = {}
fs.readdirSync(themePath).forEach(theme => {
- if(!(theme in themeList)) themeList[theme] = {}
- const imgList = fs.readdirSync(path.resolve(themePath, theme))
+ const currentThemePath = path.resolve(themePath, theme)
+ // skip non-directory
+ if (!fs.statSync(currentThemePath).isDirectory()) return
+
+ if (!(theme in themeList)) themeList[theme] = {}
+ const imgList = fs.readdirSync(currentThemePath)
imgList.forEach(img => {
- const imgPath = path.resolve(themePath, theme, img)
- const name = path.parse(img).name
+ // skip non-image files
+ if (!imgExts.includes(path.extname(img).toLowerCase())) return
+
+ const imgPath = path.resolve(currentThemePath, img)
+ const char = path.parse(img).name
const { width, height } = sizeOf(imgPath)
- themeList[theme][name] = {
+ themeList[theme][char] = {
width,
height,
data: convertToDatauri(imgPath)
@@ -25,43 +34,100 @@ fs.readdirSync(themePath).forEach(theme => {
})
})
-function convertToDatauri(path){
+function convertToDatauri(path) {
const mime = mimeType.lookup(path)
const base64 = fs.readFileSync(path).toString('base64')
return `data:${mime};base64,${base64}`
}
-function getCountImage({ count, theme='moebooru', length=7 }) {
- if(!(theme in themeList)) theme = 'moebooru'
+function getCountImage(params) {
+ let { count, theme = 'moebooru', padding = 7, prefix = -1, offset = 0, align = 'top', scale = 1, pixelated = '1', darkmode = 'auto' } = params
+
+ if (!(theme in themeList)) theme = 'moebooru'
+ padding = parseInt(Number(padding), 10)
+ offset = parseFloat(Number(offset), 10)
+ scale = parseFloat(Number(scale), 10)
// This is not the greatest way for generating an SVG but it'll do for now
- const countArray = count.toString().padStart(length, '0').split('')
+ const countArray = count.toString().padStart(padding, '0').split('')
+
+ // Add prefix if exist
+ if (prefix >= 0) {
+ countArray.unshift(...String(prefix).split(''))
+ }
+
+ // Add _start and _end if exist
+ if (themeList[theme]['_start']) {
+ countArray.unshift('_start')
+ }
+ if (themeList[theme]['_end']) {
+ countArray.push('_end')
+ }
+
+ const uniqueChar = [...new Set(countArray)]
let x = 0, y = 0
- const parts = countArray.reduce((acc, next, index) => {
- const { width, height, data } = themeList[theme][next]
- const image = `${acc}
- `
+ const defs = uniqueChar.reduce((ret, cur) => {
+ let { width, height, data } = themeList[theme][cur]
+ width *= scale
+ height *= scale
- x += width
+ y = Math.max(y, height)
- if(height > y) y = height
+ ret = `${ret}
+ `
+
+ return ret
+ }, '')
+
+ const parts = countArray.reduce((ret, cur) => {
+ let { width, height } = themeList[theme][cur]
+ width *= scale
+ height *= scale
+
+ let yOffset = 0
+
+ if (align === 'center') {
+ yOffset = (y - height) / 2
+ } else if (align === 'bottom') {
+ yOffset = y - height
+ }
+
+ const image = `${ret}
+ `
+
+ x += width + offset
return image
}, '')
+ // Fix the last image offset
+ x -= offset
+
+ const style = `
+ svg {
+ ${pixelated === '1' ? 'image-rendering: pixelated;' : ''}
+ ${darkmode === '1' ? 'filter: brightness(.6);' : ''}
+ }
+ ${darkmode === 'auto' ? `@media (prefers-color-scheme: dark) { svg { filter: brightness(.6); } }` : ''}
+ `
+
return `
-
- Moe Count
-
- ${parts}
-
+
+
+ Moe Counter!
+
+ ${defs}
+
+ ${parts}
+
`
}
module.exports = {
+ themeList,
getCountImage
}
diff --git a/views/index.pug b/views/index.pug
index a144569..05f7b07 100644
--- a/views/index.pug
+++ b/views/index.pug
@@ -1,112 +1,156 @@
html
head
title='Moe Counter!'
- meta(name='viewport', content='width=device-width, initial-scale=1')
- link(rel='icon', type='image/png', href='favicon.png')
- link(rel='stylesheet', href='https://cdn.jsdelivr.net/gh/kognise/water.css@latest/dist/light.min.css')
- link(rel='stylesheet', href='style.css')
-
- script(async, src='https://www.googletagmanager.com/gtag/js?id=G-2RLWN5JXRL')
+ meta(name='viewport', content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no')
+ link(rel='icon', type='image/png', href=`${site}/favicon.png`)
+ link(rel='stylesheet', href='https://cdn.jsdelivr.net/npm/normalize.css')
+ link(rel='stylesheet', href='https://cdn.jsdelivr.net/npm/bamboo.css')
+ link(rel='stylesheet/less', href=`${site}/style.less`)
+ script(less, src='https://cdn.jsdelivr.net/npm/less')
+ if ga_id
+
+ script(async, src=`https://www.googletagmanager.com/gtag/js?id=${ga_id}`)
script.
window.dataLayer = window.dataLayer || [];
- function gtag(){dataLayer.push(arguments);}
+ function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
- gtag('config', 'G-2RLWN5JXRL');
+ gtag('config', '#{ga_id}');
- function _evt_push(type, category, label){
+ function _evt_push(type, category, label) {
gtag('event', type, {
'event_category' : category,
'event_label' : label
});
}
+ script.
+ var __global_data = { site: "#{site}" };
+
body
- h3 How to use:
+ h1#main_title
+ i Moe Counter!
+
+ h3 How to use
+ p Set a unique id for your counter, replace
+ code :name
+ | in the url, That's it!
h5 SVG address
- code #{site}/get/@:name
+ code #{site}/@:name
h5 Img tag
- code <img src="#{site}/get/@:name" alt=":name" />
+ code <img src="#{site}/@:name" alt=":name" />
h5 Markdown
- code 
+ code 
- h3 eg:
-
+ h5 e.g.
+ img(src=`${site}/@index` alt="Moe Counter!")
- i Data can access by anyone, please
- | DO NOT
- | enter personal information
-
- details
- summary(style='display: inline-block;', onclick='_evt_push("click", "normal", "more_theme")')
- h3(style='display: inline-block; cursor: pointer;') More theme
- p(style='margin: 0;') Just use the query parameters theme
, like this: #{site}/get/@:name?theme=moebooru
- h5 asoul
- img(src='#{site}/get/@demo?theme=asoul', alt='A-SOUL')
- h5 moebooru
- img(src='#{site}/get/@demo?theme=moebooru', alt='Moebooru')
- h5 moebooru-h
- img(src='#{site}/get/@demo?theme=moebooru-h', alt='Moebooru-Hentai')
- h5 rule34
- img(src='#{site}/get/@demo?theme=rule34', alt='Rule34')
- h5 gelbooru
- img(src='#{site}/get/@demo?theme=gelbooru', alt='Gelbooru')
- h5 gelbooru-h
- img(src='#{site}/get/@demo?theme=gelbooru-h', alt='Gelbooru-Hentai')
+ details#themes
+ summary#more_theme(onclick='_evt_push("click", "normal", "more_theme")')
+ h3 More theme✨
+ p Just use the query parameters theme
, like this: #{site}/@:name?theme=moebooru
+ each theme in Object.keys(themeList)
+ div.item(data-theme=theme)
+ h5 #{theme}
+ img(data-src=`${site}/@demo?theme=${theme}` alt=theme)
h3 Credits
ul
- li
- a(href='https://repl.it/', target='_blank', rel='nofollow') repl.it
- li
- a(href='https://space.bilibili.com/703007996', target='_blank', title='A-SOUL_Official') A-SOUL
- li
- a(href='https://github.com/moebooru/moebooru', target='_blank', rel='nofollow') moebooru
- li
- a(href='javascript:alert("!!! NSFW LINK !!!\\nPlease enter the url manually")') rule34.xxx
- | NSFW
+ li: a(href='https://glitch.com/', target='_blank', rel='nofollow') Glitch
+ li: a(href='https://space.bilibili.com/703007996', target='_blank', title='A-SOUL_Official') A-SOUL
+ li: a(href='https://github.com/moebooru/moebooru', target='_blank', rel='nofollow') moebooru
li
a(href='javascript:alert("!!! NSFW LINK !!!\\nPlease enter the url manually")') gelbooru.com
| NSFW
- li
- a(href='https://icons8.com/icons/set/star', target='_blank', rel='nofollow') Icons8
+ li: a(href='https://icons8.com/icon/80355/star', target='_blank', rel='nofollow') Icons8
+ span: i And all booru site...
h3 Tool
.tool
- code #{site}/get/@
- input#name(type='text', placeholder=':name', style='display: inline-block; width: 80px; height: 1.4em; line-height: 1.4em; margin: 0 4px; vertical-align: middle;')
- code ?theme=
- select#theme(style='display: inline-block; height: 1.6em; line-height: 1.6em; font-size: 14px; margin: 0 4px; padding: 0 4px; vertical-align: middle;')
- option(value='asoul') asoul
- option(value='moebooru') moebooru
- option(value='moebooru-h') moebooru-h
- option(value='rule34') rule34
- option(value='gelbooru') gelbooru
- option(value='gelbooru-h') gelbooru-h
- button#get(style='margin: 10px 0;', onclick='_evt_push("click", "normal", "get_counter")') Get
- img#result(style='display: block;')
+ table
+ thead
+ tr
+ th Param
+ th Description
+ th Value
+ tbody
+ tr
+ td: code name
+ td Unique counter name
+ td: input#name(type='text', placeholder=':name')
+ tr
+ td: code theme
+ td Select a counter image theme, default is
+ code moebooru
+ td
+ select#theme
+ option(value="random", selected) * random
+ each theme in Object.keys(themeList)
+ option(value=theme) #{theme}
+ tr
+ td: code padding
+ td Set the minimum length, between 1-16, default is
+ code 7
+ td: input#padding(type='number', value='7', min='1', max='32', step='1', oninput='this.value = this.value.replace(/[^0-9]/g, "")')
+ tr
+ td: code offset
+ td Set the offset pixel value, between -500-500, default is
+ code 0
+ td: input#offset(type='number', value='0', min='-500', max='500', step='1', oninput='this.value = this.value.replace(/[^0-9|\-]/g, "")')
+ tr
+ td: code scale
+ td Set the image scale, between 0.1-2, default is
+ code 1
+ td: input#scale(type='number', value='1', min='0.1', max='2', step='0.1', oninput='this.value = this.value.replace(/[^0-9|\.]/g, "")')
+ tr
+ td: code align
+ td Set the image align, Enum top/center/bottom, default is
+ code top
+ td: select#align(name="align")
+ option(value="top", selected) top
+ option(value="center") center
+ option(value="bottom") bottom
+ tr
+ td: code pixelated
+ td Enable pixelated mode, Enum 0/1, default is
+ code 1
+ td
+ input#pixelated(type='checkbox', role='switch', checked)
+ label(for='pixelated'): span
+ tr
+ td: code darkmode
+ td Enable dark mode, Enum 0/1/auto, default is
+ code auto
+ td: select#darkmode(name="darkmode")
+ option(value="auto", selected) auto
+ option(value="1") yes
+ option(value="0") no
+ tr
+ td(colspan=3)
+ h4.caption Unusual Options
+ tr
+ td: code num
+ td Set counter display number, 0 for disable, default is
+ code 0
+ td: input#num(type='number', value='0', min='0', max='1e15', step='1', oninput='this.value = this.value.replace(/[^0-9]/g, "")')
+ tr
+ td: code prefix
+ td Set the prefix number, empty for disable
+ td: input#prefix(type='number', value='', min='0', max='999999', step='1', oninput='this.value = this.value.replace(/[^0-9]/g, "")')
- script.
- var btn = document.getElementById('get'),
- img = document.getElementById('result')
+ button#get(onclick='_evt_push("click", "normal", "get_counter")') Generate
- btn.addEventListener('click', function() {
- var name = document.getElementById('name'),
- themeEl = document.getElementById('theme')
- var text = name.value ? name.value.trim() : ''
- var theme = themeEl.value || 'moebooru'
- if(!text) {
- alert('Please input counter name.')
- return
- }
+ div
+ code#code
+ img#result
- img.src = '#{site}/get/@' + text + '?theme=' + theme
- })
-
- iframe(src="https://chat.getloli.com/room/@Moe-counter?title=%E8%90%8C%E8%90%8C%E8%AE%A1%E6%95%B0%E5%99%A8%E7%9A%84%E7%95%99%E8%A8%80%E6%9D%BF", scrolling="no", frameborder="0", height="70%", width="26%", style="position: fixed;top: 2%;right: 5%;")
-
- p.copy
+ p.github
a(href='https://github.com/journey-ad/Moe-Counter', target='_blank', onclick='_evt_push("click", "normal", "go_github")') source code
+
+ div.back-to-top
+
+ script(async, src='https://cdn.jsdelivr.net/npm/party-js@2/bundle/party.min.js')
+ script(async, src=`${site}/script.js`)