├── .gitignore ├── .env ├── src ├── errors │ └── RequestError.js ├── middlewares │ ├── errorHandler.js │ └── cache.js ├── index.js ├── routes.js ├── constants.js ├── utils │ └── index.js ├── controller.js └── model.js ├── package.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | WEBSITE_URL=https://vuighe.net 2 | API_URL=https://vuighe.net/api/v2 -------------------------------------------------------------------------------- /src/errors/RequestError.js: -------------------------------------------------------------------------------- 1 | class RequestError extends Error { 2 | constructor(code, devMessage, userMessage = "Lỗi server, vui lòng thử lại!") { 3 | super(devMessage); 4 | 5 | this.code = code; 6 | this.userMessage = userMessage; 7 | } 8 | } 9 | 10 | module.exports = RequestError; 11 | -------------------------------------------------------------------------------- /src/middlewares/errorHandler.js: -------------------------------------------------------------------------------- 1 | const RequestError = require("../errors/RequestError"); 2 | 3 | const errorHandler = (err, _req, res, _next) => { 4 | console.error(err); 5 | 6 | if (err instanceof RequestError) { 7 | return res.json({ 8 | success: false, 9 | error: err.message, 10 | message: err.userMessage, 11 | }); 12 | } 13 | 14 | return res.json({ 15 | success: false, 16 | error: err.message, 17 | message: `Lỗi server [${err.message}]`, 18 | }); 19 | }; 20 | 21 | module.exports = errorHandler; 22 | -------------------------------------------------------------------------------- /src/middlewares/cache.js: -------------------------------------------------------------------------------- 1 | const mcache = require("memory-cache"); 2 | 3 | const DEFAULT_DURATION = 10800; // 3 hours 4 | 5 | const cache = (duration = DEFAULT_DURATION) => { 6 | return (req, res, next) => { 7 | let key = "__express__" + req.originalUrl || req.url; 8 | let cachedBody = mcache.get(key); 9 | 10 | if (cachedBody) return res.send(cachedBody); 11 | 12 | res.sendResponse = res.send; 13 | res.send = (body) => { 14 | mcache.put(key, body, duration * 1000); 15 | res.sendResponse(body); 16 | }; 17 | 18 | next(); 19 | }; 20 | }; 21 | 22 | module.exports = cache; 23 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const cors = require("cors"); 3 | const path = require("path"); 4 | 5 | const routes = require("./routes"); 6 | const cache = require("./middlewares/cache"); 7 | const errorHandler = require("./middlewares/errorHandler"); 8 | require("dotenv").config({ path: path.resolve(__dirname, "../.env") }); 9 | 10 | const app = express(); 11 | const PORT = process.env.PORT || 3000; 12 | 13 | app.use(cors()); 14 | app.use(cache()); 15 | app.use("/api/v1", routes); 16 | app.use(errorHandler); 17 | 18 | app.listen(PORT, () => { 19 | console.log("Listening at", PORT); 20 | }); 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server-new", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node src/", 9 | "dev": "nodemon src/" 10 | }, 11 | "keywords": [], 12 | "author": "", 13 | "license": "ISC", 14 | "dependencies": { 15 | "axios": "^0.21.1", 16 | "cheerio": "^1.0.0-rc.10", 17 | "cors": "^2.8.5", 18 | "cors-anywhere": "^0.4.4", 19 | "dotenv": "^10.0.0", 20 | "express": "^4.17.1", 21 | "jsdom": "^17.0.0", 22 | "memory-cache": "^0.2.0" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/routes.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const controller = require("./controller"); 3 | const router = express.Router(); 4 | 5 | router.get("/recently", controller.getRecentlyUpdated); 6 | router.get("/recommended", controller.getRecommended); 7 | router.get("/slide", controller.getSlide); 8 | router.get("/search", controller.search); 9 | 10 | router.get("/cors/:proxyUrl*", controller.corsAnywhere); 11 | router.get("/ranking/:slug", controller.getRanking); 12 | router.get("/anime/:slug", controller.getInfo); 13 | router.get("/genres/:slug", controller.getGenre); 14 | router.get("/anime/:animeId/episodes", controller.getEpisodes); 15 | router.get("/anime/:animeId/episodes/:episodeIndex", controller.getEpisode); 16 | router.get("/anime/:animeId/comments", controller.getComments); 17 | 18 | module.exports = router; 19 | -------------------------------------------------------------------------------- /src/constants.js: -------------------------------------------------------------------------------- 1 | const LIMIT = 24; 2 | const TOTAL_ANIME = 2055; 3 | 4 | const GENRES = [ 5 | { slug: "hanh-dong", name: "Hành Động" }, 6 | { slug: "vien-tuong", name: "Viễn Tưởng" }, 7 | { slug: "lang-man", name: "Lãng Mạn" }, 8 | { slug: "kinh-di", name: "Kinh Dị" }, 9 | { slug: "vo-thuat", name: "Võ Thuật" }, 10 | { slug: "hai-huoc", name: "Hài Hước" }, 11 | { slug: "truong-hoc", name: "Trường Học" }, 12 | { slug: "trinh-tham", name: "Trinh Thám" }, 13 | { slug: "am-nhac", name: "Âm Nhạc" }, 14 | { slug: "phieu-luu", name: "Phiêu Lưu" }, 15 | { slug: "sieu-nhien", name: "Siêu Nhiên" }, 16 | { slug: "doi-thuong", name: "Đời Thường" }, 17 | { slug: "gia-tuong", name: "Giả Tưởng" }, 18 | { slug: "robot", name: "Robot" }, 19 | { slug: "game", name: "Game" }, 20 | { slug: "the-thao", name: "Thể Thao" }, 21 | { slug: "kich-tinh", name: "Kịch Tính" }, 22 | ]; 23 | 24 | module.exports = { 25 | LIMIT, 26 | TOTAL_ANIME, 27 | GENRES, 28 | }; 29 | -------------------------------------------------------------------------------- /src/utils/index.js: -------------------------------------------------------------------------------- 1 | const { LIMIT } = require("../constants"); 2 | 3 | const pageToPagination = (page, limit = LIMIT) => { 4 | page = Number(page); 5 | limit = Number(limit); 6 | 7 | const offset = limit * page - limit; 8 | 9 | return { limit, offset }; 10 | }; 11 | 12 | function encodeString(hash) { 13 | var a = ""; 14 | hash.toString(); 15 | for (var i = 0; i < hash.length; i++) { 16 | var o = hash.charCodeAt(i), 17 | r = o ^ 69; 18 | a += String.fromCharCode(r); 19 | } 20 | return a; 21 | } 22 | 23 | function toSlug(str, separator) { 24 | str = str 25 | .toLowerCase() 26 | .replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, "a") 27 | .replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, "e") 28 | .replace(/ì|í|ị|ỉ|ĩ/g, "i") 29 | .replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, "o") 30 | .replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, "u") 31 | .replace(/ỳ|ý|ỵ|ỷ|ỹ/g, "y") 32 | .replace(/đ/g, "d") 33 | .replace(/\s+/g, "-") 34 | .replace(/[^A-Za-z0-9_-]/g, "") 35 | .replace(/-+/g, "-"); 36 | if (separator) { 37 | return str.replace(/-/g, separator); 38 | } 39 | return str; 40 | } 41 | 42 | module.exports = { 43 | pageToPagination, 44 | toSlug, 45 | encodeString, 46 | }; 47 | -------------------------------------------------------------------------------- /src/controller.js: -------------------------------------------------------------------------------- 1 | const corsAnywhere = require("cors-anywhere"); 2 | 3 | const { LIMIT } = require("./constants"); 4 | const Model = require("./model"); 5 | const { pageToPagination } = require("./utils"); 6 | 7 | let proxy = corsAnywhere.createServer({ 8 | originWhitelist: [], 9 | requireHeaders: [], 10 | removeHeaders: [], 11 | setHeaders: { 12 | referer: "https://vuighe.net/", 13 | }, 14 | }); 15 | 16 | class Controller { 17 | static async getRecentlyUpdated(_req, res, next) { 18 | try { 19 | const recentlyUpdatedList = await Model.recentlyUpdated(); 20 | 21 | res.json({ success: true, data: recentlyUpdatedList }); 22 | } catch (err) { 23 | next(err); 24 | } 25 | } 26 | 27 | static async getInfo(req, res, next) { 28 | const { slug } = req.params; 29 | 30 | try { 31 | const info = await Model.getInfo(slug); 32 | 33 | res.json({ success: true, data: info }); 34 | } catch (err) { 35 | next(err); 36 | } 37 | } 38 | 39 | static async getEpisode(req, res, next) { 40 | const { animeId, episodeIndex } = req.params; 41 | 42 | try { 43 | const episode = await Model.getEpisode(animeId, episodeIndex); 44 | 45 | res.json({ success: true, data: episode }); 46 | } catch (err) { 47 | next(err); 48 | } 49 | } 50 | 51 | static async getEpisodes(req, res, next) { 52 | const { animeId } = req.params; 53 | 54 | try { 55 | const episodes = await Model.getEpisodes(animeId); 56 | 57 | res.json({ success: true, data: episodes }); 58 | } catch (err) { 59 | next(err); 60 | } 61 | } 62 | 63 | static async getComments(req, res, next) { 64 | const { animeId, limit } = req.params; 65 | const { page } = req.query; 66 | 67 | const { offset } = pageToPagination(page); 68 | 69 | try { 70 | const comments = await Model.getComments(animeId, offset, limit); 71 | 72 | res.json({ success: true, data: comments }); 73 | } catch (err) { 74 | next(err); 75 | } 76 | } 77 | 78 | static async getGenre(req, res, next) { 79 | const { slug } = req.params; 80 | const { page = 1, limit } = req.query; 81 | 82 | try { 83 | const { data, total } = await Model.getGenre(slug, page); 84 | 85 | res.json({ 86 | success: true, 87 | data, 88 | pagination: totalToPagination(total, page, limit), 89 | }); 90 | } catch (err) { 91 | next(err); 92 | } 93 | } 94 | 95 | static async search(req, res, next) { 96 | const { q, limit, page = 1 } = req.query; 97 | 98 | try { 99 | const { data, total } = await Model.search(q, limit); 100 | 101 | res.json({ 102 | success: true, 103 | data, 104 | pagination: totalToPagination(total, page, limit), 105 | }); 106 | } catch (err) { 107 | next(err); 108 | } 109 | } 110 | 111 | static async getSlide(_req, res, next) { 112 | try { 113 | const slideList = await Model.slide(); 114 | 115 | res.json({ success: true, data: slideList }); 116 | } catch (err) { 117 | next(err); 118 | } 119 | } 120 | 121 | static async getRecommended(_req, res, next) { 122 | try { 123 | const recommendedList = await Model.recommended(); 124 | 125 | res.json({ success: true, data: recommendedList }); 126 | } catch (err) { 127 | next(err); 128 | } 129 | } 130 | 131 | static async getRanking(req, res, next) { 132 | const { slug } = req.params; 133 | 134 | try { 135 | const rankingList = await Model.getRanking(slug); 136 | 137 | res.json({ success: true, data: rankingList }); 138 | } catch (err) { 139 | next(err); 140 | } 141 | } 142 | 143 | static async corsAnywhere(req, res) { 144 | req.url = req.url.replace("/cors/", "/"); 145 | proxy.emit("request", req, res); 146 | } 147 | } 148 | 149 | const totalToPagination = (total, page, limit = LIMIT) => { 150 | return { 151 | currentPage: Number(page), 152 | totalPage: Math.round(total / limit), 153 | }; 154 | }; 155 | module.exports = Controller; 156 | -------------------------------------------------------------------------------- /src/model.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | const axios = require("axios"); 3 | const { JSDOM } = require("jsdom"); 4 | const { LIMIT } = require("./constants"); 5 | const { toSlug, encodeString } = require("./utils"); 6 | require("dotenv").config({ path: path.resolve(__dirname, "../.env") }); 7 | 8 | const instance = axios.create({ 9 | baseURL: process.env.API_URL, 10 | headers: { 11 | "X-Requested-With": "XMLHttpRequest", 12 | Referer: "https://vuighe.net/idoly-pride" 13 | } 14 | }); 15 | 16 | const WEBSITE_URL = process.env.WEBSITE_URL; 17 | 18 | class Model { 19 | static async slide() { 20 | const URL = WEBSITE_URL; 21 | 22 | const { data } = await axios.get(URL); 23 | 24 | const { window } = new JSDOM(data); 25 | const { document } = window; 26 | 27 | const slideItems = document.querySelectorAll(".slider-item"); 28 | 29 | const list = [...slideItems].map(item => { 30 | const thumbnail = item.querySelector(".slider-item-img").dataset.src; 31 | const title = item.dataset.title; 32 | const views = item.dataset.views; 33 | const slug = toSlug(title); 34 | 35 | return { thumbnail, slug, views, name: title }; 36 | }); 37 | 38 | return list; 39 | } 40 | 41 | static async getEpisode(animeId, episodeIndex) { 42 | const episodes = await this.getEpisodes(animeId); 43 | 44 | const episode = episodes[episodeIndex]; 45 | 46 | const sources = await this.getSource(animeId, episode.id); 47 | 48 | return { ...episode, ...sources }; 49 | } 50 | 51 | static async search(keyword, limit = LIMIT) { 52 | const URL = `/search?q=${encodeURIComponent(keyword)}&limit=${limit}`; 53 | const { data } = await instance.get(URL); 54 | 55 | const list = data.data.map(anime => { 56 | const { meta, time, ...info } = anime; 57 | 58 | const animeTime = !info.is_movie 59 | ? `${meta.max_episode_name}/${time}` 60 | : time; 61 | 62 | return { ...info, time: animeTime }; 63 | }); 64 | 65 | return { data: list, total: list.length }; 66 | } 67 | 68 | static async getEpisodes(animeId) { 69 | const URL = `/films/${animeId}/episodes?sort=name`; 70 | const { data } = await instance.get(URL); 71 | 72 | const episodes = data.data.filter(episode => !episode.special_name); 73 | 74 | return episodes; 75 | } 76 | 77 | static async getSource(animeId, episodeId) { 78 | const { data } = await instance.get( 79 | `/films/${animeId}/episodes/${episodeId}` 80 | ); 81 | 82 | const CORS_API = "https://netime.glitch.me/api/v1/cors"; 83 | 84 | const sources = data.sources; 85 | 86 | const whitelistKeys = []; 87 | 88 | const sourceKey = Object.keys(sources) 89 | .filter(key => !whitelistKeys.includes(key)) 90 | .find(key => !!sources[key].length); 91 | 92 | let source = sources[sourceKey][0].src; 93 | 94 | if (!source) { 95 | const m3u8Source = sources.m3u8; 96 | 97 | const source = 98 | m3u8Source.hls || 99 | m3u8Source.sd || 100 | m3u8Source[Object.keys(m3u8Source)[0]]; 101 | 102 | const m3u8 = encodeString(source); 103 | 104 | let vSource; 105 | 106 | if (m3u8.includes("mephimanh")) { 107 | const m3u8P = m3u8.split("/")[4]; 108 | 109 | vSource = `https://ima21.xyz/hls/${m3u8P}/playlist.m3u8`; 110 | } else { 111 | vSource = m3u8; 112 | } 113 | 114 | return { 115 | videoSource: vSource 116 | }; 117 | } 118 | 119 | source = `${CORS_API}/${source}`; 120 | 121 | return { 122 | videoSource: source 123 | }; 124 | } 125 | 126 | static async getComments(animeId, offset, limit = LIMIT) { 127 | const { data } = await instance.get( 128 | `/films/${animeId}/comments?limit=${limit}&offset=${offset}` 129 | ); 130 | 131 | return data.data; 132 | } 133 | 134 | static async getRanking(slug) { 135 | const { data } = await axios.get(`${WEBSITE_URL}/bang-xep-hang/${slug}`); 136 | 137 | return parseList(data); 138 | } 139 | 140 | static async getInfo(slug) { 141 | const scrapedInfo = await scrapeInfo(slug); 142 | 143 | const episodes = await this.getEpisodes(scrapedInfo.id); 144 | 145 | return { ...scrapedInfo, episodes }; 146 | } 147 | 148 | static async recommended() { 149 | const { data } = await axios.get(`${WEBSITE_URL}/hom-nay-xem-gi`); 150 | 151 | return parseList(data); 152 | } 153 | 154 | static async recentlyUpdated() { 155 | const { data } = await axios.get(`${WEBSITE_URL}/tap-moi-nhat`); 156 | 157 | return parseList(data); 158 | } 159 | 160 | static async scrapeInfo(slug) { 161 | const { data } = await axios.get(`${WEBSITE_URL}/${slug}`); 162 | 163 | const { window } = new JSDOM(data); 164 | const { document } = window; 165 | 166 | const genresElement = document.querySelectorAll(".film-info-genre a"); 167 | const subTeamsElement = document.querySelectorAll(".film-info-subteam a"); 168 | 169 | const genres = [...genresElement].map(genre => { 170 | const name = genre.textContent; 171 | const url = genre.getAttribute("href"); 172 | const slug = urlToSlug(url); 173 | 174 | return { name, url, slug }; 175 | }); 176 | 177 | const subTeams = [...subTeamsElement].map(team => team.textContent); 178 | 179 | const description = document.querySelector(".film-info-description") 180 | .textContent; 181 | 182 | return { genres, subTeams, description }; 183 | } 184 | 185 | static async getGenre(genre, page = 1) { 186 | const URL = `${WEBSITE_URL}/anime/${genre}/trang-${page}`; 187 | 188 | const { data } = await axios.get(URL); 189 | 190 | const { window } = new JSDOM(data); 191 | const { document } = window; 192 | 193 | const total = document 194 | .querySelector('[name="total-item"]') 195 | .getAttribute("value"); 196 | 197 | const list = parseList(data); 198 | 199 | return { data: list, total: Number(total) }; 200 | } 201 | } 202 | 203 | const urlToSlug = url => { 204 | const parts = url.split("/"); 205 | 206 | return parts[parts.length - 1]; 207 | }; 208 | 209 | const getInfo = async slug => { 210 | const { data } = await instance.get("/search", { 211 | params: { 212 | q: slug, 213 | limit: 1 214 | } 215 | }); 216 | 217 | const { meta, time, ...info } = data.data[0]; 218 | 219 | const animeTime = !info.is_movie ? `${meta.max_episode_name}/${time}` : time; 220 | 221 | return { ...info, time: animeTime }; 222 | }; 223 | 224 | const addInfo = async list => { 225 | const promises = await Promise.allSettled( 226 | list.map(async anime => { 227 | const info = await getInfo(anime.slug); 228 | 229 | let returnObj = { ...anime, ...info }; 230 | 231 | if (!anime.description) { 232 | const scrapedInfo = await scrapeInfo(anime.slug); 233 | returnObj = { ...returnObj, ...scrapedInfo }; 234 | } 235 | 236 | return returnObj; 237 | }) 238 | ); 239 | 240 | return promises 241 | .filter(promise => promise.status === "fulfilled") 242 | .map(promise => promise.value); 243 | }; 244 | 245 | const scrapeInfo = async slug => { 246 | const { data } = await axios.get(`${WEBSITE_URL}/${slug}`); 247 | 248 | const { window } = new JSDOM(data); 249 | const { document } = window; 250 | 251 | const genresElement = document.querySelectorAll(".film-info-genre a"); 252 | const subTeamsElement = document.querySelectorAll(".film-info-subteam a"); 253 | 254 | const genres = [...genresElement].map(genre => { 255 | const name = genre.textContent; 256 | const url = genre.getAttribute("href"); 257 | const slug = urlToSlug(url); 258 | 259 | return { name, url, slug }; 260 | }); 261 | 262 | const { id, name } = document.querySelector(".container.play").dataset; 263 | 264 | const subTeams = [...subTeamsElement].map(team => team.textContent); 265 | 266 | const description = document.querySelector(".film-info-description") 267 | .textContent; 268 | 269 | const views = parseViews( 270 | document.querySelector(".film-info-views").textContent 271 | ); 272 | 273 | const thumbnail = document 274 | .querySelector('[property="og:image"]') 275 | .getAttribute("content"); 276 | 277 | return { 278 | genres, 279 | subTeams, 280 | description, 281 | id: Number(id), 282 | name, 283 | views, 284 | thumbnail, 285 | slug 286 | }; 287 | }; 288 | 289 | const parseViews = text => { 290 | if (!text) return; 291 | 292 | return Number(text.replace("lượt xem", "").replace(/,/g, "")); 293 | }; 294 | 295 | const parseList = html => { 296 | const { window } = new JSDOM(html); 297 | const { document } = window; 298 | 299 | const items = document.querySelectorAll(".tray-item a"); 300 | 301 | const list = [...items].map(item => { 302 | const url = item.getAttribute("href"); 303 | 304 | const slug = urlToSlug(url.split("/")[1]); 305 | 306 | const thumbnail = item.querySelector(".tray-item-thumbnail").dataset.src; 307 | const time = item 308 | .querySelector(".tray-film-update") 309 | ?.textContent.replace(" / ", "/"); 310 | const latestEpisode = { 311 | name: item.querySelector(".tray-episode-name")?.textContent, 312 | views: parseViews(item.querySelector(".tray-episode-views")?.textContent) 313 | }; 314 | const name = item.querySelector(".tray-item-title")?.textContent; 315 | const views = parseViews( 316 | item.querySelector(".tray-film-views")?.textContent 317 | ); 318 | 319 | return { slug, views, name, time, latestEpisode, thumbnail }; 320 | }); 321 | 322 | return list; 323 | }; 324 | 325 | module.exports = Model; 326 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@tootallnate/once@1": 6 | version "1.1.2" 7 | resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" 8 | integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== 9 | 10 | abab@^2.0.3, abab@^2.0.5: 11 | version "2.0.5" 12 | resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" 13 | integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== 14 | 15 | accepts@~1.3.7: 16 | version "1.3.7" 17 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 18 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 19 | dependencies: 20 | mime-types "~2.1.24" 21 | negotiator "0.6.2" 22 | 23 | acorn-globals@^6.0.0: 24 | version "6.0.0" 25 | resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" 26 | integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== 27 | dependencies: 28 | acorn "^7.1.1" 29 | acorn-walk "^7.1.1" 30 | 31 | acorn-walk@^7.1.1: 32 | version "7.2.0" 33 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" 34 | integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== 35 | 36 | acorn@^7.1.1: 37 | version "7.4.1" 38 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" 39 | integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== 40 | 41 | acorn@^8.4.1: 42 | version "8.4.1" 43 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" 44 | integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== 45 | 46 | agent-base@6: 47 | version "6.0.2" 48 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" 49 | integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== 50 | dependencies: 51 | debug "4" 52 | 53 | array-flatten@1.1.1: 54 | version "1.1.1" 55 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 56 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 57 | 58 | asynckit@^0.4.0: 59 | version "0.4.0" 60 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 61 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 62 | 63 | axios@^0.21.1: 64 | version "0.21.1" 65 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" 66 | integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== 67 | dependencies: 68 | follow-redirects "^1.10.0" 69 | 70 | body-parser@1.19.0: 71 | version "1.19.0" 72 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 73 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 74 | dependencies: 75 | bytes "3.1.0" 76 | content-type "~1.0.4" 77 | debug "2.6.9" 78 | depd "~1.1.2" 79 | http-errors "1.7.2" 80 | iconv-lite "0.4.24" 81 | on-finished "~2.3.0" 82 | qs "6.7.0" 83 | raw-body "2.4.0" 84 | type-is "~1.6.17" 85 | 86 | boolbase@^1.0.0: 87 | version "1.0.0" 88 | resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" 89 | integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= 90 | 91 | browser-process-hrtime@^1.0.0: 92 | version "1.0.0" 93 | resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" 94 | integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== 95 | 96 | bytes@3.1.0: 97 | version "3.1.0" 98 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 99 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 100 | 101 | cheerio-select@^1.5.0: 102 | version "1.5.0" 103 | resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-1.5.0.tgz#faf3daeb31b17c5e1a9dabcee288aaf8aafa5823" 104 | integrity sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg== 105 | dependencies: 106 | css-select "^4.1.3" 107 | css-what "^5.0.1" 108 | domelementtype "^2.2.0" 109 | domhandler "^4.2.0" 110 | domutils "^2.7.0" 111 | 112 | cheerio@^1.0.0-rc.10: 113 | version "1.0.0-rc.10" 114 | resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.10.tgz#2ba3dcdfcc26e7956fc1f440e61d51c643379f3e" 115 | integrity sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw== 116 | dependencies: 117 | cheerio-select "^1.5.0" 118 | dom-serializer "^1.3.2" 119 | domhandler "^4.2.0" 120 | htmlparser2 "^6.1.0" 121 | parse5 "^6.0.1" 122 | parse5-htmlparser2-tree-adapter "^6.0.1" 123 | tslib "^2.2.0" 124 | 125 | combined-stream@^1.0.8: 126 | version "1.0.8" 127 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 128 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 129 | dependencies: 130 | delayed-stream "~1.0.0" 131 | 132 | content-disposition@0.5.3: 133 | version "0.5.3" 134 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 135 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 136 | dependencies: 137 | safe-buffer "5.1.2" 138 | 139 | content-type@~1.0.4: 140 | version "1.0.4" 141 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 142 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 143 | 144 | cookie-signature@1.0.6: 145 | version "1.0.6" 146 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 147 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 148 | 149 | cookie@0.4.0: 150 | version "0.4.0" 151 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 152 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 153 | 154 | cors-anywhere@^0.4.4: 155 | version "0.4.4" 156 | resolved "https://registry.yarnpkg.com/cors-anywhere/-/cors-anywhere-0.4.4.tgz#98892fcab55f408fff13a63e125135c18dc22ca8" 157 | integrity sha512-8OBFwnzMgR4mNrAeAyOLB2EruS2z7u02of2bOu7i9kKYlZG+niS7CTHLPgEXKWW2NAOJWRry9RRCaL9lJRjNqg== 158 | dependencies: 159 | http-proxy "1.11.1" 160 | proxy-from-env "0.0.1" 161 | 162 | cors@^2.8.5: 163 | version "2.8.5" 164 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 165 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 166 | dependencies: 167 | object-assign "^4" 168 | vary "^1" 169 | 170 | css-select@^4.1.3: 171 | version "4.1.3" 172 | resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" 173 | integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== 174 | dependencies: 175 | boolbase "^1.0.0" 176 | css-what "^5.0.0" 177 | domhandler "^4.2.0" 178 | domutils "^2.6.0" 179 | nth-check "^2.0.0" 180 | 181 | css-what@^5.0.0, css-what@^5.0.1: 182 | version "5.0.1" 183 | resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad" 184 | integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg== 185 | 186 | cssom@^0.5.0: 187 | version "0.5.0" 188 | resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" 189 | integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== 190 | 191 | cssom@~0.3.6: 192 | version "0.3.8" 193 | resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" 194 | integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== 195 | 196 | cssstyle@^2.3.0: 197 | version "2.3.0" 198 | resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" 199 | integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== 200 | dependencies: 201 | cssom "~0.3.6" 202 | 203 | data-urls@^3.0.0: 204 | version "3.0.0" 205 | resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.0.tgz#3ff551c986d7c6234a0ac4bbf20a269e1cd6b378" 206 | integrity sha512-4AefxbTTdFtxDUdh0BuMBs2qJVL25Mow2zlcuuePegQwgD6GEmQao42LLEeksOui8nL4RcNEugIpFP7eRd33xg== 207 | dependencies: 208 | abab "^2.0.3" 209 | whatwg-mimetype "^2.3.0" 210 | whatwg-url "^9.0.0" 211 | 212 | debug@2.6.9: 213 | version "2.6.9" 214 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 215 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 216 | dependencies: 217 | ms "2.0.0" 218 | 219 | debug@4: 220 | version "4.3.2" 221 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" 222 | integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== 223 | dependencies: 224 | ms "2.1.2" 225 | 226 | decimal.js@^10.3.1: 227 | version "10.3.1" 228 | resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" 229 | integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== 230 | 231 | deep-is@~0.1.3: 232 | version "0.1.3" 233 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 234 | integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 235 | 236 | delayed-stream@~1.0.0: 237 | version "1.0.0" 238 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 239 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 240 | 241 | depd@~1.1.2: 242 | version "1.1.2" 243 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 244 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 245 | 246 | destroy@~1.0.4: 247 | version "1.0.4" 248 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 249 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 250 | 251 | dom-serializer@^1.0.1, dom-serializer@^1.3.2: 252 | version "1.3.2" 253 | resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" 254 | integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== 255 | dependencies: 256 | domelementtype "^2.0.1" 257 | domhandler "^4.2.0" 258 | entities "^2.0.0" 259 | 260 | domelementtype@^2.0.1, domelementtype@^2.2.0: 261 | version "2.2.0" 262 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" 263 | integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== 264 | 265 | domexception@^2.0.1: 266 | version "2.0.1" 267 | resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" 268 | integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== 269 | dependencies: 270 | webidl-conversions "^5.0.0" 271 | 272 | domhandler@^4.0.0, domhandler@^4.2.0: 273 | version "4.2.0" 274 | resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059" 275 | integrity sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA== 276 | dependencies: 277 | domelementtype "^2.2.0" 278 | 279 | domutils@^2.5.2, domutils@^2.6.0, domutils@^2.7.0: 280 | version "2.7.0" 281 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.7.0.tgz#8ebaf0c41ebafcf55b0b72ec31c56323712c5442" 282 | integrity sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg== 283 | dependencies: 284 | dom-serializer "^1.0.1" 285 | domelementtype "^2.2.0" 286 | domhandler "^4.2.0" 287 | 288 | dotenv@^10.0.0: 289 | version "10.0.0" 290 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" 291 | integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== 292 | 293 | ee-first@1.1.1: 294 | version "1.1.1" 295 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 296 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 297 | 298 | encodeurl@~1.0.2: 299 | version "1.0.2" 300 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 301 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 302 | 303 | entities@^2.0.0: 304 | version "2.2.0" 305 | resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" 306 | integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== 307 | 308 | escape-html@~1.0.3: 309 | version "1.0.3" 310 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 311 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 312 | 313 | escodegen@^2.0.0: 314 | version "2.0.0" 315 | resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" 316 | integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== 317 | dependencies: 318 | esprima "^4.0.1" 319 | estraverse "^5.2.0" 320 | esutils "^2.0.2" 321 | optionator "^0.8.1" 322 | optionalDependencies: 323 | source-map "~0.6.1" 324 | 325 | esprima@^4.0.1: 326 | version "4.0.1" 327 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 328 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 329 | 330 | estraverse@^5.2.0: 331 | version "5.2.0" 332 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" 333 | integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== 334 | 335 | esutils@^2.0.2: 336 | version "2.0.3" 337 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 338 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 339 | 340 | etag@~1.8.1: 341 | version "1.8.1" 342 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 343 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 344 | 345 | eventemitter3@1.x.x: 346 | version "1.2.0" 347 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" 348 | integrity sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg= 349 | 350 | express@^4.17.1: 351 | version "4.17.1" 352 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 353 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 354 | dependencies: 355 | accepts "~1.3.7" 356 | array-flatten "1.1.1" 357 | body-parser "1.19.0" 358 | content-disposition "0.5.3" 359 | content-type "~1.0.4" 360 | cookie "0.4.0" 361 | cookie-signature "1.0.6" 362 | debug "2.6.9" 363 | depd "~1.1.2" 364 | encodeurl "~1.0.2" 365 | escape-html "~1.0.3" 366 | etag "~1.8.1" 367 | finalhandler "~1.1.2" 368 | fresh "0.5.2" 369 | merge-descriptors "1.0.1" 370 | methods "~1.1.2" 371 | on-finished "~2.3.0" 372 | parseurl "~1.3.3" 373 | path-to-regexp "0.1.7" 374 | proxy-addr "~2.0.5" 375 | qs "6.7.0" 376 | range-parser "~1.2.1" 377 | safe-buffer "5.1.2" 378 | send "0.17.1" 379 | serve-static "1.14.1" 380 | setprototypeof "1.1.1" 381 | statuses "~1.5.0" 382 | type-is "~1.6.18" 383 | utils-merge "1.0.1" 384 | vary "~1.1.2" 385 | 386 | fast-levenshtein@~2.0.6: 387 | version "2.0.6" 388 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 389 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 390 | 391 | finalhandler@~1.1.2: 392 | version "1.1.2" 393 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 394 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 395 | dependencies: 396 | debug "2.6.9" 397 | encodeurl "~1.0.2" 398 | escape-html "~1.0.3" 399 | on-finished "~2.3.0" 400 | parseurl "~1.3.3" 401 | statuses "~1.5.0" 402 | unpipe "~1.0.0" 403 | 404 | follow-redirects@^1.10.0: 405 | version "1.14.1" 406 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" 407 | integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== 408 | 409 | form-data@^4.0.0: 410 | version "4.0.0" 411 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" 412 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 413 | dependencies: 414 | asynckit "^0.4.0" 415 | combined-stream "^1.0.8" 416 | mime-types "^2.1.12" 417 | 418 | forwarded@0.2.0: 419 | version "0.2.0" 420 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 421 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 422 | 423 | fresh@0.5.2: 424 | version "0.5.2" 425 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 426 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 427 | 428 | html-encoding-sniffer@^2.0.1: 429 | version "2.0.1" 430 | resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" 431 | integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== 432 | dependencies: 433 | whatwg-encoding "^1.0.5" 434 | 435 | htmlparser2@^6.1.0: 436 | version "6.1.0" 437 | resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" 438 | integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== 439 | dependencies: 440 | domelementtype "^2.0.1" 441 | domhandler "^4.0.0" 442 | domutils "^2.5.2" 443 | entities "^2.0.0" 444 | 445 | http-errors@1.7.2: 446 | version "1.7.2" 447 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 448 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 449 | dependencies: 450 | depd "~1.1.2" 451 | inherits "2.0.3" 452 | setprototypeof "1.1.1" 453 | statuses ">= 1.5.0 < 2" 454 | toidentifier "1.0.0" 455 | 456 | http-errors@~1.7.2: 457 | version "1.7.3" 458 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 459 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 460 | dependencies: 461 | depd "~1.1.2" 462 | inherits "2.0.4" 463 | setprototypeof "1.1.1" 464 | statuses ">= 1.5.0 < 2" 465 | toidentifier "1.0.0" 466 | 467 | http-proxy-agent@^4.0.1: 468 | version "4.0.1" 469 | resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" 470 | integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== 471 | dependencies: 472 | "@tootallnate/once" "1" 473 | agent-base "6" 474 | debug "4" 475 | 476 | http-proxy@1.11.1: 477 | version "1.11.1" 478 | resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.11.1.tgz#71df55757e802d58ea810df2244019dda05ae85d" 479 | integrity sha1-cd9VdX6ALVjqgQ3yJEAZ3aBa6F0= 480 | dependencies: 481 | eventemitter3 "1.x.x" 482 | requires-port "0.x.x" 483 | 484 | https-proxy-agent@^5.0.0: 485 | version "5.0.0" 486 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" 487 | integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== 488 | dependencies: 489 | agent-base "6" 490 | debug "4" 491 | 492 | iconv-lite@0.4.24: 493 | version "0.4.24" 494 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 495 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 496 | dependencies: 497 | safer-buffer ">= 2.1.2 < 3" 498 | 499 | inherits@2.0.3: 500 | version "2.0.3" 501 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 502 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 503 | 504 | inherits@2.0.4: 505 | version "2.0.4" 506 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 507 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 508 | 509 | ipaddr.js@1.9.1: 510 | version "1.9.1" 511 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 512 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 513 | 514 | is-potential-custom-element-name@^1.0.1: 515 | version "1.0.1" 516 | resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" 517 | integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== 518 | 519 | jsdom@^17.0.0: 520 | version "17.0.0" 521 | resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-17.0.0.tgz#3ec82d1d30030649c8defedc45fff6aa3e5d06ae" 522 | integrity sha512-MUq4XdqwtNurZDVeKScENMPHnkgmdIvMzZ1r1NSwHkDuaqI6BouPjr+17COo4/19oLNnmdpFDPOHVpgIZmZ+VA== 523 | dependencies: 524 | abab "^2.0.5" 525 | acorn "^8.4.1" 526 | acorn-globals "^6.0.0" 527 | cssom "^0.5.0" 528 | cssstyle "^2.3.0" 529 | data-urls "^3.0.0" 530 | decimal.js "^10.3.1" 531 | domexception "^2.0.1" 532 | escodegen "^2.0.0" 533 | form-data "^4.0.0" 534 | html-encoding-sniffer "^2.0.1" 535 | http-proxy-agent "^4.0.1" 536 | https-proxy-agent "^5.0.0" 537 | is-potential-custom-element-name "^1.0.1" 538 | nwsapi "^2.2.0" 539 | parse5 "6.0.1" 540 | saxes "^5.0.1" 541 | symbol-tree "^3.2.4" 542 | tough-cookie "^4.0.0" 543 | w3c-hr-time "^1.0.2" 544 | w3c-xmlserializer "^2.0.0" 545 | webidl-conversions "^6.1.0" 546 | whatwg-encoding "^1.0.5" 547 | whatwg-mimetype "^2.3.0" 548 | whatwg-url "^9.0.0" 549 | ws "^8.0.0" 550 | xml-name-validator "^3.0.0" 551 | 552 | levn@~0.3.0: 553 | version "0.3.0" 554 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 555 | integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= 556 | dependencies: 557 | prelude-ls "~1.1.2" 558 | type-check "~0.3.2" 559 | 560 | media-typer@0.3.0: 561 | version "0.3.0" 562 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 563 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 564 | 565 | memory-cache@^0.2.0: 566 | version "0.2.0" 567 | resolved "https://registry.yarnpkg.com/memory-cache/-/memory-cache-0.2.0.tgz#7890b01d52c00c8ebc9d533e1f8eb17e3034871a" 568 | integrity sha1-eJCwHVLADI68nVM+H46xfjA0hxo= 569 | 570 | merge-descriptors@1.0.1: 571 | version "1.0.1" 572 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 573 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 574 | 575 | methods@~1.1.2: 576 | version "1.1.2" 577 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 578 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 579 | 580 | mime-db@1.49.0: 581 | version "1.49.0" 582 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" 583 | integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== 584 | 585 | mime-types@^2.1.12, mime-types@~2.1.24: 586 | version "2.1.32" 587 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" 588 | integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== 589 | dependencies: 590 | mime-db "1.49.0" 591 | 592 | mime@1.6.0: 593 | version "1.6.0" 594 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 595 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 596 | 597 | ms@2.0.0: 598 | version "2.0.0" 599 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 600 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 601 | 602 | ms@2.1.1: 603 | version "2.1.1" 604 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 605 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 606 | 607 | ms@2.1.2: 608 | version "2.1.2" 609 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 610 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 611 | 612 | negotiator@0.6.2: 613 | version "0.6.2" 614 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 615 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 616 | 617 | nth-check@^2.0.0: 618 | version "2.0.0" 619 | resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.0.tgz#1bb4f6dac70072fc313e8c9cd1417b5074c0a125" 620 | integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q== 621 | dependencies: 622 | boolbase "^1.0.0" 623 | 624 | nwsapi@^2.2.0: 625 | version "2.2.0" 626 | resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" 627 | integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== 628 | 629 | object-assign@^4: 630 | version "4.1.1" 631 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 632 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 633 | 634 | on-finished@~2.3.0: 635 | version "2.3.0" 636 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 637 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 638 | dependencies: 639 | ee-first "1.1.1" 640 | 641 | optionator@^0.8.1: 642 | version "0.8.3" 643 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" 644 | integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== 645 | dependencies: 646 | deep-is "~0.1.3" 647 | fast-levenshtein "~2.0.6" 648 | levn "~0.3.0" 649 | prelude-ls "~1.1.2" 650 | type-check "~0.3.2" 651 | word-wrap "~1.2.3" 652 | 653 | parse5-htmlparser2-tree-adapter@^6.0.1: 654 | version "6.0.1" 655 | resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" 656 | integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== 657 | dependencies: 658 | parse5 "^6.0.1" 659 | 660 | parse5@6.0.1, parse5@^6.0.1: 661 | version "6.0.1" 662 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" 663 | integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== 664 | 665 | parseurl@~1.3.3: 666 | version "1.3.3" 667 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 668 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 669 | 670 | path-to-regexp@0.1.7: 671 | version "0.1.7" 672 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 673 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 674 | 675 | prelude-ls@~1.1.2: 676 | version "1.1.2" 677 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 678 | integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= 679 | 680 | proxy-addr@~2.0.5: 681 | version "2.0.7" 682 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 683 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 684 | dependencies: 685 | forwarded "0.2.0" 686 | ipaddr.js "1.9.1" 687 | 688 | proxy-from-env@0.0.1: 689 | version "0.0.1" 690 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-0.0.1.tgz#b27c4946e9e6d5dbadb7598a6435d3014c4cfd49" 691 | integrity sha1-snxJRunm1dutt1mKZDXTAUxM/Uk= 692 | 693 | psl@^1.1.33: 694 | version "1.8.0" 695 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" 696 | integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== 697 | 698 | punycode@^2.1.1: 699 | version "2.1.1" 700 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 701 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 702 | 703 | qs@6.7.0: 704 | version "6.7.0" 705 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 706 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 707 | 708 | range-parser@~1.2.1: 709 | version "1.2.1" 710 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 711 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 712 | 713 | raw-body@2.4.0: 714 | version "2.4.0" 715 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 716 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 717 | dependencies: 718 | bytes "3.1.0" 719 | http-errors "1.7.2" 720 | iconv-lite "0.4.24" 721 | unpipe "1.0.0" 722 | 723 | requires-port@0.x.x: 724 | version "0.0.1" 725 | resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-0.0.1.tgz#4b4414411d9df7c855995dd899a8c78a2951c16d" 726 | integrity sha1-S0QUQR2d98hVmV3YmajHiilRwW0= 727 | 728 | safe-buffer@5.1.2: 729 | version "5.1.2" 730 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 731 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 732 | 733 | "safer-buffer@>= 2.1.2 < 3": 734 | version "2.1.2" 735 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 736 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 737 | 738 | saxes@^5.0.1: 739 | version "5.0.1" 740 | resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" 741 | integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== 742 | dependencies: 743 | xmlchars "^2.2.0" 744 | 745 | send@0.17.1: 746 | version "0.17.1" 747 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 748 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 749 | dependencies: 750 | debug "2.6.9" 751 | depd "~1.1.2" 752 | destroy "~1.0.4" 753 | encodeurl "~1.0.2" 754 | escape-html "~1.0.3" 755 | etag "~1.8.1" 756 | fresh "0.5.2" 757 | http-errors "~1.7.2" 758 | mime "1.6.0" 759 | ms "2.1.1" 760 | on-finished "~2.3.0" 761 | range-parser "~1.2.1" 762 | statuses "~1.5.0" 763 | 764 | serve-static@1.14.1: 765 | version "1.14.1" 766 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 767 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 768 | dependencies: 769 | encodeurl "~1.0.2" 770 | escape-html "~1.0.3" 771 | parseurl "~1.3.3" 772 | send "0.17.1" 773 | 774 | setprototypeof@1.1.1: 775 | version "1.1.1" 776 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 777 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 778 | 779 | source-map@~0.6.1: 780 | version "0.6.1" 781 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 782 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 783 | 784 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 785 | version "1.5.0" 786 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 787 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 788 | 789 | symbol-tree@^3.2.4: 790 | version "3.2.4" 791 | resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" 792 | integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== 793 | 794 | toidentifier@1.0.0: 795 | version "1.0.0" 796 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 797 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 798 | 799 | tough-cookie@^4.0.0: 800 | version "4.0.0" 801 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" 802 | integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== 803 | dependencies: 804 | psl "^1.1.33" 805 | punycode "^2.1.1" 806 | universalify "^0.1.2" 807 | 808 | tr46@^2.1.0: 809 | version "2.1.0" 810 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" 811 | integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== 812 | dependencies: 813 | punycode "^2.1.1" 814 | 815 | tslib@^2.2.0: 816 | version "2.3.1" 817 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" 818 | integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== 819 | 820 | type-check@~0.3.2: 821 | version "0.3.2" 822 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 823 | integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= 824 | dependencies: 825 | prelude-ls "~1.1.2" 826 | 827 | type-is@~1.6.17, type-is@~1.6.18: 828 | version "1.6.18" 829 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 830 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 831 | dependencies: 832 | media-typer "0.3.0" 833 | mime-types "~2.1.24" 834 | 835 | universalify@^0.1.2: 836 | version "0.1.2" 837 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 838 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 839 | 840 | unpipe@1.0.0, unpipe@~1.0.0: 841 | version "1.0.0" 842 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 843 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 844 | 845 | utils-merge@1.0.1: 846 | version "1.0.1" 847 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 848 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 849 | 850 | vary@^1, vary@~1.1.2: 851 | version "1.1.2" 852 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 853 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 854 | 855 | w3c-hr-time@^1.0.2: 856 | version "1.0.2" 857 | resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" 858 | integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== 859 | dependencies: 860 | browser-process-hrtime "^1.0.0" 861 | 862 | w3c-xmlserializer@^2.0.0: 863 | version "2.0.0" 864 | resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" 865 | integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== 866 | dependencies: 867 | xml-name-validator "^3.0.0" 868 | 869 | webidl-conversions@^5.0.0: 870 | version "5.0.0" 871 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" 872 | integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== 873 | 874 | webidl-conversions@^6.1.0: 875 | version "6.1.0" 876 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" 877 | integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== 878 | 879 | whatwg-encoding@^1.0.5: 880 | version "1.0.5" 881 | resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" 882 | integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== 883 | dependencies: 884 | iconv-lite "0.4.24" 885 | 886 | whatwg-mimetype@^2.3.0: 887 | version "2.3.0" 888 | resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" 889 | integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== 890 | 891 | whatwg-url@^9.0.0: 892 | version "9.1.0" 893 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-9.1.0.tgz#1b112cf237d72cd64fa7882b9c3f6234a1c3050d" 894 | integrity sha512-CQ0UcrPHyomtlOCot1TL77WyMIm/bCwrJ2D6AOKGwEczU9EpyoqAokfqrf/MioU9kHcMsmJZcg1egXix2KYEsA== 895 | dependencies: 896 | tr46 "^2.1.0" 897 | webidl-conversions "^6.1.0" 898 | 899 | word-wrap@~1.2.3: 900 | version "1.2.3" 901 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 902 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 903 | 904 | ws@^8.0.0: 905 | version "8.1.0" 906 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.1.0.tgz#75e5ec608f66d3d3934ec6dbc4ebc8a34a68638c" 907 | integrity sha512-0UWlCD2s3RSclw8FN+D0zDTUyMO+1kHwJQQJzkgUh16S8d3NYON0AKCEQPffE0ez4JyRFu76QDA9KR5bOG/7jw== 908 | 909 | xml-name-validator@^3.0.0: 910 | version "3.0.0" 911 | resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" 912 | integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== 913 | 914 | xmlchars@^2.2.0: 915 | version "2.2.0" 916 | resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" 917 | integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== 918 | --------------------------------------------------------------------------------