diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..d49a879407c13806eda1d17c7270813f8b5bfe26 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,39 @@ +# Menggunakan Node.js versi 18 sebagai base image +FROM node:18 + +# Menginstal git, ffmpeg, imagemagick, dan webp +RUN apt-get update && \ + apt-get install -y \ + git \ + ffmpeg \ + imagemagick \ + webp && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# Menetapkan direktori kerja +WORKDIR /app + +# Membuat direktori sessions +RUN mkdir -p /app/sessions + +# Menyalin file package.json dan package-lock.json +COPY package.json ./ + +# Menginstal dependensi Node.js +RUN npm install + +# Menyalin semua file aplikasi ke dalam container +COPY . . + +# Mengubah kepemilikan direktori /app +RUN chown -R node:node /app + +# Beralih ke pengguna non-root +USER node + +# Mengekspos port 7860 +EXPOSE 7860 + +# Menjalankan aplikasi +CMD ["npm", "start"] \ No newline at end of file diff --git a/Procfile b/Procfile new file mode 100644 index 0000000000000000000000000000000000000000..ada54c4c82e8f8e1b0aacffd02611465c3cfed8f --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +worker: node index.js --autocleartmp --autoread diff --git a/README.md b/README.md index 94c6b3d8aaddeb06d90baa72757f07e068706910..6888c51733a10514524ab8a853d67975620a677e 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,10 @@ --- -title: Projek2 -emoji: ๐ŸŒ -colorFrom: gray -colorTo: red -sdk: gradio -sdk_version: 5.8.0 -app_file: app.py +title: veila +emoji: ๐Ÿ˜ป +colorFrom: red +colorTo: indigo +sdk: docker pinned: false --- -Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference +Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference \ No newline at end of file diff --git a/config.js b/config.js new file mode 100644 index 0000000000000000000000000000000000000000..687e505c6f8945882c9601efa45842fa7a3aab1e --- /dev/null +++ b/config.js @@ -0,0 +1,45 @@ +global.owner = ['6285878836361'] +global.mods = ['6285878836361'] +global.prems = ['6285878836361'] +global.nameowner = 'rizki' +global.numberowner = '6285878836361' +global.mail = 'irfanwibu88@gmail.com' +global.gc = 'https://chat.whatsapp.com/KIcqnzY4NJMHXPTz8Xopvd' +global.instagram = 'https://instagram.com/ikykunnnn' +global.wm = 'ยฉ ikyyBot Whatsapp Multi device' +global.wait = '_*Tunggu sedang di proses...*_' +global.eror = '_*Server Error*_' +global.stiker_wait = '*โซนโซบ Stiker sedang dibuat...*' +global.packname = 'Made With' +global.author = 'Bot WhatsApp' +global.autobio = true // Set true untuk mengaktifkan autobio +global.maxwarn = '3' // Peringatan maksimum +global.antiporn = true // Auto delete pesan porno (bot harus admin) + +//INI WAJIB DI ISI!// +global.btc = 'BohqrvbJ' +//Daftar terlebih dahulu https://api.botcahx.eu.org + +//INI OPTIONAL BOLEH DI ISI BOLEH JUGA ENGGA// +global.lann = 'YOUR_APIKEY_HERE' +//Daftar https://api.betabotz.eu.org + +//jangan diganti! +global.APIs = { + btc: 'https://api.botcahx.eu.org' +} + +//ini tidak di isi juga tidak apa-apa +global.APIKeys = { + 'https://api.botcahx.eu.org': 'BohqrvbJ' +} + +let fs = require('fs') +let chalk = require('chalk') +let file = require.resolve(__filename) +fs.watchFile(file, () => { + fs.unwatchFile(file) + console.log(chalk.redBright("Update 'config.js'")) + delete require.cache[file] + require(file) +}) diff --git a/database.json b/database.json new file mode 100644 index 0000000000000000000000000000000000000000..50aed8c051dce0c28fab4ddfbe239c7d7b201534 --- /dev/null +++ b/database.json @@ -0,0 +1,1734 @@ +{ + "users": { + "6285878836361@s.whatsapp.net": { + "taxi": 0, + "lasttaxi": 0, + "lastyoutuber": 0, + "subscribers": 0, + "viewers": 0, + "like": 0, + "playButton": 0, + "saldo": 0, + "pengeluaran": 0, + "healt": 100, + "health": 100, + "energi": 100, + "power": 100, + "title": 0, + "haus": 100, + "laper": 100, + "tprem": 0, + "stamina": 100, + "level": 0, + "follow": 0, + "lastfollow": 0, + "followers": 0, + "pasangan": "", + "sahabat": "", + "location": "Gubuk", + "titlein": "Belum Ada", + "ultah": "", + "waifu": "Belum Di Set", + "husbu": "Belum Di Set", + "pc": 0, + "exp": 116, + "coin": 0, + "atm": 0, + "limit": 100, + "skata": 0, + "tigame": 999, + "lastclaim": 0, + "judilast": 0, + "lastnambang": 0, + "lastnebang": 0, + "lastmulung": 0, + "lastkerja": 0, + "lastmaling": 0, + "lastbunuhi": 0, + "lastbisnis": 0, + "lastberbisnis": 0, + "bisnis": 0, + "berbisnis": 0, + "lastmancing": 0, + "pancing": 0, + "pancingan": 0, + "totalPancingan": 0, + "kardus": 0, + "botol": 0, + "kaleng": 0, + "money": 0, + "litecoin": 0, + "chip": 0, + "tiketcoin": 0, + "poin": 0, + "bank": 0, + "balance": 0, + "diamond": 0, + "emerald": 0, + "rock": 0, + "wood": 0, + "berlian": 0, + "iron": 0, + "emas": 0, + "common": 0, + "uncommon": 0, + "mythic": 0, + "legendary": 0, + "rumahsakit": 0, + "tambang": 0, + "camptroops": 0, + "pertanian": 0, + "fortress": 0, + "trofi": 0, + "rtrofi": "perunggu", + "makanan": 0, + "troopcamp": 0, + "shield": 0, + "arlok": 0, + "ojekk": 0, + "ojek": 0, + "lastngewe": 0, + "ngewe": 0, + "polisi": 0, + "pedagang": 0, + "dokter": 0, + "petani": 0, + "montir": 0, + "kuli": 0, + "korbanngocok": 0, + "coal": 0, + "korekapi": 0, + "ayambakar": 0, + "gulai": 0, + "rendang": 0, + "ayamgoreng": 0, + "oporayam": 0, + "steak": 0, + "babipanggang": 0, + "ikanbakar": 0, + "lelebakar": 0, + "nilabakar": 0, + "bawalbakar": 0, + "udangbakar": 0, + "pausbakar": 0, + "kepitingbakar": 0, + "soda": 0, + "vodka": 0, + "ganja": 0, + "bandage": 0, + "sushi": 0, + "roti": 0, + "ramuan": 0, + "lastramuanclaim": 0, + "gems": 0, + "cupon": 0, + "lastgemsclaim": 0, + "eleksirb": 0, + "penduduk": 0, + "archer": 0, + "shadow": 0, + "laststringclaim": 0, + "lastpotionclaim": 0, + "lastswordclaim": 0, + "lastweaponclaim": 0, + "lastironclaim": 0, + "lastmancingclaim": 0, + "anakpancingan": 0, + "as": 0, + "paus": 0, + "kepiting": 0, + "gurita": 0, + "cumi": 0, + "buntal": 0, + "dory": 0, + "lumba": 0, + "lobster": 0, + "hiu": 0, + "lele": 0, + "nila": 0, + "bawal": 0, + "udang": 0, + "ikan": 0, + "orca": 0, + "banteng": 0, + "harimau": 0, + "gajah": 0, + "kambing": 0, + "panda": 0, + "buaya": 0, + "kerbau": 0, + "sapi": 0, + "monyet": 0, + "babihutan": 0, + "babi": 0, + "ayam": 0, + "apel": 20, + "ayamb": 0, + "ayamg": 0, + "ssapi": 0, + "sapir": 0, + "leleb": 0, + "leleg": 0, + "esteh": 0, + "pet": 0, + "potion": 0, + "sampah": 0, + "kucing": 0, + "kucinglastclaim": 0, + "kucingexp": 0, + "kuda": 0, + "kudalastclaim": 0, + "rubah": 0, + "rubahlastclaim": 0, + "rubahexp": 0, + "anjing": 0, + "anjinglastclaim": 0, + "anjingexp": 0, + "naga": 0, + "nagalastclaim": 0, + "griffin": 0, + "griffinlastclaim": 0, + "centaur": 0, + "fightnaga": 0, + "centaurlastclaim": 0, + "serigala": 0, + "serigalalastclaim": 0, + "serigalaexp": 0, + "phonix": 0, + "phonixlastclaim": 0, + "phonixexp": 0, + "makanannaga": 0, + "makananphonix": 0, + "makanancentaur": 0, + "makananserigala": 0, + "Banneduser": false, + "BannedReason": "", + "banned": false, + "bannedTime": 0, + "warn": 0, + "afk": -1, + "afkReason": "", + "anakkucing": 0, + "anakkuda": 0, + "anakrubah": 0, + "anakanjing": 0, + "makananpet": 0, + "makananPet": 0, + "antispam": 0, + "antispamlastclaim": 0, + "kayu": 0, + "batu": 0, + "string": 0, + "umpan": 0, + "armor": 0, + "armordurability": 0, + "weapon": 0, + "weapondurability": 0, + "sword": 0, + "sworddurability": 0, + "pickaxe": 0, + "pickaxedurability": 0, + "fishingrod": 0, + "fishingroddurability": 0, + "katana": 0, + "katanadurability": 0, + "bow": 0, + "bowdurability": 0, + "kapak": 0, + "kapakdurability": 0, + "axe": 0, + "axedurability": 0, + "pisau": 0, + "pisaudurability": 0, + "kerjasatu": 0, + "kerjadua": 0, + "kerjatiga": 0, + "kerjaempat": 0, + "kerjalima": 0, + "kerjaenam": 0, + "kerjatujuh": 0, + "kerjadelapan": 0, + "kerjasembilan": 0, + "kerjasepuluh": 0, + "kerjasebelas": 0, + "kerjaduabelas": 0, + "kerjatigabelas": 0, + "kerjaempatbelas": 0, + "kerjalimabelas": 0, + "pekerjaansatu": 0, + "pekerjaandua": 0, + "pekerjaantiga": 0, + "pekerjaanempat": 0, + "pekerjaanlima": 0, + "pekerjaanenam": 0, + "pekerjaantujuh": 0, + "pekerjaandelapan": 0, + "pekerjaansembilan": 0, + "pekerjaansepuluh": 0, + "pekerjaansebelas": 0, + "pekerjaanduabelas": 0, + "pekerjaantigabelas": 0, + "pekerjaanempatbelas": 0, + "pekerjaanlimabelas": 0, + "lastadventure": 0, + "lastwar": 0, + "lastberkebon": 0, + "lastberburu": 0, + "lastbansos": 0, + "lastrampok": 0, + "lastkill": 0, + "lastfishing": 0, + "lastdungeon": 0, + "lastduel": 0, + "lastmining": 0, + "lasthourly": 0, + "lastdagang": 0, + "lasthunt": 0, + "lasthun": 0, + "lastweekly": 0, + "lastmonthly": 0, + "lastyearly": 0, + "lastjb": 0, + "lastrob": 0, + "lastdaang": 0, + "lastngojek": 0, + "lastgrab": 0, + "lastngocok": 0, + "lastturu": 0, + "lastseen": 0, + "lastSetStatus": 0, + "registered": false, + "mangga": 0, + "stroberi": 0, + "semangka": 0, + "jeruk": 0, + "name": "+62 858-7883-6361", + "age": -1, + "regTime": -1, + "premiumDate": -1, + "premium": false, + "premiumTime": 0, + "vip": "tidak", + "vipPoin": 0, + "job": "Pengangguran", + "jobexp": 0, + "jail": false, + "penjara": false, + "antarpaket": 0, + "dirawat": false, + "lbars": "[โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’]", + "role": "Newbie ใ‹ก", + "autolevelup": true, + "lastIstigfar": 0, + "skill": "", + "korps": "", + "korpsgrade": "", + "demon": "", + "breaths": "", + "magic": "", + "darahiblis": 0, + "demonblood": 0, + "demonkill": 0, + "hashirakill": 0, + "alldemonkill": 0, + "allhashirakill": 0, + "attack": 0, + "speed": 0, + "strenght": 0, + "defense": 0, + "regeneration": 0, + "ovo": 0, + "dana": 0, + "gopay": 0, + "lastngaji": 0, + "lastlonte": 0, + "lastkoboy": 0, + "lastdate": 0, + "lasttambang": 0, + "lastngepet": 0, + "command": 2, + "commandTotal": 2, + "lastCmd": 1733916892180, + "glimit": 10, + "pertambangan": 0, + "lastbossbattle": 0, + "aqua": 0, + "glory": 0, + "enchant": 0, + "psepick": 0, + "psenjata": 0, + "lastgemclaim": 0, + "makanangriffin": 0, + "healthmonster": 0, + "anakserigala": 0, + "anaknaga": 0, + "anakphonix": 0, + "anakgriffin": 0, + "kyubi": 0, + "anakkyubi": 0, + "anakcentaur": 0, + "kingdom": false, + "lastsda": 0, + "lastberbru": 0, + "lastgift": 0, + "jualan": 0, + "lastjualan": 0, + "ngocokk": 0, + "lastngocokk": 0, + "lastcodereg": 0, + "anggur": 0, + "pisang": 0, + "bibitanggur": 0, + "bibitpisang": 0, + "bibitapel": 0, + "bibitmangga": 0, + "bibitjeruk": 0 + }, + "6283121935164@s.whatsapp.net": { + "taxi": 0, + "lasttaxi": 0, + "lastyoutuber": 0, + "subscribers": 0, + "viewers": 0, + "like": 0, + "playButton": 0, + "saldo": 0, + "pengeluaran": 0, + "healt": 100, + "health": 100, + "energi": 100, + "power": 100, + "title": 0, + "haus": 100, + "laper": 100, + "tprem": 0, + "stamina": 100, + "level": 0, + "follow": 0, + "lastfollow": 0, + "followers": 0, + "pasangan": "", + "sahabat": "", + "location": "Gubuk", + "titlein": "Belum Ada", + "ultah": "", + "waifu": "Belum Di Set", + "husbu": "Belum Di Set", + "pc": 0, + "exp": 0, + "coin": 0, + "atm": 0, + "limit": 100, + "skata": 0, + "tigame": 999, + "lastclaim": 0, + "judilast": 0, + "lastnambang": 0, + "lastnebang": 0, + "lastmulung": 0, + "lastkerja": 0, + "lastmaling": 0, + "lastbunuhi": 0, + "lastbisnis": 0, + "lastberbisnis": 0, + "bisnis": 0, + "berbisnis": 0, + "lastmancing": 0, + "pancing": 0, + "pancingan": 0, + "totalPancingan": 0, + "kardus": 0, + "botol": 0, + "kaleng": 0, + "money": 0, + "litecoin": 0, + "chip": 0, + "tiketcoin": 0, + "poin": 0, + "bank": 0, + "balance": 0, + "diamond": 0, + "emerald": 0, + "rock": 0, + "wood": 0, + "berlian": 0, + "iron": 0, + "emas": 0, + "common": 0, + "uncommon": 0, + "mythic": 0, + "legendary": 0, + "rumahsakit": 0, + "tambang": 0, + "camptroops": 0, + "pertanian": 0, + "fortress": 0, + "trofi": 0, + "rtrofi": "perunggu", + "makanan": 0, + "troopcamp": 0, + "shield": 0, + "arlok": 0, + "ojekk": 0, + "ojek": 0, + "lastngewe": 0, + "ngewe": 0, + "polisi": 0, + "pedagang": 0, + "dokter": 0, + "petani": 0, + "montir": 0, + "kuli": 0, + "korbanngocok": 0, + "coal": 0, + "korekapi": 0, + "ayambakar": 0, + "gulai": 0, + "rendang": 0, + "ayamgoreng": 0, + "oporayam": 0, + "steak": 0, + "babipanggang": 0, + "ikanbakar": 0, + "lelebakar": 0, + "nilabakar": 0, + "bawalbakar": 0, + "udangbakar": 0, + "pausbakar": 0, + "kepitingbakar": 0, + "soda": 0, + "vodka": 0, + "ganja": 0, + "bandage": 0, + "sushi": 0, + "roti": 0, + "ramuan": 0, + "lastramuanclaim": 0, + "gems": 0, + "cupon": 0, + "lastgemsclaim": 0, + "eleksirb": 0, + "penduduk": 0, + "archer": 0, + "shadow": 0, + "laststringclaim": 0, + "lastpotionclaim": 0, + "lastswordclaim": 0, + "lastweaponclaim": 0, + "lastironclaim": 0, + "lastmancingclaim": 0, + "anakpancingan": 0, + "as": 0, + "paus": 0, + "kepiting": 0, + "gurita": 0, + "cumi": 0, + "buntal": 0, + "dory": 0, + "lumba": 0, + "lobster": 0, + "hiu": 0, + "lele": 0, + "nila": 0, + "bawal": 0, + "udang": 0, + "ikan": 0, + "orca": 0, + "banteng": 0, + "harimau": 0, + "gajah": 0, + "kambing": 0, + "panda": 0, + "buaya": 0, + "kerbau": 0, + "sapi": 0, + "monyet": 0, + "babihutan": 0, + "babi": 0, + "ayam": 0, + "apel": 20, + "ayamb": 0, + "ayamg": 0, + "ssapi": 0, + "sapir": 0, + "leleb": 0, + "leleg": 0, + "esteh": 0, + "pet": 0, + "potion": 0, + "sampah": 0, + "kucing": 0, + "kucinglastclaim": 0, + "kucingexp": 0, + "kuda": 0, + "kudalastclaim": 0, + "rubah": 0, + "rubahlastclaim": 0, + "rubahexp": 0, + "anjing": 0, + "anjinglastclaim": 0, + "anjingexp": 0, + "naga": 0, + "nagalastclaim": 0, + "griffin": 0, + "griffinlastclaim": 0, + "centaur": 0, + "fightnaga": 0, + "centaurlastclaim": 0, + "serigala": 0, + "serigalalastclaim": 0, + "serigalaexp": 0, + "phonix": 0, + "phonixlastclaim": 0, + "phonixexp": 0, + "makanannaga": 0, + "makananphonix": 0, + "makanancentaur": 0, + "makananserigala": 0, + "Banneduser": false, + "BannedReason": "", + "banned": false, + "bannedTime": 0, + "warn": 0, + "afk": -1, + "afkReason": "", + "anakkucing": 0, + "anakkuda": 0, + "anakrubah": 0, + "anakanjing": 0, + "makananpet": 0, + "makananPet": 0, + "antispam": 0, + "antispamlastclaim": 0, + "kayu": 0, + "batu": 0, + "string": 0, + "umpan": 0, + "armor": 0, + "armordurability": 0, + "weapon": 0, + "weapondurability": 0, + "sword": 0, + "sworddurability": 0, + "pickaxe": 0, + "pickaxedurability": 0, + "fishingrod": 0, + "fishingroddurability": 0, + "katana": 0, + "katanadurability": 0, + "bow": 0, + "bowdurability": 0, + "kapak": 0, + "kapakdurability": 0, + "axe": 0, + "axedurability": 0, + "pisau": 0, + "pisaudurability": 0, + "kerjasatu": 0, + "kerjadua": 0, + "kerjatiga": 0, + "kerjaempat": 0, + "kerjalima": 0, + "kerjaenam": 0, + "kerjatujuh": 0, + "kerjadelapan": 0, + "kerjasembilan": 0, + "kerjasepuluh": 0, + "kerjasebelas": 0, + "kerjaduabelas": 0, + "kerjatigabelas": 0, + "kerjaempatbelas": 0, + "kerjalimabelas": 0, + "pekerjaansatu": 0, + "pekerjaandua": 0, + "pekerjaantiga": 0, + "pekerjaanempat": 0, + "pekerjaanlima": 0, + "pekerjaanenam": 0, + "pekerjaantujuh": 0, + "pekerjaandelapan": 0, + "pekerjaansembilan": 0, + "pekerjaansepuluh": 0, + "pekerjaansebelas": 0, + "pekerjaanduabelas": 0, + "pekerjaantigabelas": 0, + "pekerjaanempatbelas": 0, + "pekerjaanlimabelas": 0, + "lastadventure": 0, + "lastwar": 0, + "lastberkebon": 0, + "lastberburu": 0, + "lastbansos": 0, + "lastrampok": 0, + "lastkill": 0, + "lastfishing": 0, + "lastdungeon": 0, + "lastduel": 0, + "lastmining": 0, + "lasthourly": 0, + "lastdagang": 0, + "lasthunt": 0, + "lasthun": 0, + "lastweekly": 0, + "lastmonthly": 0, + "lastyearly": 0, + "lastjb": 0, + "lastrob": 0, + "lastdaang": 0, + "lastngojek": 0, + "lastgrab": 0, + "lastngocok": 0, + "lastturu": 0, + "lastseen": 0, + "lastSetStatus": 0, + "registered": false, + "mangga": 0, + "stroberi": 0, + "semangka": 0, + "jeruk": 0, + "name": "irfan", + "age": -1, + "regTime": -1, + "premiumDate": -1, + "premium": false, + "premiumTime": 0, + "vip": "tidak", + "vipPoin": 0, + "job": "Pengangguran", + "jobexp": 0, + "jail": false, + "penjara": false, + "antarpaket": 0, + "dirawat": false, + "lbars": "[โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’]", + "role": "Newbie ใ‹ก", + "autolevelup": true, + "lastIstigfar": 0, + "skill": "", + "korps": "", + "korpsgrade": "", + "demon": "", + "breaths": "", + "magic": "", + "darahiblis": 0, + "demonblood": 0, + "demonkill": 0, + "hashirakill": 0, + "alldemonkill": 0, + "allhashirakill": 0, + "attack": 0, + "speed": 0, + "strenght": 0, + "defense": 0, + "regeneration": 0, + "ovo": 0, + "dana": 0, + "gopay": 0, + "lastngaji": 0, + "lastlonte": 0, + "lastkoboy": 0, + "lastdate": 0, + "lasttambang": 0, + "lastngepet": 0, + "glimit": 10, + "pertambangan": 0, + "lastbossbattle": 0, + "aqua": 0, + "glory": 0, + "enchant": 0, + "psepick": 0, + "psenjata": 0, + "lastgemclaim": 0, + "makanangriffin": 0, + "healthmonster": 0, + "anakserigala": 0, + "anaknaga": 0, + "anakphonix": 0, + "anakgriffin": 0, + "kyubi": 0, + "anakkyubi": 0, + "anakcentaur": 0, + "kingdom": false, + "lastsda": 0, + "lastberbru": 0, + "lastgift": 0, + "jualan": 0, + "lastjualan": 0, + "ngocokk": 0, + "lastngocokk": 0, + "lastcodereg": 0, + "anggur": 0, + "pisang": 0, + "bibitanggur": 0, + "bibitpisang": 0, + "bibitapel": 0, + "bibitmangga": 0, + "bibitjeruk": 0 + }, + "6281212181641@s.whatsapp.net": { + "taxi": 0, + "lasttaxi": 0, + "lastyoutuber": 0, + "subscribers": 0, + "viewers": 0, + "like": 0, + "playButton": 0, + "saldo": 0, + "pengeluaran": 0, + "healt": 100, + "health": 100, + "energi": 100, + "power": 100, + "title": 0, + "haus": 100, + "laper": 100, + "tprem": 0, + "stamina": 100, + "level": 0, + "follow": 0, + "lastfollow": 0, + "followers": 0, + "pasangan": "", + "sahabat": "", + "location": "Gubuk", + "titlein": "Belum Ada", + "ultah": "", + "waifu": "Belum Di Set", + "husbu": "Belum Di Set", + "pc": 0, + "exp": 13, + "coin": 0, + "atm": 0, + "limit": 100, + "skata": 0, + "tigame": 999, + "lastclaim": 0, + "judilast": 0, + "lastnambang": 0, + "lastnebang": 0, + "lastmulung": 0, + "lastkerja": 0, + "lastmaling": 0, + "lastbunuhi": 0, + "lastbisnis": 0, + "lastberbisnis": 0, + "bisnis": 0, + "berbisnis": 0, + "lastmancing": 0, + "pancing": 0, + "pancingan": 0, + "totalPancingan": 0, + "kardus": 0, + "botol": 0, + "kaleng": 0, + "money": 0, + "litecoin": 0, + "chip": 0, + "tiketcoin": 0, + "poin": 0, + "bank": 0, + "balance": 0, + "diamond": 0, + "emerald": 0, + "rock": 0, + "wood": 0, + "berlian": 0, + "iron": 0, + "emas": 0, + "common": 0, + "uncommon": 0, + "mythic": 0, + "legendary": 0, + "rumahsakit": 0, + "tambang": 0, + "camptroops": 0, + "pertanian": 0, + "fortress": 0, + "trofi": 0, + "rtrofi": "perunggu", + "makanan": 0, + "troopcamp": 0, + "shield": 0, + "arlok": 0, + "ojekk": 0, + "ojek": 0, + "lastngewe": 0, + "ngewe": 0, + "polisi": 0, + "pedagang": 0, + "dokter": 0, + "petani": 0, + "montir": 0, + "kuli": 0, + "korbanngocok": 0, + "coal": 0, + "korekapi": 0, + "ayambakar": 0, + "gulai": 0, + "rendang": 0, + "ayamgoreng": 0, + "oporayam": 0, + "steak": 0, + "babipanggang": 0, + "ikanbakar": 0, + "lelebakar": 0, + "nilabakar": 0, + "bawalbakar": 0, + "udangbakar": 0, + "pausbakar": 0, + "kepitingbakar": 0, + "soda": 0, + "vodka": 0, + "ganja": 0, + "bandage": 0, + "sushi": 0, + "roti": 0, + "ramuan": 0, + "lastramuanclaim": 0, + "gems": 0, + "cupon": 0, + "lastgemsclaim": 0, + "eleksirb": 0, + "penduduk": 0, + "archer": 0, + "shadow": 0, + "laststringclaim": 0, + "lastpotionclaim": 0, + "lastswordclaim": 0, + "lastweaponclaim": 0, + "lastironclaim": 0, + "lastmancingclaim": 0, + "anakpancingan": 0, + "as": 0, + "paus": 0, + "kepiting": 0, + "gurita": 0, + "cumi": 0, + "buntal": 0, + "dory": 0, + "lumba": 0, + "lobster": 0, + "hiu": 0, + "lele": 0, + "nila": 0, + "bawal": 0, + "udang": 0, + "ikan": 0, + "orca": 0, + "banteng": 0, + "harimau": 0, + "gajah": 0, + "kambing": 0, + "panda": 0, + "buaya": 0, + "kerbau": 0, + "sapi": 0, + "monyet": 0, + "babihutan": 0, + "babi": 0, + "ayam": 0, + "apel": 20, + "ayamb": 0, + "ayamg": 0, + "ssapi": 0, + "sapir": 0, + "leleb": 0, + "leleg": 0, + "esteh": 0, + "pet": 0, + "potion": 0, + "sampah": 0, + "kucing": 0, + "kucinglastclaim": 0, + "kucingexp": 0, + "kuda": 0, + "kudalastclaim": 0, + "rubah": 0, + "rubahlastclaim": 0, + "rubahexp": 0, + "anjing": 0, + "anjinglastclaim": 0, + "anjingexp": 0, + "naga": 0, + "nagalastclaim": 0, + "griffin": 0, + "griffinlastclaim": 0, + "centaur": 0, + "fightnaga": 0, + "centaurlastclaim": 0, + "serigala": 0, + "serigalalastclaim": 0, + "serigalaexp": 0, + "phonix": 0, + "phonixlastclaim": 0, + "phonixexp": 0, + "makanannaga": 0, + "makananphonix": 0, + "makanancentaur": 0, + "makananserigala": 0, + "Banneduser": false, + "BannedReason": "", + "banned": false, + "bannedTime": 0, + "warn": 0, + "afk": -1, + "afkReason": "", + "anakkucing": 0, + "anakkuda": 0, + "anakrubah": 0, + "anakanjing": 0, + "makananpet": 0, + "makananPet": 0, + "antispam": 0, + "antispamlastclaim": 0, + "kayu": 0, + "batu": 0, + "string": 0, + "umpan": 0, + "armor": 0, + "armordurability": 0, + "weapon": 0, + "weapondurability": 0, + "sword": 0, + "sworddurability": 0, + "pickaxe": 0, + "pickaxedurability": 0, + "fishingrod": 0, + "fishingroddurability": 0, + "katana": 0, + "katanadurability": 0, + "bow": 0, + "bowdurability": 0, + "kapak": 0, + "kapakdurability": 0, + "axe": 0, + "axedurability": 0, + "pisau": 0, + "pisaudurability": 0, + "kerjasatu": 0, + "kerjadua": 0, + "kerjatiga": 0, + "kerjaempat": 0, + "kerjalima": 0, + "kerjaenam": 0, + "kerjatujuh": 0, + "kerjadelapan": 0, + "kerjasembilan": 0, + "kerjasepuluh": 0, + "kerjasebelas": 0, + "kerjaduabelas": 0, + "kerjatigabelas": 0, + "kerjaempatbelas": 0, + "kerjalimabelas": 0, + "pekerjaansatu": 0, + "pekerjaandua": 0, + "pekerjaantiga": 0, + "pekerjaanempat": 0, + "pekerjaanlima": 0, + "pekerjaanenam": 0, + "pekerjaantujuh": 0, + "pekerjaandelapan": 0, + "pekerjaansembilan": 0, + "pekerjaansepuluh": 0, + "pekerjaansebelas": 0, + "pekerjaanduabelas": 0, + "pekerjaantigabelas": 0, + "pekerjaanempatbelas": 0, + "pekerjaanlimabelas": 0, + "lastadventure": 0, + "lastwar": 0, + "lastberkebon": 0, + "lastberburu": 0, + "lastbansos": 0, + "lastrampok": 0, + "lastkill": 0, + "lastfishing": 0, + "lastdungeon": 0, + "lastduel": 0, + "lastmining": 0, + "lasthourly": 0, + "lastdagang": 0, + "lasthunt": 0, + "lasthun": 0, + "lastweekly": 0, + "lastmonthly": 0, + "lastyearly": 0, + "lastjb": 0, + "lastrob": 0, + "lastdaang": 0, + "lastngojek": 0, + "lastgrab": 0, + "lastngocok": 0, + "lastturu": 0, + "lastseen": 0, + "lastSetStatus": 0, + "registered": false, + "mangga": 0, + "stroberi": 0, + "semangka": 0, + "jeruk": 0, + "name": "IKYBOT AUTOAI", + "age": -1, + "regTime": -1, + "premiumDate": -1, + "premium": false, + "premiumTime": 0, + "vip": "tidak", + "vipPoin": 0, + "job": "Pengangguran", + "jobexp": 0, + "jail": false, + "penjara": false, + "antarpaket": 0, + "dirawat": false, + "lbars": "[โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’]", + "role": "Newbie ใ‹ก", + "autolevelup": true, + "lastIstigfar": 0, + "skill": "", + "korps": "", + "korpsgrade": "", + "demon": "", + "breaths": "", + "magic": "", + "darahiblis": 0, + "demonblood": 0, + "demonkill": 0, + "hashirakill": 0, + "alldemonkill": 0, + "allhashirakill": 0, + "attack": 0, + "speed": 0, + "strenght": 0, + "defense": 0, + "regeneration": 0, + "ovo": 0, + "dana": 0, + "gopay": 0, + "lastngaji": 0, + "lastlonte": 0, + "lastkoboy": 0, + "lastdate": 0, + "lasttambang": 0, + "lastngepet": 0, + "glimit": 10, + "pertambangan": 0, + "lastbossbattle": 0, + "aqua": 0, + "glory": 0, + "enchant": 0, + "psepick": 0, + "psenjata": 0, + "lastgemclaim": 0, + "makanangriffin": 0, + "healthmonster": 0, + "anakserigala": 0, + "anaknaga": 0, + "anakphonix": 0, + "anakgriffin": 0, + "kyubi": 0, + "anakkyubi": 0, + "anakcentaur": 0, + "kingdom": false, + "lastsda": 0, + "lastberbru": 0, + "lastgift": 0, + "jualan": 0, + "lastjualan": 0, + "ngocokk": 0, + "lastngocokk": 0, + "lastcodereg": 0, + "anggur": 0, + "pisang": 0, + "bibitanggur": 0, + "bibitpisang": 0, + "bibitapel": 0, + "bibitmangga": 0, + "bibitjeruk": 0 + }, + "6287821561429@s.whatsapp.net": { + "taxi": 0, + "lasttaxi": 0, + "lastyoutuber": 0, + "subscribers": 0, + "viewers": 0, + "like": 0, + "playButton": 0, + "saldo": 0, + "pengeluaran": 0, + "healt": 100, + "health": 100, + "energi": 100, + "power": 100, + "title": 0, + "haus": 100, + "laper": 100, + "tprem": 0, + "stamina": 100, + "level": 0, + "follow": 0, + "lastfollow": 0, + "followers": 0, + "pasangan": "", + "sahabat": "", + "location": "Gubuk", + "titlein": "Belum Ada", + "ultah": "", + "waifu": "Belum Di Set", + "husbu": "Belum Di Set", + "pc": 0, + "exp": 18, + "coin": 0, + "atm": 0, + "limit": 100, + "skata": 0, + "tigame": 999, + "lastclaim": 0, + "judilast": 0, + "lastnambang": 0, + "lastnebang": 0, + "lastmulung": 0, + "lastkerja": 0, + "lastmaling": 0, + "lastbunuhi": 0, + "lastbisnis": 0, + "lastberbisnis": 0, + "bisnis": 0, + "berbisnis": 0, + "lastmancing": 0, + "pancing": 0, + "pancingan": 0, + "totalPancingan": 0, + "kardus": 0, + "botol": 0, + "kaleng": 0, + "money": 0, + "litecoin": 0, + "chip": 0, + "tiketcoin": 0, + "poin": 0, + "bank": 0, + "balance": 0, + "diamond": 0, + "emerald": 0, + "rock": 0, + "wood": 0, + "berlian": 0, + "iron": 0, + "emas": 0, + "common": 0, + "uncommon": 0, + "mythic": 0, + "legendary": 0, + "rumahsakit": 0, + "tambang": 0, + "camptroops": 0, + "pertanian": 0, + "fortress": 0, + "trofi": 0, + "rtrofi": "perunggu", + "makanan": 0, + "troopcamp": 0, + "shield": 0, + "arlok": 0, + "ojekk": 0, + "ojek": 0, + "lastngewe": 0, + "ngewe": 0, + "polisi": 0, + "pedagang": 0, + "dokter": 0, + "petani": 0, + "montir": 0, + "kuli": 0, + "korbanngocok": 0, + "coal": 0, + "korekapi": 0, + "ayambakar": 0, + "gulai": 0, + "rendang": 0, + "ayamgoreng": 0, + "oporayam": 0, + "steak": 0, + "babipanggang": 0, + "ikanbakar": 0, + "lelebakar": 0, + "nilabakar": 0, + "bawalbakar": 0, + "udangbakar": 0, + "pausbakar": 0, + "kepitingbakar": 0, + "soda": 0, + "vodka": 0, + "ganja": 0, + "bandage": 0, + "sushi": 0, + "roti": 0, + "ramuan": 0, + "lastramuanclaim": 0, + "gems": 0, + "cupon": 0, + "lastgemsclaim": 0, + "eleksirb": 0, + "penduduk": 0, + "archer": 0, + "shadow": 0, + "laststringclaim": 0, + "lastpotionclaim": 0, + "lastswordclaim": 0, + "lastweaponclaim": 0, + "lastironclaim": 0, + "lastmancingclaim": 0, + "anakpancingan": 0, + "as": 0, + "paus": 0, + "kepiting": 0, + "gurita": 0, + "cumi": 0, + "buntal": 0, + "dory": 0, + "lumba": 0, + "lobster": 0, + "hiu": 0, + "lele": 0, + "nila": 0, + "bawal": 0, + "udang": 0, + "ikan": 0, + "orca": 0, + "banteng": 0, + "harimau": 0, + "gajah": 0, + "kambing": 0, + "panda": 0, + "buaya": 0, + "kerbau": 0, + "sapi": 0, + "monyet": 0, + "babihutan": 0, + "babi": 0, + "ayam": 0, + "apel": 20, + "ayamb": 0, + "ayamg": 0, + "ssapi": 0, + "sapir": 0, + "leleb": 0, + "leleg": 0, + "esteh": 0, + "pet": 0, + "potion": 0, + "sampah": 0, + "kucing": 0, + "kucinglastclaim": 0, + "kucingexp": 0, + "kuda": 0, + "kudalastclaim": 0, + "rubah": 0, + "rubahlastclaim": 0, + "rubahexp": 0, + "anjing": 0, + "anjinglastclaim": 0, + "anjingexp": 0, + "naga": 0, + "nagalastclaim": 0, + "griffin": 0, + "griffinlastclaim": 0, + "centaur": 0, + "fightnaga": 0, + "centaurlastclaim": 0, + "serigala": 0, + "serigalalastclaim": 0, + "serigalaexp": 0, + "phonix": 0, + "phonixlastclaim": 0, + "phonixexp": 0, + "makanannaga": 0, + "makananphonix": 0, + "makanancentaur": 0, + "makananserigala": 0, + "Banneduser": false, + "BannedReason": "", + "banned": false, + "bannedTime": 0, + "warn": 0, + "afk": -1, + "afkReason": "", + "anakkucing": 0, + "anakkuda": 0, + "anakrubah": 0, + "anakanjing": 0, + "makananpet": 0, + "makananPet": 0, + "antispam": 0, + "antispamlastclaim": 0, + "kayu": 0, + "batu": 0, + "string": 0, + "umpan": 0, + "armor": 0, + "armordurability": 0, + "weapon": 0, + "weapondurability": 0, + "sword": 0, + "sworddurability": 0, + "pickaxe": 0, + "pickaxedurability": 0, + "fishingrod": 0, + "fishingroddurability": 0, + "katana": 0, + "katanadurability": 0, + "bow": 0, + "bowdurability": 0, + "kapak": 0, + "kapakdurability": 0, + "axe": 0, + "axedurability": 0, + "pisau": 0, + "pisaudurability": 0, + "kerjasatu": 0, + "kerjadua": 0, + "kerjatiga": 0, + "kerjaempat": 0, + "kerjalima": 0, + "kerjaenam": 0, + "kerjatujuh": 0, + "kerjadelapan": 0, + "kerjasembilan": 0, + "kerjasepuluh": 0, + "kerjasebelas": 0, + "kerjaduabelas": 0, + "kerjatigabelas": 0, + "kerjaempatbelas": 0, + "kerjalimabelas": 0, + "pekerjaansatu": 0, + "pekerjaandua": 0, + "pekerjaantiga": 0, + "pekerjaanempat": 0, + "pekerjaanlima": 0, + "pekerjaanenam": 0, + "pekerjaantujuh": 0, + "pekerjaandelapan": 0, + "pekerjaansembilan": 0, + "pekerjaansepuluh": 0, + "pekerjaansebelas": 0, + "pekerjaanduabelas": 0, + "pekerjaantigabelas": 0, + "pekerjaanempatbelas": 0, + "pekerjaanlimabelas": 0, + "lastadventure": 0, + "lastwar": 0, + "lastberkebon": 0, + "lastberburu": 0, + "lastbansos": 0, + "lastrampok": 0, + "lastkill": 0, + "lastfishing": 0, + "lastdungeon": 0, + "lastduel": 0, + "lastmining": 0, + "lasthourly": 0, + "lastdagang": 0, + "lasthunt": 0, + "lasthun": 0, + "lastweekly": 0, + "lastmonthly": 0, + "lastyearly": 0, + "lastjb": 0, + "lastrob": 0, + "lastdaang": 0, + "lastngojek": 0, + "lastgrab": 0, + "lastngocok": 0, + "lastturu": 0, + "lastseen": 0, + "lastSetStatus": 0, + "registered": false, + "mangga": 0, + "stroberi": 0, + "semangka": 0, + "jeruk": 0, + "name": "+62 878-2156-1429", + "age": -1, + "regTime": -1, + "premiumDate": -1, + "premium": false, + "premiumTime": 0, + "vip": "tidak", + "vipPoin": 0, + "job": "Pengangguran", + "jobexp": 0, + "jail": false, + "penjara": false, + "antarpaket": 0, + "dirawat": false, + "lbars": "[โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’]", + "role": "Newbie ใ‹ก", + "autolevelup": true, + "lastIstigfar": 0, + "skill": "", + "korps": "", + "korpsgrade": "", + "demon": "", + "breaths": "", + "magic": "", + "darahiblis": 0, + "demonblood": 0, + "demonkill": 0, + "hashirakill": 0, + "alldemonkill": 0, + "allhashirakill": 0, + "attack": 0, + "speed": 0, + "strenght": 0, + "defense": 0, + "regeneration": 0, + "ovo": 0, + "dana": 0, + "gopay": 0, + "lastngaji": 0, + "lastlonte": 0, + "lastkoboy": 0, + "lastdate": 0, + "lasttambang": 0, + "lastngepet": 0, + "glimit": 10, + "pertambangan": 0, + "lastbossbattle": 0, + "aqua": 0, + "glory": 0, + "enchant": 0, + "psepick": 0, + "psenjata": 0, + "lastgemclaim": 0, + "makanangriffin": 0, + "healthmonster": 0, + "anakserigala": 0, + "anaknaga": 0, + "anakphonix": 0, + "anakgriffin": 0, + "kyubi": 0, + "anakkyubi": 0, + "anakcentaur": 0, + "kingdom": false, + "lastsda": 0, + "lastberbru": 0, + "lastgift": 0, + "jualan": 0, + "lastjualan": 0, + "ngocokk": 0, + "lastngocokk": 0, + "lastcodereg": 0, + "anggur": 0, + "pisang": 0, + "bibitanggur": 0, + "bibitpisang": 0, + "bibitapel": 0, + "bibitmangga": 0, + "bibitjeruk": 0 + } + }, + "chats": { + "6285878836361@s.whatsapp.net": { + "isBanned": false, + "welcome": true, + "welcometype": 1, + "detect": false, + "isBannedTime": false, + "mute": false, + "listStr": {}, + "sWelcome": "Hai, @user!\nSelamat datang di grup @subject\n\n@desc", + "sBye": "Selamat tinggal @user!", + "sPromote": "", + "sDemote": "", + "delete": false, + "antiLink": false, + "antiLinknokick": false, + "antiSticker": false, + "antiStickernokick": false, + "viewonce": false, + "antiToxic": true, + "antilinkig": false, + "antilinkignokick": false, + "antilinkyt": false, + "antilinkytnokick": false, + "antilinktwit": false, + "antilinktwitnokick": false, + "antilinkfb": false, + "antilinkfbnokick": false, + "antilinkall": false, + "antilinkallnokick": false, + "antilinkwame": false, + "antilinkwamenokick": false, + "antilinktele": false, + "antilinktelenokick": false, + "antilinktt": false, + "antilinkttnokick": false, + "antibot": false, + "rpg": false, + "expired": 0, + "memgc": { + "6285878836361@s.whatsapp.net": { + "blacklist": false, + "banned": false, + "bannedTime": 0, + "chat": 0, + "chatTotal": 0, + "command": 0, + "commandTotal": 0, + "lastseen": 0 + }, + "6283121935164@s.whatsapp.net": { + "blacklist": false, + "banned": false, + "bannedTime": 0, + "chat": 0, + "chatTotal": 0, + "command": 0, + "commandTotal": 0, + "lastseen": 0 + }, + "6287821561429@s.whatsapp.net": { + "blacklist": false, + "banned": false, + "bannedTime": 0, + "chat": 0, + "chatTotal": 0, + "command": 0, + "commandTotal": 0, + "lastseen": 0 + } + } + }, + "6281212181641@s.whatsapp.net": { + "isBanned": false, + "welcome": true, + "welcometype": 1, + "detect": false, + "isBannedTime": false, + "mute": false, + "listStr": {}, + "sWelcome": "Hai, @user!\nSelamat datang di grup @subject\n\n@desc", + "sBye": "Selamat tinggal @user!", + "sPromote": "", + "sDemote": "", + "delete": false, + "antiLink": false, + "antiLinknokick": false, + "antiSticker": false, + "antiStickernokick": false, + "viewonce": false, + "antiToxic": true, + "antilinkig": false, + "antilinkignokick": false, + "antilinkyt": false, + "antilinkytnokick": false, + "antilinktwit": false, + "antilinktwitnokick": false, + "antilinkfb": false, + "antilinkfbnokick": false, + "antilinkall": false, + "antilinkallnokick": false, + "antilinkwame": false, + "antilinkwamenokick": false, + "antilinktele": false, + "antilinktelenokick": false, + "antilinktt": false, + "antilinkttnokick": false, + "antibot": false, + "rpg": false, + "expired": 0, + "memgc": { + "6281212181641@s.whatsapp.net": { + "blacklist": false, + "banned": false, + "bannedTime": 0, + "chat": 0, + "chatTotal": 0, + "command": 0, + "commandTotal": 0, + "lastseen": 0 + } + } + }, + "6287821561429@s.whatsapp.net": { + "isBanned": false, + "welcome": true, + "welcometype": 1, + "detect": false, + "isBannedTime": false, + "mute": false, + "listStr": {}, + "sWelcome": "Hai, @user!\nSelamat datang di grup @subject\n\n@desc", + "sBye": "Selamat tinggal @user!", + "sPromote": "", + "sDemote": "", + "delete": false, + "antiLink": false, + "antiLinknokick": false, + "antiSticker": false, + "antiStickernokick": false, + "viewonce": false, + "antiToxic": true, + "antilinkig": false, + "antilinkignokick": false, + "antilinkyt": false, + "antilinkytnokick": false, + "antilinktwit": false, + "antilinktwitnokick": false, + "antilinkfb": false, + "antilinkfbnokick": false, + "antilinkall": false, + "antilinkallnokick": false, + "antilinkwame": false, + "antilinkwamenokick": false, + "antilinktele": false, + "antilinktelenokick": false, + "antilinktt": false, + "antilinkttnokick": false, + "antibot": false, + "rpg": false, + "expired": 0, + "memgc": { + "6287821561429@s.whatsapp.net": { + "blacklist": false, + "banned": false, + "bannedTime": 0, + "chat": 0, + "chatTotal": 0, + "command": 0, + "commandTotal": 0, + "lastseen": 0 + } + } + } + }, + "stats": { + "menu.js": { + "total": 2, + "success": 2, + "last": 1732074269621, + "lastSuccess": 1732074269621 + }, + "downloader-pindl.js": { + "total": 2, + "success": 0, + "last": 1732074298135, + "lastSuccess": 0 + }, + "downloader-pinterest.js": { + "total": 2, + "success": 2, + "last": 1732074374075, + "lastSuccess": 1732074374075 + }, + "server.js": { + "total": 3, + "success": 3, + "last": 1733916896776, + "lastSuccess": 1733916896776 + } + }, + "msgs": {}, + "sticker": {} +} \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..a0bb202b0d6a99dfd5bb394c8ef7d8fb7fa0c001 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,15 @@ +version: "3.9" +services: + web: + build: . + ports: + - "8000:5000" + volumes: + - .:/code + - logvolume01:/var/log + links: + - redis + redis: + image: redis +volumes: + logvolume01: {} diff --git a/handler.js b/handler.js new file mode 100644 index 0000000000000000000000000000000000000000..5b70f1cc6eb2aa5b007cc3edc23fc0b91b58d3f2 --- /dev/null +++ b/handler.js @@ -0,0 +1,1261 @@ +const simple = require('./lib/simple') +const util = require('util') + +const isNumber = x => typeof x === 'number' && !isNaN(x) +const delay = ms => isNumber(ms) && new Promise(resolve => setTimeout(resolve, ms)) + +module.exports = { + async handler(chatUpdate) { + if (global.db.data == null) await loadDatabase() + this.msgqueque = this.msgqueque || [] + // console.log(chatUpdate) + if (!chatUpdate) return + // if (chatUpdate.messages.length > 2 || !chatUpdate.messages.length) return + if (chatUpdate.messages.length > 1) console.log(chatUpdate.messages) + let m = chatUpdate.messages[chatUpdate.messages.length - 1] + if (!m) return + //console.log(JSON.stringify(m, null, 4)) + try { + m = simple.smsg(this, m) || m + if (!m) return + // console.log(m) + m.exp = 0 + m.limit = false + try { + let user = global.db.data.users[m.sender] + if (typeof user !== 'object') global.db.data.users[m.sender] = {} + if (user) { + if (!isNumber(user.saldo)) user.saldo = 0 + if (!isNumber(user.pengeluaran)) user.pengeluaran = 0 + if (!isNumber(user.healt)) user.healt = 100 + if (!isNumber(user.health)) user.health = 100 + if (!isNumber(user.energi)) user.energi = 100 + if (!isNumber(user.power)) user.power = 100 + if (!isNumber(user.title)) user.title = 0 + if (!isNumber(user.stamina)) user.stamina = 100 + if (!isNumber(user.haus)) user.haus = 100 + if (!isNumber(user.laper)) user.laper = 100 + if (!isNumber(user.level)) user.level = 0 + if (!('titlein' in user)) user.titlein = 'Belum Ada' + if (!("ultah" in user)) user.ultah = '' + if (!('pasangan' in user)) user.pasangan = '' + if (!('sahabat' in user)) user.sahabat = '' + if (!('location' in user)) user.location = 'Gubuk' + if (!('husbu' in user)) user.husbu = 'Belum Di Set' + if (!('waifu' in user)) user.waifu = 'Belum Di Set' + if (!isNumber(user.follow)) user.follow = 0 + if (!isNumber(user.lastfollow)) user.lastfollow = 0 + if (!isNumber(user.followers)) user.followers = 0 + if (!isNumber(user.exp)) user.exp = 0 + if (!isNumber(user.pc)) user.pc = 0 + if (!isNumber(user.korbanngocok)) user.korbanngocok = 0 + if (!isNumber(user.ojekk)) user.ojekk = 0 + if (!isNumber(user.polisi)) user.polisi = 0 + if (!isNumber(user.ojek)) user.ojek = 0 + if (!isNumber(user.pedagang)) user.pedagang = 0 + if (!isNumber(user.dokter)) user.dokter = 0 + if (!isNumber(user.petani)) user.petani = 0 + if (!isNumber(user.montir)) user.montir = 0 + if (!isNumber(user.kuli)) user.kuli = 0 + if (!isNumber(user.trofi)) user.trofi= 0 + if (!user.rtrofi) user.rtrofi = 'Perunggu' + if (!isNumber(user.troopcamp)) user.troopcamp = 0 + if (!isNumber(user.coin)) user.coin = 0 + if (!isNumber(user.atm)) user.atm = 0 + if (!isNumber(user.limit)) user.limit = 100 + if (!isNumber(user.glimit)) user.glimit = 10 + if (!isNumber(user.tprem)) user.tprem = 0 + if (!isNumber(user.tigame)) user.tigame = 5 + if (!isNumber(user.lastclaim)) user.lastclaim = 0 + if (isNumber(user.lastmulung)) user.lastmulung = 0 + if (!isNumber(user.judilast)) user.judilast = 0 + if (!isNumber(user.lastnambang)) user.lastnambang = 0 + if (!isNumber(user.lastnebang)) user.lastnebang = 0 + if (!isNumber(user.lastkerja)) user.lastkerja = 0 + if (!isNumber(user.lastmaling)) user.lastmaling = 0 + if (!isNumber(user.lastbunuhi)) user.lastbunuhi = 0 + if (!isNumber(user.lastbisnis)) user.lastbisnis = 0 + if (!isNumber(user.lastberbisnis)) user.lastberbisnis = 0 + if (!isNumber(user.berbisnis)) user.berbisnis = 0 + if (!isNumber(user.bisnis)) user.bisnis = 0 + if (!isNumber(user.lastmancing)) user.lastmancing = 0 + if (!isNumber(user.money)) user.money = 0 + if (!isNumber(user.rumahsakit)) user.rumahsakit= 0 + if (!isNumber(user.fortress)) user.fortress = 0 + if (!isNumber(user.shield)) user.shield = false + if (!isNumber(user.pertanian)) user.pertanian = 0 + if (!isNumber(user.pertambangan)) user.pertambangan = 0 + if (!isNumber(user.camptroops)) user.camptroops = 0 + if (!isNumber(user.tambang)) user.tambang = 0 + + //Tambahan rpg + if (!isNumber(user.litecoin)) user.litecoin = 0 + if (!isNumber(user.chip)) user.chip = 0 + if (!isNumber(user.tiketcoin)) user.tiketcoin = 0 + if (!isNumber(user.poin)) user.poin = 0 + if (!isNumber (user.lastbossbattle)) user.lastbossbattle = 0 + if (!isNumber (user.bank)) user.bank = 0 + if (!isNumber (user.balance)) user.balance = 0 + + if (!isNumber(user.botol)) user.botol = 0 + if (!isNumber(user.kardus)) user.kardus = 0 + if (!isNumber(user.kaleng)) user.kaleng = 0 + if (!isNumber(user.aqua)) user.aqua = 0 + if (!isNumber(user.diamond)) user.diamond = 0 + if (!isNumber(user.emerald)) user.emerald = 0 + if (!isNumber(user.wood)) user.wood = 0 + if (!isNumber(user.rock)) user.rock = 0 + if (!isNumber(user.berlian)) user.berlian = 0 + if (!isNumber(user.iron)) user.iron = 0 + if (!isNumber(user.emas)) user.emas = 0 + if (!isNumber(user.arlok)) user.arlok = 0 + + if (!isNumber(user.common)) user.common = 0 + if (!isNumber(user.as)) user.as = 0 + if (!isNumber(user.uncommon)) user.uncommon = 0 + if (!isNumber(user.mythic)) user.mythic = 0 + if (!isNumber(user.legendary)) user.legendary = 0 + if (!isNumber(user.glory)) user.glory = 0 + if (!isNumber(user.enchant)) user.enchant = 0 + if (!isNumber(user.pet)) user.pet = 0 + if (!isNumber(user.psepick)) user.psepick = 0 + if (!isNumber(user.psenjata)) user.psenjata = 0 + //rpg meracik + if (!isNumber(user.lastramuanclaim)) user.lastramuanclaim = 0 + if (!isNumber(user.gems)) user.gems = 0 + if (!isNumber(user.cupon)) user.cupon = 0 + if (!isNumber(user.lastgemclaim)) user.lastgemclaim = 0 + if (!isNumber(user.eleksirb)) user.eleksirb = 0 + if (!isNumber(user.penduduk)) user.penduduk = 0 + if (!isNumber(user.archer)) user.archer = 0 + if (!isNumber(user.shadow)) user.shadow = 0 + if (!isNumber(user.lastpotionclaim)) user.lastpotionclaim = 0 + if (!isNumber(user.laststringclaim)) user.laststringclaim = 0 + if (!isNumber(user.lastswordclaim)) user.lastswordclaim = 0 + if (!isNumber(user.lastweaponclaim)) user.lastweaponclaim = 0 + if (!isNumber(user.lastironclaim)) user.lastironclaim = 0 + if (!isNumber(user.lastmancingclaim)) user.lastmancingclaim = 0 + if (!isNumber(user.anakpancingan)) user.anakpancingan = 0 + + if (!isNumber(user.potion)) user.potion = 0 + if (!isNumber(user.sampah)) user.sampah = 0 + if (!isNumber(user.pancing)) user.pancing = 0 + if (!isNumber(user.pancingan)) user.pancingan = 0 + if (!isNumber(user.totalPancingan)) user.totalPancingan = 0 + //penambah stamina + if (!isNumber(user.apel)) user.apel = 0 + if (!isNumber(user.ayamb)) user.ayamb = 0 + if (!isNumber(user.ayamg)) user.ayamg = 0 + if (!isNumber(user.sapir)) user.sapir = 0 + if (!isNumber(user.ssapi)) user.ssapi = 0 + if (!isNumber(user.esteh)) user.esteh = 0 + if (!isNumber(user.leleg)) user.leleg = 0 + if (!isNumber(user.leleb)) user.leleb = 0 + + if (!isNumber(user.ayambakar)) user.ayambakar = 0 + if (!isNumber(user.gulai)) user.gulai = 0 + if (!isNumber(user.rendang)) user.rendang = 0 + if (!isNumber(user.ayamgoreng)) user.ayamgoreng = 0 + if (!isNumber(user.oporayam)) user.oporayam = 0 + if (!isNumber(user.steak)) user.steak = 0 + if (!isNumber(user.babipanggang)) user.babipanggang = 0 + if (!isNumber(user.ikanbakar)) user.ikanbakar = 0 + if (!isNumber(user.nilabakar)) user.nilabakar = 0 + if (!isNumber(user.lelebakar)) user.lelebakar = 0 + if (!isNumber(user.bawalbakar)) user.bawalbakar = 0 + if (!isNumber(user.udangbakar)) user.udangbakar = 0 + if (!isNumber(user.pausbakar)) user.pausbakar = 0 + if (!isNumber(user.kepitingbakar)) user.kepitingbakar = 0 + if (!isNumber(user.soda)) user.soda = 0 + if (!isNumber(user.vodka)) user.vodka = 0 + if (!isNumber(user.ganja)) user.ganja = 0 + if (!isNumber(user.bandage)) user.bandage = 0 + if (!isNumber(user.sushi)) user.sushi = 0 + if (!isNumber(user.roti)) user.roti = 0 + //untuk masak + if (!isNumber(user.coal)) user.coal = 0 + if (!isNumber(user.korekapi)) user.korekapi = 0 + //tools + if (!isNumber(user.umpan)) user.umpan = 0 + + if (!isNumber(user.armor)) user.armor = 0 + if (!isNumber(user.armordurability)) user.armordurability = 0 + if (!isNumber(user.weapon)) user.weapon = 0 + if (!isNumber(user.weapondurability)) user.weapondurability = 0 + if (!isNumber(user.sword)) user.sword = 0 + if (!isNumber(user.sworddurability)) user.sworddurability = 0 + if (!isNumber(user.pickaxe)) user.pickaxe = 0 + if (!isNumber(user.pickaxedurability)) user.pickaxedurability = 0 + if (!isNumber(user.fishingrod)) user.fishingrod = 0 + if (!isNumber(user.fishingroddurability)) user.fishingroddurability = 0 + if (!isNumber(user.katana)) user.katana = 0 + if (!isNumber(user.katanadurability)) user.katanadurability = 0 + if (!isNumber(user.bow)) user.bow = 0 + if (!isNumber(user.bowdurability)) user.bowdurability = 0 + if (!isNumber(user.kapak)) user.kapak = 0 + if (!isNumber(user.kapakdurability)) user.kapakdurability = 0 + if (!isNumber(user.axe)) user.axe = 0 + if (!isNumber(user.axedurability)) user.axedurability = 0 + if (!isNumber(user.pisau)) user.pisau = 0 + if (!isNumber(user.pisaudurability)) user.pisaudurability = 0 + + if (!isNumber(user.kerjasatu)) user.kerjasatu = 0 + if (!isNumber(user.kerjadua)) user.kerjadua = 0 + if (!isNumber(user.kerjatiga)) user.kerjatiga = 0 + if (!isNumber(user.kerjaempat)) user.kerjaempat = 0 + if (!isNumber(user.kerjalima)) user.kerjalima = 0 + if (!isNumber(user.kerjaenam)) user.kerjaenam = 0 + if (!isNumber(user.kerjatujuh)) user.kerjatujuh = 0 + if (!isNumber(user.kerjadelapan)) user.kerjadelapan = 0 + if (!isNumber(user.kerjasembilan)) user.kerjasembilan = 0 + if (!isNumber(user.kerjasepuluh)) user.kerjasepuluh = 0 + if (!isNumber(user.kerjasebelas)) user.kerjasebelas = 0 + if (!isNumber(user.kerjaduabelas)) user.kerjaduabelas = 0 + if (!isNumber(user.kerjatigabelas)) user.kerjatigabelas = 0 + if (!isNumber(user.kerjaempatbelas)) user.kerjaempatbelas = 0 + if (!isNumber(user.kerjalimabelas)) user.kerjalimabelas = 0 + + if (!isNumber(user.pekerjaansatu)) user.pekerjaansatu = 0 + if (!isNumber(user.pekerjaandua)) user.pekerjaandua = 0 + if (!isNumber(user.pekerjaantiga)) user.pekerjaantiga = 0 + if (!isNumber(user.pekerjaanempat)) user.pekerjaanempat = 0 + if (!isNumber(user.pekerjaanlima)) user.pekerjaanlima = 0 + if (!isNumber(user.pekerjaanenam)) user.pekerjaanenam = 0 + if (!isNumber(user.pekerjaantujuh)) user.pekerjaantujuh = 0 + if (!isNumber(user.pekerjaandelapan)) user.pekerjaandelapan = 0 + if (!isNumber(user.pekerjaansembilan)) user.pekerjaansembilan = 0 + if (!isNumber(user.pekerjaansepuluh)) user.pekerjaansepuluh = 0 + if (!isNumber(user.pekerjaansebelas)) user.pekerjaansebelas = 0 + if (!isNumber(user.pekerjaanduabelas)) user.pekerjaanduabelas = 0 + if (!isNumber(user.pekerjaantigabelas)) user.pekerjaantigabelas = 0 + if (!isNumber(user.pekerjaanempatbelas)) user.pekerjaanempatbelas = 0 + if (!isNumber(user.pekerjaanlimabelas)) user.pekerjaanlimabelas = 0 + + if (!isNumber(user.kucing)) user.kucing = 0 + if (!isNumber(user.kucinglastclaim)) user.kucinglastclaim = 0 + if (!isNumber(user.kucingexp)) user.kucingexp = 0 + if (!isNumber(user.kuda)) user.kuda = 0 + if (!isNumber(user.kudalastclaim)) user.kudalastclaim = 0 + if (!isNumber(user.rubah)) user.rubah = 0 + if (!isNumber(user.rubahlastclaim)) user.rubahlastclaim = 0 + if (!isNumber(user.rubahexp)) user.rubahexp = 0 + if (!isNumber(user.anjing)) user.anjing = 0 + if (!isNumber(user.anjinglastclaim)) user.anjinglastclaim = 0 + if (!isNumber(user.anjingexp)) user.anjingexp = 0 + if (!isNumber(user.serigalalastclaim)) user.serigalalastclaim = 0 + if (!isNumber(user.nagalastclaim)) user.nagalastclaim = 0 + if (!isNumber(user.phonixlastclaim)) user.phonixlastclaim = 0 + if (!isNumber(user.phonixexp)) user.phonixexp = 0 + if (!isNumber(user.griffinlastclaim)) user.griffinlastclaim = 0 + if (!isNumber(user.centaurlastclaim)) user.centaurlastclaim = 0 + + if (!isNumber(user.makananpet)) user.makananpet = 0 + if (!isNumber(user.makanannaga)) user.makanannaga = 0 + if (!isNumber(user.makananphonix)) user.makananphonix = 0 + if (!isNumber(user.makanangriffin)) user.makanangriffin = 0 + if (!isNumber(user.makananserigala)) user.makananserigala = 0 + if (!isNumber(user.makanancentaur)) user.makanancentaur = 0 + + if (!'Banneduser' in user) user.Banneduser = false + if (!'BannedReason' in user) user.BannedReason = '' + if (!isNumber(user.warn)) user.warn = 0 + if (!('banned' in user)) user.banned = false + if (!isNumber(user.bannedTime)) user.bannedTime = 0 + + if (!isNumber(user.afk)) user.afk = -1 + if (!'afkReason' in user) user.afkReason = '' + + //PET + if (!isNumber(user.healthmonster)) user.healthmonster = 0 + if (!isNumber(user.anakkucing)) user.anakkucing = 0 + if (!isNumber(user.anakkuda)) user.anakkuda = 0 + if (!isNumber(user.anakrubah)) user.anakrubah = 0 + if (!isNumber(user.anakanjing)) user.anakanjing = 0 + if (!isNumber(user.serigala)) user.serigala = 0 + if (!isNumber(user.serigalaexp)) user.serigalaexp = 0 + if (!isNumber(user.anakserigala)) user.anakserigala = 0 + if (!isNumber(user.naga)) user.naga = 0 + if (!isNumber(user.anaknaga)) user.anaknaga = 0 + if (!isNumber(user.phonix)) user.phonix = 0 + if (!isNumber(user.anakphonix)) user.anakphonix = 0 + if (!isNumber(user.griffin)) user.griffin = 0 + if (!isNumber(user.anakgriffin)) user.anakgriffin = 0 + if (!isNumber(user.kyubi)) user.kyubi = 0 + if (!isNumber(user.anakkyubi)) user.anakkyubi = 0 + if (!isNumber(user.centaur)) user.centaur = 0 + if (!isNumber(user.fightnaga)) user.fightnaga = 0 + if (!isNumber(user.anakcentaur)) user.anakcentaur = 0 + if (!isNumber(user.makananPet)) user.makananPet = 0 + + if (!isNumber(user.antispam)) user.antispam = 0 + if (!isNumber(user.antispamlastclaim)) user.antispamlastclaim = 0 + + if (!isNumber(user.kayu)) user.kayu = 0 + if (!('kingdom' in user)) user.kingdom = false + if (!isNumber(user.batu)) user.batu = 0 + if (!isNumber(user.ramuan)) user.ramuan = 0 + if (!isNumber(user.string)) user.string = 0 + + //mancing + if (!isNumber(user.paus)) user.paus = 0 + if (!isNumber(user.kepiting)) user.kepiting = 0 + if (!isNumber(user.gurita)) user.gurita = 0 + if (!isNumber(user.cumi)) user.cumi= 0 + if (!isNumber(user.buntal)) user.buntal = 0 + if (!isNumber(user.dory)) user.dory = 0 + if (!isNumber(user.lumba)) user.lumba = 0 + if (!isNumber(user.lobster)) user.lobster = 0 + if (!isNumber(user.hiu)) user.hiu = 0 + if (!isNumber(user.udang)) user.udang = 0 + if (!isNumber(user.ikan)) user.ikan = 0 + if (!isNumber(user.nila)) user.nila = 0 + if (!isNumber(user.bawal)) user.bawal = 0 + if (!isNumber(user.lele)) user.lele = 0 + if (!isNumber(user.orca)) user.orca = 0 + + if (!isNumber(user.banteng)) user.banteng = 0 + if (!isNumber(user.harimau)) user.harimau = 0 + if (!isNumber(user.gajah)) user.gajah = 0 + if (!isNumber(user.kambing)) user.kambing = 0 + if (!isNumber(user.panda)) user.panda = 0 + if (!isNumber(user.buaya)) user.buaya = 0 + if (!isNumber(user.kerbau)) user.kerbau = 0 + if (!isNumber(user.sapi)) user.sapi = 0 + if (!isNumber(user.monyet)) user.monyet = 0 + if (!isNumber(user.babihutan)) user.babihutan = 0 + if (!isNumber(user.babi)) user.babi = 0 + if (!isNumber(user.ayam)) user.ayam = 0 + + if (!isNumber(user.lastadventure)) user.lastadventure = 0 + if (!isNumber(user.lastberburu)) user.lastberburu = 0 + if (!isNumber(user.lastkill)) user.lastkill = 0 + if (!isNumber(user.lastfishing)) user.lastfishing = 0 + if (!isNumber(user.lastdungeon)) user.lastdungeon = 0 + if (!isNumber(user.lastwar)) user.lastwar = 0 + if (!isNumber(user.lastsda)) user.lastsda = 0 + if (!isNumber(user.lastberbru)) user.lastberbru = 0 + if (!isNumber(user.lastduel)) user.lastduel = 0 + if (!isNumber(user.lastjb)) user.lastjb = 0 + if (!isNumber(user.lastSetStatus)) user.lastSetStatus = 0 + if (!isNumber(user.lastmining)) user.lastmining = 0 + if (!isNumber(user.lasthunt)) user.lasthunt = 0 + if (!isNumber(user.lasthun)) user.lasthun = 0 + if (!isNumber(user.lastngocok)) user.lastngocok = 0 + if (!isNumber(user.lastgift)) user.lastgift = 0 + if (!isNumber(user.lastrob)) user.lastrob = 0 + if (!isNumber(user.lastngojek)) user.lastngojek = 0 + if (!isNumber(user.lastngewe)) user.lastngewe = 0 + if (!isNumber(user.ngewe)) user.ngewe = 0 + if (!isNumber(user.jualan)) user.jualan = 0 + if (!isNumber(user.lastjualan)) user.lastjualan = 0 + if (!isNumber(user.ngocokk)) user.ngocokk = 0 + if (!isNumber(user.lastngocokk)) user.lastngocokk = 0 + if (!isNumber(user.lastgrab)) user.lastgrab = 0 + if (!isNumber(user.lastberkebon)) user.lastberkebon = 0 + if (!isNumber(user.lastcodereg)) user.lastcodereg = 0 + if (!isNumber(user.lastdagang)) user.lastdagang = 0 + if (!isNumber(user.lasthourly)) user.lasthourly = 0 + if (!isNumber(user.lastweekly)) user.lastweekly = 0 + if (!isNumber(user.lastyearly)) user.lastyearly = 0 + if (!isNumber(user.lastmonthly)) user.lastmonthly = 0 + if (!isNumber(user.lastIstigfar)) user.lastIstigfar = 0 + if (!isNumber(user.lastturu)) user.lastturu = 0 + if (!isNumber(user.lastseen)) user.lastseen = 0 + if (!isNumber(user.lastbansos)) user.lastbansos = 0 + if (!isNumber(user.lastrampok)) user.lastrampok = 0 + if (!('registered' in user)) user.registered = false + if (!user.registered) { + if (!('name' in user)) user.name = this.getName(m.sender) + + if (!isNumber(user.apel)) user.apel = 0 + if (!isNumber(user.anggur)) user.anggur = 0 + if (!isNumber(user.jeruk)) user.jeruk = 0 + if (!isNumber(user.semangka)) user.semangka = 0 + if (!isNumber(user.mangga)) user.mangga = 0 + if (!isNumber(user.stroberi)) user.stroberi = 0 + if (!isNumber(user.pisang)) user.pisang = 0 + if (!isNumber(user.kayu)) user.kayu = 0 + if (!isNumber(user.makanan)) user.makanan = 0 + if (!isNumber(user.bibitanggur)) user.bibitanggur = 0 + if (!isNumber(user.bibitpisang)) user.bibitpisang = 0 + if (!isNumber(user.bibitapel)) user.bibitapel = 0 + if (!isNumber(user.bibitmangga)) user.bibitmangga = 0 + if (!isNumber(user.bibitjeruk)) user.bibitjeruk = 0 + + //sambung kata + if (!isNumber(user.skata)) user.skata = 0 + + + if (!isNumber(user.age)) user.age = -1 + if (!isNumber(user.premiumDate)) user.premiumDate = -1 + if (!isNumber(user.regTime)) user.regTime = -1 + + } + if (!isNumber(user.level)) user.level = 0 + if (!user.job) user.job = 'Pengangguran' + if (!isNumber(user.jobexp)) user.jobexp = 0 + if (!('jail' in user)) user.jail = false + if (!('penjara' in user)) user.penjara = false + if (!('dirawat' in user)) user.dirawat = false + if (!isNumber(user.antarpaket)) user.antarpaket = 0 + if (!user.lbars) user.lbars = '[โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’]' + if (!user.premium) user.premium = false + if (!user.premiumTime) user.premiumTime= 0 + if (!user.vip) user.vip = 'tidak' + if (!isNumber(user.vipPoin)) user.vipPoin = 0 + if (!user.role) user.role = 'Newbie ใ‹ก' + if (!('autolevelup' in user)) user.autolevelup = true + if (!('lastIstigfar' in user)) user.lastIstigfar = true + + //demon slayer dan rpg baru + if (!("skill" in user)) user.skill = "" + if (!("korps" in user)) user.korps = "" + if (!("korpsgrade" in user)) user.korpsgrade = "" + if (!("breaths" in user)) user.breaths = "" + if (!("magic" in user)) user.magic = "" + if (!("demon" in user)) user.demon = "" + if (!isNumber(user.darahiblis)) user.darahiblis = 0 + if (!isNumber(user.demonblood)) user.demonblood = 0 + if (!isNumber(user.demonkill)) user.demonkill = 0 + if (!isNumber(user.hashirakill)) user.hashirakill = 0 + if (!isNumber(user.alldemonkill)) user.alldemonkill = 0 + if (!isNumber(user.allhashirakill)) user.allhashirakill = 0 + if (!isNumber(user.attack)) user.attack = 0 + if (!isNumber(user.strenght)) user.strenght = 0 + if (!isNumber(user.speed)) user.speed = 0 + if (!isNumber(user.defense)) user.defense = 0 + if (!isNumber(user.regeneration)) user.regeneration = 0 + if (!isNumber(user.dana)) user.dana = 0 + if (!isNumber(user.gopay)) user.gopay = 0 + if (!isNumber(user.ovo)) user.ovo = 0 + if (!isNumber(user.lastngaji)) user.lastngaji = 0 + if (!isNumber(user.lastlonte)) user.lastlonte = 0 + if (!isNumber(user.lastkoboy)) user.lastkoboy = 0 + if (!isNumber(user.lastdate)) user.lastdate = 0 + if (!isNumber(user.lasttambang)) user.lasttambang = 0 + if (!isNumber(user.lastngepet)) user.lastngepet = 0 + if (!isNumber(user.lasttaxi)) user.lasttaxi = 0 + if (!isNumber(user.taxi)) user.taxi = 0 + if (!isNumber(user.lastyoutuber)) user.lastyoutuber = 0 + if (!isNumber(user.subscribers)) user.subscribers = 0 + if (!isNumber(user.viewers)) user.viewers = 0 + if (!isNumber(user.like)) user.like = 0 + if (!isNumber(user.playButton)) user.playButton = 0 + + } else global.db.data.users[m.sender] = { + taxi: 0, + lasttaxi: 0, + lastyoutuber: 0, + subscribers: 0, + viewers: 0, + like: 0, + playButton: 0, + saldo: 0, + pengeluaran: 0, + healt: 100, + health: 100, + energi: 100, + power: 100, + title: '', + haus: 100, + laper: 100, + tprem: 0, + stamina : 100, + level: 0, + follow: 0, + lastfollow: 0, + followers: 0, + pasangan: '', + sahabat: '', + location: 'Gubuk', + titlein: 'Belum Ada', + ultah: '', + waifu: 'Belum Di Set', + husbu: 'Belum Di Set', + pc : 0, + exp: 0, + coin: 0, + atm: 0, + limit: 100, + skata: 0, + tigame: 999, + lastclaim: 0, + judilast: 0, + lastnambang: 0, + lastnebang: 0, + lastmulung: 0, + lastkerja: 0, + lastmaling: 0, + lastbunuhi: 0, + lastbisnis: 0, + lastberbisnis: 0, + bisnis: 0, + berbisnis: 0, + lastmancing: 0, + pancing: 0, + pancingan: 0, + totalPancingan: 0, + kardus: 0, + botol: 0, + kaleng: 0, + money: 0, + litecoin: 0, + chip: 0, + tiketcoin: 0, + poin: 0, + bank: 0, + balance: 0, + diamond: 0, + emerald: 0, + rock: 0, + wood: 0, + berlian: 0, + iron: 0, + emas: 0, + common: 0, + uncommon: 0, + mythic: 0, + legendary: 0, + rumahsakit: 0, + tambang: 0, + camptroops: 0, + pertanian: 0, + fortress: 0, + trofi: 0, + rtrofi: 'perunggu', + makanan: 0, + troopcamp: 0, + shield: 0, + arlok: 0, + ojekk: 0, + ojek: 0, + lastngewe: 0, + ngewe: 0, + polisi: 0, + pedagang: 0, + dokter: 0, + petani: 0, + montir: 0, + kuli: 0, + korbanngocok: 0, + //+ stamina + coal: 0, + korekapi: 0, + ayambakar: 0, + gulai: 0, + rendang: 0, + ayamgoreng: 0, + oporayam: 0, + steak: 0, + babipanggang: 0, + ikanbakar: 0, + lelebakar: 0, + nilabakar: 0, + bawalbakar: 0, + udangbakar: 0, + pausbakar: 0, + kepitingbakar: 0, + soda: 0, + vodka: 0, + ganja: 0, + bandage: 0, + sushi: 0, + roti: 0, + //meracik + ramuan: 0, + lastramuanclaim: 0, + gems: 0, + cupon: 0, + lastgemsclaim: 0, + eleksirb: 0, + penduduk: 0, + archer: 0, + shadow: 0, + laststringclaim: 0, + lastpotionclaim: 0, + lastswordclaim: 0, + lastweaponclaim: 0, + lastironclaim: 0, + lastmancingclaim: 0, + anakpancingan: 0, + //mancing + as: 0, + paus: 0, + kepiting: 0, + gurita: 0, + cumi: 0, + buntal: 0, + dory: 0, + lumba: 0, + lobster: 0, + hiu: 0, + lele: 0, + nila: 0, + bawal: 0, + udang: 0, + ikan: 0, + orca: 0, + banteng: 0, + harimau: 0, + gajah: 0, + kambing: 0, + panda: 0, + buaya: 0, + kerbau : 0, + sapi: 0, + monyet : 0, + babihutan: 0, + babi: 0, + ayam: 0, + apel: 20, + ayamb: 0, + ayamg: 0, + ssapi: 0, + sapir: 0, + leleb: 0, + leleg: 0, + esteh: 0, + pet: 0, + potion: 0, + sampah: 0, + kucing: 0, + kucinglastclaim: 0, + kucingexp: 0, + kuda: 0, + kudalastclaim: 0, + rubah: 0, + rubahlastclaim: 0, + rubahexp: 0, + anjing: 0, + anjinglastclaim: 0, + anjingexp: 0, + naga: 0, + nagalastclaim: 0, + griffin: 0, + griffinlastclaim: 0, + centaur: 0, + fightnaga: 0, + centaurlastclaim: 0, + serigala: 0, + serigalalastclaim: 0, + serigalaexp: 0, + phonix: 0, + phonixlastclaim: 0, + phonixexp : 0, + makanannaga: 0, + makananphonix: 0, + makanancentaur: 0, + makananserigala: 0, + + Banneduser: false, + BannedReason: '', + banned: false, + bannedTime: 0, + warn: 0, + afk: -1, + afkReason: '', + anakkucing: 0, + anakkuda: 0, + anakrubah: 0, + anakanjing: 0, + makananpet: 0, + makananPet: 0, + antispam: 0, + antispamlastclaim: 0, + kayu: 0, + batu: 0, + string: 0, + umpan: 0, + armor: 0, + armordurability: 0, + weapon: 0, + weapondurability: 0, + sword: 0, + sworddurability: 0, + pickaxe: 0, + pickaxedurability: 0, + fishingrod: 0, + fishingroddurability: 0, + katana: 0, + katanadurability: 0, + bow: 0, + bowdurability: 0, + kapak: 0, + kapakdurability: 0, + axe: 0, + axedurability: 0, + pisau: 0, + pisaudurability: 0, + kerjasatu: 0, + kerjadua: 0, + kerjatiga: 0, + kerjaempat: 0, + kerjalima: 0, + kerjaenam: 0, + kerjatujuh: 0, + kerjadelapan: 0, + kerjasembilan: 0, + kerjasepuluh: 0, + kerjasebelas: 0, + kerjaduabelas: 0, + kerjatigabelas: 0, + kerjaempatbelas: 0, + kerjalimabelas: 0, + pekerjaansatu: 0, + pekerjaandua: 0, + pekerjaantiga: 0, + pekerjaanempat: 0, + pekerjaanlima: 0, + pekerjaanenam: 0, + pekerjaantujuh: 0, + pekerjaandelapan: 0, + pekerjaansembilan: 0, + pekerjaansepuluh: 0, + pekerjaansebelas: 0, + pekerjaanduabelas: 0, + pekerjaantigabelas: 0, + pekerjaanempatbelas: 0, + pekerjaanlimabelas: 0, + lastadventure: 0, + lastwar: 0, + lastberkebon: 0, + lastberburu: 0, + lastbansos: 0, + lastrampok: 0, + lastkill: 0, + lastfishing: 0, + lastdungeon: 0, + lastduel: 0, + lastmining: 0, + lasthourly: 0, + lastdagang: 0, + lasthunt: 0, + lasthun : 0, + lastweekly: 0, + lastmonthly: 0, + lastyearly: 0, + lastjb: 0, + lastrob: 0, + lastdaang: 0, + lastngojek: 0, + lastgrab: 0, + lastngocok: 0, + lastturu: 0, + lastseen: 0, + lastSetStatus: 0, + registered: false, + apel: 20, + mangga: 0, + stroberi: 0, + semangka: 0, + jeruk: 0, + semangka: 0, + name: this.getName(m.sender), + age: -1, + regTime: -1, + premiumDate: -1, + premium: false, + premiumTime: 0, + vip: 'tidak', + vipPoin: 0, + job: 'Pengangguran', + jobexp: 0, + jail: false, + penjara: false, + antarpaket: 0, + dirawat: false, + lbars: '[โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’]', + role: 'Newbie ใ‹ก', + registered: false, + name: this.getName(m.sender), + age: -1, + regTime: -1, + autolevelup: true, + lastIstigfar: 0, + + skill: "", + korps: "", + korpsgrade: "", + demon: "", + breaths: "", + magic: "", + darahiblis: 0, + demonblood: 0, + demonkill: 0, + hashirakill: 0, + alldemonkill: 0, + allhashirakill: 0, + attack: 0, + speed: 0, + strenght: 0, + defense: 0, + regeneration: 0, + ovo: 0, + dana: 0, + gopay: 0, + lastngaji: 0, + lastlonte: 0, + lastkoboy: 0, + lastdate: 0, + lasttambang: 0, + lastngepet: 0, + } + let chat = global.db.data.chats[m.chat] + if (typeof chat !== 'object') global.db.data.chats[m.chat] = {} + if (chat) { + if (!('isBanned' in chat)) chat.isBanned = false + if (!('welcome' in chat)) chat.welcome = true + if (!isNumber(chat.welcometype)) chat.welcometype = 1 + if (!('detect' in chat)) chat.detect = false + if (!('isBannedTime' in chat)) chat.isBannedTime = false + if (!('mute' in chat)) chat.mute = false + if (!('listStr' in chat)) chat.listStr = {} + if (!('sWelcome' in chat)) chat.sWelcome = 'Hai, @user!\nSelamat datang di grup @subject\n\n@desc' + if (!('sBye' in chat)) chat.sBye = 'Selamat tinggal @user!' + if (!('sPromote' in chat)) chat.sPromote = '' + if (!('sDemote' in chat)) chat.sDemote = '' + if (!('delete' in chat)) chat.delete = true + if (!('antiLink' in chat)) chat.antiLink = true + if (!('antiLinknokick' in chat)) chat.antiLinknokick = false + if (!('antiSticker' in chat)) chat.antiSticker = false + if (!('antiStickernokick' in chat)) chat.antiStickernokick = false + if (!('viewonce' in chat)) chat.viewonce = false + if (!('antiToxic' in chat)) chat.antiToxic = false + if (!isNumber(chat.expired)) chat.expired = 0 + if (!("memgc" in chat)) chat.memgc = {} + if (!('antilinkig' in chat)) chat.antilinkig = false + if (!('antilinkignokick' in chat)) chat.antilinkignokick = false + if (!('antilinkfb' in chat)) chat.antilinkfb = false + if (!('antilinkfbnokick' in chat)) chat.antilinkfbnokick = false + if (!('antilinktwit' in chat)) chat.antilinktwit = false + if (!('antilinktwitnokick' in chat)) chat.antilinktwitnokick = false + if (!('antilinkyt' in chat)) chat.antilinkyt = false + if (!('antilinkytnokick' in chat)) chat.antilinkytnokick = false + if (!('antilinktele' in chat)) chat.antilinktele = false + if (!('antilinktelenokick' in chat)) chat.antilinktelenokick = false + if (!('antilinkwame' in chat)) chat.antilinkwame = false + if (!('antilinkwamenokick' in chat)) chat.antilinkwamenokick = false + if (!('antilinkall' in chat)) chat.antilinkall = false + if (!('antilinkallnokick' in chat)) chat.antilinkallnokick = false + if (!('antilinktt' in chat)) chat.antilinktt = false + if (!('antilinkttnokick' in chat)) chat.antilinkttnokick = false + if (!('antibot' in chat)) chat.antibot = false + } else global.db.data.chats[m.chat] = { + isBanned: false, + welcome: true, + welcometype: 1, + detect: false, + isBannedTime: false, + mute: false, + listStr: {}, + sWelcome: 'Hai, @user!\nSelamat datang di grup @subject\n\n@desc', + sBye: 'Selamat tinggal @user!', + sPromote: '', + sDemote: '', + delete: false, + antiLink: false, + antiLinknokick: false, + antiSticker: false, + antiStickernokick: false, + viewonce: false, + antiToxic: true, + antilinkig: false, + antilinkignokick: false, + antilinkyt: false, + antilinkytnokick: false, + antilinktwit: false, + antilinktwitnokick: false, + antilinkfb: false, + antilinkfbnokick: false, + antilinkall: false, + antilinkallnokick: false, + antilinkwame: false, + antilinkwamenokick: false, + antilinktele: false, + antilinktelenokick: false, + antilinktt: false, + antilinkttnokick: false, + antibot: false, + rpg: false, + } + let memgc = global.db.data.chats[m.chat].memgc[m.sender] + if (typeof memgc !== 'object') global.db.data.chats[m.chat].memgc[m.sender] = {} + if (memgc) { + if (!('blacklist' in memgc)) memgc.blacklist = false + if (!('banned' in memgc)) memgc.banned = false + if (!isNumber(memgc.bannedTime)) memgc.bannedTime = 0 + if (!isNumber(memgc.chat)) memgc.chat = 0 + if (!isNumber(memgc.chatTotal)) memgc.chatTotal = 0 + if (!isNumber(memgc.command)) memgc.command = 0 + if (!isNumber(memgc.commandTotal)) memgc.commandTotal = 0 + if (!isNumber(memgc.lastseen)) memgc.lastseen = 0 + } else global.db.data.chats[m.chat].memgc[m.sender] = { + blacklist: false, + banned: false, + bannedTime: 0, + chat: 0, + chatTotal: 0, + command: 0, + commandTotal: 0, + lastseen: 0 + } + } catch (e) { + console.error(e) + } + if (opts['nyimak']) return + if (!m.fromMe && opts['self']) return + if (opts['pconly'] && m.chat.endsWith('g.us')) return + if (opts['gconly'] && !m.chat.endsWith('g.us')) return + if (opts['swonly'] && m.chat !== 'status@broadcast') return + if (typeof m.text !== 'string') m.text = '' + if (opts['queque'] && m.text) { + this.msgqueque.push(m.id || m.key.id) + await delay(this.msgqueque.length * 1000) + } + for (let name in global.plugins) { + let plugin = global.plugins[name] + if (!plugin) continue + if (plugin.disabled) continue + if (!plugin.all) continue + if (typeof plugin.all !== 'function') continue + try { + await plugin.all.call(this, m, chatUpdate) + } catch (e) { + if (typeof e === 'string') continue + console.error(e) + } + } + if (m.id.startsWith('BAE5') && m.id.length === 16 || m.isBaileys && m.fromMe) return + m.exp += Math.ceil(Math.random() * 10) + + let usedPrefix + let _user = global.db.data && global.db.data.users && global.db.data.users[m.sender] + + let isROwner = [global.conn.user.jid, ...global.owner].map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').includes(m.sender) + let isOwner = isROwner || m.fromMe + let isMods = isOwner || global.mods.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').includes(m.sender) + let isPrems = isROwner || (db.data.users[m.sender].premiumTime > 0 || db.data.users[m.sender].premium) + let groupMetadata = (m.isGroup ? (conn.chats[m.chat] || {}).metadata : {}) || {} + let participants = (m.isGroup ? groupMetadata.participants : []) || [] + let user = (m.isGroup ? participants.find(u => conn.decodeJid(u.id) === m.sender) : {}) || {} // User Data + let bot = (m.isGroup ? participants.find(u => conn.decodeJid(u.id) == this.user.jid) : {}) || {} // Your Data + let isAdmin = user && user.admin || false // Is User Admin? + let isBotAdmin = bot && bot.admin || false // Are you Admin? + for (let name in global.plugins) { + let plugin = global.plugins[name] + if (!plugin) continue + if (plugin.disabled) continue + if (!opts['restrict']) if (plugin.tags && plugin.tags.includes('admin')) { + // global.dfail('restrict', m, this) + continue + } + const str2Regex = str => str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&') + let _prefix = plugin.customPrefix ? plugin.customPrefix : conn.prefix ? conn.prefix : global.prefix + let match = (_prefix instanceof RegExp ? // RegExp Mode? + [[_prefix.exec(m.text), _prefix]] : + Array.isArray(_prefix) ? // Array? + _prefix.map(p => { + let re = p instanceof RegExp ? // RegExp in Array? + p : + new RegExp(str2Regex(p)) + return [re.exec(m.text), re] + }) : + typeof _prefix === 'string' ? // String? + [[new RegExp(str2Regex(_prefix)).exec(m.text), new RegExp(str2Regex(_prefix))]] : + [[[], new RegExp]] + ).find(p => p[1]) + if (typeof plugin.before === 'function') if (await plugin.before.call(this, m, { + match, + conn: this, + participants, + groupMetadata, + user, + bot, + isROwner, + isOwner, + isAdmin, + isBotAdmin, + isPrems, + chatUpdate, + })) continue + if (typeof plugin !== 'function') continue + if ((usedPrefix = (match[0] || '')[0])) { + let noPrefix = m.text.replace(usedPrefix, '') + let [command, ...args] = noPrefix.trim().split` `.filter(v => v) + args = args || [] + let _args = noPrefix.trim().split` `.slice(1) + let text = _args.join` ` + command = (command || '').toLowerCase() + let fail = plugin.fail || global.dfail // When failed + let isAccept = plugin.command instanceof RegExp ? // RegExp Mode? + plugin.command.test(command) : + Array.isArray(plugin.command) ? // Array? + plugin.command.some(cmd => cmd instanceof RegExp ? // RegExp in Array? + cmd.test(command) : + cmd === command + ) : + typeof plugin.command === 'string' ? // String? + plugin.command === command : + false + + if (!isAccept) continue + m.plugin = name + if (m.chat in global.db.data.chats || m.sender in global.db.data.users) { + let chat = global.db.data.chats[m.chat] + let user = global.db.data.users[m.sender] + if (name != 'group-modebot.js' && name != 'owner-unbanchat.js' && name != 'owner-exec.js' && name != 'owner-exec2.js' && name != 'tool-delete.js' && (chat?.isBanned || chat?.mute)) + return + if (name != 'unbanchat.js' && chat && chat.isBanned) return // Except this + if (name != 'unbanuser.js' && user && user.banned) return + if (m.isGroup) { + chat.memgc[m.sender].command++ + chat.memgc[m.sender].commandTotal++ + chat.memgc[m.sender].lastCmd = Date.now() + } + user.command++ + user.commandTotal++ + user.lastCmd = Date.now() + } + + if (plugin.rowner && plugin.owner && !(isROwner || isOwner)) { // Both Owner + fail('owner', m, this) + continue + } + if (plugin.rowner && !isROwner) { // Real Owner + fail('rowner', m, this) + continue + } + if (plugin.owner && !isOwner) { // Number Owner + fail('owner', m, this) + continue + } + if (plugin.mods && !isMods) { // Moderator + fail('mods', m, this) + continue + } + if (plugin.premium && !isPrems) { // Premium + fail('premium', m, this) + continue + } + if (plugin.group && !m.isGroup) { // Group Only + fail('group', m, this) + continue + } else if (plugin.botAdmin && !isBotAdmin) { // You Admin + fail('botAdmin', m, this) + continue + } else if (plugin.admin && !isAdmin) { // User Admin + fail('admin', m, this) + continue + } + if (plugin.private && m.isGroup) { // Private Chat Only + fail('private', m, this) + continue + } + if (plugin.register == true && _user.registered == false) { // Butuh daftar? + fail('unreg', m, this) + continue + } + m.isCommand = true + let xp = 'exp' in plugin ? parseInt(plugin.exp) : 17 // XP Earning per command + if (xp > 200) m.reply('Ngecit -_-') // Hehehe + else m.exp += xp + if (!isPrems && plugin.limit && global.db.data.users[m.sender].limit < plugin.limit * 1) { + this.reply(m.chat, `Limit anda habis, silahkan beli melalui *${usedPrefix}buy* atau beli di *${usedPrefix}shop*`, m) + continue // Limit habis + } + if (plugin.level > _user.level) { + this.reply(m.chat, `diperlukan level ${plugin.level} untuk menggunakan perintah ini. Level kamu ${_user.level}\m gunakan .levelup untuk menaikan level!`, m) + continue // If the level has not been reached + } + let extra = { + match, + usedPrefix, + noPrefix, + _args, + args, + command, + text, + conn: this, + participants, + groupMetadata, + user, + bot, + isROwner, + isOwner, + isAdmin, + isBotAdmin, + isPrems, + chatUpdate, + } + try { + await plugin.call(this, m, extra) + if (!isPrems) m.limit = m.limit || plugin.limit || false + } catch (e) { + // Error occured + m.error = e + console.error(e) + if (e) { + let text = util.format(e) + for (let key of Object.values(APIKeys)) + text = text.replace(new RegExp(key, 'g'), '#HIDDEN#') + if (e.name) + for (let jid of owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != this.user.jid)) { + let data = (await this.onWhatsApp(jid))[0] || {} + if (data.exists) + m.reply(`*Plugin:* ${m.plugin}\n*Sender:* @${m.sender.split`@`[0]}\n*Chat:* ${m.chat}\n*Chat Name:* ${await this.getName(m.chat)}\n*Command:* ${usedPrefix}${command} ${args.join(' ')}\n\n\`\`\`${text}\`\`\``.trim(), data.jid, { mentions: [m.sender] }) + } + m.reply(text) + } + } finally { + // m.reply(util.format(_user)) + if (typeof plugin.after === 'function') { + try { + await plugin.after.call(this, m, extra) + } catch (e) { + console.error(e) + } + } + if (m.limit) m.reply(+ m.limit + ' Limit terpakai') + } + break + } + } + } catch (e) { + console.error(e) + } finally { + //conn.sendPresenceUpdate('composing', m.chat) // kalo pengen auto vn hapus // di baris dekat conn + //console.log(global.db.data.users[m.sender]) + let user, stats = global.db.data.stats + if (m) { + if (m.sender && (user = global.db.data.users[m.sender])) { + user.exp += m.exp + user.limit -= m.limit * 1 + } + + let stat + if (m.plugin) { + let now = + new Date + if (m.plugin in stats) { + stat = stats[m.plugin] + if (!isNumber(stat.total)) stat.total = 1 + if (!isNumber(stat.success)) stat.success = m.error != null ? 0 : 1 + if (!isNumber(stat.last)) stat.last = now + if (!isNumber(stat.lastSuccess)) stat.lastSuccess = m.error != null ? 0 : now + } else stat = stats[m.plugin] = { + total: 1, + success: m.error != null ? 0 : 1, + last: now, + lastSuccess: m.error != null ? 0 : now + } + stat.total += 1 + stat.last = now + if (m.error == null) { + stat.success += 1 + stat.lastSuccess = now + } + } + } + + try { + require('./lib/print')(m, this) + } catch (e) { + console.log(m, m.quoted, e) + } + if (opts['autoread']) await this.readMessages([m.key]) + } + }, + + async participantsUpdate({ id, participants, action }) { + if (opts['self']) return + // if (id in conn.chats) return // First login will spam + if (global.isInit) return + let chat = db.data.chats[id] || {} + let text = '' + switch (action) { + case 'add': + case 'remove': + case 'leave': + case 'invite': + case 'invite_v4': + if (chat.welcome) { + let groupMetadata = await this.groupMetadata(id) || (conn.chats[id] || {}).metadata + for (let user of participants) { + let pp = 'https://btch.pages.dev/file/70e8de9b1879568954f09.jpg' + try { + pp = await this.profilePictureUrl(user, 'image') + } catch (e) { + } finally { + text = (action === 'add' ? (chat.sWelcome || this.welcome || conn.welcome || 'Welcome, @user!').replace('@subject', await this.getName(id)).replace('@desc', groupMetadata.desc ? groupMetadata.desc.toString() : '') : + (chat.sBye || this.bye || conn.bye || 'Bye, @user!')).replace('@user', '@' + user.split('@')[0]) + this.sendMessage(id, { + text: text, + contextInfo: { + mentionedJid: [user], + externalAdReply: { + title: global.wm, + body: '', + thumbnailUrl: pp, + sourceUrl: 'https://chat.whatsapp.com/KIcqnzY4NJMHXPTz8Xopvd', + mediaType: 1, + renderLargerThumbnail: true + }}}, { quoted: null }) + } + } + } + break + case 'promote': + text = (chat.sPromote || this.spromote || conn.spromote || '@user ```is now Admin```') + case 'demote': + if (!text) text = (chat.sDemote || this.sdemote || conn.sdemote || '@user ```is no longer Admin```') + text = text.replace('@user', '@' + participants[0].split('@')[0]) + if (chat.detect) this.sendMessage(id, text, { + contextInfo: { + mentionedJid: this.parseMention(text) + } + }) + break + } + }, + async delete({ remoteJid, fromMe, id, participant }) { + /*if (fromMe) return + let chats = Object.entries(conn.chats).find(([user, data]) => data.messages && data.messages[id]) + if (!chats) return + let msg = JSON.parse(chats[1].messages[id]) + let chat = global.db.data.chats[msg.key.remoteJid] || {} + if (chat.delete) return + await this.reply(msg.key.remoteJid, ` +Terdeteksi @${participant.split`@`[0]} telah menghapus pesan +Untuk mematikan fitur ini, ketik +*.enable delete* +`.trim(), msg, { + mentions: [participant] + }) + this.copyNForward(msg.key.remoteJid, msg).catch(e => console.log(e, msg))*/ + } +} + +global.dfail = (type, m, conn) => { + let msg = { + rowner: 'Perintah ini hanya dapat digunakan oleh _*OWWNER!1!1!*_', + owner: 'Perintah ini hanya dapat digunakan oleh _*Owner Bot*_!', + mods: 'Perintah ini hanya dapat digunakan oleh _*Moderator*_ !', + premium: 'Perintah ini hanya untuk member _*Premium*_ !', + group: 'Perintah ini hanya dapat digunakan di grup!', + private: 'Perintah ini hanya dapat digunakan di Chat Pribadi!', + admin: 'Perintah ini hanya untuk *Admin* grup!', + botAdmin: 'Jadikan bot sebagai *Admin* untuk menggunakan perintah ini!', + unreg: 'Silahkan daftar untuk menggunakan fitur ini dengan cara mengetik:\n\n*#daftar nama.umur*\n\nContoh: *#daftar Mansur.16*', + restrict: 'Fitur ini di *disable*!' + }[type] + if (msg) return m.reply(msg) +} + +let fs = require('fs') +let chalk = require('chalk') +let file = require.resolve(__filename) +fs.watchFile(file, () => { + fs.unwatchFile(file) + console.log(chalk.redBright("Update 'handler.js'")) + delete require.cache[file] + if (global.reloadHandler) console.log(global.reloadHandler()) +}) diff --git a/heroku.yml b/heroku.yml new file mode 100644 index 0000000000000000000000000000000000000000..e7e4ff526d230e76e5c0379845b111b05dd4e194 --- /dev/null +++ b/heroku.yml @@ -0,0 +1,3 @@ +build: + docker: + web: Dockerfile diff --git a/index.js b/index.js new file mode 100644 index 0000000000000000000000000000000000000000..063b1e3b1f8a9d88888e4b2ee2f26f83544555f7 --- /dev/null +++ b/index.js @@ -0,0 +1,121 @@ +const cluster = require('cluster'); +const { spawn } = require('child_process'); +const path = require('path'); +const fs = require('fs'); +const os = require('os'); +const express = require('express'); +const app = express(); + +// Tetapkan port ke 7860 +const PORT = 7860; + +app.get('/', (req, res) => { + res.setHeader('Content-Type', 'application/json'); + const data = { + status: 'true', + message: 'Bot Successfully Activated!', + author: 'rizki' + }; + const result = { + response: data + }; + res.send(JSON.stringify(result, null, 2)); +}); + +// Mulai server pada port 7860 +app.listen(PORT, () => { + console.log('\x1b[33m%s\x1b[0m', `๐ŸŒ Server berjalan di port ${PORT}`); +}); + +let isRunning = false; + +function start(file) { + if (isRunning) return; + isRunning = true; + + const args = [path.join(__dirname, file), ...process.argv.slice(2)]; + const p = spawn(process.argv[0], args, { + stdio: ["inherit", "inherit", "inherit", "ipc"], + }); + + p.on("message", (data) => { + console.log('\x1b[36m%s\x1b[0m', `๐ŸŸข RECEIVED ${data}`); + switch (data) { + case "reset": + p.kill(); + isRunning = false; + start.apply(this, arguments); + break; + case "uptime": + p.send(process.uptime()); + break; + } + }); + + p.on("exit", (code) => { + isRunning = false; + console.error('\x1b[31m%s\x1b[0m', `Exited with code: ${code}`); + start('main.js'); + + if (code === 0) return; + + fs.watchFile(args[0], () => { + fs.unwatchFile(args[0]); + console.error('\x1b[31m%s\x1b[0m', `File ${args[0]} has been modified. Script will restart...`); + start("main.js"); + }); + }); + + p.on("error", (err) => { + console.error('\x1b[31m%s\x1b[0m', `Error: ${err}`); + p.kill(); + isRunning = false; + console.error('\x1b[31m%s\x1b[0m', `Error occurred. Script will restart...`); + start("main.js"); + }); + + const pluginsFolder = path.join(__dirname, "plugins"); + + fs.readdir(pluginsFolder, (err, files) => { + if (err) { + console.error('\x1b[31m%s\x1b[0m', `Error reading plugins folder: ${err}`); + return; + } + console.log('\x1b[33m%s\x1b[0m', `๐ŸŸก Found ${files.length} plugins in folder ${pluginsFolder}`); + try { + require.resolve('@adiwajshing/baileys'); + console.log('\x1b[33m%s\x1b[0m', `๐ŸŸก Baileys library version ${require('@adiwajshing/baileys/package.json').version} is installed`); + } catch (e) { + console.error('\x1b[31m%s\x1b[0m', `โŒ Baileys library is not installed`); + } + }); + + console.log(`๐Ÿ–ฅ๏ธ \x1b[33m${os.type()}\x1b[0m, \x1b[33m${os.release()}\x1b[0m - \x1b[33m${os.arch()}\x1b[0m`); + const ramInGB = os.totalmem() / (1024 * 1024 * 1024); + console.log(`๐Ÿ’พ \x1b[33mTotal RAM: ${ramInGB.toFixed(2)} GB\x1b[0m`); + const freeRamInGB = os.freemem() / (1024 * 1024 * 1024); + console.log(`๐Ÿ’ฝ \x1b[33mFree RAM: ${freeRamInGB.toFixed(2)} GB\x1b[0m`); + console.log('\x1b[33m%s\x1b[0m', `๐Ÿ“ƒ Script by BOTCAHX`); + + setInterval(() => {}, 1000); +} + +start("main.js"); + +const tmpDir = './tmp'; +if (!fs.existsSync(tmpDir)) { + fs.mkdirSync(tmpDir); + console.log('\x1b[33m%s\x1b[0m', `๐Ÿ“ Created directory ${tmpDir}`); +} + +process.on('unhandledRejection', (reason) => { + console.error('\x1b[31m%s\x1b[0m', `Unhandled promise rejection: ${reason}`); + console.error('\x1b[31m%s\x1b[0m', 'Unhandled promise rejection. Script will restart...'); + start('main.js'); +}); + +process.on('exit', (code) => { + console.error(`Exited with code: ${code}`); + console.error('Script will restart...'); + start('main.js'); +}); \ No newline at end of file diff --git a/lib/cloudDBAdapter.js b/lib/cloudDBAdapter.js new file mode 100644 index 0000000000000000000000000000000000000000..bf89d2b872a3ff51512e91e89123072dc945e541 --- /dev/null +++ b/lib/cloudDBAdapter.js @@ -0,0 +1,58 @@ +const got = require('got') + +const stringify = obj => JSON.stringify(obj, null, 2) +const parse = str => JSON.parse(str, (_, v) => { + if ( + v !== null && + typeof v === 'object' && + 'type' in v && + v.type === 'Buffer' && + 'data' in v && + Array.isArray(v.data)) { + return Buffer.from(v.data) + } + return v +}) +class CloudDBAdapter { + constructor(url, { + serialize = stringify, + deserialize = parse, + fetchOptions = {} + } = {}) { + this.url = url + this.serialize = serialize + this.deserialize = deserialize + this.fetchOptions = fetchOptions + } + + async read() { + try { + let res = await got(this.url, { + method: 'GET', + headers: { + 'Accept': 'application/json;q=0.9,text/plain' + }, + ...this.fetchOptions + }) + if (res.statusCode !== 200) throw res.statusMessage + return this.deserialize(res.body) + } catch (e) { + return null + } + } + + async write(obj) { + let res = await got(this.url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + ...this.fetchOptions, + body: this.serialize(obj) + }) + if (res.statusCode !== 200) throw res.statusMessage + return res.body + } +} + +module.exports = CloudDBAdapter \ No newline at end of file diff --git a/lib/cluster.js b/lib/cluster.js new file mode 100644 index 0000000000000000000000000000000000000000..2453283d78dbcb207f20446c2b554449f92eeaef --- /dev/null +++ b/lib/cluster.js @@ -0,0 +1,36 @@ +const cluster = require('cluster') +const os = require('os') +const path = require('path') +const { connectionOptions } = require('../main') +const { makeWASocket } = require('./simple') + +var conn +module.exports = { + Cluster() { + if (cluster.isMaster || !cluster.isWorker) { + if (!os.cpus().length <= 1) throw new Error(`Requires at least 1 cores, but you only have ${os.cpus().length} cores`) + cluster.setupMaster({ + exec: path.join(__dirname, './cluster.js') + }) + // for (let i = 0; i < 3; i++) + cluster.fork() + console.log(cluster.workers) + } else { + // console.log(cluster.workers) + // if (cluster.worker.id == 1) this.baileys() + } + }, + baileys() { + conn = makeWASocket(connectionOptions) + for (let event of Object.keys(conn.ev._events)) { + conn.ev.on(event, (...updates) => { + event, updates + }) + } + }, + convert() { + + } +} + +if (cluster.isWorker) module.exports.Cluster() \ No newline at end of file diff --git a/lib/color.js b/lib/color.js new file mode 100644 index 0000000000000000000000000000000000000000..f4f56651bd79e26e949ec99c94d1d39e55b2c343 --- /dev/null +++ b/lib/color.js @@ -0,0 +1,14 @@ +const chalk = require('chalk') + +const color = (text, color) => { + return !color ? chalk.green(text) : chalk.keyword(color)(text) +} + +const bgcolor = (text, bgcolor) => { + return !bgcolor ? chalk.green(text) : chalk.bgKeyword(bgcolor)(text) +} + +module.exports = { + color, + bgcolor +} diff --git a/lib/converter.js b/lib/converter.js new file mode 100644 index 0000000000000000000000000000000000000000..5c1d7dfdd2c65a1d6817c109f5f0e5eea138f4b4 --- /dev/null +++ b/lib/converter.js @@ -0,0 +1,84 @@ +const fs = require('fs') +const path = require('path') +const { spawn } = require('child_process') + +function ffmpeg(buffer, args = [], ext = '', ext2 = '') { + return new Promise(async (resolve, reject) => { + try { + let tmp = path.join(__dirname, '../tmp', + new Date + '.' + ext) + let out = tmp + '.' + ext2 + await fs.promises.writeFile(tmp, buffer) + spawn('ffmpeg', [ + '-y', + '-i', tmp, + ...args, + out + ]) + .on('error', reject) + .on('close', async (code) => { + try { + await fs.promises.unlink(tmp) + if (code !== 0) return reject(code) + resolve({ data: await fs.promises.readFile(out), filename: out }) + // await fs.promises.unlink(out) + } catch (e) { + reject(e) + } + }) + } catch (e) { + reject(e) + } + }) +} + +/** + * Convert Audio to Playable WhatsApp Audio + * @param {Buffer} buffer Audio Buffer + * @param {String} ext File Extension + */ +function toPTT(buffer, ext) { + return ffmpeg(buffer, [ + '-vn', + '-c:a', 'libopus', + '-b:a', '128k', + '-vbr', 'on', + ], ext, 'ogg') +} + +/** + * Convert Audio to Playable WhatsApp PTT + * @param {Buffer} buffer Audio Buffer + * @param {String} ext File Extension + */ +function toAudio(buffer, ext) { + return ffmpeg(buffer, [ + '-vn', + '-c:a', 'libopus', + '-b:a', '128k', + '-vbr', 'on', + '-compression_level', '10' + ], ext, 'opus') +} + +/** + * Convert Audio to Playable WhatsApp Video + * @param {Buffer} buffer Video Buffer + * @param {String} ext File Extension + */ +function toVideo(buffer, ext) { + return ffmpeg(buffer, [ + '-c:v', 'libx264', + '-c:a', 'aac', + '-ab', '128k', + '-ar', '44100', + '-crf', '32', + '-preset', 'slow' + ], ext, 'mp4') +} + +module.exports = { + toAudio, + toPTT, + toVideo, + ffmpeg, +} \ No newline at end of file diff --git a/lib/database.js b/lib/database.js new file mode 100644 index 0000000000000000000000000000000000000000..02e6328ac655d12ec276c30e9655596fb40be183 --- /dev/null +++ b/lib/database.js @@ -0,0 +1,71 @@ +const path = require('path') +const _fs = require('fs') +const { promises: fs } = _fs + +class Database { + /** + * Create new Database + * @param {String} filepath Path to specified json database + * @param {...any} args JSON.stringify arguments + */ + constructor(filepath, ...args) { + this.file = path.resolve(filepath) + this.logger = console + + this._load() + + this._jsonargs = args + this._state = false + this._queue = [] + this._interval = setInterval(async () => { + if (!this._state && this._queue && this._queue[0]) { + this._state = true + await this[this._queue.shift()]().catch(this.logger.error) + this._state = false + } + }, 1000) + + } + + get data() { + return this._data + } + + set data(value) { + this._data = value + this.save() + } + + /** + * Queue Load + */ + load() { + this._queue.push('_load') + } + + /** + * Queue Save + */ + save() { + this._queue.push('_save') + } + + _load() { + try { + return this._data = _fs.existsSync(this.file) ? JSON.parse(_fs.readFileSync(this.file)) : {} + } catch (e) { + this.logger.error(e) + return this._data = {} + } + } + + async _save() { + let dirname = path.dirname(this.file) + if (!_fs.existsSync(dirname)) await fs.mkdir(dirname, { recursive: true }) + await fs.writeFile(this.file, JSON.stringify(this._data, ...this._jsonargs)) + return this.file + } +} + +module.exports = Database + diff --git a/lib/exif.js b/lib/exif.js new file mode 100644 index 0000000000000000000000000000000000000000..778561d8b06016102d69dba97d5b859078890fc5 --- /dev/null +++ b/lib/exif.js @@ -0,0 +1,116 @@ +const fs = require('fs') +const { tmpdir } = require("os") +const Crypto = require("crypto") +const ff = require('fluent-ffmpeg') +const webp = require("node-webpmux") +const path = require("path") + + +async function imageToWebp (media) { + + const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) + const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.jpg`) + + fs.writeFileSync(tmpFileIn, media) + + await new Promise((resolve, reject) => { + ff(tmpFileIn) + .on("error", reject) + .on("end", () => resolve(true)) + .addOutputOptions([ + "-vcodec", + "libwebp", + "-vf", + "scale='min(320,iw)':min'(320,ih)':force_original_aspect_ratio=decrease,fps=15, pad=320:320:-1:-1:color=white@0.0, split [a][b]; [a] palettegen=reserve_transparent=on:transparency_color=ffffff [p]; [b][p] paletteuse" + ]) + .toFormat("webp") + .save(tmpFileOut) + }) + + const buff = fs.readFileSync(tmpFileOut) + fs.unlinkSync(tmpFileOut) + fs.unlinkSync(tmpFileIn) + return buff +} + +async function videoToWebp (media) { + + const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) + const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.mp4`) + + fs.writeFileSync(tmpFileIn, media) + + await new Promise((resolve, reject) => { + ff(tmpFileIn) + .on("error", reject) + .on("end", () => resolve(true)) + .addOutputOptions([ + "-vcodec", + "libwebp", + "-vf", + "scale='min(320,iw)':min'(320,ih)':force_original_aspect_ratio=decrease,fps=15, pad=320:320:-1:-1:color=white@0.0, split [a][b]; [a] palettegen=reserve_transparent=on:transparency_color=ffffff [p]; [b][p] paletteuse", + "-loop", + "0", + "-ss", + "00:00:00", + "-t", + "00:00:06", + "-preset", + "default", + "-an", + "-vsync", + "0" + ]) + .toFormat("webp") + .save(tmpFileOut) + }) + + const buff = fs.readFileSync(tmpFileOut) + fs.unlinkSync(tmpFileOut) + fs.unlinkSync(tmpFileIn) + return buff +} + +async function writeExifImg (media, metadata) { + let wMedia = await imageToWebp(media) + const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) + const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) + fs.writeFileSync(tmpFileIn, wMedia) + + if (metadata.packname || metadata.author) { + const img = new webp.Image() + const json = { "sticker-pack-id": `https://github.com/BOTCAHX/RTXZY-MD`, "sticker-pack-name": metadata.packname, "sticker-pack-publisher": metadata.author, "emojis": metadata.categories ? metadata.categories : [""] } + const exifAttr = Buffer.from([0x49, 0x49, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x57, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00]) + const jsonBuff = Buffer.from(JSON.stringify(json), "utf-8") + const exif = Buffer.concat([exifAttr, jsonBuff]) + exif.writeUIntLE(jsonBuff.length, 14, 4) + await img.load(tmpFileIn) + fs.unlinkSync(tmpFileIn) + img.exif = exif + await img.save(tmpFileOut) + return tmpFileOut + } +} + +async function writeExifVid (media, metadata) { + let wMedia = await videoToWebp(media) + const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) + const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) + fs.writeFileSync(tmpFileIn, wMedia) + + if (metadata.packname || metadata.author) { + const img = new webp.Image() + const json = { "sticker-pack-id": `https://github.com/BOTCAHX/RTXZY-MD`, "sticker-pack-name": metadata.packname, "sticker-pack-publisher": metadata.author, "emojis": metadata.categories ? metadata.categories : [""] } + const exifAttr = Buffer.from([0x49, 0x49, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x57, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00]) + const jsonBuff = Buffer.from(JSON.stringify(json), "utf-8") + const exif = Buffer.concat([exifAttr, jsonBuff]) + exif.writeUIntLE(jsonBuff.length, 14, 4) + await img.load(tmpFileIn) + fs.unlinkSync(tmpFileIn) + img.exif = exif + await img.save(tmpFileOut) + return tmpFileOut + } +} + +module.exports = { imageToWebp, videoToWebp, writeExifImg, writeExifVid } diff --git a/lib/functions.js b/lib/functions.js new file mode 100644 index 0000000000000000000000000000000000000000..368f330bc95bd2bc0516292b13262c5dc3c66759 --- /dev/null +++ b/lib/functions.js @@ -0,0 +1,149 @@ +const fetch = require('node-fetch') +const axios = require('axios') +const cfonts = require('cfonts') +const spin = require('spinnies') +const Crypto = require('crypto') + +const wait = async (media) => new Promise(async (resolve, reject) => { + const attachmentData = `data:image/jpeg;base64,${media.toString('base64')}` + const response = await fetch("https://trace.moe/api/search",{method: "POST",body: JSON.stringify({ image: attachmentData }),headers: { "Content-Type": "application/json" }}); + if (!response.ok) reject(`Gambar tidak ditemukan!`); + const result = await response.json() + try { + const { is_adult, title, title_chinese, title_romaji, title_english, episode, season, similarity, filename, at, tokenthumb, anilist_id } = result.docs[0] + let belief = () => similarity < 0.89 ? "Saya memiliki keyakinan rendah dalam hal ini : " : "" + let ecch = () => is_adult ? "Iya" : "Tidak" + resolve({video: await getBuffer(`https://media.trace.moe/video/${anilist_id}/${encodeURIComponent(filename)}?t=${at}&token=${tokenthumb}`), teks: `${belief()} +~> Ecchi : *${ecch()}* +~> Judul Jepang : *${title}* +~> Ejaan Judul : *${title_romaji}* +~> Judul Inggris : *${title_english}* +~> Episode : *${episode}* +~> Season : *${season}*`}); + } catch (e) { + console.log(e) + reject(`Saya tidak tau ini anime apa`) + } +}) + +const simih = async (text) => { + try { + const sami = await fetch(`https://simsumi.herokuapp.com/api?text=${text}`, {method: 'GET'}) + const res = await sami.json() + return res.success + } catch { + return 'Simi ga tau apa yang anda ngomong, bahasa alien yah kak?' + } +} + +const h2k = (number) => { + var SI_POSTFIXES = ["", " K", " M", " G", " T", " P", " E"] + var tier = Math.log10(Math.abs(number)) / 3 | 0 + if(tier == 0) return number + var postfix = SI_POSTFIXES[tier] + var scale = Math.pow(10, tier * 3) + var scaled = number / scale + var formatted = scaled.toFixed(1) + '' + if (/\.0$/.test(formatted)) + formatted = formatted.substr(0, formatted.length - 2) + return formatted + postfix +} + +const getBuffer = async (url, options) => { + try { + options ? options : {} + const res = await axios({ + method: "get", + url, + headers: { + 'DNT': 1, + 'Upgrade-Insecure-Request': 1 + }, + ...options, + responseType: 'arraybuffer' + }) + return res.data + } catch (e) { + console.log(`Error : ${e}`) + } +} + +const randomBytes = (length) => { + return Crypto.randomBytes(length) +} + +const generateMessageID = () => { + return randomBytes(10).toString('hex').toUpperCase() +} + +const getGroupAdmins = (participants) => { + admins = [] + for (let i of participants) { + i.isAdmin ? admins.push(i.jid) : '' + } + return admins +} + +const getRandom = (ext) => { + return `${Math.floor(Math.random() * 10000)}${ext}` +} + +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)] +} + +const spinner = { + "interval": 120, + "frames": [ + "๐Ÿ•", + "๐Ÿ•‘", + "๐Ÿ•’", + "๐Ÿ•“", + "๐Ÿ•”", + "๐Ÿ••", + "๐Ÿ•–", + "๐Ÿ•—", + "๐Ÿ•˜", + "๐Ÿ•™", + "๐Ÿ•š", + "๐Ÿ•›" + ]} + +let globalSpinner; + + +const getGlobalSpinner = (disableSpins = false) => { + if(!globalSpinner) globalSpinner = new spin({ color: 'blue', succeedColor: 'green', spinner, disableSpins}); + return globalSpinner; +} + +spins = getGlobalSpinner(false) + +const start = (id, text) => { + spins.add(id, {text: text}) + /*setTimeout(() => { + spins.succeed('load-spin', {text: 'Suksess'}) + }, Number(wait) * 1000)*/ + } +const info = (id, text) => { + spins.update(id, {text: text}) +} +const success = (id, text) => { + spins.succeed(id, {text: text}) + + } + +const close = (id, text) => { + spins.fail(id, {text: text}) +} + +const banner = cfonts.render(('LOADING...'), { + font: 'chrome', + color: 'candy', + align: 'center', + gradient: ["red","yellow"], + lineHeight: 3 + }); + + +module.exports = { wait, simih, getBuffer, h2k, generateMessageID, getGroupAdmins, getRandom, start, info, success, banner, close, pickRandom } diff --git a/lib/gdrive.js b/lib/gdrive.js new file mode 100644 index 0000000000000000000000000000000000000000..7d8ce8e80b0ba8b8c97a0e70ad75b012329a585b --- /dev/null +++ b/lib/gdrive.js @@ -0,0 +1,75 @@ +let path = require('path') +let fs = require('fs').promises +let { promisify } = require('util') +let { google } = require('googleapis') + + +// If modifying these scopes, delete token.json. +const SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly'] +// The file token.json stores the user's access and refresh tokens, and is +// created automatically when the authorization flow completes for the first +// time. +const TOKEN_PATH = path.join(__dirname, '..', 'token.json') +let + +class GoogleAuth extends EventEmitter { + constructor() { + super() + } + + async authorize(credentials) { + let token + const { client_secret, client_id } = credentials + const oAuth2Client = new google.auth.OAuth2(client_id, client_secret, `http://localhost:${port}`) + try { + token = JSON.parse(await fs.readFile(TOKEN_PATH)) + } catch (e) { + const authUrl = oAuth2Client.generateAuthUrl({ + access_type: 'offline', + scope: SCOPES + }) + this.emit('auth', authUrl) + let code = await promisify(this.once).bind(this)('token') + token = await oAuth2Client.getToken(code) + await fs.writeFile(TOKEN_PATH, JSON.stringify(token)) + } finally { + await oAuth2Client.setCredentials(token) + } + } + + token(code) { + this.emit('token', code) + } +} + +class GoogleDrive extends GoogleAuth { + constructor() { + super() + this.path = '/drive/api' + } + + async getFolderID(path) { + + } + + async infoFile(path) { + + } + + async folderList(path) { + + } + + async downloadFile(path) { + + } + + async uploadFile(path) { + + } +} + +module.exports = { + GoogleAuth, + GoogleDrive, +} diff --git a/lib/levelling.js b/lib/levelling.js new file mode 100644 index 0000000000000000000000000000000000000000..7577d100b5955a2db1462e3039cde74f34733605 --- /dev/null +++ b/lib/levelling.js @@ -0,0 +1,50 @@ +module.exports = { + /** + * Growth rate + * `2.576652002695681` + */ + growth: Math.pow(Math.PI / Math.E, 1.618) * Math.E * .75, + /** + * get XP range at specified level + * @param {Number} level + * @param {Number} multiplier + */ + xpRange(level, multiplier = global.multiplier || 1) { + if (level < 0) throw new TypeError('level cannot be negative value') + level = Math.floor(level) + let min = level === 0 ? 0 : Math.round(Math.pow(level, this.growth) * multiplier) + 1 + let max = Math.round(Math.pow(++level, this.growth) * multiplier) + return { + min, + max, + xp: max - min + } + }, + /** + * get level by xp + * @param {Number} xp + * @param {Number} multiplier + */ + findLevel(xp, multiplier = global.multiplier || 1) { + if (xp === Infinity) return Infinity + if (isNaN(xp)) return NaN + if (xp <= 0) return -1 + let level = 0 + do level++ + while (this.xpRange(level, multiplier).min <= xp) + return --level + }, + /** + * is able to level up? + * @param {Number} level + * @param {Number} xp + * @param {Number} multiplier + */ + canLevelUp(level, xp, multiplier = global.multiplier || 1) { + if (level < 0) return false + if (xp === Infinity) return true + if (isNaN(xp)) return false + if (xp <= 0) return false + return level < this.findLevel(xp, multiplier) + } +} diff --git a/lib/logs.js b/lib/logs.js new file mode 100644 index 0000000000000000000000000000000000000000..42791961f6d14f7fcdbecdb82bef7a8b8d2c440d --- /dev/null +++ b/lib/logs.js @@ -0,0 +1,19 @@ +let stdouts = [] +module.exports = (maxLength = 200) => { + let oldWrite = process.stdout.write.bind(process.stdout) + module.exports.disable = () => { + module.exports.isModified = false + return process.stdout.write = oldWrite + } + process.stdout.write = (chunk, encoding, callback) => { + stdouts.push(Buffer.from(chunk, encoding)) + oldWrite(chunk, encoding, callback) + if (stdouts.length > maxLength) stdouts.shift() + } + module.exports.isModified = true + return module.exports +} + +module.exports.isModified = false +module.exports.logs = () => Buffer.concat(stdouts) + diff --git a/lib/lowdb/Low.d.ts b/lib/lowdb/Low.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..f6aaca289d7aa4dc8c6ce89b90c00e976812613f --- /dev/null +++ b/lib/lowdb/Low.d.ts @@ -0,0 +1,11 @@ +export interface Adapter { + read: () => Promise; + write: (data: T) => Promise; +} +export declare class Low { + adapter: Adapter; + data: T | null; + constructor(adapter: Adapter); + read(): Promise; + write(): Promise; +} diff --git a/lib/lowdb/Low.js b/lib/lowdb/Low.js new file mode 100644 index 0000000000000000000000000000000000000000..a9ea7784f905a730b8f0c27b08b433ef8cd46ac7 --- /dev/null +++ b/lib/lowdb/Low.js @@ -0,0 +1,21 @@ +const { MissingAdapterError } = require('./MissingAdapterError.js'); +class Low { + constructor(adapter) { + this.data = null; + if (adapter) { + this.adapter = adapter; + } + else { + throw new MissingAdapterError(); + } + } + async read() { + this.data = await this.adapter.read(); + } + async write() { + if (this.data) { + await this.adapter.write(this.data); + } + } +} +module.exports = { Low }; diff --git a/lib/lowdb/LowSync.d.ts b/lib/lowdb/LowSync.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..a9e43a6b579e3298243d7a02a3f22de6f447d476 --- /dev/null +++ b/lib/lowdb/LowSync.d.ts @@ -0,0 +1,11 @@ +export interface SyncAdapter { + read: () => T | null; + write: (data: T) => void; +} +export declare class LowSync { + adapter: SyncAdapter; + data: T | null; + constructor(adapter: SyncAdapter); + read(): void; + write(): void; +} diff --git a/lib/lowdb/LowSync.js b/lib/lowdb/LowSync.js new file mode 100644 index 0000000000000000000000000000000000000000..a44a6e41675ce551378a07159666d76c325173cf --- /dev/null +++ b/lib/lowdb/LowSync.js @@ -0,0 +1,21 @@ +const { MissingAdapterError } = require('./MissingAdapterError.js'); +class LowSync { + constructor(adapter) { + this.data = null; + if (adapter) { + this.adapter = adapter; + } + else { + throw new MissingAdapterError(); + } + } + read() { + this.data = this.adapter.read(); + } + write() { + if (this.data !== null) { + this.adapter.write(this.data); + } + } +} +module.exports = { LowSync }; diff --git a/lib/lowdb/MissingAdapterError.d.ts b/lib/lowdb/MissingAdapterError.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..d78d4b40b185af39e8eea394547a8f862bd02f5d --- /dev/null +++ b/lib/lowdb/MissingAdapterError.d.ts @@ -0,0 +1,3 @@ +export declare class MissingAdapterError extends Error { + constructor(); +} diff --git a/lib/lowdb/MissingAdapterError.js b/lib/lowdb/MissingAdapterError.js new file mode 100644 index 0000000000000000000000000000000000000000..5e17e16a4b7e6bc288f2168e6891d821fee1dbf8 --- /dev/null +++ b/lib/lowdb/MissingAdapterError.js @@ -0,0 +1,7 @@ +class MissingAdapterError extends Error { + constructor() { + super(); + this.message = 'Missing Adapter'; + } +} +module.exports = { MissingAdapterError }; diff --git a/lib/lowdb/adapters/JSONFile.d.ts b/lib/lowdb/adapters/JSONFile.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..e7e24c2a9a1538ce75f0d63099aa15667fa2b1a8 --- /dev/null +++ b/lib/lowdb/adapters/JSONFile.d.ts @@ -0,0 +1,7 @@ +import { Adapter } from '../Low.js'; +export declare class JSONFile implements Adapter { + private adapter; + constructor(filename: string); + read(): Promise; + write(obj: T): Promise; +} diff --git a/lib/lowdb/adapters/JSONFile.js b/lib/lowdb/adapters/JSONFile.js new file mode 100644 index 0000000000000000000000000000000000000000..fa57e2d7d9d39783627b19dde85e825820318321 --- /dev/null +++ b/lib/lowdb/adapters/JSONFile.js @@ -0,0 +1,19 @@ +const { TextFile } = require('./TextFile.js'); +class JSONFile { + constructor(filename) { + this.adapter = new TextFile(filename); + } + async read() { + const data = await this.adapter.read(); + if (data === null) { + return null; + } + else { + return JSON.parse(data); + } + } + write(obj) { + return this.adapter.write(JSON.stringify(obj, null, 2)); + } +} +module.exports = { JSONFile }; diff --git a/lib/lowdb/adapters/JSONFileSync.d.ts b/lib/lowdb/adapters/JSONFileSync.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..13df096127b36709116646b594245aa64a47b4f3 --- /dev/null +++ b/lib/lowdb/adapters/JSONFileSync.d.ts @@ -0,0 +1,7 @@ +import { SyncAdapter } from '../LowSync.js'; +export declare class JSONFileSync implements SyncAdapter { + private adapter; + constructor(filename: string); + read(): T | null; + write(obj: T): void; +} diff --git a/lib/lowdb/adapters/JSONFileSync.js b/lib/lowdb/adapters/JSONFileSync.js new file mode 100644 index 0000000000000000000000000000000000000000..c5f9777bf8affd52e786558e7055b1722201945b --- /dev/null +++ b/lib/lowdb/adapters/JSONFileSync.js @@ -0,0 +1,19 @@ +const { TextFileSync } = require('./TextFileSync.js'); +class JSONFileSync { + constructor(filename) { + this.adapter = new TextFileSync(filename); + } + read() { + const data = this.adapter.read(); + if (data === null) { + return null; + } + else { + return JSON.parse(data); + } + } + write(obj) { + this.adapter.write(JSON.stringify(obj, null, 2)); + } +} +module.exports = { JSONFileSync }; diff --git a/lib/lowdb/adapters/LocalStorage.d.ts b/lib/lowdb/adapters/LocalStorage.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..4ed765b0e1232980fe4bcea42ae0cc69c0e72e88 --- /dev/null +++ b/lib/lowdb/adapters/LocalStorage.d.ts @@ -0,0 +1,7 @@ +import { SyncAdapter } from '../LowSync.js'; +export declare class LocalStorage implements SyncAdapter { + private key; + constructor(key: string); + read(): T | null; + write(obj: T): void; +} diff --git a/lib/lowdb/adapters/LocalStorage.js b/lib/lowdb/adapters/LocalStorage.js new file mode 100644 index 0000000000000000000000000000000000000000..003ab265764dfb6ad1060abe6c30c3ef2ea0b844 --- /dev/null +++ b/lib/lowdb/adapters/LocalStorage.js @@ -0,0 +1,16 @@ +class LocalStorage { + constructor(key) { + this.key = key; + } + read() { + const value = localStorage.getItem(this.key); + if (value === null) { + return null; + } + return JSON.parse(value); + } + write(obj) { + localStorage.setItem(this.key, JSON.stringify(obj)); + } +} +module.exports = { LocalStorage }; diff --git a/lib/lowdb/adapters/Memory.d.ts b/lib/lowdb/adapters/Memory.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..6b53dfd74892ea7c61e145ea4da8e7483c41770d --- /dev/null +++ b/lib/lowdb/adapters/Memory.d.ts @@ -0,0 +1,6 @@ +import { Adapter } from '../Low.js'; +export declare class Memory implements Adapter { + private data; + read(): Promise; + write(obj: T): Promise; +} diff --git a/lib/lowdb/adapters/Memory.js b/lib/lowdb/adapters/Memory.js new file mode 100644 index 0000000000000000000000000000000000000000..16e14679314c4ee732e3f02c72034b329590ce09 --- /dev/null +++ b/lib/lowdb/adapters/Memory.js @@ -0,0 +1,13 @@ +class Memory { + constructor() { + this.data = null; + } + read() { + return Promise.resolve(this.data); + } + write(obj) { + this.data = obj; + return Promise.resolve(); + } +} +module.exports = { Memory }; diff --git a/lib/lowdb/adapters/MemorySync.d.ts b/lib/lowdb/adapters/MemorySync.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..1b38a9d04fc4baff651ac86d9b2f4a8f110ce4e6 --- /dev/null +++ b/lib/lowdb/adapters/MemorySync.d.ts @@ -0,0 +1,6 @@ +import { SyncAdapter } from '../LowSync.js'; +export declare class MemorySync implements SyncAdapter { + private data; + read(): T | null; + write(obj: T): void; +} diff --git a/lib/lowdb/adapters/MemorySync.js b/lib/lowdb/adapters/MemorySync.js new file mode 100644 index 0000000000000000000000000000000000000000..960e1d9cbc54c15dfd9085aa7ac5101e4fa3ff58 --- /dev/null +++ b/lib/lowdb/adapters/MemorySync.js @@ -0,0 +1,12 @@ +class MemorySync { + constructor() { + this.data = null; + } + read() { + return this.data || null; + } + write(obj) { + this.data = obj; + } +} +module.exports = { MemorySync }; diff --git a/lib/lowdb/adapters/TextFile.d.ts b/lib/lowdb/adapters/TextFile.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..1ff9229e7fa0df8ccdc582c8a5cd4bc0cee3e20f --- /dev/null +++ b/lib/lowdb/adapters/TextFile.d.ts @@ -0,0 +1,8 @@ +import { Adapter } from '../Low.js'; +export declare class TextFile implements Adapter { + private filename; + private writer; + constructor(filename: string); + read(): Promise; + write(str: string): Promise; +} diff --git a/lib/lowdb/adapters/TextFile.js b/lib/lowdb/adapters/TextFile.js new file mode 100644 index 0000000000000000000000000000000000000000..c1bbafafc474d35f6be74fdf359c52cc0c9b1058 --- /dev/null +++ b/lib/lowdb/adapters/TextFile.js @@ -0,0 +1,25 @@ +const fs = require('fs'); +const { Writer } = require('steno'); +class TextFile { + constructor(filename) { + this.filename = filename; + this.writer = new Writer(filename); + } + async read() { + let data; + try { + data = await fs.promises.readFile(this.filename, 'utf-8'); + } + catch (e) { + if (e.code === 'ENOENT') { + return null; + } + throw e; + } + return data; + } + write(str) { + return this.writer.write(str); + } +} +module.exports = { TextFile }; \ No newline at end of file diff --git a/lib/lowdb/adapters/TextFileSync.d.ts b/lib/lowdb/adapters/TextFileSync.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..ec1c6d58bb6bda871eea54c314f97feb01319916 --- /dev/null +++ b/lib/lowdb/adapters/TextFileSync.d.ts @@ -0,0 +1,8 @@ +import { SyncAdapter } from '../LowSync.js'; +export declare class TextFileSync implements SyncAdapter { + private tempFilename; + private filename; + constructor(filename: string); + read(): string | null; + write(str: string): void; +} diff --git a/lib/lowdb/adapters/TextFileSync.js b/lib/lowdb/adapters/TextFileSync.js new file mode 100644 index 0000000000000000000000000000000000000000..ecacb3ef9b35f04223dd679c7465d445f637271e --- /dev/null +++ b/lib/lowdb/adapters/TextFileSync.js @@ -0,0 +1,26 @@ +const fs = require('fs'); +const path = require('path'); +class TextFileSync { + constructor(filename) { + this.filename = filename; + this.tempFilename = path.join(path.dirname(filename), `.${path.basename(filename)}.tmp`); + } + read() { + let data; + try { + data = fs.readFileSync(this.filename, 'utf-8'); + } + catch (e) { + if (e.code === 'ENOENT') { + return null; + } + throw e; + } + return data; + } + write(str) { + fs.writeFileSync(this.tempFilename, str); + fs.renameSync(this.tempFilename, this.filename); + } +} +module.exports = { TextFileSync }; diff --git a/lib/lowdb/index.d.ts b/lib/lowdb/index.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..083a9bfa8b7d09df5199d9d1a134cac32e01314c --- /dev/null +++ b/lib/lowdb/index.d.ts @@ -0,0 +1,9 @@ +export * from './adapters/JSONFile.js'; +export * from './adapters/JSONFileSync.js'; +export * from './adapters/LocalStorage.js'; +export * from './adapters/Memory.js'; +export * from './adapters/MemorySync.js'; +export * from './adapters/TextFile.js'; +export * from './adapters/TextFileSync.js'; +export * from './Low.js'; +export * from './LowSync.js'; diff --git a/lib/lowdb/index.js b/lib/lowdb/index.js new file mode 100644 index 0000000000000000000000000000000000000000..11c194ee98e1669c2a8bd59d1fe1c9b61c0a1324 --- /dev/null +++ b/lib/lowdb/index.js @@ -0,0 +1,11 @@ +module.exports = { + ...require('./adapters/JSONFile.js'), + ...require('./adapters/JSONFileSync.js'), + ...require('./adapters/LocalStorage.js'), + ...require('./adapters/Memory.js'), + ...require('./adapters/MemorySync.js'), + ...require('./adapters/TextFile.js'), + ...require('./adapters/TextFileSync.js'), + ...require('./Low.js'), + ...require('./LowSync.js'), +} \ No newline at end of file diff --git a/lib/mongoDB.js b/lib/mongoDB.js new file mode 100644 index 0000000000000000000000000000000000000000..af29a4b133459559cda36ba3aa624889a2407527 --- /dev/null +++ b/lib/mongoDB.js @@ -0,0 +1,44 @@ +const mongoose = require('mongoose') +const { Schema } = mongoose + +module.exports = class mongoDB { + constructor(url, options = { useNewUrlParser: true, useUnifiedTopology: true }) { + this.url = url + this.data = this._data = this._schema = this._model = {} + this.db + this.options = options + } + async read() { + this.db = await mongoose.connect(this.url, { ...this.options }) + this.connection = mongoose.connection + let schema = this._schema = new Schema({ + data: { + type: Object, + required: true, //depends on whether the field is mandatory or not + default: {} + } + }) + // this._model = mongoose.model('data', schema) + try { this._model = mongoose.model('data', schema) } catch { this._model = mongoose.model('data') } + this._data = await this._model.findOne({}) + if (!this._data) { + this.data = {} + await this.write(this.data) + this._data = await this._model.findOne({}) + } else this.data = this._data.data + return this.data + } + + + async write(data) { + if (!data) return data + if (!this._data) return (new this._model({ data })).save() + this._model.findById(this._data._id, (err, docs) => { + if (!err) { + if (!docs.data) docs.data = {} + docs.data = data + return docs.save() + } + }) + } +} \ No newline at end of file diff --git a/lib/myfunc.js b/lib/myfunc.js new file mode 100644 index 0000000000000000000000000000000000000000..08ff78c0de5c4030164d6e13a6f03a242c29798f --- /dev/null +++ b/lib/myfunc.js @@ -0,0 +1,307 @@ +/** + * Create By Dika Ardnt. + * Contact Me on wa.me/6288292024190 + * Follow https://github.com/DikaArdnt +*/ + +const { proto } = require('@adiwajshing/baileys') +const chalk = require('chalk') +const fs = require('fs') +const Crypto = require('crypto') +const axios = require('axios') +const moment = require('moment-timezone') +const { sizeFormatter } = require('human-readable') +const util = require('util') +const jimp = require('jimp') +const { defaultMaxListeners } = require('stream') + + +const unixTimestampSeconds = (date = new Date()) => Math.floor(date.getTime() / 1000) + +exports.unixTimestampSeconds = unixTimestampSeconds + +exports.generateMessageTag = (epoch) => { + let tag = (0, exports.unixTimestampSeconds)().toString(); + if (epoch) + tag += '.--' + epoch; // attach epoch if provided + return tag; +} + +exports.processTime = (timestamp, now) => { + return moment.duration(now - moment(timestamp * 1000)).asSeconds() +} + +exports.getRandom = (ext) => { + return `${Math.floor(Math.random() * 10000)}${ext}` +} + +exports.getBuffer = async (url, options) => { + try { + options ? options : {} + const res = await axios({ + method: "get", + url, + headers: { + 'DNT': 1, + 'Upgrade-Insecure-Request': 1 + }, + ...options, + responseType: 'arraybuffer' + }) + return res.data + } catch (e) { + return err + } +} + +exports.fetchJson = async (url, options) => { + try { + options ? options : {} + const res = await axios({ + method: 'GET', + url: url, + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36' + }, + ...options + }) + return res.data + } catch (err) { + return err + } +} + +exports.runtime = function(seconds) { + seconds = Number(seconds); + var d = Math.floor(seconds / (3600 * 24)); + var h = Math.floor(seconds % (3600 * 24) / 3600); + var m = Math.floor(seconds % 3600 / 60); + var s = Math.floor(seconds % 60); + var dDisplay = d > 0 ? d + (d == 1 ? " day, " : " days, ") : ""; + var hDisplay = h > 0 ? h + (h == 1 ? " hour, " : " hours, ") : ""; + var mDisplay = m > 0 ? m + (m == 1 ? " minute, " : " minutes, ") : ""; + var sDisplay = s > 0 ? s + (s == 1 ? " second" : " seconds") : ""; + return dDisplay + hDisplay + mDisplay + sDisplay; +} + +exports.clockString = function(seconds) { + let h = isNaN(seconds) ? '--' : Math.floor(seconds % (3600 * 24) / 3600) + let m = isNaN(seconds) ? '--' : Math.floor(seconds % 3600 / 60) + let s = isNaN(seconds) ? '--' : Math.floor(seconds % 60) + return [h, m, s].map(v => v.toString().padStart(2, 0)).join(':') +} + +exports.sleep = async (ms) => { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +exports.isUrl = (url) => { + return url.match(new RegExp(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)/, 'gi')) +} + +exports.getTime = (format, date) => { + if (date) { + return moment(date).locale('id').format(format) + } else { + return moment.tz('Asia/Jakarta').locale('id').format(format) + } +} + +exports.formatDate = (n, locale = 'id') => { + let d = new Date(n) + return d.toLocaleDateString(locale, { + weekday: 'long', + day: 'numeric', + month: 'long', + year: 'numeric', + hour: 'numeric', + minute: 'numeric', + second: 'numeric' + }) +} + +exports.tanggal = (numer) => { + myMonths = ["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"]; + myDays = ['Minggu','Senin','Selasa','Rabu','Kamis','Jumโ€™at','Sabtu']; + var tgl = new Date(numer); + var day = tgl.getDate() + bulan = tgl.getMonth() + var thisDay = tgl.getDay(), + thisDay = myDays[thisDay]; + var yy = tgl.getYear() + var year = (yy < 1000) ? yy + 1900 : yy; + const time = moment.tz('Asia/Jakarta').format('DD/MM HH:mm:ss') + let d = new Date + let locale = 'id' + let gmt = new Date(0).getTime() - new Date('1 January 1970').getTime() + let weton = ['Pahing', 'Pon','Wage','Kliwon','Legi'][Math.floor(((d * 1) + gmt) / 84600000) % 5] + + return`${thisDay}, ${day} - ${myMonths[bulan]} - ${year}` +} + +exports.formatp = sizeFormatter({ + std: 'JEDEC', //'SI' = default | 'IEC' | 'JEDEC' + decimalPlaces: 2, + keepTrailingZeroes: false, + render: (literal, symbol) => `${literal} ${symbol}B`, +}) + +exports.jsonformat = (string) => { + return JSON.stringify(string, null, 2) +} + +function delay(ms) { + return new Promise((resolve, reject) => setTimeout(resolve, ms)) +} + +function format(...args) { + return util.format(...args) +} + +exports.logic = (check, inp, out) => { + if (inp.length !== out.length) throw new Error('Input and Output must have same length') + for (let i in inp) + if (util.isDeepStrictEqual(check, inp[i])) return out[i] + return null +} + +exports.generateProfilePicture = async (buffer) => { + const jimp = await jimp_1.read(buffer) + const min = jimp.getWidth() + const max = jimp.getHeight() + const cropped = jimp.crop(0, 0, min, max) + return { + img: await cropped.scaleToFit(720, 720).getBufferAsync(jimp_1.MIME_JPEG), + preview: await cropped.scaleToFit(720, 720).getBufferAsync(jimp_1.MIME_JPEG) + } +} + +exports.parseMention = (text = '') => { + return [...text.matchAll(/@([0-9]{5,16}|0)/g)].map(v => v[1] + '@s.whatsapp.net') +} + +exports.getGroupAdmins = (participantes) => { + var admins = [] + for (let i of participantes) { + i.admin === "admin" ? admins.push(i.id) : '' + } + return admins +} + +/** + * Serialize Message + * @param {WAConnection} conn + * @param {Object} m + * @param {store} store + */ +exports.smsg = (conn, m, store) => { + if (!m) return m + let M = proto.WebMessageInfo + if (m.key) { + m.id = m.key.id + m.isBaileys = m.id.startsWith('BAE5') && m.id.length === 16 + m.chat = m.key.remoteJid + m.fromMe = m.key.fromMe + m.isGroup = m.chat.endsWith('@g.us') + m.sender = m.fromMe ? (conn.user.id.split(":")[0]+'@s.whatsapp.net' || conn.user.id) : (m.key.participant || m.key.remoteJid) + } + if (m.message) { + m.mtype = Object.keys(m.message)[0] + m.body = m.message.conversation || m.message[m.mtype].caption || m.message[m.mtype].text || (m.mtype == 'listResponseMessage') && m.message[m.mtype].singleSelectReply.selectedRowId || (m.mtype == 'buttonsResponseMessage') && m.message[m.mtype].selectedButtonId || m.mtype + m.msg = m.message[m.mtype] + if (m.mtype === 'ephemeralMessage') { + exports.smsg(hisoka, m.msg) + m.mtype = m.msg.mtype + m.msg = m.msg.msg + } + let quoted = m.quoted = m.msg.contextInfo ? m.msg.contextInfo.quotedMessage : null + m.mentionedJid = m.msg.contextInfo ? m.msg.contextInfo.mentionedJid : [] + if (m.quoted) { + let type = Object.keys(m.quoted)[0] + m.quoted = m.quoted[type] + if (['productMessage'].includes(type)) { + type = Object.keys(m.quoted)[0] + m.quoted = m.quoted[type] + } + if (typeof m.quoted === 'string') m.quoted = { + text: m.quoted + } + m.quoted.mtype = type + m.quoted.id = m.msg.contextInfo.stanzaId + m.quoted.chat = m.msg.contextInfo.remoteJid || m.chat + m.quoted.isBaileys = m.quoted.id ? m.quoted.id.startsWith('BAE5') && m.quoted.id.length === 16 : false + m.quoted.sender = m.msg.contextInfo.participant.split(":")[0] || m.msg.contextInfo.participant + m.quoted.fromMe = m.quoted.sender === (conn.user && conn.user.id) + m.quoted.text = m.quoted.text || m.quoted.caption || '' + m.quoted.mentionedJid = m.msg.contextInfo ? m.msg.contextInfo.mentionedJid : [] + m.getQuotedObj = m.getQuotedMessage = async () => { + if (!m.quoted.id) return false + let q = await store.loadMessage(m.chat, m.quoted.id, conn) + return exports.smsg(conn, q, store) + } + let vM = m.quoted.fakeObj = M.fromObject({ + key: { + remoteJid: m.quoted.chat, + fromMe: m.quoted.fromMe, + id: m.quoted.id + }, + message: quoted, + ...(m.isGroup ? { participant: m.quoted.sender } : {}) + }) + + /** + * + * @returns + */ + m.quoted.delete = () => conn.sendMessage(m.quoted.chat, { delete: vM.key }) + + /** + * + * @param {*} jid + * @param {*} forceForward + * @param {*} options + * @returns + */ + m.quoted.copyNForward = (jid, forceForward = false, options = {}) => conn.copyNForward(jid, vM, forceForward, options) + + /** + * + * @returns + */ + m.quoted.download = () => conn.downloadMediaMessage(m.quoted) + } + } + if (m.msg.url) m.download = () => conn.downloadMediaMessage(m.msg) + m.text = (m.mtype == 'listResponseMessage' ? m.msg.singleSelectReply.selectedRowId : '') || m.msg.text || m.msg.caption || m.msg || '' + /** + * Reply to this message + * @param {String|Object} text + * @param {String|false} chatId + * @param {Object} options + */ + m.reply = (text, chatId, options) => conn.sendMessage(chatId ? chatId : m.chat, { text: text }, { quoted: m, detectLinks: false, thumbnail: global.thumb, ...options }) + /** + * Copy this message + */ + m.copy = () => exports.smsg(conn, M.fromObject(M.toObject(m))) + + /** + * + * @param {*} jid + * @param {*} forceForward + * @param {*} options + * @returns + */ + m.copyNForward = (jid = m.chat, forceForward = false, options = {}) => conn.copyNForward(jid, m, forceForward, options) + + return m +} + + +let file = require.resolve(__filename) +fs.watchFile(file, () => { + fs.unwatchFile(file) + console.log(chalk.redBright(`Update ${__filename}`)) + delete require.cache[file] + require(file) +}) diff --git a/lib/print.js b/lib/print.js new file mode 100644 index 0000000000000000000000000000000000000000..8f58cb11281893d2352b1ff103074e1f4d0eedc6 --- /dev/null +++ b/lib/print.js @@ -0,0 +1,93 @@ +let { WAMessageStubType } = require('@adiwajshing/baileys') +let urlRegex = require('url-regex-safe')({ strict: false }) +let PhoneNumber = require('awesome-phonenumber') +let terminalImage = global.opts['img'] ? require('terminal-image') : '' +let chalk = require('chalk') +let fs = require('fs') + +module.exports = async function (m, conn = { user: {} }) { + let _name = await conn.getName(m.sender) + let sender = PhoneNumber('+' + m.sender.replace('@s.whatsapp.net', '')).getNumber('international') + (_name ? ' ~' + _name : '') + let chat = await conn.getName(m.chat) + // let ansi = '\x1b[' + let img + try { + if (global.opts['img']) + img = /sticker|image/gi.test(m.mtype) ? await terminalImage.buffer(await m.download()) : false + } catch (e) { + console.error(e) + } + let filesize = (m.msg ? + m.msg.vcard ? + m.msg.vcard.length : + m.msg.fileLength ? + m.msg.fileLength.low || m.msg.fileLength : + m.msg.axolotlSenderKeyDistributionMessage ? + m.msg.axolotlSenderKeyDistributionMessage.length : + m.text ? + m.text.length : + 0 + : m.text ? m.text.length : 0) || 0 + let user = global.DATABASE.data.users[m.sender] + let me = PhoneNumber('+' + (conn.user && conn.user.jid).replace('@s.whatsapp.net', '')).getNumber('international') + console.log(`โ–ฃโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ยทยทยท +โ”‚ ${chalk.redBright('%s')}\nโ”‚โฐใ…ค${chalk.black(chalk.bgYellow('%s'))}\nโ”‚๐Ÿ“‘ใ…ค${chalk.black(chalk.bgGreen('%s'))}\nโ”‚๐Ÿ“Šใ…ค${chalk.magenta('%s [%s %sB]')} +โ”‚๐Ÿ“คใ…ค${chalk.green('%s')}\nโ”‚๐Ÿ“ƒใ…ค${chalk.yellow('%s%s')}\nโ”‚๐Ÿ“ฅใ…ค${chalk.green('%s')}\nโ”‚๐Ÿ’ฌใ…ค${chalk.black(chalk.bgYellow('%s'))} +โ–ฃโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ยทยทยท +`.trim(), + me + ' ~' + conn.user.name, + (m.messageTimestamp ? new Date(1000 * (m.messageTimestamp.low || m.messageTimestamp)) : new Date).toTimeString(), + m.messageStubType ? WAMessageStubType[m.messageStubType] : '', + filesize, + filesize === 0 ? 0 : (filesize / 1009 ** Math.floor(Math.log(filesize) / Math.log(1000))).toFixed(1), + ['', ...'KMGTP'][Math.floor(Math.log(filesize) / Math.log(1000))] || '', + sender, + m ? m.exp : '?', + user ? '|' + user.exp + '|' + user.limit : '' + ('|' + user.level), + m.chat + (chat ? ' ~' + chat : ''), + m.mtype ? m.mtype.replace(/message$/i, '').replace('audio', m.msg.ptt ? 'PTT' : 'audio').replace(/^./, v => v.toUpperCase()) : '' + ) + if (img) console.log(img.trimEnd()) + if (typeof m.text === 'string' && m.text) { + let log = m.text.replace(/\u200e+/g, '') + let mdRegex = /(?<=(?:^|[\s\n])\S?)(?:([*_~])(.+?)\1|```((?:.||[\n\r])+?)```)(?=\S?(?:[\s\n]|$))/g + let mdFormat = (depth = 4) => (_, type, text, monospace) => { + let types = { + _: 'italic', + '*': 'bold', + '~': 'strikethrough' + } + text = text || monospace + let formatted = !types[type] || depth < 1 ? text : chalk[types[type]](text.replace(mdRegex, mdFormat(depth - 1))) + // console.log({ depth, type, formatted, text, monospace }, formatted) + return formatted + } + if (log.length < 4096) + log = log.replace(urlRegex, (url, i, text) => { + let end = url.length + i + return i === 0 || end === text.length || (/^\s$/.test(text[end]) && /^\s$/.test(text[i - 1])) ? chalk.blueBright(url) : url + }) + log = log.replace(mdRegex, mdFormat(4)) + if (m.mentionedJid) for (let user of m.mentionedJid) log = log.replace('@' + user.split`@`[0], chalk.blueBright('@' + await conn.getName(user))) + console.log(m.error != null ? chalk.red(log) : m.isCommand ? chalk.yellow(log) : log) + } + if (m.messageStubParameters) console.log(m.messageStubParameters.map(jid => { + jid = conn.decodeJid(jid) + let name = conn.getName(jid) + return chalk.gray(PhoneNumber('+' + jid.replace('@s.whatsapp.net', '')).getNumber('international') + (name ? ' ~' + name : '')) + }).join(', ')) + if (/document/i.test(m.mtype)) console.log(`๐Ÿ“„ ${m.msg.filename || m.msg.displayName || 'Document'}`) + else if (/ContactsArray/i.test(m.mtype)) console.log(`๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ ${' ' || ''}`) + else if (/contact/i.test(m.mtype)) console.log(`๐Ÿ‘จ ${m.msg.displayName || ''}`) + else if (/audio/i.test(m.mtype)) (s = m.msg.seconds, console.log(`${m.msg.ptt ? '๐ŸŽค (PTT ' : '๐ŸŽต ('}AUDIO) ${Math.floor(s / 60).toString().padStart(2, 0)}:${(s % 60).toString().padStart(2, 0)}`)) + + console.log() + // if (m.quoted) console.log(m.msg.contextInfo) +} + +let file = require.resolve(__filename) +fs.watchFile(file, () => { + fs.unwatchFile(file) + console.log(chalk.redBright("Update 'lib/print.js'")) + delete require.cache[file] +}) diff --git a/lib/scrape.js b/lib/scrape.js new file mode 100644 index 0000000000000000000000000000000000000000..a57266cedcca2b4fecfeb538f6106d7870713746 --- /dev/null +++ b/lib/scrape.js @@ -0,0 +1,254 @@ +const cheerio = require('cheerio') +const fetch = require('node-fetch') +const axios = require("axios") +const qs = require("qs") + +function quotes(input) { + return new Promise((resolve, reject) => { + fetch('https://jagokata.com/kata-bijak/kata-' + input.replace(/\s/g, '_') + '.html?page=1') + .then(res => res.text()) + .then(res => { + const $ = cheerio.load(res) + data = [] + $('div[id="main"]').find('ul[id="citatenrijen"] > li').each(function (index, element) { + x = $(this).find('div[class="citatenlijst-auteur"] > a').text().trim() + y = $(this).find('span[class="auteur-beschrijving"]').text().trim() + z = $(element).find('q[class="fbquote"]').text().trim() + data.push({ author: x, bio: y, quote: z }) + }) + data.splice(2, 1) + if (data.length == 0) return resolve({ creator: 'stikerin', status: false }) + resolve({ creator: 'stikerin', status: true, data }) + }).catch(reject) + }) +} + +function joox(query) { + return new Promise((resolve, reject) => { + const time = Math.floor(new Date() / 1000) + axios.get('http://api.joox.com/web-fcgi-bin//web_search?lang=id&country=id&type=0&search_input=' + query + '&pn=1&sin=0&ein=29&_=' + time) + .then(({ data }) => { + let result = [] + let hasil = [] + let promoses = [] + let ids = [] + data.itemlist.forEach(result => { + ids.push(result.songid) + }); + for (let i = 0; i < data.itemlist.length; i++) { + const get = 'http://api.joox.com/web-fcgi-bin/web_get_songinfo?songid=' + ids[i] + promoses.push( + axios.get(get, { + headers: { + Cookie: 'wmid=142420656; user_type=1; country=id; session_key=2a5d97d05dc8fe238150184eaf3519ad;' + } + }) + .then(({ data }) => { + const res = JSON.parse(data.replace('MusicInfoCallback(', '').replace('\n)', '')) + hasil.push({ + lagu: res.msong, + album: res.malbum, + penyanyi: res.msinger, + publish: res.public_time, + img: res.imgSrc, + mp3: res.mp3Url + }) + Promise.all(promoses).then(() => resolve({ + creator: "ariffb", + status: true, + data: hasil, + })) + }).catch(reject) + ) + } + }).catch(reject) + }) +} + +function tiktok(url) { + return new Promise(async (resolve, reject) => { + axios.get('https://ttdownloader.com/', { + headers: { + "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + "cookie": "PHPSESSID=9ut8phujrprrmll6oc3bist01t; popCookie=1; _ga=GA1.2.1068750365.1625213061; _gid=GA1.2.842420949.1625213061" + } + }) + .then(({ data }) => { + const $ = cheerio.load(data) + let token = $('#token').attr('value') + let config = { + 'url': url, + 'format': '', + 'token': token + } + axios('https://ttdownloader.com/req/', { + method: 'POST', + data: new URLSearchParams(Object.entries(config)), + headers: { + "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + "cookie": "PHPSESSID=9ut8phujrprrmll6oc3bist01t; popCookie=1; _ga=GA1.2.1068750365.1625213061; _gid=GA1.2.842420949.1625213061" + } + }) + .then(({ data }) => { + const $ = cheerio.load(data) + resolve({ + nowm: $('div:nth-child(2) > div.download > a').attr('href'), + wm: $('div:nth-child(3) > div.download > a').attr('href'), + audio: $('div:nth-child(4) > div.download > a').attr('href') + }) + }) + }) + .catch(reject) + }) +} + +function twitter(url) { + return new Promise((resolve, reject) => { + let params = new URLSearchParams() + params.append('URL', url) + fetch('https://twdown.net/download.php', { method: 'POST', body: params }) + .then(res => res.text()) + .then(res => { + const $ = cheerio.load(res); + data = [] + $('div.container').find('tbody > tr > td').each(function (index, element) { + x = $(this).find('a').attr('href') + if (x !== '#') { + if (typeof x !== 'undefined') { + data.push({ url: x }) + } + } + }) + if (data.length == 0) return resolve({ status: false }) + resolve({ status: true, data }) + }).catch(reject) + }) +} + +function igdl(url) { + return new Promise(async (resolve, reject) => { + axios.request({ + url: 'https://www.instagramsave.com/download-instagram-videos.php', + method: 'GET', + headers: { + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + "cookie": "PHPSESSID=ugpgvu6fgc4592jh7ht9d18v49; _ga=GA1.2.1126798330.1625045680; _gid=GA1.2.1475525047.1625045680; __gads=ID=92b58ed9ed58d147-221917af11ca0021:T=1625045679:RT=1625045679:S=ALNI_MYnQToDW3kOUClBGEzULNjeyAqOtg" + } + }) + .then(({ data }) => { + const $ = cheerio.load(data) + const token = $('#token').attr('value') + let config = { + headers: { + 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', + "sec-ch-ua": '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"', + "cookie": "PHPSESSID=ugpgvu6fgc4592jh7ht9d18v49; _ga=GA1.2.1126798330.1625045680; _gid=GA1.2.1475525047.1625045680; __gads=ID=92b58ed9ed58d147-221917af11ca0021:T=1625045679:RT=1625045679:S=ALNI_MYnQToDW3kOUClBGEzULNjeyAqOtg", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + }, + data: { + 'url': url, + 'action': 'post', + 'token': token + } + } + axios.post('https://www.instagramsave.com/system/action.php', qs.stringify(config.data), { headers: config.headers }) + .then(({ data }) => { + resolve(data.medias) + }) + }) + .catch(reject) + }) +} + +function igstory(username) { + return new Promise(async (resolve, reject) => { + axios.request({ + url: 'https://www.instagramsave.com/instagram-story-downloader.php', + method: 'GET', + headers: { + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + "cookie": "PHPSESSID=ugpgvu6fgc4592jh7ht9d18v49; _ga=GA1.2.1126798330.1625045680; _gid=GA1.2.1475525047.1625045680; __gads=ID=92b58ed9ed58d147-221917af11ca0021:T=1625045679:RT=1625045679:S=ALNI_MYnQToDW3kOUClBGEzULNjeyAqOtg" + } + }) + .then(({ data }) => { + const $ = cheerio.load(data) + const token = $('#token').attr('value') + let config = { + headers: { + 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', + "sec-ch-ua": '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"', + "cookie": "PHPSESSID=ugpgvu6fgc4592jh7ht9d18v49; _ga=GA1.2.1126798330.1625045680; _gid=GA1.2.1475525047.1625045680; __gads=ID=92b58ed9ed58d147-221917af11ca0021:T=1625045679:RT=1625045679:S=ALNI_MYnQToDW3kOUClBGEzULNjeyAqOtg", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + }, + data: { + 'url': 'https://www.instagram.com/' + username, + 'action': 'story', + 'token': token + } + } + axios.post('https://www.instagramsave.com/system/action.php', qs.stringify(config.data), { headers: config.headers }) + .then(({ data }) => { + resolve(data.medias) + }) + }) + .catch(reject) + }) +} + +function pin(url) { + return new Promise(async (resolve, reject) => { + let form = new URLSearchParams() + form.append('url', url) + let html = await (await fetch('https://pinterestvideodownloader.com/', { method: 'POST', body: form })).text() + $ = cheerio.load(html) + let data = [] + $('table > tbody > tr').each(function (i, e) { + if ($($(e).find('td')[0]).text() != '') data.push({ + url: $($(e).find('td')[0]).find('a').attr('href') + }) + }) + if (data.length == 0) return resolve({ status: false }) + resolve({ status: true, data }) + }) +} + + +let is = { + headers: { + 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', + "sec-ch-ua": '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"', + "cookie": "PHPSESSID=ugpgvu6fgc4592jh7ht9d18v49; _ga=GA1.2.1126798330.1625045680; _gid=GA1.2.1475525047.1625045680; __gads=ID=92b58ed9ed58d147-221917af11ca0021:T=1625045679:RT=1625045679:S=ALNI_MYnQToDW3kOUClBGEzULNjeyAqOtg", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + } +} + +function _token(host) { + return new Promise(async (resolve, reject) => { + axios.request({ + url: host, method: 'GET', headers: { + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + "cookie": "PHPSESSID=ugpgvu6fgc4592jh7ht9d18v49; _ga=GA1.2.1126798330.1625045680; _gid=GA1.2.1475525047.1625045680; __gads=ID=92b58ed9ed58d147-221917af11ca0021:T=1625045679:RT=1625045679:S=ALNI_MYnQToDW3kOUClBGEzULNjeyAqOtg" + } + }).then(({ data }) => { + let $ = cheerio.load(data) + let token = $('#token').attr('value') + resolve(token) + }) + }) +} + +function facebook(url) { + return new Promise(async (resolve, reject) => { + let host = 'https://aiovideodl.ml/' + let form = { data: { 'url': url, 'token': (await _token(host)) } } + axios.post(host + '/system/action.php', qs.stringify(form.data), { headers: is.headers }) + .then(({ data }) => { + if (data.links.lenght == 0) return resolve({ creator: '@neoxrs โ€“ Wildan Izzudin', status: false }) + resolve({ creator: '@neoxrs โ€“ Wildan Izzudin', status: true, data: data.links }) + }) + }) +} + +module.exports = { facebook, quotes, igdl, igstory, tiktok, twitter, joox, pin } diff --git a/lib/simple.js b/lib/simple.js new file mode 100644 index 0000000000000000000000000000000000000000..f99beae2aef1efbc7c888a4c384fd78de764a803 --- /dev/null +++ b/lib/simple.js @@ -0,0 +1,1638 @@ +const { imageToWebp, videoToWebp, writeExifImg, writeExifVid } = require('../lib/exif') +const { + default: makeWASocket, + makeWALegacySocket, + extractMessageContent, + makeInMemoryStore, + proto, + prepareWAMessageMedia, + downloadContentFromMessage, + getBinaryNodeChild, + jidDecode, + areJidsSameUser, + generateForwardMessageContent, + generateWAMessageFromContent, + WAMessageStubType, + WA_DEFAULT_EPHEMERAL, +} = require('@adiwajshing/baileys') +const { toAudio, toPTT, toVideo } = require('./converter') +const chalk = require('chalk') +const fetch = require('node-fetch') +const FileType = require('file-type') +const PhoneNumber = require('awesome-phonenumber') +const fs = require('fs') +const path = require('path') +const jimp = require('jimp') +const pino = require('pino') +const util = require('util') +const store = makeInMemoryStore({ logger: pino().child({ level: 'silent', stream: 'store' }) }) + + +exports.makeWASocket = (connectionOptions, options = {}) => { + let conn = (opts['legacy'] ? makeWALegacySocket : makeWASocket)(connectionOptions) + // conn.ws.on('CB:stream:error', (stream) => { + // const { code } = stream || {} + // if (code == '401') conn.ev.emit('connection.update', { + // connection: 'logged Out', + // lastDisconnect: { + // error: { + // output: { + // statusCode: DisconnectReason.loggedOut + // } + // }, + // date: new Date() + // } + // }) + // }) + conn.decodeJid = (jid) => { + if (!jid) return jid + if (/:\d+@/gi.test(jid)) { + const decode = jidDecode(jid) || {} + return decode.user && decode.server && decode.user + '@' + decode.server || jid + } else return jid + } + if (conn.user && conn.user.id) conn.user.jid = conn.decodeJid(conn.user.id) + if (!conn.chats) conn.chats = {} + + function updateNameToDb(contacts) { + if (!contacts) return + for (const contact of contacts) { + const id = conn.decodeJid(contact.id) + if (!id) continue + let chats = conn.chats[id] + if (!chats) chats = conn.chats[id] = { id } + conn.chats[id] = { + ...chats, + ...({ + ...contact, id, ...(id.endsWith('@g.us') ? + { subject: contact.subject || chats.subject || '' } : + { name: contact.notify || chats.name || chats.notify || '' }) + } || {}) + } + } + } + + + conn.ev.on('contacts.upsert', updateNameToDb) + conn.ev.on('groups.update', updateNameToDb) + conn.ev.on('chats.set', async ({ chats }) => { + for (const { id, name, readOnly } of chats) { + id = conn.decodeJid(id) + if (!id) continue + const isGroup = id.endsWith('@g.us') + let chats = conn.chats[id] + if (!chats) chats = conn.chats[id] = { id } + chats.isChats = !readOnly + if (name) chats[isGroup ? 'subject' : 'name'] = name + if (isGroup) { + const metadata = await conn.groupMetadata(id).catch(_ => null) + if (!metadata) continue + chats.subject = name || metadata.subject + chats.metadata = metadata + } + } + }) + conn.ev.on('group-participants.update', async function updateParticipantsToDb({ id, participants, action }) { + id = conn.decodeJid(id) + if (!(id in conn.chats)) conn.chats[id] = { id } + conn.chats[id].isChats = true + const groupMetadata = await conn.groupMetadata(id).catch(_ => null) + if (!groupMetadata) return + conn.chats[id] = { + ...conn.chats[id], + subject: groupMetadata.subject, + metadata: groupMetadata + } + }) + + conn.ev.on('groups.update', async function groupUpdatePushToDb(groupsUpdates) { + for (const update of groupsUpdates) { + const id = conn.decodeJid(update.id) + if (!id) continue + const isGroup = id.endsWith('@g.us') + if (!isGroup) continue + let chats = conn.chats[id] + if (!chats) chats = conn.chats[id] = { id } + chats.isChats = true + const metadata = await conn.groupMetadata(id).catch(_ => null) + if (!metadata) continue + chats.subject = metadata.subject + chats.metadata = metadata + } + }) + conn.ev.on('chats.upsert', async function chatsUpsertPushToDb(chatsUpsert) { + console.log({ chatsUpsert }) + const { id, name } = chatsUpsert + if (!id) return + let chats = conn.chats[id] = { ...conn.chats[id], ...chatsUpsert, isChats: true } + const isGroup = id.endsWith('@g.us') + if (isGroup) { + const metadata = await conn.groupMetadata(id).catch(_ => null) + if (metadata) { + chats.subject = name || metadata.subject + chats.metadata = metadata + } + const groups = await conn.groupFetchAllParticipating().catch(_ => ({})) || {} + for (const group in groups) conn.chats[group] = { id: group, subject: groups[group].subject, isChats: true, metadata: groups[group] } + } + }) + conn.ev.on('presence.update', async function presenceUpdatePushToDb({ id, presences }) { + const sender = Object.keys(presences)[0] || id + const _sender = conn.decodeJid(sender) + const presence = presences[sender]['lastKnownPresence'] || 'composing' + let chats = conn.chats[_sender] + if (!chats) chats = conn.chats[_sender] = { id: sender } + chats.presences = presence + if (id.endsWith('@g.us')) { + let chats = conn.chats[id] + if (!chats) { + const metadata = await conn.groupMetadata(id).catch(_ => null) + if (metadata) chats = conn.chats[id] = { id, subject: metadata.subject, metadata } + } + chats.isChats = true + } + }) + + conn.logger = { + ...conn.logger, + info(...args) { console.log(chalk.bold.rgb(57, 183, 16)(`INFO [${chalk.rgb(255, 255, 255)(new Date())}]:`), chalk.cyan(util.format(...args))) }, + error(...args) { console.log(chalk.bold.rgb(247, 38, 33)(`ERROR [${chalk.rgb(255, 255, 255)(new Date())}]:`), chalk.rgb(255, 38, 0)(util.format(...args))) }, + warn(...args) { console.log(chalk.bold.rgb(239, 225, 3)(`WARNING [${chalk.rgb(255, 255, 255)(new Date())}]:`), chalk.keyword('orange')(util.format(...args))) } + } + + + /** + * getBuffer hehe + * @param {fs.PathLike} path + * @param {Boolean} returnFilename + */ + conn.getFile = async (PATH, returnAsFilename) => { + let res, filename + let data = Buffer.isBuffer(PATH) ? PATH : /^data:.*?\/.*?;base64,/i.test(PATH) ? Buffer.from(PATH.split`,`[1], 'base64') : /^https?:\/\//.test(PATH) ? await (res = await fetch(PATH)).buffer() : fs.existsSync(PATH) ? (filename = PATH, fs.readFileSync(PATH)) : typeof PATH === 'string' ? PATH : Buffer.alloc(0) + if (!Buffer.isBuffer(data)) throw new TypeError('Result is not a buffer') + let type = await FileType.fromBuffer(data) || { + mime: 'application/octet-stream', + ext: '.bin' + } + if (data && returnAsFilename && !filename) (filename = path.join(__dirname, '../tmp/' + new Date * 1 + '.' + type.ext), await fs.promises.writeFile(filename, data)) + return { + res, + filename, + ...type, + data + } + } + + /** + * waitEvent + * @param {Partial|String} eventName + * @param {Boolean} is + * @param {Number} maxTries + * @returns + */ + conn.waitEvent = (eventName, is = () => true, maxTries = 25) => { + return new Promise((resolve, reject) => { + let tries = 0 + let on = (...args) => { + if (++tries > maxTries) reject('Max tries reached') + else if (is()) { + conn.ev.off(eventName, on) + resolve(...args) + } + } + conn.ev.on(eventName, on) + }) + } + + conn.delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)) + + /** + * + * @param {String} text + * @returns + */ + conn.filter = (text) => { + let mati = ["q", "w", "r", "t", "y", "p", "s", "d", "f", "g", "h", "j", "k", "l", "z", "x", "c", "v", "b", "n", "m"] + if (/[aiueo][aiueo]([qwrtypsdfghjklzxcvbnm])?$/i.test(text)) return text.substring(text.length - 1) + else { + let res = Array.from(text).filter(v => mati.includes(v)) + let resu = res[res.length - 1] + for (let huruf of mati) { + if (text.endsWith(huruf)) { + resu = res[res.length - 2] + } + } + let misah = text.split(resu) + return resu + misah[misah.length - 1] + } + } + + /** + * ms to date + * @param {String} ms + */ + conn.msToDate = (ms) => { + let days = Math.floor(ms / (24 * 60 * 60 * 1000)); + let daysms = ms % (24 * 60 * 60 * 1000); + let hours = Math.floor((daysms) / (60 * 60 * 1000)); + let hoursms = ms % (60 * 60 * 1000); + let minutes = Math.floor((hoursms) / (60 * 1000)); + let minutesms = ms % (60 * 1000); + let sec = Math.floor((minutesms) / (1000)); + return days + " Hari " + hours + " Jam " + minutes + " Menit"; + // +minutes+":"+sec; + } + + /** + * isi + */ + conn.rand = async (isi) => { + return isi[Math.floor(Math.random() * isi.length)] + } + + /** + * For Resize the Image By Aine + * @param {Buffer} image + * @param {String} ukuran height + * @param {String} ukuran weight + * @returns + */ + + conn.resize = async (buffer, uk1, uk2) => { + return new Promise(async(resolve, reject) => { + var baper = await jimp.read(buffer); + var ab = await baper.resize(uk1, uk2).getBufferAsync(jimp.MIME_JPEG) + resolve(ab) + }) + } + + /** + * Send Media All Type + * @param {String} jid + * @param {String|Buffer} path + * @param {Object} quoted + * @param {Object} options + */ + conn.sendMedia = async (jid, path, quoted, options = {}) => { + let { ext, mime, data } = await conn.getFile(path) + messageType = mime.split("/")[0] + pase = messageType.replace('application', 'document') || messageType + return await conn.sendMessage(jid, { [`${pase}`]: data, mimetype: mime, ...options }, { quoted }) + } + + /** + * Send Media/File with Automatic Type Specifier + * @param {String} jid + * @param {String|Buffer} path + * @param {String} filename + * @param {String} caption + * @param {proto.WebMessageInfo} quoted + * @param {Boolean} ptt + * @param {Object} options + */ + conn.getFile = async (PATH, returnAsFilename) => { + let res, filename + let data = Buffer.isBuffer(PATH) ? PATH : /^data:.*?\/.*?;base64,/i.test(PATH) ? Buffer.from(PATH.split`,`[1], 'base64') : /^https?:\/\//.test(PATH) ? await (res = await fetch(PATH)).buffer() : fs.existsSync(PATH) ? (filename = PATH, fs.readFileSync(PATH)) : typeof PATH === 'string' ? PATH : Buffer.alloc(0) + if (!Buffer.isBuffer(data)) throw new TypeError('Result is not a buffer') + let type = await FileType.fromBuffer(data) || { + mime: 'application/octet-stream', + ext: '.bin' + } + if (data && returnAsFilename && !filename) (filename = path.join(__dirname, '../tmp/' + new Date * 1 + '.' + type.ext), await fs.promises.writeFile(filename, data)) + return { + res, + filename, + ...type, + data + } + } + /** + * Send Media/File with Automatic Type Specifier + * @param {String} jid + * @param {String|Buffer} path + * @param {String} filename + * @param {String} caption + * @param {Object} quoted + * @param {Boolean} ptt + * @param {Object} options + */ + conn.sendFile = async (jid, path, filename = '', caption = '', quoted, ptt = false, options = {}) => { + let type = await conn.getFile(path, true) + let { res, data: file, filename: pathFile } = type + if (res && res.status !== 200 || file.length <= 65536) { + try { throw { json: JSON.parse(file.toString()) } } + catch (e) { if (e.json) throw e.json } + } + let opt = { filename } + if (quoted) opt.quoted = quoted + if (!type) if (options.asDocument) options.asDocument = true + let mtype = '', mimetype = type.mime + if (/webp/.test(type.mime)) mtype = 'sticker' + else if (/image/.test(type.mime)) mtype = 'image' + else if (/video/.test(type.mime)) mtype = 'video' + else if (/audio/.test(type.mime)) ( + convert = await (ptt ? toPTT : toAudio)(file, type.ext), + file = convert.data, + pathFile = convert.filename, + mtype = 'audio', + mimetype = 'audio/ogg; codecs=opus' + ) + else mtype = 'document' + return await conn.sendMessage(jid, { + ...options, + caption, + ptt, + [mtype]: { url: pathFile }, + mimetype + }, { + ...opt, + ...options + }) + } + //Wm Sticker + conn.sendImageAsSticker = async (jid, path, quoted, options = {}) => { + let buff = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await (await fetch(path)).buffer() : fs.existsSync(path) ? fs.readFileSync(path) : Buffer.alloc(0) + let buffer + if (options && (options.packname || options.author)) { + buffer = await writeExifImg(buff, options) + } else { + buffer = await imageToWebp(buff) + } + + await conn.sendMessage(jid, { sticker: { url: buffer }, ...options }, { quoted }) + return buffer + } + conn.sendVideoAsSticker = async (jid, path, quoted, options = {}) => { + let buff = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await (await fetch(path)).buffer() : fs.existsSync(path) ? fs.readFileSync(path) : Buffer.alloc(0) + let buffer + if (options && (options.packname || options.author)) { + buffer = await writeExifVid(buff, options) + } else { + buffer = await videoToWebp(buff) + } + + await conn.sendMessage(jid, { sticker: { url: buffer }, ...options }, { quoted }) + return buffer + } + /** + * Send Contact + * @param {String} jid + * @param {String[][]} data + * @param {proto.WebMessageInfo} quoted + * @param {Object} options + */ + conn.sendContact = async (jid, data, quoted, options) => { + let contacts = [] + for (let [number, name] of data) { + number = number.replace(/[^0-9]/g, '') + let njid = number + '@s.whatsapp.net' + let biz = await conn.getBusinessProfile(njid) || {} + // N:;${name.replace(/\n/g, '\\n').split(' ').reverse().join(';')};;; + let vcard = ` +BEGIN:VCARD +VERSION:3.0 +FN:${name.replace(/\n/g, '\\n')} +item1.TEL;waid=${number}:${PhoneNumber('+' + number).getNumber('international')} +item1.X-ABLabel:Ponsel${biz.description ? ` +PHOTO;BASE64:${(await conn.getFile(await conn.profilePictureUrl(njid)).catch(_ => ({})) || {}).data?.toString('base64')} +X-WA-BIZ-DESCRIPTION:${(biz.description || '').replace(/\n/g, '\\n')} +X-WA-BIZ-NAME:${(((conn.chats[njid] || {}) || { vname: conn.chats[njid]?.name }).vname || conn.getName(njid) || name).replace(/\n/, '\\n')} +`.trim() : ''} +END:VCARD +`.trim() + contacts.push({ vcard, displayName: name }) + + } + return await conn.sendMessage(jid, { + contacts: { + ...options, + displayName: (contacts.length > 1 ? `${contacts.length} kontak` : contacts[0].displayName) || null, + contacts, + }, + quoted, ...options + }) + } + + /** + * Reply to a message + * @param {String} jid + * @param {String|Object} text + * @param {Object} quoted + * @param {Object} options + */ + conn.reply = (jid, text = '', quoted, options) => { + return Buffer.isBuffer(text) ? this.sendFile(jid, text, 'file', '', quoted, false, options) : conn.sendMessage(jid, { ...options, text, mentions: conn.parseMention(text) }, { quoted, ...options, mentions: conn.parseMention(text) }) + } + + conn.decodeJid = (jid) => { + if (!jid) return jid + if (/:\d+@/gi.test(jid)) { + let decode = jidDecode(jid) || {} + return decode.user && decode.server && decode.user + '@' + decode.server || jid + } else return jid + } + + /** + * + * @param {*} jid + * @param {*} text + * @param {*} quoted + * @param {*} options + * @returns + */ + conn.sendText = (jid, text, quoted = '', options) => conn.sendMessage(jid, { text: text, ...options }, { quoted }) + + /** + * sendGroupV4Invite + * @param {String} jid + * @param {*} participant + * @param {String} inviteCode + * @param {Number} inviteExpiration + * @param {String} groupName + * @param {String} caption + * @param {*} options + * @returns + */ + conn.sendGroupV4Invite = async (jid, participant, inviteCode, inviteExpiration, groupName = 'unknown subject', caption = 'Invitation to join my WhatsApp group', options = {}) => { + let msg = proto.Message.fromObject({ + groupInviteMessage: proto.GroupInviteMessage.fromObject({ + inviteCode, + inviteExpiration: parseInt(inviteExpiration) || + new Date(new Date + (3 * 86400000)), + groupJid: jid, + groupName: groupName ? groupName : this.getName(jid), + caption + }) + }) + let message = await this.prepareMessageFromContent(participant, msg, options) + await this.relayWAMessage(message) + return message + } + + /** + * send Button + * @param {String} jid + * @param {String} contentText + * @param {String} footer + * @param {Buffer|String} buffer + * @param {String[]} buttons + * @param {proto.WebMessageInfo} quoted + * @param {Object} options + */ + conn.sendButton = async (jid, contentText, footer, buffer, buttons, quoted, options) => { + if (buffer) try { buffer = (await conn.getFile(buffer)).data } catch { buffer = null } + let message = { + ...options, + ...(buffer ? { caption: contentText || '' } : { text: contentText || '' }), + footer, + buttons: buttons.map(btn => { + return { + buttonId: btn[1] || btn[0] || '', + buttonText: { + displayText: btn[0] || btn[1] || '' + } + } + }), + ...(buffer ? { image: buffer } : {}) + } + return await conn.sendMessage(jid, message, { + quoted, + upload: conn.waUploadToServer, + ...options + }) + } + + conn.sendBut = async(jid, content, footer, button1, row1, quoted) => { + const buttons = [ + {buttonId: row1, buttonText: {displayText: button1}, type: 1} + ] +const buttonMessage = { + text: content, + footer: footer, + buttons: buttons, + headerType: 1, + mentions: conn.parseMention(footer+content) +} +return await conn.sendMessage(jid, buttonMessage, {quoted}) + } + + conn.send2But = async(jid, content, footer, button1, row1, button2, row2, quoted) => { + const buttons = [ + { buttonId: row1, buttonText: { displayText: button1 }, type: 1 }, + { buttonId: row2, buttonText: { displayText: button2 }, type: 1 } + ] +const buttonMessage = { + text: content, + footer: footer, + buttons: buttons, + headerType: 1 +} +return await conn.sendMessage(jid, buttonMessage, {quoted}) + } + + conn.send3But = async(jid, content, footer,button1, row1, button2, row2, button3, row3, quoted) => { + const buttons = [ + { buttonId: row1, buttonText: { displayText: button1 }, type: 1 }, + { buttonId: row2, buttonText: { displayText: button2 }, type: 1 }, + { buttonId: row3, buttonText: { displayText: button3 }, type: 1 } + ] +const buttonMessage = { + text: content, + footer: footer, + buttons: buttons, + headerType: 1 +} +return await conn.sendMessage(jid, buttonMessage, {quoted}) + } + conn.send4But = async(jid, content, footer,button1, row1, button2, row2, button3, row3, button4, row4, quoted) => { + const buttons = [ + { buttonId: row1, buttonText: { displayText: button1 }, type: 1 }, + { buttonId: row2, buttonText: { displayText: button2 }, type: 1 }, + { buttonId: row3, buttonText: { displayText: button3 }, type: 1 }, + { buttonId: row4, buttonText: { displayText: button4 }, type: 1 } + ] +const buttonMessage = { + text: content, + footer: footer, + buttons: buttons, + headerType: 1 +} +return await conn.sendMessage(jid, buttonMessage, {quoted}) +} + /** + * send Button Img + * @param {String} jid + * @param {String} contentText + * @param {String} footer + * @param {Buffer|String} buffer + * @param {String[]} buttons + * @param {Object} quoted + * @param {Object} options + */ + conn.sendButtonImg = async (jid, buffer, contentText, footerText, button1, id1, quoted, options) => { + let type = await conn.getFile(buffer) + let { res, data: file } = type + if (res && res.status !== 200 || file.length <= 65536) { + try { throw { json: JSON.parse(file.toString()) } } + catch (e) { if (e.json) throw e.json } + } + const buttons = [ + { buttonId: id1, buttonText: { displayText: button1 }, type: 1 } + ] + + const buttonMessage = { + image: file, + fileLength: 887890909999999, + caption: contentText, + footer: footerText, + mentions: await conn.parseMention(contentText + footerText), + ...options, + buttons: buttons, + headerType: 4 + } + + return await conn.sendMessage(jid, buttonMessage, { quoted, ephemeralExpiration: 86400, contextInfo: { mentionedJid: conn.parseMention(contentText + footerText) }, ...options }) + } + conn.send2ButtonImg = async (jid, buffer, contentText, footerText, button1, id1, button2, id2, quoted, options) => { + let type = await conn.getFile(buffer) + let { res, data: file } = type + if (res && res.status !== 200 || file.length <= 65536) { + try { throw { json: JSON.parse(file.toString()) } } + catch (e) { if (e.json) throw e.json } + } + const buttons = [ + { buttonId: id1, buttonText: { displayText: button1 }, type: 1 }, + { buttonId: id2, buttonText: { displayText: button2 }, type: 1 } + ] + + const buttonMessage = { + image: file, + fileLength: 887890909999999, + caption: contentText, + footer: footerText, + mentions: await conn.parseMention(contentText + footerText), + ...options, + buttons: buttons, + headerType: 4 + } + + return await conn.sendMessage(jid, buttonMessage, { quoted, ephemeralExpiration: 86400, contextInfo: { mentionedJid: conn.parseMention(contentText + footerText) }, ...options }) + } + conn.send3ButtonImg = async (jid, buffer, contentText, footerText, button1, id1, button2, id2, button3, id3, quoted, options) => { + let type = await conn.getFile(buffer) + let { res, data: file } = type + if (res && res.status !== 200 || file.length <= 65536) { + try { throw { json: JSON.parse(file.toString()) } } + catch (e) { if (e.json) throw e.json } + } + const buttons = [ + { buttonId: id1, buttonText: { displayText: button1 }, type: 1 }, + { buttonId: id2, buttonText: { displayText: button2 }, type: 1 }, + { buttonId: id3, buttonText: { displayText: button3 }, type: 1 } + ] + + const buttonMessage = { + image: file, + fileLength: 887890909999999, + caption: contentText, + footer: footerText, + mentions: await conn.parseMention(contentText + footerText), + ...options, + buttons: buttons, + headerType: 4 + } + + return await conn.sendMessage(jid, buttonMessage, { quoted, ephemeralExpiration: 86400, contextInfo: { mentionedJid: conn.parseMention(contentText + footerText) }, ...options }) + } + + conn.sendH3Button = async (jid, content, displayText, link, displayCall, number, quickReplyText, id, quickReplyText2, id2, quickReplyText3, id3, quoted) => { + let template = generateWAMessageFromContent(jid, proto.Message.fromObject({ + templateMessage: { + hydratedTemplate: { + hydratedContentText: content, + hydratedButtons: [{ + urlButton: { + displayText: displayText, + url: link + } + }, { + callButton: { + displayText: displayCall, + phoneNumber: number + } + }, + { + quickReplyButton: { + displayText: quickReplyText, + id: id, + } + + }, + { + quickReplyButton: { + displayText: quickReplyText2, + id: id2, + } + }, + { + quickReplyButton: { + displayText: quickReplyText3, + id: id3, + } + }] + } + } + }), { userJid: conn.user.jid, quoted: quoted}); + return await conn.relayMessage( + jid, + template.message, + { messageId: template.key.id } + ) + } + + conn.cMod = (jid, message, text = '', sender = conn.user.jid, options = {}) => { + let copy = message.toJSON() + let mtype = Object.keys(copy.message)[0] + let isEphemeral = false // mtype === 'ephemeralMessage' + if (isEphemeral) { + mtype = Object.keys(copy.message.ephemeralMessage.message)[0] + } + let msg = isEphemeral ? copy.message.ephemeralMessage.message : copy.message + let content = msg[mtype] + if (typeof content === 'string') msg[mtype] = text || content + else if (content.caption) content.caption = text || content.caption + else if (content.text) content.text = text || content.text + if (typeof content !== 'string') msg[mtype] = { ...content, ...options } + if (copy.participant) sender = copy.participant = sender || copy.participant + else if (copy.key.participant) sender = copy.key.participant = sender || copy.key.participant + if (copy.key.remoteJid.includes('@s.whatsapp.net')) sender = sender || copy.key.remoteJid + else if (copy.key.remoteJid.includes('@broadcast')) sender = sender || copy.key.remoteJid + copy.key.remoteJid = jid + copy.key.fromMe = areJidsSameUser(sender, conn.user.id) || false + return proto.WebMessageInfo.fromObject(copy) + } + conn.sendHButtonLoc = async (jid, buffer, content, footer, distek, link1, quick1, id1,quoted) => { + let template = generateWAMessageFromContent(jid, proto.Message.fromObject({ + templateMessage: { + hydratedTemplate: { + hydratedContentText: content, + mentions: conn.parseMention(content + footer), + locationMessage: { + jpegThumbnail: buffer }, + hydratedFooterText: footer, + mentions: conn.parseMention(content + footer), + hydratedButtons: [{ + urlButton: { + displayText: distek, + url: link1 + } + }, { + quickReplyButton: { + displayText:quick1, + id: id1 + } + }], mentions: conn.parseMention(content + footer) + } + } + }), { userJid: conn.user.jid, quoted: quoted, mentions: conn.parseMention(content + footer)}); + return await conn.relayMessage( + jid, + template.message, + { messageId: template.key.id } + ) + } + + conn.sendHButt = async (jid, content, distek, link, discall, number, retek, id,quoted) => { + let template = generateWAMessageFromContent(jid, proto.Message.fromObject({ + templateMessage: { + hydratedTemplate: { + hydratedContentText: content, + hydratedButtons: [{ + urlButton: { + displayText: distek, + url: link + } + }, { + callButton: { + displayText: discall, + phoneNumber: number + } + }, + { + quickReplyButton: { + displayText:retek, + id: id + } + } + ] + } + } + }), { userJid: conn.user.jid, quoted: quoted}); + return await conn.relayMessage( + jid, + template.message, + { messageId: template.key.id } + ) + } + conn.sendButtonLoc= async (jid, buffer, content, footer, button1, row1, quoted, options = {}) => { + let buttons = [{buttonId: row1, buttonText: {displayText: button1}, type: 1}] + let buttonMessage = { + location: { jpegThumbnail: buffer }, + caption: content, + footer: footer, + buttons: buttons, + headerType: 6 +} + return await conn.sendMessage(jid, buttonMessage, { + quoted, + upload: conn.waUploadToServer, + ...options + }) + } + conn.send2ButtonLoc= async (jid, buffer, content, footer, button1, row1, button2, row2, quoted, options = {}) => { + let buttons = [{buttonId: row1, buttonText: {displayText: button1}, type: 1}, + { buttonId: row2, buttonText: { displayText: button2 }, type: 1 }] + let buttonMessage = { + location: { jpegThumbnail: buffer }, + caption: content, + footer: footer, + buttons: buttons, + headerType: 6 +} + return await conn.sendMessage(jid, buttonMessage, { + quoted, + upload: conn.waUploadToServer, + ...options + }) + } + conn.send3ButtonLoc= async (jid, buffer, content, footer, button1, row1, button2, row2, quoted, options = {}) => { + let buttons = [{buttonId: row1, buttonText: {displayText: button1}, type: 1}, + { buttonId: row2, buttonText: { displayText: button2 }, type: 1 }, + { buttonId: row3, buttonText: { displayText: button3 }, type: 1 } + ] + let buttonMessage = { + location: { jpegThumbnail: buffer }, + caption: content, + footer: footer, + buttons: buttons, + headerType: 6 +} + return await conn.sendMessage(jid, buttonMessage, { + quoted, + upload: conn.waUploadToServer, + ...options + }) + } + /** + * send Button Vid + * @param {String} jid + * @param {String} contentText + * @param {String} footer + * @param {Buffer|String} buffer + * @param {String} buttons1 + * @param {String} row1 + * @param {Object} quoted + * @param {Object} options + */ + conn.sendButtonVid = async (jid, buffer, contentText, footerText, button1, id1, quoted, options) => { + let type = await conn.getFile(buffer) + let { res, data: file } = type + if (res && res.status !== 200 || file.length <= 65536) { + try { throw { json: JSON.parse(file.toString()) } } + catch (e) { if (e.json) throw e.json } + } + let buttons = [ + { buttonId: id1, buttonText: { displayText: button1 }, type: 1 } + ] + const buttonMessage = { + video: file, + fileLength: 887890909999999, + caption: contentText, + footer: footerText, + mentions: await conn.parseMention(contentText), + ...options, + buttons: buttons, + headerType: 4 + } + return await conn.sendMessage(jid, buttonMessage, { + quoted, + ephemeralExpiration: 86400, + ...options + }) + } + /** + * cMod + * @param {String} jid + * @param {*} message + * @param {String} text + * @param {String} sender + * @param {*} options + * @returns + */ + + conn.cMod = async (jid, message, text = '', sender = conn.user.jid, options = {}) => { + if (options.mentions && !Array.isArray(options.mentions)) options.mentions = [options.mentions] + let copy = message.toJSON() + delete copy.message.messageContextInfo + delete copy.message.senderKeyDistributionMessage + let mtype = Object.keys(copy.message)[0] + let msg = copy.message + let content = msg[mtype] + if (typeof content === 'string') msg[mtype] = text || content + else if (content.caption) content.caption = text || content.caption + else if (content.text) content.text = text || content.text + if (typeof content !== 'string') { + msg[mtype] = { ...content, ...options } + msg[mtype].contextInfo = { + ...(content.contextInfo || {}), + mentionedJid: options.mentions || content.contextInfo?.mentionedJid || [] + } + } + if (copy.participant) sender = copy.participant = sender || copy.participant + else if (copy.key.participant) sender = copy.key.participant = sender || copy.key.participant + if (copy.key.remoteJid.includes('@s.whatsapp.net')) sender = sender || copy.key.remoteJid + else if (copy.key.remoteJid.includes('@broadcast')) sender = sender || copy.key.remoteJid + copy.key.remoteJid = jid + copy.key.fromMe = areJidsSameUser(sender, conn.user.id) || false + return proto.WebMessageInfo.fromObject(copy) + } + + /** + * cMods + * @param {String} jid + * @param {proto.WebMessageInfo} message + * @param {String} text + * @param {String} sender + * @param {*} options + * @returns + */ + conn.cMods = (jid, message, text = '', sender = conn.user.jid, options = {}) => { + let copy = message.toJSON() + let mtype = Object.keys(copy.message)[0] + let isEphemeral = false // mtype === 'ephemeralMessage' + if (isEphemeral) { + mtype = Object.keys(copy.message.ephemeralMessage.message)[0] + } + let msg = isEphemeral ? copy.message.ephemeralMessage.message : copy.message + let content = msg[mtype] + if (typeof content === 'string') msg[mtype] = text || content + else if (content.caption) content.caption = text || content.caption + else if (content.text) content.text = text || content.text + if (typeof content !== 'string') msg[mtype] = { ...content, ...options } + if (copy.participant) sender = copy.participant = sender || copy.participant + else if (copy.key.participant) sender = copy.key.participant = sender || copy.key.participant + if (copy.key.remoteJid.includes('@s.whatsapp.net')) sender = sender || copy.key.remoteJid + else if (copy.key.remoteJid.includes('@broadcast')) sender = sender || copy.key.remoteJid + copy.key.remoteJid = jid + copy.key.fromMe = areJidsSameUser(sender, conn.user.id) || false + return proto.WebMessageInfo.fromObject(copy) + } + + + + /** + * Exact Copy Forward + * @param {String} jid + * @param {proto.WebMessageInfo} message + * @param {Boolean|Number} forwardingScore + * @param {Object} options + */ + conn.copyNForward = async (jid, message, forwardingScore = true, options = {}) => { + let m = generateForwardMessageContent(message, !!forwardingScore) + let mtype = Object.keys(m)[0] + if (forwardingScore && typeof forwardingScore == 'number' && forwardingScore > 1) m[mtype].contextInfo.forwardingScore += forwardingScore + m = generateWAMessageFromContent(jid, m, { ...options, userJid: conn.user.id }) + await conn.relayMessage(jid, m.message, { messageId: m.key.id, additionalAttributes: { ...options } }) + return m + } + + /** + * Fake Replies + * @param {String} jid + * @param {String|Object} text + * @param {String} fakeJid + * @param {String} fakeText + * @param {String} fakeGroupJid + * @param {String} options + */ + conn.fakeReply = async (jid, text = '', fakeJid = this.user.jid, fakeText = '', fakeGroupJid, options) => { + return conn.reply(jid, text, { key: { fromMe: areJidsSameUser(fakeJid, conn.user.id), participant: fakeJid, ...(fakeGroupJid ? { remoteJid: fakeGroupJid } : {}) }, message: { conversation: fakeText }, ...options }) + } + + conn.loadMessage = conn.loadMessage || (async (messageID) => { + return Object.entries(conn.chats) + .filter(([_, { messages }]) => typeof messages === 'object') + .find(([_, { messages }]) => Object.entries(messages) + .find(([k, v]) => (k === messageID || v.key?.id === messageID))) + ?.[1].messages?.[messageID] + }) + + /** + * Download media message + * @param {Object} m + * @param {String} type + * @param {fs.PathLike|fs.promises.FileHandle} filename + * @returns {Promise} + */ + conn.downloadM = async (m, type, saveToFile) => { + if (!m || !(m.url || m.directPath)) return Buffer.alloc(0) + const stream = await downloadContentFromMessage(m, type) + let buffer = Buffer.from([]) + for await (const chunk of stream) { + buffer = Buffer.concat([buffer, chunk]) + } + if (saveToFile) var { filename } = await conn.getFile(buffer, true) + return saveToFile && fs.existsSync(filename) ? filename : buffer + } + + + conn.downloadAndSaveMediaMessage = async (message, filename, attachExtension = true) => { + let quoted = message.msg ? message.msg : message + let mime = (message.msg || message).mimetype || '' + let messageType = message.mtype ? message.mtype.replace(/Message/gi, '') : mime.split('/')[0] + const stream = await downloadContentFromMessage(quoted, messageType) + let buffer = Buffer.from([]) + for await(const chunk of stream) { + buffer = Buffer.concat([buffer, chunk]) + } + let type = await FileType.fromBuffer(buffer) + trueFileName = attachExtension ? (filename + '.' + type.ext) : filename + // save to file + await fs.writeFileSync(trueFileName, buffer) + return trueFileName + } + + + /** + * parseMention(s) + * @param {string} text + * @returns {string[]} + */ + conn.parseMention = (text = '') => { + return [...text.matchAll(/@([0-9]{5,16}|0)/g)].map(v => v[1] + '@s.whatsapp.net') + } + /** + * Read message + * @param {String} jid + * @param {String|undefined|null} participant + * @param {String} messageID + */ + conn.chatRead = async (jid, participant = conn.user.jid, messageID) => { + return await conn.sendReadReceipt(jid, participant, [messageID]) + } + + /** + * Parses string into mentionedJid(s) + * @param {String} text + */ + conn.parseMention = (text = '') => { + return [...text.matchAll(/@([0-9]{5,16}|0)/g)].map(v => v[1] + '@s.whatsapp.net') + } + + conn.sendTextWithMentions = async (jid, text, quoted, options = {}) => conn.sendMessage(jid, { text: text, contextInfo: { mentionedJid: [...text.matchAll(/@(\d{0,16})/g)].map(v => v[1] + '@s.whatsapp.net') }, ...options }, { quoted }) + + /** + * Get name from jid + * @param {String} jid + * @param {Boolean} withoutContact + */ + conn.getName = (jid = '', withoutContact = false) => { + jid = conn.decodeJid(jid) + withoutContact = this.withoutContact || withoutContact + let v + if (jid.endsWith('@g.us')) return new Promise(async (resolve) => { + v = conn.chats[jid] || {} + if (!(v.name || v.subject)) v = await conn.groupMetadata(jid) || {} + resolve(v.name || v.subject || PhoneNumber('+' + jid.replace('@s.whatsapp.net', '')).getNumber('international')) + }) + else v = jid === '0@s.whatsapp.net' ? { + jid, + vname: 'WhatsApp' + } : areJidsSameUser(jid, conn.user.id) ? + conn.user : + (conn.chats[jid] || {}) + return (withoutContact ? '' : v.name) || v.subject || v.vname || v.notify || v.verifiedName || PhoneNumber('+' + jid.replace('@s.whatsapp.net', '')).getNumber('international') + } + + /** + * to process MessageStubType + * @param {proto.WebMessageInfo} m + */ + conn.processMessageStubType = async(m) => { + /** + * to process MessageStubType + * @param {import('@adiwajshing/baileys').proto.WebMessageInfo} m + */ + if (!m.messageStubType) return + const chat = conn.decodeJid(m.key.remoteJid || m.message?.senderKeyDistributionMessage?.groupId || '') + if (!chat || chat === 'status@broadcast') return + const emitGroupUpdate = (update) => { + conn.ev.emit('groups.update', [{ id: chat, ...update }]) + } + switch (m.messageStubType) { + case WAMessageStubType.REVOKE: + case WAMessageStubType.GROUP_CHANGE_INVITE_LINK: + emitGroupUpdate({ revoke: m.messageStubParameters[0] }) + break + case WAMessageStubType.GROUP_CHANGE_ICON: + emitGroupUpdate({ icon: m.messageStubParameters[0] }) + break + default: { + console.log({ + messageStubType: m.messageStubType, + messageStubParameters: m.messageStubParameters, + type: WAMessageStubType[m.messageStubType] + }) + break + } + } + const isGroup = chat.endsWith('@g.us') + if (!isGroup) return + let chats = conn.chats[chat] + if (!chats) chats = conn.chats[chat] = { id: chat } + chats.isChats = true + const metadata = await conn.groupMetadata(chat).catch(_ => null) + if (!metadata) return + chats.subject = metadata.subject + chats.metadata = metadata + } + conn.insertAllGroup = async() => { + const groups = await conn.groupFetchAllParticipating().catch(_ => null) || {} + for (const group in groups) conn.chats[group] = { ...(conn.chats[group] || {}), id: group, subject: groups[group].subject, isChats: true, metadata: groups[group] } + return conn.chats + } + + /*conn.processMessageStubType = async (m) => { + if (!m.messageStubType) return + const mtype = Object.keys(m.message || {})[0] + const chat = conn.decodeJid(m.key.remoteJid || m.message[mtype] && m.message[mtype].groupId || '') + const isGroup = chat.endsWith('@g.us') + if (!isGroup) return + let chats = conn.chats[chat] + if (!chats) chats = conn.chats[chat] = { id: chat } + chats.isChats = true + const metadata = await conn.groupMetadata(chat).catch(_ => null) + if (!metadata) return + chats.subject = metadata.subject + chats.metadata = metadata + }*/ + + /** + * pushMessage + * @param {proto.WebMessageInfo[]} m + */ + conn.pushMessage = async(m) => { + /** + * pushMessage + * @param {import('@adiwajshing/baileys').proto.WebMessageInfo[]} m + */ + if (!m) return + if (!Array.isArray(m)) m = [m] + for (const message of m) { + try { + // if (!(message instanceof proto.WebMessageInfo)) continue // https://github.com/adiwajshing/Baileys/pull/696/commits/6a2cb5a4139d8eb0a75c4c4ea7ed52adc0aec20f + if (!message) continue + if (message.messageStubType && message.messageStubType != WAMessageStubType.CIPHERTEXT) conn.processMessageStubType(message).catch(console.error) + const _mtype = Object.keys(message.message || {}) + const mtype = (!['senderKeyDistributionMessage', 'messageContextInfo'].includes(_mtype[0]) && _mtype[0]) || + (_mtype.length >= 3 && _mtype[1] !== 'messageContextInfo' && _mtype[1]) || + _mtype[_mtype.length - 1] + const chat = conn.decodeJid(message.key.remoteJid || message.message?.senderKeyDistributionMessage?.groupId || '') + if (message.message?.[mtype]?.contextInfo?.quotedMessage) { + /** + * @type {import('@adiwajshing/baileys').proto.IContextInfo} + */ + let context = message.message[mtype].contextInfo + let participant = conn.decodeJid(context.participant) + const remoteJid = conn.decodeJid(context.remoteJid || participant) + /** + * @type {import('@adiwajshing/baileys').proto.IMessage} + * + */ + let quoted = message.message[mtype].contextInfo.quotedMessage + if ((remoteJid && remoteJid !== 'status@broadcast') && quoted) { + let qMtype = Object.keys(quoted)[0] + if (qMtype == 'conversation') { + quoted.extendedTextMessage = { text: quoted[qMtype] } + delete quoted.conversation + qMtype = 'extendedTextMessage' + } + + if (!quoted[qMtype].contextInfo) quoted[qMtype].contextInfo = {} + quoted[qMtype].contextInfo.mentionedJid = context.mentionedJid || quoted[qMtype].contextInfo.mentionedJid || [] + const isGroup = remoteJid.endsWith('g.us') + if (isGroup && !participant) participant = remoteJid + const qM = { + key: { + remoteJid, + fromMe: areJidsSameUser(conn.user.jid, remoteJid), + id: context.stanzaId, + participant, + }, + message: JSON.parse(JSON.stringify(quoted)), + ...(isGroup ? { participant } : {}) + } + let qChats = conn.chats[participant] + if (!qChats) qChats = conn.chats[participant] = { id: participant, isChats: !isGroup } + if (!qChats.messages) qChats.messages = {} + if (!qChats.messages[context.stanzaId] && !qM.key.fromMe) qChats.messages[context.stanzaId] = qM + let qChatsMessages + if ((qChatsMessages = Object.entries(qChats.messages)).length > 40) qChats.messages = Object.fromEntries(qChatsMessages.slice(30, qChatsMessages.length)) // maybe avoid memory leak + } + } + if (!chat || chat === 'status@broadcast') continue + const isGroup = chat.endsWith('@g.us') + let chats = conn.chats[chat] + if (!chats) { + if (isGroup) await conn.insertAllGroup().catch(console.error) + chats = conn.chats[chat] = { id: chat, isChats: true, ...(conn.chats[chat] || {}) } + } + let metadata, sender + if (isGroup) { + if (!chats.subject || !chats.metadata) { + metadata = await conn.groupMetadata(chat).catch(_ => ({})) || {} + if (!chats.subject) chats.subject = metadata.subject || '' + if (!chats.metadata) chats.metadata = metadata + } + sender = conn.decodeJid(message.key?.fromMe && conn.user.id || message.participant || message.key?.participant || chat || '') + if (sender !== chat) { + let chats = conn.chats[sender] + if (!chats) chats = conn.chats[sender] = { id: sender } + if (!chats.name) chats.name = message.pushName || chats.name || '' + } + } else if (!chats.name) chats.name = message.pushName || chats.name || '' + if (['senderKeyDistributionMessage', 'messageContextInfo'].includes(mtype)) continue + chats.isChats = true + if (!chats.messages) chats.messages = {} + const fromMe = message.key.fromMe || areJidsSameUser(sender || chat, conn.user.id) + if (!['protocolMessage'].includes(mtype) && !fromMe && message.messageStubType != WAMessageStubType.CIPHERTEXT && message.message) { + delete message.message.messageContextInfo + delete message.message.senderKeyDistributionMessage + chats.messages[message.key.id] = JSON.parse(JSON.stringify(message, null, 2)) + let chatsMessages + if ((chatsMessages = Object.entries(chats.messages)).length > 40) chats.messages = Object.fromEntries(chatsMessages.slice(30, chatsMessages.length)) + } + } catch (e) { + console.error(e) + } + } + } + + /*conn.pushMessage = async (m) => { + if (!m) return + if (!Array.isArray(m)) m = [m] + for (const message of m) { + try { + // if (!(message instanceof proto.WebMessageInfo)) continue // https://github.com/adiwajshing/Baileys/pull/696/commits/6a2cb5a4139d8eb0a75c4c4ea7ed52adc0aec20f + if (!message) continue + if (message.messageStubType) conn.processMessageStubType(message).catch(console.error) + let mtype = Object.keys(message.message || {}) + mtype = mtype[mtype[0] === 'messageContextInfo' && mtype.length == 2 ? 1 : 0] + const chat = conn.decodeJid(message.key.remoteJid || message.message[mtype] && message.message[mtype].groupId || '') + const isGroup = chat.endsWith('@g.us') + let chats = conn.chats[chat] + if (!chats) { + if (isGroup) { + const groups = await conn.groupFetchAllParticipating().catch(_ => ({})) + for (const group in groups) conn.chats[group] = { id: group, subject: groups[group].subject, isChats: true, metadata: groups[group] } + } + chats = conn.chats[chat] = { id: chat, ...(conn.chats[chat] || {}) } + } + let metadata, sender + if (isGroup) { + if (!chats.subject || !chats.metadata) { + metadata = await conn.groupMetadata(chat).catch(_ => ({})) || {} + if (!chats.subject) chats.subject = metadata.subject || '' + if (!chats.metadata) chats.metadata = metadata + } + sender = conn.decodeJid(message.fromMe && conn.user.id || message.participant || message.key.participant || chat || '') + if (sender !== chat) { + let chats = conn.chats[sender] + if (!chats) chats = conn.chats[sender] = { id: sender } + if (!chats.name) chats.name = message.pushName || chats.name || '' + } + } else { + if (!chats.name) chats.name = message.pushName || chats.name || '' + } + if (['senderKeyDistributionMessage', 'protocolMessage'].includes(mtype)) continue + chats.isChats = true + const fromMe = message.key.fromMe || areJidsSameUser(chat, conn.user.id) + if (!chats.messages) chats.messages = {} + if (!fromMe) chats.messages[message.key.id] = JSON.parse(JSON.stringify(message, null, 2)) + } catch (e) { + console.error(e) + } + } + }*/ + + /** + * + * @param {...any} args + * @returns + */ + conn.format = (...args) => { + return util.format(...args) + } + + /** + * + * @param {String} url + * @param {Object} options + * @returns + */ + conn.getBuffer = async (url, options) => { + try { + options ? options : {} + const res = await axios({ + method: "get", + url, + headers: { + 'DNT': 1, + 'Upgrade-Insecure-Request': 1 + }, + ...options, + responseType: 'arraybuffer' + }) + return res.data + } catch (e) { + console.log(`Error : ${e}`) + } + } + + /** + * Serialize Message, so it easier to manipulate + * @param {Object} m + */ + conn.serializeM = (m) => { + return exports.smsg(conn, m) + } + + Object.defineProperty(conn, 'name', { + value: 'WASocket', + configurable: true, + }) + return conn +} +/** + * Serialize Message + * @param {ReturnType} conn + * @param {proto.WebMessageInfo} m + * @param {Boolean} hasParent + */ + exports.smsg = (conn, m, hasParent) => { + if (!m) return m + let M = proto.WebMessageInfo + m = M.fromObject(m) + if (m.key) { + m.id = m.key.id + m.isBaileys = m.id && m.id.length === 22 || m.id.startsWith('3EB0') && m.id.length === 22 || false + m.chat = conn.decodeJid(m.key.remoteJid || message.message?.senderKeyDistributionMessage?.groupId || '') + m.isGroup = m.chat.endsWith('@g.us') + m.sender = conn.decodeJid(m.key.fromMe && conn.user.id || m.participant || m.key.participant || m.chat || '') + m.fromMe = m.key.fromMe || areJidsSameUser(m.sender, conn.user.id) + } + if (m.message) { + let mtype = Object.keys(m.message) + m.mtype = (!['senderKeyDistributionMessage', 'messageContextInfo'].includes(mtype[0]) && mtype[0]) || // Sometimes message in the front + (mtype.length >= 3 && mtype[1] !== 'messageContextInfo' && mtype[1]) || // Sometimes message in midle if mtype length is greater than or equal to 3! + mtype[mtype.length - 1] // common case + m.msg = m.message[m.mtype] + if (m.chat == 'status@broadcast' && ['protocolMessage', 'senderKeyDistributionMessage'].includes(m.mtype)) m.chat = (m.key.remoteJid !== 'status@broadcast' && m.key.remoteJid) || m.sender + if (m.mtype == 'protocolMessage' && m.msg.key) { + if (m.msg.key.remoteJid == 'status@broadcast') m.msg.key.remoteJid = m.chat + if (!m.msg.key.participant || m.msg.key.participant == 'status_me') m.msg.key.participant = m.sender + m.msg.key.fromMe = conn.decodeJid(m.msg.key.participant) === conn.decodeJid(conn.user.id) + if (!m.msg.key.fromMe && m.msg.key.remoteJid === conn.decodeJid(conn.user.id)) m.msg.key.remoteJid = m.sender + } + m.text = m.msg.text || m.msg.caption || m.msg.contentText || m.msg || '' + if (typeof m.text !== 'string') { + if ([ + 'protocolMessage', + 'messageContextInfo', + 'stickerMessage', + 'audioMessage', + 'senderKeyDistributionMessage' + ].includes(m.mtype)) m.text = '' + else m.text = m.text.selectedDisplayText || m.text.hydratedTemplate?.hydratedContentText || m.text + } + m.mentionedJid = m.msg?.contextInfo?.mentionedJid?.length && m.msg.contextInfo.mentionedJid || [] + let quoted = m.quoted = m.msg?.contextInfo?.quotedMessage ? m.msg.contextInfo.quotedMessage : null + if (m.quoted) { + let type = Object.keys(m.quoted)[0] + m.quoted = m.quoted[type] + if (typeof m.quoted === 'string') m.quoted = { text: m.quoted } + m.quoted.mtype = type + m.quoted.id = m.msg.contextInfo.stanzaId + m.quoted.chat = conn.decodeJid(m.msg.contextInfo.remoteJid || m.chat || m.sender) + m.quoted.isBaileys = m.quoted.id && m.quoted.id.length === 22 || false + m.quoted.sender = conn.decodeJid(m.msg.contextInfo.participant) + m.quoted.fromMe = m.quoted.sender === conn.user.jid + m.quoted.text = m.quoted.text || m.quoted.caption || m.quoted.contentText || '' + m.quoted.name = conn.getName(m.quoted.sender) + m.quoted.mentionedJid = m.quoted.contextInfo?.mentionedJid?.length && m.quoted.contextInfo.mentionedJid || [] + let vM = m.quoted.fakeObj = M.fromObject({ + key: { + fromMe: m.quoted.fromMe, + remoteJid: m.quoted.chat, + id: m.quoted.id + }, + message: quoted, + ...(m.isGroup ? { participant: m.quoted.sender } : {}) + }) + m.getQuotedObj = m.getQuotedMessage = async () => { + if (!m.quoted.id) return null + let q = M.fromObject(await conn.loadMessage(m.quoted.id) || vM) + return exports.smsg(conn, q) + } + if (m.quoted.url || m.quoted.directPath) m.quoted.download = (saveToFile = false) => conn.downloadM(m.quoted, m.quoted.mtype.replace(/message/i, ''), saveToFile) + + +/*exports.smsg = (conn, m, hasParent) => { + if (!m) return m + let M = proto.WebMessageInfo + m = M.fromObject(m) + if (m.key) { + m.id = m.key.id + m.isBaileys = m.id && m.id.length === 16 || m.id.startsWith('3EB0') && m.id.length === 12 || false + let mtype = Object.keys(m.message || {})[0] + m.chat = conn.decodeJid(m.key.remoteJid || m.message[mtype] && m.message[mtype].groupId || '') + m.isGroup = m.chat.endsWith('@g.us') + m.sender = conn.decodeJid(m.fromMe && conn.user.id || m.participant || m.key.participant || m.chat || '') + m.fromMe = m.key.fromMe || areJidsSameUser(m.sender, conn.user.id) + } + if (m.message) { + let mtype = Object.keys(m.message) + m.mtype = mtype[mtype[0] === 'messageContextInfo' && mtype.length == 2 ? 1 : 0] + m.msg = m.message[m.mtype] + if (m.chat == 'status@broadcast' && ['protocolMessage', 'senderKeyDistributionMessage'].includes(m.mtype)) m.chat = m.sender + // if (m.mtype === 'ephemeralMessage') { + // exports.smsg(conn, m.msg) + // m.mtype = m.msg.mtype + // m.msg = m.msg.msg + // } + if (m.mtype == 'protocolMessage' && m.msg.key) { + if (m.msg.key.remoteJid == 'status@broadcast') m.msg.key.remoteJid = m.chat + if (!m.msg.key.participant || m.msg.key.participant == 'status_me') m.msg.key.participant = m.sender + m.msg.key.fromMe = conn.decodeJid(m.msg.key.participant) === conn.decodeJid(conn.user.id) + if (!m.msg.key.fromMe && m.msg.key.remoteJid === conn.decodeJid(conn.user.id)) m.msg.key.remoteJid = m.sender + } + m.text = m.msg.text || m.msg.caption || m.msg.contentText || m.msg || '' + m.mentionedJid = m.msg && m.msg.contextInfo && m.msg.contextInfo.mentionedJid && m.msg.contextInfo.mentionedJid.length && m.msg.contextInfo.mentionedJid || [] + let quoted = m.quoted = m.msg && m.msg.contextInfo && m.msg.contextInfo.quotedMessage ? m.msg.contextInfo.quotedMessage : null + if (m.quoted) { + let type = Object.keys(m.quoted)[0] + m.quoted = m.quoted[type] + if (typeof m.quoted === 'string') m.quoted = { text: m.quoted } + m.quoted.mtype = type + m.quoted.id = m.msg.contextInfo.stanzaId + m.quoted.chat = conn.decodeJid(m.msg.contextInfo.remoteJid || m.chat || m.sender) + m.quoted.isBaileys = m.quoted.id && m.quoted.id.length === 16 || false + m.quoted.sender = conn.decodeJid(m.msg.contextInfo.participant) + m.quoted.fromMe = m.quoted.sender === conn.user.jid + m.quoted.text = m.quoted.text || m.quoted.caption || '' + m.quoted.name = conn.getName(m.quoted.sender) + m.quoted.mentionedJid = m.quoted.contextInfo && m.quoted.contextInfo.mentionedJid && m.quoted.contextInfo.mentionedJid.length && m.quoted.contextInfo.mentionedJid || [] + let vM = m.quoted.fakeObj = M.fromObject({ + key: { + fromMe: m.quoted.fromMe, + remoteJid: m.quoted.chat, + id: m.quoted.id + }, + message: quoted, + ...(m.isGroup ? { participant: m.quoted.sender } : {}) + }) + m.getQuotedObj = m.getQuotedMessage = () => { + if (!m.quoted.id) return false + let q = M.fromObject(((conn.chats[m.quoted.chat] || {}).messages || {})[m.quoted.id]) + return exports.smsg(conn, q ? q : vM) + } + + if (m.quoted.url || m.quoted.directPath) m.quoted.download = (saveToFile = false) => conn.downloadM(m.quoted, m.quoted.mtype.replace(/message/i, ''), saveToFile)*/ + + /** + * Reply to quoted message + * @param {String|Object} text + * @param {String|false} chatId + * @param {Object} options + */ + m.quoted.reply = (text, chatId, options) => conn.reply(chatId ? chatId : m.chat, text, vM, options) + + /** + * Copy quoted message + */ + m.quoted.copy = () => exports.smsg(conn, M.fromObject(M.toObject(vM))) + + /** + * Forward quoted message + * @param {String} jid + * @param {Boolean} forceForward + */ + m.quoted.forward = (jid, forceForward = false) => conn.forwardMessage(jid, vM, forceForward) + + /** + * Exact Forward quoted message + * @param {String} jid + * @param {Boolean|Number} forceForward + * @param {Object} options + */ + m.quoted.copyNForward = (jid, forceForward = true, options = {}) => conn.copyNForward(jid, vM, forceForward, options) + + /** + * Modify quoted Message + * @param {String} jid + * @param {String} text + * @param {String} sender + * @param {Object} options + */ + m.quoted.cMod = (jid, text = '', sender = m.quoted.sender, options = {}) => conn.cMod(jid, vM, text, sender, options) + + /** + * Delete quoted message + */ + m.quoted.delete = () => conn.sendMessage(m.quoted.chat, { delete: vM.key }) + } + } + m.name = m.pushName || conn.getName(m.sender) + if (m.msg && m.msg.url) m.download = (saveToFile = false) => conn.downloadM(m.msg, m.mtype.replace(/message/i, ''), saveToFile) + /** + * Reply to this message + * @param {String|Object} text + * @param {String|false} chatId + * @param {Object} options + */ + m.reply = (text, chatId, options) => conn.reply(chatId ? chatId : m.chat, text, m, options) + + /** + * Copy this message + */ + m.copy = () => exports.smsg(conn, M.fromObject(M.toObject(m))) + + /** + * Forward this message + * @param {String} jid + * @param {Boolean} forceForward + */ + m.forward = (jid = m.chat, forceForward = false) => conn.copyNForward(jid, m, forceForward, options) + + /** + * Exact Forward this message + * @param {String} jid + * @param {Boolean} forceForward + * @param {Object} options + */ + m.copyNForward = (jid = m.chat, forceForward = true, options = {}) => conn.copyNForward(jid, m, forceForward, options) + + /** + * Modify this Message + * @param {String} jid + * @param {String} text + * @param {String} sender + * @param {Object} options + */ + m.cMod = (jid, text = '', sender = m.sender, options = {}) => conn.cMod(jid, m, text, sender, options) + + /** + * Delete this message + */ + m.delete = () => conn.sendMessage(m.chat, { delete: m.key }) + + try { + if (m.msg && m.mtype == 'protocolMessage') conn.ev.emit('message.delete', m.msg.key) + } catch (e) { + console.error(e) + } + return m +} + +exports.logic = (check, inp, out) => { + if (inp.length !== out.length) throw new Error('Input and Output must have same length') + for (let i in inp) if (util.isDeepStrictEqual(check, inp[i])) return out[i] + return null +} + +exports.protoType = () => { + Buffer.prototype.toArrayBuffer = function toArrayBufferV2() { + const ab = new ArrayBuffer(this.length); + const view = new Uint8Array(ab); + for (let i = 0; i < this.length; ++i) { + view[i] = this[i]; + } + return ab; + } + /** + * @returns {ArrayBuffer} + */ + Buffer.prototype.toArrayBufferV2 = function toArrayBuffer() { + return this.buffer.slice(this.byteOffset, this.byteOffset + this.byteLength) + } + /** + * @returns {Buffer} + */ + ArrayBuffer.prototype.toBuffer = function toBuffer() { + return Buffer.from(new Uint8Array(this)) + } + // /** + // * @returns {String} + // */ + // Buffer.prototype.toUtilFormat = ArrayBuffer.prototype.toUtilFormat = Object.prototype.toUtilFormat = Array.prototype.toUtilFormat = function toUtilFormat() { + // return util.format(this) + // } + Uint8Array.prototype.getFileType = ArrayBuffer.prototype.getFileType = Buffer.prototype.getFileType = async function getFileType() { + return await fileTypeFromBuffer(this) + } + /** + * @returns {Boolean} + */ + String.prototype.isNumber = Number.prototype.isNumber = isNumber + /** + * + * @returns {String} + */ + String.prototype.capitalize = function capitalize() { + return this.charAt(0).toUpperCase() + this.slice(1, this.length) + } + /** + * @returns {String} + */ + String.prototype.capitalizeV2 = function capitalizeV2() { + const str = this.split(' ') + return str.map(v => v.capitalize()).join(' ') + } + String.prototype.decodeJid = function decodeJid() { + if (/:\d+@/gi.test(this)) { + const decode = jidDecode(this) || {} + return (decode.user && decode.server && decode.user + '@' + decode.server || this).trim() + } else return this.trim() + } + /** + * number must be milliseconds + * @returns {string} + */ + Number.prototype.toTimeString = function toTimeString() { + // const milliseconds = this % 1000 + const seconds = Math.floor((this / 1000) % 60) + const minutes = Math.floor((this / (60 * 1000)) % 60) + const hours = Math.floor((this / (60 * 60 * 1000)) % 24) + const days = Math.floor((this / (24 * 60 * 60 * 1000))) + return ( + (days ? `${days} day(s) ` : '') + + (hours ? `${hours} hour(s) ` : '') + + (minutes ? `${minutes} minute(s) ` : '') + + (seconds ? `${seconds} second(s)` : '') + ).trim() + } + Number.prototype.getRandom = String.prototype.getRandom = Array.prototype.getRandom = getRandom +} + +function isNumber() { + const int = parseInt(this) + return typeof int === 'number' && !isNaN(int) +} + +function getRandom() { + if (Array.isArray(this) || this instanceof String) return this[Math.floor(Math.random() * this.length)] + return Math.floor(Math.random() * this) +} + +function rand(isi) { + return isi[Math.floor(Math.random() * isi.length)] +} diff --git a/lib/sticker.js b/lib/sticker.js new file mode 100644 index 0000000000000000000000000000000000000000..3fdd324f937ab22645e70cf975736baf8577ee52 --- /dev/null +++ b/lib/sticker.js @@ -0,0 +1,209 @@ +const fs = require('fs') +const path = require('path') +const crypto = require('crypto') +const fetch = require('node-fetch') +const { ffmpeg } = require('./converter') +const { spawn } = require('child_process') +const uploadFile = require('./uploadFile') +const { fromBuffer } = require('file-type') +const uploadImage = require('./uploadImage') + +const tmp = path.join(__dirname, '../tmp') +/** + * Image to Sticker + * @param {Buffer} img Image Buffer + * @param {String} url Image URL + */ +function sticker2(img, url) { + return new Promise(async (resolve, reject) => { + try { + if (url) { + let res = await fetch(url) + if (res.status !== 200) throw await res.text() + img = await res.buffer() + } + let inp = path.join(tmp, +new Date + '.jpeg') + await fs.promises.writeFile(inp, img) + let ff = spawn('ffmpeg', [ + '-y', + '-i', inp, + '-vf', 'scale=512:512:flags=lanczos:force_original_aspect_ratio=decrease,format=rgba,pad=512:512:(ow-iw)/2:(oh-ih)/2:color=#00000000,setsar=1', + '-f', 'png', + '-' + ]) + ff.on('error', reject) + ff.on('close', async () => { + await fs.promises.unlink(inp) + }) + let bufs = [] + const [_spawnprocess, ..._spawnargs] = [...(module.exports.support.gm ? ['gm'] : module.exports.magick ? ['magick'] : []), 'convert', 'png:-', 'webp:-'] + let im = spawn(_spawnprocess, _spawnargs) + im.on('error', e => conn.reply(m.chat, util.format(e), m)) + im.stdout.on('data', chunk => bufs.push(chunk)) + ff.stdout.pipe(im.stdin) + im.on('exit', () => { + resolve(Buffer.concat(bufs)) + }) + } catch (e) { + reject(e) + } + }) +} + +async function canvas(code, type = 'png', quality = 0.92) { + let res = await fetch('https://nurutomo.herokuapp.com/api/canvas?' + queryURL({ + type, + quality + }), { + method: 'POST', + headers: { + 'Content-Type': 'text/plain', + 'Content-Length': code.length + }, + body: code + }) + let image = await res.buffer() + return image +} + +function queryURL(queries) { + return new URLSearchParams(Object.entries(queries)) +} + +/** + * Image to Sticker + * @param {Buffer} img Image Buffer + * @param {String} url Image URL + */ +async function sticker1(img, url) { + url = url ? url : await uploadImage(img) + let { + mime + } = url ? { mime: 'image/jpeg' } : await fromBuffer(img) + let sc = `let im = await loadImg('data:${mime};base64,'+(await window.loadToDataURI('${url}'))) +c.width = c.height = 512 +let max = Math.max(im.width, im.height) +let w = 512 * im.width / max +let h = 512 * im.height / max +ctx.drawImage(im, 256 - w / 2, 256 - h / 2, w, h) +` + return await canvas(sc, 'webp') +} + +/** + * Image/Video to Sticker + * @param {Buffer} img Image/Video Buffer + * @param {String} url Image/Video URL + * @param {String} packname EXIF Packname + * @param {String} author EXIF Author + */ +async function sticker3(img, url, packname, author) { + url = url ? url : await uploadFile(img) + let res = await fetch('https://api.xteam.xyz/sticker/wm?' + new URLSearchParams(Object.entries({ + url, + packname, + author + }))) + return await res.buffer() +} + +/** + * Image to Sticker + * @param {Buffer} img Image/Video Buffer + * @param {String} url Image/Video URL + */ +async function sticker4(img, url) { + if (url) { + let res = await fetch(url) + if (res.status !== 200) throw await res.text() + img = await res.buffer() + } + return await ffmpeg(img, [ + '-vf', 'scale=512:512:flags=lanczos:force_original_aspect_ratio=decrease,format=rgba,pad=512:512:(ow-iw)/2:(oh-ih)/2:color=#00000000,setsar=1' + ], 'jpeg', 'webp') +} + + +async function sticker5(img, url, packname, author, categories = ['']) { + const WSF = require('wa-sticker-formatter') + const stickerMetadata = { + type: 'full', + pack: packname, + author, + categories, + } + return await new WSF.Sticker(img ? img : url, stickerMetadata).build() +} + + +/** + * Add WhatsApp JSON Exif Metadata + * Taken from https://github.com/pedroslopez/whatsapp-web.js/pull/527/files + * @param {Buffer} webpSticker + * @param {String} packname + * @param {String} author + * @param {String} categories + * @param {Object} extra + * @returns + */ +async function addExif(webpSticker, packname, author, categories = [''], extra = {}) { + const webp = require('node-webpmux') // Optional Feature + const img = new webp.Image(); + const stickerPackId = crypto.randomBytes(32).toString('hex'); + const json = { 'sticker-pack-id': stickerPackId, 'sticker-pack-name': packname, 'sticker-pack-publisher': author, 'emojis': categories, ...extra }; + let exifAttr = Buffer.from([0x49, 0x49, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x57, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00]); + let jsonBuffer = Buffer.from(JSON.stringify(json), 'utf8'); + let exif = Buffer.concat([exifAttr, jsonBuffer]); + exif.writeUIntLE(jsonBuffer.length, 14, 4); + await img.loadBuffer(webpSticker) + img.exif = exif + return await img.saveBuffer() +} + +module.exports = { + /** + * Image/Video to Sticker + * @param {Buffer} img Image/Video Buffer + * @param {String} url Image/Video URL + * @param {...String} + */ + async sticker(img, url, ...args) { + let lastError + for (let func of [ + sticker3, // sticker5, + this.support.ffmpeg && this.support.ffmpegWebp && sticker4, + this.support.ffmpeg && (this.support.convert || this.support.magick || this.support.gm) && sticker2, + sticker1 + ].filter(f => f)) { + try { + let stiker = await func(img, url, ...args) + if (stiker.includes('RIFF')) { + try { + return await addExif(stiker, ...args) + } catch (e) { + return stiker + } + } + throw stiker.toString() + } catch (err) { + lastError = err + } + } + return lastError + }, + sticker1, + sticker2, + sticker3, + sticker4, + sticker5, + addExif, + support: { + ffmpeg: true, + ffprobe: true, + ffmpegWebp: true, + convert: true, + magick: false, + gm: false, + find: false + } +} \ No newline at end of file diff --git a/lib/tictactoe.d.ts b/lib/tictactoe.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..68531871b314b9fec958fb699070acdfd0dac860 --- /dev/null +++ b/lib/tictactoe.d.ts @@ -0,0 +1,15 @@ +export declare class TicTacToe { + /* X PlayerName */ + playerX: string; + /* Y PlayerName */ + playerY: string; + /* X if true, Y if false */ + _currentTurn: boolean; + _x: number; + _y: number; + _turns: number; + constructor(playerX: string, playerY: string); + get board(): number; + turn(player, index: number): boolean; + turn(player, x: number, y: number): boolean; +} diff --git a/lib/tictactoe.js b/lib/tictactoe.js new file mode 100644 index 0000000000000000000000000000000000000000..e904fc59de63152bcb453bfadffd5abeb5cd5189 --- /dev/null +++ b/lib/tictactoe.js @@ -0,0 +1,93 @@ +class TicTacToe { + constructor(playerX = 'x', playerO = 'o') { + this.playerX = playerX + this.playerO = playerO + this._currentTurn = false + this._x = 0 + this._o = 0 + this.turns = 0 + } + + get board() { + return this._x | this._o + } + + get currentTurn() { + return this._currentTurn ? this.playerO : this.playerX + } + + get enemyTurn() { + return this._currentTurn ? this.playerX : this.playerO + } + + static check(state) { + for (let combo of [7, 56, 73, 84, 146, 273, 292, 448]) + if ((state & combo) === combo) + return !0 + return !1 + } + + /** + * ```js + * TicTacToe.toBinary(1, 2) // 0b010000000 + * ``` + */ + static toBinary(x = 0, y = 0) { + if (x < 0 || x > 2 || y < 0 || y > 2) throw new Error('invalid position') + return 1 << x + (3 * y) + } + + /** + * @param player `0` is `X`, `1` is `O` + * + * - `-3` `Game Ended` + * - `-2` `Invalid` + * - `-1` `Invalid Position` + * - ` 0` `Position Occupied` + * - ` 1` `Sucess` + * @returns {-3|-2|-1|0|1} + */ + turn(player = 0, x = 0, y) { + if (this.board === 511) return -3 + let pos = 0 + if (y == null) { + if (x < 0 || x > 8) return -1 + pos = 1 << x + } else { + if (x < 0 || x > 2 || y < 0 || y > 2) return -1 + pos = TicTacToe.toBinary(x, y) + } + if (this._currentTurn ^ player) return -2 + if (this.board & pos) return 0 + this[this._currentTurn ? '_o' : '_x'] |= pos + this._currentTurn = !this._currentTurn + this.turns++ + return 1 + } + + /** + * @returns {('X'|'O'|1|2|3|4|5|6|7|8|9)[]} + */ + static render(boardX = 0, boardO = 0) { + let x = parseInt(boardX.toString(2), 4) + let y = parseInt(boardO.toString(2), 4) * 2 + return [...(x + y).toString(4).padStart(9, '0')].reverse().map((value, index) => value == 1 ? 'X' : value == 2 ? 'O' : ++index) + } + + /** + * @returns {('X'|'O'|1|2|3|4|5|6|7|8|9)[]} + */ + render() { + return TicTacToe.render(this._x, this._o) + } + + get winner() { + let x = TicTacToe.check(this._x) + let o = TicTacToe.check(this._o) + return x ? this.playerX : o ? this.playerO : false + } +} + +new TicTacToe().turn + +module.exports = TicTacToe \ No newline at end of file diff --git a/lib/ular_tangga.js b/lib/ular_tangga.js new file mode 100644 index 0000000000000000000000000000000000000000..c8b7ba0d3a1d2acf60ebab6640d02e71bfbc9794 --- /dev/null +++ b/lib/ular_tangga.js @@ -0,0 +1,50 @@ +const fs = require('fs'); +const Jimp = require('jimp'); + +// Fungsi untuk menggambar papan permainan dengan pemain +async function drawBoard(boardImageURL, user1 = null, user2 = null, user3 = null, user4 = null, stabil_x, stabil_y) { + try { + // Load gambar papan permainan dari URL + const board = await Jimp.read(boardImageURL); + + // Lokasi pemain pada papan permainan + const playerPositions = [user1, user2, user3, user4].filter(pos => pos !== null && pos >= 1 && pos <= 100); + + // URL gambar untuk setiap pemain + const playerImageURLs = [ + "https://telegra.ph/file/30f92f923fb0484f0e4e0.png", + "https://telegra.ph/file/6e07b5f30b24baedc7822.png", + "https://telegra.ph/file/34f47137df0dc9aa9c15a.png", + "https://telegra.ph/file/860b5df98963a1f14a91c.png" + ]; + + // Gambar pion untuk setiap pemain pada posisi mereka + for (let i = 0; i < playerPositions.length; i++) { + const position = playerPositions[i]; + const row = Math.floor((position - 1) / 10); // Mulai dari bawah + const col = (row % 2 === 0) ? (position - 1) % 10 : 9 - (position - 1) % 10; + + // Posisi pion pada papan permainan + const x = col * 60 + stabil_x + const y = (9 - row) * 60 + stabil_y + + // Load gambar pemain dari URL + const playerImageURL = playerImageURLs[i]; + const playerImage = await Jimp.read(playerImageURL); + + // Resize gambar pemain menjadi 38x38 (sesuai dengan ukuran lingkaran) + playerImage.resize(50, 50); + + // Gabungkan gambar pemain dengan papan permainan + board.composite(playerImage, x - 4, y - 4, { mode: Jimp.BLEND_SOURCE_OVER }); + } + + // Mengembalikan buffer gambar + return await board.getBufferAsync(Jimp.MIME_PNG); + } catch (error) { + console.error('An error occurred:', error); + return null; + } +} + +module.exports = { drawBoard } \ No newline at end of file diff --git a/lib/uploadFile.js b/lib/uploadFile.js new file mode 100644 index 0000000000000000000000000000000000000000..4022af1aa8f7d6a951d865610d6053307140adea --- /dev/null +++ b/lib/uploadFile.js @@ -0,0 +1,90 @@ +const fetch = require('node-fetch'); +const axios = require('axios') +const FormData = require('form-data'); +const { fromBuffer } = require('file-type'); + +/** + * Upload file to https://pomf.lain.la + * @returns {string|null|(string|null)[]} + */ + +const pomf = async (buffer) => { +const { ext, mime } = (await fromBuffer(buffer)) || {}; + const form = new FormData(); + form.append("files[]", buffer, { filename: `tmp.${ext}`, contentType: mime }); + try { + const { data } = await axios.post("https://pomf.lain.la/upload.php", form, { + headers: form.getHeaders(), + }); + console.log(data); + return data.files[0].url + } catch (error) { + throw error; + } +}; + +/** + * Upload epheremal file to file.io + * `Expired in 1 day` + * `100MB Max Filesize` + * @param {Buffer} buffer File Buffer + */ +const fileIO = async (buffer) => { + const { ext } = await fromBuffer(buffer) || {}; + const form = new FormData(); + form.append('file', buffer, `tmp.${ext}`); + const res = await fetch('https://file.io/?expires=1d', { // 1 Day Expiry Date + method: 'POST', + body: form + }); + const json = await res.json(); + if (!json.success) throw json; + return json.link; +}; + +/** + * Upload file to https://8030.us.kg + * @returns {string|null|(string|null)[]} + */ +const api = async (buffer) => { + let { ext } = await fromBuffer(buffer); + let bodyForm = new FormData(); + bodyForm.append("file", buffer, "file." + ext); + let res = await fetch("https://8030.us.kg/api/upload.php", { + method: "post", + body: bodyForm, + }); + let data = await res.json(); + let resultUrl = data.result ? data.result.url : ''; + return resultUrl; +} + + +/** + * Upload file to https://file.btch.rf.gd + * @returns {string|null|(string|null)[]} + */ +const api2 = async (buffer) => { + let { ext } = await fromBuffer(buffer); + let bodyForm = new FormData(); + bodyForm.append("file", buffer, "file." + ext); + let res = await fetch("https://file.btch.rf.gd/api/upload.php", { + method: "post", + body: bodyForm, + }); + let data = await res.json(); + let resultUrl = data.result ? data.result.url : ''; + return resultUrl; +} + +module.exports = async function (inp) { + let err = false; + for (const upload of [pomf, api, api2, fileIO]) { + try { + return await upload(inp); + } catch (e) { + err = e; + } + } + if (err) throw err; +}; diff --git a/lib/uploadImage.js b/lib/uploadImage.js new file mode 100644 index 0000000000000000000000000000000000000000..76967105a31e3054a0438b204fb3d7ef55a59d7d --- /dev/null +++ b/lib/uploadImage.js @@ -0,0 +1,26 @@ +const axios = require('axios'); +const FormData = require('form-data'); +const { fromBuffer } = require('file-type'); + +/** + * Upload image to pomf.lain.la + * Supported mimetype: + * - `image/jpeg` + * - `image/jpg` + * - `image/png` + * @param {Buffer} buffer Image Buffer + */ +module.exports = async buffer => { + const { ext, mime } = (await fromBuffer(buffer)) || {}; + const form = new FormData(); + form.append("files[]", buffer, { filename: `tmp.${ext}`, contentType: mime }); + try { + const { data } = await axios.post("https://pomf.lain.la/upload.php", form, { + headers: form.getHeaders(), + }); + console.log(data); + return data.files[0].url + } catch (error) { + throw error; + } +}; diff --git a/lib/webp.js b/lib/webp.js new file mode 100644 index 0000000000000000000000000000000000000000..ab3cef0205695b76be347cb4509757f16710814d --- /dev/null +++ b/lib/webp.js @@ -0,0 +1,1497 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.constants = void 0; + +var _fs2 = _interopRequireDefault(require("fs")); + +var _util = require("util"); + +var _path = require("path"); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; +} + +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { + try { + var info = gen[key](arg); + var value = info.value; + } catch (error) { + reject(error); + return; + } + if (info.done) { + resolve(value); + } else { + Promise.resolve(value).then(_next, _throw); + } +} + +function _asyncToGenerator(fn) { + return function () { + var self = this, + args = arguments; + return new Promise(function (resolve, reject) { + var gen = fn.apply(self, args); + function _next(value) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + } + function _throw(err) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); + } + _next(undefined); + }); + }; +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; +} + +function _classPrivateMethodGet(receiver, privateSet, fn) { + if (!privateSet.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return fn; +} + +const fs = { + read: (0, _util.promisify)(_fs2.default.read), + write: (0, _util.promisify)(_fs2.default.write), + open: (0, _util.promisify)(_fs2.default.open), + close: (0, _util.promisify)(_fs2.default.close) +}; +const nullByte = Buffer.alloc(1); +nullByte[0] = 0; +const constants = { + TYPE_LOSSY: 0, + TYPE_LOSSLESS: 1, + TYPE_EXTENDED: 2 +}; +exports.constants = constants; + +function VP8Width(data) { + let n = (data[7] << 8) | data[6]; + return n & 0b0011111111111111; +} + +function VP8Height(data) { + let n = (data[9] << 8) | data[8]; + return n & 0b0011111111111111; +} + +function VP8LWidth(data) { + let n = (data[2] << 8) | data[1]; + return (n & 0b0011111111111111) + 1; +} + +function VP8LHeight(data) { + let n = (data[4] << 16) | (data[3] << 8) | data[2]; + n = n >> 6; + return (n & 0b0011111111111111) + 1; +} + +function doesVP8LHaveAlpha(data) { + return !!(data[4] & 0b00010000); +} + +function createBasicChunk(name, data) { + let chunk = Buffer.alloc(8), + size = data.length, + out; + chunk.write(name, 0); + chunk.writeUInt32LE(size, 4); + out = [chunk, data]; + + if (size & 1) { + out[2] = nullByte; + } + + return out; +} + +var _convertToExtended = new WeakSet(); + +var _demuxFrame = new WeakSet(); + +var _readHeader = new WeakSet(); + +var _readChunkHeader = new WeakSet(); + +var _readChunkHeader_buf = new WeakSet(); + +var _readChunk_raw = new WeakSet(); + +var _readChunk_VP = new WeakSet(); + +var _readChunk_VP8_buf = new WeakSet(); + +var _readChunk_VP8L = new WeakSet(); + +var _readChunk_VP8L_buf = new WeakSet(); + +var _readChunk_VP8X = new WeakSet(); + +var _readChunk_ANIM = new WeakSet(); + +var _readChunk_ANMF = new WeakSet(); + +var _readChunk_ALPH = new WeakSet(); + +var _readChunk_ALPH_buf = new WeakSet(); + +var _readChunk_ICCP = new WeakSet(); + +var _readChunk_EXIF = new WeakSet(); + +var _readChunk_XMP = new WeakSet(); + +var _readChunk_Skip = new WeakSet(); + +var _read = new WeakSet(); + +class Image { + constructor() { + _read.add(this); + + _readChunk_Skip.add(this); + + _readChunk_XMP.add(this); + + _readChunk_EXIF.add(this); + + _readChunk_ICCP.add(this); + + _readChunk_ALPH_buf.add(this); + + _readChunk_ALPH.add(this); + + _readChunk_ANMF.add(this); + + _readChunk_ANIM.add(this); + + _readChunk_VP8X.add(this); + + _readChunk_VP8L_buf.add(this); + + _readChunk_VP8L.add(this); + + _readChunk_VP8_buf.add(this); + + _readChunk_VP.add(this); + + _readChunk_raw.add(this); + + _readChunkHeader_buf.add(this); + + _readChunkHeader.add(this); + + _readHeader.add(this); + + _demuxFrame.add(this); + + _convertToExtended.add(this); + + _defineProperty(this, "data", null); + + _defineProperty(this, "loaded", false); + + _defineProperty(this, "path", ""); + } + + clear() { + this.data = null; + this.path = ""; + this.loaded = false; + } + + get width() { + if (!this.loaded) { + return undefined; + } + + let d = this.data; + return d.extended + ? d.extended.width + : d.vp8l + ? d.vp8l.width + : d.vp8 + ? d.vp8.width + : undefined; + } + + get height() { + if (!this.loaded) { + return undefined; + } + + let d = this.data; + return d.extended + ? d.extended.height + : d.vp8l + ? d.vp8l.height + : d.vp8 + ? d.vp8.height + : undefined; + } + + get type() { + return this.loaded ? this.data.type : undefined; + } + + get hasAnim() { + return this.loaded + ? this.data.extended + ? this.data.extended.hasAnim + : false + : false; + } + + get anim() { + return this.hasAnim ? this.data.anim : undefined; + } + + get frameCount() { + return this.anim ? this.anim.frameCount : 0; + } + + get iccp() { + return this.data.extended + ? this.data.extended.hasICCP + ? this.data.iccp.raw + : undefined + : undefined; + } + + set iccp(raw) { + if (!this.data.extended) { + _classPrivateMethodGet( + this, + _convertToExtended, + _convertToExtended2 + ).call(this); + } + + if (raw === undefined) { + this.data.extended.hasICCP = false; + delete this.data.iccp; + } else { + this.data.iccp = { + raw + }; + this.data.extended.hasICCP = true; + } + } + + get exif() { + return this.data.extended + ? this.data.extended.hasEXIF + ? this.data.exif.raw + : undefined + : undefined; + } + + set exif(raw) { + if (!this.data.extended) { + _classPrivateMethodGet( + this, + _convertToExtended, + _convertToExtended2 + ).call(this); + } + + if (raw === undefined) { + this.data.extended.hasEXIF = false; + delete this.data.exif; + } else { + this.data.exif = { + raw + }; + this.data.extended.hasEXIF = true; + } + } + + get xmp() { + return this.data.extended + ? this.data.extended.hasXMP + ? this.data.xmp.raw + : undefined + : undefined; + } + + set xmp(raw) { + if (!this.data.extended) { + _classPrivateMethodGet( + this, + _convertToExtended, + _convertToExtended2 + ).call(this); + } + + if (raw === undefined) { + this.data.extended.hasXMP = false; + delete this.data.xmp; + } else { + this.data.xmp = { + raw + }; + this.data.extended.hasXMP = true; + } + } + + load(path) { + var _this = this; + + return _asyncToGenerator(function* () { + _this.path = path; + _this.data = yield _classPrivateMethodGet(_this, _read, _read2).call( + _this, + path + ); + _this.loaded = true; + })(); + } + + demuxAnim(path, frame = -1, prefix = "#FNAME#") { + var _this2 = this; + + return _asyncToGenerator(function* () { + let start = 0, + end = _this2.frameCount; + + if (end == 0) { + throw new Error("This WebP isn't an animation"); + } + + if (frame != -1) { + start = end = frame; + } + + for (let i = start; i <= end; i++) { + yield _classPrivateMethodGet(_this2, _demuxFrame, _demuxFrame2).call( + _this2, + `${path}/${prefix}_${i}.webp`.replace( + /#FNAME#/g, + (0, _path.basename)(_this2.path, ".webp") + ), + _this2.anim.frames[i] + ); + } + })(); + } + + replaceFrame(path, frame) { + var _this3 = this; + + return _asyncToGenerator(function* () { + if (!_this3.hasAnim) { + throw new Error("WebP isn't animated"); + } + + if (frame < 0 || frame >= _this3.frameCount) { + throw new Error( + `Frame index ${frame} out of bounds (0<=index<${_this3.frameCount})` + ); + } + + let r = new Image(); + yield r.load(path); + + switch (r.type) { + case constants.TYPE_LOSSY: + case constants.TYPE_LOSSLESS: + break; + + case constants.TYPE_EXTENDED: + if (r.hasAnim) { + throw new Error("Merging animations not currently supported"); + } + + break; + + default: + throw new Error("Unknown WebP type"); + } + + switch (_this3.anim.frames[frame].type) { + case constants.TYPE_LOSSY: + if (_this3.anim.frames[frame].vp8.alpha) { + delete _this3.anim.frames[frame].alph; + } + + delete _this3.anim.frames[frame].vp8; + break; + + case constants.TYPE_LOSSLESS: + delete _this3.anim.frames[frame].vp8l; + break; + + default: + throw new Error("Unknown frame type"); + } + + switch (r.type) { + case constants.TYPE_LOSSY: + _this3.anim.frames[frame].vp8 = r.data.vp8; + break; + + case constants.TYPE_LOSSLESS: + _this3.anim.frames[frame].vp8l = r.data.vp8l; + break; + + case constants.TYPE_EXTENDED: + if (r.data.vp8) { + _this3.anim.frames[frame].vp8 = r.data.vp8; + + if (r.data.vp8.alpha) { + _this3.anim.frames[frame].alph = r.data.alph; + } + } else if (r.data.vp8l) { + _this3.anim.frames[frame].vp8l = r.data.vp8l; + } + + break; + } + + _this3.anim.frames[frame].width = r.width; + _this3.anim.frames[frame].height = r.height; + })(); + } + + muxAnim({ path, bgColor = [255, 255, 255, 255], loops = 0 } = {}) { + var _this4 = this; + + return _asyncToGenerator(function* () { + return Image.muxAnim({ + path, + bgColor, + loops, + frames: _this4.frames + }); + })(); + } + + static muxAnim({ + path, + frames, + width = 0, + height = 0, + bgColor = [255, 255, 255, 255], + loops = 0, + delay = 100, + x = 0, + y = 0, + blend = true, + dispose = false + } = {}) { + return _asyncToGenerator(function* () { + let header = Buffer.alloc(12), + chunk = Buffer.alloc(18), + out = [], + img, + alpha = false, + size, + _w = 0, + _h = 0; + + let _width = width - 1, + _height = height - 1; + + if (frames.length == 0) { + throw new Error("No frames to mux"); + } else if (_width <= 0 || _width > 1 << 24) { + throw new Error("Width out of range"); + } else if (_height <= 0 || _height > 1 << 24) { + throw new Error("Height out of range"); + } else if (_height * _width > Math.pow(2, 32) - 1) { + throw new Error(`Width*height too large (${_width}, ${_height})`); + } else if (loops < 0 || loops >= 1 << 24) { + throw new Error("Loops out of range"); + } else if (delay < 0 || delay >= 1 << 24) { + throw new Error("Delay out of range"); + } else if (x < 0 || x >= 1 << 24) { + throw new Error("X out of range"); + } else if (y < 0 || y >= 1 << 24) { + throw new Error("Y out of range"); + } + + header.write("RIFF", 0); + header.write("WEBP", 8); + chunk.write("VP8X", 0); + chunk.writeUInt32LE(10, 4); + chunk[8] |= 0b00000010; + + if (width != 0) { + chunk.writeUIntLE(_width, 12, 3); + } + + if (height != 0) { + chunk.writeUIntLE(_height, 15, 3); + } + + out.push(header, chunk); + chunk = Buffer.alloc(14); + chunk.write("ANIM", 0); + chunk.writeUInt32LE(6, 4); + chunk.writeUInt8(bgColor[2], 8); + chunk.writeUInt8(bgColor[1], 9); + chunk.writeUInt8(bgColor[0], 10); + chunk.writeUInt8(bgColor[3], 11); + chunk.writeUInt16LE(loops, 12); + out.push(chunk); + + for (let i = 0, l = frames.length; i < l; i++) { + let _delay = + typeof frames[i].delay === "undefined" ? delay : frames[i].delay, + _x = typeof frames[i].x === "undefined" ? x : frames[i].x, + _y = typeof frames[i].y === "undefined" ? y : frames[i].y, + _blend = + typeof frames[i].blend === "undefined" ? blend : frames[i].blend, + _dispose = + typeof frames[i].dispose === "undefined" + ? dispose + : frames[i].dispose, + size = 16, + keepChunk = true, + imgData; + + if (delay < 0 || delay >= 1 << 24) { + throw new Error(`Delay out of range on frame ${i}`); + } else if (x < 0 || x >= 1 << 24) { + throw new Error(`X out of range on frame ${i}`); + } else if (y < 0 || y >= 1 << 24) { + throw new Error(`Y out of range on frame ${i}`); + } + + chunk = Buffer.alloc(24); + chunk.write("ANMF", 0); + chunk.writeUIntLE(_x, 8, 3); + chunk.writeUIntLE(_y, 11, 3); + chunk.writeUIntLE(_delay, 20, 3); + + if (!_blend) { + chunk[23] |= 0b00000010; + } + + if (_dispose) { + chunk[23] |= 0b00000001; + } + + if (frames[i].path) { + img = new Image(); + yield img.load(frames[i].path); + } else { + img = { + data: frames[i] + }; + } + + chunk.writeUIntLE(img.data.width - 1, 14, 3); + chunk.writeUIntLE(img.data.height - 1, 17, 3); + + switch (img.data.type) { + case constants.TYPE_LOSSY: + { + let c = img.data.vp8; + _w = c.width > _w ? c.width : _w; + _h = c.height > _h ? c.height : _h; + size += c.raw.length + 8; + imgData = createBasicChunk("VP8 ", c.raw); + } + break; + + case constants.TYPE_LOSSLESS: + { + let c = img.data.vp8l; + _w = c.width > _w ? c.width : _w; + _h = c.height > _h ? c.height : _h; + size += c.raw.length + 8; + + if (c.alpha) { + alpha = true; + } + + imgData = createBasicChunk("VP8L", c.raw); + } + break; + + case constants.TYPE_EXTENDED: + if (img.data.extended.hasAnim) { + let fr = img.data.anim.frames; + keepChunk = false; + + if (img.data.extended.hasAlpha) { + alpha = true; + } + + for (let i = 0, l = fr.length; i < l; i++) { + _w = fr[i].width + _x > _w ? fr[i].width + _x : _w; + _h = fr[i].height + _y > _h ? fr[i].height + _y : _h; + let b = Buffer.alloc(8); + b.write("ANMF", 0); + b.writeUInt32LE(fr[i].raw.length, 4); + out.push(b, fr[i].raw); + + if (fr[i].raw.length & 1) { + out.push(nullByte); + } + + b = fr[i].raw; + b.writeUIntLE(_x, 0, 3); + b.writeUIntLE(_y, 3, 3); + b.writeUIntLE(_delay, 12, 3); + + if (!_blend) { + b[15] |= 0b00000010; + } else { + b[15] &= 0b11111101; + } + + if (_dispose) { + b[15] |= 0b00000001; + } else { + b[15] &= 0b11111110; + } + } + } else { + _w = img.data.extended.width > _w ? img.data.extended.width : _w; + _h = + img.data.extended.height > _h ? img.data.extended.height : _h; + + if (img.data.vp8) { + imgData = []; + + if (img.data.alph) { + alpha = true; + imgData.push(...createBasicChunk("ALPH", img.data.alph.raw)); + size += img.data.alph.raw.length + 8; + } + + imgData.push(...createBasicChunk("VP8 ", img.data.vp8.raw)); + size += img.data.vp8.raw.length + 8; + } else if (img.data.vp8l) { + imgData = createBasicChunk("VP8L", img.data.vp8l.raw); + + if (img.data.vp8l.alpha) { + alpha = true; + } + + size += img.data.vp8l.raw.length + 8; + } + } + + break; + + default: + throw new Error("Unknown image type"); + } + + if (keepChunk) { + chunk.writeUInt32LE(size, 4); + out.push(chunk, ...imgData); + } + } + + if (width == 0) { + out[1].writeUIntLE(_w - 1, 12, 3); + } + + if (height == 0) { + out[1].writeUIntLE(_h - 1, 15, 3); + } + + size = 4; + + for (let i = 1, l = out.length; i < l; i++) { + size += out[i].length; + } + + header.writeUInt32LE(size, 4); + + if (alpha) { + out[1][8] |= 0b00010000; + } + + let fp = yield fs.open(path, "w"); + + for (let i = 0, l = out.length; i < l; i++) { + yield fs.write(fp, out[i], 0, undefined, undefined); + } + + yield fs.close(fp); + })(); + } +} + +var _convertToExtended2 = function _convertToExtended2() { + if (!this.loaded) { + throw new Error("No image loaded"); + } + + this.data.type = constants.TYPE_EXTENDED; + this.data.extended = { + hasICC: false, + hasAlpha: false, + hasEXIF: false, + hasXMP: false, + width: this.vp8 ? this.vp8.width : this.vp8l ? this.vp8l.width : 1, + height: this.vp8 ? this.vp8.height : this.vp8l ? this.vp8l.height : 1 + }; +}; + +var _demuxFrame2 = /*#__PURE__*/ (function () { + var _demuxFrame3 = _asyncToGenerator(function* (path, frame) { + let header = Buffer.alloc(12), + size, + chunk, + out = []; + header.write("RIFF", 0); + header.write("WEBP", 8); + out.push(header); + + if ( + this.data.extended.hasICC || + this.data.extended.hasEXIF || + this.data.extended.hasXMP || + (frame.vp8 && frame.vp8.alpha) + ) { + chunk = Buffer.alloc(18); + chunk.write("VP8X", 0); + chunk.writeUInt32LE(10, 4); + + if (this.data.extended.hasICC) { + chunk[8] |= 0b00100000; + } + + if ((frame.vp8l && frame.vp8l.alpha) || (frame.vp8 && frame.vp8.alpha)) { + chunk[8] |= 0b00010000; + } + + if (this.data.extended.hasEXIF) { + chunk[8] |= 0b00001000; + } + + if (this.data.extended.hasXMP) { + chunk[8] |= 0b00000100; + } + + chunk.writeUIntLE(frame.width - 1, 12, 3); + chunk.writeUIntLE(frame.height - 1, 15, 3); + out.push(chunk); + + if (this.data.extended.hasICC) { + out.push(...createBasicChunk("ICCP", this.data.extended.icc.raw)); + } + } + + if (frame.vp8l) { + out.push(...createBasicChunk("VP8L", frame.vp8l.raw)); + } else if (frame.vp8) { + if (frame.vp8.alpha) { + out.push(...createBasicChunk("ALPH", frame.alph.raw)); + } + + out.push(...createBasicChunk("VP8 ", frame.vp8.raw)); + } else { + throw new Error("Frame has no VP8/VP8L?"); + } + + if (this.type == constants.TYPE_EXTENDED) { + if (this.data.extended.hasEXIF) { + out.push(...createBasicChunk("EXIF", this.data.extended.exif.raw)); + } + + if (this.data.extended.hasXMP) { + out.push(...createBasicChunk("XMP ", this.data.extended.xmp.raw)); + } + } + + size = 4; + + for (let i = 1, l = out.length; i < l; i++) { + size += out[i].length; + } + + header.writeUInt32LE(size, 4); + let fp = yield fs.open(path, "w"); + + for (let i = 0, l = out.length; i < l; i++) { + yield fs.write(fp, out[i], 0, undefined, undefined); + } + + yield fs.close(fp); + }); + + function _demuxFrame2(_x2, _x3) { + return _demuxFrame3.apply(this, arguments); + } + + return _demuxFrame2; +})(); + +var _readHeader2 = /*#__PURE__*/ (function () { + var _readHeader3 = _asyncToGenerator(function* (fd) { + let buf = Buffer.alloc(12); + let { bytesRead } = yield fs.read(fd, buf, 0, 12, undefined); + + if (bytesRead != 12) { + throw new Error("Reached end of file while reading header"); + } + + if (buf.toString("utf8", 0, 4) != "RIFF") { + throw new Error("Bad header (not RIFF)"); + } + + if (buf.toString("utf8", 8, 12) != "WEBP") { + throw new Error("Bad header (not WEBP)"); + } + + return { + fileSize: buf.readUInt32LE(4) + }; + }); + + function _readHeader2(_x4) { + return _readHeader3.apply(this, arguments); + } + + return _readHeader2; +})(); + +var _readChunkHeader2 = /*#__PURE__*/ (function () { + var _readChunkHeader3 = _asyncToGenerator(function* (fd) { + let buf = Buffer.alloc(8); + let { bytesRead } = yield fs.read(fd, buf, 0, 8, undefined); + + if (bytesRead == 0) { + return { + fourCC: "\x00\x00\x00\x00", + size: 0 + }; + } else if (bytesRead < 8) { + throw new Error("Reached end of file while reading chunk header"); + } + + return { + fourCC: buf.toString("utf8", 0, 4), + size: buf.readUInt32LE(4) + }; + }); + + function _readChunkHeader2(_x5) { + return _readChunkHeader3.apply(this, arguments); + } + + return _readChunkHeader2; +})(); + +var _readChunkHeader_buf2 = function _readChunkHeader_buf2(buf, cursor) { + if (cursor >= buf.length) { + return { + fourCC: "\x00\x00\x00\x00", + size: 0 + }; + } + + return { + fourCC: buf.toString("utf8", cursor, cursor + 4), + size: buf.readUInt32LE(cursor + 4) + }; +}; + +var _readChunk_raw2 = /*#__PURE__*/ (function () { + var _readChunk_raw3 = _asyncToGenerator(function* (n, fd, size) { + let buf = Buffer.alloc(size), + discard = Buffer.alloc(1); + let { bytesRead } = yield fs.read(fd, buf, 0, size, undefined); + + if (bytesRead != size) { + throw new Error(`Reached end of file while reading ${n} chunk`); + } + + if (size & 1) { + yield fs.read(fd, discard, 0, 1, undefined); + } + + return { + raw: buf + }; + }); + + function _readChunk_raw2(_x6, _x7, _x8) { + return _readChunk_raw3.apply(this, arguments); + } + + return _readChunk_raw2; +})(); + +var _readChunk_VP2 = /*#__PURE__*/ (function () { + var _readChunk_VP3 = _asyncToGenerator(function* (fd, size) { + let buf = Buffer.alloc(size), + discard = Buffer.alloc(1); + let { bytesRead } = yield fs.read(fd, buf, 0, size, undefined); + + if (bytesRead != size) { + throw new Error("Reached end of file while reading VP8 chunk"); + } + + if (size & 1) { + yield fs.read(fd, discard, 0, 1, undefined); + } + + return { + raw: buf, + width: VP8Width(buf, 8), + height: VP8Height(buf, 8) + }; + }); + + function _readChunk_VP2(_x9, _x10) { + return _readChunk_VP3.apply(this, arguments); + } + + return _readChunk_VP2; +})(); + +var _readChunk_VP8_buf2 = function _readChunk_VP8_buf2(buf, size, cursor) { + if (cursor >= buf.length) { + throw new Error("Reached end of buffer while reading VP8 chunk"); + } + + let raw = buf.slice(cursor, cursor + size); + return { + raw, + width: VP8Width(raw), + height: VP8Height(raw) + }; +}; + +var _readChunk_VP8L2 = /*#__PURE__*/ (function () { + var _readChunk_VP8L3 = _asyncToGenerator(function* (fd, size) { + let buf = Buffer.alloc(size), + discard = Buffer.alloc(1); + let { bytesRead } = yield fs.read(fd, buf, 0, size, undefined); + + if (bytesRead != size) { + throw new Error("Reached end of file while reading VP8L chunk"); + } + + if (size & 1) { + yield fs.read(fd, discard, 0, 1, undefined); + } + + return { + raw: buf, + alpha: doesVP8LHaveAlpha(buf, 0), + width: VP8LWidth(buf), + height: VP8LHeight(buf) + }; + }); + + function _readChunk_VP8L2(_x11, _x12) { + return _readChunk_VP8L3.apply(this, arguments); + } + + return _readChunk_VP8L2; +})(); + +var _readChunk_VP8L_buf2 = function _readChunk_VP8L_buf2(buf, size, cursor) { + if (cursor >= buf.length) { + throw new Error("Reached end of buffer while reading VP8L chunk"); + } + + let raw = buf.slice(cursor, cursor + size); + return { + raw, + alpha: doesVP8LHaveAlpha(raw), + width: VP8LWidth(raw), + height: VP8LHeight(raw) + }; +}; + +var _readChunk_VP8X2 = /*#__PURE__*/ (function () { + var _readChunk_VP8X3 = _asyncToGenerator(function* (fd, size) { + let buf = Buffer.alloc(size); + let { bytesRead } = yield fs.read(fd, buf, 0, size, undefined); + + if (bytesRead != size) { + throw new Error("Reached end of file while reading VP8X chunk"); + } + + return { + raw: buf, + hasICC: !!(buf[0] & 0b00100000), + hasAlpha: !!(buf[0] & 0b00010000), + hasEXIF: !!(buf[0] & 0b00001000), + hasXMP: !!(buf[0] & 0b00000100), + hasAnim: !!(buf[0] & 0b00000010), + width: buf.readUIntLE(4, 3) + 1, + height: buf.readUIntLE(7, 3) + 1 + }; + }); + + function _readChunk_VP8X2(_x13, _x14) { + return _readChunk_VP8X3.apply(this, arguments); + } + + return _readChunk_VP8X2; +})(); + +var _readChunk_ANIM2 = /*#__PURE__*/ (function () { + var _readChunk_ANIM3 = _asyncToGenerator(function* (fd, size) { + let buf = Buffer.alloc(size); + let { bytesRead } = yield fs.read(fd, buf, 0, size, undefined); + + if (bytesRead != size) { + throw new Error("Reached end of file while reading ANIM chunk"); + } + + return { + raw: buf, + bgColor: buf.slice(0, 4), + loopCount: buf.readUInt16LE(4) + }; + }); + + function _readChunk_ANIM2(_x15, _x16) { + return _readChunk_ANIM3.apply(this, arguments); + } + + return _readChunk_ANIM2; +})(); + +var _readChunk_ANMF2 = /*#__PURE__*/ (function () { + var _readChunk_ANMF3 = _asyncToGenerator(function* (fd, size) { + let buf = Buffer.alloc(size), + discard = Buffer.alloc(1); + let { bytesRead } = yield fs.read(fd, buf, 0, size, undefined); + + if (bytesRead != size) { + throw new Error("Reached end of file while reading ANMF chunk"); + } + + if (size & 1) { + yield fs.read(fd, discard, 0, 1, undefined); + } + + let out = { + raw: buf, + x: buf.readUIntLE(0, 3), + y: buf.readUIntLE(3, 3), + width: buf.readUIntLE(6, 3) + 1, + height: buf.readUIntLE(9, 3) + 1, + duration: buf.readUIntLE(12, 3), + blend: !(buf[15] & 0b00000010), + dispose: !!(buf[15] & 0b00000001) + }; + let keepLooping = true, + cursor = 16; + + while (keepLooping) { + let header = _classPrivateMethodGet( + this, + _readChunkHeader_buf, + _readChunkHeader_buf2 + ).call(this, buf, cursor), + t; + + cursor += 8; + + switch (header.fourCC) { + case "VP8 ": + if (!out.vp8) { + out.type = constants.TYPE_LOSSY; + out.vp8 = _classPrivateMethodGet( + this, + _readChunk_VP8_buf, + _readChunk_VP8_buf2 + ).call(this, buf, header.size, cursor); + } + + break; + + case "VP8L": + if (!out.vp8l) { + out.type = constants.TYPE_LOSSLESS; + out.vp8l = _classPrivateMethodGet( + this, + _readChunk_VP8L_buf, + _readChunk_VP8L_buf2 + ).call(this, buf, header.size, cursor); + } + + break; + + case "ALPH": + if (out.vp8) { + out.alph = _classPrivateMethodGet( + this, + _readChunk_ALPH_buf, + _readChunk_ALPH_buf2 + ).call(this, buf, header.size, cursor); + out.vp8.alpha = true; + } + + break; + + case "\x00\x00\x00\x00": + default: + keepLooping = false; + break; + } + + cursor += header.size + 1; + + if (header.size & 1) { + cursor++; + } + + if (cursor >= buf.length) { + keepLooping = false; + } + } + + return out; + }); + + function _readChunk_ANMF2(_x17, _x18) { + return _readChunk_ANMF3.apply(this, arguments); + } + + return _readChunk_ANMF2; +})(); + +var _readChunk_ALPH2 = /*#__PURE__*/ (function () { + var _readChunk_ALPH3 = _asyncToGenerator(function* (fd, size) { + return _classPrivateMethodGet(this, _readChunk_raw, _readChunk_raw2).call( + this, + "ALPH", + fd, + size + ); + }); + + function _readChunk_ALPH2(_x19, _x20) { + return _readChunk_ALPH3.apply(this, arguments); + } + + return _readChunk_ALPH2; +})(); + +var _readChunk_ALPH_buf2 = function _readChunk_ALPH_buf2(buf, size, cursor) { + if (cusor >= buf.length) { + throw new Error("Reached end of buffer while reading ALPH chunk"); + } + + return { + raw: buf.slice(cursor, cursor + size) + }; +}; + +var _readChunk_ICCP2 = /*#__PURE__*/ (function () { + var _readChunk_ICCP3 = _asyncToGenerator(function* (fd, size) { + return _classPrivateMethodGet(this, _readChunk_raw, _readChunk_raw2).call( + this, + "ICCP", + fd, + size + ); + }); + + function _readChunk_ICCP2(_x21, _x22) { + return _readChunk_ICCP3.apply(this, arguments); + } + + return _readChunk_ICCP2; +})(); + +var _readChunk_EXIF2 = /*#__PURE__*/ (function () { + var _readChunk_EXIF3 = _asyncToGenerator(function* (fd, size) { + return _classPrivateMethodGet(this, _readChunk_raw, _readChunk_raw2).call( + this, + "EXIF", + fd, + size + ); + }); + + function _readChunk_EXIF2(_x23, _x24) { + return _readChunk_EXIF3.apply(this, arguments); + } + + return _readChunk_EXIF2; +})(); + +var _readChunk_XMP2 = /*#__PURE__*/ (function () { + var _readChunk_XMP3 = _asyncToGenerator(function* (fd, size) { + return _classPrivateMethodGet(this, _readChunk_raw, _readChunk_raw2).call( + this, + "XML", + fd, + size + ); + }); + + function _readChunk_XMP2(_x25, _x26) { + return _readChunk_XMP3.apply(this, arguments); + } + + return _readChunk_XMP2; +})(); + +var _readChunk_Skip2 = /*#__PURE__*/ (function () { + var _readChunk_Skip3 = _asyncToGenerator(function* (fd, size) { + let buf = Buffer.alloc(size), + discard = Buffer.alloc(1); + let { bytesRead } = yield fs.read(fd, buf, 0, size, undefined); + + if (bytesRead != size) { + throw new Error("Reached end of file while skipping chunk"); + } + + if (size & 1) { + yield fs.read(fd, discard, 0, 1, undefined); + } + }); + + function _readChunk_Skip2(_x27, _x28) { + return _readChunk_Skip3.apply(this, arguments); + } + + return _readChunk_Skip2; +})(); + +var _read2 = /*#__PURE__*/ (function () { + var _read3 = _asyncToGenerator(function* (path) { + let fd = yield fs.open(path, "r"), + out = {}, + keepLooping = true, + first = true; + let { fileSize } = yield _classPrivateMethodGet( + this, + _readHeader, + _readHeader2 + ).call(this, fd); + + while (keepLooping) { + let { fourCC, size } = yield _classPrivateMethodGet( + this, + _readChunkHeader, + _readChunkHeader2 + ).call(this, fd); + + switch (fourCC) { + case "VP8 ": + if (!out.vp8) { + out.vp8 = yield _classPrivateMethodGet( + this, + _readChunk_VP, + _readChunk_VP2 + ).call(this, fd, size); + } else { + yield _classPrivateMethodGet( + this, + _readChunk_Skip, + _readChunk_Skip2 + ).call(this, fd, size); + } + + if (first) { + out.type = constants.TYPE_LOSSY; + keepLooping = false; + } + + break; + + case "VP8L": + if (!out.vp8l) { + out.vp8l = yield _classPrivateMethodGet( + this, + _readChunk_VP8L, + _readChunk_VP8L2 + ).call(this, fd, size); + } else { + yield _classPrivateMethodGet( + this, + _readChunk_Skip, + _readChunk_Skip2 + ).call(this, fd, size); + } + + if (first) { + out.type = constants.TYPE_LOSSLESS; + keepLooping = false; + } + + break; + + case "VP8X": + if (!out.extended) { + out.type = constants.TYPE_EXTENDED; + out.extended = yield _classPrivateMethodGet( + this, + _readChunk_VP8X, + _readChunk_VP8X2 + ).call(this, fd, size); + } else { + yield _classPrivateMethodGet( + this, + _readChunk_Skip, + _readChunk_Skip2 + ).call(this, fd, size); + } + + break; + + case "ANIM": + if (!out.anim) { + let { raw, bgColor, loopCount } = yield _classPrivateMethodGet( + this, + _readChunk_ANIM, + _readChunk_ANIM2 + ).call(this, fd, size); + out.anim = { + backgroundColor: [bgColor[2], bgColor[1], bgColor[0], bgColor[3]], + loopCount, + frames: [] + }; + out.anim.raw = raw; + } else { + yield _classPrivateMethodGet( + this, + _readChunk_Skip, + _readChunk_Skip2 + ).call(this, fd, size); + } + + break; + + case "ANMF": + { + let f = yield _classPrivateMethodGet( + this, + _readChunk_ANMF, + _readChunk_ANMF2 + ).call(this, fd, size); + out.anim.frames.push(f); + } + break; + + case "ALPH": + if (!out.alph) { + out.alph = yield _classPrivateMethodGet( + this, + _readChunk_ALPH, + _readChunk_ALPH2 + ).call(this, fd, size); + } else { + yield _classPrivateMethodGet( + this, + _readChunk_Skip, + _readChunk_Skip2 + ).call(this, fd, size); + } + + break; + + case "ICCP": + if (!out.iccp) { + out.iccp = yield _classPrivateMethodGet( + this, + _readChunk_ICCP, + _readChunk_ICCP2 + ).call(this, fd, size); + } else { + yield _classPrivateMethodGet( + this, + _readChunk_Skip, + _readChunk_Skip2 + ).call(this, fd, size); + } + + break; + + case "EXIF": + if (!out.exif) { + out.exif = yield _classPrivateMethodGet( + this, + _readChunk_EXIF, + _readChunk_EXIF2 + ).call(this, fd, size); + } else { + yield _classPrivateMethodGet( + this, + _readChunk_Skip, + _readChunk_Skip2 + ).call(this, fd, size); + } + + break; + + case "XMP ": + if (!out.xmp) { + out.xmp = yield _classPrivateMethodGet( + this, + _readChunk_XMP, + _readChunk_XMP2 + ).call(this, fd, size); + } else { + yield _classPrivateMethodGet( + this, + _readChunk_Skip, + _readChunk_Skip2 + ).call(this, fd, size); + } + + break; + + case "\x00\x00\x00\x00": + keepLooping = false; + break; + + default: + yield _classPrivateMethodGet( + this, + _readChunk_Skip, + _readChunk_Skip2 + ).call(this, fd, size); + break; + } + + first = false; + } + + if (out.type == constants.TYPE_EXTENDED && out.extended.hasAnim) { + out.anim.frameCount = out.anim.frames.length; + } + + return out; + }); + + function _read2(_x29) { + return _read3.apply(this, arguments); + } + + return _read2; +})(); + +var _default = { + TYPE_LOSSY: constants.TYPE_LOSSY, + TYPE_LOSSLESS: constants.TYPE_LOSSLESS, + TYPE_EXTENDED: constants.TYPE_EXTENDED, + Image +}; +exports.default = _default; diff --git a/lib/webp2mp4.js b/lib/webp2mp4.js new file mode 100644 index 0000000000000000000000000000000000000000..467bb77a4e19624c4d07a67203352d7b32e96b3d --- /dev/null +++ b/lib/webp2mp4.js @@ -0,0 +1,63 @@ +const fetch = require('node-fetch') +const FormData = require('form-data') +const { JSDOM } = require('jsdom') + +async function webp2mp4(source) { + let form = new FormData + let isUrl = typeof source === 'string' && /https?:\/\//.test(source) + form.append('new-image-url', isUrl ? source : '') + form.append('new-image', isUrl ? '' : source, 'image.webp') + let res = await fetch('https://s6.ezgif.com/webp-to-mp4', { + method: 'POST', + body: form + }) + let html = await res.text() + let { document } = new JSDOM(html).window + let form2 = new FormData + let obj = {} + for (let input of document.querySelectorAll('form input[name]')) { + obj[input.name] = input.value + form2.append(input.name, input.value) + } + let res2 = await fetch('https://ezgif.com/webp-to-mp4/' + obj.file, { + method: 'POST', + body: form2 + }) + let html2 = await res2.text() + let { document: document2 } = new JSDOM(html2).window + return new URL(document2.querySelector('div#output > p.outfile > video > source').src, res2.url).toString() +} + +async function webp2png(source) { + let form = new FormData + let isUrl = typeof source === 'string' && /https?:\/\//.test(source) + form.append('new-image-url', isUrl ? source : '') + form.append('new-image', isUrl ? '' : source, 'image.webp') + let res = await fetch('https://s6.ezgif.com/webp-to-png', { + method: 'POST', + body: form + }) + let html = await res.text() + let { document } = new JSDOM(html).window + let form2 = new FormData + let obj = {} + for (let input of document.querySelectorAll('form input[name]')) { + obj[input.name] = input.value + form2.append(input.name, input.value) + } + let res2 = await fetch('https://ezgif.com/webp-to-png/' + obj.file, { + method: 'POST', + body: form2 + }) + let html2 = await res2.text() + let { document: document2 } = new JSDOM(html2).window + return new URL(document2.querySelector('div#output > p.outfile > img').src, res2.url).toString() +} + +if (require.main === module) { + // TODO: Test + webp2mp4('https://mathiasbynens.be/demo/animated-webp-supported.webp').then(console.error) + webp2png('https://mathiasbynens.be/demo/animated-webp-supported.webp').then(console.error) +} else { + module.exports = { webp2mp4, webp2png } +} diff --git a/lib/welcome.js b/lib/welcome.js new file mode 100644 index 0000000000000000000000000000000000000000..c98876ebb650a89b61a175b4ea65db17f89b74d7 --- /dev/null +++ b/lib/welcome.js @@ -0,0 +1,114 @@ +const { DOMImplementation, XMLSerializer } = require('xmldom'); +const JsBarcode = require('jsbarcode') +const { JSDOM } = require('jsdom') +const fs = require('fs') +const path = require('path') +const cp = require('child_process') + +const src = path.join(__dirname, '..', 'src') +const _svg = fs.readFileSync(path.join(src, 'welcome.svg'), 'utf-8') +const barcode = data => { + const xmlSerializer = new XMLSerializer(); + const document = new DOMImplementation().createDocument('http://www.w3.org/1999/xhtml', 'html', null); + const svgNode = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); + + JsBarcode(svgNode, data, { + xmlDocument: document, + }); + + return xmlSerializer.serializeToString(svgNode); +} +const imageSetter = (img, value) => img.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', value) +const textSetter = (el, value) => el.textContent = value + +let { document: svg } = new JSDOM(_svg).window +/** + * Generate SVG Welcome + * @param {object} param0 + * @param {string} param0.wid + * @param {string} param0.pp + * @param {string} param0.name + * @param {string} param0.text + * @param {string} param0.background + * @returns {string} + */ +const genSVG = async ({ + wid = '', + pp = path.join(src, 'avatar_contact.png'), + title = '', + name = '', + text = '', + background = '' +} = {}) => { + let el = { + code: ['#_1661899539392 > g:nth-child(6) > image', imageSetter, toBase64(await toImg(barcode(wid.replace(/[^0-9]/g, '')), 'png'), 'image/png')], + pp: ['#_1661899539392 > g:nth-child(3) > image', imageSetter, pp], + text: ['#_1661899539392 > text.fil1.fnt0', textSetter, text], + title: ['#_1661899539392 > text.fil2.fnt1', textSetter, title], + name: ['#_1661899539392 > text.fil2.fnt2', textSetter, name], + bg: ['#_1661899539392 > g:nth-child(2) > image', imageSetter, background], + } + for (let [selector, set, value] of Object.values(el)) { + set(svg.querySelector(selector), value) + } + return svg.body.innerHTML +} + +const toImg = (svg, format = 'png') => new Promise((resolve, reject) => { + if (!svg) return resolve(Buffer.alloc(0)) + let bufs = [] + let im = cp.spawn('magick', ['convert', 'svg:-', format + ':-']) + im.on('error', e => reject(e)) + im.stdout.on('data', chunk => bufs.push(chunk)) + im.stdin.write(Buffer.from(svg)) + im.stdin.end() + im.on('close', code => { + if (code !== 0) reject(code) + resolve(Buffer.concat(bufs)) + }) +}) + +const toBase64 = (buffer, mime) => `data:${mime};base64,${buffer.toString('base64')}` + +/** + * Render SVG Welcome + * @param {object} param0 + * @param {string} param0.wid + * @param {string} param0.pp + * @param {string} param0.name + * @param {string} param0.text + * @param {string} param0.background + * @returns {Promise} + */ +const render = async ({ + wid = '', + pp = toBase64(fs.readFileSync(path.join(src, 'avatar_contact.png')), 'image/png'), + name = '', + title = '', + text = '', + background = toBase64(fs.readFileSync(path.join(src, 'Aesthetic', 'Aesthetic_000.jpeg')), 'image/jpeg'), +} = {}, format = 'png') => { + let svg = await genSVG({ + wid, pp, name, text, background, title + }) + return await toImg(svg, format) +} + +if (require.main === module) { + render({ + wid: '1234567890', + // pp: '', + name: 'John Doe', + text: 'Lorem ipsum\ndot sit color', + title: 'grup testing' + // background: '' + }, 'jpg').then(result => { + // console.log(result) + process.stdout.write(result) + }) + // toImg(barcode('test')).then(result => { + // // console.log(result) + // process.stdout.write(result) + + // }) +} else module.exports = render diff --git a/lib/werewolf.js b/lib/werewolf.js new file mode 100644 index 0000000000000000000000000000000000000000..0c6dfda4bac04e76bb5e4618413b1a6fa4c2c7cb --- /dev/null +++ b/lib/werewolf.js @@ -0,0 +1,1239 @@ +let toMs = require("ms"); +let jimp = require("jimp"); + +let thumb1 = + "https://user-images.githubusercontent.com/72728486/235344562-4677d2ad-48ee-419d-883f-e0ca9ba1c7b8.jpg"; +let thumb2 = + "https://user-images.githubusercontent.com/72728486/235344861-acdba7d1-8fce-41b8-adf6-337c818cda2b.jpg"; +let thumb3 = + "https://user-images.githubusercontent.com/72728486/235316834-f9f84ba0-8df3-4444-81d8-db5270995e6d.jpg"; +let thumb4 = + "https://user-images.githubusercontent.com/72728486/235354619-6ad1cabd-216c-4c7c-b7c2-3a564836653a.jpg"; +let thumb5 = + "https://user-images.githubusercontent.com/72728486/235365156-cfab66ce-38b2-4bc7-90d7-7756fc320e06.jpg"; +let thumb6 = + "https://user-images.githubusercontent.com/72728486/235365148-35b8def7-c1a2-451d-a2f2-6b6a911b37db.jpg"; + +const resize = async (image, width, height) => { + const read = await jimp.read(image); + const data = await read.resize(width, height).getBufferAsync(jimp.MIME_JPEG); + return data; +}; +var a; +var b; +var d; +var e; +var f; +var textnya; +var idd; +var room; + +async function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +function emoji_role(role) { + if (role === "warga") { + return "๐Ÿ‘ฑโ€โ™‚๏ธ"; + } else if (role === "seer") { + return "๐Ÿ‘ณ"; + } else if (role === "guardian") { + return "๐Ÿ‘ผ"; + } else if (role === "sorcerer") { + return "๐Ÿ”ฎ"; + } else if (role === "werewolf") { + return "๐Ÿบ"; + } else { + return ""; + } +} + +const findObject = (obj = {}, key, value) => { + const result = []; + const recursiveSearch = (obj = {}) => { + if (!obj || typeof obj !== "object") { + return; + } + if (obj[key] === value) { + result.push(obj); + } + Object.keys(obj).forEach(function(k) { + recursiveSearch(obj[k]); + }); + }; + recursiveSearch(obj); + return result; +}; + +// sessions +const sesi = (from, data) => { + if (!data[from]) return false; + return data[from]; +}; + +// check sessions +const playerOnGame = (sender, data) => { + let result = findObject(data, "id", sender); + let index = false; + if (result.length === 0) { + return index; + } else { + index = true; + } + return index; +}; + +// in room +const playerOnRoom = (sender, from, data) => { + let result = findObject(data, "id", sender); + let index = false; + if (result.length > 0 && result[0].sesi === from) { + index = true; + } else { + return index; + } + return index; +}; + +// get data player +const dataPlayer = (sender, data) => { + let result = findObject(data, "id", sender); + let index = false; + if (result.length > 0 && result[0].id === sender) { + index = result[0]; + } else { + return index; + } + return index; +}; + +// get data player by id +const dataPlayerById = (id, data) => { + let result = findObject(data, "number", id); + let index = false; + if (result.length > 0 && result[0].number === id) { + index = result[0]; + } else { + return index; + } + return index; +}; + +// keluar game +const playerExit = (from, id, data) => { + room = sesi(from, data); + if (!room) return false; + const indexPlayer = room.player.findIndex((i) => i.id === id); + room.player.splice(indexPlayer, 1); +}; + +// get player id +const getPlayerById = (from, sender, id, data) => { + room = sesi(from, data); + if (!room) return false; + const indexPlayer = room.player.findIndex((i) => i.number === id); + if (indexPlayer === -1) return false; + return { + index: indexPlayer, + sesi: room.player[indexPlayer].sesi, + db: room.player[indexPlayer], + }; +}; + +// get player id 2 +const getPlayerById2 = (sender, id, data) => { + let result = findObject(data, "id", sender); + if (result.length > 0 && result[0].id === sender) { + let from = result[0].sesi; + room = sesi(from, data); + if (!room) return false; + const indexPlayer = room.player.findIndex((i) => i.number === id); + if (indexPlayer === -1) return false; + return { + index: indexPlayer, + sesi: room.player[indexPlayer].sesi, + db: room.player[indexPlayer], + }; + } +}; + +// werewolf kill +const killWerewolf = (sender, id, data) => { + let result = getPlayerById2(sender, id, data); + if (!result) return false; + let { + index, + sesi, + db + } = result; + if (data[sesi].player[index].number === id) { + if (db.effect.includes("guardian")) { + data[sesi].guardian.push(parseInt(id)); + data[sesi].dead.push(parseInt(id)); + } else if (!db.effect.includes("guardian")) { + data[sesi].dead.push(parseInt(id)); + } + } +}; + +// seer dreamy +const dreamySeer = (sender, id, data) => { + let result = getPlayerById2(sender, id, data); + if (!result) return false; + let { + index, + sesi, + db + } = result; + if (data[sesi].player[index].role === "werewolf") { + data[sesi].seer = true; + } + return data[sesi].player[index].role; +}; + +// seer dreamy +const sorcerer = (sender, id, data) => { + let result = getPlayerById2(sender, id, data); + if (!result) return false; + let { + index, + sesi, + db + } = result; + return data[sesi].player[index].role; +}; + +// guardian protect +const protectGuardian = (sender, id, data) => { + let result = getPlayerById2(sender, id, data); + if (!result) return false; + let { + index, + sesi, + db + } = result; + data[sesi].player[index].effect.push("guardian"); +}; + +// pengacakan role +const roleShuffle = (array) => { + let currentIndex = array.length, + randomIndex; + while (currentIndex != 0) { + randomIndex = Math.floor(Math.random() * currentIndex); + currentIndex--; + [array[currentIndex], array[randomIndex]] = [ + array[randomIndex], + array[currentIndex], + ]; + } + return array; +}; + +// memberikan role ke player +const roleChanger = (from, id, role, data) => { + room = sesi(from, data); + if (!room) return false; + var index = room.player.findIndex((i) => i.id === id); + if (index === -1) return false; + room.player[index].role = role; +}; + +// memberikan peran ke semua player +const roleAmount = (from, data) => { + const result = sesi(from, data); + if (!result) return false; + if (result.player.length == 4) { + return { + werewolf: 1, + seer: 1, + guardian: 1, + warga: 1, + sorcere: 0, + }; + } else if (result.player.length == 5) { + return { + werewolf: 1, + seer: 1, + guardian: 1, + warga: 3, + sorcere: 0, + }; + } else if (result.player.length == 6) { + return { + werewolf: 2, + seer: 1, + guardian: 1, + warga: 2, + sorcere: 0, + }; + } else if (result.player.length == 7) { + return { + werewolf: 2, + seer: 1, + guardian: 1, + warga: 3, + sorcere: 0, + }; + } else if (result.player.length == 8) { + return { + werewolf: 2, + seer: 1, + guardian: 1, + warga: 4, + sorcere: 0, + }; + } else if (result.player.length == 9) { + return { + werewolf: 2, + seer: 1, + guardian: 1, + warga: 4, + sorcere: 1, + }; + } else if (result.player.length == 10) { + return { + werewolf: 2, + seer: 1, + guardian: 1, + warga: 5, + sorcere: 1, + }; + } else if (result.player.length == 11) { + return { + werewolf: 2, + seer: 1, + guardian: 2, + warga: 5, + sorcere: 1, + }; + } else if (result.player.length == 12) { + return { + werewolf: 2, + seer: 1, + guardian: 2, + warga: 6, + sorcere: 1, + }; + } else if (result.player.length == 13) { + return { + werewolf: 2, + seer: 1, + guardian: 1, + warga: 7, + sorcere: 1, + }; + } else if (result.player.length == 14) { + return { + werewolf: 2, + seer: 2, + guardian: 2, + warga: 7, + sorcere: 1, + }; + } else if (result.player.length == 15) { + return { + werewolf: 3, + seer: 2, + guardian: 3, + warga: 6, + sorcere: 1, + }; + } +}; + +const roleGenerator = (from, data) => { + room = sesi(from, data); + if (!room) return false; + var role = roleAmount(from, data); + for (var i = 0; i < role.werewolf; i++) { + var player = room.player.filter((x) => x.role === false); + var list = roleShuffle(player); + if (list.length === 0) return false; + var random = Math.floor(Math.random() * list.length); + roleChanger(from, list[random].id, "werewolf", data); + } + for (var i = 0; i < role.seer; i++) { + var player = room.player.filter((x) => x.role === false); + var list = roleShuffle(player); + if (list.length === 0) return false; + var random = Math.floor(Math.random() * list.length); + roleChanger(from, list[random].id, "seer", data); + } + for (var i = 0; i < role.guardian; i++) { + var player = room.player.filter((x) => x.role === false); + var list = roleShuffle(player); + if (list.length === 0) return false; + var random = Math.floor(Math.random() * list.length); + roleChanger(from, list[random].id, "guardian", data); + } + for (var i = 0; i < role.warga; i++) { + var player = room.player.filter((x) => x.role === false); + var list = roleShuffle(player); + if (list.length === 0) return false; + var random = Math.floor(Math.random() * list.length); + roleChanger(from, list[random].id, "warga", data); + } + for (var i = 0; i < role.sorcere; i++) { + var player = room.player.filter((x) => x.role === false); + var list = roleShuffle(player); + if (list.length === 0) return false; + var random = Math.floor(Math.random() * list.length); + roleChanger(from, list[random].id, "sorcerer", data); + } + shortPlayer(from, data); +}; + +// add cooldown +const addTimer = (from, data) => { + room = sesi(from, data); + if (!room) return false; + room.cooldown = Date.now() + toMs(90 + "s"); +}; + +// merubah status room, dalam permainan +const startGame = (from, data) => { + room = sesi(from, data); + if (!room) return false; + room.status = true; +}; + +// rubah hari +const changeDay = (from, data) => { + room = sesi(from, data); + if (!room) return false; + if (room.time === "pagi") { + room.time = "voting"; + } else if (room.time === "malem") { + room.time = "pagi"; + room.day += 1; + } else if (room.time === "voting") { + room.time = "malem"; + } +}; + +// hari voting +const dayVoting = (from, data) => { + room = sesi(from, data); + if (!room) return false; + if (room.time === "malem") { + room.time = "voting"; + } else if (room.time === "pagi") { + room.time = "voting"; + } +}; + +// voting +const vote = (from, id, sender, data) => { + room = sesi(from, data); + if (!room) return false; + const idGet = room.player.findIndex((i) => i.id === sender); + if (idGet === -1) return false; + const indexPlayer = room.player.findIndex((i) => i.number === id); + if (indexPlayer === -1) return false; + if (idGet !== -1) { + room.player[idGet].isvote = true; + } + room.player[indexPlayer].vote += 1; +}; + +// hasil voting +const voteResult = (from, data) => { + room = sesi(from, data); + if (!room) return false; + room.player.sort((a, b) => (a.vote < b.vote ? 1 : -1)); + if (room.player[0].vote === 0) return 0; + if (room.player[0].vote === room.player[1].vote) return 1; + return room.player[0]; +}; + +// vote killing +const voteKill = (from, data) => { + room = sesi(from, data); + if (!room) return false; + room.player.sort((a, b) => (a.vote < b.vote ? 1 : -1)); + if (room.player[0].vote === 0) return 0; + if (room.player[0].vote === room.player[1].vote) return 1; + room.player[0].isdead = true; +}; + +// voting reset +const resetVote = (from, data) => { + room = sesi(from, data); + if (!room) return false; + for (let i = 0; i < room.player.length; i++) { + room.player[i].vote = 0; + } +}; + +const voteDone = (from, data) => { + room = sesi(from, data); + if (!room) return false; + room.voting = false; +}; + +const voteStart = (from, data) => { + room = sesi(from, data); + if (!room) return false; + room.voting = true; +}; + +// clear vote +const clearAllVote = (from, data) => { + room = sesi(from, data); + if (!room) return false; + for (let i = 0; i < room.player.length; i++) { + room.player[i].vote = 0; + room.player[i].isvote = false; + } +}; + +// clearAll +const clearAll = (from, data) => { + room = sesi(from, data); + if (!room) return false; + room.dead = []; + room.seer = false; + room.guardian = []; + room.voting = false; +}; + +// clear all status player +const clearAllSTATUS = (from, data) => { + room = sesi(from, data); + if (!room) return false; + for (let i = 0; i < room.player.length; i++) { + room.player[i].effect = []; + } +}; + +const skillOn = (from, data) => { + room = sesi(from, data); + if (!room) return false; + for (let i = 0; i < room.player.length; i++) { + room.player[i].status = false; + } +}; + +const skillOff = (from, data) => { + room = sesi(from, data); + if (!room) return false; + for (let i = 0; i < room.player.length; i++) { + room.player[i].status = true; + } +}; + +const playerHidup = (data) => { + const hasil = data.player.filter((x) => x.isdead === false); + return hasil.length; +}; + +const playerMati = (data) => { + const hasil = data.player.filter((x) => x.isdead === true); + return hasil.length; +}; + +// get player win +const getWinner = (from, data) => { + room = sesi(from, data); + if (!room) return false; + var ww = 0; + var orang_baek = 0; + for (let i = 0; i < room.player.length; i++) { + if (room.player[i].isdead === false) { + if ( + room.player[i].role === "werewolf" || + room.player[i].role === "sorcerer" + ) { + ww += 1; + } else if ( + room.player[i].role === "warga" || + room.player[i].role === "guardian" || + room.player[i].role === "seer" + ) { + orang_baek += 1; + } + } + } + if (room.voting) { + b = voteResult(from, data); + if (b != 0 && b != 1) { + if (b.role === "werewolf" || b.role === "sorcerer") { + ww -= 1; + } else if ( + b.role === "warga" || + b.role === "seer" || + b.role === "guardian" + ) { + orang_baek -= 1; + } + } + } + if (ww === 0) { + room.iswin = true; + return { + voting: room.voting, + status: true + }; + } else if (ww === orang_baek) { + room.iswin = false; + return { + voting: room.voting, + status: false + }; + } else if (orang_baek === 0) { + room.iswin = false; + return { + voting: room.voting, + status: false + }; + } else { + return { + voting: room.voting, + status: null + }; + } +}; + +// shorting +const shortPlayer = (from, data) => { + room = sesi(from, data); + if (!room) return false; + room.player.sort((a, b) => a.number - b.number); +}; + +// werewolf killing +const killww = (from, id, data) => { + room = sesi(from, data); + if (!room) return false; + for (let j = 0; j < room.dead.length; j++) { + idd = getPlayerById(from, room.player[0].id, room.dead[j], data); + if (!idd) return false; + if (room.player[idd.index].effect.includes("guardian")) return; + room.player[idd.index].isdead = true; + } +}; + +const pagii = (data) => { + if (data.dead.length < 1) { + return `*โŒ‚ W E R E W O L F - G A M E*\n\nMentari telah terbit, tidak ada korban berjatuhan malam ini, warga kembali melakukan aktifitasnya seperti biasa.\n90 detik tersisa sebelum waktu penentuan, para warga dipersilahkan untuk berdiskusi\n*Hari ke ${data.day}*`; + } else { + a = ""; + d = ""; + e = []; + f = []; + for (let i = 0; i < data.dead.length; i++) { + b = data.player.findIndex((x) => x.number === data.dead[i]); + if (data.player[b].effect.includes("guardian")) { + e.push(data.player[b].id); + } else { + f.push(data.player[b].id); + } + } + for (let i = 0; i < f.length; i++) { + if (i === f.length - 1) { + if (f.length > 1) { + a += ` dan @${f[i].replace("@s.whatsapp.net", "")}`; + } else { + a += `@${f[i].replace("@s.whatsapp.net", "")}`; + } + } else if (i === f.length - 2) { + a += `@${f[i].replace("@s.whatsapp.net", "")}`; + } else { + a += `@${f[i].replace("@s.whatsapp.net", "")}, `; + } + } + for (let i = 0; i < e.length; i++) { + if (i === e.length - 1) { + if (e.length > 1) { + d += ` dan @${e[i].replace("@s.whatsapp.net", "")}`; + } else { + d += `@${e[i].replace("@s.whatsapp.net", "")}`; + } + } else if (i === e.length - 2) { + d += `@${e[i].replace("@s.whatsapp.net", "")}`; + } else { + d += `@${e[i].replace("@s.whatsapp.net", "")}, `; + } + } + textnya = `*โŒ‚ W E R E W O L F - G A M E*\n\nPagi telah tiba, warga desa menemukan ${ + data.dead.length > 1 ? "beberapa" : "1" + } mayat di tumpukan puing dan darah berceceran. ${a ? a + " telah mati! " : ""}${ + d.length > 1 + ? ` ${d} hampir dibunuh, namun *Guardian Angel* berhasil melindunginya.` + : "" + }\n\nTak terasa hari sudah siang, matahari tepat di atas kepala, terik panas matahari membuat suasana menjadi riuh, warga desa mempunyai 90 detik untuk berdiskusi\n*Hari ke ${ + data.day + }*`; + return textnya; + } +}; + +async function pagi(conn, x, data) { + skillOff(x.room, data) + let ment = []; + for (let i = 0; i < x.player.length; i++) { + ment.push(x.player[i].id); + } + shortPlayer(x.room, data); + killww(x.room, x.dead, data); + shortPlayer(x.room, data); + changeDay(x.room, data); + return await conn.sendMessage(x.room, { + text: pagii(x), + contextInfo: { + externalAdReply: { + title: "W E R E W O L F", + mediaType: 1, + renderLargerThumbnail: true, + thumbnail: await resize(thumb1, 300, 175), + sourceUrl: "", + mediaUrl: thumb1, + }, + mentionedJid: ment, + }, + }); +} + +async function voting(conn, x, data) { + let row = []; + let ment = []; + voteStart(x.room, data) + textnya = + "*โŒ‚ W E R E W O L F - G A M E*\n\nSenja telah tiba. Seluruh warga berkumpul di balai desa untuk memilih siapa yang akan dieksekusi. Sebagian warga terlihat sibuk menyiapkan alat penyiksaan untuk malam ini. Kalian mempunyai waktu selama 90 detik untuk memilih! Hati-hati, ada penghianat diantara kalian!\n\n*L I S T - P L A Y E R*:\n"; + shortPlayer(x.room, data); + for (let i = 0; i < x.player.length; i++) { + textnya += `(${x.player[i].number}) @${x.player[i].id.replace( + "@s.whatsapp.net", + "" + )} ${x.player[i].isdead === true ? "โ˜ ๏ธ" : ""}\n`; + ment.push(x.player[i].id); + } + textnya += "\nketik *.ww vote nomor* untuk voting player"; + dayVoting(x.room, data); + clearAll(x.room, data); + clearAllSTATUS(x.room, data); + return await conn.sendMessage(x.room, { + text: textnya, + contextInfo: { + externalAdReply: { + title: "W E R E W O L F", + mediaType: 1, + renderLargerThumbnail: true, + thumbnail: await resize(thumb2, 300, 175), + sourceUrl: "", + mediaUrl: thumb2, + }, + mentionedJid: ment, + }, + }); +} + +async function malam(conn, x, data) { + var hasil_vote = voteResult(x.room, data); + if (hasil_vote === 0) { + textnya = `*โŒ‚ W E R E W O L F - G A M E*\n\nTerlalu bimbang menentukan pilihan. Warga pun pulang ke rumah masing-masing, tidak ada yang dieksekusi hari ini. Bulan bersinar terang, malam yang mencekam telah datang. Semoga tidak ada yang mati malam ini. Pemain malam hari: kalian punya 90 detik untuk beraksi!`; + return conn + .sendMessage(x.room, { + text: textnya, + contextInfo: { + externalAdReply: { + title: "W E R E W O L F", + mediaType: 1, + renderLargerThumbnail: true, + thumbnail: await resize(thumb3, 300, 175), + sourceUrl: "", + mediaUrl: thumb3, + }, + }, + }) + .then(() => { + changeDay(x.room, data); + voteDone(x.room, data); + resetVote(x.room, data); + clearAllVote(x.room, data); + if (getWinner(x.room, data).status != null) + return win(x, 1, conn, data); + }); + } else if (hasil_vote === 1) { + textnya = `*โŒ‚ W E R E W O L F - G A M E*\n\nWarga desa telah memilih, namun hasilnya seri.\n\nBintang memancarkan cahaya indah malam ini, warga desa beristirahat di kediaman masing masing. Pemain malam hari: kalian punya 90 detik untuk beraksi!`; + let ment = []; + return conn + .sendMessage(x.room, { + text: textnya, + contextInfo: { + externalAdReply: { + title: "W E R E W O L F", + mediaType: 1, + renderLargerThumbnail: true, + thumbnail: await resize(thumb3, 300, 175), + sourceUrl: "", + mediaUrl: thumb3, + }, + mentionedJid: ment, + }, + }) + .then(() => { + changeDay(x.room, data); + voteDone(x.room, data); + resetVote(x.room, data); + clearAllVote(x.room, data); + if (getWinner(x.room, data).status != null) + return win(x, 1, conn, data); + }); + } else if (hasil_vote != 0 && hasil_vote != 1) { + if (hasil_vote.role === "werewolf") { + textnya = `*โŒ‚ W E R E W O L F - G A M E*\n\nWarga desa telah memilih dan sepakat @${hasil_vote.id.replace( + "@s.whatsapp.net", + "" + )} dieksekusi mati.\n\n@${hasil_vote.id.replace( + "@s.whatsapp.net", + "" + )} adalah ${hasil_vote.role} ${emoji_role(hasil_vote.role)}`; + voteKill(x.room, data); + let ment = []; + ment.push(hasil_vote.id); + return await conn + .sendMessage(x.room, { + text: textnya, + contextInfo: { + externalAdReply: { + title: "W E R E W O L F", + mediaType: 1, + renderLargerThumbnail: true, + thumbnail: await resize(thumb4, 300, 175), + sourceUrl: "", + mediaUrl: thumb4, + }, + mentionedJid: ment, + }, + }) + .then(() => { + changeDay(x.room, data); + voteDone(x.room, data); + resetVote(x.room, data); + clearAllVote(x.room, data); + if (getWinner(x.room, data).status != null) + return win(x, 1, conn, data); + }); + } else { + textnya = `*โŒ‚ W E R E W O L F - G A M E*\n\nWarga desa telah memilih dan sepakat @${hasil_vote.id.replace( + "@s.whatsapp.net", + "" + )} dieksekusi mati.\n\n@${hasil_vote.id.replace( + "@s.whatsapp.net", + "" + )} adalah ${hasil_vote.role} ${emoji_role( + hasil_vote.role + )}\n\nBulan bersinar terang malam ini, warga desa beristirahat di kediaman masing masing. Pemain malam hari: kalian punya 90 detik untuk beraksi!`; + voteKill(x.room, data); + let ment = []; + ment.push(hasil_vote.id); + return await conn + .sendMessage(x.room, { + text: textnya, + contextInfo: { + externalAdReply: { + title: "W E R E W O L F", + mediaType: 1, + renderLargerThumbnail: true, + thumbnail: await resize(thumb4, 300, 175), + sourceUrl: "", + mediaUrl: thumb4, + }, + mentionedJid: ment, + }, + }) + .then(() => { + changeDay(x.room, data); + voteDone(x.room, data); + resetVote(x.room, data); + clearAllVote(x.room, data); + if (getWinner(x.room, data).status != null) + return win(x, 1, conn, data); + }); + } + } +} + +async function skill(conn, x, data) { + skillOn(x.room, data) + if (getWinner(x.room, data).status != null || x.win != null) { + return win(x, 1, conn, data); + } else { + if (!x) return; + if (!x.player) return; + if (x.win != null) return; + let tok1 = "\n"; + let tok2 = "\n"; + let membernya = []; + shortPlayer(x.room, data); + for (let i = 0; i < x.player.length; i++) { + tok1 += `(${x.player[i].number}) @${x.player[i].id.replace( + "@s.whatsapp.net", + "" + )}${x.player[i].isdead === true ? " โ˜ ๏ธ" : ""}\n`; + membernya.push(x.player[i].id); + } + for (let i = 0; i < x.player.length; i++) { + tok2 += `(${x.player[i].number}) @${x.player[i].id.replace( + "@s.whatsapp.net", + "" + )} ${ + x.player[i].role === "werewolf" || x.player[i].role === "sorcerer" + ? `${x.player[i].isdead === true ? ` โ˜ ๏ธ` : ` ${x.player[i].role}`}` + : " " + }\n`; + membernya.push(x.player[i].id); + } + for (let i = 0; i < x.player.length; i++) { + if (x.player[i].role === "werewolf") { + if (x.player[i].isdead != true) { + textnya = `Silahkan pilih salah satu orang yang ingin kamu makan pada malam hari ini\n*LIST PLAYER*:\n${tok2}\n\nKetik *.wwpc kill nomor* untuk membunuh player`; + + await conn.sendMessage(x.player[i].id, { + text: textnya, + mentions: membernya, + }); + } + } else if (x.player[i].role === "warga") { + if (x.player[i].isdead != true) { + textnya = `*โŒ‚ W E R E W O L F - G A M E*\n\nSebagai seorang warga berhati-hatilah, mungkin kamu adalah target selanjutnya.\n*LIST PLAYER*:${tok1}`; + await conn.sendMessage(x.player[i].id, { + text: textnya, + mentions: membernya, + }); + } + } else if (x.player[i].role === "seer") { + if (x.player[i].isdead != true) { + textnya = `Baiklah, siapa yang ingin kamu lihat peran nya kali ini.\n*LIST PLAYER*:${tok1}\n\nKetik *.wwpc dreamy nomor* untuk melihat role player`; + + await conn.sendMessage(x.player[i].id, { + text: textnya, + mentions: membernya, + }); + } + } else if (x.player[i].role === "guardian") { + if (x.player[i].isdead != true) { + textnya = `Kamu adalah seorang*Guardian*, lindungi para warga, silahkan pilih salah 1 player yang ingin kamu lindungi\n*LIST PLAYER*:${tok1}\n\nKetik *.wwpc deff nomor* untuk melindungi player`; + + await conn.sendMessage(x.player[i].id, { + text: textnya, + mentions: membernya, + }); + } + } else if (x.player[i].role === "sorcerer") { + if (x.player[i].isdead != true) { + textnya = `Baiklah, lihat apa yang bisa kamu buat, silakan pilih 1 orang yang ingin kamu buka identitasnya\n*LIST PLAYER*:${tok2}\n\nKetik *.wwpc sorcerer nomor* untuk melihat role player`; + + await conn.sendMessage(x.player[i].id, { + text: textnya, + mentions: membernya, + }); + } + } + } + } +} + +async function win(x, t, conn, data) { + const sesinya = x.room; + if (getWinner(x.room, data).status === false || x.iswin === false) { + textnya = `*W E R E W O L F - W I N*\n\nTEAM WEREWOLF\n\n`; + let ment = []; + for (let i = 0; i < x.player.length; i++) { + if (x.player[i].role === "sorcerer" || x.player[i].role === "werewolf") { + textnya += `${x.player[i].number}) @${x.player[i].id.replace( + "@s.whatsapp.net", + "" + )}\n *Role* : ${x.player[i].role}\n\n`; + ment.push(x.player[i].id); + } + } + return await conn + .sendMessage(sesinya, { + text: textnya, + contextInfo: { + externalAdReply: { + title: "W E R E W O L F", + mediaType: 1, + renderLargerThumbnail: true, + thumbnail: await resize(thumb5, 300, 175), + sourceUrl: "", + mediaUrl: thumb5, + }, + mentionedJid: ment, + }, + }) + .then(() => { + delete data[x.room]; + }); + } else if (getWinner(x.room, data).status === true) { + textnya = `*T E A M - W A R G A - W I N*\n\nTEAM WARGA\n\n`; + let ment = []; + for (let i = 0; i < x.player.length; i++) { + if ( + x.player[i].role === "warga" || + x.player[i].role === "guardian" || + x.player[i].role === "seer" + ) { + textnya += `${x.player[i].number}) @${x.player[i].id.replace( + "@s.whatsapp.net", + "" + )}\n *Role* : ${x.player[i].role}\n\n`; + ment.push(x.player[i].id); + } + } + return await conn.sendMessage(sesinya, { + text: textnya, + contextInfo: { + externalAdReply: { + title: "W E R E W O L F", + mediaType: 1, + renderLargerThumbnail: true, + thumbnail: await resize(thumb6, 300, 175), + sourceUrl: "", + mediaUrl: thumb5, + }, + mentionedJid: ment, + }, + }); + } +} + +// playing +async function run(conn, id, data) { + while (getWinner(id, data).status === null) { + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await pagi(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await voting(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await malam(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await skill(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) break; + } + await win(sesi(id, data), 1, conn, data); +} + +async function run_vote(conn, id, data) { + while (getWinner(id, data).status === null) { + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await voting(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await malam(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await skill(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await pagi(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) break; + } + await win(sesi(id, data), 1, conn, data); +} + +async function run_malam(conn, id, data) { + while (getWinner(id, data).status === null) { + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await skill(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await pagi(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await voting(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await malam(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) break; + } + await win(sesi(id, data), 1, conn, data); +} + +async function run_pagi(conn, id, data) { + while (getWinner(id, data).status === null) { + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await pagi(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await voting(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await malam(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await skill(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) break; + } + await win(sesi(id, data), 1, conn, data); +} + +module.exports = { + emoji_role, + sesi, + playerOnGame, + playerOnRoom, + playerExit, + dataPlayer, + dataPlayerById, + getPlayerById, + getPlayerById2, + killWerewolf, + killww, + dreamySeer, + sorcerer, + protectGuardian, + roleShuffle, + roleChanger, + roleAmount, + roleGenerator, + addTimer, + startGame, + playerHidup, + playerMati, + vote, + voteResult, + clearAllVote, + getWinner, + win, + pagi, + malam, + skill, + voteStart, + voteDone, + voting, + run, + run_vote, + run_malam, + run_pagi, +}; diff --git a/main.js b/main.js new file mode 100644 index 0000000000000000000000000000000000000000..28c86e0dcc55242d4c631f10689a33508d4449cc --- /dev/null +++ b/main.js @@ -0,0 +1 @@ +function _0x481f(_0x2d9a8c,_0x5cf6ea){const _0x5b4026=_0x5b40();return _0x481f=function(_0x481fd1,_0x38e3d2){_0x481fd1=_0x481fd1-0x1a5;let _0x18b451=_0x5b4026[_0x481fd1];return _0x18b451;},_0x481f(_0x2d9a8c,_0x5cf6ea);}function _0x5b40(){const _0x1ccc65=['-filter_complex','blue','resolve','freeze','catch','649pMZqFi','node-fetch','test','close','API','sessions','loadDatabase','info','stdin','requestPairingCode','demote','prefix','warn','authState','Your\x20Pairing\x20Code\x20:\x20','handler','statusCode','color','fromEntries','write','./config','-loglevel','syntax\x20error\x20while\x20loading\x20\x27','-type','@user\x20sekarang\x20admin!','localeCompare','6nYWQcq','all','readyState','chain','deleted\x20plugin\x20\x27','welcome','12GrZzCc','existsSync','ffprobe','reload','filter','--code','4cZEekY','loggedOut','bgWhite','version','forEach','Ubuntu','readdirSync',',\x20isLatest:\x20','entries','bye','question','slice','-amin','--mobile','read','294362uFQyXl','-hide_banner','creds','log','bind','--\x20using\x20WA\x20v','watch','done','child_process','stdout','parse','includes','--version','chalk','tmp','readline','match','23543741rBCtpZ','readFileSync','./lib/lowdb','some','cache','bgGreen','conn','201960bAkgyp','timestamp','listMessage','32oPHpYQ','Stickers\x20may\x20not\x20work\x20without\x20imagemagick\x20if\x20libwebp\x20on\x20ffmpeg\x20doesnt\x20isntalled\x20(pkg\x20install\x20imagemagick)','error','black','argv','object','APIs','219231MqxGxn','Selamat\x20datang\x20@user\x20di\x20group\x20@subject\x20utamakan\x20baca\x20desk\x20ya\x20\x0a@desc','data','2036529vvzxWV','credsUpdate','group-participants.update','1154705hQLQSN','connectionUpdate','createInterface','convert','CONNECTING','tmpdir','\x20--','white','blueBright','lowdb','connection.update','participantsUpdate','makeWASocket','replace','READ','onDelete','lodash','https://raw.githubusercontent.com/WhiskeySockets/Baileys/master/src/Defaults/baileys-version.json','./sessions/creds.json','./lib/simple','requiring\x20new\x20plugin\x20\x27','-delete','creds.update','spawn','env','@adiwajshing/baileys','yargs/yargs','pino','support','ENTER\x20A\x20VALID\x20NUMBER\x20START\x20WITH\x20REGION\x20CODE.\x20Example\x20:\x2062xxx:\x0a','re\x20-\x20require\x20plugin\x20\x27','ffmpeg','reloadHandler','--\x20WARNING:\x20creds.json\x20is\x20broken,\x20please\x20delete\x20it\x20first\x20--','join','--\x20Please\x20wait,\x20generating\x20code...\x20--','yellow','keys','exit','isInit','plugins','off','length','find','then','โ€ŽxzXZ/i!#$%+ยฃยขโ‚ฌยฅ^ยฐ=ยถโˆ†ร—รทฯ€โˆšโœ“ยฉยฎ:;?&.\x5c-','magick','delete','12945632nCBsAm','connect','\x5c$&','APIKeys','messages.upsert','buttonsMessage','silent','logger','52hYQNfE','isBuffer','PORT','Stickers\x20may\x20not\x20animated\x20without\x20libwebp\x20on\x20ffmpeg\x20(--enable-ibwebp\x20while\x20compiling\x20ffmpeg)','templateMessage','output','--pairing'];_0x5b40=function(){return _0x1ccc65;};return _0x5b40();}(function(_0x56617c,_0x4d141e){const _0x54a23f=_0x481f,_0x5ac6cc=_0x56617c();while(!![]){try{const _0x4128ec=parseInt(_0x54a23f(0x1fe))/0x1*(parseInt(_0x54a23f(0x1ef))/0x2)+parseInt(_0x54a23f(0x220))/0x3*(parseInt(_0x54a23f(0x1bd))/0x4)+-parseInt(_0x54a23f(0x226))/0x5+-parseInt(_0x54a23f(0x1e3))/0x6*(parseInt(_0x54a23f(0x1b5))/0x7)+-parseInt(_0x54a23f(0x219))/0x8*(-parseInt(_0x54a23f(0x223))/0x9)+parseInt(_0x54a23f(0x216))/0xa*(-parseInt(_0x54a23f(0x1c9))/0xb)+-parseInt(_0x54a23f(0x1e9))/0xc*(-parseInt(_0x54a23f(0x20f))/0xd);if(_0x4128ec===_0x4d141e)break;else _0x5ac6cc['push'](_0x5ac6cc['shift']());}catch(_0x5446a3){_0x5ac6cc['push'](_0x5ac6cc['shift']());}}}(_0x5b40,0xefff1),((async()=>{const _0x2cbaaa=_0x481f;require(_0x2cbaaa(0x1dd));const {useMultiFileAuthState:_0x533881,DisconnectReason:_0x53ced4,generateForwardMessageContent:_0x23bf46,prepareWAMessageMedia:_0x901b1,generateWAMessageFromContent:_0x5042cb,generateMessageID:_0x54905c,downloadContentFromMessage:_0x347add,makeInMemoryStore:_0x30e0b3,jidDecode:_0x4612e5,PHONENUMBER_MCC:_0x26ff49,fetchLatestBaileysVersion:_0x1785e0,proto:_0x2d6734}=require(_0x2cbaaa(0x23f)),_0x49398d=require(_0x2cbaaa(0x241)),_0x524852=require('ws'),_0x680a27=require('path'),_0x32f29f=require('fs'),_0x276499=require(_0x2cbaaa(0x240)),_0xc1204a=require(_0x2cbaaa(0x206)),_0x1ecbca=require(_0x2cbaaa(0x236)),_0x392d82=require('syntax-error'),_0x2a59f1=require(_0x2cbaaa(0x241)),_0x470804=require('os'),_0x58b12a=require(_0x2cbaaa(0x1ca)),_0x88dc80=require(_0x2cbaaa(0x20b));let _0x23c5c6=require(_0x2cbaaa(0x239));var _0x563417;try{_0x563417=require(_0x2cbaaa(0x22f));}catch(_0x3b3723){_0x563417=require(_0x2cbaaa(0x211));}const {Low:_0x133260,JSONFile:_0x2627b5}=_0x563417,_0x27d6e2=require('./lib/mongoDB'),_0x196326=require(_0x2cbaaa(0x20d)),_0x2ab022=process[_0x2cbaaa(0x21d)]['includes'](_0x2cbaaa(0x1ee))||process['argv'][_0x2cbaaa(0x209)](_0x2cbaaa(0x1c3)),_0x4c1105=process[_0x2cbaaa(0x21d)][_0x2cbaaa(0x209)](_0x2cbaaa(0x1fc)),_0x47ba5e=_0x196326[_0x2cbaaa(0x228)]({'input':process[_0x2cbaaa(0x1d1)],'output':process[_0x2cbaaa(0x207)]}),_0x3bc568=_0x5317ce=>new Promise(_0x55cf2f=>_0x47ba5e[_0x2cbaaa(0x1f9)](_0x5317ce,_0x55cf2f));global[_0x2cbaaa(0x1cd)]=(_0x453b31,_0x5ea4d0='/',_0x1d2fe3={},_0x1bc09b)=>(_0x453b31 in global[_0x2cbaaa(0x21f)]?global[_0x2cbaaa(0x21f)][_0x453b31]:_0x453b31)+_0x5ea4d0+(_0x1d2fe3||_0x1bc09b?'?'+new URLSearchParams(Object[_0x2cbaaa(0x1f7)]({..._0x1d2fe3,..._0x1bc09b?{[_0x1bc09b]:global[_0x2cbaaa(0x1b8)][_0x453b31 in global['APIs']?global['APIs'][_0x453b31]:_0x453b31]}:{}})):''),global['timestamp']={'start':new Date()};const _0x410e4c=process[_0x2cbaaa(0x23e)][_0x2cbaaa(0x1bf)]||0xbb8;global['opts']=new Object(_0x276499(process[_0x2cbaaa(0x21d)][_0x2cbaaa(0x1fa)](0x2))['exitProcess'](![])[_0x2cbaaa(0x208)]()),global[_0x2cbaaa(0x1d4)]=new RegExp('^['+(opts[_0x2cbaaa(0x1d4)]||_0x2cbaaa(0x1b2))['replace'](/[|\\{}()[\]^$+*?.\-\^]/g,_0x2cbaaa(0x1b7))+']'),global['db']=new _0x133260(/https?:\/\//[_0x2cbaaa(0x1cb)](opts['db']||'')?new cloudDBAdapter(opts['db']):/mongodb/[_0x2cbaaa(0x1cb)](opts['db'])?new _0x27d6e2(opts['db']):new _0x2627b5((opts['_'][0x0]?opts['_'][0x0]+'_':'')+'database.json')),global['DATABASE']=global['db'],global[_0x2cbaaa(0x1cf)]=async function _0x4cc2a4(){const _0x379258=_0x2cbaaa;if(global['db']['READ'])return new Promise(_0x189c0c=>setInterval(function(){const _0x14b2d3=_0x481f;!global['db'][_0x14b2d3(0x234)]?(clearInterval(this),_0x189c0c(global['db'][_0x14b2d3(0x222)]==null?global['loadDatabase']():global['db'][_0x14b2d3(0x222)])):null;},0x1*0x3e8));if(global['db'][_0x379258(0x222)]!==null)return;global['db'][_0x379258(0x234)]=!![],await global['db'][_0x379258(0x1fd)](),global['db'][_0x379258(0x234)]=![],global['db']['data']={'users':{},'chats':{},'stats':{},'msgs':{},'sticker':{},...global['db'][_0x379258(0x222)]||{}},global['db'][_0x379258(0x1e6)]=_0x1ecbca[_0x379258(0x1e6)](global['db'][_0x379258(0x222)]);},loadDatabase();const _0x515740=''+(opts['_'][0x0]||_0x2cbaaa(0x1ce));global[_0x2cbaaa(0x1ac)]=!_0x32f29f[_0x2cbaaa(0x1ea)](_0x515740);const {state:_0x5193b2,saveState:_0x1bd7c8,saveCreds:_0x31aff6}=await _0x533881(_0x515740),{version:_0x5a53bc,isLatest:_0x59dded}=await _0x1785e0();console[_0x2cbaaa(0x201)](_0x88dc80['magenta'](_0x2cbaaa(0x203)+_0x5a53bc['join']('.')+_0x2cbaaa(0x1f6)+_0x59dded+_0x2cbaaa(0x22c)));const _0x12181b={'printQRInTerminal':!_0x2ab022,'syncFullHistory':!![],'markOnlineOnConnect':!![],'connectTimeoutMs':0xea60,'defaultQueryTimeoutMs':0x0,'keepAliveIntervalMs':0x2710,'generateHighQualityLinkPreview':!![],'patchMessageBeforeSending':_0x5826df=>{const _0x108a11=_0x2cbaaa,_0x328020=!!(_0x5826df[_0x108a11(0x1ba)]||_0x5826df[_0x108a11(0x1c1)]||_0x5826df[_0x108a11(0x218)]);return _0x328020&&(_0x5826df={'viewOnceMessage':{'message':{'messageContextInfo':{'deviceListMetadataVersion':0x2,'deviceListMetadata':{}},..._0x5826df}}}),_0x5826df;},'auth':_0x5193b2,'browser':[_0x2cbaaa(0x1f4),'Chrome','20.0.04'],'logger':_0x49398d({'level':_0x2cbaaa(0x1bb)}),'version':(await(await _0x58b12a(_0x2cbaaa(0x237)))['json']())[_0x2cbaaa(0x1f2)]};global[_0x2cbaaa(0x215)]=_0x23c5c6[_0x2cbaaa(0x232)](_0x12181b);if(!opts[_0x2cbaaa(0x1cb)]){if(global['db'])setInterval(async()=>{const _0x7aabbb=_0x2cbaaa;if(global['db'][_0x7aabbb(0x222)])await global['db'][_0x7aabbb(0x1dc)]();if(!opts[_0x7aabbb(0x20c)]&&(global[_0x7aabbb(0x242)]||{})['find'])tmp=[_0x470804[_0x7aabbb(0x22b)](),_0x7aabbb(0x20c)],tmp[_0x7aabbb(0x1f3)](_0x400962=>_0xc1204a[_0x7aabbb(0x23d)](_0x7aabbb(0x1b0),[_0x400962,_0x7aabbb(0x1fb),'3',_0x7aabbb(0x1e0),'f',_0x7aabbb(0x23b)]));},0x1e*0x3e8);}async function _0x478e67(_0x219e74){const _0x33abb9=_0x2cbaaa,{connection:_0x4b1c77,lastDisconnect:_0x514321}=_0x219e74;global[_0x33abb9(0x217)][_0x33abb9(0x1b6)]=new Date();_0x514321&&_0x514321['error']&&_0x514321['error'][_0x33abb9(0x1c2)]&&_0x514321['error'][_0x33abb9(0x1c2)][_0x33abb9(0x1d9)]!==_0x53ced4[_0x33abb9(0x1f0)]&&conn['ws'][_0x33abb9(0x1e5)]!==_0x524852[_0x33abb9(0x22a)]&&console[_0x33abb9(0x201)](global[_0x33abb9(0x1a5)](!![]));if(global['db'][_0x33abb9(0x222)]==null)await loadDatabase();}(_0x2ab022||_0x4c1105)&&_0x32f29f[_0x2cbaaa(0x1ea)](_0x2cbaaa(0x238))&&!conn[_0x2cbaaa(0x1d6)][_0x2cbaaa(0x200)]['registered']&&(console[_0x2cbaaa(0x201)](_0x88dc80[_0x2cbaaa(0x1a9)](_0x2cbaaa(0x1a6))),process[_0x2cbaaa(0x1ab)](0x0));if(_0x2ab022&&!conn[_0x2cbaaa(0x1d6)]['creds']['registered']){if(_0x4c1105)throw new Error('Cannot\x20use\x20pairing\x20code\x20with\x20mobile\x20api');const {registration:_0x2598d5}={'registration':{}};let _0x25d10d='';do{_0x25d10d=await _0x3bc568(_0x88dc80[_0x2cbaaa(0x22e)](_0x2cbaaa(0x243)));}while(!Object[_0x2cbaaa(0x1aa)](_0x26ff49)[_0x2cbaaa(0x212)](_0x4141a0=>_0x25d10d['startsWith'](_0x4141a0)));_0x47ba5e['close'](),_0x25d10d=_0x25d10d[_0x2cbaaa(0x233)](/\D/g,''),console[_0x2cbaaa(0x201)](_0x88dc80[_0x2cbaaa(0x1f1)](_0x88dc80[_0x2cbaaa(0x1c5)](_0x2cbaaa(0x1a8)))),setTimeout(async()=>{const _0x334585=_0x2cbaaa;let _0x1198cf=await conn[_0x334585(0x1d2)](_0x25d10d);_0x1198cf=_0x1198cf?.[_0x334585(0x20e)](/.{1,4}/g)?.[_0x334585(0x1a7)]('-')||_0x1198cf,console['log'](_0x88dc80[_0x334585(0x21c)](_0x88dc80[_0x334585(0x214)](_0x334585(0x1d7))),_0x88dc80[_0x334585(0x21c)](_0x88dc80[_0x334585(0x22d)](_0x1198cf)));},0xbb8);}process['on']('uncaughtException',console[_0x2cbaaa(0x21b)]);const _0x28dbc1=_0x30060a=>{const _0x59cfa4=_0x2cbaaa;_0x30060a=require[_0x59cfa4(0x1c6)](_0x30060a);let _0x5db7b4,_0x2a1668=0x0;do{if(_0x30060a in require[_0x59cfa4(0x213)])delete require[_0x59cfa4(0x213)][_0x30060a];_0x5db7b4=require(_0x30060a),_0x2a1668++;}while((!_0x5db7b4||(Array['isArray'](_0x5db7b4)||_0x5db7b4 instanceof String)?!(_0x5db7b4||[])[_0x59cfa4(0x1af)]:typeof _0x5db7b4==_0x59cfa4(0x21e)&&!Buffer[_0x59cfa4(0x1be)](_0x5db7b4)?!Object[_0x59cfa4(0x1aa)](_0x5db7b4||{})[_0x59cfa4(0x1af)]:!![])&&_0x2a1668<=0xa);return _0x5db7b4;};let _0x4dd1f2=!![];global[_0x2cbaaa(0x1a5)]=function(_0x530614){const _0x507ca1=_0x2cbaaa;let _0x4f81f4=_0x28dbc1('./handler');if(_0x530614){try{global['conn']['ws']['close']();}catch{}global[_0x507ca1(0x215)]={...global[_0x507ca1(0x215)],..._0x23c5c6[_0x507ca1(0x232)](_0x12181b)};}return!_0x4dd1f2&&(conn['ev'][_0x507ca1(0x1ae)](_0x507ca1(0x1b9),conn[_0x507ca1(0x1d8)]),conn['ev'][_0x507ca1(0x1ae)](_0x507ca1(0x225),conn[_0x507ca1(0x231)]),conn['ev'][_0x507ca1(0x1ae)]('message.delete',conn[_0x507ca1(0x235)]),conn['ev'][_0x507ca1(0x1ae)](_0x507ca1(0x230),conn[_0x507ca1(0x227)]),conn['ev']['off'](_0x507ca1(0x23c),conn[_0x507ca1(0x224)])),conn[_0x507ca1(0x1e8)]=_0x507ca1(0x221),conn[_0x507ca1(0x1f8)]='Selamat\x20tinggal\x20@user\x20๐Ÿ‘‹',conn['promote']=_0x507ca1(0x1e1),conn[_0x507ca1(0x1d3)]='@user\x20sekarang\x20bukan\x20admin!',conn[_0x507ca1(0x1d8)]=_0x4f81f4[_0x507ca1(0x1d8)]['bind'](conn),conn['participantsUpdate']=_0x4f81f4[_0x507ca1(0x231)][_0x507ca1(0x202)](conn),conn[_0x507ca1(0x235)]=_0x4f81f4[_0x507ca1(0x1b4)][_0x507ca1(0x202)](conn),conn['connectionUpdate']=_0x478e67['bind'](conn),conn['credsUpdate']=_0x31aff6[_0x507ca1(0x202)](conn),conn['ev']['on'](_0x507ca1(0x1b9),conn[_0x507ca1(0x1d8)]),conn['ev']['on']('group-participants.update',conn[_0x507ca1(0x231)]),conn['ev']['on']('message.delete',conn[_0x507ca1(0x235)]),conn['ev']['on'](_0x507ca1(0x230),conn[_0x507ca1(0x227)]),conn['ev']['on'](_0x507ca1(0x23c),conn[_0x507ca1(0x224)]),_0x4dd1f2=![],!![];};let _0xfbc211=_0x680a27[_0x2cbaaa(0x1a7)](__dirname,_0x2cbaaa(0x1ad)),_0x38c1fe=_0x1ca55d=>/\.js$/[_0x2cbaaa(0x1cb)](_0x1ca55d);global[_0x2cbaaa(0x1ad)]={};for(let _0x2dbb31 of _0x32f29f[_0x2cbaaa(0x1f5)](_0xfbc211)[_0x2cbaaa(0x1ed)](_0x38c1fe)){try{global[_0x2cbaaa(0x1ad)][_0x2dbb31]=require(_0x680a27[_0x2cbaaa(0x1a7)](_0xfbc211,_0x2dbb31));}catch(_0x198e42){conn['logger'][_0x2cbaaa(0x21b)](_0x198e42),delete global[_0x2cbaaa(0x1ad)][_0x2dbb31];}}console[_0x2cbaaa(0x201)](Object[_0x2cbaaa(0x1aa)](global[_0x2cbaaa(0x1ad)])),global[_0x2cbaaa(0x1ec)]=(_0x3113db,_0x35b4ad)=>{const _0x44998a=_0x2cbaaa;if(_0x38c1fe(_0x35b4ad)){let _0x40f89c=_0x680a27[_0x44998a(0x1a7)](_0xfbc211,_0x35b4ad);if(_0x40f89c in require[_0x44998a(0x213)]){delete require['cache'][_0x40f89c];if(_0x32f29f[_0x44998a(0x1ea)](_0x40f89c))conn['logger'][_0x44998a(0x1d0)](_0x44998a(0x244)+_0x35b4ad+'\x27');else return conn[_0x44998a(0x1bc)][_0x44998a(0x1d5)](_0x44998a(0x1e7)+_0x35b4ad+'\x27'),delete global['plugins'][_0x35b4ad];}else conn[_0x44998a(0x1bc)]['info'](_0x44998a(0x23a)+_0x35b4ad+'\x27');let _0x411a74=_0x392d82(_0x32f29f[_0x44998a(0x210)](_0x40f89c),_0x35b4ad);if(_0x411a74)conn['logger'][_0x44998a(0x21b)](_0x44998a(0x1df)+_0x35b4ad+'\x27\x0a'+_0x411a74);else try{global['plugins'][_0x35b4ad]=require(_0x40f89c);}catch(_0x9093fd){conn[_0x44998a(0x1bc)][_0x44998a(0x21b)](_0x9093fd);}finally{global['plugins']=Object[_0x44998a(0x1db)](Object[_0x44998a(0x1f7)](global[_0x44998a(0x1ad)])['sort'](([_0x510347],[_0x59a90c])=>_0x510347[_0x44998a(0x1e2)](_0x59a90c)));}}},Object[_0x2cbaaa(0x1c7)](global[_0x2cbaaa(0x1ec)]),_0x32f29f[_0x2cbaaa(0x204)](_0x680a27[_0x2cbaaa(0x1a7)](__dirname,'plugins'),global['reload']),global['reloadHandler']();async function _0x5adff5(){const _0x16186c=_0x2cbaaa;let _0x547272=await Promise[_0x16186c(0x1e4)]([_0xc1204a[_0x16186c(0x23d)](_0x16186c(0x245)),_0xc1204a[_0x16186c(0x23d)](_0x16186c(0x1eb)),_0xc1204a['spawn'](_0x16186c(0x245),[_0x16186c(0x1ff),_0x16186c(0x1de),_0x16186c(0x21b),_0x16186c(0x1c4),_0x16186c(0x1da),'-frames:v','1','-f','webp','-']),_0xc1204a[_0x16186c(0x23d)](_0x16186c(0x229)),_0xc1204a[_0x16186c(0x23d)]('magick'),_0xc1204a[_0x16186c(0x23d)]('gm'),_0xc1204a[_0x16186c(0x23d)](_0x16186c(0x1b0),[_0x16186c(0x20a)])]['map'](_0x568faa=>{return Promise['race']([new Promise(_0xefe56c=>{const _0xe8e291=_0x481f;_0x568faa['on'](_0xe8e291(0x1cc),_0x2e4897=>{_0xefe56c(_0x2e4897!==0x7f);});}),new Promise(_0x465155=>{const _0x503eb2=_0x481f;_0x568faa['on'](_0x503eb2(0x21b),_0x2285de=>_0x465155(![]));})]);})),[_0x56d1f2,_0xf82eba,_0x493eb5,_0x5d3325,_0x297d5e,_0x1d4e33,_0x776094]=_0x547272;console['log'](_0x547272);let _0x2db56a=global[_0x16186c(0x242)]={'ffmpeg':_0x56d1f2,'ffprobe':_0xf82eba,'ffmpegWebp':_0x493eb5,'convert':_0x5d3325,'magick':_0x297d5e,'gm':_0x1d4e33,'find':_0x776094};Object[_0x16186c(0x1c7)](global[_0x16186c(0x242)]);if(!_0x2db56a[_0x16186c(0x245)])conn[_0x16186c(0x1bc)][_0x16186c(0x1d5)]('Please\x20install\x20ffmpeg\x20for\x20sending\x20videos\x20(pkg\x20install\x20ffmpeg)');if(_0x2db56a[_0x16186c(0x245)]&&!_0x2db56a['ffmpegWebp'])conn['logger'][_0x16186c(0x1d5)](_0x16186c(0x1c0));if(!_0x2db56a[_0x16186c(0x229)]&&!_0x2db56a[_0x16186c(0x1b3)]&&!_0x2db56a['gm'])conn[_0x16186c(0x1bc)][_0x16186c(0x1d5)](_0x16186c(0x21a));}_0x5adff5()[_0x2cbaaa(0x1b1)](()=>conn['logger'][_0x2cbaaa(0x1d0)]('Quick\x20Test\x20Done'))[_0x2cbaaa(0x1c8)](_0x2cbaaa(0x205));})())); diff --git a/media/sticker/emror.webp b/media/sticker/emror.webp new file mode 100644 index 0000000000000000000000000000000000000000..7d13ff13010f3da6005519af2a7414a51f0d4c09 Binary files /dev/null and b/media/sticker/emror.webp differ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..11ba10d7ddad8655e6fd5bf6910dfd8d42087c13 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,11069 @@ +{ + "name": "rtxzy", + "version": "8.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "rtxzy", + "version": "8.0.0", + "license": "MIT", + "dependencies": { + "@adiwajshing/baileys": "npm:@whiskeysockets/baileys@6.7.8", + "@adiwajshing/keyed-db": "^0.2.4", + "@bochilteam/scraper": "^3.0.0", + "@vitalets/google-translate-api": "^9.0.0", + "async": "^3.2.4", + "awesome-phonenumber": "^2.64.0", + "axios": "^0.27.2", + "base64-to-image": "^1.0.2", + "btch-downloader": "^2.8.0", + "chalk": "^4.1.2", + "cheerio": "^1.0.0-rc.12", + "colors": "1.4.0", + "didyoumean": "^1.2.2", + "express": "^4.18.2", + "file-type": "^16.5.3", + "form-data": "^4.0.0", + "google-it": "^1.6.3", + "human-readable": "^0.2.1", + "javascript-obfuscator": "^4.0.2", + "jsdom": "^20.0.0", + "link-preview-js": "^3.0.4", + "lodash": "^4.17.21", + "lowdb": "^2.1.0", + "moment-timezone": "^0.5.37", + "mongoose": "^6.0.14", + "node-fetch": "^2.7.0", + "node-gtts": "2.0.2", + "node-os-utils": "^1.3.7", + "node-webpmux": "^3.1.3", + "nodemon": "^2.0.20", + "ocr-space-api-wrapper": "^2.2.0", + "os": "^0.1.2", + "perf_hooks": "^0.0.1", + "qrcode": "^1.5.0", + "qrcode-terminal": "^0.12.0", + "readline": "^1.3.0", + "sharp": "^0.32.6", + "similarity": "^1.2.1", + "socket.io": "^4.5.1", + "syntax-error": "^1.4.0", + "terminal-image": "^2.0.0", + "tiktokdl": "^0.0.5", + "url": "^0.11.0", + "url-regex": "^5.0.0", + "url-regex-safe": "^2.1.0", + "util": "^0.12.4", + "wa-sticker-formatter": "^4.3.2", + "yargs": "^17.5.1", + "yt-search": "^2.10.3", + "ytdl-core": "npm:@distube/ytdl-core" + } + }, + "node_modules/@adiwajshing/baileys": { + "name": "@whiskeysockets/baileys", + "version": "6.7.8", + "resolved": "https://registry.npmjs.org/@whiskeysockets/baileys/-/baileys-6.7.8.tgz", + "integrity": "sha512-2e3j+LiFeouNkssvKEgdKlZxfLK9SqJjHqn/TewJD7NC77z5MBb+CVKRCnEqJzqfT/5d00oKHPK3I57cRFeUgw==", + "dependencies": { + "@adiwajshing/keyed-db": "^0.2.4", + "@hapi/boom": "^9.1.3", + "async-lock": "^1.4.1", + "audio-decode": "^2.1.3", + "axios": "^1.6.0", + "cache-manager": "^5.7.6", + "futoin-hkdf": "^1.5.1", + "libphonenumber-js": "^1.10.20", + "libsignal": "github:WhiskeySockets/libsignal-node", + "lodash": "^4.17.21", + "music-metadata": "^7.12.3", + "node-cache": "^5.1.2", + "pino": "^7.0.0", + "protobufjs": "^7.2.4", + "uuid": "^10.0.0", + "ws": "^8.13.0" + }, + "peerDependencies": { + "jimp": "^0.16.1", + "link-preview-js": "^3.0.0", + "qrcode-terminal": "^0.12.0", + "sharp": "^0.32.6" + }, + "peerDependenciesMeta": { + "jimp": { + "optional": true + }, + "link-preview-js": { + "optional": true + }, + "qrcode-terminal": { + "optional": true + }, + "sharp": { + "optional": true + } + } + }, + "node_modules/@adiwajshing/baileys/node_modules/axios": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.8.tgz", + "integrity": "sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/@adiwajshing/keyed-db": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@adiwajshing/keyed-db/-/keyed-db-0.2.4.tgz", + "integrity": "sha512-yprSnAtj80/VKuDqRcFFLDYltoNV8tChNwFfIgcf6PGD4sjzWIBgs08pRuTqGH5mk5wgL6PBRSsMCZqtZwzFEw==" + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "optional": true, + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "optional": true, + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "optional": true, + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "optional": true, + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "optional": true, + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.699.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.699.0.tgz", + "integrity": "sha512-9tFt+we6AIvj/f1+nrLHuCWcQmyfux5gcBSOy9d9+zIG56YxGEX7S9TaZnybogpVV8A0BYWml36WvIHS9QjIpA==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.699.0", + "@aws-sdk/client-sts": "3.699.0", + "@aws-sdk/core": "3.696.0", + "@aws-sdk/credential-provider-node": "3.699.0", + "@aws-sdk/middleware-host-header": "3.696.0", + "@aws-sdk/middleware-logger": "3.696.0", + "@aws-sdk/middleware-recursion-detection": "3.696.0", + "@aws-sdk/middleware-user-agent": "3.696.0", + "@aws-sdk/region-config-resolver": "3.696.0", + "@aws-sdk/types": "3.696.0", + "@aws-sdk/util-endpoints": "3.696.0", + "@aws-sdk/util-user-agent-browser": "3.696.0", + "@aws-sdk/util-user-agent-node": "3.696.0", + "@smithy/config-resolver": "^3.0.12", + "@smithy/core": "^2.5.3", + "@smithy/fetch-http-handler": "^4.1.1", + "@smithy/hash-node": "^3.0.10", + "@smithy/invalid-dependency": "^3.0.10", + "@smithy/middleware-content-length": "^3.0.12", + "@smithy/middleware-endpoint": "^3.2.3", + "@smithy/middleware-retry": "^3.0.27", + "@smithy/middleware-serde": "^3.0.10", + "@smithy/middleware-stack": "^3.0.10", + "@smithy/node-config-provider": "^3.1.11", + "@smithy/node-http-handler": "^3.3.1", + "@smithy/protocol-http": "^4.1.7", + "@smithy/smithy-client": "^3.4.4", + "@smithy/types": "^3.7.1", + "@smithy/url-parser": "^3.0.10", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.27", + "@smithy/util-defaults-mode-node": "^3.0.27", + "@smithy/util-endpoints": "^2.1.6", + "@smithy/util-middleware": "^3.0.10", + "@smithy/util-retry": "^3.0.10", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.696.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.696.0.tgz", + "integrity": "sha512-q5TTkd08JS0DOkHfUL853tuArf7NrPeqoS5UOvqJho8ibV9Ak/a/HO4kNvy9Nj3cib/toHYHsQIEtecUPSUUrQ==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.696.0", + "@aws-sdk/middleware-host-header": "3.696.0", + "@aws-sdk/middleware-logger": "3.696.0", + "@aws-sdk/middleware-recursion-detection": "3.696.0", + "@aws-sdk/middleware-user-agent": "3.696.0", + "@aws-sdk/region-config-resolver": "3.696.0", + "@aws-sdk/types": "3.696.0", + "@aws-sdk/util-endpoints": "3.696.0", + "@aws-sdk/util-user-agent-browser": "3.696.0", + "@aws-sdk/util-user-agent-node": "3.696.0", + "@smithy/config-resolver": "^3.0.12", + "@smithy/core": "^2.5.3", + "@smithy/fetch-http-handler": "^4.1.1", + "@smithy/hash-node": "^3.0.10", + "@smithy/invalid-dependency": "^3.0.10", + "@smithy/middleware-content-length": "^3.0.12", + "@smithy/middleware-endpoint": "^3.2.3", + "@smithy/middleware-retry": "^3.0.27", + "@smithy/middleware-serde": "^3.0.10", + "@smithy/middleware-stack": "^3.0.10", + "@smithy/node-config-provider": "^3.1.11", + "@smithy/node-http-handler": "^3.3.1", + "@smithy/protocol-http": "^4.1.7", + "@smithy/smithy-client": "^3.4.4", + "@smithy/types": "^3.7.1", + "@smithy/url-parser": "^3.0.10", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.27", + "@smithy/util-defaults-mode-node": "^3.0.27", + "@smithy/util-endpoints": "^2.1.6", + "@smithy/util-middleware": "^3.0.10", + "@smithy/util-retry": "^3.0.10", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.699.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.699.0.tgz", + "integrity": "sha512-u8a1GorY5D1l+4FQAf4XBUC1T10/t7neuwT21r0ymrtMFSK2a9QqVHKMoLkvavAwyhJnARSBM9/UQC797PFOFw==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.696.0", + "@aws-sdk/credential-provider-node": "3.699.0", + "@aws-sdk/middleware-host-header": "3.696.0", + "@aws-sdk/middleware-logger": "3.696.0", + "@aws-sdk/middleware-recursion-detection": "3.696.0", + "@aws-sdk/middleware-user-agent": "3.696.0", + "@aws-sdk/region-config-resolver": "3.696.0", + "@aws-sdk/types": "3.696.0", + "@aws-sdk/util-endpoints": "3.696.0", + "@aws-sdk/util-user-agent-browser": "3.696.0", + "@aws-sdk/util-user-agent-node": "3.696.0", + "@smithy/config-resolver": "^3.0.12", + "@smithy/core": "^2.5.3", + "@smithy/fetch-http-handler": "^4.1.1", + "@smithy/hash-node": "^3.0.10", + "@smithy/invalid-dependency": "^3.0.10", + "@smithy/middleware-content-length": "^3.0.12", + "@smithy/middleware-endpoint": "^3.2.3", + "@smithy/middleware-retry": "^3.0.27", + "@smithy/middleware-serde": "^3.0.10", + "@smithy/middleware-stack": "^3.0.10", + "@smithy/node-config-provider": "^3.1.11", + "@smithy/node-http-handler": "^3.3.1", + "@smithy/protocol-http": "^4.1.7", + "@smithy/smithy-client": "^3.4.4", + "@smithy/types": "^3.7.1", + "@smithy/url-parser": "^3.0.10", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.27", + "@smithy/util-defaults-mode-node": "^3.0.27", + "@smithy/util-endpoints": "^2.1.6", + "@smithy/util-middleware": "^3.0.10", + "@smithy/util-retry": "^3.0.10", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.699.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/client-sso/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.699.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.699.0.tgz", + "integrity": "sha512-++lsn4x2YXsZPIzFVwv3fSUVM55ZT0WRFmPeNilYIhZClxHLmVAWKH4I55cY9ry60/aTKYjzOXkWwyBKGsGvQg==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.699.0", + "@aws-sdk/core": "3.696.0", + "@aws-sdk/credential-provider-node": "3.699.0", + "@aws-sdk/middleware-host-header": "3.696.0", + "@aws-sdk/middleware-logger": "3.696.0", + "@aws-sdk/middleware-recursion-detection": "3.696.0", + "@aws-sdk/middleware-user-agent": "3.696.0", + "@aws-sdk/region-config-resolver": "3.696.0", + "@aws-sdk/types": "3.696.0", + "@aws-sdk/util-endpoints": "3.696.0", + "@aws-sdk/util-user-agent-browser": "3.696.0", + "@aws-sdk/util-user-agent-node": "3.696.0", + "@smithy/config-resolver": "^3.0.12", + "@smithy/core": "^2.5.3", + "@smithy/fetch-http-handler": "^4.1.1", + "@smithy/hash-node": "^3.0.10", + "@smithy/invalid-dependency": "^3.0.10", + "@smithy/middleware-content-length": "^3.0.12", + "@smithy/middleware-endpoint": "^3.2.3", + "@smithy/middleware-retry": "^3.0.27", + "@smithy/middleware-serde": "^3.0.10", + "@smithy/middleware-stack": "^3.0.10", + "@smithy/node-config-provider": "^3.1.11", + "@smithy/node-http-handler": "^3.3.1", + "@smithy/protocol-http": "^4.1.7", + "@smithy/smithy-client": "^3.4.4", + "@smithy/types": "^3.7.1", + "@smithy/url-parser": "^3.0.10", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.27", + "@smithy/util-defaults-mode-node": "^3.0.27", + "@smithy/util-endpoints": "^2.1.6", + "@smithy/util-middleware": "^3.0.10", + "@smithy/util-retry": "^3.0.10", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/core": { + "version": "3.696.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.696.0.tgz", + "integrity": "sha512-3c9III1k03DgvRZWg8vhVmfIXPG6hAciN9MzQTzqGngzWAELZF/WONRTRQuDFixVtarQatmLHYVw/atGeA2Byw==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.696.0", + "@smithy/core": "^2.5.3", + "@smithy/node-config-provider": "^3.1.11", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.7", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.4", + "@smithy/types": "^3.7.1", + "@smithy/util-middleware": "^3.0.10", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.699.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.699.0.tgz", + "integrity": "sha512-iuaTnudaBfEET+o444sDwf71Awe6UiZfH+ipUPmswAi2jZDwdFF1nxMKDEKL8/LV5WpXsdKSfwgS0RQeupURew==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.699.0", + "@aws-sdk/types": "3.696.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.696.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.696.0.tgz", + "integrity": "sha512-T9iMFnJL7YTlESLpVFT3fg1Lkb1lD+oiaIC8KMpepb01gDUBIpj9+Y+pA/cgRWW0yRxmkDXNazAE2qQTVFGJzA==", + "optional": true, + "dependencies": { + "@aws-sdk/core": "3.696.0", + "@aws-sdk/types": "3.696.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.696.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.696.0.tgz", + "integrity": "sha512-GV6EbvPi2eq1+WgY/o2RFA3P7HGmnkIzCNmhwtALFlqMroLYWKE7PSeHw66Uh1dFQeVESn0/+hiUNhu1mB0emA==", + "optional": true, + "dependencies": { + "@aws-sdk/core": "3.696.0", + "@aws-sdk/types": "3.696.0", + "@smithy/fetch-http-handler": "^4.1.1", + "@smithy/node-http-handler": "^3.3.1", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.7", + "@smithy/smithy-client": "^3.4.4", + "@smithy/types": "^3.7.1", + "@smithy/util-stream": "^3.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.699.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.699.0.tgz", + "integrity": "sha512-dXmCqjJnKmG37Q+nLjPVu22mNkrGHY8hYoOt3Jo9R2zr5MYV7s/NHsCHr+7E+BZ+tfZYLRPeB1wkpTeHiEcdRw==", + "optional": true, + "dependencies": { + "@aws-sdk/core": "3.696.0", + "@aws-sdk/credential-provider-env": "3.696.0", + "@aws-sdk/credential-provider-http": "3.696.0", + "@aws-sdk/credential-provider-process": "3.696.0", + "@aws-sdk/credential-provider-sso": "3.699.0", + "@aws-sdk/credential-provider-web-identity": "3.696.0", + "@aws-sdk/types": "3.696.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.699.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.699.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.699.0.tgz", + "integrity": "sha512-MmEmNDo1bBtTgRmdNfdQksXu4uXe66s0p1hi1YPrn1h59Q605eq/xiWbGL6/3KdkViH6eGUuABeV2ODld86ylg==", + "optional": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.696.0", + "@aws-sdk/credential-provider-http": "3.696.0", + "@aws-sdk/credential-provider-ini": "3.699.0", + "@aws-sdk/credential-provider-process": "3.696.0", + "@aws-sdk/credential-provider-sso": "3.699.0", + "@aws-sdk/credential-provider-web-identity": "3.696.0", + "@aws-sdk/types": "3.696.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.696.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.696.0.tgz", + "integrity": "sha512-mL1RcFDe9sfmyU5K1nuFkO8UiJXXxLX4JO1gVaDIOvPqwStpUAwi3A1BoeZhWZZNQsiKI810RnYGo0E0WB/hUA==", + "optional": true, + "dependencies": { + "@aws-sdk/core": "3.696.0", + "@aws-sdk/types": "3.696.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.699.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.699.0.tgz", + "integrity": "sha512-Ekp2cZG4pl9D8+uKWm4qO1xcm8/MeiI8f+dnlZm8aQzizeC+aXYy9GyoclSf6daK8KfRPiRfM7ZHBBL5dAfdMA==", + "optional": true, + "dependencies": { + "@aws-sdk/client-sso": "3.696.0", + "@aws-sdk/core": "3.696.0", + "@aws-sdk/token-providers": "3.699.0", + "@aws-sdk/types": "3.696.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.696.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.696.0.tgz", + "integrity": "sha512-XJ/CVlWChM0VCoc259vWguFUjJDn/QwDqHwbx+K9cg3v6yrqXfK5ai+p/6lx0nQpnk4JzPVeYYxWRpaTsGC9rg==", + "optional": true, + "dependencies": { + "@aws-sdk/core": "3.696.0", + "@aws-sdk/types": "3.696.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.696.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/credential-providers": { + "version": "3.699.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.699.0.tgz", + "integrity": "sha512-jBjOntl9zN9Nvb0jmbMGRbiTzemDz64ij7W6BDavxBJRZpRoNeN0QCz6RolkCyXnyUJjo5mF2unY2wnv00A+LQ==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.699.0", + "@aws-sdk/client-sso": "3.696.0", + "@aws-sdk/client-sts": "3.699.0", + "@aws-sdk/core": "3.696.0", + "@aws-sdk/credential-provider-cognito-identity": "3.699.0", + "@aws-sdk/credential-provider-env": "3.696.0", + "@aws-sdk/credential-provider-http": "3.696.0", + "@aws-sdk/credential-provider-ini": "3.699.0", + "@aws-sdk/credential-provider-node": "3.699.0", + "@aws-sdk/credential-provider-process": "3.696.0", + "@aws-sdk/credential-provider-sso": "3.699.0", + "@aws-sdk/credential-provider-web-identity": "3.696.0", + "@aws-sdk/types": "3.696.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.696.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.696.0.tgz", + "integrity": "sha512-zELJp9Ta2zkX7ELggMN9qMCgekqZhFC5V2rOr4hJDEb/Tte7gpfKSObAnw/3AYiVqt36sjHKfdkoTsuwGdEoDg==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.696.0", + "@smithy/protocol-http": "^4.1.7", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.696.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.696.0.tgz", + "integrity": "sha512-KhkHt+8AjCxcR/5Zp3++YPJPpFQzxpr+jmONiT/Jw2yqnSngZ0Yspm5wGoRx2hS1HJbyZNuaOWEGuJoxLeBKfA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.696.0", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.696.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.696.0.tgz", + "integrity": "sha512-si/maV3Z0hH7qa99f9ru2xpS5HlfSVcasRlNUXKSDm611i7jFMWwGNLUOXFAOLhXotPX5G3Z6BLwL34oDeBMug==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.696.0", + "@smithy/protocol-http": "^4.1.7", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.696.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.696.0.tgz", + "integrity": "sha512-Lvyj8CTyxrHI6GHd2YVZKIRI5Fmnugt3cpJo0VrKKEgK5zMySwEZ1n4dqPK6czYRWKd5+WnYHYAuU+Wdk6Jsjw==", + "optional": true, + "dependencies": { + "@aws-sdk/core": "3.696.0", + "@aws-sdk/types": "3.696.0", + "@aws-sdk/util-endpoints": "3.696.0", + "@smithy/core": "^2.5.3", + "@smithy/protocol-http": "^4.1.7", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.696.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.696.0.tgz", + "integrity": "sha512-7EuH142lBXjI8yH6dVS/CZeiK/WZsmb/8zP6bQbVYpMrppSTgB3MzZZdxVZGzL5r8zPQOU10wLC4kIMy0qdBVQ==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.696.0", + "@smithy/node-config-provider": "^3.1.11", + "@smithy/types": "^3.7.1", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.10", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.699.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.699.0.tgz", + "integrity": "sha512-kuiEW9DWs7fNos/SM+y58HCPhcIzm1nEZLhe2/7/6+TvAYLuEWURYsbK48gzsxXlaJ2k/jGY3nIsA7RptbMOwA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.696.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.699.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/types": { + "version": "3.696.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.696.0.tgz", + "integrity": "sha512-9rTvUJIAj5d3//U5FDPWGJ1nFJLuWb30vugGOrWk7aNZ6y9tuA3PI7Cc9dP8WEXKVyK1vuuk8rSFP2iqXnlgrw==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/types/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.696.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.696.0.tgz", + "integrity": "sha512-T5s0IlBVX+gkb9g/I6CLt4yAZVzMSiGnbUqWihWsHvQR1WOoIcndQy/Oz/IJXT9T2ipoy7a80gzV6a5mglrioA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.696.0", + "@smithy/types": "^3.7.1", + "@smithy/util-endpoints": "^2.1.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.693.0.tgz", + "integrity": "sha512-ttrag6haJLWABhLqtg1Uf+4LgHWIMOVSYL+VYZmAp2v4PUGOwWmWQH0Zk8RM7YuQcLfH/EoR72/Yxz6A4FKcuw==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.696.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.696.0.tgz", + "integrity": "sha512-Z5rVNDdmPOe6ELoM5AhF/ja5tSjbe6ctSctDPb0JdDf4dT0v2MfwhJKzXju2RzX8Es/77Glh7MlaXLE0kCB9+Q==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.696.0", + "@smithy/types": "^3.7.1", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.696.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.696.0.tgz", + "integrity": "sha512-KhKqcfyXIB0SCCt+qsu4eJjsfiOrNzK5dCV7RAW2YIpp+msxGUUX0NdRE9rkzjiv+3EMktgJm3eEIS+yxtlVdQ==", + "optional": true, + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.696.0", + "@aws-sdk/types": "3.696.0", + "@smithy/node-config-provider": "^3.1.11", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-user-agent-node/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/@bochilteam/scraper": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@bochilteam/scraper/-/scraper-3.0.0.tgz", + "integrity": "sha512-vqV7KkV+zyjFpSYplwRz0NIFt/pxUAF/zDnUogr280ZnWK9nQqt+mfV8J3TLUjUbV6HxSrsbltUAM6n1ff94Sg==", + "deprecated": "New major 5.x version release!!!", + "dependencies": { + "cheerio": "^1.0.0-rc.10", + "form-data": "^4.0.0", + "got": "^11.8.3", + "human-readable": "^0.2.1", + "similarity": "^1.2.1", + "zod": "^3.17.3" + }, + "engines": { + "node": ">= 12.20" + }, + "optionalDependencies": { + "ws": "^8.4.2" + } + }, + "node_modules/@eshaz/web-worker": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@eshaz/web-worker/-/web-worker-1.2.2.tgz", + "integrity": "sha512-WxXiHFmD9u/owrzempiDlBB1ZYqiLnm9s6aPc8AlFQalq2tKmqdmMr9GXOupDgzXtqnBipj8Un0gkIm7Sjf8mw==" + }, + "node_modules/@hapi/boom": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", + "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", + "dependencies": { + "@hapi/hoek": "9.x.x" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@javascript-obfuscator/escodegen": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@javascript-obfuscator/escodegen/-/escodegen-2.3.0.tgz", + "integrity": "sha512-QVXwMIKqYMl3KwtTirYIA6gOCiJ0ZDtptXqAv/8KWLG9uQU2fZqTVy7a/A5RvcoZhbDoFfveTxuGxJ5ibzQtkw==", + "dependencies": { + "@javascript-obfuscator/estraverse": "^5.3.0", + "esprima": "^4.0.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/@javascript-obfuscator/estraverse": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@javascript-obfuscator/estraverse/-/estraverse-5.4.0.tgz", + "integrity": "sha512-CZFX7UZVN9VopGbjTx4UXaXsi9ewoM1buL0kY7j1ftYdSs7p2spv9opxFjHlQ/QGTgh4UqufYqJJ0WKLml7b6w==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@jimp/bmp": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.13.tgz", + "integrity": "sha512-9edAxu7N2FX7vzkdl5Jo1BbACfycUtBQX+XBMcHA2bk62P8R0otgkHg798frgAk/WxQIzwxqOH6wMiCwrlAzdQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "bmp-js": "^0.1.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/core": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.13.tgz", + "integrity": "sha512-qXpA1tzTnlkTku9yqtuRtS/wVntvE6f3m3GNxdTdtmc+O+Wcg9Xo2ABPMh7Nc0AHbMKzwvwgB2JnjZmlmJEObg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "any-base": "^1.1.0", + "buffer": "^5.2.0", + "exif-parser": "^0.1.12", + "file-type": "^16.5.4", + "load-bmfont": "^1.3.1", + "mkdirp": "^0.5.1", + "phin": "^2.9.1", + "pixelmatch": "^4.0.2", + "tinycolor2": "^1.4.1" + } + }, + "node_modules/@jimp/core/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/@jimp/custom": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.13.tgz", + "integrity": "sha512-LTATglVUPGkPf15zX1wTMlZ0+AU7cGEGF6ekVF1crA8eHUWsGjrYTB+Ht4E3HTrCok8weQG+K01rJndCp/l4XA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/core": "^0.16.13" + } + }, + "node_modules/@jimp/gif": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.13.tgz", + "integrity": "sha512-yFAMZGv3o+YcjXilMWWwS/bv1iSqykFahFMSO169uVMtfQVfa90kt4/kDwrXNR6Q9i6VHpFiGZMlF2UnHClBvg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "gifwrap": "^0.9.2", + "omggif": "^1.0.9" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/jpeg": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.13.tgz", + "integrity": "sha512-BJHlDxzTlCqP2ThqP8J0eDrbBfod7npWCbJAcfkKqdQuFk0zBPaZ6KKaQKyKxmWJ87Z6ohANZoMKEbtvrwz1AA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "jpeg-js": "^0.4.2" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-blit": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.13.tgz", + "integrity": "sha512-8Z1k96ZFxlhK2bgrY1JNWNwvaBeI/bciLM0yDOni2+aZwfIIiC7Y6PeWHTAvjHNjphz+XCt01WQmOYWCn0ML6g==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-blur": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.13.tgz", + "integrity": "sha512-PvLrfa8vkej3qinlebyhLpksJgCF5aiysDMSVhOZqwH5nQLLtDE9WYbnsofGw4r0VVpyw3H/ANCIzYTyCtP9Cg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-circle": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.13.tgz", + "integrity": "sha512-RNave7EFgZrb5V5EpdvJGAEHMnDAJuwv05hKscNfIYxf0kR3KhViBTDy+MoTnMlIvaKFULfwIgaZWzyhuINMzA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-color": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.13.tgz", + "integrity": "sha512-xW+9BtEvoIkkH/Wde9ql4nAFbYLkVINhpgAE7VcBUsuuB34WUbcBl/taOuUYQrPEFQJ4jfXiAJZ2H/rvKjCVnQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "tinycolor2": "^1.4.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-contain": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.13.tgz", + "integrity": "sha512-QayTXw4tXMwU6q6acNTQrTTFTXpNRBe+MgTGMDU0lk+23PjlFCO/9sacflelG8lsp7vNHhAxFeHptDMAksEYzg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-cover": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.13.tgz", + "integrity": "sha512-BSsP71GTNaqWRcvkbWuIVH+zK7b3TSNebbhDkFK0fVaUTzHuKMS/mgY4hDZIEVt7Rf5FjadAYtsujHN9w0iSYA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-crop": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.13.tgz", + "integrity": "sha512-WEl2tPVYwzYL8OKme6Go2xqiWgKsgxlMwyHabdAU4tXaRwOCnOI7v4021gCcBb9zn/oWwguHuKHmK30Fw2Z/PA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-displace": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.13.tgz", + "integrity": "sha512-qt9WKq8vWrcjySa9DyQ0x/RBMHQeiVjdVSY1SJsMjssPUf0pS74qorcuAkGi89biN3YoGUgPkpqECnAWnYwgGA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-dither": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.13.tgz", + "integrity": "sha512-5/N3yJggbWQTlGZHQYJPmQXEwR52qaXjEzkp1yRBbtdaekXE3BG/suo0fqeoV/csf8ooI78sJzYmIrxNoWVtgQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-fisheye": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.13.tgz", + "integrity": "sha512-2rZmTdFbT/cF9lEZIkXCYO0TsT114Q27AX5IAo0Sju6jVQbvIk1dFUTnwLDadTo8wkJlFzGqMQ24Cs8cHWOliA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-flip": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.13.tgz", + "integrity": "sha512-EmcgAA74FTc5u7Z+hUO/sRjWwfPPLuOQP5O64x5g4j0T12Bd29IgsYZxoutZo/rb3579+JNa/3wsSEmyVv1EpA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-rotate": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-gaussian": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.13.tgz", + "integrity": "sha512-A1XKfGQD0iDdIiKqFYi8nZMv4dDVYdxbrmgR7y/CzUHhSYdcmoljLIIsZZM3Iks/Wa353W3vtvkWLuDbQbch1w==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-invert": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.13.tgz", + "integrity": "sha512-xFMrIn7czEZbdbMzZWuaZFnlLGJDVJ82y5vlsKsXRTG2kcxRsMPXvZRWHV57nSs1YFsNqXSbrC8B98n0E32njQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-mask": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.13.tgz", + "integrity": "sha512-wLRYKVBXql2GAYgt6FkTnCfE+q5NomM7Dlh0oIPGAoMBWDyTx0eYutRK6PlUrRK2yMHuroAJCglICTbxqGzowQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-normalize": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.13.tgz", + "integrity": "sha512-3tfad0n9soRna4IfW9NzQdQ2Z3ijkmo21DREHbE6CGcMIxOSvfRdSvf1qQPApxjTSo8LTU4MCi/fidx/NZ0GqQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-print": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.13.tgz", + "integrity": "sha512-0m6i3p01PGRkGAK9r53hDYrkyMq+tlhLOIbsSTmZyh6HLshUKlTB7eXskF5OpVd5ZUHoltlNc6R+ggvKIzxRFw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "load-bmfont": "^1.4.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-resize": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.13.tgz", + "integrity": "sha512-qoqtN8LDknm3fJm9nuPygJv30O3vGhSBD2TxrsCnhtOsxKAqVPJtFVdGd/qVuZ8nqQANQmTlfqTiK9mVWQ7MiQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-rotate": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.13.tgz", + "integrity": "sha512-Ev+Jjmj1nHYw897z9C3R9dYsPv7S2/nxdgfFb/h8hOwK0Ovd1k/+yYS46A0uj/JCKK0pQk8wOslYBkPwdnLorw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-scale": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.13.tgz", + "integrity": "sha512-05POQaEJVucjTiSGMoH68ZiELc7QqpIpuQlZ2JBbhCV+WCbPFUBcGSmE7w4Jd0E2GvCho/NoMODLwgcVGQA97A==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-shadow": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.13.tgz", + "integrity": "sha512-nmu5VSZ9hsB1JchTKhnnCY+paRBnwzSyK5fhkhtQHHoFD5ArBQ/5wU8y6tCr7k/GQhhGq1OrixsECeMjPoc8Zw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blur": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-threshold": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.13.tgz", + "integrity": "sha512-+3zArBH0OE3Rhjm4HyAokMsZlIq5gpQec33CncyoSwxtRBM2WAhUVmCUKuBo+Lr/2/4ISoY4BWpHKhMLDix6cA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-color": ">=0.8.0", + "@jimp/plugin-resize": ">=0.8.0" + } + }, + "node_modules/@jimp/plugins": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.13.tgz", + "integrity": "sha512-CJLdqODEhEVs4MgWCxpWL5l95sCBlkuSLz65cxEm56X5akIsn4LOlwnKoSEZioYcZUBvHhCheH67AyPTudfnQQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/plugin-blit": "^0.16.13", + "@jimp/plugin-blur": "^0.16.13", + "@jimp/plugin-circle": "^0.16.13", + "@jimp/plugin-color": "^0.16.13", + "@jimp/plugin-contain": "^0.16.13", + "@jimp/plugin-cover": "^0.16.13", + "@jimp/plugin-crop": "^0.16.13", + "@jimp/plugin-displace": "^0.16.13", + "@jimp/plugin-dither": "^0.16.13", + "@jimp/plugin-fisheye": "^0.16.13", + "@jimp/plugin-flip": "^0.16.13", + "@jimp/plugin-gaussian": "^0.16.13", + "@jimp/plugin-invert": "^0.16.13", + "@jimp/plugin-mask": "^0.16.13", + "@jimp/plugin-normalize": "^0.16.13", + "@jimp/plugin-print": "^0.16.13", + "@jimp/plugin-resize": "^0.16.13", + "@jimp/plugin-rotate": "^0.16.13", + "@jimp/plugin-scale": "^0.16.13", + "@jimp/plugin-shadow": "^0.16.13", + "@jimp/plugin-threshold": "^0.16.13", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/png": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.13.tgz", + "integrity": "sha512-8cGqINvbWJf1G0Her9zbq9I80roEX0A+U45xFby3tDWfzn+Zz8XKDF1Nv9VUwVx0N3zpcG1RPs9hfheG4Cq2kg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "pngjs": "^3.3.3" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/png/node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@jimp/tiff": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.13.tgz", + "integrity": "sha512-oJY8d9u95SwW00VPHuCNxPap6Q1+E/xM5QThb9Hu+P6EGuu6lIeLaNBMmFZyblwFbwrH+WBOZlvIzDhi4Dm/6Q==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "utif": "^2.0.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/types": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.13.tgz", + "integrity": "sha512-mC0yVNUobFDjoYLg4hoUwzMKgNlxynzwt3cDXzumGvRJ7Kb8qQGOWJQjQFo5OxmGExqzPphkirdbBF88RVLBCg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/bmp": "^0.16.13", + "@jimp/gif": "^0.16.13", + "@jimp/jpeg": "^0.16.13", + "@jimp/png": "^0.16.13", + "@jimp/tiff": "^0.16.13", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/utils": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.13.tgz", + "integrity": "sha512-VyCpkZzFTHXtKgVO35iKN0sYR10psGpV6SkcSeV4oF7eSYlR8Bl6aQLCzVeFjvESF7mxTmIiI3/XrMobVrtxDA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz", + "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@npmcli/agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", + "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/@npmcli/fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.8.tgz", + "integrity": "sha512-+3DOBcUn5/rVjlxGvUPKc416SExarAQ+Qe0bqk30YSUjbepwpS7QN0cyKUSifvLJhdMZ0WPzPP5ymut0oonrpQ==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/abort-controller/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/config-resolver": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.12.tgz", + "integrity": "sha512-YAJP9UJFZRZ8N+UruTeq78zkdjUHmzsY62J4qKWZ4SXB4QXJ/+680EfXXgkYA2xj77ooMqtUY9m406zGNqwivQ==", + "optional": true, + "dependencies": { + "@smithy/node-config-provider": "^3.1.11", + "@smithy/types": "^3.7.1", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.10", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/config-resolver/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/core": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.4.tgz", + "integrity": "sha512-iFh2Ymn2sCziBRLPuOOxRPkuCx/2gBdXtBGuCUFLUe6bWYjKnhHyIPqGeNkLZ5Aco/5GjebRTBFiWID3sDbrKw==", + "optional": true, + "dependencies": { + "@smithy/middleware-serde": "^3.0.10", + "@smithy/protocol-http": "^4.1.7", + "@smithy/types": "^3.7.1", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-middleware": "^3.0.10", + "@smithy/util-stream": "^3.3.1", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.7.tgz", + "integrity": "sha512-cEfbau+rrWF8ylkmmVAObOmjbTIzKyUC5TkBL58SbLywD0RCBC4JAUKbmtSm2w5KUJNRPGgpGFMvE2FKnuNlWQ==", + "optional": true, + "dependencies": { + "@smithy/node-config-provider": "^3.1.11", + "@smithy/property-provider": "^3.1.10", + "@smithy/types": "^3.7.1", + "@smithy/url-parser": "^3.0.10", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.1.1.tgz", + "integrity": "sha512-bH7QW0+JdX0bPBadXt8GwMof/jz0H28I84hU1Uet9ISpzUqXqRQ3fEZJ+ANPOhzSEczYvANNl3uDQDYArSFDtA==", + "optional": true, + "dependencies": { + "@smithy/protocol-http": "^4.1.7", + "@smithy/querystring-builder": "^3.0.10", + "@smithy/types": "^3.7.1", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/fetch-http-handler/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/hash-node": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.10.tgz", + "integrity": "sha512-3zWGWCHI+FlJ5WJwx73Mw2llYR8aflVyZN5JhoqLxbdPZi6UyKSdCeXAWJw9ja22m6S6Tzz1KZ+kAaSwvydi0g==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.1", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/hash-node/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/invalid-dependency": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.10.tgz", + "integrity": "sha512-Lp2L65vFi+cj0vFMu2obpPW69DU+6O5g3086lmI4XcnRCG8PxvpWC7XyaVwJCxsZFzueHjXnrOH/E0pl0zikfA==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/invalid-dependency/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/is-array-buffer/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/middleware-content-length": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.12.tgz", + "integrity": "sha512-1mDEXqzM20yywaMDuf5o9ue8OkJ373lSPbaSjyEvkWdqELhFMyNNgKGWL/rCSf4KME8B+HlHKuR8u9kRj8HzEQ==", + "optional": true, + "dependencies": { + "@smithy/protocol-http": "^4.1.7", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-content-length/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.4.tgz", + "integrity": "sha512-TybiW2LA3kYVd3e+lWhINVu1o26KJbBwOpADnf0L4x/35vLVica77XVR5hvV9+kWeTGeSJ3IHTcYxbRxlbwhsg==", + "optional": true, + "dependencies": { + "@smithy/core": "^2.5.4", + "@smithy/middleware-serde": "^3.0.10", + "@smithy/node-config-provider": "^3.1.11", + "@smithy/shared-ini-file-loader": "^3.1.11", + "@smithy/types": "^3.7.1", + "@smithy/url-parser": "^3.0.10", + "@smithy/util-middleware": "^3.0.10", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/middleware-retry": { + "version": "3.0.28", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.28.tgz", + "integrity": "sha512-vK2eDfvIXG1U64FEUhYxoZ1JSj4XFbYWkK36iz02i3pFwWiDz1Q7jKhGTBCwx/7KqJNk4VS7d7cDLXFOvP7M+g==", + "optional": true, + "dependencies": { + "@smithy/node-config-provider": "^3.1.11", + "@smithy/protocol-http": "^4.1.7", + "@smithy/service-error-classification": "^3.0.10", + "@smithy/smithy-client": "^3.4.5", + "@smithy/types": "^3.7.1", + "@smithy/util-middleware": "^3.0.10", + "@smithy/util-retry": "^3.0.10", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-retry/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/middleware-retry/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.10.tgz", + "integrity": "sha512-MnAuhh+dD14F428ubSJuRnmRsfOpxSzvRhaGVTvd/lrUDE3kxzCCmH8lnVTvoNQnV2BbJ4c15QwZ3UdQBtFNZA==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-serde/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/middleware-stack": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.10.tgz", + "integrity": "sha512-grCHyoiARDBBGPyw2BeicpjgpsDFWZZxptbVKb3CRd/ZA15F/T6rZjCCuBUjJwdck1nwUuIxYtsS4H9DDpbP5w==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-stack/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/node-config-provider": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.11.tgz", + "integrity": "sha512-URq3gT3RpDikh/8MBJUB+QGZzfS7Bm6TQTqoh4CqE8NBuyPkWa5eUXj0XFcFfeZVgg3WMh1u19iaXn8FvvXxZw==", + "optional": true, + "dependencies": { + "@smithy/property-provider": "^3.1.10", + "@smithy/shared-ini-file-loader": "^3.1.11", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/node-config-provider/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/node-http-handler": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.3.1.tgz", + "integrity": "sha512-fr+UAOMGWh6bn4YSEezBCpJn9Ukp9oR4D32sCjCo7U81evE11YePOQ58ogzyfgmjIO79YeOdfXXqr0jyhPQeMg==", + "optional": true, + "dependencies": { + "@smithy/abort-controller": "^3.1.8", + "@smithy/protocol-http": "^4.1.7", + "@smithy/querystring-builder": "^3.0.10", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/node-http-handler/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/property-provider": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.10.tgz", + "integrity": "sha512-n1MJZGTorTH2DvyTVj+3wXnd4CzjJxyXeOgnTlgNVFxaaMeT4OteEp4QrzF8p9ee2yg42nvyVK6R/awLCakjeQ==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/property-provider/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/protocol-http": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.7.tgz", + "integrity": "sha512-FP2LepWD0eJeOTm0SjssPcgqAlDFzOmRXqXmGhfIM52G7Lrox/pcpQf6RP4F21k0+O12zaqQt5fCDOeBtqY6Cg==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/protocol-http/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/querystring-builder": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.10.tgz", + "integrity": "sha512-nT9CQF3EIJtIUepXQuBFb8dxJi3WVZS3XfuDksxSCSn+/CzZowRLdhDn+2acbBv8R6eaJqPupoI/aRFIImNVPQ==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.1", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/querystring-builder/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/querystring-parser": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.10.tgz", + "integrity": "sha512-Oa0XDcpo9SmjhiDD9ua2UyM3uU01ZTuIrNdZvzwUTykW1PM8o2yJvMh1Do1rY5sUQg4NDV70dMi0JhDx4GyxuQ==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/querystring-parser/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/service-error-classification": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.10.tgz", + "integrity": "sha512-zHe642KCqDxXLuhs6xmHVgRwy078RfqxP2wRDpIyiF8EmsWXptMwnMwbVa50lw+WOGNrYm9zbaEg0oDe3PTtvQ==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.11.tgz", + "integrity": "sha512-AUdrIZHFtUgmfSN4Gq9nHu3IkHMa1YDcN+s061Nfm+6pQ0mJy85YQDB0tZBCmls0Vuj22pLwDPmL92+Hvfwwlg==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/signature-v4": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.3.tgz", + "integrity": "sha512-pPSQQ2v2vu9vc8iew7sszLd0O09I5TRc5zhY71KA+Ao0xYazIG+uLeHbTJfIWGO3BGVLiXjUr3EEeCcEQLjpWQ==", + "optional": true, + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.7", + "@smithy/types": "^3.7.1", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.10", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/signature-v4/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/smithy-client": { + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.5.tgz", + "integrity": "sha512-k0sybYT9zlP79sIKd1XGm4TmK0AS1nA2bzDHXx7m0nGi3RQ8dxxQUs4CPkSmQTKAo+KF9aINU3KzpGIpV7UoMw==", + "optional": true, + "dependencies": { + "@smithy/core": "^2.5.4", + "@smithy/middleware-endpoint": "^3.2.4", + "@smithy/middleware-stack": "^3.0.10", + "@smithy/protocol-http": "^4.1.7", + "@smithy/types": "^3.7.1", + "@smithy/util-stream": "^3.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/smithy-client/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/types": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.1.tgz", + "integrity": "sha512-XKLcLXZY7sUQgvvWyeaL/qwNPp6V3dWcUjqrQKjSb+tzYiCy340R/c64LV5j+Tnb2GhmunEX0eou+L+m2hJNYA==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/types/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/url-parser": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.10.tgz", + "integrity": "sha512-j90NUalTSBR2NaZTuruEgavSdh8MLirf58LoGSk4AtQfyIymogIhgnGUU2Mga2bkMkpSoC9gxb74xBXL5afKAQ==", + "optional": true, + "dependencies": { + "@smithy/querystring-parser": "^3.0.10", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/url-parser/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "optional": true, + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-base64/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", + "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/util-body-length-browser/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-body-length-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", + "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-body-length-node/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "optional": true, + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-buffer-from/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-config-provider": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", + "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-config-provider/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "3.0.28", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.28.tgz", + "integrity": "sha512-6bzwAbZpHRFVJsOztmov5PGDmJYsbNSoIEfHSJJyFLzfBGCCChiO3od9k7E/TLgrCsIifdAbB9nqbVbyE7wRUw==", + "optional": true, + "dependencies": { + "@smithy/property-provider": "^3.1.10", + "@smithy/smithy-client": "^3.4.5", + "@smithy/types": "^3.7.1", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "3.0.28", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.28.tgz", + "integrity": "sha512-78ENJDorV1CjOQselGmm3+z7Yqjj5HWCbjzh0Ixuq736dh1oEnD9sAttSBNSLlpZsX8VQnmERqA2fEFlmqWn8w==", + "optional": true, + "dependencies": { + "@smithy/config-resolver": "^3.0.12", + "@smithy/credential-provider-imds": "^3.2.7", + "@smithy/node-config-provider": "^3.1.11", + "@smithy/property-provider": "^3.1.10", + "@smithy/smithy-client": "^3.4.5", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-endpoints": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.6.tgz", + "integrity": "sha512-mFV1t3ndBh0yZOJgWxO9J/4cHZVn5UG1D8DeCc6/echfNkeEJWu9LD7mgGH5fHrEdR7LDoWw7PQO6QiGpHXhgA==", + "optional": true, + "dependencies": { + "@smithy/node-config-provider": "^3.1.11", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-endpoints/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-middleware": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.10.tgz", + "integrity": "sha512-eJO+/+RsrG2RpmY68jZdwQtnfsxjmPxzMlQpnHKjFPwrYqvlcT+fHdT+ZVwcjlWSrByOhGr9Ff2GG17efc192A==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-middleware/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-retry": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.10.tgz", + "integrity": "sha512-1l4qatFp4PiU6j7UsbasUHL2VU023NRB/gfaa1M0rDqVrRN4g3mCArLRyH3OuktApA4ye+yjWQHjdziunw2eWA==", + "optional": true, + "dependencies": { + "@smithy/service-error-classification": "^3.0.10", + "@smithy/types": "^3.7.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-retry/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-stream": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.3.1.tgz", + "integrity": "sha512-Ff68R5lJh2zj+AUTvbAU/4yx+6QPRzg7+pI7M1FbtQHcRIp7xvguxVsQBKyB3fwiOwhAKu0lnNyYBaQfSW6TNw==", + "optional": true, + "dependencies": { + "@smithy/fetch-http-handler": "^4.1.1", + "@smithy/node-http-handler": "^3.3.1", + "@smithy/types": "^3.7.1", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-stream/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-uri-escape/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "optional": true, + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-utf8/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@thi.ng/bitstream": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@thi.ng/bitstream/-/bitstream-2.4.5.tgz", + "integrity": "sha512-pbwFt/ZaXbzZFRj6p2rFaDKfX2XR2Tf5deDExP40BtPIY8WT3Qrk6yTLmwos9hxdKfv308gYLSAnOTsGl5+r5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/postspectacular" + }, + { + "type": "patreon", + "url": "https://patreon.com/thing_umbrella" + } + ], + "dependencies": { + "@thi.ng/errors": "^2.5.19" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@thi.ng/errors": { + "version": "2.5.19", + "resolved": "https://registry.npmjs.org/@thi.ng/errors/-/errors-2.5.19.tgz", + "integrity": "sha512-3+agBHA+jPM90BLj+wmptHZGGl6yMT+MYEbeTFWMDZuDBVhtzreQsLjYCRa3elZt8LMqTWcCTURmgLO7bJRQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/postspectacular" + }, + { + "type": "patreon", + "url": "https://patreon.com/thing_umbrella" + } + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + }, + "node_modules/@types/http-errors": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.2.tgz", + "integrity": "sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w==" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + }, + "node_modules/@types/node": { + "version": "22.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.0.tgz", + "integrity": "sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA==", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/validator": { + "version": "13.12.2", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz", + "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==" + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "node_modules/@vitalets/google-translate-api": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@vitalets/google-translate-api/-/google-translate-api-9.2.0.tgz", + "integrity": "sha512-w98IPWGuexlGmh8Y19AxF6cgWT0U5JLevVNDKEuFpTWtBC9z3YtDWKTDxF3nPP1k9bWicuB1V7I7YfHoZiDScw==", + "dependencies": { + "@types/http-errors": "^1.8.2", + "http-errors": "^2.0.0", + "node-fetch": "^2.6.7" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@wasm-audio-decoders/common": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@wasm-audio-decoders/common/-/common-9.0.5.tgz", + "integrity": "sha512-b9JNh9sPAvn8PVIizNh9D60WkfQong/u9ea873H47u7zvVDLctxYIp2aZw9CQqXaQdk7JB3MoU5UHiseO40swg==", + "dependencies": { + "@eshaz/web-worker": "1.2.2", + "simple-yenc": "^1.0.4" + } + }, + "node_modules/@wasm-audio-decoders/flac": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@wasm-audio-decoders/flac/-/flac-0.2.5.tgz", + "integrity": "sha512-8M//CgB3PlkWwn47KcwD0tO6DZBA7/AGG0ukHSG0G97UbNEUNINvKDWAKPVWznzHsqeBP6axw+K/38dzng64JA==", + "dependencies": { + "@wasm-audio-decoders/common": "9.0.5", + "codec-parser": "2.5.0" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/eshaz" + } + }, + "node_modules/@wasm-audio-decoders/ogg-vorbis": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@wasm-audio-decoders/ogg-vorbis/-/ogg-vorbis-0.1.16.tgz", + "integrity": "sha512-HcEx4LPZbbzjhs9bTXgMaXLVCSMSo/egY9paJxAnE9tsYbvseAaGtVddLYktl3Qi/G+nW/ZzUXg4144izJjqCw==", + "dependencies": { + "@wasm-audio-decoders/common": "9.0.5", + "codec-parser": "2.5.0" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/eshaz" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead" + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-node/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node/node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk/node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-base": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", + "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-path": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/app-path/-/app-path-4.0.0.tgz", + "integrity": "sha512-mgBO9PZJ3MpbKbwFTljTi36ZKBvG5X/fkVR1F85ANsVcVllEb+C0LGNdJfGUm84GpC4xxgN6HFkmkMU8VEO4mA==", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-range": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-range/-/array-range-1.0.1.tgz", + "integrity": "sha512-shdaI1zT3CVNL2hnx9c0JMc0ZogGaxDs5e85akgHWKYa0yVbIyp06Ind3dVkTj/uuFrzaHBOyqFzo+VV6aXgtA==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "engines": { + "node": ">=8" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dependencies": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, + "node_modules/async-lock": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==" + }, + "node_modules/async.parallellimit": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.parallellimit/-/async.parallellimit-0.5.2.tgz", + "integrity": "sha512-4Di2nFsb3jL7aUIICvRSvtw/oynpMIx0JrwYn5hqJI661Dd+mYBi2ElOukOQgRHihU1SCTapb86Vx/Snva5M1w==", + "dependencies": { + "async.util.eachoflimit": "0.5.2", + "async.util.parallel": "0.5.2" + } + }, + "node_modules/async.util.eachoflimit": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.eachoflimit/-/async.util.eachoflimit-0.5.2.tgz", + "integrity": "sha512-oZksH0sBW0AEOJKgBCQ79io9DZruoRBLTAea/Ik36pejR7pDpByvtXeuJsoZdPwSVslsrQcsUfucbUaiXYBnAQ==", + "dependencies": { + "async.util.keyiterator": "0.5.2", + "async.util.noop": "0.5.2", + "async.util.once": "0.5.2", + "async.util.onlyonce": "0.5.2" + } + }, + "node_modules/async.util.isarray": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.isarray/-/async.util.isarray-0.5.2.tgz", + "integrity": "sha512-wbUzlrwON8RUgi+v/rhF0U99Ce8Osjcn+JP/mFNg6ymvShcobAOvE6cvLajSY5dPqKCOE1xfdhefgBif11zZgw==" + }, + "node_modules/async.util.isarraylike": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.isarraylike/-/async.util.isarraylike-0.5.2.tgz", + "integrity": "sha512-DbFpsz3ZFNkohAW8IpGTlm8gotU32zpqe3Y2XkEA/G3XNO6rmUTKPpo7XgXUruoI+AsGi8+0zWpJHe7t1sLiAg==", + "dependencies": { + "async.util.isarray": "0.5.2" + } + }, + "node_modules/async.util.keyiterator": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.keyiterator/-/async.util.keyiterator-0.5.2.tgz", + "integrity": "sha512-cktrETawCwgu13y3KZs2uMGFnNHc+IjKPZsavtRaoCjLELkePb2co4zrr+ghPvEqLXZIJPTKqC2HFZgJTssMVw==", + "dependencies": { + "async.util.isarraylike": "0.5.2", + "async.util.keys": "0.5.2" + } + }, + "node_modules/async.util.keys": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.keys/-/async.util.keys-0.5.2.tgz", + "integrity": "sha512-umCOCRCRYwIC2Ho3fbuhKwIIe7OhQsVoVKGoF5GoQiGJUmjP4TG0Bmmcdpm7yW/znoIGKpnjKzVQz0niH4tfqw==" + }, + "node_modules/async.util.noop": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.noop/-/async.util.noop-0.5.2.tgz", + "integrity": "sha512-AdwShXwE0KoskgqVJAck8zcM32nIHj3AC8ZN62ZaR5srhrY235Nw18vOJZWxcOfhxdVM0hRVKM8kMx7lcl7cCQ==" + }, + "node_modules/async.util.once": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.once/-/async.util.once-0.5.2.tgz", + "integrity": "sha512-YQ5WPzDTt2jlblUDkq2I5RV/KiAJErJ4/0cEFhYPaZzqIuF/xDzdGvnEKe7UeuoMszsVPeajzcpKgkbwdb9MUA==" + }, + "node_modules/async.util.onlyonce": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.onlyonce/-/async.util.onlyonce-0.5.2.tgz", + "integrity": "sha512-UgQvkU9JZ+I0Cm1f56XyGXcII+J3d/5XWUuHpcevlItuA3WFSJcqZrsyAUck2FkRSD8BwYQX1zUTDp3SJMVESg==" + }, + "node_modules/async.util.parallel": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.parallel/-/async.util.parallel-0.5.2.tgz", + "integrity": "sha512-0bEvwmQ8fxsTYNwacw5iq0i3PvGryRkXxZ01Rvox21izdMdls9IH2rAZjfunbgI8j6nFRyIdCmMINQ9kka99ow==", + "dependencies": { + "async.util.isarraylike": "0.5.2", + "async.util.noop": "0.5.2", + "async.util.restparam": "0.5.2" + } + }, + "node_modules/async.util.restparam": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.restparam/-/async.util.restparam-0.5.2.tgz", + "integrity": "sha512-Q9Z+zgmtMxFX5i7CnBvNOkgrL5hptztCqwarQluyNudUUk4iCmyjmsQl8MuQEjNh3gGqP5ayvDaextL1VXXgIg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/audio-buffer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/audio-buffer/-/audio-buffer-5.0.0.tgz", + "integrity": "sha512-gsDyj1wwUp8u7NBB+eW6yhLb9ICf+0eBmDX8NGaAS00w8/fLqFdxUlL5Ge/U8kB64DlQhdonxYC59dXy1J7H/w==" + }, + "node_modules/audio-decode": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/audio-decode/-/audio-decode-2.2.2.tgz", + "integrity": "sha512-xyh7z6dpRT+5Ez4ggV2cEkSShkDvvIBBmVPR3kYY7uIBqRO1BGNjofip6JnjBnvezhrU3ypBGZjepyKFDZWnDw==", + "dependencies": { + "@wasm-audio-decoders/flac": "^0.2.4", + "@wasm-audio-decoders/ogg-vorbis": "^0.1.15", + "audio-buffer": "^5.0.0", + "audio-type": "^2.2.1", + "mpg123-decoder": "^1.0.0", + "node-wav": "^0.0.2", + "ogg-opus-decoder": "^1.6.12", + "qoa-format": "^1.0.1" + } + }, + "node_modules/audio-type": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/audio-type/-/audio-type-2.2.1.tgz", + "integrity": "sha512-En9AY6EG1qYqEy5L/quryzbA4akBpJrnBZNxeKTqGHC2xT9Qc4aZ8b7CcbOMFTTc/MGdoNyp+SN4zInZNKxMYA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/awesome-phonenumber": { + "version": "2.73.0", + "resolved": "https://registry.npmjs.org/awesome-phonenumber/-/awesome-phonenumber-2.73.0.tgz", + "integrity": "sha512-zirkzWFUheNnnPY1QE05PQd+5drn+5kVy76gZ3WyXnLwzXOguw6sqksyZGO1qyNnYj3Y/SDITXnS/TCk/hJXpQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==" + }, + "node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bare-events": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", + "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" + } + }, + "node_modules/bare-os": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "node_modules/bare-stream": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.4.2.tgz", + "integrity": "sha512-XZ4ln/KV4KT+PXdIWTKjsLY+quqCaEtqqtgGJVPw9AoM73By03ij64YjepK0aQvHSWDb6AfAZwqKaFu68qkrdA==", + "optional": true, + "dependencies": { + "streamx": "^2.20.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64-to-image": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-to-image/-/base64-to-image-1.0.2.tgz", + "integrity": "sha512-6tYtXV9NId5tKs304trKlzQD47rrHOIgX/V1+AR6hAKhLRdCeJlHeva0v/ONGy5VVgaPlVlTE7PhnrULELshrg==" + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bmp-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", + "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/boolstring": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/boolstring/-/boolstring-1.0.2.tgz", + "integrity": "sha512-0JLNSmZUv1m/O8sVayFm2t0naiOXwQ9O2Gq9u1eoIkhvu6U5NQER/e3k4BGpjZ33G775lWMT7TzJ7r5VtmEnbQ==" + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "optional": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bson": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", + "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/btch-downloader": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/btch-downloader/-/btch-downloader-2.8.1.tgz", + "integrity": "sha512-U9PMNmK46WNfFVrnGhrWSuceGeq6A7LzkWK0Gvgtv5thfGheSG1opJVWfSp3ys6N6NK4LYcERJYtlA+ExPAlFw==", + "dependencies": { + "axios": "^1.4.0", + "cheerio": "^1.0.0-rc.12", + "got": "^10.0.0", + "qs": "^6.10.3" + } + }, + "node_modules/btch-downloader/node_modules/@sindresorhus/is": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz", + "integrity": "sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/btch-downloader/node_modules/axios": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.8.tgz", + "integrity": "sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/btch-downloader/node_modules/cacheable-lookup": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz", + "integrity": "sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==", + "dependencies": { + "@types/keyv": "^3.1.1", + "keyv": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/btch-downloader/node_modules/decompress-response": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", + "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==", + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/btch-downloader/node_modules/got": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/got/-/got-10.7.0.tgz", + "integrity": "sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==", + "dependencies": { + "@sindresorhus/is": "^2.0.0", + "@szmarczak/http-timer": "^4.0.0", + "@types/cacheable-request": "^6.0.1", + "cacheable-lookup": "^2.0.0", + "cacheable-request": "^7.0.1", + "decompress-response": "^5.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^5.0.0", + "lowercase-keys": "^2.0.0", + "mimic-response": "^2.1.0", + "p-cancelable": "^2.0.0", + "p-event": "^4.0.0", + "responselike": "^2.0.0", + "to-readable-stream": "^2.0.0", + "type-fest": "^0.10.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/btch-downloader/node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/btch-downloader/node_modules/type-fest": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz", + "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", + "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/cache-manager": { + "version": "5.7.6", + "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-5.7.6.tgz", + "integrity": "sha512-wBxnBHjDxF1RXpHCBD6HGvKER003Ts7IIm0CHpggliHzN1RZditb7rXoduE1rplc2DEFYKxhLKgFuchXMJje9w==", + "dependencies": { + "eventemitter3": "^5.0.1", + "lodash.clonedeep": "^4.5.0", + "lru-cache": "^10.2.2", + "promise-coalesce": "^1.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/centra": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/centra/-/centra-2.7.0.tgz", + "integrity": "sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg==", + "dependencies": { + "follow-redirects": "^1.15.6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chance": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/chance/-/chance-1.1.9.tgz", + "integrity": "sha512-TfxnA/DcZXRTA4OekA2zL9GH8qscbbl6X0ZqU4tXhGveVY/mXWvEQLt5GwZcYXTEyEFflVtj+pG8nc8EwSm1RQ==" + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "engines": { + "node": "*" + } + }, + "node_modules/cheerio": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", + "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^9.1.0", + "parse5": "^7.1.2", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^6.19.5", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=18.17" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/class-validator": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.1.tgz", + "integrity": "sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==", + "dependencies": { + "@types/validator": "^13.11.8", + "libphonenumber-js": "^1.10.53", + "validator": "^13.9.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.2.0.tgz", + "integrity": "sha512-AqfwItf/UqGif3FBErI3NHX04v5ywJtGYlL5z4OqWR50u7g+Fz3Xw2qcCIbKVPrqtJCBwSOkDgnSlHbcpwDKHw==", + "dependencies": { + "ansi-regex": "^2.1.1", + "d": "1", + "es5-ext": "^0.10.12", + "es6-iterator": "2", + "memoizee": "^0.4.3", + "timers-ext": "0.1" + } + }, + "node_modules/cli-color/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/codec-parser": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/codec-parser/-/codec-parser-2.5.0.tgz", + "integrity": "sha512-Ru9t80fV8B0ZiixQl8xhMTLru+dzuis/KQld32/x5T/+3LwZb0/YvQdSKytX9JqCnRdiupvAvyYJINKrXieziQ==" + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commander": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", + "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/cross-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/cross-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/cross-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "engines": { + "node": "*" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "node_modules/curve25519-js": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/curve25519-js/-/curve25519-js-0.0.4.tgz", + "integrity": "sha512-axn2UMEnkhyDUPWOwVKBMVIzSQy2ejH2xRGy1wq81dqRwApXfIzfbE3hIX0ZRFBIihf/KDqK158DLwESu4AK1w==" + }, + "node_modules/cycled": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cycled/-/cycled-1.2.0.tgz", + "integrity": "sha512-/BOOCEohSBflVHHtY/wUc1F6YDYPqyVs/A837gDoq4H1pm72nU/yChyGt91V4ML+MbbAmHs8uo2l1yJkkTIUdg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dasu": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/dasu/-/dasu-0.4.3.tgz", + "integrity": "sha512-AFwspl5k7V8MW8H7tyIGJ0gtOauUg7JC+DgiRFUIXvPNNDFXTMtvnCkZY0macN6JLGqBjNP38WVnQN7Iv3RSlg==" + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "node_modules/decode-gif": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/decode-gif/-/decode-gif-1.0.1.tgz", + "integrity": "sha512-L0MT527mwlkil9TiN1xwnJXzUxCup55bUT91CPmQlc9zYejXJ8xp17d5EVnwM80JOIGImBUk1ptJQ+hDihyzwg==", + "dependencies": { + "array-range": "^1.0.1", + "omggif": "^1.0.10" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delay": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/delay/-/delay-4.4.1.tgz", + "integrity": "sha512-aL3AhqtfhOlT/3ai6sWXeqwnw63ATNpnUiN4HL7x9q+My5QtHlO3OIkasmug9LKzpheLdmUKGRKnYXYAS7FQkQ==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/dijkstrajs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" + }, + "node_modules/duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" + } + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ecc-jsbn/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", + "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/engine.io": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz", + "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/exif-parser": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", + "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==" + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==" + }, + "node_modules/express": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fake-useragent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fake-useragent/-/fake-useragent-1.0.1.tgz", + "integrity": "sha512-BOQh1TM//DhrVaeZ+b3w3s4E40rfYcDTn5aoSM2w1xVsZVGglNOzPR5H8KDO8NmF8sT4ppxyb4/MHGIHfZsVDA==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fast-redact": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "optional": true, + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "dependencies": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fluent-ffmpeg": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.3.tgz", + "integrity": "sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==", + "dependencies": { + "async": "^0.2.9", + "which": "^1.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/fluent-ffmpeg/node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" + }, + "node_modules/fluent-ffmpeg/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/futoin-hkdf": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.5.3.tgz", + "integrity": "sha512-SewY5KdMpaoCeh7jachEWFsh1nNlaDjNHZXWqL5IGwtpEYHTgkr2+AMCgNwKWkcc0wpSYrZfR7he4WdmHFtDxQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/gifwrap": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.4.tgz", + "integrity": "sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ==", + "dependencies": { + "image-q": "^4.0.0", + "omggif": "^1.0.10" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/google-it": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/google-it/-/google-it-1.6.4.tgz", + "integrity": "sha512-iM/31cWQ0wLcBngHSR3l6OwtkqYP93kiQWF74YqyHte/sJ5BFQ60IzCckuetu0LH4//mxYqFlH30nhNuBX/udw==", + "dependencies": { + "cheerio": "^1.0.0-rc.11", + "colors": "^1.4.0", + "command-line-args": "^5.0.0", + "ora": "^4.0.3", + "request": "^2.88.0" + }, + "bin": { + "google-it": "lib/app.js" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-encoding-sniffer/node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-cookie-agent": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/http-cookie-agent/-/http-cookie-agent-6.0.6.tgz", + "integrity": "sha512-XkwhYUWo0yhiHBWqLmAe2kIBymVY70ewi9sKmy6YBHpNU3BCH4nipKrtY5/effAxj0qneQ9ziZG5TXgaKLfYgg==", + "dependencies": { + "agent-base": "^7.1.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/3846masa" + }, + "peerDependencies": { + "tough-cookie": "^4.0.0 || ^5.0.0", + "undici": "^5.11.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "undici": { + "optional": true + } + } + }, + "node_modules/http-cookie-agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-cookie-agent/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-cookie-agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/human-readable": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/human-readable/-/human-readable-0.2.1.tgz", + "integrity": "sha512-uFtz4WZlB1M5xI45MZ5AjyAzfrrgLOdty4363Jd0LQ5NGXa+UiKaD0EQXQeDfCinodrpePFk/vKjzBlDTZdZQQ==" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/human-time": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/human-time/-/human-time-0.0.2.tgz", + "integrity": "sha512-sbYI90YhYmstslPTb70BLGjy6mdESa0lxL7uDR4fIVAx9Iobz8fLEqi7FqF4Q/6vblrzZALg//MsYJlIPBU8SA==" + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "node_modules/image-q": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/image-q/-/image-q-4.0.0.tgz", + "integrity": "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==", + "dependencies": { + "@types/node": "16.9.1" + } + }, + "node_modules/image-q/node_modules/@types/node": { + "version": "16.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", + "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==" + }, + "node_modules/image-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/install-artifact-from-github": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/install-artifact-from-github/-/install-artifact-from-github-1.3.5.tgz", + "integrity": "sha512-gZHC7f/cJgXz7MXlHFBxPVMsvIbev1OQN1uKQYKVJDydGNm9oYf9JstbU4Atnh/eSvk41WtEovoRm+8IF686xg==", + "bin": { + "install-from-cache": "bin/install-from-cache.js", + "save-to-github-cache": "bin/save-to-github-cache.js" + } + }, + "node_modules/inversify": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/inversify/-/inversify-6.0.1.tgz", + "integrity": "sha512-B3ex30927698TJENHR++8FfEaJGqoWOgI6ZY5Ht/nLUsFCwHn6akbwtnUAPCgUepAnTpe2qHxhDNjoKLyz6rgQ==" + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/iterm2-version": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/iterm2-version/-/iterm2-version-5.0.0.tgz", + "integrity": "sha512-WdLXcMYvN3SXT6vEtuW78vnZs4pVWm2nBnb4VKjOPPXmdlR1xTHmBgqKacOzAe4RXOiY/V+0u/0zsU3LoGQoBg==", + "dependencies": { + "app-path": "^4.0.0", + "plist": "^3.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/javascript-obfuscator": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/javascript-obfuscator/-/javascript-obfuscator-4.1.1.tgz", + "integrity": "sha512-gt+KZpIIrrxXHEQGD8xZrL8mTRwRY0U76/xz/YX0gZdPrSqQhT/c7dYLASlLlecT3r+FxE7je/+C0oLnTDCx4A==", + "hasInstallScript": true, + "dependencies": { + "@javascript-obfuscator/escodegen": "2.3.0", + "@javascript-obfuscator/estraverse": "5.4.0", + "acorn": "8.8.2", + "assert": "2.0.0", + "chalk": "4.1.2", + "chance": "1.1.9", + "class-validator": "0.14.1", + "commander": "10.0.0", + "eslint-scope": "7.1.1", + "eslint-visitor-keys": "3.3.0", + "fast-deep-equal": "3.1.3", + "inversify": "6.0.1", + "js-string-escape": "1.0.1", + "md5": "2.3.0", + "mkdirp": "2.1.3", + "multimatch": "5.0.0", + "opencollective-postinstall": "2.0.3", + "process": "0.11.10", + "reflect-metadata": "0.1.13", + "source-map-support": "0.5.21", + "string-template": "1.0.0", + "stringz": "2.1.0", + "tslib": "2.5.0" + }, + "bin": { + "javascript-obfuscator": "bin/javascript-obfuscator" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/javascript-obfuscator" + } + }, + "node_modules/jimp": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.13.tgz", + "integrity": "sha512-Bxz8q7V4rnCky9A0ktTNGA9SkNFVWRHodddI/DaAWZJzF7sVUlFYKQ60y9JGqrKpi48ECA/TnfMzzc5C70VByA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/custom": "^0.16.13", + "@jimp/plugins": "^0.16.13", + "@jimp/types": "^0.16.13", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==" + }, + "node_modules/js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + }, + "node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/jsonpath-plus": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-5.0.7.tgz", + "integrity": "sha512-7TS6wsiw1s2UMK/A6nA4n0aUJuirCVhJ87nWX5je5MPOl0z5VTr2qs7nMP8NZ2ed3rlt6kePTqddgVPE9F0i0w==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/kareem": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", + "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/keypress": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.2.1.tgz", + "integrity": "sha512-HjorDJFNhnM4SicvaUXac0X77NiskggxJdesG72+O5zBKpSqKFCrqmndKVqpu3pFqkla0St6uGk8Ju0sCurrmg==" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levenshtein-edit-distance": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/levenshtein-edit-distance/-/levenshtein-edit-distance-2.0.5.tgz", + "integrity": "sha512-Yuraz7QnMX/JENJU1HA6UtdsbhRzoSFnGpVGVryjQgHtl2s/YmVgmNYkVs5yzVZ9aAvQR9wPBUH3lG755ylxGA==", + "bin": { + "levenshtein-edit-distance": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libphonenumber-js": { + "version": "1.11.15", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.11.15.tgz", + "integrity": "sha512-M7+rtYi9l5RvMmHyjyoF3BHHUpXTYdJ0PezZGHNs0GyW1lO+K7jxlXpbdIb7a56h0nqLYdjIw+E+z0ciGaJP7g==" + }, + "node_modules/libsignal": { + "name": "@whiskeysockets/libsignal-node", + "version": "2.0.1", + "resolved": "git+ssh://git@github.com/WhiskeySockets/libsignal-node.git#1bd9275d9e621d2ba899087ebdf548b3a5a4f05e", + "dependencies": { + "curve25519-js": "^0.0.4", + "protobufjs": "6.8.8" + } + }, + "node_modules/libsignal/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "node_modules/libsignal/node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/libsignal/node_modules/protobufjs": { + "version": "6.8.8", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz", + "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.0", + "@types/node": "^10.1.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/link-preview-js": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/link-preview-js/-/link-preview-js-3.0.12.tgz", + "integrity": "sha512-MVfFA4Bbb+sWg/TSZPMEMgjs/WYw8Sah/ILMUy4qElu9mmtHDb1cxxm2F+SivHKtBapJQLKW4qnKh45Q+629Cg==", + "dependencies": { + "abort-controller": "^3.0.0", + "cheerio": "1.0.0-rc.11", + "cross-fetch": "3.1.5", + "url": "0.11.0" + } + }, + "node_modules/link-preview-js/node_modules/cheerio": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.11.tgz", + "integrity": "sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/link-preview-js/node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/link-preview-js/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + }, + "node_modules/link-preview-js/node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/load-bmfont": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.2.tgz", + "integrity": "sha512-qElWkmjW9Oq1F9EI5Gt7aD9zcdHb9spJCW1L/dmPf7KzCCEJxq8nhHz5eCgI9aMf7vrG/wyaCqdsI+Iy9ZTlog==", + "dependencies": { + "buffer-equal": "0.0.1", + "mime": "^1.3.4", + "parse-bmfont-ascii": "^1.0.3", + "parse-bmfont-binary": "^1.0.5", + "parse-bmfont-xml": "^1.1.4", + "phin": "^3.7.1", + "xhr": "^2.0.1", + "xtend": "^4.0.0" + } + }, + "node_modules/load-bmfont/node_modules/phin": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/phin/-/phin-3.7.1.tgz", + "integrity": "sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ==", + "dependencies": { + "centra": "^2.7.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, + "node_modules/log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/lowdb": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-2.1.0.tgz", + "integrity": "sha512-F4Go8/V37gAidTR3c5poyjprOpZSDNSLJVOmI0ny4D4q9rC37OkBhlzX0bqj7LZlT3UIj4FchmZrrSw7qY+eGQ==", + "dependencies": { + "steno": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/m3u8stream": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.8.6.tgz", + "integrity": "sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA==", + "dependencies": { + "miniget": "^4.2.2", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", + "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/memoizee": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", + "integrity": "sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==", + "dependencies": { + "d": "^1.0.2", + "es5-ext": "^0.10.64", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/miniget": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/miniget/-/miniget-4.2.3.tgz", + "integrity": "sha512-SjbDPDICJ1zT+ZvQwK0hUcRY4wxlhhNpHL9nJOB2MEAXRGagTljsO8MEDzQMTFf0Q8g4QNi8P9lEm/g7e+qgzA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.3.tgz", + "integrity": "sha512-sjAkg21peAG9HS+Dkx7hlG9Ztx7HLeKnvB3NQRcu/mltCVmvkF0pisbiTSfDVYTT86XEfZrTUosLdZLStquZUw==", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.46.tgz", + "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mongodb": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.17.2.tgz", + "integrity": "sha512-mLV7SEiov2LHleRJPMPrK2PMyhXFZt2UQLC4VD4pnth3jMjYKHhtqfwwkkvS/NXuo/Fp3vbhaNcXrIDaLRb9Tg==", + "dependencies": { + "bson": "^4.7.2", + "mongodb-connection-string-url": "^2.6.0", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=12.9.0" + }, + "optionalDependencies": { + "@aws-sdk/credential-providers": "^3.186.0", + "@mongodb-js/saslprep": "^1.1.0" + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/mongoose": { + "version": "6.13.5", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.13.5.tgz", + "integrity": "sha512-podJEaIF/5N2mQymkyyUzN2NeL/68MOyYjf3O0zsgCU2B2Omnhg6NhGHVavt9ZH/VxOrwKE9XphbuHDFK+T06g==", + "dependencies": { + "bson": "^4.7.2", + "kareem": "2.5.1", + "mongodb": "4.17.2", + "mpath": "0.9.0", + "mquery": "4.0.3", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mpg123-decoder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mpg123-decoder/-/mpg123-decoder-1.0.0.tgz", + "integrity": "sha512-WV+pyuMUhRqv7s8S6p/Ii4KQHdBD1pb3yaABxcKJRsNp+HQ/Y6z2iIBIaOZu0JMHPTOoICYt0REDZ7XfLu+n/g==", + "dependencies": { + "@wasm-audio-decoders/common": "9.0.5" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/eshaz" + } + }, + "node_modules/mquery": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", + "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mquery/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/multistream": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.1.tgz", + "integrity": "sha512-xasv76hl6nr1dEy3lPvy7Ej7K/Lx3O/FCvwge8PeVJpciPPoNCbaANcNiBug3IpdvTveZUcAV0DJzdnUDMesNQ==", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.5" + } + }, + "node_modules/music-metadata": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/music-metadata/-/music-metadata-7.14.0.tgz", + "integrity": "sha512-xrm3w7SV0Wk+OythZcSbaI8mcr/KHd0knJieu8bVpaPfMv/Agz5EooCAPz3OR5hbYMiUG6dgAPKZKnMzV+3amA==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "content-type": "^1.0.5", + "debug": "^4.3.4", + "file-type": "^16.5.4", + "media-typer": "^1.1.0", + "strtok3": "^6.3.0", + "token-types": "^4.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/music-metadata/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/music-metadata/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "node_modules/nan": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==" + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/node-abi": { + "version": "3.71.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", + "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" + }, + "node_modules/node-cache": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz", + "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==", + "dependencies": { + "clone": "2.x" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-fzf": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/node-fzf/-/node-fzf-0.5.3.tgz", + "integrity": "sha512-crN8rRfApu/GUrtKq+zJ6LueUyNAOJpFHxoT2Ru1Q+OYRa/F/H7CXvzcMrFc7D964yakYZEZ9XR3YbdSHXgyCw==", + "dependencies": { + "cli-color": "~1.2.0", + "keypress": "~0.2.1", + "minimist": "~1.2.0", + "redstar": "0.0.2", + "string-width": "~2.1.1", + "ttys": "0.0.3" + }, + "bin": { + "nfzf": "bin/cli.js" + } + }, + "node_modules/node-fzf/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/node-fzf/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/node-fzf/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/node-fzf/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/node-gtts": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-gtts/-/node-gtts-2.0.2.tgz", + "integrity": "sha512-g1EVgKgUJvbLheD3378SYQpUIca6U9F2VBzMzk5WxxSWzZb+IRGVSMoVGPwvpg4buZxE/FCL13tzzg2j1FAvbQ==", + "dependencies": { + "async": "^2.4.1", + "escape-string-regexp": "^1.0.5", + "fake-useragent": "^1.0.1", + "multistream": "^2.1.0", + "request": "^2.81.0" + }, + "bin": { + "node-gtts": "bin.js" + } + }, + "node_modules/node-gtts/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/node-gyp": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz", + "integrity": "sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/node-os-utils": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/node-os-utils/-/node-os-utils-1.3.7.tgz", + "integrity": "sha512-fvnX9tZbR7WfCG5BAy3yO/nCLyjVWD6MghEq0z5FDfN+ZXpLWNITBdbifxQkQ25ebr16G0N7eRWJisOcMEHG3Q==" + }, + "node_modules/node-wav": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/node-wav/-/node-wav-0.0.2.tgz", + "integrity": "sha512-M6Rm/bbG6De/gKGxOpeOobx/dnGuP0dz40adqx38boqHhlWssBJZgLCPBNtb9NkrmnKYiV04xELq+R6PFOnoLA==", + "engines": { + "node": ">=4.4.0" + } + }, + "node_modules/node-webpmux": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/node-webpmux/-/node-webpmux-3.2.0.tgz", + "integrity": "sha512-Rmc7MIS7zxDRPkfC9B15malsd1uStX2N6mYqHZNZeCJAVRDjmnxxTsyDh6POvWdNC7nmAYBW6CcHVY62DlnzRg==" + }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.13", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz", + "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ocr-space-api-wrapper": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/ocr-space-api-wrapper/-/ocr-space-api-wrapper-2.3.2.tgz", + "integrity": "sha512-jEeODamnR9n8puP/9pbO/hn/GAG+6Z2crPVGnv/+y1TYe0qVY/8qeqkOPO5Qm6qeFo4XRIRscWjV0X5T1S2r0w==", + "dependencies": { + "axios": "0.27.2", + "form-data": "^4.0.1" + } + }, + "node_modules/ogg-opus-decoder": { + "version": "1.6.14", + "resolved": "https://registry.npmjs.org/ogg-opus-decoder/-/ogg-opus-decoder-1.6.14.tgz", + "integrity": "sha512-RQpk9yFl/mqXFwcgf1BrEYWL92HZk++aU1fOO8mPZ1+1DUYbJdpdUQEFfbPE1xcBkRGU3p75DjEO+EDMNeikFQ==", + "dependencies": { + "@wasm-audio-decoders/common": "9.0.5", + "codec-parser": "2.5.0", + "opus-decoder": "0.7.7" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/eshaz" + } + }, + "node_modules/omggif": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", + "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==" + }, + "node_modules/on-exit-leak-free": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", + "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "bin": { + "opencollective-postinstall": "index.js" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/opus-decoder": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/opus-decoder/-/opus-decoder-0.7.7.tgz", + "integrity": "sha512-KWDyCi/9aXnNN+jrjs+aaVdwiwzDdac81S9ul0iv1CTs4+5K4VDZKuJjIImrYOBA2oSNHDjVq4xzn6BE+XbI1A==", + "dependencies": { + "@wasm-audio-decoders/common": "9.0.5" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/eshaz" + } + }, + "node_modules/ora": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.1.1.tgz", + "integrity": "sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==", + "dependencies": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/os": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", + "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "dependencies": { + "p-timeout": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parse-bmfont-ascii": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", + "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==" + }, + "node_modules/parse-bmfont-binary": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", + "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==" + }, + "node_modules/parse-bmfont-xml": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz", + "integrity": "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==", + "dependencies": { + "xml-parse-from-string": "^1.0.0", + "xml2js": "^0.5.0" + } + }, + "node_modules/parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + }, + "node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" + }, + "node_modules/peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/perf_hooks": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/perf_hooks/-/perf_hooks-0.0.1.tgz", + "integrity": "sha512-qG/D9iA4KDme+KF4vCObJy6Bouu3BlQnmJ8jPydVPm32NJBD9ZK1ZNgXSYaZKHkVC1sKSqUiLgFvAZPUiIEnBw==" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/phin": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", + "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info." + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pino": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz", + "integrity": "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.0.0", + "on-exit-leak-free": "^0.2.0", + "pino-abstract-transport": "v0.5.0", + "pino-std-serializers": "^4.0.0", + "process-warning": "^1.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.1.0", + "safe-stable-stringify": "^2.1.0", + "sonic-boom": "^2.2.1", + "thread-stream": "^0.15.1" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz", + "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==", + "dependencies": { + "duplexify": "^4.1.2", + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz", + "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==" + }, + "node_modules/pixelmatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", + "integrity": "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==", + "dependencies": { + "pngjs": "^3.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, + "node_modules/pixelmatch/node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "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" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prebuild-install/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/prebuild-install/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prebuild-install/node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "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" + } + }, + "node_modules/prebuild-install/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "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" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/process-warning": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", + "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==" + }, + "node_modules/promise-coalesce": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/promise-coalesce/-/promise-coalesce-1.1.2.tgz", + "integrity": "sha512-zLaJ9b8hnC564fnJH6NFSOGZYYdzrAJn2JUUIwzoQb32fG2QAakpDNM+CZo1km6keXkRXRM+hml1BFAPVnPkxg==", + "engines": { + "node": ">=16" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/psl": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.13.0.tgz", + "integrity": "sha512-BFwmFXiJoFqlUpZ5Qssolv15DMyc84gTBds1BjsV1BfXEo1UyyD7GsmN67n7J77uRhoSNW1AXtXKPLcBFQn9Aw==", + "dependencies": { + "punycode": "^2.3.1" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qoa-format": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/qoa-format/-/qoa-format-1.0.1.tgz", + "integrity": "sha512-dMB0Z6XQjdpz/Cw4Rf6RiBpQvUSPCfYlQMWvmuWlWkAT7nDQD29cVZ1SwDUB6DYJSitHENwbt90lqfI+7bvMcw==", + "dependencies": { + "@thi.ng/bitstream": "^2.2.12" + } + }, + "node_modules/qrcode": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", + "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", + "dependencies": { + "dijkstrajs": "^1.0.1", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/qrcode-terminal": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", + "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/qrcode/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/qrcode/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/qrcode/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/qrcode/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", + "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/re2": { + "version": "1.21.4", + "resolved": "https://registry.npmjs.org/re2/-/re2-1.21.4.tgz", + "integrity": "sha512-MVIfXWJmsP28mRsSt8HeL750ifb8H5+oF2UDIxGaiJCr8fkMqhLZ7kcX9ADRk2dC8qeGKedB7UVYRfBVpEiLfA==", + "hasInstallScript": true, + "dependencies": { + "install-artifact-from-github": "^1.3.5", + "nan": "^2.20.0", + "node-gyp": "^10.2.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readline": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==" + }, + "node_modules/real-require": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz", + "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/redstar": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/redstar/-/redstar-0.0.2.tgz", + "integrity": "sha512-VNvLaLxMJMYiAasJX5Q/GC+Os7FXL0yPWFDuTodhR7Na9wqzrXsePPWC+EtIv4t3q5DyAK00w423xi5mQN2fqg==", + "dependencies": { + "minimatch": "~3.0.4" + } + }, + "node_modules/redstar/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/render-gif": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/render-gif/-/render-gif-2.0.4.tgz", + "integrity": "sha512-l5X7EwbEvdflnvVAzjL7njizwZN8ATqJ0rdaQ5WwMJ55vyWXIXIUE9Ut7W6hm+KE+HMYn5C0a+7t0B6JjGfxQA==", + "dependencies": { + "cycled": "^1.2.0", + "decode-gif": "^1.0.1", + "delay": "^4.3.0", + "jimp": "^0.14.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/render-gif/node_modules/@jimp/bmp": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.14.0.tgz", + "integrity": "sha512-5RkX6tSS7K3K3xNEb2ygPuvyL9whjanhoaB/WmmXlJS6ub4DjTqrapu8j4qnIWmO4YYtFeTbDTXV6v9P1yMA5A==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "bmp-js": "^0.1.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/core": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.14.0.tgz", + "integrity": "sha512-S62FcKdtLtj3yWsGfJRdFXSutjvHg7aQNiFogMbwq19RP4XJWqS2nOphu7ScB8KrSlyy5nPF2hkWNhLRLyD82w==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "any-base": "^1.1.0", + "buffer": "^5.2.0", + "exif-parser": "^0.1.12", + "file-type": "^9.0.0", + "load-bmfont": "^1.3.1", + "mkdirp": "^0.5.1", + "phin": "^2.9.1", + "pixelmatch": "^4.0.2", + "tinycolor2": "^1.4.1" + } + }, + "node_modules/render-gif/node_modules/@jimp/custom": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.14.0.tgz", + "integrity": "sha512-kQJMeH87+kWJdVw8F9GQhtsageqqxrvzg7yyOw3Tx/s7v5RToe8RnKyMM+kVtBJtNAG+Xyv/z01uYQ2jiZ3GwA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/core": "^0.14.0" + } + }, + "node_modules/render-gif/node_modules/@jimp/gif": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.14.0.tgz", + "integrity": "sha512-DHjoOSfCaCz72+oGGEh8qH0zE6pUBaBxPxxmpYJjkNyDZP7RkbBkZJScIYeQ7BmJxmGN4/dZn+MxamoQlr+UYg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "gifwrap": "^0.9.2", + "omggif": "^1.0.9" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/jpeg": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.14.0.tgz", + "integrity": "sha512-561neGbr+87S/YVQYnZSTyjWTHBm9F6F1obYHiyU3wVmF+1CLbxY3FQzt4YolwyQHIBv36Bo0PY2KkkU8BEeeQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "jpeg-js": "^0.4.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-blit": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.14.0.tgz", + "integrity": "sha512-YoYOrnVHeX3InfgbJawAU601iTZMwEBZkyqcP1V/S33Qnz9uzH1Uj1NtC6fNgWzvX6I4XbCWwtr4RrGFb5CFrw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-blur": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.14.0.tgz", + "integrity": "sha512-9WhZcofLrT0hgI7t0chf7iBQZib//0gJh9WcQMUt5+Q1Bk04dWs8vTgLNj61GBqZXgHSPzE4OpCrrLDBG8zlhQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-circle": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.14.0.tgz", + "integrity": "sha512-o5L+wf6QA44tvTum5HeLyLSc5eVfIUd5ZDVi5iRfO4o6GT/zux9AxuTSkKwnjhsG8bn1dDmywAOQGAx7BjrQVA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-color": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.14.0.tgz", + "integrity": "sha512-JJz512SAILYV0M5LzBb9sbOm/XEj2fGElMiHAxb7aLI6jx+n0agxtHpfpV/AePTLm1vzzDxx6AJxXbKv355hBQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "tinycolor2": "^1.4.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-contain": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.14.0.tgz", + "integrity": "sha512-RX2q233lGyaxiMY6kAgnm9ScmEkNSof0hdlaJAVDS1OgXphGAYAeSIAwzESZN4x3ORaWvkFefeVH9O9/698Evg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-cover": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.14.0.tgz", + "integrity": "sha512-0P/5XhzWES4uMdvbi3beUgfvhn4YuQ/ny8ijs5kkYIw6K8mHcl820HahuGpwWMx56DJLHRl1hFhJwo9CeTRJtQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-crop": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.14.0.tgz", + "integrity": "sha512-Ojtih+XIe6/XSGtpWtbAXBozhCdsDMmy+THUJAGu2x7ZgKrMS0JotN+vN2YC3nwDpYkM+yOJImQeptSfZb2Sug==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-displace": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.14.0.tgz", + "integrity": "sha512-c75uQUzMgrHa8vegkgUvgRL/PRvD7paFbFJvzW0Ugs8Wl+CDMGIPYQ3j7IVaQkIS+cAxv+NJ3TIRBQyBrfVEOg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-dither": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.14.0.tgz", + "integrity": "sha512-g8SJqFLyYexXQQsoh4dc1VP87TwyOgeTElBcxSXX2LaaMZezypmxQfLTzOFzZoK8m39NuaoH21Ou1Ftsq7LzVQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-fisheye": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.14.0.tgz", + "integrity": "sha512-BFfUZ64EikCaABhCA6mR3bsltWhPpS321jpeIQfJyrILdpFsZ/OccNwCgpW1XlbldDHIoNtXTDGn3E+vCE7vDg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-flip": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.14.0.tgz", + "integrity": "sha512-WtL1hj6ryqHhApih+9qZQYA6Ye8a4HAmdTzLbYdTMrrrSUgIzFdiZsD0WeDHpgS/+QMsWwF+NFmTZmxNWqKfXw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-rotate": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-gaussian": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.14.0.tgz", + "integrity": "sha512-uaLwQ0XAQoydDlF9tlfc7iD9drYPriFe+jgYnWm8fbw5cN+eOIcnneEX9XCOOzwgLPkNCxGox6Kxjn8zY6GxtQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-invert": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.14.0.tgz", + "integrity": "sha512-UaQW9X9vx8orQXYSjT5VcITkJPwDaHwrBbxxPoDG+F/Zgv4oV9fP+udDD6qmkgI9taU+44Fy+zm/J/gGcMWrdg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-mask": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.14.0.tgz", + "integrity": "sha512-tdiGM69OBaKtSPfYSQeflzFhEpoRZ+BvKfDEoivyTjauynbjpRiwB1CaiS8En1INTDwzLXTT0Be9SpI3LkJoEA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-normalize": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.14.0.tgz", + "integrity": "sha512-AfY8sqlsbbdVwFGcyIPy5JH/7fnBzlmuweb+Qtx2vn29okq6+HelLjw2b+VT2btgGUmWWHGEHd86oRGSoWGyEQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-print": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.14.0.tgz", + "integrity": "sha512-MwP3sH+VS5AhhSTXk7pui+tEJFsxnTKFY3TraFJb8WFbA2Vo2qsRCZseEGwpTLhENB7p/JSsLvWoSSbpmxhFAQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "load-bmfont": "^1.4.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-resize": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.14.0.tgz", + "integrity": "sha512-qFeMOyXE/Bk6QXN0GQo89+CB2dQcXqoxUcDb2Ah8wdYlKqpi53skABkgVy5pW3EpiprDnzNDboMltdvDslNgLQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-rotate": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.14.0.tgz", + "integrity": "sha512-aGaicts44bvpTcq5Dtf93/8TZFu5pMo/61lWWnYmwJJU1RqtQlxbCLEQpMyRhKDNSfPbuP8nyGmaqXlM/82J0Q==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-scale": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.14.0.tgz", + "integrity": "sha512-ZcJk0hxY5ZKZDDwflqQNHEGRblgaR+piePZm7dPwPUOSeYEH31P0AwZ1ziceR74zd8N80M0TMft+e3Td6KGBHw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-shadow": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.14.0.tgz", + "integrity": "sha512-p2igcEr/iGrLiTu0YePNHyby0WYAXM14c5cECZIVnq/UTOOIQ7xIcWZJ1lRbAEPxVVXPN1UibhZAbr3HAb5BjQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blur": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-threshold": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.14.0.tgz", + "integrity": "sha512-N4BlDgm/FoOMV/DQM2rSpzsgqAzkP0DXkWZoqaQrlRxQBo4zizQLzhEL00T/YCCMKnddzgEhnByaocgaaa0fKw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-color": ">=0.8.0", + "@jimp/plugin-resize": ">=0.8.0" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugins": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.14.0.tgz", + "integrity": "sha512-vDO3XT/YQlFlFLq5TqNjQkISqjBHT8VMhpWhAfJVwuXIpilxz5Glu4IDLK6jp4IjPR6Yg2WO8TmRY/HI8vLrOw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/plugin-blit": "^0.14.0", + "@jimp/plugin-blur": "^0.14.0", + "@jimp/plugin-circle": "^0.14.0", + "@jimp/plugin-color": "^0.14.0", + "@jimp/plugin-contain": "^0.14.0", + "@jimp/plugin-cover": "^0.14.0", + "@jimp/plugin-crop": "^0.14.0", + "@jimp/plugin-displace": "^0.14.0", + "@jimp/plugin-dither": "^0.14.0", + "@jimp/plugin-fisheye": "^0.14.0", + "@jimp/plugin-flip": "^0.14.0", + "@jimp/plugin-gaussian": "^0.14.0", + "@jimp/plugin-invert": "^0.14.0", + "@jimp/plugin-mask": "^0.14.0", + "@jimp/plugin-normalize": "^0.14.0", + "@jimp/plugin-print": "^0.14.0", + "@jimp/plugin-resize": "^0.14.0", + "@jimp/plugin-rotate": "^0.14.0", + "@jimp/plugin-scale": "^0.14.0", + "@jimp/plugin-shadow": "^0.14.0", + "@jimp/plugin-threshold": "^0.14.0", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/png": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.14.0.tgz", + "integrity": "sha512-0RV/mEIDOrPCcNfXSPmPBqqSZYwGADNRVUTyMt47RuZh7sugbYdv/uvKmQSiqRdR0L1sfbCBMWUEa5G/8MSbdA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "pngjs": "^3.3.3" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/tiff": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.14.0.tgz", + "integrity": "sha512-zBYDTlutc7j88G/7FBCn3kmQwWr0rmm1e0FKB4C3uJ5oYfT8645lftUsvosKVUEfkdmOaMAnhrf4ekaHcb5gQw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "utif": "^2.0.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/types": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.14.0.tgz", + "integrity": "sha512-hx3cXAW1KZm+b+XCrY3LXtdWy2U+hNtq0rPyJ7NuXCjU7lZR3vIkpz1DLJ3yDdS70hTi5QDXY3Cd9kd6DtloHQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/bmp": "^0.14.0", + "@jimp/gif": "^0.14.0", + "@jimp/jpeg": "^0.14.0", + "@jimp/png": "^0.14.0", + "@jimp/tiff": "^0.14.0", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/utils": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.14.0.tgz", + "integrity": "sha512-MY5KFYUru0y74IsgM/9asDwb3ERxWxXEu3CRCZEvE7DtT86y1bR1XgtlSliMrptjz4qbivNGMQSvUBpEFJDp1A==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/render-gif/node_modules/file-type": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", + "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/render-gif/node_modules/jimp": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.14.0.tgz", + "integrity": "sha512-8BXU+J8+SPmwwyq9ELihpSV4dWPTiOKBWCEgtkbnxxAVMjXdf3yGmyaLSshBfXc8sP/JQ9OZj5R8nZzz2wPXgA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/custom": "^0.14.0", + "@jimp/plugins": "^0.14.0", + "@jimp/types": "^0.14.0", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/render-gif/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/render-gif/node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/sharp": { + "version": "0.32.6", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", + "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", + "hasInstallScript": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "node-addon-api": "^6.1.0", + "prebuild-install": "^7.1.1", + "semver": "^7.5.4", + "simple-get": "^4.0.1", + "tar-fs": "^3.0.4", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/similarity": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/similarity/-/similarity-1.2.1.tgz", + "integrity": "sha512-lMOpWVaWrTnyL+tkvDs8oGV/KAUBQ3wfbZtdiwDcC+KYGlwO8kgtiyag1B6akAjALDMwn5rN5YHHei1hr4X7nw==", + "dependencies": { + "levenshtein-edit-distance": "^2.0.0" + }, + "bin": { + "similarity": "cli.js" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/simple-yenc": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/simple-yenc/-/simple-yenc-1.0.4.tgz", + "integrity": "sha512-5gvxpSd79e9a3V4QDYUqnqxeD4HGlhCakVpb6gMnDD7lexJggSBJRBO5h52y/iJrdXRilX9UCuDaIJhSWm5OWw==", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/eshaz" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-adapter/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socks-proxy-agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/sonic-boom": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz", + "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sshpk/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/ssri": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/steno": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/steno/-/steno-1.0.0.tgz", + "integrity": "sha512-C/KgCvEa1yWnpHmaPjAXrz1yWxh6hs+HvhqqPa71euaQmNi1wr4+WFo57VQxjKKuFl2KqS7gtlrN0oxj2noQLw==" + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" + }, + "node_modules/streamx": { + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.2.tgz", + "integrity": "sha512-aDGDLU+j9tJcUdPGOaHmVF1u/hhI+CsGkT02V3OKlHDV7IukOI+nTWAGkiZEKCO35rWN1wIr4tS7YFr1f4qSvA==", + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/string-template": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", + "integrity": "sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg==" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringz": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/stringz/-/stringz-2.1.0.tgz", + "integrity": "sha512-KlywLT+MZ+v0IRepfMxRtnSvDCMc3nR1qqCs3m/qIbSOWkNZYT8XHQA31rS3TnKp0c5xjZu3M4GY/2aRKSi/6A==", + "dependencies": { + "char-regex": "^1.0.2" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "optional": true + }, + "node_modules/strtok3": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "node_modules/syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dependencies": { + "acorn-node": "^1.2.0" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/term-img": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/term-img/-/term-img-6.0.0.tgz", + "integrity": "sha512-R4c+XtUiN/9lMlw+wldmxjPO/xlG3sIE79tcnE3A8CtcYMTDiOgAKy/EhroI+rmjB3cVyCkYSzTPBBjPsC7YdQ==", + "dependencies": { + "ansi-escapes": "^5.0.0", + "iterm2-version": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/term-img/node_modules/ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "dependencies": { + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/term-img/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-image": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/terminal-image/-/terminal-image-2.0.0.tgz", + "integrity": "sha512-25HcdYC79g0rPxk9o7RIp3i0/ebP+viR6vj2Fsxh1a9pE6o7PfXz4HlmdYLGsQsmBeQNK88BA2UJo4IzBRfzaA==", + "dependencies": { + "chalk": "^4.1.1", + "jimp": "^0.16.1", + "log-update": "^4.0.0", + "render-gif": "^2.0.4", + "term-img": "^6.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/text-decoder": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.1.tgz", + "integrity": "sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==" + }, + "node_modules/thread-stream": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz", + "integrity": "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==", + "dependencies": { + "real-require": "^0.1.0" + } + }, + "node_modules/tiktokdl": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/tiktokdl/-/tiktokdl-0.0.5.tgz", + "integrity": "sha512-LZ7W05whzNR3pEfMMJGSM5OZTX55ql/4KlU4EkpXyzlVEa+FUyNyw91Hme++qgY5kOog8bU9czQwD/0PWL5iDg==", + "dependencies": { + "axios": "^1.4.0", + "cheerio": "^1.0.0-rc.12" + } + }, + "node_modules/tiktokdl/node_modules/axios": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.8.tgz", + "integrity": "sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/timers-ext": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz", + "integrity": "sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==", + "dependencies": { + "es5-ext": "^0.10.64", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/timm": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", + "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==" + }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" + }, + "node_modules/tlds": { + "version": "1.255.0", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.255.0.tgz", + "integrity": "sha512-tcwMRIioTcF/FcxLev8MJWxCp+GUALRhFEqbDoZrnowmKSGqPrl5pqS+Sut2m8BgJ6S4FExCSSpGffZ0Tks6Aw==", + "bin": { + "tlds": "bin.js" + } + }, + "node_modules/to-readable-stream": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", + "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/token-types": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "node_modules/ttys": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/ttys/-/ttys-0.0.3.tgz", + "integrity": "sha512-UCqXRZS2S7U4aVB7Salj3ChPRSsb57ogJpJ1eMCvyowxFOBGsaHKcRU8bovcDwajX1mRbv0IpUnYkoG7Ieo5Zg==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "node_modules/undici": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.0.tgz", + "integrity": "sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-5.0.0.tgz", + "integrity": "sha512-O08GjTiAFNsSlrUWfqF1jH0H1W3m35ZyadHrGv5krdnmPPoxP27oDTqux/579PtaroiSGm5yma6KT1mHFH6Y/g==", + "dependencies": { + "ip-regex": "^4.1.0", + "tlds": "^1.203.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/url-regex-safe": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/url-regex-safe/-/url-regex-safe-2.1.0.tgz", + "integrity": "sha512-nfrmOb62+kN4JJRkY/w9QzZeuc63/ddIFfqS9ntok0UYsJW3C5J/jGvYZecwk8V68og2zWA7fcVn4GUXIi5qbg==", + "deprecated": "Please upgrade to url-regex-safe@v3.0.0+ AND install re2 as an additional dependency in your project via `npm install re2` or `yarn add re2`.", + "dependencies": { + "ip-regex": "^4.3.0", + "re2": "^1.16.0", + "tlds": "^1.217.0" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/utif": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", + "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", + "dependencies": { + "pako": "^1.0.5" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validator": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/wa-sticker-formatter": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/wa-sticker-formatter/-/wa-sticker-formatter-4.4.4.tgz", + "integrity": "sha512-tl2tXlu7HEs630+1LcJsdavNGEysyQV7EIe/tFsPJCEd2jteG0nGouWNUglUEjW+bDCZGXw9VpJgUtwVGIKr8w==", + "dependencies": { + "axios": "^0.21.1", + "file-type": "^16.5.3", + "fluent-ffmpeg": "^2.1.2", + "fs-extra": "^10.0.0", + "image-size": "^1.0.0", + "node-webpmux": "^3.1.0", + "sharp": "^0.30.0" + } + }, + "node_modules/wa-sticker-formatter/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/wa-sticker-formatter/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/wa-sticker-formatter/node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, + "node_modules/wa-sticker-formatter/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/wa-sticker-formatter/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/wa-sticker-formatter/node_modules/sharp": { + "version": "0.30.7", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.30.7.tgz", + "integrity": "sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==", + "hasInstallScript": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.1", + "node-addon-api": "^5.0.0", + "prebuild-install": "^7.1.1", + "semver": "^7.3.7", + "simple-get": "^4.0.1", + "tar-fs": "^2.1.1", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=12.13.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/wa-sticker-formatter/node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "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" + } + }, + "node_modules/wa-sticker-formatter/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "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" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" + }, + "node_modules/which-typed-array": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.16.tgz", + "integrity": "sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "dependencies": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/xml-parse-from-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", + "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==" + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yt-search": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/yt-search/-/yt-search-2.12.1.tgz", + "integrity": "sha512-suEbEGqIDa7OBuZQSNabPKS4sZrHrocak7JhxSw3gagCUxPgHqyEDqyWEruvLYax2uCIQ7UhQoDVqQGOFn+jrQ==", + "dependencies": { + "async.parallellimit": "~0.5.2", + "boolstring": "~1.0.2", + "cheerio": "^1.0.0-rc.10", + "dasu": "~0.4.3", + "human-time": "0.0.2", + "jsonpath-plus": "~5.0.2", + "minimist": "~1.2.5", + "node-fzf": "~0.5.1" + }, + "bin": { + "yt-search": "bin/cli.js", + "yt-search-audio": "bin/mpv_audio.sh", + "yt-search-video": "bin/mpv_video.sh" + } + }, + "node_modules/ytdl-core": { + "name": "@distube/ytdl-core", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@distube/ytdl-core/-/ytdl-core-4.15.1.tgz", + "integrity": "sha512-10voV+ixUVQgam4/GMhjNTX/ipk9odkPnPoRaUESs5E/EW0JujwPDc815z53D86mSRlVc8esH1eiuzFnxLJKcA==", + "dependencies": { + "http-cookie-agent": "^6.0.6", + "m3u8stream": "^0.8.6", + "miniget": "^4.2.3", + "sax": "^1.4.1", + "tough-cookie": "^4.1.4", + "undici": "five" + }, + "engines": { + "node": ">=14.0" + }, + "funding": { + "url": "https://github.com/distubejs/ytdl-core?sponsor" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000000000000000000000000000000000000..05877e9408a150836a3764171242beca198c3dad --- /dev/null +++ b/package.json @@ -0,0 +1,93 @@ +{ + "name": "rtxzy", + "version": "8.0.0", + "description": "Lightweight WhatsApp Bot", + "depecrated": false, + "main": "index.js", + "directories": { + "lib": "lib", + "src": "src", + "plugins": "plugins" + }, + "scripts": { + "start": "node index.js --autocleartmp --autoread", + "test": "node test.js", + "test2": "nodemon index.js --server --autocleartmp --autoread" + }, + "keywords": [ + "whatsapp-bot-md", + "whatsapp-bot", + "whatsapp", + "js-whatsapp", + "whatsapp", + "Games-wabot", + "wabot-aq", + "whiskeysockets", + "botcahx", + "baileys" + ], + "homepage": "https://github.com/BOTCAHX/RTXZY-MD", + "author": { + "name": "BOTCAHX" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/BOTCAHX/RTXZY-MD.git" + }, + "bugs": { + "url": "https://github.com/BOTCAHX/RTXZY-MD/issues" + }, + "license": "MIT", + "dependencies": { + "@adiwajshing/baileys": "npm:@whiskeysockets/baileys@6.7.8", + "@adiwajshing/keyed-db": "^0.2.4", + "@bochilteam/scraper": "^3.0.0", + "@vitalets/google-translate-api": "^9.0.0", + "async": "^3.2.4", + "awesome-phonenumber": "^2.64.0", + "axios": "^0.27.2", + "base64-to-image": "^1.0.2", + "btch-downloader": "^2.8.0", + "chalk": "^4.1.2", + "cheerio": "^1.0.0-rc.12", + "colors": "1.4.0", + "didyoumean": "^1.2.2", + "express": "^4.18.2", + "file-type": "^16.5.3", + "form-data": "^4.0.0", + "google-it": "^1.6.3", + "human-readable": "^0.2.1", + "javascript-obfuscator": "^4.0.2", + "jsdom": "^20.0.0", + "link-preview-js": "^3.0.4", + "lodash": "^4.17.21", + "lowdb": "^2.1.0", + "moment-timezone": "^0.5.37", + "mongoose": "^6.0.14", + "node-fetch": "^2.7.0", + "node-gtts": "2.0.2", + "node-os-utils": "^1.3.7", + "node-webpmux": "^3.1.3", + "nodemon": "^2.0.20", + "ocr-space-api-wrapper": "^2.2.0", + "os": "^0.1.2", + "perf_hooks": "^0.0.1", + "qrcode": "^1.5.0", + "qrcode-terminal": "^0.12.0", + "readline": "^1.3.0", + "sharp": "^0.32.6", + "similarity": "^1.2.1", + "socket.io": "^4.5.1", + "syntax-error": "^1.4.0", + "terminal-image": "^2.0.0", + "tiktokdl": "^0.0.5", + "url": "^0.11.0", + "url-regex": "^5.0.0", + "url-regex-safe": "^2.1.0", + "util": "^0.12.4", + "wa-sticker-formatter": "^4.3.2", + "yargs": "^17.5.1", + "yt-search": "^2.10.3", + "ytdl-core": "npm:@distube/ytdl-core" + } +} diff --git a/plugins/autoai.js b/plugins/autoai.js new file mode 100644 index 0000000000000000000000000000000000000000..fefdd1172c154f516c81f3759c4e4e85a7103191 --- /dev/null +++ b/plugins/autoai.js @@ -0,0 +1,146 @@ +const util = require('util'); +const fetch = require('node-fetch'); // Pastikan Anda telah menginstal node-fetch +const yts = require('yt-search'); // Pastikan Anda telah menginstal yt-search + +let handler = async (m, { conn, text }) => { + // Inisialisasi mode auto AI untuk pengguna + conn.autoAiMode = conn.autoAiMode || {}; + + if (!text) throw `*โ€ข Contoh:* .autoai *[on/off]*`; + + if (text === "on") { + conn.autoAiMode[m.sender] = { pesan: [] }; + m.reply("Hai! Auto AI telah diaktifkan! ๐ŸŽ‰โœจ"); + } else if (text === "off") { + delete conn.autoAiMode[m.sender]; + m.reply("Auto AI telah dinonaktifkan. Sampai jumpa! ๐Ÿ’”"); + } +}; + +handler.before = async (m, { conn }) => { + conn.autoAiMode = conn.autoAiMode || {}; + if (m.isBaileys && m.fromMe) return; + if (!m.text) return; // Pastikan m.text ada + if (!conn.autoAiMode[m.sender]) return; + + // Periksa apakah pesan dimulai dengan karakter khusus + if (m.text.startsWith(".") || m.text.startsWith("#") || m.text.startsWith("!") || m.text.startsWith("/") || m.text.startsWith("\\")) return; + + // Menjawab pertanyaan tentang identitas + if (m.text.toLowerCase().includes("siapa kamu") || m.text.toLowerCase().includes("siapa pembuatmu")) { + m.reply("Saya adalah OpenAI Realtime buatan Rizki Irfan. Proyek ini masih baru dan saat ini hanya mendukung AI ,terabox dan mengunduh audio musik dari YouTube. untuk pertanyaan lainya kamu bisa bertanya lewat chat instagram https://www.instagram.com/ikykunnnn untuk *donasi* cukup ketik donasi ya cara penggunan nya cukup gampang misal untuk downlowd musik cukup ketik *tolong putarkan lagu bernadaya* gitu aja nanti respon fitur lain juga sama misal *tolong download kan file dari terabox* terus link nya untuk next fitur lain nya juga sama kaya gitu"); + return; // Keluar dari fungsi setelah menjawab + } + if (m.text.toLowerCase().includes("donasi") || m.text.toLowerCase().includes("qiris")) { + m.reply("jika ingin donasi bisa ke qiris ini https://pomf2.lain.la/f/yyj4kr8f.jpg"); + return; // Keluar dari fungsi setelah menjawab + } + + if (conn.autoAiMode[m.sender] && m.text) { + let name = conn.getName(m.sender); +// Periksa apakah pengguna mengetik "terabox" + if (m.text.toLowerCase().includes("terabox")) { + try { + // Ganti dengan URL yang sesuai jika ada parameter lain yang diperlukan + const response = await fetch(`https://api.betabotz.eu.org/api/download/terabox?url=${encodeURIComponent(m.text)}&apikey=btzrizkiirfan1709`); + + if (!response.ok) throw new Error('Gagal mengambil data dari API Terabox'); + + const data = await response.json(); + if (!data.status) throw new Error('Tidak ada hasil dari API Terabox'); + + // Kirim semua file yang ditemukan + for (let result of data.result) { + let file = result.files[0]; // Ambil file pertama + let fileUrl = file.url; + + // Kirim file kepada pengguna + await conn.sendMessage(m.chat, { document: { url: fileUrl }, mimetype: 'application/octet-stream', fileName: file.filename }, { quoted: m }); + } + + } catch (err) { + console.error(err); // Catat kesalahan untuk debugging + m.reply(`Terjadi kesalahan: ${util.format(err)}`); + } + } else if (m.text.toLowerCase().includes("putarkan") || m.text.toLowerCase().includes("lagu") || m.text.toLowerCase().includes("music")) { + try { + // Ambil data dari API untuk mengunduh audio + const response = await fetch(`https://ikygantengbangetanjay-api.hf.space/yt?query=${encodeURIComponent(m.text)}`); + + if (!response.ok) throw new Error('Gagal mengambil data dari API'); + + const data = await response.json(); + if (!data.success) throw new Error('Tidak ada hasil dari API'); + + let result = data.result; + let audioUrl = result.download.audio; // Gunakan URL unduh audio yang benar + + // Periksa apakah audioUrl valid + if (!audioUrl) throw new Error('URL audio tidak ditemukan'); + + // Kirim file audio langsung kepada pengguna + await conn.sendMessage(m.chat, { audio: { url: audioUrl }, mimetype: 'audio/mpeg' }, { quoted: m }); + + // Kirim detail video kepada pengguna + let videoDetails = `๐ŸŽฅ *Judul:* ${result.title}\n*Link:* ${result.url}\n*Durasi:* ${result.timestamp}\n*Views:* ${result.views}\n*Dari:* [${result.author.name}](${result.author.url})`; + await conn.sendMessage(m.chat, { text: videoDetails }, { quoted: m }); + + } catch (err) { + console.error(err); // Catat kesalahan untuk debugging + m.reply(`Terjadi kesalahan: ${util.format(err)}`); + } + } else if (m.text.toLowerCase().includes("yt-search")) { + // Periksa apakah pengguna ingin mencari di YouTube + try { + const searchQuery = m.text.replace("yt-search", "").trim(); + const searchResults = await yts(searchQuery); + + if (searchResults.videos.length > 0) { + let video = searchResults.videos[0]; // Ambil hasil pencarian pertama + let hasil = `๐ŸŽฅ *Judul:* ${video.title}\n*Link:* ${video.url}\n*Durasi:* ${video.timestamp}\n*Views:* ${video.views}`; + await conn.sendMessage(m.chat, { text: hasil }, { quoted: m }); + } else { + m.reply("Tidak ada hasil ditemukan di YouTube."); + } + + } catch (err) { + console.error(err); // Catat kesalahan untuk debugging + m.reply(`Terjadi kesalahan saat mencari di YouTube: ${util.format(err)}`); + } + } else { + // Ambil data dari API lain jika bukan perintah lagu + try { + const response = await fetch(`https://loco.web.id/wp-content/uploads/api/v1/bingai.php?q=${encodeURIComponent(m.text)}`); + if (!response.ok) throw new Error('Gagal mengambil data dari API'); + + const data = await response.json(); + if (!data.status) throw new Error('Tidak ada hasil dari API'); + + let aiResponse = data.result.ai_response; + let searchResults = data.result.search_results; + + // Check if there are search results + if (searchResults && searchResults.length > 0) { + let firstSearchResult = searchResults[0]; // Get only the first search result + let hasil = `${aiResponse}\n\n**Hasil Pencarian Pertama:**\n[Link](${firstSearchResult.url})`; + await conn.sendMessage(m.chat, { text: hasil }, { quoted: m }); + } else { + // If no search results found + let hasil = `${aiResponse}\n\n**Tidak ada hasil pencarian yang ditemukan.**`; + await conn.sendMessage(m.chat, { text: hasil }, { quoted: m }); + } + + } catch (err) { + console.error(err); // Log errors for debugging + m.reply(`Terjadi kesalahan: ${util.format(err)}`); + } + } + } +}; + +handler.command = /^(autoai)$/i; +handler.help = ["autoai"]; +handler.tags = ["ai"]; +handler.limit = true; + +module.exports = handler; \ No newline at end of file diff --git a/plugins/info-speedtest.js b/plugins/info-speedtest.js new file mode 100644 index 0000000000000000000000000000000000000000..0e7076395eadf9cc06c54913fc6fb7c06fc70f49 --- /dev/null +++ b/plugins/info-speedtest.js @@ -0,0 +1,35 @@ +let cp = require ('child_process') +let { promisify } = require ('util') +let exec = promisify(cp.exec).bind(cp) +let handler = async (m, { conn}) => { + await conn.reply(m.chat, `Please Wait`, m) + let o + try { + o = await exec('python3 speed.py --share --secure') + } catch (e) { + o = e + } finally { + let { stdout, stderr } = o + if (stdout.trim()) + conn.relayMessage(m.chat, { +extendedTextMessage:{ + text: stdout, + contextInfo: { + externalAdReply: { + title: wm, + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: 'https://telegra.ph/file/ec8cf04e3a2890d3dce9c.jpg', + sourceUrl: '' + } + }, mentions: [m.sender] +}}, {}) + if (stderr.trim()) m.reply(stderr) + } +} +handler.help = ['speedtest'] +handler.tags = ['info'] +handler.command = /^(speedtest|ookla)$/i +handler.premium = false +module.exports = handler diff --git a/plugins/server.js b/plugins/server.js new file mode 100644 index 0000000000000000000000000000000000000000..895f7e64880ad2a95539372c78abde9664dba754 --- /dev/null +++ b/plugins/server.js @@ -0,0 +1,104 @@ +const axios = require('axios'); +const os = require('os'); + +let handler = async (m, { conn }) => { + try { + const response = await axios.get('http://ip-api.com/json/'); + const serverInfo = response.data; + + conn.chatRead(m.chat); + conn.sendMessage(m.chat, { + react: { + text: 'โณ', + key: m.key, + } + }); + + let serverMessage = `โ€ข *S E R V E R*\n\n`; + const osInfo = os.platform(); + const totalRAM = Math.floor(os.totalmem() / (1024 * 1024)); + const freeRAM = Math.floor(os.freemem() / (1024 * 1024)); + const uptime = os.uptime(); + const uptimeFormatted = formatUptime(uptime); + const processor = os.cpus()[0].model; + + serverMessage += `โ”Œ โ—ฆ OS : ${osInfo}\n`; + serverMessage += `โ”‚ โ—ฆ RAM : ${freeRAM} MB / ${totalRAM} MB\n`; + serverMessage += `โ”‚ โ—ฆ Country : ${serverInfo.country}\n`; + serverMessage += `โ”‚ โ—ฆ CountryCode : ${serverInfo.countryCode}\n`; + serverMessage += `โ”‚ โ—ฆ Region : ${serverInfo.region}\n`; + serverMessage += `โ”‚ โ—ฆ RegionName : ${serverInfo.regionName}\n`; + serverMessage += `โ”‚ โ—ฆ City : ${serverInfo.city}\n`; + serverMessage += `โ”‚ โ—ฆ Zip : ${serverInfo.zip}\n`; + serverMessage += `โ”‚ โ—ฆ Lat : ${serverInfo.lat}\n`; + serverMessage += `โ”‚ โ—ฆ Lon : ${serverInfo.lon}\n`; + serverMessage += `โ”‚ โ—ฆ Timezone : ${serverInfo.timezone}\n`; + serverMessage += `โ”‚ โ—ฆ ISP : ${serverInfo.isp}\n`; + serverMessage += `โ”‚ โ—ฆ Org : ${serverInfo.org}\n`; + serverMessage += `โ”‚ โ—ฆ AS : ${serverInfo.as}\n`; + serverMessage += `โ”‚ โ—ฆ Query : HIDDEN\n`; + serverMessage += `โ”‚ โ—ฆ Uptime : ${uptimeFormatted}\n`; + serverMessage += `โ”” โ—ฆ Processor : ${processor}`; + + // Create the fake reply with contextInfo + await conn.sendMessage(m.chat, { + text: serverMessage, + contextInfo: { + externalAdReply: { + mediaType: 1, + title: 'IKYBOT OFFICIAL', + thumbnailUrl: 'https://telegra.ph/file/e64a2612fe7dda57be962.jpg', + renderLargerThumbnail: true, + sourceUrl: '' + }, + forwardedNewsletterMessageInfo: { + newsletterJid: '120363185802524978@newsletter', + newsletterName: 'Powered By RIZKI IRFAN' + } + } + }, { quoted: { + key: { fromMe: false, participant: '0@s.whatsapp.net', remoteJid: 'status@broadcast' }, + message: { + conversation: getWIBTime() + } + }}); + } catch (e) { + console.log(e); + } +}; + +function formatUptime(uptime) { + let seconds = Math.floor(uptime % 60); + let minutes = Math.floor((uptime / 60) % 60); + let hours = Math.floor((uptime / (60 * 60)) % 24); + let days = Math.floor(uptime / (60 * 60 * 24)); + + let formattedUptime = ''; + if (days > 0) formattedUptime += `${days} days `; + if (hours > 0) formattedUptime += `${hours} hours `; + if (minutes > 0) formattedUptime += `${minutes} minutes `; + if (seconds > 0) formattedUptime += `${seconds} seconds`; + + return formattedUptime.trim(); +} + +function getWIBTime() { + const offset = 7; // WIB is UTC+7 + let date = new Date(); + let utc = date.getTime() + (date.getTimezoneOffset() * 60000); + let wibDate = new Date(utc + (3600000 * offset)); + let hours = wibDate.getHours(); + let minutes = wibDate.getMinutes(); + let seconds = wibDate.getSeconds(); + let ampm = hours >= 12 ? 'PM' : 'AM'; + hours = hours % 12; + hours = hours ? hours : 12; // the hour '0' should be '12' + let strTime = hours.toString().padStart(2, '0') + ':' + minutes.toString().padStart(2, '0') + ':' + seconds.toString().padStart(2, '0') + ampm; + return strTime; +} + +handler.command = ['server']; +handler.tags = ['info']; +handler.help = ['server']; + +module.exports = handler; \ No newline at end of file diff --git a/run.js b/run.js new file mode 100644 index 0000000000000000000000000000000000000000..f728b3c873846377185030b94b90e27534f28056 --- /dev/null +++ b/run.js @@ -0,0 +1,5 @@ +const cp = require('child_process'); +process.env.TZ = 'Asia/Jakarta'; +const bsp = cp.spawn('bash', [], { + stdio: ['inherit', 'inherit', 'inherit', 'ipc'] +}); diff --git a/server.js b/server.js new file mode 100644 index 0000000000000000000000000000000000000000..c7a623a03e7ed6c44360dbbc7df3fa2ceb284f16 --- /dev/null +++ b/server.js @@ -0,0 +1,55 @@ +const express = require('express') +const path = require('path') +const SocketIO = require('socket.io') +const qrcode = require('qrcode') +const fetch = require('node-fetch') + +function connect(conn, PORT) { + let app = global.app = express() + + // app.use(express.static(path.join(__dirname, 'views'))) + let _qr = 'invalid' + + conn.ev.on('connection.update', function appQR({ qr }) { + if (qr) _qr = qr + }) + + app.use(async (req, res) => { + res.setHeader('content-type', 'image/png') + res.end(await qrcode.toBuffer(_qr)) + }) + + let server = app.listen(7860, () => { + console.log('App listened on port 7860') + if (opts['keepalive']) keepAlive() + }) + let io = SocketIO(server) + io.on('connection', socket => { + let { unpipeEmit } = pipeEmit(conn, socket, 'conn-') + socket.on('disconnect', unpipeEmit) + }) +} + +function pipeEmit(event, event2, prefix = '') { + let old = event.emit + event.emit = function (event, ...args) { + old.emit(event, ...args) + event2.emit(prefix + event, ...args) + } + return { + unpipeEmit() { + event.emit = old + } + } +} + +function keepAlive() { + const url = `https://${process.env.REPL_SLUG}.${process.env.REPL_OWNER}.repl.co` + if (/(\/\/|\.)undefined\./.test(url)) return + setInterval(()=> { + fetch(url).catch(console.error) + }, 5 * 1000 * 60) +} + + +module.exports = connect diff --git a/sessions/app-state-sync-key-AAAAAF8k.json b/sessions/app-state-sync-key-AAAAAF8k.json new file mode 100644 index 0000000000000000000000000000000000000000..077de5ede7de67cf27c64a6890606a8b4531beaf --- /dev/null +++ b/sessions/app-state-sync-key-AAAAAF8k.json @@ -0,0 +1 @@ +{"keyData":"PAjBCv6hEfBeXL3L207MUsEn6VpCx9DH2dG/7lnADAg=","fingerprint":{"rawId":153693474,"currentIndex":1,"deviceIndexes":[0,1]},"timestamp":"1733914587921"} \ No newline at end of file diff --git a/sessions/app-state-sync-version-critical_block.json b/sessions/app-state-sync-version-critical_block.json new file mode 100644 index 0000000000000000000000000000000000000000..7130e5240414fbdd6ea2b96279a7d0639962c842 --- /dev/null +++ b/sessions/app-state-sync-version-critical_block.json @@ -0,0 +1 @@ +{"version":1,"hash":{"type":"Buffer","data":"9sssjzXAQp7EnyLO8N2DYHV3hAzFe2iH8m9eMzVXMfdosTaV46xQaLl2Kyqfeaaf+/zkvo4P6tREAsOuxvMW0XnneGQ32M++OMYl+9980GR7PK9UMy+H0Kfiy3oNsb9yPv2dlco5qIeWnySBfEeJts+MbjupJhyvZOz60+jWt+I="},"indexValueMap":{"mIzOdRP3ODItlH0O0sqUguvYtSrMDEhgFQiwtclwqqw=":{"valueMac":{"type":"Buffer","data":"vjmZiR2gqUiLZ0KXv3hxKl9phqzDDy7T+jzy+tfG3UM="}},"d98zTWd2NfPDmrpIlwdyD8RJq2CqMpQv9GG4JbEJCjs=":{"valueMac":{"type":"Buffer","data":"S6xCfMxc0oDosOo1sVby1h8Sis/QRiJ/FFk8yG4f0Ao="}}}} \ No newline at end of file diff --git a/sessions/app-state-sync-version-critical_unblock_low.json b/sessions/app-state-sync-version-critical_unblock_low.json new file mode 100644 index 0000000000000000000000000000000000000000..63b4783928df21c0d6aea8f90c74f7a0b9fc0c75 --- /dev/null +++ b/sessions/app-state-sync-version-critical_unblock_low.json @@ -0,0 +1 @@ +{"version":1,"hash":{"type":"Buffer","data":"pSXSPxcH+2kzoiZyErMv8Phgn1fz5Ou/85RnVOPJPcHgh2KGRRCsepK+c4/EawDEJqXg1KfJzkcUhB1wLtPP2ipdqB0SPTOtxBD8doP80Qas19uCLvLBlIxr23r11Qf6s0wjQ75JGJzzdcU81jXcF2yD8s0gljrkVO/D7V8CCVM="},"indexValueMap":{"AwASBluZQd4gLqsFEInLh7rMoU2JAESPxQMf25nutj0=":{"valueMac":{"type":"Buffer","data":"WKVR52E2XJhTu+L6VIGpGbj/AhdX1YRZ9nrPQ7hrl9c="}},"LXEjnEuTIzXH2W29eRf3UGBc15rEWYmiBu0ExSC7jko=":{"valueMac":{"type":"Buffer","data":"6LFuNHfYcTYLHTYoXFZqJbvlS2US3zenIbnMwQZDTuQ="}},"4PBolf4OKq8Gnb4s/02c7QNGiaZxNFxJgPbud6yD5yk=":{"valueMac":{"type":"Buffer","data":"1K2y1pM1nZTuGf7VKBj+d2MGVcxzpAztyuoKW5KMqEo="}},"SB40oUmiTCi41TSmxWK2xBqeM1yjpTPZHwpmUawongM=":{"valueMac":{"type":"Buffer","data":"WxydnpDhyHrGcenWzP9TtXogY1cmgLSTeeXE+PEwBZk="}},"3LKq56TMZk5iEHzDo0ka38F31BELaisT7z5BCV9VIrI=":{"valueMac":{"type":"Buffer","data":"hkNrfLqLg7Bku8zhsmtOMVr7vN/WY/WZ5skaNK0k7I8="}},"EVrNEUiBltPRs73lmhPsNc5EyciG+XvYyfRjjpuOKnc=":{"valueMac":{"type":"Buffer","data":"mNg6oI1JzZMYubYii3zYMuQaTzdGOSx4N9UTWcXfBbI="}},"Bol4ns9qJOrsS/VseKsv8Lm7Bqq6ZWVfnYz0lX9GzxA=":{"valueMac":{"type":"Buffer","data":"Q+gmYSImQRAP336ITHhxIfvoY3ILXh0OF4pZOo5BhHw="}},"ogUO22I5EfVm6S//8pHyHclyuQCmpPgMfDMlO9nNSZM=":{"valueMac":{"type":"Buffer","data":"C8/BK0FWvpo1N2/EKSCAdZHPOUMODMKTRvis0sGGjmY="}},"8SRnTwZ9pnTFxF5YICY7J3Upjz8wqHMmCqjnZYL8nYo=":{"valueMac":{"type":"Buffer","data":"q+4t5gZSrkjqimqseDmu8XCWoup0GXSwrFfRFZGD8RM="}},"KnOb3XDDfReXCmtw9xfhnkQsP104NWxo0TXSizJl0SM=":{"valueMac":{"type":"Buffer","data":"ZtYIFkZltmXTGpW1Y/CJvHqB5GozxH+X8bauTAvabK8="}},"2JahbHxxlhEzDmo4S6L/SLVZP1Af5srGOhYSi7drOkY=":{"valueMac":{"type":"Buffer","data":"7syB0jI58LwHfR48Z5BO+f1SmPr2+wi/UZQ855rnSFI="}},"Bp9SgTcZrRoM02HD/xNpvbf/lY1r59r3yG0hWcVNCUc=":{"valueMac":{"type":"Buffer","data":"73M8J4U++FH7lrBUo7aTl8+cy0CezDho3DfJO8cyXQM="}},"1z46ufVQVDIcXRvM7dS6bxPfsEDFKFjkTR1N2+lK40E=":{"valueMac":{"type":"Buffer","data":"cvtASTz06OYme3A5qdWVVDthtov09itIWsJBRB1qN8M="}},"Ev0cQusjslqIOmowwK2VLLxz88Hqk4dga4N3x53dmxY=":{"valueMac":{"type":"Buffer","data":"bw7cOpqMKChXOQwDpF3oWSfBuOW3MukowQwMBGROvPk="}},"7lLiYTckNJtCFTePLnMtvYKxUY0WZm3w6BuGSXIjRHY=":{"valueMac":{"type":"Buffer","data":"DY7YXVablVR2GCHNdU/HaD3K1JK//yv250oVO7FPo5A="}},"vWN+4fzqaFoSOr8+0nr6wMCuNbKw3eRi9y2W6uA6Lsc=":{"valueMac":{"type":"Buffer","data":"ZjwfOpV/5Og6yLqM933Vhd59YL9Hv+1sRUU4Pgjo5z4="}},"DgsEKo7rOS657LFmMpoK3en8Nm4jHJz9pg8WcDXMdNU=":{"valueMac":{"type":"Buffer","data":"BhwMohIBmzWtkap2fz53KUau23lkh86tg7OJN3hDIG0="}},"FF6oO1rsRXTvQItlzOCW46OyKq52ek86cbBDEN4eyws=":{"valueMac":{"type":"Buffer","data":"Agay5zWeY/biEJy2ojRAZ3+EoEB8kNVdyazg52+PNj4="}},"2ux8QJJMf2HOuzISDboc7BzvsLw/I9nIQZtT05RpZUY=":{"valueMac":{"type":"Buffer","data":"e+AGnIFHaDPPv2hv0NTCxxiGDQnHnhCG/IuB9wgh3kw="}},"sup5hKD2rgr6iiLaE6pvJx9TnbWzWlbG6e/wirxSN9M=":{"valueMac":{"type":"Buffer","data":"muHOAw7AKrjl88rQMwA6WPllkiQL8j/FQ1MJms2FxzQ="}},"CudWujw8OzCVVjov3kAwhIByVxpGj5BVzfCaJ4ehirw=":{"valueMac":{"type":"Buffer","data":"xHVdhkqm7fjUbqBA7mJyaENPfz9/Q0g+qNdrViui5No="}},"x+w+SVDmSAbKnajMOR8yEt38ulOnw74XLSEhdb1NZfE=":{"valueMac":{"type":"Buffer","data":"JEyeyYVQfGs3srk418Gg6tNKY1Z+7VlsMcwoobbuU3I="}},"P5nPAVE3D3q4o99h0jFMq/aGMb57IKSTqefsB0155F4=":{"valueMac":{"type":"Buffer","data":"JQ+aZoyCCU64QDpenNoV/lMecs45OQ+e7w+F2VTwJSE="}},"tq3ZlB75urM2n0g1SxveNxTb6iaZ/bh+vFa9TucDZW0=":{"valueMac":{"type":"Buffer","data":"RykfjRpsH1+v9BhAW3OvVkWp18WYYT4NtH87FU/LbYw="}},"CqMW4yCmto2JUXTmloh828f0ye98wJypbkxaLFP7h+I=":{"valueMac":{"type":"Buffer","data":"oTDzwFQ5ffbX9lrucS1VIYaFg880KdbFPu8WDdKp4ss="}},"v5d1KqQkYbzk704w412/zQYKKcd2Gkb7JvZKiqOTcxI=":{"valueMac":{"type":"Buffer","data":"2fy32F8p+7icoyunO2xAtPu7fFLMP+95siL33BrUMm4="}},"ZrRdTSIAuWvVFTFay232sEIeFEHCWTf82YBjp4Nzw5I=":{"valueMac":{"type":"Buffer","data":"DFoBH/2v7eA7JZA7iHi5FP8TKbgQbtXAlQbVFHLkA/M="}},"pVT3COnYDTXjrMCCru7pEbS8MOOb4CZFTT75Hd41eKY=":{"valueMac":{"type":"Buffer","data":"jc00GJyLcTfaxNiujMBpu64oO92fK8MQck+KIxrgLzc="}},"4Qx02LZEJwo9yNMnetDJ3RUIzbzhgq/YQqF4OFyefMM=":{"valueMac":{"type":"Buffer","data":"G99N+RH5uY4nsVgCdYv0ZwgvHwmxzLGYvwqwmK8kH/I="}},"kRjX0DZoekummQPr6gZRtRW/Pckm0RznFnIVWX5hjrk=":{"valueMac":{"type":"Buffer","data":"sfTH1xeKIYULmYejvzeOXhkUc3g7lpAqx076m48VIhY="}},"/fMR1W85mFbACNqaSNKGQn+kUYFEGxQb5DrF76q3KeY=":{"valueMac":{"type":"Buffer","data":"UjTdaSIR6IGU/iHBXE4VL4r9sjCicFxvIPVg96+spkY="}},"7MH25KOuJpc1Ql1FnV1t7QqYNcFC7ieqaPxgba8wqk8=":{"valueMac":{"type":"Buffer","data":"4maRpdmE/FxBmKIF/BoY5UN2NVhYi+LkdQ9whsgZlBc="}},"SmfT7enfTTsODZkm+FRczZOQLMavjitNkvJnLwBRKBI=":{"valueMac":{"type":"Buffer","data":"W35YbxHVV7rQdgdxDyryxTDiC77xUOVHz5F2h+YUbWI="}},"2xZE8JVxdzi0a5cojoWxDnGdVo5rl93U92zWb0pmjf0=":{"valueMac":{"type":"Buffer","data":"1uc2ukgeStZSN6EFGThgU2FOI0JFBozgMNdSyWkFitg="}},"71lmWZhE75+Z2kTzmRS5dj5AP9Q+2QBgJj+4nOD3VBY=":{"valueMac":{"type":"Buffer","data":"PNLMGsauGQI4+fA3/oQ7XIcUbStOmNGwBtV9EH+7CgY="}},"V0rzXQujXp5sMhmgxviiBdKHm5YQ4kwz9OUY4NYMF2A=":{"valueMac":{"type":"Buffer","data":"UkgYhqrnUlflODn5u1qpxTRrImZSNCYF546EBHWVIXs="}},"9LYcQ0LQHZ9fGsSVAaiS+psBl4Sta4mqUszpa94q9Ns=":{"valueMac":{"type":"Buffer","data":"lZ+dNxAj8lbdetZYq9MB8zVDgCTnui7jsnvNX2f4uRo="}},"vtxTBdH51LBKAY6ipP0jGuspK90z7Z7Ks3LshorrXEc=":{"valueMac":{"type":"Buffer","data":"FsC4TgBTCyw8LxEAwNv3CVdBd8V9hb5IAUt6SPvftUY="}}}} \ No newline at end of file diff --git a/sessions/app-state-sync-version-regular.json b/sessions/app-state-sync-version-regular.json new file mode 100644 index 0000000000000000000000000000000000000000..6eeab553e51c06fc566a87db6ab7bce65a60c6c5 --- /dev/null +++ b/sessions/app-state-sync-version-regular.json @@ -0,0 +1 @@ +{"version":1,"hash":{"type":"Buffer","data":"MD3oDRhmNKanrn1LnmzAahC8+P0iPlSi5/j0FLc/5na1VgdSDsIL6tzOdqIVSPjcuSRO1BoKFRErQBsqmJL13FIhZ70tKwB+h9LHr+iYgCM3SJkC80XgFruetHjOMVpG5zfkemzejiHeSi3PItME4T8JSzI0xYM4L4ad9M3gMZY="},"indexValueMap":{"UWkA6t3TyxxuQjKQkFTA7EaGOoKoR2p+IPXDXIwyZNY=":{"valueMac":{"type":"Buffer","data":"WRSEAv3khNEPwEU1rKjBMi4PYrMlcA8y66ejADsgCo4="}},"sTauEgmhw0ktJL7v4Vbx9TE7n9cfNqeO5hplbMN6XSs=":{"valueMac":{"type":"Buffer","data":"ADEk4N/MCD16VkDCIGyoCAuCEKFLRwLCgT9BU3V3C6U="}}}} \ No newline at end of file diff --git a/sessions/app-state-sync-version-regular_high.json b/sessions/app-state-sync-version-regular_high.json new file mode 100644 index 0000000000000000000000000000000000000000..263123edf1022dcbf8ec612956c23e14e3500a49 --- /dev/null +++ b/sessions/app-state-sync-version-regular_high.json @@ -0,0 +1 @@ +{"version":1,"hash":{"type":"Buffer","data":"6L3j82o6EJwBILQk1eJrSydb9v0v7EclatvXy0DV8IDxNcKXgHTTwU9ixI5+423d2zAiDso5n/Ar+RmRnydifwOFY+UnJbrVSDBlFw29S4OtS7bv8JLHQUTG7XP4qMfnCy4UiRrRVWYqOqn4MlbsRHNglfSr4zZJiNNqgyRtE/M="},"indexValueMap":{"UO9SWZSt+yKMlt8yEkiPqThYk6o9nSjgHs+ijQHPurE=":{"valueMac":{"type":"Buffer","data":"OAZIh8hEpVwrDCYZeei/O3Vpi2VN9LoZuo7c24/e/Wg="}},"AHjeCDnS8yzyoaXxJHOqlWx0Hum5uYZAw8TnL+/6aoA=":{"valueMac":{"type":"Buffer","data":"qx/pYoLQrcAJxJtMY1t/f0bOxo24nT6Y27TJsJN8b/Q="}}}} \ No newline at end of file diff --git a/sessions/app-state-sync-version-regular_low.json b/sessions/app-state-sync-version-regular_low.json new file mode 100644 index 0000000000000000000000000000000000000000..3ec9a3d8cf7d632fcdd587a7158aac37bbf93fd2 --- /dev/null +++ b/sessions/app-state-sync-version-regular_low.json @@ -0,0 +1 @@ +{"version":3,"hash":{"type":"Buffer","data":"IQ8UkZFZq0AnE4SoZ5XV8AoTOWNoCzZtNDXHTj5MMVZJx3ZD0kDkLe9Vy+qZjtZeMYirWYeN+cqe+4cYyCwcSSssIqk0pvG1izpt+7EHTS2uDfxZRKc5/VAQIoWWTAL1obm1GsK84w+ga+A9pFDIMY//6505uSARgJWIJFn/Kqw="},"indexValueMap":{"q+k1kdh22Bl9Qqa6M/xLxNifRJ2cPrAhSGHMg1D+1LM=":{"valueMac":{"type":"Buffer","data":"6x+iMBlBdzDSkYHN/YjZ1B3+XPmsYAgKm6/4eWx8MNc="}},"3wcVdQ1OU8UsKXheSLE0Y9Z6MZz9pIHLLLBW5RgI5Tw=":{"valueMac":{"type":"Buffer","data":"BObqQpaMKQ2vPNko5lP/cyDUUzXEiyHoHq3eMRkPD10="}},"bEdW0IqFTPZuHQlXwnFX6WnENWhi7u2e3ZWB5ZfGQjo=":{"valueMac":{"type":"Buffer","data":"PPfycr1BtyMnsao1x5OFSAOsAoNU0dZoHW/tHQTKdc0="}},"alh9KHTOGrSyr+gHOQQaJbQr0V9cbNKX0cvPCu5DIaY=":{"valueMac":{"type":"Buffer","data":"FOuIyaylOdQNrNpDdLbFMiGzeOLnCOM/9w6XV9rovv4="}},"dBv1GNXHnb6Vczc5YsQJ2EuqlG4mBVtT4O4VSODrHjI=":{"valueMac":{"type":"Buffer","data":"aCvNLcJ0QFOg5ns9BMMl6Zn4JiPuVMqKlGka+JI4tZg="}},"OmKWCiRs1+siZMxbyBD6FTM5DzQk/Mz8tj4xTLF68IA=":{"valueMac":{"type":"Buffer","data":"VxeP7ZmqrjO7amG6t5jaMMLcU/8PRWvpwasR5WcPWR4="}}}} \ No newline at end of file diff --git a/sessions/creds.json b/sessions/creds.json new file mode 100644 index 0000000000000000000000000000000000000000..8549f0324ca4e2558924151280ab26bef1b28e16 --- /dev/null +++ b/sessions/creds.json @@ -0,0 +1 @@ +{"noiseKey":{"private":{"type":"Buffer","data":"YKWhvBF1/uHNVpVNG7cHb+pBkwXS8TnwRobfOmTj1Vc="},"public":{"type":"Buffer","data":"ruFotjAlk7O8TCu7YQAYayysAX6hhJnS7iOHEsr+oSM="}},"pairingEphemeralKeyPair":{"private":{"type":"Buffer","data":"0LZLx/V/9T5dchuQvbljNMe5tv+LAL2ee3MQaVWgN20="},"public":{"type":"Buffer","data":"fEyB1/LnkD8WW0ib9xCcieFjlw19ZFPHFMH2esZh+n8="}},"signedIdentityKey":{"private":{"type":"Buffer","data":"uFsaOfNb6sGLwcX8iXU7VTTEhwKRMlEeMlQDMMCHqls="},"public":{"type":"Buffer","data":"O0wHovOohrvGUGR3VNlzTbzaoKv1z8F4+CHbFQvtRkI="}},"signedPreKey":{"keyPair":{"private":{"type":"Buffer","data":"wKmvt0N37v+Evz69vFZkKfnrs3Rp1J5t7hs7GMPX0nk="},"public":{"type":"Buffer","data":"aXeV6x+iynRTDFCpVKKoUaRkExtoLXhxMM7OcqRV71M="}},"signature":{"type":"Buffer","data":"vEL/ty70r4gSRN2gKq/SP3YF6yz5kAdORpBWCuMaxh09+Npbovq9R9TBIIFPeIP/4nydaoc10i4V4XSEyTK5Dw=="},"keyId":1},"registrationId":159,"advSecretKey":"JbK1ihP64X6B/j2CdxxBfqfjLECP+8fFP8fyUNfiFRw=","processedHistoryMessages":[{"key":{"remoteJid":"6287821561429@s.whatsapp.net","fromMe":true,"id":"9790826FEC91B173A5F044D56286BD7E"},"messageTimestamp":1733914626},{"key":{"remoteJid":"6287821561429@s.whatsapp.net","fromMe":true,"id":"30BEAA49EE29C6C60F33C352DE88A0CF"},"messageTimestamp":1733914640},{"key":{"remoteJid":"6287821561429@s.whatsapp.net","fromMe":true,"id":"9790826FEC91B173A5F044D56286BD7E"},"messageTimestamp":1733914640}],"nextPreKeyId":31,"firstUnuploadedPreKeyId":31,"accountSyncCounter":1,"accountSettings":{"unarchiveChats":false},"deviceId":"-cwfUr8wTR-UVdYhTgIAtg","phoneId":"49b28762-bdca-4d09-a5d3-a1475637580e","identityId":{"type":"Buffer","data":"5gAcH4c0b5hMzMYdSjANFc3eOXs="},"registered":true,"backupToken":{"type":"Buffer","data":"cpQnD1XP5LOZsd5qQXLx1VMElHI="},"registration":{},"pairingCode":"T6PXXCER","routingInfo":{"type":"Buffer","data":"CAgIBQ=="},"me":{"id":"6287821561429:1@s.whatsapp.net","name":"Hehdhej","jid":"6287821561429@s.whatsapp.net","lid":"276965797937291:1@lid"},"account":{"details":"CKLapEkQ2N/lugYYASAAKAA=","accountSignatureKey":"xs0elkZ/lv4qlvL89xtyKXQnXtfToDQNp3CMVNRVbEg=","accountSignature":"o6PULOG9fmA8SkX0+JS6guVHkUkWc4bEWp68RCajrayM2IEVnCinAJNg/taXYWVsZm7sZZ8kCqnTfG+OY2fBCA==","deviceSignature":"uUs+zm20e6oJZKT3eY9vOF9MoWmsFFdoU790vXh80GjMYYLpP3ufv7etC76dre+hYOfLjHBsXjw2o6kCFr7tCw=="},"signalIdentities":[{"identifier":{"name":"6287821561429:1@s.whatsapp.net","deviceId":0},"identifierKey":{"type":"Buffer","data":"BcbNHpZGf5b+Kpby/Pcbcil0J17X06A0DadwjFTUVWxI"}}],"platform":"android","lastAccountSyncTimestamp":1733916891,"myAppStateKeyId":"AAAAAF8k"} \ No newline at end of file diff --git a/sessions/pre-key-1.json b/sessions/pre-key-1.json new file mode 100644 index 0000000000000000000000000000000000000000..b52e4edb15667c64716311bc5637f045c112f60b --- /dev/null +++ b/sessions/pre-key-1.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"6KDK1coqLRuV3tWx0NmfuDFb3Sd6XQ2WDZqGug9H4UY="},"public":{"type":"Buffer","data":"ML2KcOGwPvUWW4dlO/pvPXfsxyWZG9PW8KWcfshvlwA="}} \ No newline at end of file diff --git a/sessions/pre-key-10.json b/sessions/pre-key-10.json new file mode 100644 index 0000000000000000000000000000000000000000..14b9e39f8664c3a928d900a9509af3f536e0a7fa --- /dev/null +++ b/sessions/pre-key-10.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"gGPMjavDxof+/rSmhxCyXAvz8TliMF/joLugfFwTNEM="},"public":{"type":"Buffer","data":"qiKJS1TeOYWFjJSL9U341KEbaTcgMu5EKc/1lc4gkGI="}} \ No newline at end of file diff --git a/sessions/pre-key-11.json b/sessions/pre-key-11.json new file mode 100644 index 0000000000000000000000000000000000000000..09762bded9a05aa278beaa6fb65fb3d033fd5c39 --- /dev/null +++ b/sessions/pre-key-11.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"oBcYYKvug4apwjP29MUfz6zEb5DTfr1OxMeUCFaIQm8="},"public":{"type":"Buffer","data":"pmvyoRdIFFcI9LhyncaGyn2F47400SYiRAI8QsI0yG4="}} \ No newline at end of file diff --git a/sessions/pre-key-12.json b/sessions/pre-key-12.json new file mode 100644 index 0000000000000000000000000000000000000000..70d6637e18e537908ab9841786a65b244ea3e1b8 --- /dev/null +++ b/sessions/pre-key-12.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"sC9hdYsZbdR0vIiKUt5T5qU/kbXItxs6QbqfuRbl92o="},"public":{"type":"Buffer","data":"RdBf3I4nB4Ds4JSl/n6AxvZaJF8sDGY+UZwWfaamUR8="}} \ No newline at end of file diff --git a/sessions/pre-key-13.json b/sessions/pre-key-13.json new file mode 100644 index 0000000000000000000000000000000000000000..46f7fdeafdc484756bbc208cde441544cea80b41 --- /dev/null +++ b/sessions/pre-key-13.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"2EDinsNKk0J9nPlujtrxPouHdx/lkQO3GDRU98NeaU4="},"public":{"type":"Buffer","data":"bgtXlviAX/8I37/Zrl3LDS7mK0BvrBjz8XJA3j0/Lj8="}} \ No newline at end of file diff --git a/sessions/pre-key-14.json b/sessions/pre-key-14.json new file mode 100644 index 0000000000000000000000000000000000000000..f209c49c17851d94e6055d1b1fc2b5611601f2e6 --- /dev/null +++ b/sessions/pre-key-14.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"+Ll5J1TL9DUUt2aiwFN8hMLZiWLAcDAFxSVz9Dt9d0c="},"public":{"type":"Buffer","data":"a9s/qvQmTE91dOcbF9lgLGDWjWu4onbBfCQ+o0/Hs04="}} \ No newline at end of file diff --git a/sessions/pre-key-15.json b/sessions/pre-key-15.json new file mode 100644 index 0000000000000000000000000000000000000000..b7fa873c5d243cd5139bef4a8eeafd8205d4f53c --- /dev/null +++ b/sessions/pre-key-15.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"cLu1G9ZBEjKTE0Cp0n3cWTC4YIkVub+ndr6U13oTVXE="},"public":{"type":"Buffer","data":"7/4Zctx3Z+PkBhsfBs0mnfYcoIb7znxYAqZ6iV++sUQ="}} \ No newline at end of file diff --git a/sessions/pre-key-16.json b/sessions/pre-key-16.json new file mode 100644 index 0000000000000000000000000000000000000000..d35625ddbe672c67e97056a49ed915c8b5ecd3fb --- /dev/null +++ b/sessions/pre-key-16.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"eOGzbRApOL212/qYmY2EhpUv4+fLZdpvpTR+ILZROmw="},"public":{"type":"Buffer","data":"MQo94fednt3dizH2USn5u5NCId2lUb/GrSzAaLM/sBo="}} \ No newline at end of file diff --git a/sessions/pre-key-17.json b/sessions/pre-key-17.json new file mode 100644 index 0000000000000000000000000000000000000000..469b291ee2e2d32f787507efd8ccc599fbcdb723 --- /dev/null +++ b/sessions/pre-key-17.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"mJ4ysrviePrwiNy+q4FRFUGZXsnE9hrFkLLjFE1U8U8="},"public":{"type":"Buffer","data":"uXMCiUAOcNG7ECxE8XscGqs39RvbKfaQ3onwwL++jng="}} \ No newline at end of file diff --git a/sessions/pre-key-18.json b/sessions/pre-key-18.json new file mode 100644 index 0000000000000000000000000000000000000000..857f792538201b04e482de7d17760189cf7a83f4 --- /dev/null +++ b/sessions/pre-key-18.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"qOhtJxTiQ5PWSZoT1ApTuU9+oA3FBnFVthp7DHSgLFo="},"public":{"type":"Buffer","data":"/R/SyZTH8Nex1aQf8gndcmTT2cPdpboB1fP3AKIRPlg="}} \ No newline at end of file diff --git a/sessions/pre-key-2.json b/sessions/pre-key-2.json new file mode 100644 index 0000000000000000000000000000000000000000..0f4d451901cafff10e007f14b3da97ae03e3584a --- /dev/null +++ b/sessions/pre-key-2.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"iCThd8l50/hWYxrRnzialB+/lQ51VLrGhM7JMpfs2kw="},"public":{"type":"Buffer","data":"73ALRLe0d+VGWqOWyoZMm4fBWKt0NSKlPGFK5eH5nk4="}} \ No newline at end of file diff --git a/sessions/pre-key-20.json b/sessions/pre-key-20.json new file mode 100644 index 0000000000000000000000000000000000000000..e9909b452a47ec7492d91a5dc9080202d5825b5e --- /dev/null +++ b/sessions/pre-key-20.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"EOZoQX2/x7RIqT61thP2R01AZeq5OE4L+2VSRgXZAEE="},"public":{"type":"Buffer","data":"hw6oDFLfk+XFEvBfbsPajJ1OCESZ/Qo+oppY+YgxpG4="}} \ No newline at end of file diff --git a/sessions/pre-key-21.json b/sessions/pre-key-21.json new file mode 100644 index 0000000000000000000000000000000000000000..7adb3c000854a0ddeca9343075f1f9630c4fc93f --- /dev/null +++ b/sessions/pre-key-21.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"qP3YFAmRaPgqlBgjHXDcCvFK9DGJ8NSK+ZHoWFqPUlQ="},"public":{"type":"Buffer","data":"wnKVAnIrdyD5wLMVSAzYObPIeU9wOTVDevY+dKlYcVE="}} \ No newline at end of file diff --git a/sessions/pre-key-22.json b/sessions/pre-key-22.json new file mode 100644 index 0000000000000000000000000000000000000000..68656c4f6ddc1fd32d97adb8b790f0f34ee0337c --- /dev/null +++ b/sessions/pre-key-22.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"iNrtKOH5tCctDOZhuhJBI6LYuitGTSETjoEAsPUN+Vk="},"public":{"type":"Buffer","data":"JpNiVR/jmwvLbrV7AwSUhgWYq8ZNRl5KICHoNoidYVY="}} \ No newline at end of file diff --git a/sessions/pre-key-23.json b/sessions/pre-key-23.json new file mode 100644 index 0000000000000000000000000000000000000000..2fdd36072afb6ed1ea7bfe9ecc3d987b773e663c --- /dev/null +++ b/sessions/pre-key-23.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"yCQ/iGiNUci4oG9TKtIYEoYMhAu3xMD7eCGaTBcyrG8="},"public":{"type":"Buffer","data":"ZWvYmnKqOJl+bwz2QV4NaM0X49NGG5Z3oNRnJy1Cjws="}} \ No newline at end of file diff --git a/sessions/pre-key-24.json b/sessions/pre-key-24.json new file mode 100644 index 0000000000000000000000000000000000000000..0e11925c0f6ed478f4f9dffe97aeca4193c49772 --- /dev/null +++ b/sessions/pre-key-24.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"CGv79xWM7n/0r3bwG8UeQRgjz5/gWiie752Pu0dCXns="},"public":{"type":"Buffer","data":"ah18jdHSoDYwXfMusiTCxggobCNbbxfyyijoqx5/nBU="}} \ No newline at end of file diff --git a/sessions/pre-key-25.json b/sessions/pre-key-25.json new file mode 100644 index 0000000000000000000000000000000000000000..4c2b6651507ce9296217e9dddd2d18bb3d8a2be5 --- /dev/null +++ b/sessions/pre-key-25.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"UHm1kEYINbzSVn/6GERFl6LH+Zy2TD9KB+m2miIralE="},"public":{"type":"Buffer","data":"QEDP6T3JSyoC8f5ICF1wJ+QVMDlf1MKys2XA0pxHWQE="}} \ No newline at end of file diff --git a/sessions/pre-key-26.json b/sessions/pre-key-26.json new file mode 100644 index 0000000000000000000000000000000000000000..6dd5027b34acc8456e520725472f49cd97b0db98 --- /dev/null +++ b/sessions/pre-key-26.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"QMAel1F5f5ghpex4VIav3Ljd9ieGEFipRJ4z8R4iPlE="},"public":{"type":"Buffer","data":"QAU/eiSI2MWOiFU/HxgYSILF7bLqzQOgPhGP2tDkH3U="}} \ No newline at end of file diff --git a/sessions/pre-key-27.json b/sessions/pre-key-27.json new file mode 100644 index 0000000000000000000000000000000000000000..0d0cc1d0cd3d2ca9f1812c0c1bcff514ec15b693 --- /dev/null +++ b/sessions/pre-key-27.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"YKvjpfqslC+BAMPS9hZ6xQsghghc1yl5S06ehC0F6mA="},"public":{"type":"Buffer","data":"h2Sj09saCm27hFLHqkHYDO7xHVHWKot2GGeIFSRjgDQ="}} \ No newline at end of file diff --git a/sessions/pre-key-28.json b/sessions/pre-key-28.json new file mode 100644 index 0000000000000000000000000000000000000000..5ca010a3782da3307df7818f4dd8268d89600510 --- /dev/null +++ b/sessions/pre-key-28.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"KC/ieUeD4FeuiAQhdQzf9OgIQgXiHq4zmJFxE/b8ZkI="},"public":{"type":"Buffer","data":"RQ511gvm2NNkopzMVVGxPiXclxTzx1OmpigMIDaPZjg="}} \ No newline at end of file diff --git a/sessions/pre-key-29.json b/sessions/pre-key-29.json new file mode 100644 index 0000000000000000000000000000000000000000..c1b476e04baa472ceb473630eda5971794621036 --- /dev/null +++ b/sessions/pre-key-29.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"wAWHQfAaBYWvTPdvOlG0JO81oMuEs15Ug51/AQviIEI="},"public":{"type":"Buffer","data":"xuqAdpKO30AFA4RIcY8Bcb3kOteEPRYbA1i3Du7Fmxk="}} \ No newline at end of file diff --git a/sessions/pre-key-3.json b/sessions/pre-key-3.json new file mode 100644 index 0000000000000000000000000000000000000000..2e11d24f515f6f4ac694e3d9a125b901b7ac87b4 --- /dev/null +++ b/sessions/pre-key-3.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"iFMale2CjhScYuaSYjnPwg2t4Dw7lNmjuy0HZWC3XHM="},"public":{"type":"Buffer","data":"23xPDCM5i1SG8LNVxbv6b2LM16U5AeoLdoV1eR7ilC8="}} \ No newline at end of file diff --git a/sessions/pre-key-30.json b/sessions/pre-key-30.json new file mode 100644 index 0000000000000000000000000000000000000000..bd0216354f3a7b8527df3261a4f97db4dd4f5f79 --- /dev/null +++ b/sessions/pre-key-30.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"0I50Wst79no1FHT8Kx+Yu0ilm0srPF6fqWHp3dmS6GI="},"public":{"type":"Buffer","data":"iUv1O500vjTTcq4fOmJpDS6ECqkCE372lKrCU+p6shQ="}} \ No newline at end of file diff --git a/sessions/pre-key-4.json b/sessions/pre-key-4.json new file mode 100644 index 0000000000000000000000000000000000000000..27e7ae9b438168c77fcc7efc077b74bf4490cc10 --- /dev/null +++ b/sessions/pre-key-4.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"0PRfnGJZJx8IhBqGiDClChfzw0RAqQ8+Fg3cUtpq1mU="},"public":{"type":"Buffer","data":"8agbYsgimBPyll8h6+7FP/rEe+/bMB/+jDYXqvsrtjg="}} \ No newline at end of file diff --git a/sessions/pre-key-5.json b/sessions/pre-key-5.json new file mode 100644 index 0000000000000000000000000000000000000000..54928f0f37bfa3615676116d9818f7155a6a0440 --- /dev/null +++ b/sessions/pre-key-5.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"yFxdG7PC3vpoAYVIWyX+Rkswmne7AFXjRA5Da0zr4Xg="},"public":{"type":"Buffer","data":"PByxNXqniOAhWKVfzAccULPvwChEewMIjUkxTXWtXFA="}} \ No newline at end of file diff --git a/sessions/pre-key-6.json b/sessions/pre-key-6.json new file mode 100644 index 0000000000000000000000000000000000000000..4ddc9512e4f65692fe2a66f1be0f58c6c673fa04 --- /dev/null +++ b/sessions/pre-key-6.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"YPwoBVqUQADH/Grvb6pF8Tiq+WcQK0F0YF19eQcgFms="},"public":{"type":"Buffer","data":"jV8yTUPWY5HjRI9MnaiiIa6ZkXe9fHYxsN2FRDbLWjA="}} \ No newline at end of file diff --git a/sessions/pre-key-7.json b/sessions/pre-key-7.json new file mode 100644 index 0000000000000000000000000000000000000000..fe7058638d8368464fc15ef073cc0fe1414dbfea --- /dev/null +++ b/sessions/pre-key-7.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"CJ9Yl4dsro0Y5YJxIv1qUEOr1wv8IRQRbiI2YrjIzGM="},"public":{"type":"Buffer","data":"LfBynDCWHA2u69968Ko8SYq4DlHlEooO0JH/3iP2sys="}} \ No newline at end of file diff --git a/sessions/pre-key-9.json b/sessions/pre-key-9.json new file mode 100644 index 0000000000000000000000000000000000000000..e1376c132325e4d2dc558f36cbf00573ee69d23c --- /dev/null +++ b/sessions/pre-key-9.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"qI+p2wIoDFSLhjkQWcYpV/b8DEUe1Dl+cfK477bEjXA="},"public":{"type":"Buffer","data":"l3JwjMmvy0iiwutMECMsJ2AOTXh1nH+gVJlIddq3i3g="}} \ No newline at end of file diff --git a/sessions/session-6285878836361.0.json b/sessions/session-6285878836361.0.json new file mode 100644 index 0000000000000000000000000000000000000000..d8cb537ed8aa31f6d5263d8bc9f7ec80bf7ea22f --- /dev/null +++ b/sessions/session-6285878836361.0.json @@ -0,0 +1 @@ +{"_sessions":{"BWWdyGZEhYMqBbP/RWgOeVzlpWitldtAn0vWFPeAeEY+":{"registrationId":288609832,"currentRatchet":{"ephemeralKeyPair":{"pubKey":"BfND35gh2cIwwiGmNhWGiJGcp/9naVY4XSb+3MWHrMQz","privKey":"eMMdNzrjU5CUwXePhACSFvmh4TKSh2YT70PAy7irims="},"lastRemoteEphemeralKey":"BTP3EZfdP5F/gjFWnDDXtrkgiM2QfBpx6eB6drNPWm5Q","previousCounter":1,"rootKey":"7Lcwo0nT6QGB++OZWF5EPV52g8f1ihNZ4SVPt4x26b4="},"indexInfo":{"baseKey":"BWWdyGZEhYMqBbP/RWgOeVzlpWitldtAn0vWFPeAeEY+","baseKeyType":2,"closed":-1,"used":1733916897585,"created":1733914679169,"remoteIdentityKey":"BRO4x2QdfNTmoF0hRRUDlN/AVLraWGLbE5dEFaA65ZZb"},"_chains":{"BYHZFXrMlkEZzp3UhUchq2rxQtQJJQiVwNvslLPWmC9B":{"chainKey":{"counter":0},"chainType":2,"messageKeys":{}},"BVK1vCtdvzglKh4ZNZwgFavfxvtj5EO1WSUPLCST39wQ":{"chainKey":{"counter":5},"chainType":2,"messageKeys":{}},"BTP3EZfdP5F/gjFWnDDXtrkgiM2QfBpx6eB6drNPWm5Q":{"chainKey":{"counter":0,"key":"ZLsDawzqBTrUalpdnDBWBUr/sTyLiy0GJz1w44J2txM="},"chainType":2,"messageKeys":{}},"BfND35gh2cIwwiGmNhWGiJGcp/9naVY4XSb+3MWHrMQz":{"chainKey":{"counter":-1,"key":"rKXOMUvBBCWv5yY4L4l0lnJbsUqGUGItogEzTJ7BNe0="},"chainType":1,"messageKeys":{}}}}},"version":"v1"} \ No newline at end of file diff --git a/sessions/session-6287821561429.0.json b/sessions/session-6287821561429.0.json new file mode 100644 index 0000000000000000000000000000000000000000..ab17a750a95c9d909feb08f2570a9cf131401748 --- /dev/null +++ b/sessions/session-6287821561429.0.json @@ -0,0 +1 @@ +{"_sessions":{"BekUUMrPRqxngdTmJY2qkjN+CRxENv/ieCYHCwfwtWps":{"registrationId":640592726,"currentRatchet":{"ephemeralKeyPair":{"pubKey":"BaBpoLzc/hbUdaqDnIdDvhKrj3ixMxfZQRBku2m61qsv","privKey":"KEFPGV4AU5TeCzvb0MDysLlt3ZZuBnkteH++KLJEeHY="},"lastRemoteEphemeralKey":"BdI7hkpPiggxCw+BFgTLBDVGLct8b8Epp43kxuYz6zMh","previousCounter":0,"rootKey":"yP/IPqqNrpBDfDy6LQW/S40CO739g+OUuB2bF6ZKJBM="},"indexInfo":{"baseKey":"BekUUMrPRqxngdTmJY2qkjN+CRxENv/ieCYHCwfwtWps","baseKeyType":2,"closed":-1,"used":1733914588866,"created":1733914588866,"remoteIdentityKey":"BcbNHpZGf5b+Kpby/Pcbcil0J17X06A0DadwjFTUVWxI"},"_chains":{"BdI7hkpPiggxCw+BFgTLBDVGLct8b8Epp43kxuYz6zMh":{"chainKey":{"counter":9,"key":"/PQhPlOnbhj1IldsQO8KZRQRbIYhCR0ZkZbbhPPSPko="},"chainType":2,"messageKeys":{"4":"xYngpIEIkbqvJECmT7IZO91MHPJLQsm8xt6c2mizgxc=","5":"MB9hg57tK8gVhtdChmvjDxfhr4Z1GEP535HLS3oqFuQ="}},"BaBpoLzc/hbUdaqDnIdDvhKrj3ixMxfZQRBku2m61qsv":{"chainKey":{"counter":3,"key":"s5Yfory79WJm9F3zmRPAJ5BQ1qAT8uhN6FOF7uRmOfQ="},"chainType":1,"messageKeys":{}}}}},"version":"v1"} \ No newline at end of file diff --git a/speed.py b/speed.py new file mode 100644 index 0000000000000000000000000000000000000000..cb8785c1b6bcc738264f313608fdbbbaacf3df8c --- /dev/null +++ b/speed.py @@ -0,0 +1,2008 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright 2012 Matt Martz +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import csv +import datetime +import errno +import math +import os +import platform +import re +import signal +import socket +import sys +import threading +import timeit +import xml.parsers.expat + +try: + import gzip + GZIP_BASE = gzip.GzipFile +except ImportError: + gzip = None + GZIP_BASE = object + +__version__ = '2.1.4b1' + + +class FakeShutdownEvent(object): + """Class to fake a threading.Event.isSet so that home of this module + are not required to register their own threading.Event() + """ + + @staticmethod + def isSet(): + "Dummy method to always return false""" + return False + + is_set = isSet + + +# Some global variables we use +DEBUG = False +_GLOBAL_DEFAULT_TIMEOUT = object() +PY25PLUS = sys.version_info[:2] >= (2, 5) +PY26PLUS = sys.version_info[:2] >= (2, 6) +PY32PLUS = sys.version_info[:2] >= (3, 2) +PY310PLUS = sys.version_info[:2] >= (3, 10) + +# Begin import game to handle Python 2 and Python 3 +try: + import json +except ImportError: + try: + import simplejson as json + except ImportError: + json = None + +try: + import xml.etree.ElementTree as ET + try: + from xml.etree.ElementTree import _Element as ET_Element + except ImportError: + pass +except ImportError: + from xml.dom import minidom as DOM + from xml.parsers.expat import ExpatError + ET = None + +try: + from urllib2 import (urlopen, Request, HTTPError, URLError, + AbstractHTTPHandler, ProxyHandler, + HTTPDefaultErrorHandler, HTTPRedirectHandler, + HTTPErrorProcessor, OpenerDirector) +except ImportError: + from urllib.request import (urlopen, Request, HTTPError, URLError, + AbstractHTTPHandler, ProxyHandler, + HTTPDefaultErrorHandler, HTTPRedirectHandler, + HTTPErrorProcessor, OpenerDirector) + +try: + from httplib import HTTPConnection, BadStatusLine +except ImportError: + from http.client import HTTPConnection, BadStatusLine + +try: + from httplib import HTTPSConnection +except ImportError: + try: + from http.client import HTTPSConnection + except ImportError: + HTTPSConnection = None + +try: + from httplib import FakeSocket +except ImportError: + FakeSocket = None + +try: + from Queue import Queue +except ImportError: + from queue import Queue + +try: + from urlparse import urlparse +except ImportError: + from urllib.parse import urlparse + +try: + from urlparse import parse_qs +except ImportError: + try: + from urllib.parse import parse_qs + except ImportError: + from cgi import parse_qs + +try: + from hashlib import md5 +except ImportError: + from md5 import md5 + +try: + from argparse import ArgumentParser as ArgParser + from argparse import SUPPRESS as ARG_SUPPRESS + PARSER_TYPE_INT = int + PARSER_TYPE_STR = str + PARSER_TYPE_FLOAT = float +except ImportError: + from optparse import OptionParser as ArgParser + from optparse import SUPPRESS_HELP as ARG_SUPPRESS + PARSER_TYPE_INT = 'int' + PARSER_TYPE_STR = 'string' + PARSER_TYPE_FLOAT = 'float' + +try: + from cStringIO import StringIO + BytesIO = None +except ImportError: + try: + from StringIO import StringIO + BytesIO = None + except ImportError: + from io import StringIO, BytesIO + +try: + import __builtin__ +except ImportError: + import builtins + from io import TextIOWrapper, FileIO + + class _Py3Utf8Output(TextIOWrapper): + """UTF-8 encoded wrapper around stdout for py3, to override + ASCII stdout + """ + def __init__(self, f, **kwargs): + buf = FileIO(f.fileno(), 'w') + super(_Py3Utf8Output, self).__init__( + buf, + encoding='utf8', + errors='strict' + ) + + def write(self, s): + super(_Py3Utf8Output, self).write(s) + self.flush() + + _py3_print = getattr(builtins, 'print') + try: + _py3_utf8_stdout = _Py3Utf8Output(sys.stdout) + _py3_utf8_stderr = _Py3Utf8Output(sys.stderr) + except OSError: + # sys.stdout/sys.stderr is not a compatible stdout/stderr object + # just use it and hope things go ok + _py3_utf8_stdout = sys.stdout + _py3_utf8_stderr = sys.stderr + + def to_utf8(v): + """No-op encode to utf-8 for py3""" + return v + + def print_(*args, **kwargs): + """Wrapper function for py3 to print, with a utf-8 encoded stdout""" + if kwargs.get('file') == sys.stderr: + kwargs['file'] = _py3_utf8_stderr + else: + kwargs['file'] = kwargs.get('file', _py3_utf8_stdout) + _py3_print(*args, **kwargs) +else: + del __builtin__ + + def to_utf8(v): + """Encode value to utf-8 if possible for py2""" + try: + return v.encode('utf8', 'strict') + except AttributeError: + return v + + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5. + + Taken from https://pypi.python.org/pypi/six/ + + Modified to set encoding to UTF-8 always, and to flush after write + """ + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + encoding = 'utf8' # Always trust UTF-8 for output + if (isinstance(fp, file) and + isinstance(data, unicode) and + encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(encoding, errors) + fp.write(data) + fp.flush() + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) + +# Exception "constants" to support Python 2 through Python 3 +try: + import ssl + try: + CERT_ERROR = (ssl.CertificateError,) + except AttributeError: + CERT_ERROR = tuple() + + HTTP_ERRORS = ( + (HTTPError, URLError, socket.error, ssl.SSLError, BadStatusLine) + + CERT_ERROR + ) +except ImportError: + ssl = None + HTTP_ERRORS = (HTTPError, URLError, socket.error, BadStatusLine) + +if PY32PLUS: + etree_iter = ET.Element.iter +elif PY25PLUS: + etree_iter = ET_Element.getiterator + +if PY26PLUS: + thread_is_alive = threading.Thread.is_alive +else: + thread_is_alive = threading.Thread.isAlive + + +def event_is_set(event): + try: + return event.is_set() + except AttributeError: + return event.isSet() + + +class SpeedtestException(Exception): + """Base exception for this module""" + + +class SpeedtestCLIError(SpeedtestException): + """Generic exception for raising errors during CLI operation""" + + +class SpeedtestHTTPError(SpeedtestException): + """Base HTTP exception for this module""" + + +class SpeedtestConfigError(SpeedtestException): + """Configuration XML is invalid""" + + +class SpeedtestServersError(SpeedtestException): + """Servers XML is invalid""" + + +class ConfigRetrievalError(SpeedtestHTTPError): + """Could not retrieve config.php""" + + +class ServersRetrievalError(SpeedtestHTTPError): + """Could not retrieve speedtest-servers.php""" + + +class InvalidServerIDType(SpeedtestException): + """Server ID used for filtering was not an integer""" + + +class NoMatchedServers(SpeedtestException): + """No servers matched when filtering""" + + +class SpeedtestMiniConnectFailure(SpeedtestException): + """Could not connect to the provided speedtest mini server""" + + +class InvalidSpeedtestMiniServer(SpeedtestException): + """Server provided as a speedtest mini server does not actually appear + to be a speedtest mini server + """ + + +class ShareResultsConnectFailure(SpeedtestException): + """Could not connect to speedtest.net API to POST results""" + + +class ShareResultsSubmitFailure(SpeedtestException): + """Unable to successfully POST results to speedtest.net API after + connection + """ + + +class SpeedtestUploadTimeout(SpeedtestException): + """testlength configuration reached during upload + Used to ensure the upload halts when no additional data should be sent + """ + + +class SpeedtestBestServerFailure(SpeedtestException): + """Unable to determine best server""" + + +class SpeedtestMissingBestServer(SpeedtestException): + """get_best_server not called or not able to determine best server""" + + +def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT, + source_address=None): + """Connect to *address* and return the socket object. + + Convenience function. Connect to *address* (a 2-tuple ``(host, + port)``) and return the socket object. Passing the optional + *timeout* parameter will set the timeout on the socket instance + before attempting to connect. If no *timeout* is supplied, the + global default timeout setting returned by :fun`getdefaulttimeout` + is used. If *source_address* is set it must be a tuple of (host, port) + for the socket to bind as a source address before making the connection. + An host of '' or port 0 tells the OS to use the default. + + Largely vendored from Python 2.7, modified to work with Python 2.4 + """ + + host, port = address + err = None + for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + sock = None + try: + sock = socket.socket(af, socktype, proto) + if timeout is not _GLOBAL_DEFAULT_TIMEOUT: + sock.settimeout(float(timeout)) + if source_address: + sock.bind(source_address) + sock.connect(sa) + return sock + + except socket.error: + err = get_exception() + if sock is not None: + sock.close() + + if err is not None: + raise err + else: + raise socket.error("getaddrinfo returns an empty list") + + +class SpeedtestHTTPConnection(HTTPConnection): + """Custom HTTPConnection to support source_address across + Python 2.4 - Python 3 + """ + def __init__(self, *args, **kwargs): + source_address = kwargs.pop('source_address', None) + timeout = kwargs.pop('timeout', 10) + + self._tunnel_host = None + + HTTPConnection.__init__(self, *args, **kwargs) + + self.source_address = source_address + self.timeout = timeout + + def connect(self): + """Connect to the host and port specified in __init__.""" + try: + self.sock = socket.create_connection( + (self.host, self.port), + self.timeout, + self.source_address + ) + except (AttributeError, TypeError): + self.sock = create_connection( + (self.host, self.port), + self.timeout, + self.source_address + ) + + if self._tunnel_host: + self._tunnel() + + +if HTTPSConnection: + class SpeedtestHTTPSConnection(HTTPSConnection): + """Custom HTTPSConnection to support source_address across + Python 2.4 - Python 3 + """ + default_port = 443 + + def __init__(self, *args, **kwargs): + source_address = kwargs.pop('source_address', None) + timeout = kwargs.pop('timeout', 10) + + self._tunnel_host = None + + HTTPSConnection.__init__(self, *args, **kwargs) + + self.timeout = timeout + self.source_address = source_address + + def connect(self): + "Connect to a host on a given (SSL) port." + try: + self.sock = socket.create_connection( + (self.host, self.port), + self.timeout, + self.source_address + ) + except (AttributeError, TypeError): + self.sock = create_connection( + (self.host, self.port), + self.timeout, + self.source_address + ) + + if self._tunnel_host: + self._tunnel() + + if ssl: + try: + kwargs = {} + if hasattr(ssl, 'SSLContext'): + if self._tunnel_host: + kwargs['server_hostname'] = self._tunnel_host + else: + kwargs['server_hostname'] = self.host + self.sock = self._context.wrap_socket(self.sock, **kwargs) + except AttributeError: + self.sock = ssl.wrap_socket(self.sock) + try: + self.sock.server_hostname = self.host + except AttributeError: + pass + elif FakeSocket: + # Python 2.4/2.5 support + try: + self.sock = FakeSocket(self.sock, socket.ssl(self.sock)) + except AttributeError: + raise SpeedtestException( + 'This version of Python does not support HTTPS/SSL ' + 'functionality' + ) + else: + raise SpeedtestException( + 'This version of Python does not support HTTPS/SSL ' + 'functionality' + ) + + +def _build_connection(connection, source_address, timeout, context=None): + """Cross Python 2.4 - Python 3 callable to build an ``HTTPConnection`` or + ``HTTPSConnection`` with the args we need + + Called from ``http(s)_open`` methods of ``SpeedtestHTTPHandler`` or + ``SpeedtestHTTPSHandler`` + """ + def inner(host, **kwargs): + kwargs.update({ + 'source_address': source_address, + 'timeout': timeout + }) + if context: + kwargs['context'] = context + return connection(host, **kwargs) + return inner + + +class SpeedtestHTTPHandler(AbstractHTTPHandler): + """Custom ``HTTPHandler`` that can build a ``HTTPConnection`` with the + args we need for ``source_address`` and ``timeout`` + """ + def __init__(self, debuglevel=0, source_address=None, timeout=10): + AbstractHTTPHandler.__init__(self, debuglevel) + self.source_address = source_address + self.timeout = timeout + + def http_open(self, req): + return self.do_open( + _build_connection( + SpeedtestHTTPConnection, + self.source_address, + self.timeout + ), + req + ) + + http_request = AbstractHTTPHandler.do_request_ + + +class SpeedtestHTTPSHandler(AbstractHTTPHandler): + """Custom ``HTTPSHandler`` that can build a ``HTTPSConnection`` with the + args we need for ``source_address`` and ``timeout`` + """ + def __init__(self, debuglevel=0, context=None, source_address=None, + timeout=10): + AbstractHTTPHandler.__init__(self, debuglevel) + self._context = context + self.source_address = source_address + self.timeout = timeout + + def https_open(self, req): + return self.do_open( + _build_connection( + SpeedtestHTTPSConnection, + self.source_address, + self.timeout, + context=self._context, + ), + req + ) + + https_request = AbstractHTTPHandler.do_request_ + + +def build_opener(source_address=None, timeout=10): + """Function similar to ``urllib2.build_opener`` that will build + an ``OpenerDirector`` with the explicit handlers we want, + ``source_address`` for binding, ``timeout`` and our custom + `User-Agent` + """ + + printer('Timeout set to %d' % timeout, debug=True) + + if source_address: + source_address_tuple = (source_address, 0) + printer('Binding to source address: %r' % (source_address_tuple,), + debug=True) + else: + source_address_tuple = None + + handlers = [ + ProxyHandler(), + SpeedtestHTTPHandler(source_address=source_address_tuple, + timeout=timeout), + SpeedtestHTTPSHandler(source_address=source_address_tuple, + timeout=timeout), + HTTPDefaultErrorHandler(), + HTTPRedirectHandler(), + HTTPErrorProcessor() + ] + + opener = OpenerDirector() + opener.addheaders = [('User-agent', build_user_agent())] + + for handler in handlers: + opener.add_handler(handler) + + return opener + + +class GzipDecodedResponse(GZIP_BASE): + """A file-like object to decode a response encoded with the gzip + method, as described in RFC 1952. + + Largely copied from ``xmlrpclib``/``xmlrpc.client`` and modified + to work for py2.4-py3 + """ + def __init__(self, response): + # response doesn't support tell() and read(), required by + # GzipFile + if not gzip: + raise SpeedtestHTTPError('HTTP response body is gzip encoded, ' + 'but gzip support is not available') + IO = BytesIO or StringIO + self.io = IO() + while 1: + chunk = response.read(1024) + if len(chunk) == 0: + break + self.io.write(chunk) + self.io.seek(0) + gzip.GzipFile.__init__(self, mode='rb', fileobj=self.io) + + def close(self): + try: + gzip.GzipFile.close(self) + finally: + self.io.close() + + +def get_exception(): + """Helper function to work with py2.4-py3 for getting the current + exception in a try/except block + """ + return sys.exc_info()[1] + + +def distance(origin, destination): + """Determine distance between 2 sets of [lat,lon] in km""" + + lat1, lon1 = origin + lat2, lon2 = destination + radius = 6371 # km + + dlat = math.radians(lat2 - lat1) + dlon = math.radians(lon2 - lon1) + a = (math.sin(dlat / 2) * math.sin(dlat / 2) + + math.cos(math.radians(lat1)) * + math.cos(math.radians(lat2)) * math.sin(dlon / 2) * + math.sin(dlon / 2)) + c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) + d = radius * c + + return d + + +def build_user_agent(): + """Build a Mozilla/5.0 compatible User-Agent string""" + + ua_tuple = ( + 'Mozilla/5.0', + '(%s; U; %s; en-us)' % (platform.platform(), + platform.architecture()[0]), + 'Python/%s' % platform.python_version(), + '(KHTML, like Gecko)', + 'speedtest-cli/%s' % __version__ + ) + user_agent = ' '.join(ua_tuple) + printer('User-Agent: %s' % user_agent, debug=True) + return user_agent + + +def build_request(url, data=None, headers=None, bump='0', secure=False): + """Build a urllib2 request object + + This function automatically adds a User-Agent header to all requests + + """ + + if not headers: + headers = {} + + if url[0] == ':': + scheme = ('http', 'https')[bool(secure)] + schemed_url = '%s%s' % (scheme, url) + else: + schemed_url = url + + if '?' in url: + delim = '&' + else: + delim = '?' + + # WHO YOU GONNA CALL? CACHE BUSTERS! + final_url = '%s%sx=%s.%s' % (schemed_url, delim, + int(timeit.time.time() * 1000), + bump) + + headers.update({ + 'Cache-Control': 'no-cache', + }) + + printer('%s %s' % (('GET', 'POST')[bool(data)], final_url), + debug=True) + + return Request(final_url, data=data, headers=headers) + + +def catch_request(request, opener=None): + """Helper function to catch common exceptions encountered when + establishing a connection with a HTTP/HTTPS request + + """ + + if opener: + _open = opener.open + else: + _open = urlopen + + try: + uh = _open(request) + if request.get_full_url() != uh.geturl(): + printer('Redirected to %s' % uh.geturl(), debug=True) + return uh, False + except HTTP_ERRORS: + e = get_exception() + return None, e + + +def get_response_stream(response): + """Helper function to return either a Gzip reader if + ``Content-Encoding`` is ``gzip`` otherwise the response itself + + """ + + try: + getheader = response.headers.getheader + except AttributeError: + getheader = response.getheader + + if getheader('content-encoding') == 'gzip': + return GzipDecodedResponse(response) + + return response + + +def get_attributes_by_tag_name(dom, tag_name): + """Retrieve an attribute from an XML document and return it in a + consistent format + + Only used with xml.dom.minidom, which is likely only to be used + with python versions older than 2.5 + """ + elem = dom.getElementsByTagName(tag_name)[0] + return dict(list(elem.attributes.items())) + + +def print_dots(shutdown_event): + """Built in callback function used by Thread classes for printing + status + """ + def inner(current, total, start=False, end=False): + if event_is_set(shutdown_event): + return + + sys.stdout.write('.') + if current + 1 == total and end is True: + sys.stdout.write('\n') + sys.stdout.flush() + return inner + + +def do_nothing(*args, **kwargs): + pass + + +class HTTPDownloader(threading.Thread): + """Thread class for retrieving a URL""" + + def __init__(self, i, request, start, timeout, opener=None, + shutdown_event=None): + threading.Thread.__init__(self) + self.request = request + self.result = [0] + self.starttime = start + self.timeout = timeout + self.i = i + if opener: + self._opener = opener.open + else: + self._opener = urlopen + + if shutdown_event: + self._shutdown_event = shutdown_event + else: + self._shutdown_event = FakeShutdownEvent() + + def run(self): + try: + if (timeit.default_timer() - self.starttime) <= self.timeout: + f = self._opener(self.request) + while (not event_is_set(self._shutdown_event) and + (timeit.default_timer() - self.starttime) <= + self.timeout): + self.result.append(len(f.read(10240))) + if self.result[-1] == 0: + break + f.close() + except IOError: + pass + except HTTP_ERRORS: + pass + + +class HTTPUploaderData(object): + """File like object to improve cutting off the upload once the timeout + has been reached + """ + + def __init__(self, length, start, timeout, shutdown_event=None): + self.length = length + self.start = start + self.timeout = timeout + + if shutdown_event: + self._shutdown_event = shutdown_event + else: + self._shutdown_event = FakeShutdownEvent() + + self._data = None + + self.total = [0] + + def pre_allocate(self): + chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' + multiplier = int(round(int(self.length) / 36.0)) + IO = BytesIO or StringIO + try: + self._data = IO( + ('content1=%s' % + (chars * multiplier)[0:int(self.length) - 9] + ).encode() + ) + except MemoryError: + raise SpeedtestCLIError( + 'Insufficient memory to pre-allocate upload data. Please ' + 'use --no-pre-allocate' + ) + + @property + def data(self): + if not self._data: + self.pre_allocate() + return self._data + + def read(self, n=10240): + if ((timeit.default_timer() - self.start) <= self.timeout and + not event_is_set(self._shutdown_event)): + chunk = self.data.read(n) + self.total.append(len(chunk)) + return chunk + else: + raise SpeedtestUploadTimeout() + + def __len__(self): + return self.length + + +class HTTPUploader(threading.Thread): + """Thread class for putting a URL""" + + def __init__(self, i, request, start, size, timeout, opener=None, + shutdown_event=None): + threading.Thread.__init__(self) + self.request = request + self.request.data.start = self.starttime = start + self.size = size + self.result = 0 + self.timeout = timeout + self.i = i + + if opener: + self._opener = opener.open + else: + self._opener = urlopen + + if shutdown_event: + self._shutdown_event = shutdown_event + else: + self._shutdown_event = FakeShutdownEvent() + + def run(self): + request = self.request + try: + if ((timeit.default_timer() - self.starttime) <= self.timeout and + not event_is_set(self._shutdown_event)): + try: + f = self._opener(request) + except TypeError: + # PY24 expects a string or buffer + # This also causes issues with Ctrl-C, but we will concede + # for the moment that Ctrl-C on PY24 isn't immediate + request = build_request(self.request.get_full_url(), + data=request.data.read(self.size)) + f = self._opener(request) + f.read(11) + f.close() + self.result = sum(self.request.data.total) + else: + self.result = 0 + except (IOError, SpeedtestUploadTimeout): + self.result = sum(self.request.data.total) + except HTTP_ERRORS: + self.result = 0 + + +class SpeedtestResults(object): + """Class for holding the results of a speedtest, including: + + Download speed + Upload speed + Ping/Latency to test server + Data about server that the test was run against + + Additionally this class can return a result data as a dictionary or CSV, + as well as submit a POST of the result data to the speedtest.net API + to get a share results image link. + """ + + def __init__(self, download=0, upload=0, ping=0, server=None, client=None, + opener=None, secure=False): + self.download = download + self.upload = upload + self.ping = ping + if server is None: + self.server = {} + else: + self.server = server + self.client = client or {} + + self._share = None + self.timestamp = '%sZ' % datetime.datetime.utcnow().isoformat() + self.bytes_received = 0 + self.bytes_sent = 0 + + if opener: + self._opener = opener + else: + self._opener = build_opener() + + self._secure = secure + + def __repr__(self): + return repr(self.dict()) + + def share(self): + """POST data to the speedtest.net API to obtain a share results + link + """ + + if self._share: + return self._share + + download = int(round(self.download / 1000.0, 0)) + ping = int(round(self.ping, 0)) + upload = int(round(self.upload / 1000.0, 0)) + + # Build the request to send results back to speedtest.net + # We use a list instead of a dict because the API expects parameters + # in a certain order + api_data = [ + 'recommendedserverid=%s' % self.server['id'], + 'ping=%s' % ping, + 'screenresolution=', + 'promo=', + 'download=%s' % download, + 'screendpi=', + 'upload=%s' % upload, + 'testmethod=http', + 'hash=%s' % md5(('%s-%s-%s-%s' % + (ping, upload, download, '297aae72')) + .encode()).hexdigest(), + 'touchscreen=none', + 'startmode=pingselect', + 'accuracy=1', + 'bytesreceived=%s' % self.bytes_received, + 'bytessent=%s' % self.bytes_sent, + 'serverid=%s' % self.server['id'], + ] + + headers = {'Referer': 'http://c.speedtest.net/flash/speedtest.swf'} + request = build_request('://www.speedtest.net/api/api.php', + data='&'.join(api_data).encode(), + headers=headers, secure=self._secure) + f, e = catch_request(request, opener=self._opener) + if e: + raise ShareResultsConnectFailure(e) + + response = f.read() + code = f.code + f.close() + + if int(code) != 200: + raise ShareResultsSubmitFailure('Could not submit results to ' + 'speedtest.net') + + qsargs = parse_qs(response.decode()) + resultid = qsargs.get('resultid') + if not resultid or len(resultid) != 1: + raise ShareResultsSubmitFailure('Could not submit results to ' + 'speedtest.net') + + self._share = 'http://www.speedtest.net/result/%s.png' % resultid[0] + + return self._share + + def dict(self): + """Return dictionary of result data""" + + return { + 'download': self.download, + 'upload': self.upload, + 'ping': self.ping, + 'server': self.server, + 'timestamp': self.timestamp, + 'bytes_sent': self.bytes_sent, + 'bytes_received': self.bytes_received, + 'share': self._share, + 'client': self.client, + } + + @staticmethod + def csv_header(delimiter=','): + """Return CSV Headers""" + + row = ['Server ID', 'Sponsor', 'Server Name', 'Timestamp', 'Distance', + 'Ping', 'Download', 'Upload', 'Share', 'IP Address'] + out = StringIO() + writer = csv.writer(out, delimiter=delimiter, lineterminator='') + writer.writerow([to_utf8(v) for v in row]) + return out.getvalue() + + def csv(self, delimiter=','): + """Return data in CSV format""" + + data = self.dict() + out = StringIO() + writer = csv.writer(out, delimiter=delimiter, lineterminator='') + row = [data['server']['id'], data['server']['sponsor'], + data['server']['name'], data['timestamp'], + data['server']['d'], data['ping'], data['download'], + data['upload'], self._share or '', self.client['ip']] + writer.writerow([to_utf8(v) for v in row]) + return out.getvalue() + + def json(self, pretty=False): + """Return data in JSON format""" + + kwargs = {} + if pretty: + kwargs.update({ + 'indent': 4, + 'sort_keys': True + }) + return json.dumps(self.dict(), **kwargs) + + +class Speedtest(object): + """Class for performing standard speedtest.net testing operations""" + + def __init__(self, config=None, source_address=None, timeout=10, + secure=False, shutdown_event=None): + self.config = {} + + self._source_address = source_address + self._timeout = timeout + self._opener = build_opener(source_address, timeout) + + self._secure = secure + + if shutdown_event: + self._shutdown_event = shutdown_event + else: + self._shutdown_event = FakeShutdownEvent() + + self.get_config() + if config is not None: + self.config.update(config) + + self.servers = {} + self.closest = [] + self._best = {} + + self.results = SpeedtestResults( + client=self.config['client'], + opener=self._opener, + secure=secure, + ) + + @property + def best(self): + if not self._best: + self.get_best_server() + return self._best + + def get_config(self): + """Download the speedtest.net configuration and return only the data + we are interested in + """ + + headers = {} + if gzip: + headers['Accept-Encoding'] = 'gzip' + request = build_request('://www.speedtest.net/speedtest-config.php', + headers=headers, secure=self._secure) + uh, e = catch_request(request, opener=self._opener) + if e: + raise ConfigRetrievalError(e) + configxml_list = [] + + stream = get_response_stream(uh) + + while 1: + try: + configxml_list.append(stream.read(1024)) + except (OSError, EOFError): + raise ConfigRetrievalError(get_exception()) + if len(configxml_list[-1]) == 0: + break + stream.close() + uh.close() + + if int(uh.code) != 200: + return None + + configxml = ''.encode().join(configxml_list) + + printer('Config XML:\n%s' % configxml, debug=True) + + try: + try: + root = ET.fromstring(configxml) + except ET.ParseError: + e = get_exception() + raise SpeedtestConfigError( + 'Malformed speedtest.net configuration: %s' % e + ) + server_config = root.find('server-config').attrib + download = root.find('download').attrib + upload = root.find('upload').attrib + # times = root.find('times').attrib + client = root.find('client').attrib + + except AttributeError: + try: + root = DOM.parseString(configxml) + except ExpatError: + e = get_exception() + raise SpeedtestConfigError( + 'Malformed speedtest.net configuration: %s' % e + ) + server_config = get_attributes_by_tag_name(root, 'server-config') + download = get_attributes_by_tag_name(root, 'download') + upload = get_attributes_by_tag_name(root, 'upload') + # times = get_attributes_by_tag_name(root, 'times') + client = get_attributes_by_tag_name(root, 'client') + + ignore_servers = [ + int(i) for i in server_config['ignoreids'].split(',') if i + ] + + ratio = int(upload['ratio']) + upload_max = int(upload['maxchunkcount']) + up_sizes = [32768, 65536, 131072, 262144, 524288, 1048576, 7340032] + sizes = { + 'upload': up_sizes[ratio - 1:], + 'download': [350, 500, 750, 1000, 1500, 2000, 2500, + 3000, 3500, 4000] + } + + size_count = len(sizes['upload']) + + upload_count = int(math.ceil(upload_max / size_count)) + + counts = { + 'upload': upload_count, + 'download': int(download['threadsperurl']) + } + + threads = { + 'upload': int(upload['threads']), + 'download': int(server_config['threadcount']) * 2 + } + + length = { + 'upload': int(upload['testlength']), + 'download': int(download['testlength']) + } + + self.config.update({ + 'client': client, + 'ignore_servers': ignore_servers, + 'sizes': sizes, + 'counts': counts, + 'threads': threads, + 'length': length, + 'upload_max': upload_count * size_count + }) + + try: + self.lat_lon = (float(client['lat']), float(client['lon'])) + except ValueError: + raise SpeedtestConfigError( + 'Unknown location: lat=%r lon=%r' % + (client.get('lat'), client.get('lon')) + ) + + printer('Config:\n%r' % self.config, debug=True) + + return self.config + + def get_servers(self, servers=None, exclude=None): + """Retrieve a the list of speedtest.net servers, optionally filtered + to servers matching those specified in the ``servers`` argument + """ + if servers is None: + servers = [] + + if exclude is None: + exclude = [] + + self.servers.clear() + + for server_list in (servers, exclude): + for i, s in enumerate(server_list): + try: + server_list[i] = int(s) + except ValueError: + raise InvalidServerIDType( + '%s is an invalid server type, must be int' % s + ) + + urls = [ + '://www.speedtest.net/speedtest-servers-static.php', + 'http://c.speedtest.net/speedtest-servers-static.php', + '://www.speedtest.net/speedtest-servers.php', + 'http://c.speedtest.net/speedtest-servers.php', + ] + + headers = {} + if gzip: + headers['Accept-Encoding'] = 'gzip' + + errors = [] + for url in urls: + try: + request = build_request( + '%s?threads=%s' % (url, + self.config['threads']['download']), + headers=headers, + secure=self._secure + ) + uh, e = catch_request(request, opener=self._opener) + if e: + errors.append('%s' % e) + raise ServersRetrievalError() + + stream = get_response_stream(uh) + + serversxml_list = [] + while 1: + try: + serversxml_list.append(stream.read(1024)) + except (OSError, EOFError): + raise ServersRetrievalError(get_exception()) + if len(serversxml_list[-1]) == 0: + break + + stream.close() + uh.close() + + if int(uh.code) != 200: + raise ServersRetrievalError() + + serversxml = ''.encode().join(serversxml_list) + + printer('Servers XML:\n%s' % serversxml, debug=True) + + try: + try: + try: + root = ET.fromstring(serversxml) + except ET.ParseError: + e = get_exception() + raise SpeedtestServersError( + 'Malformed speedtest.net server list: %s' % e + ) + elements = etree_iter(root, 'server') + except AttributeError: + try: + root = DOM.parseString(serversxml) + except ExpatError: + e = get_exception() + raise SpeedtestServersError( + 'Malformed speedtest.net server list: %s' % e + ) + elements = root.getElementsByTagName('server') + except (SyntaxError, xml.parsers.expat.ExpatError): + raise ServersRetrievalError() + + for server in elements: + try: + attrib = server.attrib + except AttributeError: + attrib = dict(list(server.attributes.items())) + + if servers and int(attrib.get('id')) not in servers: + continue + + if (int(attrib.get('id')) in self.config['ignore_servers'] + or int(attrib.get('id')) in exclude): + continue + + try: + d = distance(self.lat_lon, + (float(attrib.get('lat')), + float(attrib.get('lon')))) + except Exception: + continue + + attrib['d'] = d + + try: + self.servers[d].append(attrib) + except KeyError: + self.servers[d] = [attrib] + + break + + except ServersRetrievalError: + continue + + if (servers or exclude) and not self.servers: + raise NoMatchedServers() + + return self.servers + + def set_mini_server(self, server): + """Instead of querying for a list of servers, set a link to a + speedtest mini server + """ + + urlparts = urlparse(server) + + name, ext = os.path.splitext(urlparts[2]) + if ext: + url = os.path.dirname(server) + else: + url = server + + request = build_request(url) + uh, e = catch_request(request, opener=self._opener) + if e: + raise SpeedtestMiniConnectFailure('Failed to connect to %s' % + server) + else: + text = uh.read() + uh.close() + + extension = re.findall('upload_?[Ee]xtension: "([^"]+)"', + text.decode()) + if not extension: + for ext in ['php', 'asp', 'aspx', 'jsp']: + try: + f = self._opener.open( + '%s/speedtest/upload.%s' % (url, ext) + ) + except Exception: + pass + else: + data = f.read().strip().decode() + if (f.code == 200 and + len(data.splitlines()) == 1 and + re.match('size=[0-9]', data)): + extension = [ext] + break + if not urlparts or not extension: + raise InvalidSpeedtestMiniServer('Invalid Speedtest Mini Server: ' + '%s' % server) + + self.servers = [{ + 'sponsor': 'Speedtest Mini', + 'name': urlparts[1], + 'd': 0, + 'url': '%s/speedtest/upload.%s' % (url.rstrip('/'), extension[0]), + 'latency': 0, + 'id': 0 + }] + + return self.servers + + def get_closest_servers(self, limit=5): + """Limit servers to the closest speedtest.net servers based on + geographic distance + """ + + if not self.servers: + self.get_servers() + + for d in sorted(self.servers.keys()): + for s in self.servers[d]: + self.closest.append(s) + if len(self.closest) == limit: + break + else: + continue + break + + printer('Closest Servers:\n%r' % self.closest, debug=True) + return self.closest + + def get_best_server(self, servers=None): + """Perform a speedtest.net "ping" to determine which speedtest.net + server has the lowest latency + """ + + if not servers: + if not self.closest: + servers = self.get_closest_servers() + servers = self.closest + + if self._source_address: + source_address_tuple = (self._source_address, 0) + else: + source_address_tuple = None + + user_agent = build_user_agent() + + results = {} + for server in servers: + cum = [] + url = os.path.dirname(server['url']) + stamp = int(timeit.time.time() * 1000) + latency_url = '%s/latency.txt?x=%s' % (url, stamp) + for i in range(0, 3): + this_latency_url = '%s.%s' % (latency_url, i) + printer('%s %s' % ('GET', this_latency_url), + debug=True) + urlparts = urlparse(latency_url) + try: + if urlparts[0] == 'https': + h = SpeedtestHTTPSConnection( + urlparts[1], + source_address=source_address_tuple + ) + else: + h = SpeedtestHTTPConnection( + urlparts[1], + source_address=source_address_tuple + ) + headers = {'User-Agent': user_agent} + path = '%s?%s' % (urlparts[2], urlparts[4]) + start = timeit.default_timer() + h.request("GET", path, headers=headers) + r = h.getresponse() + total = (timeit.default_timer() - start) + except HTTP_ERRORS: + e = get_exception() + printer('ERROR: %r' % e, debug=True) + cum.append(3600) + continue + + text = r.read(9) + if int(r.status) == 200 and text == 'test=test'.encode(): + cum.append(total) + else: + cum.append(3600) + h.close() + + avg = round((sum(cum) / 6) * 1000.0, 3) + results[avg] = server + + try: + fastest = sorted(results.keys())[0] + except IndexError: + raise SpeedtestBestServerFailure('Unable to connect to servers to ' + 'test latency.') + best = results[fastest] + best['latency'] = fastest + + self.results.ping = fastest + self.results.server = best + + self._best.update(best) + printer('Best Server:\n%r' % best, debug=True) + return best + + def download(self, callback=do_nothing, threads=None): + """Test download speed against speedtest.net + + A ``threads`` value of ``None`` will fall back to those dictated + by the speedtest.net configuration + """ + + urls = [] + for size in self.config['sizes']['download']: + for _ in range(0, self.config['counts']['download']): + urls.append('%s/random%sx%s.jpg' % + (os.path.dirname(self.best['url']), size, size)) + + request_count = len(urls) + requests = [] + for i, url in enumerate(urls): + requests.append( + build_request(url, bump=i, secure=self._secure) + ) + + max_threads = threads or self.config['threads']['download'] + in_flight = {'threads': 0} + + def producer(q, requests, request_count): + for i, request in enumerate(requests): + thread = HTTPDownloader( + i, + request, + start, + self.config['length']['download'], + opener=self._opener, + shutdown_event=self._shutdown_event + ) + while in_flight['threads'] >= max_threads: + timeit.time.sleep(0.001) + thread.start() + q.put(thread, True) + in_flight['threads'] += 1 + callback(i, request_count, start=True) + + finished = [] + + def consumer(q, request_count): + _is_alive = thread_is_alive + while len(finished) < request_count: + thread = q.get(True) + while _is_alive(thread): + thread.join(timeout=0.001) + in_flight['threads'] -= 1 + finished.append(sum(thread.result)) + callback(thread.i, request_count, end=True) + + q = Queue(max_threads) + prod_thread = threading.Thread(target=producer, + args=(q, requests, request_count)) + cons_thread = threading.Thread(target=consumer, + args=(q, request_count)) + start = timeit.default_timer() + prod_thread.start() + cons_thread.start() + _is_alive = thread_is_alive + while _is_alive(prod_thread): + prod_thread.join(timeout=0.001) + while _is_alive(cons_thread): + cons_thread.join(timeout=0.001) + + stop = timeit.default_timer() + self.results.bytes_received = sum(finished) + self.results.download = ( + (self.results.bytes_received / (stop - start)) * 8.0 + ) + if self.results.download > 100000: + self.config['threads']['upload'] = 8 + return self.results.download + + def upload(self, callback=do_nothing, pre_allocate=True, threads=None): + """Test upload speed against speedtest.net + + A ``threads`` value of ``None`` will fall back to those dictated + by the speedtest.net configuration + """ + + sizes = [] + + for size in self.config['sizes']['upload']: + for _ in range(0, self.config['counts']['upload']): + sizes.append(size) + + # request_count = len(sizes) + request_count = self.config['upload_max'] + + requests = [] + for i, size in enumerate(sizes): + # We set ``0`` for ``start`` and handle setting the actual + # ``start`` in ``HTTPUploader`` to get better measurements + data = HTTPUploaderData( + size, + 0, + self.config['length']['upload'], + shutdown_event=self._shutdown_event + ) + if pre_allocate: + data.pre_allocate() + + headers = {'Content-length': size} + requests.append( + ( + build_request(self.best['url'], data, secure=self._secure, + headers=headers), + size + ) + ) + + max_threads = threads or self.config['threads']['upload'] + in_flight = {'threads': 0} + + def producer(q, requests, request_count): + for i, request in enumerate(requests[:request_count]): + thread = HTTPUploader( + i, + request[0], + start, + request[1], + self.config['length']['upload'], + opener=self._opener, + shutdown_event=self._shutdown_event + ) + while in_flight['threads'] >= max_threads: + timeit.time.sleep(0.001) + thread.start() + q.put(thread, True) + in_flight['threads'] += 1 + callback(i, request_count, start=True) + + finished = [] + + def consumer(q, request_count): + _is_alive = thread_is_alive + while len(finished) < request_count: + thread = q.get(True) + while _is_alive(thread): + thread.join(timeout=0.001) + in_flight['threads'] -= 1 + finished.append(thread.result) + callback(thread.i, request_count, end=True) + + q = Queue(threads or self.config['threads']['upload']) + prod_thread = threading.Thread(target=producer, + args=(q, requests, request_count)) + cons_thread = threading.Thread(target=consumer, + args=(q, request_count)) + start = timeit.default_timer() + prod_thread.start() + cons_thread.start() + _is_alive = thread_is_alive + while _is_alive(prod_thread): + prod_thread.join(timeout=0.1) + while _is_alive(cons_thread): + cons_thread.join(timeout=0.1) + + stop = timeit.default_timer() + self.results.bytes_sent = sum(finished) + self.results.upload = ( + (self.results.bytes_sent / (stop - start)) * 8.0 + ) + return self.results.upload + + +def ctrl_c(shutdown_event): + """Catch Ctrl-C key sequence and set a SHUTDOWN_EVENT for our threaded + operations + """ + def inner(signum, frame): + shutdown_event.set() + printer('\nCancelling...', error=True) + sys.exit(0) + return inner + + +def version(): + """Print the version""" + + printer('speedtest-cli %s' % __version__) + printer('Python %s' % sys.version.replace('\n', '')) + sys.exit(0) + + +def csv_header(delimiter=','): + """Print the CSV Headers""" + + printer(SpeedtestResults.csv_header(delimiter=delimiter)) + sys.exit(0) + + +def parse_args(): + """Function to handle building and parsing of command line arguments""" + description = ( + 'Command line interface for testing internet bandwidth using ' + 'speedtest.net.\n' + '------------------------------------------------------------' + '--------------\n' + 'https://github.com/sivel/speedtest-cli') + + parser = ArgParser(description=description) + # Give optparse.OptionParser an `add_argument` method for + # compatibility with argparse.ArgumentParser + try: + parser.add_argument = parser.add_option + except AttributeError: + pass + parser.add_argument('--no-download', dest='download', default=True, + action='store_const', const=False, + help='Do not perform download test') + parser.add_argument('--no-upload', dest='upload', default=True, + action='store_const', const=False, + help='Do not perform upload test') + parser.add_argument('--single', default=False, action='store_true', + help='Only use a single connection instead of ' + 'multiple. This simulates a typical file ' + 'transfer.') + parser.add_argument('--bytes', dest='units', action='store_const', + const=('byte', 8), default=('bit', 1), + help='Display values in bytes instead of bits. Does ' + 'not affect the image generated by --share, nor ' + 'output from --json or --csv') + parser.add_argument('--share', action='store_true', + help='Generate and provide a URL to the speedtest.net ' + 'share results image, not displayed with --csv') + parser.add_argument('--simple', action='store_true', default=False, + help='Suppress verbose output, only show basic ' + 'information') + parser.add_argument('--csv', action='store_true', default=False, + help='Suppress verbose output, only show basic ' + 'information in CSV format. Speeds listed in ' + 'bit/s and not affected by --bytes') + parser.add_argument('--csv-delimiter', default=',', type=PARSER_TYPE_STR, + help='Single character delimiter to use in CSV ' + 'output. Default ","') + parser.add_argument('--csv-header', action='store_true', default=False, + help='Print CSV headers') + parser.add_argument('--json', action='store_true', default=False, + help='Suppress verbose output, only show basic ' + 'information in JSON format. Speeds listed in ' + 'bit/s and not affected by --bytes') + parser.add_argument('--list', action='store_true', + help='Display a list of speedtest.net servers ' + 'sorted by distance') + parser.add_argument('--server', type=PARSER_TYPE_INT, action='append', + help='Specify a server ID to test against. Can be ' + 'supplied multiple times') + parser.add_argument('--exclude', type=PARSER_TYPE_INT, action='append', + help='Exclude a server from selection. Can be ' + 'supplied multiple times') + parser.add_argument('--mini', help='URL of the Speedtest Mini server') + parser.add_argument('--source', help='Source IP address to bind to') + parser.add_argument('--timeout', default=10, type=PARSER_TYPE_FLOAT, + help='HTTP timeout in seconds. Default 10') + parser.add_argument('--secure', action='store_true', + help='Use HTTPS instead of HTTP when communicating ' + 'with speedtest.net operated servers') + parser.add_argument('--no-pre-allocate', dest='pre_allocate', + action='store_const', default=True, const=False, + help='Do not pre allocate upload data. Pre allocation ' + 'is enabled by default to improve upload ' + 'performance. To support systems with ' + 'insufficient memory, use this option to avoid a ' + 'MemoryError') + parser.add_argument('--version', action='store_true', + help='Show the version number and exit') + parser.add_argument('--debug', action='store_true', + help=ARG_SUPPRESS, default=ARG_SUPPRESS) + + options = parser.parse_args() + if isinstance(options, tuple): + args = options[0] + else: + args = options + return args + + +def validate_optional_args(args): + """Check if an argument was provided that depends on a module that may + not be part of the Python standard library. + + If such an argument is supplied, and the module does not exist, exit + with an error stating which module is missing. + """ + optional_args = { + 'json': ('json/simplejson python module', json), + 'secure': ('SSL support', HTTPSConnection), + } + + for arg, info in optional_args.items(): + if getattr(args, arg, False) and info[1] is None: + raise SystemExit('%s is not installed. --%s is ' + 'unavailable' % (info[0], arg)) + + +def printer(string, quiet=False, debug=False, error=False, **kwargs): + """Helper function print a string with various features""" + + if debug and not DEBUG: + return + + if debug: + if sys.stdout.isatty(): + out = '\033[1;30mDEBUG: %s\033[0m' % string + else: + out = 'DEBUG: %s' % string + else: + out = string + + if error: + kwargs['file'] = sys.stderr + + if not quiet: + print_(out, **kwargs) + + +def shell(): + """Run the full speedtest.net test""" + + global DEBUG + shutdown_event = threading.Event() + + signal.signal(signal.SIGINT, ctrl_c(shutdown_event)) + + args = parse_args() + + # Print the version and exit + if args.version: + version() + + if not args.download and not args.upload: + raise SpeedtestCLIError('Cannot supply both --no-download and ' + '--no-upload') + + if len(args.csv_delimiter) != 1: + raise SpeedtestCLIError('--csv-delimiter must be a single character') + + if args.csv_header: + csv_header(args.csv_delimiter) + + validate_optional_args(args) + + debug = getattr(args, 'debug', False) + if debug == 'SUPPRESSHELP': + debug = False + if debug: + DEBUG = True + + if args.simple or args.csv or args.json: + quiet = True + else: + quiet = False + + if args.csv or args.json: + machine_format = True + else: + machine_format = False + + # Don't set a callback if we are running quietly + if quiet or debug: + callback = do_nothing + else: + callback = print_dots(shutdown_event) + + printer('', quiet) + try: + speedtest = Speedtest( + source_address=args.source, + timeout=args.timeout, + secure=args.secure + ) + except (ConfigRetrievalError,) + HTTP_ERRORS: + printer('Cannot retrieve speedtest configuration', error=True) + raise SpeedtestCLIError(get_exception()) + + if args.list: + try: + speedtest.get_servers() + except (ServersRetrievalError,) + HTTP_ERRORS: + printer('Cannot retrieve speedtest server list', error=True) + raise SpeedtestCLIError(get_exception()) + + for _, servers in sorted(speedtest.servers.items()): + for server in servers: + line = ('%(id)5s) %(sponsor)s (%(name)s, %(country)s) ' + '[%(d)0.2f km]' % server) + try: + printer(line) + except IOError: + e = get_exception() + if e.errno != errno.EPIPE: + raise + sys.exit(0) + + printer('*๐Ÿ”ญ Testing From %(isp)s...*\n' % speedtest.config['client'], + quiet) + + if not args.mini: + printer('๐Ÿ“‘ Retrieving speedtest.net server list...', quiet) + try: + speedtest.get_servers(servers=args.server, exclude=args.exclude) + except NoMatchedServers: + raise SpeedtestCLIError( + 'No matched servers: %s' % + ', '.join('%s' % s for s in args.server) + ) + except (ServersRetrievalError,) + HTTP_ERRORS: + printer('Cannot retrieve speedtest server list', error=True) + raise SpeedtestCLIError(get_exception()) + except InvalidServerIDType: + raise SpeedtestCLIError( + '%s is an invalid server type, must ' + 'be an int' % ', '.join('%s' % s for s in args.server) + ) + + if args.server and len(args.server) == 1: + printer('๐Ÿ“ฐ Retrieving information for the selected server...', quiet) + else: + printer('๐Ÿ”Ž Selecting best server based on ping...', quiet) + speedtest.get_best_server() + elif args.mini: + speedtest.get_best_server(speedtest.set_mini_server(args.mini)) + + results = speedtest.results + + printer('\n...................................................................................\n๐Ÿฌ *Hosted By :* %(sponsor)s\n๐ŸŒŽ *Location :* %(name)s [%(d)0.2f km] ' + '\nโšก *Ping :* %(latency)s ms' % results.server, quiet) + + if args.download: + printer('', quiet, + end=('', '\n')[bool(debug)]) + speedtest.download( + callback=callback, + threads=(None, 1)[args.single] + ) + printer('*๐Ÿ“ซ Download:* %0.2f M%s/s' % + ((results.download / 1000.0 / 1000.0) / args.units[1], + args.units[0]), + quiet) + else: + printer('Skipping download test', quiet) + + if args.upload: + speedtest.upload() + printer('*๐Ÿš€ Upload:* %0.2f M%s/s' % + ((results.upload / 1000.0 / 1000.0) / args.units[1], + args.units[0]), + quiet) + printer("\n...................................................................................\nโ–ถ๏ธŽ POWERED BY *OOKLA*\nโ–ถ๏ธŽ Script By *rizkiirfan*") + else: + printer('Skipping upload test', quiet) + + printer('Results:\n%r' % results.dict(), debug=True) + + if not args.simple and args.share: + results.share() + + if args.simple: + printer('Ping: %s ms\nDownload: %0.2f M%s/s\nUpload: %0.2f M%s/s' % + (results.ping, + (results.download / 1000.0 / 1000.0) / args.units[1], + args.units[0], + (results.upload / 1000.0 / 1000.0) / args.units[1], + args.units[0])) + elif args.csv: + printer(results.csv(delimiter=args.csv_delimiter)) + elif args.json: + printer(results.json()) + + if args.share and not machine_format: + printer('Share results: %s' % results.share()) + + +def main(): + try: + shell() + except KeyboardInterrupt: + printer('\nCancelling...', error=True) + except (SpeedtestException, SystemExit): + e = get_exception() + # Ignore a successful exit, or argparse exit + if getattr(e, 'code', 1) not in (0, 2): + msg = '%s' % e + if not msg: + msg = '%r' % e + raise SystemExit('ERROR: %s' % msg) + + +if __name__ == '__main__': + main() diff --git a/src/Aesthetic/Aesthetic_000.jpeg b/src/Aesthetic/Aesthetic_000.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..cbddcc1dd4f916e194bcb0616502673d39237f0c Binary files /dev/null and b/src/Aesthetic/Aesthetic_000.jpeg differ diff --git a/src/Aesthetic/Aesthetic_001.jpg b/src/Aesthetic/Aesthetic_001.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4d51b7019d885e1d49ba6f091579729ab2796666 Binary files /dev/null and b/src/Aesthetic/Aesthetic_001.jpg differ diff --git a/src/Aesthetic/Aesthetic_002.jpg b/src/Aesthetic/Aesthetic_002.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1c3b91f85bc83c84de23935f52e849e9f46f4a30 Binary files /dev/null and b/src/Aesthetic/Aesthetic_002.jpg differ diff --git a/src/LICENSE b/src/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64 --- /dev/null +++ b/src/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/font/212BabyGirl.otf b/src/font/212BabyGirl.otf new file mode 100644 index 0000000000000000000000000000000000000000..91fdbbd01b14a29db0f50f4fc91a28cd485969ac Binary files /dev/null and b/src/font/212BabyGirl.otf differ diff --git a/src/font/212LeahleeSans.ttf b/src/font/212LeahleeSans.ttf new file mode 100644 index 0000000000000000000000000000000000000000..68372182efb2cba5d34a8ee2abf109b704b27d8b Binary files /dev/null and b/src/font/212LeahleeSans.ttf differ diff --git a/src/font/99HandWritting.ttf b/src/font/99HandWritting.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ccd2bd0236e6f558d0c904a5e9ef02e3b0c49356 Binary files /dev/null and b/src/font/99HandWritting.ttf differ diff --git a/src/font/ACallingFontDby7NTypes.otf b/src/font/ACallingFontDby7NTypes.otf new file mode 100644 index 0000000000000000000000000000000000000000..8dd02819601ebf22ac88761ef7f429cd243b7151 Binary files /dev/null and b/src/font/ACallingFontDby7NTypes.otf differ diff --git a/src/font/ACasualHandwrittenPenNoncommercial.ttf b/src/font/ACasualHandwrittenPenNoncommercial.ttf new file mode 100644 index 0000000000000000000000000000000000000000..300a40debca04ba41fe2a257dba4a038fd4898d8 Binary files /dev/null and b/src/font/ACasualHandwrittenPenNoncommercial.ttf differ diff --git a/src/font/ADayinSeptember.otf b/src/font/ADayinSeptember.otf new file mode 100644 index 0000000000000000000000000000000000000000..02f249e7dbfbfbed3e67da6aedf5de70fcaa62ae Binary files /dev/null and b/src/font/ADayinSeptember.otf differ diff --git a/src/font/ASMelanieHandwritting.ttf b/src/font/ASMelanieHandwritting.ttf new file mode 100644 index 0000000000000000000000000000000000000000..33e028eb51b787ff75a55ce66351e41bc3ce06b5 Binary files /dev/null and b/src/font/ASMelanieHandwritting.ttf differ diff --git a/src/font/Alittlesunshine.ttf b/src/font/Alittlesunshine.ttf new file mode 100644 index 0000000000000000000000000000000000000000..de7d500b271a4e6b3f611d929b1638593c786b3c Binary files /dev/null and b/src/font/Alittlesunshine.ttf differ diff --git a/src/font/And-This-Happened.ttf b/src/font/And-This-Happened.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ea8886b22f5152487d1b59dbca70a1f22a3ab5fa Binary files /dev/null and b/src/font/And-This-Happened.ttf differ diff --git a/src/font/AvenirCondensedHand.ttf b/src/font/AvenirCondensedHand.ttf new file mode 100644 index 0000000000000000000000000000000000000000..763366c50c4193fa08f34723799504d1b60a973c Binary files /dev/null and b/src/font/AvenirCondensedHand.ttf differ diff --git a/src/font/Avocados.ttf b/src/font/Avocados.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6b671055bd261eb452a0ab96f348eccd49cf5ca0 Binary files /dev/null and b/src/font/Avocados.ttf differ diff --git a/src/font/BabyDoll.ttf b/src/font/BabyDoll.ttf new file mode 100644 index 0000000000000000000000000000000000000000..49aaa04888b44518e17153609debe7e853b0f290 Binary files /dev/null and b/src/font/BabyDoll.ttf differ diff --git a/src/font/BattleOfKingsRegular.ttf b/src/font/BattleOfKingsRegular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1e51ba6273a032c344cef8b6b91102a01ad59efb Binary files /dev/null and b/src/font/BattleOfKingsRegular.ttf differ diff --git a/src/font/BrayNotes.ttf b/src/font/BrayNotes.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6d0bc242e67f39a8d28489ec183272b29f6df0fb Binary files /dev/null and b/src/font/BrayNotes.ttf differ diff --git a/src/font/Convered-By-Your-Grace.ttf b/src/font/Convered-By-Your-Grace.ttf new file mode 100644 index 0000000000000000000000000000000000000000..58448e1e2f23cc9ef06ec8191666816a50ccc4b6 Binary files /dev/null and b/src/font/Convered-By-Your-Grace.ttf differ diff --git a/src/font/Edoms-Handwritting-Normal.ttf b/src/font/Edoms-Handwritting-Normal.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1ff10ce42390043728157a5ca79fc859b21b7f73 Binary files /dev/null and b/src/font/Edoms-Handwritting-Normal.ttf differ diff --git a/src/font/Futura Bold Italic font.ttf b/src/font/Futura Bold Italic font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..095bbdff60d46dd14809f8d65cca82c5e5ff10a5 Binary files /dev/null and b/src/font/Futura Bold Italic font.ttf differ diff --git a/src/font/Futura Bold font.ttf b/src/font/Futura Bold font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0725025e5a903c1020a16f006ff760f04a717316 Binary files /dev/null and b/src/font/Futura Bold font.ttf differ diff --git a/src/font/Futura Book Italic font.ttf b/src/font/Futura Book Italic font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..99cd8a6ada31ce1012eca2e05355d30ec6d82c52 Binary files /dev/null and b/src/font/Futura Book Italic font.ttf differ diff --git a/src/font/Futura Book font.ttf b/src/font/Futura Book font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8abcf15912a589ac2172edb4135f4c58369d8132 Binary files /dev/null and b/src/font/Futura Book font.ttf differ diff --git a/src/font/Futura Extra Black font.ttf b/src/font/Futura Extra Black font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f6f1b39462897544e17fdcc4623b6dc74997c623 Binary files /dev/null and b/src/font/Futura Extra Black font.ttf differ diff --git a/src/font/Futura Heavy Italic font.ttf b/src/font/Futura Heavy Italic font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8a49a3695cb63dc65a89c8c8ff76622a2fd30a92 Binary files /dev/null and b/src/font/Futura Heavy Italic font.ttf differ diff --git a/src/font/Futura Heavy font.ttf b/src/font/Futura Heavy font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..97eded13a2e44285191f18a635967fe8803b97ce Binary files /dev/null and b/src/font/Futura Heavy font.ttf differ diff --git a/src/font/Futura Light Italic font.ttf b/src/font/Futura Light Italic font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cfb5ce4132db75fe54f36acb3f77d3c84d57a29f Binary files /dev/null and b/src/font/Futura Light Italic font.ttf differ diff --git a/src/font/Futura Light font.ttf b/src/font/Futura Light font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..250162f49392b2fd004193988d4eb76d8fb6c02c Binary files /dev/null and b/src/font/Futura Light font.ttf differ diff --git a/src/font/Futura Medium Italic font.ttf b/src/font/Futura Medium Italic font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..81878d5f4c26d8e00cb18f86e626795d2df86c3c Binary files /dev/null and b/src/font/Futura Medium Italic font.ttf differ diff --git a/src/font/Futura XBlk BT.ttf b/src/font/Futura XBlk BT.ttf new file mode 100644 index 0000000000000000000000000000000000000000..06a53a8e162704d4d5b8c998c93c082249641d7e Binary files /dev/null and b/src/font/Futura XBlk BT.ttf differ diff --git a/src/font/Futura-CondensedLight.otf b/src/font/Futura-CondensedLight.otf new file mode 100644 index 0000000000000000000000000000000000000000..aebc4d947c37f67809b16d225ad4bf8179cdff69 Binary files /dev/null and b/src/font/Futura-CondensedLight.otf differ diff --git a/src/font/GloriaHallelujah-Regular.ttf b/src/font/GloriaHallelujah-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..98cf0440cd1feaa7a415ed0dbb4d90770e255608 Binary files /dev/null and b/src/font/GloriaHallelujah-Regular.ttf differ diff --git a/src/font/HandwritingCR-2.ttf b/src/font/HandwritingCR-2.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a8b904d301a7ee73b2de544df49249a29dd73010 Binary files /dev/null and b/src/font/HandwritingCR-2.ttf differ diff --git a/src/font/Kempton-Demo-Handwritting.ttf b/src/font/Kempton-Demo-Handwritting.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a44766bc46e8d681f53b2f9c0cd57c4e1dcba6de Binary files /dev/null and b/src/font/Kempton-Demo-Handwritting.ttf differ diff --git a/src/font/MyHandsareHoldingYou.ttf b/src/font/MyHandsareHoldingYou.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9b90a016a4215688862af86ed618ecb353d45766 Binary files /dev/null and b/src/font/MyHandsareHoldingYou.ttf differ diff --git a/src/font/My_handwriting.ttf b/src/font/My_handwriting.ttf new file mode 100644 index 0000000000000000000000000000000000000000..711f25170b31e8e030fea0cfd5350e667cac88d1 Binary files /dev/null and b/src/font/My_handwriting.ttf differ diff --git a/src/font/Nadeznas-Handwritting.ttf b/src/font/Nadeznas-Handwritting.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7b0c08f603ef1df118e08707948425010aedd8d4 Binary files /dev/null and b/src/font/Nadeznas-Handwritting.ttf differ diff --git a/src/font/Roboto-Black.ttf b/src/font/Roboto-Black.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2d452383651a6ef279743a9926b90234b8b79366 Binary files /dev/null and b/src/font/Roboto-Black.ttf differ diff --git a/src/font/Roboto-BlackItalic.ttf b/src/font/Roboto-BlackItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..29a4359ed0ba945a1af87078f3c0f08d298b0285 Binary files /dev/null and b/src/font/Roboto-BlackItalic.ttf differ diff --git a/src/font/Roboto-Bold.ttf b/src/font/Roboto-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d998cf5b468413ca1c950096dc9d0f5dfdb1359f Binary files /dev/null and b/src/font/Roboto-Bold.ttf differ diff --git a/src/font/Roboto-BoldItalic.ttf b/src/font/Roboto-BoldItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b4e22103936078c50cdc7ddf7a3e2d51dd2d3c44 Binary files /dev/null and b/src/font/Roboto-BoldItalic.ttf differ diff --git a/src/font/Roboto-Italic.ttf b/src/font/Roboto-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5b390ff950e6539bdfd4d84265fdb01e0c35f291 Binary files /dev/null and b/src/font/Roboto-Italic.ttf differ diff --git a/src/font/Roboto-Light.ttf b/src/font/Roboto-Light.ttf new file mode 100644 index 0000000000000000000000000000000000000000..35267989deca17116c70c987e90035303e2e3404 Binary files /dev/null and b/src/font/Roboto-Light.ttf differ diff --git a/src/font/Roboto-LightItalic.ttf b/src/font/Roboto-LightItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..46e9bf7c95adb27c042d0646deb1f8a3beb8087e Binary files /dev/null and b/src/font/Roboto-LightItalic.ttf differ diff --git a/src/font/Roboto-Medium.ttf b/src/font/Roboto-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f714a514d94e495095e2f1e525a341eade187c17 Binary files /dev/null and b/src/font/Roboto-Medium.ttf differ diff --git a/src/font/Roboto-MediumItalic.ttf b/src/font/Roboto-MediumItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5dc6a2dc6c38c1b1ee54b0ad5072c6e29968ed24 Binary files /dev/null and b/src/font/Roboto-MediumItalic.ttf differ diff --git a/src/font/Roboto-Regular.ttf b/src/font/Roboto-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2b6392ffe8712b9c5450733320cd220d6c0f4bce Binary files /dev/null and b/src/font/Roboto-Regular.ttf differ diff --git a/src/font/Roboto-Thin.ttf b/src/font/Roboto-Thin.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4e797cf7ef9758a9209fae4e0b07e6b186b2c69d Binary files /dev/null and b/src/font/Roboto-Thin.ttf differ diff --git a/src/font/Roboto-ThinItalic.ttf b/src/font/Roboto-ThinItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..eea836f4a37fea4afe61d6483692dc431a9b1c20 Binary files /dev/null and b/src/font/Roboto-ThinItalic.ttf differ diff --git a/src/font/ShadowsIntoLight-Regular.ttf b/src/font/ShadowsIntoLight-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b7bc796b1260871c1893f410fd19eeca9e416ad7 Binary files /dev/null and b/src/font/ShadowsIntoLight-Regular.ttf differ diff --git a/src/font/Zahraaa.ttf b/src/font/Zahraaa.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a1509139deb6f7f429fa7678e610225a5262eff7 Binary files /dev/null and b/src/font/Zahraaa.ttf differ diff --git a/src/font/angelina.ttf b/src/font/angelina.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fe880ab9109467e86eed45cf29feb297eef4686e Binary files /dev/null and b/src/font/angelina.ttf differ diff --git a/src/font/futur.ttf b/src/font/futur.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cde2c37adfe93844d940b3a92d01d0d7de94d7c9 Binary files /dev/null and b/src/font/futur.ttf differ diff --git a/src/font/futura light bt.ttf b/src/font/futura light bt.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3fb654f1566b2e20ee7eb5639874513ebc293600 Binary files /dev/null and b/src/font/futura light bt.ttf differ diff --git a/src/font/futura medium bt.ttf b/src/font/futura medium bt.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1ef199e9153a580ea105cca6896d954acbc35f63 Binary files /dev/null and b/src/font/futura medium bt.ttf differ diff --git a/src/font/futura medium condensed bt.ttf b/src/font/futura medium condensed bt.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7c3fe9e37ba50c240f4f9dc1bda7790197cc4b9b Binary files /dev/null and b/src/font/futura medium condensed bt.ttf differ diff --git a/src/font/michellehandwritting.ttf b/src/font/michellehandwritting.ttf new file mode 100644 index 0000000000000000000000000000000000000000..88e7a5f3d444134884fa1807531bc63680406b4b Binary files /dev/null and b/src/font/michellehandwritting.ttf differ diff --git a/src/kertas/magernulis1.jpg b/src/kertas/magernulis1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d4acb2c8a36cc5efbbdb55245a0864c89cebeb21 Binary files /dev/null and b/src/kertas/magernulis1.jpg differ diff --git a/test.js b/test.js new file mode 100644 index 0000000000000000000000000000000000000000..b58ec685dce4656e5d978eb4ecee46fd61a690d6 --- /dev/null +++ b/test.js @@ -0,0 +1,32 @@ +let fs = require('fs') +let path = require('path') +let assert = require('assert') +let { spawn } = require('child_process') + +const RESET = '\x1b[0m' +const BRIGHT = '\x1b[1m' +const DIM = '\x1b[2m' +const RED = '\x1b[31m' +const GREEN = '\x1b[32m' +const BLUE = '\x1b[34m' + +let folders = ['.', ...Object.keys(require('./package.json').directories)] +let files = [] + +for (let folder of folders) { + for (let file of fs.readdirSync(folder).filter(v => v.endsWith('.js'))) { + files.push(path.resolve(path.join(folder, file))) + } +} + +for (let file of files) { + if (file == path.join(__dirname, __filename)) continue + + console.error(`${BRIGHT}${BLUE}Checking${RESET} ${file}`) // Highlight "Checking" in console logs with blue color + spawn(process.argv0, ['-c', file]) + .on('close', () => { + assert.ok(file) + console.log(`${BRIGHT}${GREEN}Done${RESET} ${file} ${BRIGHT}${Math.floor(Math.random() * 100)}%${RESET}`) + }) + .stderr.on('data', chunk => assert.ok(chunk.length < 1, `${RED}${DIM}${file}\n\n${chunk}${RESET}`)) +} diff --git a/tmp/.gitkeep b/tmp/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/tmp/.gitkeep @@ -0,0 +1 @@ + diff --git a/views/img/dark/balloon_centered_normal.9.png b/views/img/dark/balloon_centered_normal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a43905033c57907958f3d1e0e08e59d1d22a6924 Binary files /dev/null and b/views/img/dark/balloon_centered_normal.9.png differ diff --git a/views/img/dark/balloon_centered_pressed.9.png b/views/img/dark/balloon_centered_pressed.9.png new file mode 100644 index 0000000000000000000000000000000000000000..74e12dd72e6d69fcc4ad6f9bdff861e665518641 Binary files /dev/null and b/views/img/dark/balloon_centered_pressed.9.png differ diff --git a/views/img/dark/balloon_centered_shadow.9.png b/views/img/dark/balloon_centered_shadow.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0e448b036ed167c4132ca69ef66322cb7721deb4 Binary files /dev/null and b/views/img/dark/balloon_centered_shadow.9.png differ diff --git a/views/img/dark/balloon_incoming_frame.9.png b/views/img/dark/balloon_incoming_frame.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0b648e38aa9e6c123c6eebc75595e9acbc018158 Binary files /dev/null and b/views/img/dark/balloon_incoming_frame.9.png differ diff --git a/views/img/dark/balloon_incoming_normal.9.png b/views/img/dark/balloon_incoming_normal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6d305f3becfa32110125bf44f180f67f82b4b1a3 Binary files /dev/null and b/views/img/dark/balloon_incoming_normal.9.png differ diff --git a/views/img/dark/balloon_incoming_normal_ext.9.png b/views/img/dark/balloon_incoming_normal_ext.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5c4d800c27756de185e8255dfca84f93f0759aef Binary files /dev/null and b/views/img/dark/balloon_incoming_normal_ext.9.png differ diff --git a/views/img/dark/balloon_incoming_normal_stkr.9.png b/views/img/dark/balloon_incoming_normal_stkr.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e0336f09a1ef93df388c1f851fed46a0d2111958 Binary files /dev/null and b/views/img/dark/balloon_incoming_normal_stkr.9.png differ diff --git a/views/img/dark/balloon_incoming_pressed.9.png b/views/img/dark/balloon_incoming_pressed.9.png new file mode 100644 index 0000000000000000000000000000000000000000..7cdb3602a80abf311f6007d78024c0977ece7573 Binary files /dev/null and b/views/img/dark/balloon_incoming_pressed.9.png differ diff --git a/views/img/dark/balloon_incoming_pressed_ext.9.png b/views/img/dark/balloon_incoming_pressed_ext.9.png new file mode 100644 index 0000000000000000000000000000000000000000..57ffde9a981e878cfd7129b9862bb5d3f41f807b Binary files /dev/null and b/views/img/dark/balloon_incoming_pressed_ext.9.png differ diff --git a/views/img/dark/balloon_live_location_incoming_frame.9.png b/views/img/dark/balloon_live_location_incoming_frame.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8e2033f52faf096badc10be3fe886be72d4bb040 Binary files /dev/null and b/views/img/dark/balloon_live_location_incoming_frame.9.png differ diff --git a/views/img/dark/balloon_live_location_outgoing_frame.9.png b/views/img/dark/balloon_live_location_outgoing_frame.9.png new file mode 100644 index 0000000000000000000000000000000000000000..10cd935dc833403505870d0f947e7a5a0a4a72a9 Binary files /dev/null and b/views/img/dark/balloon_live_location_outgoing_frame.9.png differ diff --git a/views/img/dark/balloon_outgoing_frame.9.png b/views/img/dark/balloon_outgoing_frame.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8e205348d3f48f10ee390326544288a57d3c433c Binary files /dev/null and b/views/img/dark/balloon_outgoing_frame.9.png differ diff --git a/views/img/dark/balloon_outgoing_normal.9.png b/views/img/dark/balloon_outgoing_normal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1afa8bfa9cc493b49dfd56d057a40d9750fad3be Binary files /dev/null and b/views/img/dark/balloon_outgoing_normal.9.png differ diff --git a/views/img/dark/balloon_outgoing_normal_ext.9.png b/views/img/dark/balloon_outgoing_normal_ext.9.png new file mode 100644 index 0000000000000000000000000000000000000000..44646d856b96316e6a7a16e12e7cb22c1ac6437e Binary files /dev/null and b/views/img/dark/balloon_outgoing_normal_ext.9.png differ diff --git a/views/img/dark/balloon_outgoing_normal_stkr.9.png b/views/img/dark/balloon_outgoing_normal_stkr.9.png new file mode 100644 index 0000000000000000000000000000000000000000..69f9ca8a72c605fc2256be1e433c67fb8b58caf9 Binary files /dev/null and b/views/img/dark/balloon_outgoing_normal_stkr.9.png differ diff --git a/views/img/dark/balloon_outgoing_pressed.9.png b/views/img/dark/balloon_outgoing_pressed.9.png new file mode 100644 index 0000000000000000000000000000000000000000..39142d2d173781e136402f29a8162d3e34bd2fb9 Binary files /dev/null and b/views/img/dark/balloon_outgoing_pressed.9.png differ diff --git a/views/img/dark/balloon_outgoing_pressed_ext.9.png b/views/img/dark/balloon_outgoing_pressed_ext.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9792daf8cea2b341d4899072457f679d1da4718a Binary files /dev/null and b/views/img/dark/balloon_outgoing_pressed_ext.9.png differ diff --git a/views/img/light/balloon_centered_normal.9.png b/views/img/light/balloon_centered_normal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a43905033c57907958f3d1e0e08e59d1d22a6924 Binary files /dev/null and b/views/img/light/balloon_centered_normal.9.png differ diff --git a/views/img/light/balloon_centered_pressed.9.png b/views/img/light/balloon_centered_pressed.9.png new file mode 100644 index 0000000000000000000000000000000000000000..74e12dd72e6d69fcc4ad6f9bdff861e665518641 Binary files /dev/null and b/views/img/light/balloon_centered_pressed.9.png differ diff --git a/views/img/light/balloon_centered_shadow.9.png b/views/img/light/balloon_centered_shadow.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0e448b036ed167c4132ca69ef66322cb7721deb4 Binary files /dev/null and b/views/img/light/balloon_centered_shadow.9.png differ diff --git a/views/img/light/balloon_incoming_frame.9.png b/views/img/light/balloon_incoming_frame.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0b648e38aa9e6c123c6eebc75595e9acbc018158 Binary files /dev/null and b/views/img/light/balloon_incoming_frame.9.png differ diff --git a/views/img/light/balloon_incoming_normal.9.png b/views/img/light/balloon_incoming_normal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6d305f3becfa32110125bf44f180f67f82b4b1a3 Binary files /dev/null and b/views/img/light/balloon_incoming_normal.9.png differ diff --git a/views/img/light/balloon_incoming_normal_ext.9.png b/views/img/light/balloon_incoming_normal_ext.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5c4d800c27756de185e8255dfca84f93f0759aef Binary files /dev/null and b/views/img/light/balloon_incoming_normal_ext.9.png differ diff --git a/views/img/light/balloon_incoming_normal_stkr.9.png b/views/img/light/balloon_incoming_normal_stkr.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e0336f09a1ef93df388c1f851fed46a0d2111958 Binary files /dev/null and b/views/img/light/balloon_incoming_normal_stkr.9.png differ diff --git a/views/img/light/balloon_incoming_pressed.9.png b/views/img/light/balloon_incoming_pressed.9.png new file mode 100644 index 0000000000000000000000000000000000000000..7cdb3602a80abf311f6007d78024c0977ece7573 Binary files /dev/null and b/views/img/light/balloon_incoming_pressed.9.png differ diff --git a/views/img/light/balloon_incoming_pressed_ext.9.png b/views/img/light/balloon_incoming_pressed_ext.9.png new file mode 100644 index 0000000000000000000000000000000000000000..57ffde9a981e878cfd7129b9862bb5d3f41f807b Binary files /dev/null and b/views/img/light/balloon_incoming_pressed_ext.9.png differ diff --git a/views/img/light/balloon_live_location_incoming_frame.9.png b/views/img/light/balloon_live_location_incoming_frame.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8e2033f52faf096badc10be3fe886be72d4bb040 Binary files /dev/null and b/views/img/light/balloon_live_location_incoming_frame.9.png differ diff --git a/views/img/light/balloon_live_location_outgoing_frame.9.png b/views/img/light/balloon_live_location_outgoing_frame.9.png new file mode 100644 index 0000000000000000000000000000000000000000..10cd935dc833403505870d0f947e7a5a0a4a72a9 Binary files /dev/null and b/views/img/light/balloon_live_location_outgoing_frame.9.png differ diff --git a/views/img/light/balloon_outgoing_frame.9.png b/views/img/light/balloon_outgoing_frame.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8e205348d3f48f10ee390326544288a57d3c433c Binary files /dev/null and b/views/img/light/balloon_outgoing_frame.9.png differ diff --git a/views/img/light/balloon_outgoing_normal.9.png b/views/img/light/balloon_outgoing_normal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1afa8bfa9cc493b49dfd56d057a40d9750fad3be Binary files /dev/null and b/views/img/light/balloon_outgoing_normal.9.png differ diff --git a/views/img/light/balloon_outgoing_normal_ext.9.png b/views/img/light/balloon_outgoing_normal_ext.9.png new file mode 100644 index 0000000000000000000000000000000000000000..44646d856b96316e6a7a16e12e7cb22c1ac6437e Binary files /dev/null and b/views/img/light/balloon_outgoing_normal_ext.9.png differ diff --git a/views/img/light/balloon_outgoing_normal_stkr.9.png b/views/img/light/balloon_outgoing_normal_stkr.9.png new file mode 100644 index 0000000000000000000000000000000000000000..69f9ca8a72c605fc2256be1e433c67fb8b58caf9 Binary files /dev/null and b/views/img/light/balloon_outgoing_normal_stkr.9.png differ diff --git a/views/img/light/balloon_outgoing_pressed.9.png b/views/img/light/balloon_outgoing_pressed.9.png new file mode 100644 index 0000000000000000000000000000000000000000..39142d2d173781e136402f29a8162d3e34bd2fb9 Binary files /dev/null and b/views/img/light/balloon_outgoing_pressed.9.png differ diff --git a/views/img/light/balloon_outgoing_pressed_ext.9.png b/views/img/light/balloon_outgoing_pressed_ext.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9792daf8cea2b341d4899072457f679d1da4718a Binary files /dev/null and b/views/img/light/balloon_outgoing_pressed_ext.9.png differ diff --git a/views/index.html b/views/index.html new file mode 100644 index 0000000000000000000000000000000000000000..5d874fe40ae67fa8d2ca30561c5c9521933840dd --- /dev/null +++ b/views/index.html @@ -0,0 +1,29 @@ + + + Web + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + diff --git a/views/index.js b/views/index.js new file mode 100644 index 0000000000000000000000000000000000000000..8f5b955d8be30828e305a4275ba97719ce0e9de6 --- /dev/null +++ b/views/index.js @@ -0,0 +1,11 @@ +window.onload = () => { +let chat = document.querySelector('div.container-fluid') +function addMsg(obj) { + let html = document.createElement('span') + html.className = 'msg' + html.innerHTML = obj + chat.appendChild(html) +} + +window.onclick = () => addMsg(12) +} diff --git a/views/style.css b/views/style.css new file mode 100644 index 0000000000000000000000000000000000000000..31a58b0008753bcb1c368b604bee5e9493d5cc1f --- /dev/null +++ b/views/style.css @@ -0,0 +1,3 @@ +span.msg { +} +