├── Mzazi ├── me ├── warn.js ├── tempnumber.js ├── botFunctions.js └── fancy.js ├── Media ├── me.jpg ├── love │ ├── me.js │ ├── gay.jpg │ ├── deep.jpg │ ├── funny.jpg │ ├── lesbian.jpg │ ├── romantic.jpg │ └── heartbreak.jpg ├── alive.mp3 ├── menu.mp3 ├── menu.mp4 └── mzazi.jpg ├── action ├── me.js ├── auth.js └── events.js ├── lib ├── me.js ├── bardSession.json ├── imgur.js ├── mzaziquotely.js ├── remini.js ├── mzaziupload.js ├── mzaziexif.js └── mzazifunc.js ├── pixel ├── Me.js ├── sc.js └── index.html ├── session └── creds.json ├── Procfile ├── LICENSE ├── pairing.js ├── README.md ├── set.js ├── package.json ├── tictactoe.js ├── app.json └── index.js /Mzazi/me: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Media/me.jpg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /action/me.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /lib/me.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /pixel/Me.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Media/love/me.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /session/creds.json: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: node index.js 2 | -------------------------------------------------------------------------------- /Media/alive.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeddyDommie/MZAZI-XMD/HEAD/Media/alive.mp3 -------------------------------------------------------------------------------- /Media/menu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeddyDommie/MZAZI-XMD/HEAD/Media/menu.mp3 -------------------------------------------------------------------------------- /Media/menu.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeddyDommie/MZAZI-XMD/HEAD/Media/menu.mp4 -------------------------------------------------------------------------------- /Media/mzazi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeddyDommie/MZAZI-XMD/HEAD/Media/mzazi.jpg -------------------------------------------------------------------------------- /Media/love/gay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeddyDommie/MZAZI-XMD/HEAD/Media/love/gay.jpg -------------------------------------------------------------------------------- /Media/love/deep.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeddyDommie/MZAZI-XMD/HEAD/Media/love/deep.jpg -------------------------------------------------------------------------------- /Media/love/funny.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeddyDommie/MZAZI-XMD/HEAD/Media/love/funny.jpg -------------------------------------------------------------------------------- /Media/love/lesbian.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeddyDommie/MZAZI-XMD/HEAD/Media/love/lesbian.jpg -------------------------------------------------------------------------------- /Media/love/romantic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeddyDommie/MZAZI-XMD/HEAD/Media/love/romantic.jpg -------------------------------------------------------------------------------- /Media/love/heartbreak.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeddyDommie/MZAZI-XMD/HEAD/Media/love/heartbreak.jpg -------------------------------------------------------------------------------- /lib/bardSession.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "domain": ".google.com", 4 | "expirationDate": 1735304645.713204, 5 | "hostOnly": false, 6 | "httpOnly": true, 7 | "name": "__Secure-1PSID", 8 | "path": "/", 9 | "sameSite": "unspecified", 10 | "secure": true, 11 | "session": false, 12 | "storeId": "0", 13 | "value": "dQhhi48ceNMy2i5Ksoj3yOF2AyDj99sr3kXPGXNIRo893HVjPDlnUvlEoef5uisS4ttkqQ." 14 | } 15 | ] 16 | -------------------------------------------------------------------------------- /action/auth.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const session = process.env.SESSION || ''; 3 | async function authenticationn() { 4 | try { 5 | if (!fs.existsSync("./session/creds.json")) { 6 | console.log('Connecting...'); 7 | await fs.writeFileSync("./session/creds.json", atob(session), "utf8"); 8 | } else if (session !== "zokk") { 9 | await fs.writeFileSync("./session/creds.json", atob(session), "utf8"); 10 | } 11 | } catch (_0xf348d3) { 12 | console.log("Session is invalid: " + _0xf348d3); 13 | return; 14 | } 15 | } 16 | module.exports = authenticationn; 17 | -------------------------------------------------------------------------------- /lib/imgur.js: -------------------------------------------------------------------------------- 1 | const pkg = require('imgur'); 2 | const fs = require('fs'); 3 | 4 | const { ImgurClient } = pkg; 5 | 6 | const client = new ImgurClient({ clientId: 'a0113354926015a' }); 7 | 8 | async function uploadtoimgur(imagepath) { 9 | try { 10 | const response = await client.upload({ 11 | image: fs.createReadStream(imagepath), 12 | type: 'stream', 13 | }); 14 | 15 | let url = response.data.link; 16 | console.log(url); 17 | return url; 18 | } catch (error) { 19 | console.error('Error uploading image to Imgur:', error); 20 | throw error; 21 | } 22 | } 23 | 24 | module.exports = uploadtoimgur; 25 | -------------------------------------------------------------------------------- /pixel/sc.js: -------------------------------------------------------------------------------- 1 | fetch('/set.js') 2 | .then(response => response.text()) 3 | .then(data => { 4 | console.log('Received settings data:', data); 5 | const set = JSON.parse(data.replace(/module.exports = /, '')); 6 | console.log('Parsed settings:', set); 7 | 8 | 9 | 10 | const container = document.querySelector('.container'); 11 | 12 | 13 | const statusSection = document.createElement('div'); 14 | statusSection.innerHTML = ` 15 |

BOT STATUS

16 |

BOT NAME: ${set.botname}

17 |

MODE: ${set.mode}

18 |

PREFIX: ${set.prefix}

19 | `; 20 | container.appendChild(statusSection); 21 | }) 22 | .catch(error => console.error('Error fetching settings:', error)); 23 | -------------------------------------------------------------------------------- /lib/mzaziquotely.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios') 2 | const quote = async (text, name, avatar) => { 3 | const json = { 4 | 5 | "type": "quote", 6 | "format": "png", 7 | "backgroundColor": "#FFFFFF", 8 | "width": 512, 9 | "height": 768, 10 | "scale": 2, 11 | 12 | "messages": [ 13 | { 14 | "entities": [], 15 | "avatar": true, 16 | "from": { 17 | "id": 1, 18 | "name": name, 19 | "photo": { 20 | "url": avatar, 21 | } 22 | }, 23 | 24 | "text": text, 25 | "replyMessage": {} 26 | } 27 | ] 28 | 29 | }; 30 | 31 | const res = await axios.post('https://bot.lyo.su/quote/generate', 32 | json, 33 | 34 | { 35 | headers: {'Content-Type': 'application/json'} 36 | }) 37 | 38 | const buffer = Buffer.from(res.data.result.image, 'base64') 39 | return { 40 | 41 | status: "200", 42 | creator: "Mzazi", 43 | result: buffer 44 | } 45 | } 46 | 47 | module.exports = { quote } 48 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Mzazi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /pairing.js: -------------------------------------------------------------------------------- 1 | // Function to generate a WhatsApp pairing link 2 | const generatePairLink = async (client, m, text) => { 3 | try { 4 | let args = text.split(" "); 5 | if (args.length < 1) { 6 | return m.reply("❌ Please provide a client's WhatsApp number. Example: `.pair 254741388986`"); 7 | } 8 | 9 | let clientNumber = args[0].trim(); 10 | 11 | // Fetch the pair code from the pairing link API 12 | let response = await fetch(`https://mzazi-xmd-cjp7.onrender.com/generate?number=${clientNumber}`); 13 | let data = await response.json(); 14 | 15 | if (!data.success) { 16 | return m.reply("⚠️ Failed to generate pair code. Try again."); 17 | } 18 | 19 | let pairCode = data.pairCode; 20 | let pairLink = `https://mzazi-xmd-cjp7.onrender.com/pair?code=${pairCode}&number=${clientNumber}`; 21 | 22 | let message = `🔗 *Pairing Link Generated:*\n📌 Client: ${clientNumber}\n🔑 Code: ${pairCode}\n🌍 Link: ${pairLink}`; 23 | 24 | await client.sendMessage(m.chat, { text: message }); 25 | } catch (error) { 26 | console.error("Error in generatePairLink:", error); 27 | m.reply("⚠️ An error occurred while generating the pairing link."); 28 | } 29 | }; 30 | 31 | // Export the function 32 | module.exports = { generatePairLink }; 33 | -------------------------------------------------------------------------------- /Mzazi/warn.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | 4 | const storePath = path.join(__dirname, 'store.json'); 5 | 6 | // Read data from JSON file 7 | function readStore() { 8 | if (!fs.existsSync(storePath)) { 9 | return {}; 10 | } 11 | const data = fs.readFileSync(storePath); 12 | return JSON.parse(data); 13 | } 14 | 15 | // Write data to JSON file 16 | function writeStore(data) { 17 | fs.writeFileSync(storePath, JSON.stringify(data, null, 2)); 18 | } 19 | 20 | async function addUserWithWarnCount(jid) { 21 | const store = readStore(); 22 | if (!store[jid]) { 23 | store[jid] = { warn_count: 0 }; 24 | } 25 | store[jid].warn_count += 1; 26 | writeStore(store); 27 | console.log(`User ${jid} added or updated with a warn_count of ${store[jid].warn_count}.`); 28 | } 29 | 30 | async function getWarnCountByJID(jid) { 31 | const store = readStore(); 32 | if (store[jid]) { 33 | return store[jid].warn_count; 34 | } else { 35 | return 0; // If the user is not found, return 0 36 | } 37 | } 38 | 39 | async function resetWarnCountByJID(jid) { 40 | const store = readStore(); 41 | if (store[jid]) { 42 | store[jid].warn_count = 0; 43 | writeStore(store); 44 | console.log(`The warn_count for user ${jid} has been reset to 0.`); 45 | } 46 | } 47 | 48 | module.exports = { 49 | addUserWithWarnCount, 50 | getWarnCountByJID, 51 | resetWarnCountByJID, 52 | }; 53 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | MZAZI-XMD Logo 3 |

4 | 5 |

🌐 MZAZI-XMD | Multilingual Support

6 | 7 |

Select your preferred language below to view the official site:

8 | 9 |

10 | 11 | English 12 | 13 | 14 | Swahili 15 | 16 | 17 | Somali 18 | 19 | 20 | Arabic 21 | 22 | 23 | French 24 | 25 | 26 | Chinese 27 | 28 |

29 | 30 | --- 31 | 32 | ## ℹ️ About 33 | 34 | Each version above offers a localized experience of **MZAZI-XMD**. Feel free to explore in your preferred language. 35 | 36 | --- 37 | 38 | > Built with passion by MZAZI and contributors. 39 | -------------------------------------------------------------------------------- /lib/remini.js: -------------------------------------------------------------------------------- 1 | const FormData = require("form-data"); 2 | async function remini(_0x33b965, _0x34eff3) { 3 | return new Promise(async (_0x14db15, _0x267c15) => { 4 | let _0x45d85b = ['enhance', "recolor", "dehaze"]; 5 | if (_0x45d85b.includes(_0x34eff3)) { 6 | _0x34eff3 = _0x34eff3; 7 | } else { 8 | _0x34eff3 = _0x45d85b[0x0]; 9 | } 10 | let _0x370778 = new FormData(); 11 | let _0x5c019f = "https://inferenceengine.vyro.ai/" + _0x34eff3; 12 | _0x370778.append("model_version", 0x1, { 13 | 'Content-Transfer-Encoding': "binary", 14 | 'contentType': "multipart/form-data; charset=uttf-8" 15 | }); 16 | _0x370778.append('image', Buffer.from(_0x33b965), { 17 | 'filename': "enhance_image_body.jpg", 18 | 'contentType': "image/jpeg" 19 | }); 20 | _0x370778.submit({ 21 | 'url': _0x5c019f, 22 | 'host': "inferenceengine.vyro.ai", 23 | 'path': '/' + _0x34eff3, 24 | 'protocol': "https:", 25 | 'headers': { 26 | 'User-Agent': 'okhttp/4.9.3', 27 | 'Connection': "Keep-Alive", 28 | 'Accept-Encoding': "gzip" 29 | } 30 | }, function (_0x319120, _0x175e8d) { 31 | if (_0x319120) { 32 | _0x267c15(); 33 | } 34 | let _0x15e24d = []; 35 | _0x175e8d.on('data', function (_0x2918a5, _0x2d4e53) { 36 | _0x15e24d.push(_0x2918a5); 37 | }).on("end", () => { 38 | _0x14db15(Buffer.concat(_0x15e24d)); 39 | }); 40 | _0x175e8d.on("error", _0x90e19c => { 41 | _0x267c15(); 42 | }); 43 | }); 44 | }); 45 | } 46 | module.exports.remini = remini; 47 | -------------------------------------------------------------------------------- /Mzazi/tempnumber.js: -------------------------------------------------------------------------------- 1 | const TEMPNUMBER_API_URL = 'https://keith-api.vercel.app/api/tempnumber'; 2 | const TEMPNUMBER_CODE_API_URL = 'https://keith-api.vercel.app/api/tempnumbercode'; 3 | 4 | module.exports = async (context) => { 5 | const { client, m } = context; 6 | 7 | try { 8 | // Fetch tempnumber data 9 | const tempNumberResponse = await fetch(TEMPNUMBER_API_URL); 10 | if (!tempNumberResponse.ok) throw new Error('Failed to fetch tempnumber data'); 11 | const { result: tempNumbers } = await tempNumberResponse.json(); 12 | 13 | let message = '┏━━ 🎉 *TEMP NUMBERS* 🎉 ━━◆\n'; 14 | for (const { country, number, link } of tempNumbers) { 15 | message += ` 16 | ┃ *Country:* ${country} 17 | ┃ *Number:* ${number} 18 | ┃ *Link:* [View SMS](${link}) 19 | ┃ 20 | `; 21 | } 22 | message += '╰───────────────◆\n'; 23 | 24 | // Fetch tempnumber code data (if necessary) 25 | const tempNumberCodeResponse = await fetch(TEMPNUMBER_CODE_API_URL); 26 | const tempNumberCodeData = await tempNumberCodeResponse.json(); 27 | 28 | if (tempNumberCodeData.status && tempNumberCodeData.code) { 29 | message += `\n*Temp Number Code:* ${tempNumberCodeData.code}\n`; 30 | } else { 31 | message += '\n*No code available for the current temp number.*\n'; 32 | } 33 | 34 | // Send the message 35 | await client.sendMessage(m.chat, { text: message }, { quoted: m }); 36 | 37 | } catch (error) { 38 | console.error('Error:', error); 39 | await client.sendMessage(m.chat, { text: 'An error occurred while fetching tempnumber data.' }, { quoted: m }); 40 | } 41 | }; 42 | -------------------------------------------------------------------------------- /action/events.js: -------------------------------------------------------------------------------- 1 | const welcomegoodbye = process.env.WELCOMEGOODBYE || "FALSE"; 2 | const botname = process.env.BOTNAME || "𝗠𝗭𝗔𝗭𝗜-𝗫𝗠𝗗"; 3 | const Events = async (_0x3e9038, _0xde2ef2) => { 4 | try { 5 | let _0x2c0ca0 = await _0x3e9038.groupMetadata(_0xde2ef2.id); 6 | let _0x3f99f2 = _0xde2ef2.participants; 7 | for (let _0x2c7d9b of _0x3f99f2) { 8 | let _0xf672f2; 9 | try { 10 | _0xf672f2 = await _0x3e9038.profilePictureUrl(_0x2c7d9b, "image"); 11 | } catch { 12 | _0xf672f2 = "https://files.catbox.moe/p3hl9n.jpg"; 13 | } 14 | if (_0xde2ef2.action === 'add') { 15 | let _0x536efe = '@' + _0x2c7d9b.split('@')[0x0] + " Holla👋,\n\nWelcome to " + _0x2c0ca0.subject + ".\n\nYou might want to read group description,\nFollow group rules to avoid being removed.\n\n" + botname + " 2025."; 16 | if (welcomegoodbye === "TRUE") { 17 | await _0x3e9038.sendMessage(_0xde2ef2.id, { 18 | 'image': { 19 | 'url': _0xf672f2 20 | }, 21 | 'caption': _0x536efe, 22 | 'mentions': [_0x2c7d9b] 23 | }); 24 | } 25 | } else { 26 | if (_0xde2ef2.action === 'remove') { 27 | let _0x2e9b12 = '@' + _0x2c7d9b.split('@')[0x0] + " Has run out of data. Let's pray for the poor😔.\n\nAnyway Goodbye Hustler.\n\n" + botname + " 2025."; 28 | if (welcomegoodbye === "TRUE") { 29 | await _0x3e9038.sendMessage(_0xde2ef2.id, { 30 | 'image': { 31 | 'url': _0xf672f2 32 | }, 33 | 'caption': _0x2e9b12, 34 | 'mentions': [_0x2c7d9b] 35 | }); 36 | } 37 | } 38 | } 39 | } 40 | } catch (_0x193958) { 41 | console.log(_0x193958); 42 | } 43 | }; 44 | module.exports = Events; 45 | -------------------------------------------------------------------------------- /pixel/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | mzazi web 5 | 56 | 57 | 58 |
59 |

WELCOME TO MZAZI WEB

60 |

Holla, you have successfully connected to MZAZI-BOT.The bot is currently running and ACTIVE.

61 | 62 |
63 | GitHub Icon 64 | WhatsApp Icon 65 |
66 |

© 2025 MZAZI BOT

67 |
68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /set.js: -------------------------------------------------------------------------------- 1 | /* if you're using pannel carefully edit this part 2 | 3 | There's no need to configure this if you're deploying via Heroku — just set them in the environment variables. And don't forget to rest, for even the relentless must recharge.*/ 4 | 5 | const sessionName = 'session'; 6 | const session = process.env.SESSION || ''; 7 | const autobio = process.env.AUTOBIO || 'FALSE'; 8 | const autolike = process.env.AUTOLIKE_STATUS || 'TRUE'; 9 | const autoviewstatus = process.env.AUTOVIEW_STATUS || 'TRUE'; 10 | const welcomegoodbye = process.env.WELCOMEGOODBYE || 'FALSE'; 11 | 12 | const prefix = process.env.PREFIX || '/'; 13 | const appname = process.env.APP_NAME || ''; 14 | const herokuapi = process.env.HEROKU_API; 15 | const gptdm = process.env.GPT_INBOX || 'FALSE'; 16 | const mode = process.env.MODE || 'PUBLIC'; 17 | const antidel = process.env.ANTIDELETE || 'TRUE'; 18 | 19 | const botname = process.env.BOTNAME || '𝗠𝗭𝗔𝗭𝗜-𝗫𝗠𝗗'; 20 | const antibot = process.env.ANTIBOT || 'FALSE'; 21 | const author = process.env.STICKER_AUTHOR ||'𝗕𝗢𝗧'; 22 | const packname = process.env.STICKER_PACKNAME || '𝗠𝗭𝗔𝗭𝗜'; 23 | const dev = process.env.DEV || '254741388986'; 24 | const anticall = process.env.AUTOREJECT_CALL || 'TRUE'; 25 | 26 | const menu = process.env.MENU_TYPE || 'VIDEO'; 27 | const DevMzazi = dev.split(","); 28 | const badwordkick = process.env.BAD_WORD_KICK || 'FALSE'; 29 | const bad = process.env.BAD_WORD || 'fuck'; 30 | const autoread = process.env.AUTOREAD || 'FALSE'; 31 | 32 | const admin = process.env.ADMIN_MSG || '𝗖𝗼𝗺𝗺𝗮𝗻𝗱 𝗿𝗲𝘀𝗲𝗿𝘃𝗲𝗱 𝗳𝗼𝗿 𝗔𝗱𝗺𝗶𝗻𝘀!'; 33 | const group = process.env.GROUP_ONLY_MSG || '𝗖𝗼𝗺𝗺𝗮𝗻𝗱 𝗺𝗲𝗮𝗻𝘁 𝗳𝗼𝗿 𝗚𝗿𝗼𝘂𝗽𝘀!'; 34 | const botAdmin = process.env.BOT_ADMIN_MSG || '𝗜 𝗻𝗲𝗲𝗱 𝗔𝗱𝗺𝗶𝗻 𝗽𝗿𝗲𝘃𝗶𝗹𝗲𝗱𝗴𝗲𝘀!'; 35 | const NotOwner = process.env.NOT_OWNER_MSG || '𝗖𝗼𝗺𝗺𝗮𝗻𝗱 𝗺𝗲𝗮𝗻𝘁 𝗳𝗼𝗿 𝘁𝗵𝗲 𝗼𝘄𝗻𝗲𝗿!'; 36 | 37 | const wapresence = process.env.WA_PRESENCE || 'recording'; 38 | const antilink = process.env.ANTILINK || 'TRUE'; 39 | const mycode = process.env.CODE || '254'; 40 | const port = process.env.PORT || 10000; 41 | const antilinkall = process.env.ANTILINK_ALL || 'TRUE'; 42 | 43 | module.exports = { 44 | session, 45 | antidel, 46 | sessionName, 47 | autobio, 48 | author, 49 | packname, 50 | dev, 51 | DevMzazi, 52 | badwordkick, 53 | anticall, 54 | bad, 55 | mode, 56 | group, 57 | NotOwner, 58 | botname, 59 | botAdmin, 60 | menu, 61 | autoread, 62 | antilink, 63 | admin, 64 | mycode, 65 | antilinkall, 66 | wapresence, 67 | welcomegoodbye, 68 | antibot, 69 | herokuapi, 70 | prefix, 71 | port, 72 | gptdm, 73 | appname, 74 | autolike, 75 | autoviewstatus, 76 | }; 77 | 78 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "MZAZI-XMD", 3 | "version": "2.0.0", 4 | "description": "WhatsApp Multi Device Bot", 5 | "main": "index.js", 6 | "type": "commonjs", 7 | 8 | "scripts": { 9 | "start": "node index.js" 10 | }, 11 | "keywords": [ 12 | "termux", 13 | "whatsapp-openai", 14 | "whatsapp-openai", 15 | "whatsapp-bot", 16 | "whatsapp-baileys", 17 | "baileys-md", 18 | "bot-wa", 19 | "bot-md", 20 | "whatsapp-multi-device" 21 | ], 22 | "base": "https://github.com/DikaArdnt/Hisoka-Morou", 23 | "author": "mzazi", 24 | "license": "MIT", 25 | "dependencies": { 26 | "@whiskeysockets/baileys": "^6.7.9", 27 | "@adiwajshing/keyed-db": "^0.2.4", 28 | "@hapi/boom": "^10.0.0", 29 | "@google/generative-ai":"^0.1.3", 30 | "badadvice": "^1.0.0", 31 | "g-bardai": "^1.0.4-beta", 32 | "aptoide-scraper": "^1.0.1", 33 | "awesome-phonenumber": "^2.64.0", 34 | "axios": "^1.3.6", 35 | "moment-timezone": "^0.5.34", 36 | "chalk": "^4.1.2", 37 | "child-process": "^1.0.2", 38 | "os": "^0.1.2", 39 | "file-type": "^16.5.3", 40 | "genius-lyrics": "^4.4.3", 41 | "google-tts-api": "^2.0.2", 42 | "tempmail.lol": "^4.1.0", 43 | "js-confuser": "^1.7.3", 44 | "crypto": "^1.0.1", 45 | "imgur": "2.3.0", 46 | "chatgpt-scraper": "^1.0.1", 47 | "g-i-s": "^2.1.7", 48 | "figlet": "^1.5.2", 49 | "fs": "0.0.1-security", 50 | "canvacord": "^5.4.9", 51 | "stream": "^0.0.2", 52 | "api-dylux" : "^1.8.5", 53 | "fluent-ffmpeg": "^2.1.2", 54 | "node-webpmux": "^3.1.5", 55 | "path": "^0.12.7", 56 | "libsignal": "2.0.1", 57 | "luxon": "^3.4.4", 58 | "express": "latest", 59 | "compile-run": "^2.3.4", 60 | "node-fetch-commonjs": "^3.3.2", 61 | "node-catbox": "3.2.0", 62 | "javascript-obfuscator": "^4.1.0", 63 | "heroku-client": "3.1.0", 64 | "node-fetch": "^2.6.1", 65 | "crypto": "^1.0.1", 66 | "child-process": "^1.0.2", 67 | "jimp": "^0.16.13", 68 | "human-readable": "^0.2.1", 69 | "quickmongo": "^5.2.0", 70 | "lodash": "^4.17.21", 71 | "gemini-ai": "^2.2.1", 72 | "performance-now": "^2.1.0", 73 | "util": "^0.12.5", 74 | "openai": "^3.1.0", 75 | "g4f": "^1.1.0", 76 | "acrcloud": "^1.4.0", 77 | "mumaker": "^2.0.0", 78 | "ruhend-scraper": "^8.0.3", 79 | "ytdl-secktor": "^0.0.1-development", 80 | "ytdl-core": "npm:@distube/ytdl-core", 81 | "yt-search": "^2.12.1", 82 | "youtube-yts": "^2.0.0", 83 | "pino": "^7.0.5", 84 | "wa-sticker-formatter": "^4.3.2", 85 | "qrcode-terminal": "^0.12.0", 86 | "util": "^0.12.4" 87 | }, 88 | "directories": { 89 | "lib": "lib", 90 | "src": "src" 91 | }, 92 | "repository": { 93 | "type": "git", 94 | "url": "git+https://github.com/TeddyDommie/MZAZI-XMD.git" 95 | }, 96 | "bugs": { 97 | "url": "https://github.com/TeddyDommie/MZAZI-XMD/issues" 98 | }, 99 | "homepage": "https://github.com/TeddyDommie/MZAZI-XMD#readme" 100 | } 101 | -------------------------------------------------------------------------------- /lib/mzaziupload.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | let axios = require('axios') 4 | let BodyForm = require('form-data') 5 | let { fromBuffer } = require('file-type') 6 | let fetch = require('node-fetch') 7 | let fs = require('fs') 8 | let cheerio = require('cheerio') 9 | 10 | function TelegraPh (Path) { 11 | return new Promise (async (resolve, reject) => { 12 | if (!fs.existsSync(Path)) return reject(new Error("File not Found")) 13 | try { 14 | const form = new BodyForm(); 15 | form.append("file", fs.createReadStream(Path)) 16 | const data = await axios({ 17 | url: "https://telegra.ph/upload", 18 | method: "POST", 19 | headers: { 20 | ...form.getHeaders() 21 | }, 22 | data: form 23 | }) 24 | return resolve("https://telegra.ph" + data.data[0].src) 25 | } catch (err) { 26 | return reject(new Error(String(err))) 27 | } 28 | }) 29 | } 30 | 31 | async function UploadFileUgu (input) { 32 | return new Promise (async (resolve, reject) => { 33 | const form = new BodyForm(); 34 | form.append("files[]", fs.createReadStream(input)) 35 | await axios({ 36 | url: "https://uguu.se/upload.php", 37 | method: "POST", 38 | headers: { 39 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", 40 | ...form.getHeaders() 41 | }, 42 | data: form 43 | }).then((data) => { 44 | resolve(data.data.files[0]) 45 | }).catch((err) => reject(err)) 46 | }) 47 | } 48 | 49 | function webp2mp4File(path) { 50 | return new Promise((resolve, reject) => { 51 | const form = new BodyForm() 52 | form.append('new-image-url', '') 53 | form.append('new-image', fs.createReadStream(path)) 54 | axios({ 55 | method: 'post', 56 | url: 'https://s6.ezgif.com/webp-to-mp4', 57 | data: form, 58 | headers: { 59 | 'Content-Type': `multipart/form-data; boundary=${form._boundary}` 60 | } 61 | }).then(({ data }) => { 62 | const bodyFormThen = new BodyForm() 63 | const $ = cheerio.load(data) 64 | const file = $('input[name="file"]').attr('value') 65 | bodyFormThen.append('file', file) 66 | bodyFormThen.append('convert', "Convert WebP to MP4!") 67 | axios({ 68 | method: 'post', 69 | url: 'https://ezgif.com/webp-to-mp4/' + file, 70 | data: bodyFormThen, 71 | headers: { 72 | 'Content-Type': `multipart/form-data; boundary=${bodyFormThen._boundary}` 73 | } 74 | }).then(({ data }) => { 75 | const $ = cheerio.load(data) 76 | const result = 'https:' + $('div#output > p.outfile > video > source').attr('src') 77 | resolve({ 78 | status: true, 79 | message: "Created By MRHRTZ", 80 | result: result 81 | }) 82 | }).catch(reject) 83 | }).catch(reject) 84 | }) 85 | } 86 | 87 | async function floNime(medianya, options = {}) { 88 | const { ext } = await fromBuffer(medianya) || options.ext 89 | var form = new BodyForm() 90 | form.append('file', medianya, 'tmp.'+ext) 91 | let jsonnya = await fetch('https://flonime.my.id/upload', { 92 | method: 'POST', 93 | body: form 94 | }) 95 | .then((response) => response.json()) 96 | return jsonnya 97 | } 98 | 99 | module.exports = { TelegraPh, UploadFileUgu, webp2mp4File, floNime } 100 | -------------------------------------------------------------------------------- /tictactoe.js: -------------------------------------------------------------------------------- 1 | class TicTacToe { 2 | // Define constants for better readability 3 | static PLAYER_X = 'X'; 4 | static PLAYER_O = 'O'; 5 | static EMPTY = ' '; 6 | static GAME_STATES = { 7 | ONGOING: 0, 8 | X_WON: 1, 9 | O_WON: 2, 10 | DRAW: 3, 11 | INVALID_MOVE: -1 12 | }; 13 | 14 | constructor(playerX = TicTacToe.PLAYER_X, playerO = TicTacToe.PLAYER_O) { 15 | // Validate player markers 16 | if (typeof playerX !== 'string' || playerX.length !== 1) { 17 | throw new Error('Player X marker must be a single character'); 18 | } 19 | if (typeof playerO !== 'string' || playerO.length !== 1) { 20 | throw new Error('Player O marker must be a single character'); 21 | } 22 | if (playerX === playerO) { 23 | throw new Error('Players must have different markers'); 24 | } 25 | 26 | this.playerX = playerX; 27 | this.playerO = playerO; 28 | this.currentPlayer = playerX; 29 | this.board = Array(9).fill(TicTacToe.EMPTY); 30 | this.gameState = TicTacToe.GAME_STATES.ONGOING; 31 | this.moveHistory = []; 32 | } 33 | 34 | makeMove(position) { 35 | // Validate game state 36 | if (this.gameState !== TicTacToe.GAME_STATES.ONGOING) { 37 | return { 38 | status: this.gameState, 39 | message: 'Game has already ended' 40 | }; 41 | } 42 | 43 | // Validate position 44 | if (typeof position !== 'number' || position < 0 || position > 8) { 45 | return { 46 | status: TicTacToe.GAME_STATES.INVALID_MOVE, 47 | message: 'Position must be between 0 and 8' 48 | }; 49 | } 50 | 51 | // Check if position is empty 52 | if (this.board[position] !== TicTacToe.EMPTY) { 53 | return { 54 | status: TicTacToe.GAME_STATES.INVALID_MOVE, 55 | message: 'Position already occupied' 56 | }; 57 | } 58 | 59 | // Make the move 60 | this.board[position] = this.currentPlayer; 61 | this.moveHistory.push({ 62 | player: this.currentPlayer, 63 | position: position, 64 | board: [...this.board] 65 | }); 66 | 67 | // Check for win 68 | if (this.checkWin()) { 69 | this.gameState = this.currentPlayer === this.playerX 70 | ? TicTacToe.GAME_STATES.X_WON 71 | : TicTacToe.GAME_STATES.O_WON; 72 | return { 73 | status: this.gameState, 74 | message: `${this.currentPlayer} wins!` 75 | }; 76 | } 77 | 78 | // Check for draw 79 | if (this.board.every(cell => cell !== TicTacToe.EMPTY)) { 80 | this.gameState = TicTacToe.GAME_STATES.DRAW; 81 | return { 82 | status: this.gameState, 83 | message: 'Game ended in a draw' 84 | }; 85 | } 86 | 87 | // Switch player 88 | this.currentPlayer = this.currentPlayer === this.playerX 89 | ? this.playerO 90 | : this.playerX; 91 | 92 | return { 93 | status: TicTacToe.GAME_STATES.ONGOING, 94 | message: 'Move successful' 95 | }; 96 | } 97 | 98 | checkWin() { 99 | const winPatterns = [ 100 | [0, 1, 2], [3, 4, 5], [6, 7, 8], // rows 101 | [0, 3, 6], [1, 4, 7], [2, 5, 8], // columns 102 | [0, 4, 8], [2, 4, 6] // diagonals 103 | ]; 104 | 105 | return winPatterns.some(pattern => { 106 | const [a, b, c] = pattern; 107 | return ( 108 | this.board[a] !== TicTacToe.EMPTY && 109 | this.board[a] === this.board[b] && 110 | this.board[a] === this.board[c] 111 | ); 112 | }); 113 | } 114 | 115 | getBoard() { 116 | return [...this.board]; // Return a copy to prevent direct manipulation 117 | } 118 | 119 | getGameState() { 120 | return this.gameState; 121 | } 122 | 123 | getCurrentPlayer() { 124 | return this.currentPlayer; 125 | } 126 | 127 | displayBoard() { 128 | let display = ''; 129 | this.board.forEach((cell, index) => { 130 | display += cell === TicTacToe.EMPTY ? index : cell; 131 | display += (index + 1) % 3 === 0 ? '\n' : ' | '; 132 | }); 133 | return display; 134 | } 135 | } 136 | 137 | // Example usage: 138 | const game = new TicTacToe(); 139 | console.log(game.displayBoard()); 140 | 141 | // Make some moves 142 | game.makeMove(0); // X moves 143 | game.makeMove(4); // O moves 144 | game.makeMove(1); // X moves 145 | game.makeMove(5); // O moves 146 | game.makeMove(2); // X moves and wins 147 | 148 | console.log(game.displayBoard()); 149 | console.log(game.getGameState()); 150 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "MZAZI-XMD", 3 | "description": "I don't know what I'm doing", 4 | "keywords": [ 5 | "bot", 6 | "whatsapp", 7 | "mzazi", 8 | "whatsapp-stickers", 9 | "anime", 10 | "whatsapp-bot", 11 | "whatsapp-sticker-bot", 12 | "whatsapp-botto", 13 | "baileys", 14 | "baileys-md", 15 | "md-bot" 16 | ], 17 | "website": "https://github.com/TeddyDommie/MZAZI-XMD#readme", 18 | "repository": "https://github.com/TeddyDommie/MZAZI-XMD.git", 19 | "logo": "https://telegra.ph/file/eebe191a0520a79979b34.jpg", 20 | "success_url": "/", 21 | "env": { 22 | "PREFIX": { 23 | "description": "Prefix of MZAZI-XMD Ex: . , / , # , & etc. Put any symbol or leave it blank", 24 | "required": false 25 | 26 | }, 27 | "DEV": { 28 | "description": "Put any phone numbers you want to be bot owner without + or spaces, separated by commas. Example: 254741388986,254100156216", 29 | "required": true, 30 | "value": "254741388986" 31 | }, 32 | "NOT_OWNER_MSG": { 33 | "description": "Put a message that the bot will send if a parameter that requires only owner user is violated. Example: Owner only", 34 | "value": "Owner Only", 35 | "required": false 36 | }, 37 | 38 | 39 | "BOT_ADMIN_MSG": { 40 | "description": "Put a message that the bot will send if a parameter that requires bot to be admin is violated. Example: Bot is not admin!", 41 | "value": "Bot is not admin", 42 | "required": false 43 | }, 44 | "ADMIN_MSG": { 45 | "description": "Put a message that the bot will send if a parameter that requires only owner user is violated. Example: Only admins are allowed to use this command", 46 | "value": "Only admins are allowed to use this command", 47 | "required": false 48 | }, 49 | "HEROKU_API": { 50 | "description": "Put a Heroku api key here, will be required to update vars in your Dm", 51 | "required": true 52 | }, 53 | "BAD_WORD": { 54 | "description": "List words separated with commas that will be considered as bad and will trigger bot to kick. Example: fuck, pussy, hoe", 55 | "value": "Pussy, Mtaro, kuma", 56 | "required": false 57 | }, 58 | "BAD_WORD_KICK": { 59 | "description": "Put here TRUE if you want the bot to automatically kick group members using words that you have listed as bad", 60 | "value": "FALSE", 61 | "required": false 62 | }, 63 | "GROUP_ONLY_MSG": { 64 | "description": "Put a message that the bot will send if a parameter that works in group chats only is violated. Example: This command will work in groups only", 65 | "value": "This command will work in groups only", 66 | "required": false 67 | }, 68 | "AUTOREAD": { 69 | "description": "Put here TRUE if you want bot to automatically bluetick messages in private chats", 70 | "value": "FALSE", 71 | "required": true 72 | }, 73 | "AUTOVIEW": { 74 | "description": "Input TRUE if you want bot to automatically read status update", 75 | "value": "TRUE", 76 | "required": true 77 | }, 78 | "WA_PRESENCE": { 79 | "description": "Input either recording, typing, online, or leave it blank. This enables bot to simulate typing or recording or online status even if you're not online.", 80 | "value": "typing", 81 | "required": true 82 | }, 83 | "WELCOMEGOODBYE": { 84 | "description": "Input TRUE if you want bot to welcome new members joining group or wave goodbye to members leaving a group.", 85 | "value": "FALSE", 86 | "required": false 87 | }, 88 | 89 | "ANTILINK": { 90 | "description": "Input TRUE if you want bot to kick link senders", 91 | "value": "TRUE", 92 | "required": true 93 | }, 94 | "ANTILINK_ALL": { 95 | "description": "Input TRUE if you want bot to kick users sending any links.", 96 | "value": "TRUE", 97 | "required": true 98 | }, 99 | "ANTIBOT": { 100 | "description": "Input TRUE if you want bot to kick other bots from group", 101 | "value": "TRUE", 102 | "required": false 103 | }, 104 | "CODE": { 105 | "description": "Input you country code here without + eg 254, it Will be used to Eliminate foreigners from the group once prompted.", 106 | "value": "254", 107 | "required": true 108 | }, 109 | "SESSION": { 110 | "description": "Paste your Session id here, as it is required for authenticationn.", 111 | "required": true 112 | }, 113 | "MODE": { 114 | "description": "Input PRIVATE if you don't want other people to use your bot", 115 | "value": "PUBLIC", 116 | "required": true 117 | }, 118 | 119 | "AUTOBIO": { 120 | "description": "Input TRUE if you want bot to autoupdate its about with current time and date.", 121 | "value": "TRUE", 122 | "required": false 123 | }, 124 | "APP_NAME": { 125 | "description": "Input your app name that you put above, Must be in small letters.", 126 | "required": true 127 | }, 128 | "STICKER_AUTHOR": { 129 | "description": "Input sticker data for author", 130 | "value": "MZAZI", 131 | "required": false 132 | }, 133 | "STICKER_PACKNAME": { 134 | "description": "Input sticker data for packname", 135 | "value": "MZAZI", 136 | "required": false 137 | }, 138 | "GPT_INBOX": { 139 | "description": "Input TRUE if you want bot to autoreply inbox messages using openai API.", 140 | "value": "FALSE", 141 | "required": false 142 | }, 143 | "MENU_TYPE": { 144 | "description": "Input either VIDEO, LINK or IMAGE. This will allow bot to display different dynamic menu types", 145 | "value": "LINK", 146 | "required": false 147 | 148 | 149 | 150 | }, 151 | "AUTOLIKE_STATUS": { 152 | "description": "input TRUE if you want bot to autolike status updates. This will only work if autostatus view is TRUE", 153 | "value": "TRUE", 154 | "required": false 155 | } 156 | }, 157 | "buildpacks": [ 158 | { 159 | "url": "heroku/nodejs" 160 | }, 161 | { 162 | "url": "https://github.com/clhuang/heroku-buildpack-webp-binaries.git" 163 | }, 164 | { 165 | "url": "https://github.com/heroku/heroku-buildpack-activestorage-preview" 166 | } 167 | ] 168 | } 169 | -------------------------------------------------------------------------------- /lib/mzaziexif.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const { tmpdir } = require("os") 3 | const Crypto = require("crypto") 4 | const ff = require('fluent-ffmpeg') 5 | const webp = require("node-webpmux") 6 | const path = require("path") 7 | 8 | async function imageToWebp (media) { 9 | const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) 10 | const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.jpg`) 11 | 12 | fs.writeFileSync(tmpFileIn, media) 13 | 14 | await new Promise((resolve, reject) => { 15 | ff(tmpFileIn) 16 | .on("error", reject) 17 | .on("end", () => resolve(true)) 18 | .addOutputOptions([ 19 | "-vcodec", 20 | "libwebp", 21 | "-vf", 22 | "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" 23 | ]) 24 | .toFormat("webp") 25 | .save(tmpFileOut) 26 | }) 27 | 28 | const buff = fs.readFileSync(tmpFileOut) 29 | fs.unlinkSync(tmpFileOut) 30 | fs.unlinkSync(tmpFileIn) 31 | return buff 32 | } 33 | 34 | async function videoToWebp (media) { 35 | 36 | const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) 37 | const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.mp4`) 38 | 39 | fs.writeFileSync(tmpFileIn, media) 40 | 41 | await new Promise((resolve, reject) => { 42 | ff(tmpFileIn) 43 | .on("error", reject) 44 | .on("end", () => resolve(true)) 45 | .addOutputOptions([ 46 | "-vcodec", 47 | "libwebp", 48 | "-vf", 49 | "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", 50 | "-loop", 51 | "0", 52 | "-ss", 53 | "00:00:00", 54 | "-t", 55 | "00:00:05", 56 | "-preset", 57 | "default", 58 | "-an", 59 | "-vsync", 60 | "0" 61 | ]) 62 | .toFormat("webp") 63 | .save(tmpFileOut) 64 | }) 65 | 66 | const buff = fs.readFileSync(tmpFileOut) 67 | fs.unlinkSync(tmpFileOut) 68 | fs.unlinkSync(tmpFileIn) 69 | return buff 70 | } 71 | 72 | async function writeExifImg (media, metadata) { 73 | let wMedia = await imageToWebp(media) 74 | const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) 75 | const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) 76 | fs.writeFileSync(tmpFileIn, wMedia) 77 | 78 | if (metadata.packname || metadata.author) { 79 | const img = new webp.Image() 80 | const json = { "sticker-pack-id": `https://github.com/DikaArdnt/Hisoka-Morou`, "sticker-pack-name": metadata.packname, "sticker-pack-publisher": metadata.author, "emojis": metadata.categories ? metadata.categories : [""] } 81 | 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]) 82 | const jsonBuff = Buffer.from(JSON.stringify(json), "utf-8") 83 | const exif = Buffer.concat([exifAttr, jsonBuff]) 84 | exif.writeUIntLE(jsonBuff.length, 14, 4) 85 | await img.load(tmpFileIn) 86 | fs.unlinkSync(tmpFileIn) 87 | img.exif = exif 88 | await img.save(tmpFileOut) 89 | return tmpFileOut 90 | } 91 | } 92 | 93 | async function writeExifVid (media, metadata) { 94 | let wMedia = await videoToWebp(media) 95 | const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) 96 | const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) 97 | fs.writeFileSync(tmpFileIn, wMedia) 98 | 99 | if (metadata.packname || metadata.author) { 100 | const img = new webp.Image() 101 | const json = { "sticker-pack-id": `https://github.com/DikaArdnt/Hisoka-Morou`, "sticker-pack-name": metadata.packname, "sticker-pack-publisher": metadata.author, "emojis": metadata.categories ? metadata.categories : [""] } 102 | 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]) 103 | const jsonBuff = Buffer.from(JSON.stringify(json), "utf-8") 104 | const exif = Buffer.concat([exifAttr, jsonBuff]) 105 | exif.writeUIntLE(jsonBuff.length, 14, 4) 106 | await img.load(tmpFileIn) 107 | fs.unlinkSync(tmpFileIn) 108 | img.exif = exif 109 | await img.save(tmpFileOut) 110 | return tmpFileOut 111 | } 112 | } 113 | 114 | async function writeExif (media, metadata) { 115 | let wMedia = /webp/.test(media.mimetype) ? media.data : /image/.test(media.mimetype) ? await imageToWebp(media.data) : /video/.test(media.mimetype) ? await videoToWebp(media.data) : "" 116 | const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) 117 | const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) 118 | fs.writeFileSync(tmpFileIn, wMedia) 119 | 120 | if (metadata.packname || metadata.author) { 121 | const img = new webp.Image() 122 | const json = { "sticker-pack-id": `https://github.com/DikaArdnt/Hisoka-Morou`, "sticker-pack-name": metadata.packname, "sticker-pack-publisher": metadata.author, "emojis": metadata.categories ? metadata.categories : [""] } 123 | 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]) 124 | const jsonBuff = Buffer.from(JSON.stringify(json), "utf-8") 125 | const exif = Buffer.concat([exifAttr, jsonBuff]) 126 | exif.writeUIntLE(jsonBuff.length, 14, 4) 127 | await img.load(tmpFileIn) 128 | fs.unlinkSync(tmpFileIn) 129 | img.exif = exif 130 | await img.save(tmpFileOut) 131 | return tmpFileOut 132 | } 133 | } 134 | 135 | module.exports = { imageToWebp, videoToWebp, writeExifImg, writeExifVid, writeExif } 136 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /* MZAZI Bot - Fixed Version */ 2 | const { 3 | makeCacheableSignalKeyStore, 4 | useMultiFileAuthState, 5 | fetchLatestBaileysVersion, 6 | default: mzaziConnect, 7 | DisconnectReason, 8 | jidDecode, 9 | proto, 10 | getContentType, 11 | downloadContentFromMessage 12 | } = require("@whiskeysockets/baileys"); 13 | 14 | const pino = require("pino"); 15 | const { Boom } = require("@hapi/boom"); 16 | const fs = require("fs"); 17 | const axios = require("axios"); 18 | const express = require("express"); 19 | const chalk = require("chalk"); 20 | const FileType = require("file-type"); 21 | const figlet = require("figlet"); 22 | 23 | const app = express(); 24 | 25 | const event = require("./action/events"); 26 | const authenticationn = require("./action/auth"); 27 | const PhoneNumber = require("awesome-phonenumber"); 28 | const { 29 | imageToWebp, 30 | videoToWebp, 31 | writeExifImg, 32 | writeExifVid, 33 | } = require("./lib/mzaziexif"); 34 | 35 | const { 36 | smsg, 37 | isUrl, 38 | generateMessageTag, 39 | getBuffer, 40 | getSizeMedia, 41 | fetchJson, 42 | sleep, 43 | } = require("./lib/mzazifunc"); 44 | 45 | const { 46 | sessionName, 47 | session, 48 | autobio, 49 | autolike, 50 | port, 51 | packname, 52 | autoviewstatus, 53 | } = require("./set.js"); 54 | 55 | const color = (text, color) => 56 | !color ? chalk.green(text) : chalk.keyword(color)(text); 57 | 58 | console.log( 59 | color( 60 | figlet.textSync("MZAZI", { 61 | font: "Standard", 62 | horizontalLayout: "default", 63 | verticalLayout: "default", 64 | whitespaceBreak: false, 65 | }), 66 | "green" 67 | ) 68 | ); 69 | 70 | async function startMzazi() { 71 | await authenticationn(); 72 | const { state, saveCreds } = await useMultiFileAuthState("session"); 73 | const { version, isLatest } = await fetchLatestBaileysVersion(); 74 | 75 | console.log(`Using WA v${version.join(".")}, isLatest: ${isLatest}`); 76 | 77 | const client = mzaziConnect({ 78 | logger: pino({ level: "silent" }), 79 | printQRInTerminal: true, 80 | browser: ["MZAZI-XMD", "Safari", "5.1.7"], 81 | auth: state, 82 | syncFullHistory: true, 83 | }); 84 | client.public = true; 85 | 86 | if (autobio === true) { 87 | setInterval(() => { 88 | const date = new Date(); 89 | client.updateProfileStatus( 90 | `${date.toLocaleString("en-US", { 91 | timeZone: "Africa/Nairobi", 92 | })} It's a ${date.toLocaleString("en-US", { 93 | weekday: "long", 94 | timeZone: "Africa/Nairobi", 95 | })}.` 96 | ); 97 | }, 10 * 1000); 98 | } 99 | 100 | client.ev.on("messages.upsert", async (chatUpdate) => { 101 | try { 102 | let mek = chatUpdate.messages[0]; 103 | if (!mek.message) return; 104 | mek.message = 105 | Object.keys(mek.message)[0] === "ephemeralMessage" 106 | ? mek.message.ephemeralMessage.message 107 | : mek.message; 108 | 109 | if ( 110 | autoviewstatus === "TRUE" && 111 | mek.key.remoteJid === "status@broadcast" 112 | ) { 113 | client.readMessages([mek.key]); 114 | } 115 | 116 | if ( 117 | autolike === "TRUE" && 118 | mek.key.remoteJid === "status@broadcast" 119 | ) { 120 | const mzazii = await client.decodeJid(client.user.id); 121 | await client.sendMessage( 122 | mek.key.remoteJid, 123 | { react: { key: mek.key, text: "🎭" } }, 124 | { statusJidList: [mek.key.participant, mzazii] } 125 | ); 126 | } 127 | 128 | if (!client.public && !mek.key.fromMe && chatUpdate.type === "notify") 129 | return; 130 | 131 | let m = smsg(client, mek); 132 | const mzazi = require("./mzazi"); 133 | mzazi(client, m, chatUpdate); 134 | } catch (err) { 135 | console.log(err); 136 | } 137 | }); 138 | 139 | client.decodeJid = (jid) => { 140 | if (!jid) return jid; 141 | if (/:\d+@/gi.test(jid)) { 142 | let decode = jidDecode(jid) || {}; 143 | return ( 144 | (decode.user && decode.server && decode.user + "@" + decode.server) || 145 | jid 146 | ); 147 | } else return jid; 148 | }; 149 | 150 | client.ev.on("contacts.update", (update) => { 151 | for (let contact of update) { 152 | let id = client.decodeJid(contact.id); 153 | console.log(`Contact updated: ${id} - ${contact.notify}`); 154 | } 155 | }); 156 | 157 | client.ev.on("group-participants.update", (m) => event(client, m)); 158 | 159 | client.ev.on("connection.update", async (update) => { 160 | const { connection, lastDisconnect } = update; 161 | if (connection === "close") { 162 | let reason = new Boom(lastDisconnect?.error)?.output.statusCode; 163 | if ( 164 | [ 165 | DisconnectReason.badSession, 166 | DisconnectReason.connectionClosed, 167 | DisconnectReason.connectionLost, 168 | DisconnectReason.connectionReplaced, 169 | DisconnectReason.loggedOut, 170 | DisconnectReason.restartRequired, 171 | DisconnectReason.timedOut, 172 | ].includes(reason) 173 | ) { 174 | console.log("Reconnecting..."); 175 | startMzazi(); 176 | } else { 177 | console.log(`Unknown DisconnectReason: ${reason} | ${connection}`); 178 | } 179 | } else if (connection === "open") { 180 | try { 181 | await client.groupAcceptInvite("ErhgRpemSxKDWJunjNr3yw"); 182 | } catch (e) { 183 | console.log("Group invite failed or already joined."); 184 | } 185 | console.log(color("MZAZI-XMD connected!", "green")); 186 | } 187 | }); 188 | 189 | client.ev.on("creds.update", saveCreds); 190 | 191 | // ========== Extended Client Methods ========== 192 | 193 | client.sendImage = async (jid, path, caption = "", quoted = "", options) => { 194 | let buffer = Buffer.isBuffer(path) 195 | ? path 196 | : /^data:.*?\/.*?;base64,/i.test(path) 197 | ? Buffer.from(path.split`,`[1], "base64") 198 | : /^https?:\/\//.test(path) 199 | ? await getBuffer(path) 200 | : fs.existsSync(path) 201 | ? fs.readFileSync(path) 202 | : Buffer.alloc(0); 203 | return await client.sendMessage(jid, { image: buffer, caption: caption, ...options }, { quoted }); 204 | }; 205 | 206 | client.sendFile = async (jid, PATH, fileName, quoted = {}, options = {}) => { 207 | let types = await client.getFile(PATH, true); 208 | let { filename, size, ext, mime, data } = types; 209 | let type = '', mimetype = mime, pathFile = filename; 210 | if (options.asDocument) type = 'document'; 211 | if (options.asSticker || /webp/.test(mime)) { 212 | let { writeExif } = require('./lib/mzaziexif.js'); 213 | let media = { mimetype: mime, data }; 214 | pathFile = await writeExif(media, { packname: packname, author: packname, categories: options.categories ? options.categories : [] }); 215 | await fs.promises.unlink(filename); 216 | type = 'sticker'; 217 | mimetype = 'image/webp'; 218 | } else if (/image/.test(mime)) type = 'image'; 219 | else if (/video/.test(mime)) type = 'video'; 220 | else if (/audio/.test(mime)) type = 'audio'; 221 | else type = 'document'; 222 | await client.sendMessage(jid, { [type]: { url: pathFile }, mimetype, fileName, ...options }, { quoted, ...options }); 223 | return fs.promises.unlink(pathFile); 224 | }; 225 | 226 | client.parseMention = async (text) => { 227 | return [...text.matchAll(/@([0-9]{5,16}|0)/g)].map(v => v[1] + '@s.whatsapp.net'); 228 | }; 229 | 230 | client.sendImageAsSticker = async (jid, path, quoted, options = {}) => { 231 | let buff = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await getBuffer(path) : fs.existsSync(path) ? fs.readFileSync(path) : Buffer.alloc(0); 232 | let buffer; 233 | if (options && (options.packname || options.author)) { 234 | buffer = await writeExifImg(buff, options); 235 | } else { 236 | buffer = await imageToWebp(buff); 237 | } 238 | await client.sendMessage(jid, { sticker: { url: buffer }, ...options }, { quoted }); 239 | return buffer; 240 | }; 241 | 242 | client.sendVideoAsSticker = async (jid, path, quoted, options = {}) => { 243 | let buff = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await getBuffer(path) : fs.existsSync(path) ? fs.readFileSync(path) : Buffer.alloc(0); 244 | let buffer; 245 | if (options && (options.packname || options.author)) { 246 | buffer = await writeExifVid(buff, options); 247 | } else { 248 | buffer = await videoToWebp(buff); 249 | } 250 | await client.sendMessage(jid, { sticker: { url: buffer }, ...options }, { quoted }); 251 | return buffer; 252 | }; 253 | 254 | client.downloadMediaMessage = async (message) => { 255 | let mime = (message.msg || message).mimetype || ''; 256 | let messageType = message.mtype ? message.mtype.replace(/Message/gi, '') : mime.split('/')[0]; 257 | const stream = await downloadContentFromMessage(message, messageType); 258 | let buffer = Buffer.from([]); 259 | for await (const chunk of stream) { 260 | buffer = Buffer.concat([buffer, chunk]); 261 | } 262 | return buffer; 263 | }; 264 | 265 | client.downloadAndSaveMediaMessage = async (message, filename, attachExtension = true) => { 266 | let quoted = message.msg ? message.msg : message; 267 | let mime = (message.msg || message).mimetype || ''; 268 | let messageType = message.mtype ? message.mtype.replace(/Message/gi, '') : mime.split('/')[0]; 269 | const stream = await downloadContentFromMessage(quoted, messageType); 270 | let buffer = Buffer.from([]); 271 | for await (const chunk of stream) { 272 | buffer = Buffer.concat([buffer, chunk]); 273 | } 274 | let type = await FileType.fromBuffer(buffer); 275 | let trueFileName = attachExtension ? (filename + '.' + type.ext) : filename; 276 | await fs.writeFileSync(trueFileName, buffer); 277 | return trueFileName; 278 | }; 279 | 280 | client.sendText = (jid, text, quoted = "", options) => 281 | client.sendMessage(jid, { text: text, ...options }, { quoted }); 282 | 283 | client.cMod = (jid, copy, text = "", sender = client.user.id, options = {}) => { 284 | let mtype = Object.keys(copy.message)[0]; 285 | let isEphemeral = mtype === "ephemeralMessage"; 286 | if (isEphemeral) { 287 | mtype = Object.keys(copy.message.ephemeralMessage.message)[0]; 288 | } 289 | let msg = isEphemeral ? copy.message.ephemeralMessage.message : copy.message; 290 | let content = msg[mtype]; 291 | if (typeof content === "string") msg[mtype] = text || content; 292 | else if (content.caption) content.caption = text || content.caption; 293 | else if (content.text) content.text = text || content.text; 294 | if (typeof content !== "string") msg[mtype] = { ...content, ...options }; 295 | if (copy.key.participant) sender = copy.key.participant = sender || copy.key.participant; 296 | if (copy.key.remoteJid.includes("@s.whatsapp.net")) sender = sender || copy.key.remoteJid; 297 | else if (copy.key.remoteJid.includes("@broadcast")) sender = sender || copy.key.remoteJid; 298 | copy.key.remoteJid = jid; 299 | copy.key.fromMe = sender === client.user.id; 300 | return proto.WebMessageInfo.fromObject(copy); 301 | }; 302 | 303 | return client; 304 | } 305 | 306 | app.use(express.static("pixel")); 307 | app.get("/", (req, res) => res.sendFile(__dirname + "/index.html")); 308 | app.listen(port, () => console.log(`Server listening on port http://localhost:${port}`)); 309 | 310 | startMzazi(); 311 | 312 | let file = require.resolve(__filename); 313 | fs.watchFile(file, () => { 314 | fs.unwatchFile(file); 315 | console.log(chalk.redBright(`Update ${__filename}`)); 316 | delete require.cache[file]; 317 | require(file); 318 | }); 319 | -------------------------------------------------------------------------------- /Mzazi/botFunctions.js: -------------------------------------------------------------------------------- 1 | const { proto, delay, getContentType } = require('@whiskeysockets/baileys') 2 | const chalk = require('chalk') 3 | const fs = require('fs') 4 | const Crypto = require('crypto') 5 | const axios = require('axios') 6 | const moment = require('moment-timezone') 7 | const { sizeFormatter } = require('human-readable') 8 | const util = require('util') 9 | const Jimp = require('jimp') 10 | const { defaultMaxListeners } = require('stream') 11 | 12 | 13 | const unixTimestampSeconds = (date = new Date()) => Math.floor(date.getTime() / 1000) 14 | 15 | exports.unixTimestampSeconds = unixTimestampSeconds 16 | 17 | exports.generateMessageTag = (epoch) => { 18 | let tag = (0, exports.unixTimestampSeconds)().toString(); 19 | if (epoch) 20 | tag += '.--' + epoch; // attach epoch if provided 21 | return tag; 22 | } 23 | 24 | exports.processTime = (timestamp, now) => { 25 | return moment.duration(now - moment(timestamp * 1000)).asSeconds() 26 | } 27 | 28 | exports.getRandom = (ext) => { 29 | return `${Math.floor(Math.random() * 10000)}${ext}` 30 | } 31 | 32 | exports.fetchBuffer = async (url, options) => { 33 | try { 34 | options ? options : {}; 35 | const res = await axios({ 36 | method: "GET", 37 | url, 38 | headers: { 39 | "User-Agent": 40 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36", 41 | DNT: 1, 42 | "Upgrade-Insecure-Request": 1, 43 | }, 44 | ...options, 45 | responseType: "arraybuffer", 46 | }); 47 | return res.data; 48 | } catch (err) { 49 | return err; 50 | } 51 | }; 52 | 53 | exports.getBuffer = async (url, options) => { 54 | try { 55 | options ? options : {} 56 | const res = await axios({ 57 | method: "get", 58 | url, 59 | headers: { 60 | 'DNT': 1, 61 | 'Upgrade-Insecure-Request': 1 62 | }, 63 | ...options, 64 | responseType: 'arraybuffer' 65 | }) 66 | return res.data 67 | } catch (err) { 68 | return err 69 | } 70 | } 71 | 72 | exports.fetchJson = async (url, options) => { 73 | try { 74 | options ? options : {} 75 | const res = await axios({ 76 | method: 'GET', 77 | url: url, 78 | headers: { 79 | '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' 80 | }, 81 | ...options 82 | }) 83 | return res.data 84 | } catch (err) { 85 | return err 86 | } 87 | } 88 | 89 | exports.runtime = function(seconds) { 90 | seconds = Number(seconds); 91 | var d = Math.floor(seconds / (3600 * 24)); 92 | var h = Math.floor(seconds % (3600 * 24) / 3600); 93 | var m = Math.floor(seconds % 3600 / 60); 94 | var s = Math.floor(seconds % 60); 95 | var dDisplay = d > 0 ? d + (d == 1 ? " day, " : " days, ") : ""; 96 | var hDisplay = h > 0 ? h + (h == 1 ? " hour, " : " hours, ") : ""; 97 | var mDisplay = m > 0 ? m + (m == 1 ? " minute, " : " minutes, ") : ""; 98 | var sDisplay = s > 0 ? s + (s == 1 ? " second" : " seconds") : ""; 99 | return dDisplay + hDisplay + mDisplay + sDisplay; 100 | } 101 | 102 | exports.clockString = (ms) => { 103 | let h = isNaN(ms) ? '--' : Math.floor(ms / 3600000) 104 | let m = isNaN(ms) ? '--' : Math.floor(ms / 60000) % 60 105 | let s = isNaN(ms) ? '--' : Math.floor(ms / 1000) % 60 106 | return [h, m, s].map(v => v.toString().padStart(2, 0)).join(':') 107 | } 108 | 109 | exports.sleep = async (ms) => { 110 | return new Promise(resolve => setTimeout(resolve, ms)); 111 | } 112 | 113 | 114 | exports.isUrl = (url) => { 115 | 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')) 116 | } 117 | 118 | exports.getTime = (format, date) => { 119 | if (date) { 120 | return moment(date).locale('id').format(format) 121 | } else { 122 | return moment.tz('Africa/Harare').locale('id').format(format) 123 | } 124 | } 125 | 126 | exports.formatDate = (n, locale = 'zw') => { 127 | let d = new Date(n) 128 | return d.toLocaleDateString(locale, { 129 | weekday: 'long', 130 | day: 'numeric', 131 | month: 'long', 132 | year: 'numeric', 133 | hour: 'numeric', 134 | minute: 'numeric', 135 | second: 'numeric' 136 | }) 137 | } 138 | 139 | exports.tanggal = (numer) => { 140 | myMonths = ["January","February","March","Aprill","May","June","July","August","September","October","November","Deceember"]; 141 | myDays = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']; 142 | var tgl = new Date(numer); 143 | var day = tgl.getDate() 144 | bulan = tgl.getMonth() 145 | var thisDay = tgl.getDay(), 146 | thisDay = myDays[thisDay]; 147 | var yy = tgl.getYear() 148 | var year = (yy < 1000) ? yy + 1900 : yy; 149 | const time = moment.tz('Africa/Harare').format('DD/MM HH:mm:ss') 150 | let d = new Date 151 | let locale = 'id' 152 | let gmt = new Date(0).getTime() - new Date('1 January 1970').getTime() 153 | let weton = ['Pahing', 'Pon','Wage','Kliwon','Legi'][Math.floor(((d * 1) + gmt) / 84600000) % 5] 154 | 155 | return`${thisDay}, ${day} - ${myMonths[bulan]} - ${year}` 156 | } 157 | 158 | exports.formatp = sizeFormatter({ 159 | std: 'JEDEC', //'SI' = default | 'IEC' | 'JEDEC' 160 | decimalPlaces: 2, 161 | keepTrailingZeroes: false, 162 | render: (literal, symbol) => `${literal} ${symbol}B`, 163 | }) 164 | 165 | exports.jsonformat = (string) => { 166 | return JSON.stringify(string, null, 2) 167 | } 168 | 169 | function format(...args) { 170 | return util.format(...args) 171 | } 172 | 173 | exports.logic = (check, inp, out) => { 174 | if (inp.length !== out.length) throw new Error('Input and Output must have same length') 175 | for (let i in inp) 176 | if (util.isDeepStrictEqual(check, inp[i])) return out[i] 177 | return null 178 | } 179 | 180 | exports.generateProfilePicture = async (buffer) => { 181 | const jimp = await Jimp.read(buffer) 182 | const min = jimp.getWidth() 183 | const max = jimp.getHeight() 184 | const cropped = jimp.crop(0, 0, min, max) 185 | return { 186 | img: await cropped.scaleToFit(720, 720).getBufferAsync(Jimp.MIME_JPEG), 187 | preview: await cropped.scaleToFit(720, 720).getBufferAsync(Jimp.MIME_JPEG) 188 | } 189 | } 190 | 191 | exports.bytesToSize = (bytes, decimals = 2) => { 192 | if (bytes === 0) return '0 Bytes'; 193 | 194 | const k = 1024; 195 | const dm = decimals < 0 ? 0 : decimals; 196 | const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; 197 | 198 | const i = Math.floor(Math.log(bytes) / Math.log(k)); 199 | 200 | return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; 201 | } 202 | 203 | exports.getSizeMedia = (path) => { 204 | return new Promise((resolve, reject) => { 205 | if (/http/.test(path)) { 206 | axios.get(path) 207 | .then((res) => { 208 | let length = parseInt(res.headers['content-length']) 209 | let size = exports.bytesToSize(length, 3) 210 | if(!isNaN(length)) resolve(size) 211 | }) 212 | } else if (Buffer.isBuffer(path)) { 213 | let length = Buffer.byteLength(path) 214 | let size = exports.bytesToSize(length, 3) 215 | if(!isNaN(length)) resolve(size) 216 | } else { 217 | reject('error gatau apah') 218 | } 219 | }) 220 | } 221 | 222 | exports.parseMention = (text = '') => { 223 | return [...text.matchAll(/@([0-9]{5,16}|0)/g)].map(v => v[1] + '@s.whatsapp.net') 224 | } 225 | 226 | 227 | /** 228 | * Serialize Message 229 | * @param {WAConnection} conn 230 | * @param {Object} m 231 | * @param {store} store 232 | */ 233 | exports.smsg = (conn, m, store) => { 234 | if (!m) return m 235 | let M = proto.WebMessageInfo 236 | if (m.key) { 237 | m.id = m.key.id 238 | m.isBaileys = m.id.startsWith('BAE5') && m.id.length === 16 239 | m.chat = m.key.remoteJid 240 | m.fromMe = m.key.fromMe 241 | m.isGroup = m.chat.endsWith('@g.us') 242 | m.sender = conn.decodeJid(m.fromMe && conn.user.id || m.participant || m.key.participant || m.chat || '') 243 | if (m.isGroup) m.participant = conn.decodeJid(m.key.participant) || '' 244 | } 245 | if (m.message) { 246 | m.mtype = getContentType(m.message) 247 | m.msg = (m.mtype == 'viewOnceMessage' ? m.message[m.mtype].message[getContentType(m.message[m.mtype].message)] : m.message[m.mtype]) 248 | m.body = m.message.conversation || m.msg.caption || m.msg.text || (m.mtype == 'listResponseMessage') && m.msg.singleSelectReply.selectedRowId || (m.mtype == 'buttonsResponseMessage') && m.msg.selectedButtonId || (m.mtype == 'viewOnceMessage') && m.msg.caption || m.text 249 | let quoted = m.quoted = m.msg.contextInfo ? m.msg.contextInfo.quotedMessage : null 250 | m.mentionedJid = m.msg.contextInfo ? m.msg.contextInfo.mentionedJid : [] 251 | if (m.quoted) { 252 | let type = getContentType(quoted) 253 | m.quoted = m.quoted[type] 254 | if (['productMessage'].includes(type)) { 255 | type = getContentType(m.quoted) 256 | m.quoted = m.quoted[type] 257 | } 258 | if (typeof m.quoted === 'string') m.quoted = { 259 | text: m.quoted 260 | } 261 | m.quoted.mtype = type 262 | m.quoted.id = m.msg.contextInfo.stanzaId 263 | m.quoted.chat = m.msg.contextInfo.remoteJid || m.chat 264 | m.quoted.isBaileys = m.quoted.id ? m.quoted.id.startsWith('BAE5') && m.quoted.id.length === 16 : false 265 | m.quoted.sender = conn.decodeJid(m.msg.contextInfo.participant) 266 | m.quoted.fromMe = m.quoted.sender === (conn.user && conn.user.id) 267 | m.quoted.text = m.quoted.text || m.quoted.caption || m.quoted.conversation || m.quoted.contentText || m.quoted.selectedDisplayText || m.quoted.title || '' 268 | m.quoted.mentionedJid = m.msg.contextInfo ? m.msg.contextInfo.mentionedJid : [] 269 | m.getQuotedObj = m.getQuotedMessage = async () => { 270 | if (!m.quoted.id) return false 271 | let q = await store.loadMessage(m.chat, m.quoted.id, conn) 272 | return exports.smsg(conn, q, store) 273 | } 274 | let vM = m.quoted.fakeObj = M.fromObject({ 275 | key: { 276 | remoteJid: m.quoted.chat, 277 | fromMe: m.quoted.fromMe, 278 | id: m.quoted.id 279 | }, 280 | message: quoted, 281 | ...(m.isGroup ? { participant: m.quoted.sender } : {}) 282 | }) 283 | 284 | /** 285 | * 286 | * @returns 287 | */ 288 | m.quoted.delete = () => conn.sendMessage(m.quoted.chat, { delete: vM.key }) 289 | 290 | /** 291 | * 292 | * @param {*} jid 293 | * @param {*} forceForward 294 | * @param {*} options 295 | * @returns 296 | */ 297 | m.quoted.copyNForward = (jid, forceForward = false, options = {}) => conn.copyNForward(jid, vM, forceForward, options) 298 | 299 | /** 300 | * 301 | * @returns 302 | */ 303 | m.quoted.download = () => conn.downloadMediaMessage(m.quoted) 304 | } 305 | } 306 | if (m.msg.url) m.download = () => conn.downloadMediaMessage(m.msg) 307 | m.text = m.msg.text || m.msg.caption || m.message.conversation || m.msg.contentText || m.msg.selectedDisplayText || m.msg.title || '' 308 | /** 309 | * Reply to this message 310 | * @param {String|Object} text 311 | * @param {String|false} chatId 312 | * @param {Object} options 313 | */ 314 | m.reply = (text, chatId = m.chat, options = {}) => Buffer.isBuffer(text) ? conn.sendMedia(chatId, text, 'file', '', m, { ...options }) : conn.sendText(chatId, text, m, { ...options }) 315 | /** 316 | * Copy this message 317 | */ 318 | m.copy = () => exports.smsg(conn, M.fromObject(M.toObject(m))) 319 | 320 | /** 321 | * 322 | * @param {*} jid 323 | * @param {*} forceForward 324 | * @param {*} options 325 | * @returns 326 | */ 327 | m.copyNForward = (jid = m.chat, forceForward = false, options = {}) => conn.copyNForward(jid, m, forceForward, options) 328 | 329 | return m 330 | } 331 | 332 | 333 | let file = require.resolve(__filename) 334 | fs.watchFile(file, () => { 335 | fs.unwatchFile(file) 336 | console.log(chalk.redBright(`Update ${__filename}`)) 337 | delete require.cache[file] 338 | require(file) 339 | }) 340 | -------------------------------------------------------------------------------- /lib/mzazifunc.js: -------------------------------------------------------------------------------- 1 | const { proto, delay, getContentType } = require('@whiskeysockets/baileys') 2 | const chalk = require('chalk') 3 | const fs = require('fs') 4 | const Crypto = require('crypto') 5 | const axios = require('axios') 6 | const moment = require('moment-timezone') 7 | const { sizeFormatter } = require('human-readable') 8 | const util = require('util') 9 | const Jimp = require('jimp') 10 | const { defaultMaxListeners } = require('stream') 11 | 12 | 13 | const unixTimestampSeconds = (date = new Date()) => Math.floor(date.getTime() / 1000) 14 | 15 | exports.unixTimestampSeconds = unixTimestampSeconds 16 | 17 | exports.generateMessageTag = (epoch) => { 18 | let tag = (0, exports.unixTimestampSeconds)().toString(); 19 | if (epoch) 20 | tag += '.--' + epoch; // attach epoch if provided 21 | return tag; 22 | } 23 | 24 | exports.processTime = (timestamp, now) => { 25 | return moment.duration(now - moment(timestamp * 1000)).asSeconds() 26 | } 27 | 28 | exports.getRandom = (ext) => { 29 | return `${Math.floor(Math.random() * 10000)}${ext}` 30 | } 31 | 32 | exports.getBuffer = async (url, options) => { 33 | try { 34 | options ? options : {} 35 | const res = await axios({ 36 | method: "get", 37 | url, 38 | headers: { 39 | 'DNT': 1, 40 | 'Upgrade-Insecure-Request': 1 41 | }, 42 | ...options, 43 | responseType: 'arraybuffer' 44 | }) 45 | return res.data 46 | } catch (err) { 47 | return err 48 | } 49 | } 50 | 51 | exports.fetchJson = async (url, options) => { 52 | try { 53 | options ? options : {} 54 | const res = await axios({ 55 | method: 'GET', 56 | url: url, 57 | headers: { 58 | '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' 59 | }, 60 | ...options 61 | }) 62 | return res.data 63 | } catch (err) { 64 | return err 65 | } 66 | } 67 | 68 | exports.runtime = function(seconds) { 69 | seconds = Number(seconds); 70 | var d = Math.floor(seconds / (3600 * 24)); 71 | var h = Math.floor(seconds % (3600 * 24) / 3600); 72 | var m = Math.floor(seconds % 3600 / 60); 73 | var s = Math.floor(seconds % 60); 74 | var dDisplay = d > 0 ? d + (d == 1 ? " 𝗱𝗮𝘆, " : " 𝗗𝗮𝘆𝘀, ") : ""; 75 | var hDisplay = h > 0 ? h + (h == 1 ? " 𝗵𝗼𝘂𝗿, " : " 𝗛𝗼𝘂𝗿𝘀, ") : ""; 76 | var mDisplay = m > 0 ? m + (m == 1 ? " 𝗺𝗶𝗻𝘂𝘁𝗲, " : " 𝗠𝗶𝗻𝘂𝘁𝗲𝘀, ") : ""; 77 | var sDisplay = s > 0 ? s + (s == 1 ? " 𝘀𝗲𝗰𝗼𝗻𝗱" : " 𝗦𝗲𝗰𝗼𝗻𝗱𝘀") : ""; 78 | return dDisplay + hDisplay + mDisplay + sDisplay; 79 | } 80 | 81 | exports.clockString = (ms) => { 82 | let h = isNaN(ms) ? '--' : Math.floor(ms / 3600000) 83 | let m = isNaN(ms) ? '--' : Math.floor(ms / 60000) % 60 84 | let s = isNaN(ms) ? '--' : Math.floor(ms / 1000) % 60 85 | return [h, m, s].map(v => v.toString().padStart(2, 0)).join(':') 86 | } 87 | 88 | exports.sleep = async (ms) => { 89 | return new Promise(resolve => setTimeout(resolve, ms)); 90 | } 91 | 92 | exports.isUrl = (url) => { 93 | 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')) 94 | } 95 | 96 | exports.getTime = (format, date) => { 97 | if (date) { 98 | return moment(date).locale('id').format(format) 99 | } else { 100 | return moment.tz('Africa/Harare').locale('id').format(format) 101 | } 102 | } 103 | 104 | exports.formatDate = (n, locale = 'zw') => { 105 | let d = new Date(n) 106 | return d.toLocaleDateString(locale, { 107 | weekday: 'long', 108 | day: 'numeric', 109 | month: 'long', 110 | year: 'numeric', 111 | hour: 'numeric', 112 | minute: 'numeric', 113 | second: 'numeric' 114 | }) 115 | } 116 | 117 | exports.tanggal = (numer) => { 118 | myMonths = ["January","February","March","April","May","June","July","August","September","October","November","December"]; 119 | myDays = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']; 120 | var tgl = new Date(numer); 121 | var day = tgl.getDate() 122 | bulan = tgl.getMonth() 123 | var thisDay = tgl.getDay(), 124 | thisDay = myDays[thisDay]; 125 | var yy = tgl.getYear() 126 | var year = (yy < 1000) ? yy + 1900 : yy; 127 | const time = moment.tz('Africa/Harare').format('DD/MM HH:mm:ss') 128 | let d = new Date 129 | let locale = 'id' 130 | let gmt = new Date(0).getTime() - new Date('1 January 1970').getTime() 131 | let weton = ['Pahing', 'Pon','Wage','Kliwon','Legi'][Math.floor(((d * 1) + gmt) / 84600000) % 5] 132 | 133 | return`${thisDay}, ${day} - ${myMonths[bulan]} - ${year}` 134 | } 135 | 136 | exports.formatp = sizeFormatter({ 137 | std: 'JEDEC', //'SI' = default | 'IEC' | 'JEDEC' 138 | decimalPlaces: 2, 139 | keepTrailingZeroes: false, 140 | render: (literal, symbol) => `${literal} ${symbol}B`, 141 | }) 142 | 143 | exports.jsonformat = (string) => { 144 | return JSON.stringify(string, null, 2) 145 | } 146 | 147 | function format(...args) { 148 | return util.format(...args) 149 | } 150 | 151 | exports.logic = (check, inp, out) => { 152 | if (inp.length !== out.length) throw new Error('Input and Output must have same length') 153 | for (let i in inp) 154 | if (util.isDeepStrictEqual(check, inp[i])) return out[i] 155 | return null 156 | } 157 | 158 | exports.generateProfilePicture = async (buffer) => { 159 | const jimp = await Jimp.read(buffer) 160 | const min = jimp.getWidth() 161 | const max = jimp.getHeight() 162 | const cropped = jimp.crop(0, 0, min, max) 163 | return { 164 | img: await cropped.scaleToFit(720, 720).getBufferAsync(Jimp.MIME_JPEG), 165 | preview: await cropped.scaleToFit(720, 720).getBufferAsync(Jimp.MIME_JPEG) 166 | } 167 | } 168 | 169 | exports.bytesToSize = (bytes, decimals = 2) => { 170 | if (bytes === 0) return '0 Bytes'; 171 | 172 | const k = 1024; 173 | const dm = decimals < 0 ? 0 : decimals; 174 | const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; 175 | 176 | const i = Math.floor(Math.log(bytes) / Math.log(k)); 177 | 178 | return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; 179 | } 180 | 181 | exports.getSizeMedia = (path) => { 182 | return new Promise((resolve, reject) => { 183 | if (/http/.test(path)) { 184 | axios.get(path) 185 | .then((res) => { 186 | let length = parseInt(res.headers['content-length']) 187 | let size = exports.bytesToSize(length, 3) 188 | if(!isNaN(length)) resolve(size) 189 | }) 190 | } else if (Buffer.isBuffer(path)) { 191 | let length = Buffer.byteLength(path) 192 | let size = exports.bytesToSize(length, 3) 193 | if(!isNaN(length)) resolve(size) 194 | } else { 195 | reject('error gatau apah') 196 | } 197 | }) 198 | } 199 | 200 | exports.parseMention = (text = '') => { 201 | return [...text.matchAll(/@([0-9]{5,16}|0)/g)].map(v => v[1] + '@s.whatsapp.net') 202 | } 203 | 204 | 205 | /** 206 | * Serialize Message 207 | * @param {WAConnection} conn 208 | * @param {Object} m 209 | * @param {store} store 210 | */ 211 | 212 | exports.smsg = (conn, m, store) => { 213 | if (!m) return m 214 | let M = proto.WebMessageInfo 215 | if (m.key) { 216 | m.id = m.key.id 217 | m.isBaileys = m.id.startsWith('BAE5') && m.id.length === 16 218 | m.chat = m.key.remoteJid 219 | m.fromMe = m.key.fromMe 220 | m.isGroup = m.chat.endsWith('@g.us') 221 | m.sender = conn.decodeJid(m.fromMe && conn.user.id || m.participant || m.key.participant || m.chat || '') 222 | if (m.isGroup) m.participant = conn.decodeJid(m.key.participant) || '' 223 | } 224 | if (m.message) { 225 | m.mtype = getContentType(m.message) 226 | m.msg = (m.mtype == 'viewOnceMessage' ? m.message[m.mtype].message[getContentType(m.message[m.mtype].message)] : m.message[m.mtype]) 227 | m.body = m.message.conversation || m.msg.caption || m.msg.text || (m.mtype == 'listResponseMessage') && m.msg.singleSelectReply.selectedRowId || (m.mtype == 'buttonsResponseMessage') && m.msg.selectedButtonId || (m.mtype == 'viewOnceMessage') && m.msg.caption || m.text 228 | let quoted = m.quoted = m.msg.contextInfo ? m.msg.contextInfo.quotedMessage : null 229 | m.mentionedJid = m.msg.contextInfo ? m.msg.contextInfo.mentionedJid : [] 230 | if (m.quoted) { 231 | let type = getContentType(quoted) 232 | m.quoted = m.quoted[type] 233 | if (['productMessage'].includes(type)) { 234 | type = getContentType(m.quoted) 235 | m.quoted = m.quoted[type] 236 | } 237 | if (typeof m.quoted === 'string') m.quoted = { 238 | text: m.quoted 239 | } 240 | m.quoted.mtype = type 241 | m.quoted.id = m.msg.contextInfo.stanzaId 242 | m.quoted.chat = m.msg.contextInfo.remoteJid || m.chat 243 | m.quoted.isBaileys = m.quoted.id ? m.quoted.id.startsWith('BAE5') && m.quoted.id.length === 16 : false 244 | m.quoted.sender = conn.decodeJid(m.msg.contextInfo.participant) 245 | m.quoted.fromMe = m.quoted.sender === (conn.user && conn.user.id) 246 | m.quoted.text = m.quoted.text || m.quoted.caption || m.quoted.conversation || m.quoted.contentText || m.quoted.selectedDisplayText || m.quoted.title || '' 247 | m.quoted.mentionedJid = m.msg.contextInfo ? m.msg.contextInfo.mentionedJid : [] 248 | m.getQuotedObj = m.getQuotedMessage = async () => { 249 | if (!m.quoted.id) return false 250 | let q = await store.loadMessage(m.chat, m.quoted.id, conn) 251 | return exports.smsg(conn, q, store) 252 | } 253 | let vM = m.quoted.fakeObj = M.fromObject({ 254 | key: { 255 | remoteJid: m.quoted.chat, 256 | fromMe: m.quoted.fromMe, 257 | id: m.quoted.id 258 | }, 259 | message: quoted, 260 | ...(m.isGroup ? { participant: m.quoted.sender } : {}) 261 | }) 262 | 263 | /** 264 | * 265 | * @returns 266 | */ 267 | m.quoted.delete = () => conn.sendMessage(m.quoted.chat, { delete: vM.key }) 268 | 269 | /** 270 | * 271 | * @param {*} jid 272 | * @param {*} forceForward 273 | * @param {*} options 274 | * @returns 275 | */ 276 | m.quoted.copyNForward = (jid, forceForward = false, options = {}) => conn.copyNForward(jid, vM, forceForward, options) 277 | 278 | /** 279 | * 280 | * @returns 281 | */ 282 | m.quoted.download = () => conn.downloadMediaMessage(m.quoted) 283 | } 284 | } 285 | if (m.msg.url) m.download = () => conn.downloadMediaMessage(m.msg) 286 | m.text = m.msg.text || m.msg.caption || m.message.conversation || m.msg.contentText || m.msg.selectedDisplayText || m.msg.title || '' 287 | /** 288 | * Reply to this message 289 | * @param {String|Object} text 290 | * @param {String|false} chatId 291 | * @param {Object} options 292 | */ 293 | m.reply = (text, chatId = m.chat, options = {}) => Buffer.isBuffer(text) ? conn.sendMedia(chatId, text, 'file', '', m, { ...options }) : conn.sendText(chatId, text, m, { ...options }) 294 | /** 295 | * Copy this message 296 | */ 297 | m.copy = () => exports.smsg(conn, M.fromObject(M.toObject(m))) 298 | 299 | /** 300 | * 301 | * @param {*} jid 302 | * @param {*} forceForward 303 | * @param {*} options 304 | * @returns 305 | */ 306 | m.copyNForward = (jid = m.chat, forceForward = false, options = {}) => conn.copyNForward(jid, m, forceForward, options) 307 | 308 | return m 309 | } 310 | 311 | 312 | let file = require.resolve(__filename) 313 | fs.watchFile(file, () => { 314 | fs.unwatchFile(file) 315 | console.log(chalk.redBright(`Update ${__filename}`)) 316 | delete require.cache[file] 317 | require(file) 318 | }) 319 | -------------------------------------------------------------------------------- /Mzazi/fancy.js: -------------------------------------------------------------------------------- 1 | function apply(map, text) { 2 | let result = ""; 3 | for (let character of text.split("")) { 4 | if (map[character] !== undefined) result += map[character]; 5 | else if (map[character.toLowerCase()] !== undefined) result += map[character.toLowerCase()]; 6 | else result += character; 7 | } 8 | return result; 9 | } 10 | 11 | function list(text, fancy) { 12 | let styles = Object.keys(fancy).filter(e => e.length < 3); 13 | let msg = '\n*Fancy Disponible:*\n\n'; 14 | for (let style in styles) { 15 | if (style == 33) { 16 | msg += (parseInt(style) + 1) + '. ' + 'Keith-Md' + '\n'; 17 | } else { 18 | msg += (parseInt(style) + 1) + '. ' + fancy.apply(fancy[parseInt(style)], text) + '\n'; 19 | } 20 | } 21 | return msg; 22 | } 23 | 24 | module.exports = { 25 | 0:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"ค","b":"๖","c":"¢","d":"໓","e":"ē","f":"f","g":"ງ","h":"h","i":"i","j":"ว","k":"k","l":"l","m":"๓","n":"ຖ","o":"໐","p":"p","q":"๑","r":"r","s":"Ş","t":"t","u":"น","v":"ง","w":"ຟ","x":"x","y":"ฯ","z":"ຊ","A":"ค","B":"๖","C":"¢","D":"໓","E":"ē","F":"f","G":"ງ","H":"h","I":"i","J":"ว","K":"k","L":"l","M":"๓","N":"ຖ","O":"໐","P":"p","Q":"๑","R":"r","S":"Ş","T":"t","U":"น","V":"ง","W":"ຟ","X":"x","Y":"ฯ","Z":"ຊ" }, 26 | 1:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"ą","b":"ც","c":"ƈ","d":"ɖ","e":"ɛ","f":"ʄ","g":"ɠ","h":"ɧ","i":"ı","j":"ʝ","k":"ƙ","l":"Ɩ","m":"ɱ","n":"ŋ","o":"ơ","p":"℘","q":"զ","r":"ཞ","s":"ʂ","t":"ɬ","u":"ų","v":"۷","w":"ῳ","x":"ҳ","y":"ყ","z":"ʑ","A":"ą","B":"ც","C":"ƈ","D":"ɖ","E":"ɛ","F":"ʄ","G":"ɠ","H":"ɧ","I":"ı","J":"ʝ","K":"ƙ","L":"Ɩ","M":"ɱ","N":"ŋ","O":"ơ","P":"℘","Q":"զ","R":"ཞ","S":"ʂ","T":"ɬ","U":"ų","V":"۷","W":"ῳ","X":"ҳ","Y":"ყ","Z":"ʑ" }, 27 | 2:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"ム","b":"乃","c":"ᄃ","d":"り","e":"乇","f":"キ","g":"ム","h":"ん","i":"ノ","j":"フ","k":"ズ","l":"レ","m":"ᄊ","n":"刀","o":"の","p":"ア","q":"ゐ","r":"尺","s":"丂","t":"イ","u":"ひ","v":"√","w":"W","x":"メ","y":"リ","z":"乙","A":"ム","B":"乃","C":"ᄃ","D":"り","E":"乇","F":"キ","G":"ム","H":"ん","I":"ノ","J":"フ","K":"ズ","L":"レ","M":"ᄊ","N":"刀","O":"の","P":"ア","Q":"ゐ","R":"尺","S":"丂","T":"イ","U":"ひ","V":"√","W":"W","X":"メ","Y":"リ","Z":"乙" }, 28 | 3:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"卂","b":"乃","c":"匚","d":"ᗪ","e":"乇","f":"千","g":"Ꮆ","h":"卄","i":"丨","j":"フ","k":"Ҝ","l":"ㄥ","m":"爪","n":"几","o":"ㄖ","p":"卩","q":"Ɋ","r":"尺","s":"丂","t":"ㄒ","u":"ㄩ","v":"ᐯ","w":"山","x":"乂","y":"ㄚ","z":"乙","A":"卂","B":"乃","C":"匚","D":"ᗪ","E":"乇","F":"千","G":"Ꮆ","H":"卄","I":"丨","J":"フ","K":"Ҝ","L":"ㄥ","M":"爪","N":"几","O":"ㄖ","P":"卩","Q":"Ɋ","R":"尺","S":"丂","T":"ㄒ","U":"ㄩ","V":"ᐯ","W":"山","X":"乂","Y":"ㄚ","Z":"乙" }, 29 | 4:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"🄰","b":"🄱","c":"🄲","d":"🄳","e":"🄴","f":"🄵","g":"🄶","h":"🄷","i":"🄸","j":"🄹","k":"🄺","l":"🄻","m":"🄼","n":"🄽","o":"🄾","p":"🄿","q":"🅀","r":"🅁","s":"🅂","t":"🅃","u":"🅄","v":"🅅","w":"🅆","x":"🅇","y":"🅈","z":"🅉","A":"🄰","B":"🄱","C":"🄲","D":"🄳","E":"🄴","F":"🄵","G":"🄶","H":"🄷","I":"🄸","J":"🄹","K":"🄺","L":"🄻","M":"🄼","N":"🄽","O":"🄾","P":"🄿","Q":"🅀","R":"🅁","S":"🅂","T":"🅃","U":"🅄","V":"🅅","W":"🅆","X":"🅇","Y":"🅈","Z":"🅉" }, 30 | 5:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"Ꮧ","b":"Ᏸ","c":"ፈ","d":"Ꮄ","e":"Ꮛ","f":"Ꭶ","g":"Ꮆ","h":"Ꮒ","i":"Ꭵ","j":"Ꮰ","k":"Ꮶ","l":"Ꮭ","m":"Ꮇ","n":"Ꮑ","o":"Ꭷ","p":"Ꭾ","q":"Ꭴ","r":"Ꮢ","s":"Ꮥ","t":"Ꮦ","u":"Ꮼ","v":"Ꮙ","w":"Ꮗ","x":"ጀ","y":"Ꭹ","z":"ፚ","A":"Ꮧ","B":"Ᏸ","C":"ፈ","D":"Ꮄ","E":"Ꮛ","F":"Ꭶ","G":"Ꮆ","H":"Ꮒ","I":"Ꭵ","J":"Ꮰ","K":"Ꮶ","L":"Ꮭ","M":"Ꮇ","N":"Ꮑ","O":"Ꭷ","P":"Ꭾ","Q":"Ꭴ","R":"Ꮢ","S":"Ꮥ","T":"Ꮦ","U":"Ꮼ","V":"Ꮙ","W":"Ꮗ","X":"ጀ","Y":"Ꭹ","Z":"ፚ" }, 31 | 6:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"ᗩ","b":"ᗷ","c":"ᑕ","d":"ᗪ","e":"E","f":"ᖴ","g":"G","h":"ᕼ","i":"I","j":"ᒍ","k":"K","l":"ᒪ","m":"ᗰ","n":"ᑎ","o":"O","p":"ᑭ","q":"ᑫ","r":"ᖇ","s":"ᔕ","t":"T","u":"ᑌ","v":"ᐯ","w":"ᗯ","x":"᙭","y":"Y","z":"ᘔ","A":"ᗩ","B":"ᗷ","C":"ᑕ","D":"ᗪ","E":"E","F":"ᖴ","G":"G","H":"ᕼ","I":"I","J":"ᒍ","K":"K","L":"ᒪ","M":"ᗰ","N":"ᑎ","O":"O","P":"ᑭ","Q":"ᑫ","R":"ᖇ","S":"ᔕ","T":"T","U":"ᑌ","V":"ᐯ","W":"ᗯ","X":"᙭","Y":"Y","Z":"ᘔ" }, 32 | 7:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"ǟ","b":"ɮ","c":"ƈ","d":"ɖ","e":"ɛ","f":"ʄ","g":"ɢ","h":"ɦ","i":"ɨ","j":"ʝ","k":"ӄ","l":"ʟ","m":"ʍ","n":"ռ","o":"օ","p":"ք","q":"զ","r":"ʀ","s":"ֆ","t":"ȶ","u":"ʊ","v":"ʋ","w":"ա","x":"Ӽ","y":"ʏ","z":"ʐ","A":"ǟ","B":"ɮ","C":"ƈ","D":"ɖ","E":"ɛ","F":"ʄ","G":"ɢ","H":"ɦ","I":"ɨ","J":"ʝ","K":"ӄ","L":"ʟ","M":"ʍ","N":"ռ","O":"օ","P":"ք","Q":"զ","R":"ʀ","S":"ֆ","T":"ȶ","U":"ʊ","V":"ʋ","W":"ա","X":"Ӽ","Y":"ʏ","Z":"ʐ" }, 33 | 8:{"0":"𝟶","1":"𝟷","2":"𝟸","3":"𝟹","4":"𝟺","5":"𝟻","6":"𝟼","7":"𝟽","8":"𝟾","9":"𝟿","a":"𝚊","b":"𝚋","c":"𝚌","d":"𝚍","e":"𝚎","f":"𝚏","g":"𝚐","h":"𝚑","i":"𝚒","j":"𝚓","k":"𝚔","l":"𝚕","m":"𝚖","n":"𝚗","o":"𝚘","p":"𝚙","q":"𝚚","r":"𝚛","s":"𝚜","t":"𝚝","u":"𝚞","v":"𝚟","w":"𝚠","x":"𝚡","y":"𝚢","z":"𝚣","A":"𝙰","B":"𝙱","C":"𝙲","D":"𝙳","E":"𝙴","F":"𝙵","G":"𝙶","H":"𝙷","I":"𝙸","J":"𝙹","K":"𝙺","L":"𝙻","M":"𝙼","N":"𝙽","O":"𝙾","P":"𝙿","Q":"𝚀","R":"𝚁","S":"𝚂","T":"𝚃","U":"𝚄","V":"𝚅","W":"𝚆","X":"𝚇","Y":"𝚈","Z":"𝚉" }, 34 | 9:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"𝙖","b":"𝙗","c":"𝙘","d":"𝙙","e":"𝙚","f":"𝙛","g":"𝙜","h":"𝙝","i":"𝙞","j":"𝙟","k":"𝙠","l":"𝙡","m":"𝙢","n":"𝙣","o":"𝙤","p":"𝙥","q":"𝙦","r":"𝙧","s":"𝙨","t":"𝙩","u":"𝙪","v":"𝙫","w":"𝙬","x":"𝙭","y":"𝙮","z":"𝙯","A":"𝘼","B":"𝘽","C":"𝘾","D":"𝘿","E":"𝙀","F":"𝙁","G":"𝙂","H":"𝙃","I":"𝙄","J":"𝙅","K":"𝙆","L":"𝙇","M":"𝙈","N":"𝙉","O":"𝙊","P":"𝙋","Q":"𝙌","R":"𝙍","S":"𝙎","T":"𝙏","U":"𝙐","V":"𝙑","W":"𝙒","X":"𝙓","Y":"𝙔","Z":"𝙕" }, 35 | 10:{"0":"𝟎","1":"𝟏","2":"𝟐","3":"𝟑","4":"𝟒","5":"𝟓","6":"𝟔","7":"𝟕","8":"𝟖","9":"𝟗","a":"𝐚","b":"𝐛","c":"𝐜","d":"𝐝","e":"𝐞","f":"𝐟","g":"𝐠","h":"𝐡","i":"𝐢","j":"𝐣","k":"𝐤","l":"𝐥","m":"𝐦","n":"𝐧","o":"𝐨","p":"𝐩","q":"𝐪","r":"𝐫","s":"𝐬","t":"𝐭","u":"𝐮","v":"𝐯","w":"𝐰","x":"𝐱","y":"𝐲","z":"𝐳","A":"𝐀","B":"𝐁","C":"𝐂","D":"𝐃","E":"𝐄","F":"𝐅","G":"𝐆","H":"𝐇","I":"𝐈","J":"𝐉","K":"𝐊","L":"𝐋","M":"𝐌","N":"𝐍","O":"𝐎","P":"𝐏","Q":"𝐐","R":"𝐑","S":"𝐒","T":"𝐓","U":"𝐔","V":"𝐕","W":"𝐖","X":"𝐗","Y":"𝐘","Z":"𝐙" }, 36 | 11:{"0":"𝟬","1":"𝟭","2":"𝟮","3":"𝟯","4":"𝟰","5":"𝟱","6":"𝟲","7":"𝟳","8":"𝟴","9":"𝟵","a":"𝗮","b":"𝗯","c":"𝗰","d":"𝗱","e":"𝗲","f":"𝗳","g":"𝗴","h":"𝗵","i":"𝗶","j":"𝗷","k":"𝗸","l":"𝗹","m":"𝗺","n":"𝗻","o":"𝗼","p":"𝗽","q":"𝗾","r":"𝗿","s":"𝘀","t":"𝘁","u":"𝘂","v":"𝘃","w":"𝘄","x":"𝘅","y":"𝘆","z":"𝘇","A":"𝗔","B":"𝗕","C":"𝗖","D":"𝗗","E":"𝗘","F":"𝗙","G":"𝗚","H":"𝗛","I":"𝗜","J":"𝗝","K":"𝗞","L":"𝗟","M":"𝗠","N":"𝗡","O":"𝗢","P":"𝗣","Q":"𝗤","R":"𝗥","S":"𝗦","T":"𝗧","U":"𝗨","V":"𝗩","W":"𝗪","X":"𝗫","Y":"𝗬","Z":"𝗭" }, 37 | 12: {"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"𝘢","b":"𝘣","c":"𝘤","d":"𝘥","e":"𝘦","f":"𝘧","g":"𝘨","h":"𝘩","i":"𝘪","j":"𝘫","k":"𝘬","l":"𝘭","m":"𝘮","n":"𝘯","o":"𝘰","p":"𝘱","q":"𝘲","r":"𝘳","s":"𝘴","t":"𝘵","u":"𝘶","v":"𝘷","w":"𝘸","x":"𝘹","y":"𝘺","z":"𝘻","A":"𝘈","B":"𝘉","C":"𝘊","D":"𝘋","E":"𝘌","F":"𝘍","G":"𝘎","H":"𝘏","I":"𝘐","J":"𝘑","K":"𝘒","L":"𝘓","M":"𝘔","N":"𝘕","O":"𝘖","P":"𝘗","Q":"𝘘","R":"𝘙","S":"𝘚","T":"𝘛","U":"𝘜","V":"𝘝","W":"𝘞","X":"𝘟","Y":"𝘠","Z":"𝘡" }, 38 | 13:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"α","b":"Ⴆ","c":"ƈ","d":"ԃ","e":"ҽ","f":"ϝ","g":"ɠ","h":"ԋ","i":"ι","j":"ʝ","k":"ƙ","l":"ʅ","m":"ɱ","n":"ɳ","o":"σ","p":"ρ","q":"ϙ","r":"ɾ","s":"ʂ","t":"ƚ","u":"υ","v":"ʋ","w":"ɯ","x":"x","y":"ყ","z":"ȥ","A":"A","B":"B","C":"C","D":"D","E":"E","F":"F","G":"G","H":"H","I":"I","J":"J","K":"K","L":"L","M":"M","N":"N","O":"O","P":"P","Q":"Q","R":"R","S":"S","T":"T","U":"U","V":"V","W":"W","X":"X","Y":"Y","Z":"Z" }, 39 | 14:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"₳","b":"฿","c":"₵","d":"Đ","e":"Ɇ","f":"₣","g":"₲","h":"Ⱨ","i":"ł","j":"J","k":"₭","l":"Ⱡ","m":"₥","n":"₦","o":"Ø","p":"₱","q":"Q","r":"Ɽ","s":"₴","t":"₮","u":"Ʉ","v":"V","w":"₩","x":"Ӿ","y":"Ɏ","z":"Ⱬ","A":"₳","B":"฿","C":"₵","D":"Đ","E":"Ɇ","F":"₣","G":"₲","H":"Ⱨ","I":"ł","J":"J","K":"₭","L":"Ⱡ","M":"₥","N":"₦","O":"Ø","P":"₱","Q":"Q","R":"Ɽ","S":"₴","T":"₮","U":"Ʉ","V":"V","W":"₩","X":"Ӿ","Y":"Ɏ","Z":"Ⱬ" }, 40 | 15:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"å","b":"ß","c":"¢","d":"Ð","e":"ê","f":"£","g":"g","h":"h","i":"ï","j":"j","k":"k","l":"l","m":"m","n":"ñ","o":"ð","p":"þ","q":"q","r":"r","s":"§","t":"†","u":"µ","v":"v","w":"w","x":"x","y":"¥","z":"z","A":"Ä","B":"ß","C":"Ç","D":"Ð","E":"È","F":"£","G":"G","H":"H","I":"Ì","J":"J","K":"K","L":"L","M":"M","N":"ñ","O":"Ö","P":"þ","Q":"Q","R":"R","S":"§","T":"†","U":"Ú","V":"V","W":"W","X":"×","Y":"¥","Z":"Z" }, 41 | 16:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"α","b":"в","c":"¢","d":"∂","e":"є","f":"ƒ","g":"g","h":"н","i":"ι","j":"נ","k":"к","l":"ℓ","m":"м","n":"η","o":"σ","p":"ρ","q":"q","r":"я","s":"ѕ","t":"т","u":"υ","v":"ν","w":"ω","x":"χ","y":"у","z":"z","A":"α","B":"в","C":"¢","D":"∂","E":"є","F":"ƒ","G":"g","H":"н","I":"ι","J":"נ","K":"к","L":"ℓ","M":"м","N":"η","O":"σ","P":"ρ","Q":"q","R":"я","S":"ѕ","T":"т","U":"υ","V":"ν","W":"ω","X":"χ","Y":"у","Z":"z" }, 42 | 17:{"0":"⊘","1":"𝟙","2":"ϩ","3":"Ӡ","4":"५","5":"Ƽ","6":"Ϭ","7":"7","8":"𝟠","9":"९","a":"ą","b":"ҍ","c":"ç","d":"ժ","e":"ҽ","f":"ƒ","g":"ց","h":"հ","i":"ì","j":"ʝ","k":"ҟ","l":"Ӏ","m":"ʍ","n":"ղ","o":"օ","p":"ք","q":"զ","r":"ɾ","s":"ʂ","t":"է","u":"մ","v":"ѵ","w":"ա","x":"×","y":"վ","z":"Հ","A":"Ⱥ","B":"β","C":"↻","D":"Ꭰ","E":"Ɛ","F":"Ƒ","G":"Ɠ","H":"Ƕ","I":"į","J":"ل","K":"Ҡ","L":"Ꝉ","M":"Ɱ","N":"ហ","O":"ට","P":"φ","Q":"Ҩ","R":"འ","S":"Ϛ","T":"Ͳ","U":"Ա","V":"Ỽ","W":"చ","X":"ჯ","Y":"Ӌ","Z":"ɀ" }, 43 | 18:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"Λ","b":"B","c":"ᄃ","d":"D","e":"Σ","f":"F","g":"G","h":"Ή","i":"I","j":"J","k":"K","l":"ᄂ","m":"M","n":"П","o":"Ө","p":"P","q":"Q","r":"Я","s":"Ƨ","t":"Ƭ","u":"Ц","v":"V","w":"Щ","x":"X","y":"Y","z":"Z","A":"Λ","B":"B","C":"ᄃ","D":"D","E":"Σ","F":"F","G":"G","H":"Ή","I":"I","J":"J","K":"K","L":"ᄂ","M":"M","N":"П","O":"Ө","P":"P","Q":"Q","R":"Я","S":"Ƨ","T":"Ƭ","U":"Ц","V":"V","W":"Щ","X":"X","Y":"Y","Z":"Z" }, 44 | 19:{"0":"₀","1":"₁","2":"₂","3":"₃","4":"₄","5":"₅","6":"₆","7":"₇","8":"₈","9":"₉","a":"ₐ","b":"b","c":"c","d":"d","e":"ₑ","f":"f","g":"g","h":"ₕ","i":"ᵢ","j":"ⱼ","k":"ₖ","l":"ₗ","m":"ₘ","n":"ₙ","o":"ₒ","p":"ₚ","q":"q","r":"ᵣ","s":"ₛ","t":"ₜ","u":"ᵤ","v":"ᵥ","w":"w","x":"ₓ","y":"y","z":"z","A":"ₐ","B":"B","C":"C","D":"D","E":"ₑ","F":"F","G":"G","H":"ₕ","I":"ᵢ","J":"ⱼ","K":"ₖ","L":"ₗ","M":"ₘ","N":"ₙ","O":"ₒ","P":"ₚ","Q":"Q","R":"ᵣ","S":"ₛ","T":"ₜ","U":"ᵤ","V":"ᵥ","W":"W","X":"ₓ","Y":"Y","Z":"Z","+":"₊","-":"₋",":":"₌","(":"₍",")":"₎" }, 45 | 20:{"0":"⁰","1":"¹","2":"²","3":"³","4":"⁴","5":"⁵","6":"⁶","7":"⁷","8":"⁸","9":"⁹","a":"ᵃ","b":"ᵇ","c":"ᶜ","d":"ᵈ","e":"ᵉ","f":"ᶠ","g":"ᵍ","h":"ʰ","i":"ⁱ","j":"ʲ","k":"ᵏ","l":"ˡ","m":"ᵐ","n":"ⁿ","o":"ᵒ","p":"ᵖ","q":"q","r":"ʳ","s":"ˢ","t":"ᵗ","u":"ᵘ","v":"ᵛ","w":"ʷ","x":"ˣ","y":"ʸ","z":"ᶻ","A":"ᴬ","B":"ᴮ","C":"ᶜ","D":"ᴰ","E":"ᴱ","F":"ᶠ","G":"ᴳ","H":"ᴴ","I":"ᴵ","J":"ᴶ","K":"ᴷ","L":"ᴸ","M":"ᴹ","N":"ᴺ","O":"ᴼ","P":"ᴾ","Q":"Q","R":"ᴿ","S":"ˢ","T":"ᵀ","U":"ᵁ","V":"ⱽ","W":"ᵂ","X":"ˣ","Y":"ʸ","Z":"ᶻ","+":"⁺","-":"⁻",":":"⁼","(":"⁽",")":"⁾" }, 46 | 21:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"ค","b":"๒","c":"ς","d":"๔","e":"є","f":"Ŧ","g":"ﻮ","h":"ђ","i":"เ","j":"ן","k":"к","l":"ɭ","m":"๓","n":"ภ","o":"๏","p":"ק","q":"ợ","r":"г","s":"ร","t":"Շ","u":"ย","v":"ש","w":"ฬ","x":"א","y":"ץ","z":"չ","A":"ค","B":"๒","C":"ς","D":"๔","E":"є","F":"Ŧ","G":"ﻮ","H":"ђ","I":"เ","J":"ן","K":"к","L":"ɭ","M":"๓","N":"ภ","O":"๏","P":"ק","Q":"ợ","R":"г","S":"ร","T":"Շ","U":"ย","V":"ש","W":"ฬ","X":"א","Y":"ץ","Z":"չ" }, 47 | 22:{"0":"𝟘","1":"𝟙","2":"𝟚","3":"𝟛","4":"𝟜","5":"𝟝","6":"𝟞","7":"𝟟","8":"𝟠","9":"𝟡","a":"𝕒","b":"𝕓","c":"𝕔","d":"𝕕","e":"𝕖","f":"𝕗","g":"𝕘","h":"𝕙","i":"𝕚","j":"𝕛","k":"𝕜","l":"𝕝","m":"𝕞","n":"𝕟","o":"𝕠","p":"𝕡","q":"𝕢","r":"𝕣","s":"𝕤","t":"𝕥","u":"𝕦","v":"𝕧","w":"𝕨","x":"𝕩","y":"𝕪","z":"𝕫","A":"𝔸","B":"𝔹","C":"ℂ","D":"𝔻","E":"𝔼","F":"𝔽","G":"𝔾","H":"ℍ","I":"𝕀","J":"𝕁","K":"𝕂","L":"𝕃","M":"𝕄","N":"ℕ","O":"𝕆","P":"ℙ","Q":"ℚ","R":"ℝ","S":"𝕊","T":"𝕋","U":"𝕌","V":"𝕍","W":"𝕎","X":"𝕏","Y":"𝕐","Z":"ℤ" }, 48 | 23:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"𝖆","b":"𝖇","c":"𝖈","d":"𝖉","e":"𝖊","f":"𝖋","g":"𝖌","h":"𝖍","i":"𝖎","j":"𝖏","k":"𝖐","l":"𝖑","m":"𝖒","n":"𝖓","o":"𝖔","p":"𝖕","q":"𝖖","r":"𝖗","s":"𝖘","t":"𝖙","u":"𝖚","v":"𝖛","w":"𝖜","x":"𝖝","y":"𝖞","z":"𝖟","A":"𝕬","B":"𝕭","C":"𝕮","D":"𝕯","E":"𝕰","F":"𝕱","G":"𝕲","H":"𝕳","I":"𝕴","J":"𝕵","K":"𝕶","L":"𝕷","M":"𝕸","N":"𝕹","O":"𝕺","P":"𝕻","Q":"𝕼","R":"𝕽","S":"𝕾","T":"𝕿","U":"𝖀","V":"𝖁","W":"𝖂","X":"𝖃","Y":"𝖄","Z":"𝖅" }, 49 | 24:{q:"🆀",w:"🆆",e:"🅴",r:"🆁",t:"🆃",y:"🆈",u:"🆄",i:"🅸",o:"🅾",p:"🅿",a:"🅰",s:"🆂",d:"🅳",f:"🅵",g:"🅶",h:"🅷",j:"🅹",k:"🅺",l:"🅻",z:"🆉",x:"🆇",c:"🅲",v:"🆅",b:"🅱",n:"🅽",m:"🅼"}, 50 | 25:{"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","a":"𝓪","b":"𝓫","c":"𝓬","d":"𝓭","e":"𝓮","f":"𝓯","g":"𝓰","h":"𝓱","i":"𝓲","j":"𝓳","k":"𝓴","l":"𝓵","m":"𝓶","n":"𝓷","o":"𝓸","p":"𝓹","q":"𝓺","r":"𝓻","s":"𝓼","t":"𝓽","u":"𝓾","v":"𝓿","w":"𝔀","x":"𝔁","y":"𝔂","z":"𝔃","A":"𝓐","B":"𝓑","C":"𝓒","D":"𝓓","E":"𝓔","F":"𝓕","G":"𝓖","H":"𝓗","I":"𝓘","J":"𝓙","K":"𝓚","L":"𝓛","M":"𝓜","N":"𝓝","O":"𝓞","P":"𝓟","Q":"𝓠","R":"𝓡","S":"𝓢","T":"𝓣","U":"𝓤","V":"𝓥","W":"𝓦","X":"𝓧","Y":"𝓨","Z":"𝓩" }, 51 | 26:{"a":"𝔞","b":"𝔟","c":"𝔠","d":"𝔡","e":"𝔢","f":"𝔣","g":"𝔤","h":"𝔥","i":"𝔦","j":"𝔧","k":"𝔨","l":"𝔩","m":"𝔪","n":"𝔫","o":"𝔬","p":"𝔭","q":"𝔮","r":"𝔯","s":"𝔰","t":"𝔱","u":"𝔲","v":"𝔳","w":"𝔴","x":"𝔵","y":"𝔶","z":"𝔷","A":"𝔄","B":"𝔅","C":"ℭ","D":"𝔇","E":"𝔈","F":"𝔉","G":"𝔊","H":"ℌ","I":"ℑ","J":"𝔍","K":"𝔎","L":"𝔏","M":"𝔐","N":"𝔑","O":"𝔒","P":"𝔓","Q":"𝔔","R":"ℜ","S":"𝔖","T":"𝔗","U":"𝔘","V":"𝔙","W":"𝔚","X":"𝔛","Y":"𝔜","Z":"ℨ" }, 52 | 27:{"`":"`","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","0":"0","-":"-",":":"=","~":"~","!":"!","@":"@","#":"#","$":"$","%":"%","^":"^","&":"&","*":"*","(":"(",")":")","_":"_","+":"+","q":"q","w":"w","e":"e","r":"r","t":"t","y":"y","u":"u","i":"i","o":"o","p":"p","[":"[","]":"]","\\":"\\","Q":"Q","W":"W","E":"E","R":"R","T":"T","Y":"Y","U":"U","I":"I","O":"O","P":"P","{":"{","}":"}","|":"|","a":"a","s":"s","d":"d","f":"f","g":"g","h":"h","j":"j","k":"k","l":"l",";":";","'":"'","A":"A","S":"S","D":"D","F":"F","G":"G","H":"H","J":"J","K":"K","L":"L",":":":","\"":"\"","z":"z","x":"x","c":"c","v":"v","b":"b","n":"n","m":"m",",":",",".":".","/":"/","Z":"Z","X":"X","C":"C","V":"V","B":"B","N":"N","M":"M","<":"<",">":">","?":"?"}, 53 | 28:{"a":"ᴀ","b":"ʙ","c":"ᴄ","d":"ᴅ","e":"ᴇ","f":"ғ","g":"ɢ","h":"ʜ","i":"ɪ","j":"ᴊ","k":"ᴋ","l":"ʟ","m":"ᴍ","n":"ɴ","o":"ᴏ","p":"ᴘ","q":"ǫ","r":"ʀ","s":"s","t":"ᴛ","u":"ᴜ","v":"ᴠ","w":"ᴡ","x":"x","y":"ʏ","z":"ᴢ","A":"ᴀ","B":"ʙ","C":"ᴄ","D":"ᴅ","E":"ᴇ","F":"ғ","G":"ɢ","H":"ʜ","I":"ɪ","J":"ᴊ","K":"ᴋ","L":"ʟ","M":"ᴍ","N":"ɴ","O":"ᴏ","P":"ᴘ","Q":"ǫ","R":"ʀ","S":"s","T":"ᴛ","U":"ᴜ","V":"ᴠ","W":"ᴡ","X":"x","Y":"ʏ","Z":"ᴢ" }, 54 | 29:{"a":"𝒂","b":"𝒃","c":"𝒄","d":"𝒅","e":"𝒆","f":"𝒇","g":"𝒈","h":"𝒉","i":"𝒊","j":"𝒋","k":"𝒌","l":"𝒍","m":"𝒎","n":"𝒏","o":"𝒐","p":"𝒑","q":"𝒒","r":"𝒓","s":"𝒔","t":"𝒕","u":"𝒖","v":"𝒗","w":"𝒘","x":"𝒙","y":"𝒚","z":"𝒛","A":"𝐴","B":"𝐵","C":"𝐶","D":"𝐷","E":"𝐸","F":"𝐹","G":"𝐺","H":"𝐻","I":"𝐼","J":"𝐽","K":"𝐾","L":"𝐿","M":"𝑀","N":"𝑁","O":"𝑂","P":"𝑃","Q":"𝑄","R":"𝑅","S":"𝑆","T":"𝑇","U":"𝑈","V":"𝑉","W":"𝑊","X":"𝑋","Y":"𝑌","Z":"𝑍" }, 55 | 30:{"a":"𝛥","b":"𝐵","c":"𝐶","d":"𝐷","e":"𝛯","f":"𝐹","g":"𝐺","h":"𝛨","i":"𝛪","j":"𝐽","k":"𝛫","l":"𝐿","m":"𝛭","n":"𝛮","o":"𝛩","p":"𝛲","q":"𝑄","r":"𝑅","s":"𝑆","t":"𝑇","u":"𝑈","v":"𝛻","w":"𝑊","x":"𝛸","y":"𝑌","z":"𝛧","A":"𝛥","B":"𝐵","C":"𝐶","D":"𝐷","E":"𝛯","F":"𝐹","G":"𝐺","H":"𝛨","I":"𝛪","J":"𝐽","K":"𝛫","L":"𝐿","M":"𝛭","N":"𝛮","O":"𝛩","P":"𝛲","Q":"𝑄","R":"𝑅","S":"𝑆","T":"𝑇","U":"𝑈","V":"𝛻","W":"𝑊","X":"𝛸","Y":"𝑌","Z":"𝛧"}, 56 | 31:{"A":"𝚫","B":"𝚩","C":"𝐂","D":"𝐃","E":"𝚵","F":"𝐅","G":"𝐆","H":"𝚮","I":"𝚰","J":"𝐉","K":"𝐊","L":"𝐋","M":"𝚳","N":"𝚴","O":"𝚯","P":"𝚸","Q":"𝐐","R":"𝚪","S":"𝐒","T":"𝚻","U":"𝐔","V":"𝛁","W":"𝐖","X":"𝚾","Y":"𝐘","Z":"𝚭","a":"𝚫","b":"𝚩","c":"𝐂","d":"𝐃","e":"𝚵","f":"𝐅","g":"𝐆","h":"𝚮","i":"𝚰","j":"𝐉","k":"𝐊","l":"𝐋","m":"𝚳","n":"𝚴","o":"𝚯","p":"𝚸","q":"𝐐","r":"𝚪","s":"𝐒","t":"𝚻","u":"𝐔","v":"𝛁","w":"𝐖","x":"𝚾","y":"𝐘","z":"𝚭"}, 57 | 32:{"A":"ꪖ","B":"᥇","C":"ᥴ","D":"ᦔ","E":"ꫀ","F":"ᠻ","G":"ᧁ","H":"ꫝ","I":"ﺃ","J":"꠹","K":"ᛕ","L":"ꪶ","M":"ꪑ","N":"ꪀ","O":"ꪮ","P":"ᜣ","Q":"ꪇ","R":"᥅","S":"ᦓ","T":"ꪻ","U":"ꪊ","V":"ꪜ","W":"᭙","X":"᥊","Y":"ꪗ","Z":"ɀ","a":"ꪖ","b":"᥇","c":"ᥴ","d":"ᦔ","e":"ꫀ","f":"ᠻ","g":"ᧁ","h":"ꫝ","i":"ﺃ","j":"꠹","k":"ᛕ","l":"ꪶ","m":"ꪑ","n":"ꪀ","o":"ꪮ","p":"ᜣ","q":"ꪇ","r":"᥅","s":"ᦓ","t":"ꪻ","u":"ꪊ","v":"ꪜ","w":"᭙","x":"᥊","y":"ꪗ","z":"ɀ"}, 58 | 33:{"ഒ":"ඉ","എ":"ᬤ","ഉ":"ຂ","ക":"ᤌ‌","ഗ":"ꪭ","ത":"ꫧ","ന":"ღ͢","മ്പ":"൩","വ":"൨","യ":"ᨨ͓","ര":"ᰍ","ി":"᭄","ീ":"ꪻ","ാ":"ꫂ","(":"ꪶ","ു":"⫰","‌്":"᷃","്":"ັ","ർ":"൪","ണ":"𑇥̅","ട":"ຮ","ട്ട":"ჴ","െ":"൭͛","ം":"◕","ഞ":"ൡ̅","േ":"ල","ൽ":"ᰢ","ന്ന":"ꢳ"}, 59 | apply, 60 | list 61 | }; 62 | --------------------------------------------------------------------------------