From bdd0a9f4f6396fbb4d5ada2d411a66c0a054740a Mon Sep 17 00:00:00 2001 From: Tobias Hopp Date: Mon, 6 Feb 2023 23:20:35 +0100 Subject: [PATCH] close #11 and fix bugs on timers Took 1 hour 14 minutes --- package.json | 4 +- public/stylesheets/main.css | 7 +- public/stylesheets/style.css | 33 ++-- src/Utils.ts | 19 ++- src/iTender.ts | 39 +++-- src/routes/ws/websocketRoute.ts | 3 +- src/web/Fill.ts | 73 +++++---- src/web/WebHandler.ts | 7 +- src/web/main.ts | 3 +- yarn.lock | 263 +++++++++++++++++++++++++++++++- 10 files changed, 374 insertions(+), 77 deletions(-) diff --git a/package.json b/package.json index 30e50b3..32f9b33 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "@types/rpi-gpio": "^2.1.1", "@types/rpi-ws281x-native": "^1.0.0", "@types/serialport": "^8.0.2", + "@types/sharp": "^0.31.1", "axios": "^1.2.0", "buffer": "^6.0.3", "cookie-parser": "^1.4.6", @@ -42,7 +43,8 @@ "pug": "^3.0.2", "rpi-gpio": "^2.1.7", "rpi-ws281x-native": "^1.0.4", - "serialport": "^10.5.0" + "serialport": "^10.5.0", + "sharp": "^0.31.3" }, "devDependencies": { "nodemon": "^2.0.20", diff --git a/public/stylesheets/main.css b/public/stylesheets/main.css index 331b251..a96f523 100644 --- a/public/stylesheets/main.css +++ b/public/stylesheets/main.css @@ -8,6 +8,7 @@ grid-template-columns: repeat(3, calc(90% / 3)); grid-template-rows: repeat(2, calc(90% / 2)); grid-gap: 9% 5.5%; + overflow-x: hidden; } @@ -33,9 +34,9 @@ #main .drink:hover { - background-color: rgba(57, 57, 57, 0.8); - width: 100%; - height: 100%; + background-color: rgba(22, 67, 113, 0.8); + /*width: 100%; + height: 100%;*/ } diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index 087b0ff..4186d86 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -187,7 +187,7 @@ h2 { #overlay #bottom #menuContainers { height: 100%; display: grid; - grid-template-columns: repeat(14,1fr); + grid-template-columns: repeat(14, 1fr); grid-auto-flow: column; direction: rtl; grid-template-rows: 100%; @@ -195,15 +195,16 @@ h2 { padding: 1% 2% 0.2%; } + #menuContainers .container { text-align: center; border-radius: 0 0 30% 30%; border: 1px solid black; border-top-color: transparent; padding-top: 18%; - background-color: #5b5b9b; + background-color: #5B5B9B; transition: all 1s; - transition: background-color 3s; + transition: background-color 9s; direction: ltr; } @@ -279,28 +280,40 @@ h2 { transition: visibility 0.8s; } + .tooltip { position: relative; display: inline-block; } + .tooltip .tooltiptext { - visibility: hidden; - width: 100px; + opacity: 0; + width: 110px; background-color: #214B74; - color: #fff; + color: #FFFFFF; text-align: center; border-radius: 8px; padding: 5px 0; - /* Position the tooltip */ position: absolute; z-index: 1; - bottom: 45%; + bottom: 40%; left: 50%; - margin-left: -60px; + margin-left: -80px; } + +@keyframes blendIn { + 0% { + opacity: 0; + } + 100% { + opacity: 100%; + } +} + + .tooltip:hover .tooltiptext { - visibility: visible; + animation: blendIn 0.5s ease forwards; } \ No newline at end of file diff --git a/src/Utils.ts b/src/Utils.ts index 57d2adf..0800298 100644 --- a/src/Utils.ts +++ b/src/Utils.ts @@ -3,6 +3,7 @@ import * as fs from "fs"; import * as https from 'https'; import path from "path"; import {Settings} from "./Settings"; +import sharp from "sharp"; export class Utils { public static checkInternet(): Promise { @@ -23,20 +24,26 @@ export class Utils { }) } - static downloadImage(url, filepath) { - + static downloadImage(url, id) { return new Promise((resolve, reject) => { + // "./public/images/" + drink._id + ".png" + let tempPath = "./public/images/" + id + "_pre.png"; + let finalPath = "./public/images/" + id + ".png"; try { - if (!fs.existsSync(path.dirname(filepath))) - fs.mkdirSync(path.dirname(filepath)); + if (!fs.existsSync(path.dirname(tempPath))) + fs.mkdirSync(path.dirname(finalPath)); } catch (e) { } https.get(url, (res) => { if (res.statusCode === 200) { - res.pipe(fs.createWriteStream(filepath)) + res.pipe(fs.createWriteStream(tempPath)) .on('error', reject) - .once('close', () => resolve(filepath)); + .once('close', async () => { + await sharp(tempPath).resize( { width: 400 } ).sharpen().toFile(finalPath); + fs.unlinkSync(tempPath); + resolve(finalPath); + }); } else { // Consume response data to free up memory res.resume(); diff --git a/src/iTender.ts b/src/iTender.ts index 18bcf8c..f4e04c8 100644 --- a/src/iTender.ts +++ b/src/iTender.ts @@ -17,12 +17,10 @@ import axios from "axios"; import {Mixer} from "./Mixer"; - const log = debug("itender:station"); const mixLog = debug("itender:mixer"); - /** * The main class of the itender, here a located all main features of the system, like starting pumps, firing events and stuff */ @@ -42,20 +40,18 @@ export class iTender { */ static sensitivityFactor: number = 1.0; - /** - * Retrieve all drinks in cache - */ - static get drinks(): IDrink[] { - return this._drinks; - } - - /** * Current internal status of itender * @private */ private static _status: iTenderStatus = iTenderStatus.STARTING; + /** + * Returns the internal status of itender app + */ + static get status(): iTenderStatus { + return this._status; + } /** * Current internal connection-status boolean @@ -77,6 +73,13 @@ export class iTender { */ private static _drinks: IDrink[]; + /** + * Retrieve all drinks in cache + */ + static get drinks(): IDrink[] { + return this._drinks; + } + /** * Sets the current itender status and sends it to the client * @param status @@ -88,14 +91,6 @@ export class iTender { log("Status is now " + status); } - /** - * Returns the internal status of itender app - */ - static get status(): iTenderStatus { - return this._status; - } - - /** * This method is fired if the user likes to mix a drink * It starts to calculate the ingredients and amounts of each ingredient @@ -112,6 +107,7 @@ export class iTender { } const job = new Job(); + console.debug(data.drink, data.amount); let amounts: { ingredient: IIngredient, amount: number, container?: IContainer }[] = []; job.completeAmount = 0; @@ -132,11 +128,10 @@ export class iTender { let factor = sum / data.amount; for (let x of (drink.ingredients as { type: IIngredient, amount: number }[])) { - amounts.push({ingredient: x.type, amount: x.amount * factor}) - job.completeAmount += x.amount; + amounts.push({ingredient: x.type, amount: x.amount / factor}) + job.completeAmount += x.amount / factor; } - } else { for (let x of (drink.ingredients as { type: IIngredient, amount: number }[])) { amounts.push({ingredient: x.type, amount: x.amount}); @@ -322,7 +317,7 @@ export class iTender { if (!Utils.checkForImage(remote._id)) { let url = "https://itender.iif.li/images/" + remote._id + ".png"; try { - await Utils.downloadImage(url, "./public/images/" + drink._id + ".png") + await Utils.downloadImage(url, drink._id); log("Drink " + remote.name + "'s Thumbnail downloaded"); } catch (e) { log("Drink " + remote.name + " failed to download thumbnail! (" + url + ") | " + e); diff --git a/src/routes/ws/websocketRoute.ts b/src/routes/ws/websocketRoute.ts index 2539453..79db2c6 100644 --- a/src/routes/ws/websocketRoute.ts +++ b/src/routes/ws/websocketRoute.ts @@ -19,6 +19,7 @@ import * as os from "os"; import {promisify} from "util"; import Drink from "../../database/Drink"; import path from "path"; +import {Utils} from "../../Utils"; const exec = promisify(require('child_process').exec) @@ -361,6 +362,7 @@ router.ws('/', async (ws, req, next) => { await Drink.deleteMany({}); await Ingredient.deleteMany({}); for (let c of (await Container.find())) { + Utils.deleteImage(c._id); c.content = undefined; c.save(); } @@ -369,7 +371,6 @@ router.ws('/', async (ws, req, next) => { WebSocketHandler.answerRequest(msg.data["type"] as RequestType, true); break; } - } break; } diff --git a/src/web/Fill.ts b/src/web/Fill.ts index 81de201..5c6b1e3 100644 --- a/src/web/Fill.ts +++ b/src/web/Fill.ts @@ -41,7 +41,7 @@ export class Fill { let cancelBtn = document.createElement("button"); cancelBtn.classList.add("btn", "btn-danger"); - cancelBtn.innerText = "Abbrechen"; + cancelBtn.innerText = "STOP"; cancelBtn.disabled = true; setTimeout(() => { cancelBtn.disabled = false; @@ -58,14 +58,15 @@ export class Fill { function riseSlowlyUp(lastNumber: number, number: number) { for (let i = lastNumber; i < number; i++) { setTimeout(() => { - ml.innerText = Math.floor(i) + "ml"; + ml.innerText = Math.ceil(i) + "ml"; }, (number - lastNumber / 1000) + i * 4); } } + let interval; modal.open().then(() => { WebWebSocketHandler.request(RequestType.JOB).then((payload) => { - let minus = 0; + let minus = -1; let job = payload.data as IJob; ml.innerText = Math.floor((job.completeAmount / job.estimatedTime) * minus) + "ml"; waterAnimDiv.style.setProperty("--fillTime", job.estimatedTime + "s"); @@ -74,17 +75,25 @@ export class Fill { seconds.innerText = Math.floor(job.estimatedTime) + "s"; let last = 0; - let interval = setInterval(() => { + function updateTimeAndMl() + { minus++; if (minus + 1 > (job.estimatedTime as number)) { - setTimeout( () => clearInterval(interval), 1500 ); + setTimeout(() => clearInterval(interval), 2000); } - seconds.innerText = (Math.floor(job.estimatedTime as number - minus)) + "s"; + let iT = (Math.floor(job.estimatedTime as number - minus)); + if (iT < 0) + iT = 0; + + seconds.innerText = iT + "s"; let calc = Math.floor((job.completeAmount / job.estimatedTime) * minus); riseSlowlyUp(last, calc) last = calc; - }, 1000); + } + + interval = setInterval(updateTimeAndMl, 1000); + updateTimeAndMl(); setTimeout(() => { @@ -105,42 +114,54 @@ export class Fill { return new Promise(async resolve => { let modal = new Modal("fillOptions", drink.name + " Mixen"); let pre = document.createElement("p"); - pre.innerHTML = `Bitte wähle die Größe deines Glas aus
`; + pre.innerHTML = `Bitte wähle die Größe deines Glases aus
`; modal.addContent(pre); let div = document.createElement("div"); + div.style.display = "grid"; + div.style.minHeight = "20vh"; + div.style.gridTemplateRows = "100%"; + div.style.gridTemplateColumns = "repeat(4,auto)"; + div.style.marginTop = "5%"; + div.style.marginBottom = "2%"; - let sizes = [ ["shot", "Shot", 20], ["small", "Klein", 120], ["normal", "Normal", 200], ["large", "Groß", 300] ]; - for( let s of sizes ) - { + let sizes = [["shot", "Shot", 20], ["small", "Klein", 120], ["normal", "Normal", 200], ["large", "Groß", 300]]; + for (let s of sizes) { let glass = document.createElement("div"); let img = document.createElement("img"); img.src = "/static/" + s[0] + ".png"; + img.style.minHeight = "100%"; + img.style.maxHeight = "100%"; + img.alt = "" + s[1]; + let bottom = document.createElement("p"); bottom.style.textAlign = "center"; bottom.innerHTML = `${s[1]} ${s[2]}ml`; - glass.append(img,bottom); + glass.append(img, bottom); div.append(glass); + + glass.onclick = () => { + + WebWebSocketHandler.request(RequestType.STARTFILL, {drink: drink, amount: s[2]}).then((payload) => { + let data = payload.data as { success: boolean, job?: IJob }; + + if (!data.success) { + let modal = new Modal("fill", "Oh nein!"); + let txt = document.createElement("p"); + txt.innerHTML = `Es ist nicht genug Inhalt in den Behältern, um das gewünschte Getränk in der Größe bereitzustellen.

Bitte wende dich an das Wartungspersonal.

`; + modal.addContent(txt); + modal.addButton(ButtonType.SECONDARY, "Schließen", () => modal.close()); + modal.open(); + } + }); + }; } modal.addContent(div); modal.addBR(); modal.addButton(ButtonType.SECONDARY, "Abbrechen", () => modal.close()); - modal.addButton(ButtonType.SUCCESS, "Starten", () => { - WebWebSocketHandler.request(RequestType.STARTFILL, {drink: drink}).then((payload) => { - let data = payload.data as { success: boolean, job?: IJob }; - - if (!data.success) { - let modal = new Modal("fill", "Oh nein!"); - let txt = document.createElement("p"); - txt.innerHTML = `Es ist nicht genug Inhalt in den Behältern, um das gewünschte Getränk in der Größe bereitzustellen.

Bitte wende dich an das Wartungspersonal.

`; - modal.addContent(txt); - modal.addButton(ButtonType.SECONDARY, "Schließen", () => modal.close()); - modal.open(); - } - }); - }); + // modal.addButton(ButtonType.SUCCESS, "Starten", () => {}); await modal.open(); resolve(); }); diff --git a/src/web/WebHandler.ts b/src/web/WebHandler.ts index 6198c23..09e134b 100644 --- a/src/web/WebHandler.ts +++ b/src/web/WebHandler.ts @@ -7,6 +7,7 @@ import {RequestType} from "../RequestType"; import {IJob} from "../database/IJob"; import {Modal} from "./Modal"; import {ButtonType} from "./ButtonType"; +import {Fill} from "./Fill"; export class WebHandler { private static _currentPane: Pane; @@ -44,8 +45,8 @@ export class WebHandler { drinkName.innerText = drink.name; - //drinkEle.onclick = () => Fill.userFillRequest(drink); - drinkEle.onclick = () => { + drinkEle.onclick = () => Fill.userFillRequest(drink); + /*drinkEle.onclick = () => { WebWebSocketHandler.request(RequestType.STARTFILL, {drink: drink}).then((payload) => { let data = payload.data as { success: boolean, job?: IJob }; @@ -59,6 +60,8 @@ export class WebHandler { } }); } + */ + /* let ingredients = "
    "; for (let i of drink.ingredients) { diff --git a/src/web/main.ts b/src/web/main.ts index fd92274..1624551 100644 --- a/src/web/main.ts +++ b/src/web/main.ts @@ -73,9 +73,8 @@ document.addEventListener("DOMContentLoaded", async () => { } containerDiv.innerHTML = `
    ${span.innerText} - ${container.content?.name} + ${container.content?.name} ${Math.ceil(container.filled)}ml
    `; - //containerDiv.append(span); bottomContainers.append(containerDiv); } diff --git a/yarn.lock b/yarn.lock index 9dd6f53..827c867 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1093,6 +1093,13 @@ "@types/mime" "*" "@types/node" "*" +"@types/sharp@^0.31.1": + version "0.31.1" + resolved "https://registry.yarnpkg.com/@types/sharp/-/sharp-0.31.1.tgz#db768461455dbcf9ff11d69277fd70564483c4df" + integrity sha512-5nWwamN9ZFHXaYEincMSuza8nNfOof8nmO+mcI+Agx1uMUk4/pQnNIcix+9rLPXzKrm1pS34+6WRDbDV0Jn7ag== + dependencies: + "@types/node" "*" + "@types/webidl-conversions@*": version "7.0.0" resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz#2b8e60e33906459219aa587e9d1a612ae994cfe7" @@ -1401,6 +1408,15 @@ bindings@^1.3.0, bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + body-parser@1.18.3: version "1.18.3" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" @@ -1466,7 +1482,7 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.6.0: +buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -1530,6 +1546,11 @@ chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" @@ -1551,11 +1572,27 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + colorette@^2.0.14: version "2.0.19" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" @@ -1659,6 +1696,18 @@ debug@^3.1.0, debug@^3.2.7: dependencies: ms "^2.1.1" +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -1679,6 +1728,11 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg== +detect-libc@^2.0.0, detect-libc@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" + integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== + detect-rpi@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/detect-rpi/-/detect-rpi-1.4.0.tgz#f2fe3da65793d608d62f99b8404734721b7c77bb" @@ -1709,6 +1763,13 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + enhanced-resolve@^5.0.0, enhanced-resolve@^5.10.0: version "5.12.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" @@ -1788,6 +1849,11 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + express-ws@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/express-ws/-/express-ws-5.0.2.tgz#5b02d41b937d05199c6c266d7cc931c823bda8eb" @@ -1910,6 +1976,11 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" @@ -1929,6 +2000,11 @@ get-intrinsic@^1.0.2: has "^1.0.3" has-symbols "^1.0.3" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -2022,6 +2098,16 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== +inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + interpret@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" @@ -2037,6 +2123,11 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -2242,6 +2333,11 @@ mime@1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -2256,6 +2352,16 @@ minimatch@^5.1.2: dependencies: brace-expansion "^2.0.1" +minimist@^1.2.0, minimist@^1.2.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mongodb-connection-string-url@^2.5.4: version "2.6.0" resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz#57901bf352372abdde812c81be47b75c6b2ec5cf" @@ -2337,6 +2443,11 @@ nan@^2.14.0, nan@^2.14.2: resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -2354,6 +2465,13 @@ net-ping@^1.2.3: dependencies: raw-socket "*" +node-abi@^3.3.0: + version "3.31.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.31.0.tgz#dfb2ea3d01188eb80859f69bb4a4354090c1b355" + integrity sha512-eSKV6s+APenqVh8ubJyiu/YhZgxQpGP66ntzUb3lY1xB9ukSRaGnx0AIxI+IM+1+IVYC1oWobgG5L3Lt9ARykQ== + dependencies: + semver "^7.3.5" + node-addon-api@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" @@ -2414,6 +2532,13 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== +once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + onoff@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/onoff/-/onoff-6.0.3.tgz#b8e41aec363bebbb3d76e47d74b8ae9cea8d4280" @@ -2498,6 +2623,24 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +prebuild-install@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" + integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + promise@^7.0.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" @@ -2626,6 +2769,14 @@ pug@^3.0.2: pug-runtime "^3.0.1" pug-strip-comments "^2.0.0" +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0, punycode@^2.1.1: version "2.3.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" @@ -2665,6 +2816,25 @@ raw-socket@*: dependencies: nan "2.14.*" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -2727,7 +2897,7 @@ safe-buffer@5.1.2: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.1.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -2758,7 +2928,7 @@ semver@^5.7.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^7.3.4: +semver@^7.3.4, semver@^7.3.5, semver@^7.3.8: version "7.3.8" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== @@ -2838,6 +3008,20 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" +sharp@^0.31.3: + version "0.31.3" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.31.3.tgz#60227edc5c2be90e7378a210466c99aefcf32688" + integrity sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg== + dependencies: + color "^4.2.3" + detect-libc "^2.0.1" + node-addon-api "^5.0.0" + prebuild-install "^7.1.1" + semver "^7.3.8" + simple-get "^4.0.1" + tar-fs "^2.1.1" + tunnel-agent "^0.6.0" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -2864,6 +3048,27 @@ sift@16.0.1: resolved "https://registry.yarnpkg.com/sift/-/sift-16.0.1.tgz#e9c2ccc72191585008cf3e36fc447b2d2633a053" integrity sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0, simple-get@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + simple-update-notifier@^1.0.7: version "1.1.0" resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" @@ -2914,6 +3119,18 @@ statuses@~1.4.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + strnum@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" @@ -2950,6 +3167,27 @@ tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar-fs@^2.0.0, tar-fs@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + terser-webpack-plugin@^5.1.3: version "5.3.6" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" @@ -3041,6 +3279,13 @@ tslib@^2.3.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + type-is@~1.6.16: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -3094,6 +3339,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -3233,6 +3483,11 @@ with@^7.0.0: assert-never "^1.2.1" babel-walk "3.0.0-canary-5" +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + ws@^7.4.6: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591"