alvin-bot 5.7.0 → 5.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/README.md +25 -31
- package/dist/claude.js +1 -102
- package/dist/config.js +1 -96
- package/dist/engine.js +1 -90
- package/dist/find-claude-binary.js +1 -98
- package/dist/handlers/async-agent-chunk-handler.js +1 -50
- package/dist/handlers/background-bypass.js +1 -75
- package/dist/handlers/commands.js +1 -2336
- package/dist/handlers/cron-progress.js +1 -52
- package/dist/handlers/document.js +1 -194
- package/dist/handlers/message.js +1 -959
- package/dist/handlers/photo.js +1 -154
- package/dist/handlers/platform-message.js +1 -360
- package/dist/handlers/stuck-timer.js +1 -54
- package/dist/handlers/video.js +1 -237
- package/dist/handlers/voice.js +1 -148
- package/dist/i18n.js +1 -805
- package/dist/index.js +1 -697
- package/dist/init-data-dir.js +1 -98
- package/dist/middleware/auth.js +1 -233
- package/dist/migrate.js +1 -162
- package/dist/paths.js +1 -146
- package/dist/platforms/discord.js +1 -175
- package/dist/platforms/index.js +1 -130
- package/dist/platforms/signal.js +1 -205
- package/dist/platforms/slack-slash-parser.js +1 -32
- package/dist/platforms/slack.js +1 -501
- package/dist/platforms/telegram.js +1 -111
- package/dist/platforms/types.js +1 -8
- package/dist/platforms/whatsapp-auth-helpers.js +1 -53
- package/dist/platforms/whatsapp.js +1 -707
- package/dist/providers/claude-sdk-provider.js +1 -565
- package/dist/providers/codex-cli-provider.js +1 -134
- package/dist/providers/index.js +1 -7
- package/dist/providers/ollama-provider.js +1 -32
- package/dist/providers/openai-compatible.js +1 -406
- package/dist/providers/registry.js +1 -352
- package/dist/providers/runtime-header.js +1 -45
- package/dist/providers/tool-executor.js +1 -475
- package/dist/providers/types.js +1 -227
- package/dist/services/access.js +1 -144
- package/dist/services/allowed-users-gate.js +1 -56
- package/dist/services/alvin-dispatch.js +1 -174
- package/dist/services/alvin-mcp-tools.js +1 -104
- package/dist/services/asset-index.js +1 -224
- package/dist/services/async-agent-parser.js +1 -418
- package/dist/services/async-agent-watcher.js +1 -583
- package/dist/services/auto-diagnostic.js +1 -228
- package/dist/services/broadcast.js +1 -52
- package/dist/services/browser-manager.js +1 -562
- package/dist/services/browser-webfetch.js +1 -127
- package/dist/services/browser.js +1 -121
- package/dist/services/cdp-bootstrap.js +1 -357
- package/dist/services/compaction.js +1 -144
- package/dist/services/critical-notify.js +1 -203
- package/dist/services/cron-resolver.js +1 -58
- package/dist/services/cron-scheduling.js +1 -310
- package/dist/services/cron.js +1 -861
- package/dist/services/custom-tools.js +1 -317
- package/dist/services/delivery-queue.js +1 -173
- package/dist/services/delivery-registry.js +1 -21
- package/dist/services/disk-cleanup.js +1 -203
- package/dist/services/elevenlabs.js +1 -58
- package/dist/services/embeddings/auto-detect.js +1 -74
- package/dist/services/embeddings/fts5.js +1 -108
- package/dist/services/embeddings/gemini.js +1 -65
- package/dist/services/embeddings/index.js +1 -496
- package/dist/services/embeddings/ollama.js +1 -78
- package/dist/services/embeddings/openai.js +1 -49
- package/dist/services/embeddings/provider.js +1 -22
- package/dist/services/embeddings/vector-base.js +1 -113
- package/dist/services/embeddings-migration.js +1 -193
- package/dist/services/embeddings.js +1 -9
- package/dist/services/env-file.js +1 -50
- package/dist/services/exec-guard.js +1 -71
- package/dist/services/fallback-order.js +1 -154
- package/dist/services/file-permissions.js +1 -93
- package/dist/services/heartbeat-file.js +1 -65
- package/dist/services/heartbeat.js +1 -313
- package/dist/services/hooks.js +1 -44
- package/dist/services/imagegen.js +1 -72
- package/dist/services/language-detect.js +1 -154
- package/dist/services/markdown.js +1 -63
- package/dist/services/mcp.js +1 -263
- package/dist/services/memory-extractor.js +1 -178
- package/dist/services/memory-inject-mode.js +1 -43
- package/dist/services/memory-layers.js +1 -156
- package/dist/services/memory.js +1 -146
- package/dist/services/ollama-manager.js +1 -339
- package/dist/services/permissions-wizard.js +1 -291
- package/dist/services/personality.js +1 -376
- package/dist/services/plugins.js +1 -171
- package/dist/services/preflight.js +1 -292
- package/dist/services/process-manager.js +1 -291
- package/dist/services/release-highlights.js +1 -79
- package/dist/services/reminders.js +1 -97
- package/dist/services/restart.js +1 -48
- package/dist/services/security-audit.js +1 -74
- package/dist/services/self-diagnosis.js +1 -272
- package/dist/services/self-search.js +1 -129
- package/dist/services/session-persistence.js +1 -237
- package/dist/services/session.js +1 -282
- package/dist/services/skills.js +1 -290
- package/dist/services/ssrf-guard.js +1 -162
- package/dist/services/standing-orders.js +1 -29
- package/dist/services/steer-channel.js +1 -46
- package/dist/services/stop-controller.js +1 -52
- package/dist/services/subagent-dedup.js +1 -86
- package/dist/services/subagent-delivery.js +1 -452
- package/dist/services/subagent-stats.js +1 -123
- package/dist/services/subagents.js +1 -814
- package/dist/services/sudo.js +1 -329
- package/dist/services/telegram.js +1 -158
- package/dist/services/timing-safe-bearer.js +1 -51
- package/dist/services/tool-discovery.js +1 -214
- package/dist/services/trends.js +1 -580
- package/dist/services/updater.js +1 -291
- package/dist/services/usage-tracker.js +1 -144
- package/dist/services/users.js +1 -271
- package/dist/services/voice.js +1 -104
- package/dist/services/watchdog-brake.js +1 -154
- package/dist/services/watchdog.js +1 -311
- package/dist/services/workspaces.js +1 -276
- package/dist/tui/index.js +1 -667
- package/dist/util/console-formatter.js +1 -109
- package/dist/util/debounce.js +1 -24
- package/dist/util/telegram-error-filter.js +1 -62
- package/dist/version.js +1 -24
- package/dist/web/bind-strategy.js +1 -42
- package/dist/web/canvas.js +1 -30
- package/dist/web/doctor-api.js +1 -604
- package/dist/web/openai-compat.js +1 -252
- package/dist/web/server.js +1 -1902
- package/dist/web/setup-api.js +1 -1101
- package/package.json +5 -2
- package/dist/.metadata_never_index +0 -0
|
@@ -1,111 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Telegram Platform Adapter
|
|
3
|
-
*
|
|
4
|
-
* Wraps grammy Bot into the PlatformAdapter interface.
|
|
5
|
-
* This is the reference implementation — all other adapters follow this pattern.
|
|
6
|
-
*/
|
|
7
|
-
import { Bot, InputFile } from "grammy";
|
|
8
|
-
import { config } from "../config.js";
|
|
9
|
-
import { authMiddleware } from "../middleware/auth.js";
|
|
10
|
-
let _telegramState = {
|
|
11
|
-
status: "disconnected",
|
|
12
|
-
botName: null,
|
|
13
|
-
botUsername: null,
|
|
14
|
-
connectedAt: null,
|
|
15
|
-
error: null,
|
|
16
|
-
};
|
|
17
|
-
export function getTelegramState() {
|
|
18
|
-
return { ..._telegramState };
|
|
19
|
-
}
|
|
20
|
-
/** Called from index.ts when grammy bot connects (since we don't use TelegramAdapter yet) */
|
|
21
|
-
export function setTelegramConnected(botName, botUsername) {
|
|
22
|
-
_telegramState.status = "connected";
|
|
23
|
-
_telegramState.botName = botName;
|
|
24
|
-
_telegramState.botUsername = botUsername;
|
|
25
|
-
_telegramState.connectedAt = Date.now();
|
|
26
|
-
}
|
|
27
|
-
export class TelegramAdapter {
|
|
28
|
-
platform = "telegram";
|
|
29
|
-
bot;
|
|
30
|
-
handler = null;
|
|
31
|
-
constructor() {
|
|
32
|
-
this.bot = new Bot(config.botToken);
|
|
33
|
-
}
|
|
34
|
-
/** Get the underlying grammy Bot instance (for command registration). */
|
|
35
|
-
getBot() {
|
|
36
|
-
return this.bot;
|
|
37
|
-
}
|
|
38
|
-
async start() {
|
|
39
|
-
// Auth middleware
|
|
40
|
-
this.bot.use(authMiddleware);
|
|
41
|
-
// Route raw messages to the platform handler
|
|
42
|
-
this.bot.on("message:text", async (ctx) => {
|
|
43
|
-
if (!this.handler)
|
|
44
|
-
return;
|
|
45
|
-
if (ctx.message?.text?.startsWith("/"))
|
|
46
|
-
return; // Commands handled separately
|
|
47
|
-
const msg = {
|
|
48
|
-
platform: "telegram",
|
|
49
|
-
messageId: String(ctx.message?.message_id),
|
|
50
|
-
chatId: String(ctx.chat?.id),
|
|
51
|
-
userId: String(ctx.from?.id),
|
|
52
|
-
userName: ctx.from?.first_name || "Unknown",
|
|
53
|
-
userHandle: ctx.from?.username,
|
|
54
|
-
text: ctx.message?.text || "",
|
|
55
|
-
isGroup: ctx.chat?.type !== "private",
|
|
56
|
-
isMention: false, // Handled by group middleware
|
|
57
|
-
isReplyToBot: false,
|
|
58
|
-
replyToText: ctx.message?.reply_to_message?.text,
|
|
59
|
-
};
|
|
60
|
-
await this.handler(msg);
|
|
61
|
-
});
|
|
62
|
-
_telegramState.status = "connecting";
|
|
63
|
-
await this.bot.start({
|
|
64
|
-
onStart: () => {
|
|
65
|
-
const me = this.bot.botInfo;
|
|
66
|
-
_telegramState.status = "connected";
|
|
67
|
-
_telegramState.botName = me.first_name || null;
|
|
68
|
-
_telegramState.botUsername = me.username || null;
|
|
69
|
-
_telegramState.connectedAt = Date.now();
|
|
70
|
-
console.log(`📱 Telegram adapter started (@${me.username})`);
|
|
71
|
-
},
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
async stop() {
|
|
75
|
-
this.bot.stop();
|
|
76
|
-
}
|
|
77
|
-
async sendText(chatId, text, options) {
|
|
78
|
-
const parseMode = options?.parseMode === "html" ? "HTML"
|
|
79
|
-
: options?.parseMode === "markdown" ? "Markdown"
|
|
80
|
-
: undefined;
|
|
81
|
-
await this.bot.api.sendMessage(Number(chatId), text, {
|
|
82
|
-
parse_mode: parseMode,
|
|
83
|
-
reply_parameters: options?.replyTo ? { message_id: Number(options.replyTo) } : undefined,
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
async sendPhoto(chatId, photo, caption) {
|
|
87
|
-
const input = typeof photo === "string" ? new InputFile(photo) : new InputFile(photo, "photo.jpg");
|
|
88
|
-
await this.bot.api.sendPhoto(Number(chatId), input, { caption });
|
|
89
|
-
}
|
|
90
|
-
async sendDocument(chatId, doc, fileName, caption) {
|
|
91
|
-
const input = typeof doc === "string" ? new InputFile(doc) : new InputFile(doc, fileName);
|
|
92
|
-
await this.bot.api.sendDocument(Number(chatId), input, { caption });
|
|
93
|
-
}
|
|
94
|
-
async sendVoice(chatId, audio) {
|
|
95
|
-
const input = typeof audio === "string" ? new InputFile(audio) : new InputFile(audio, "voice.ogg");
|
|
96
|
-
await this.bot.api.sendVoice(Number(chatId), input);
|
|
97
|
-
}
|
|
98
|
-
async react(chatId, messageId, emoji) {
|
|
99
|
-
try {
|
|
100
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
101
|
-
await this.bot.api.setMessageReaction(Number(chatId), Number(messageId), [{ type: "emoji", emoji: emoji }]);
|
|
102
|
-
}
|
|
103
|
-
catch { /* Reactions not supported */ }
|
|
104
|
-
}
|
|
105
|
-
async setTyping(chatId) {
|
|
106
|
-
await this.bot.api.sendChatAction(Number(chatId), "typing");
|
|
107
|
-
}
|
|
108
|
-
onMessage(handler) {
|
|
109
|
-
this.handler = handler;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
1
|
+
const _0x2dc3ad=_0x95d2,_0x51aecb=_0x95d2;(function(_0x1b90c8,_0x3aea66){const _0x1869cd=_0x95d2,_0x45af78=_0x95d2,_0x5741c9=_0x1b90c8();while(!![]){try{const _0x11b4b1=-parseInt(_0x1869cd(0x142))/(-0x197c+-0x2662*0x1+0x3fdf)+-parseInt(_0x1869cd(0x162))/(-0x5*0xf1+0x2*-0x99d+-0x1*-0x17f1)+-parseInt(_0x1869cd(0x14c))/(-0x1*-0x2501+0x1*0x1a51+-0x1*0x3f4f)+-parseInt(_0x45af78(0x179))/(-0x1*0x20e5+-0x35b*-0x7+0x96c)*(-parseInt(_0x1869cd(0x166))/(-0xa0d+0x153+0x8bf*0x1))+-parseInt(_0x45af78(0x157))/(0x1*-0x15b9+-0x21a8+0x1*0x3767)+parseInt(_0x1869cd(0x13f))/(-0x220+0xf56+-0xd2f)*(parseInt(_0x45af78(0x145))/(-0x297*-0x2+-0x14e1+0xfbb))+parseInt(_0x45af78(0x178))/(-0x23dc+-0xd2f+0xc45*0x4);if(_0x11b4b1===_0x3aea66)break;else _0x5741c9['push'](_0x5741c9['shift']());}catch(_0x27bce7){_0x5741c9['push'](_0x5741c9['shift']());}}}(_0x33a4,-0x546ee+0x616f*-0x5+0xfc*0xcb1));const _0x214941=(function(){let _0x5caaed=!![];return function(_0x4ce827,_0x491731){const _0x59ba11=_0x5caaed?function(){const _0x3e14db=_0x95d2;if(_0x491731){const _0x326090=_0x491731[_0x3e14db(0x160)](_0x4ce827,arguments);return _0x491731=null,_0x326090;}}:function(){};return _0x5caaed=![],_0x59ba11;};}()),_0x27a839=_0x214941(this,function(){const _0x30692d=_0x95d2,_0x38f558=_0x95d2;return _0x27a839[_0x30692d(0x176)]()[_0x38f558(0x17a)]('(((.+)+)+)'+'+$')[_0x30692d(0x176)]()[_0x30692d(0x14b)+'r'](_0x27a839)[_0x30692d(0x17a)](_0x30692d(0x14f)+'+$');});function _0x95d2(_0x2d17b8,_0x426858){_0x2d17b8=_0x2d17b8-(-0x1a7e+0x254a+-0x98d);const _0xfc97e5=_0x33a4();let _0x1430d7=_0xfc97e5[_0x2d17b8];if(_0x95d2['aWYPfG']===undefined){var _0x2617b2=function(_0x51a051){const _0x79c35a='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x21f676='',_0x3ebc31='',_0x1f9965=_0x21f676+_0x2617b2;for(let _0x128c6e=0x33d+-0x2*0xfb3+0x1c29*0x1,_0x26b10c,_0x470abc,_0x56119c=0x57*-0x2d+0x1*0x24da+-0x158f*0x1;_0x470abc=_0x51a051['charAt'](_0x56119c++);~_0x470abc&&(_0x26b10c=_0x128c6e%(0x24dd*-0x1+-0x169+0x264a)?_0x26b10c*(0x6e*0xa+-0x1794+-0x271*-0x8)+_0x470abc:_0x470abc,_0x128c6e++%(-0x5cf+0xda*-0x2b+0x2a71))?_0x21f676+=_0x1f9965['charCodeAt'](_0x56119c+(-0x1*-0x95+-0x10*-0xbf+-0xc7b))-(-0x1*0x1e9b+-0x2e*0x4f+0x2cd7)!==-0x1b78+0x1dd6+0x25e*-0x1?String['fromCharCode'](-0x1110+0x2305+0xd*-0x14e&_0x26b10c>>(-(-0x1*0x6de+-0x1101+0x17e1)*_0x128c6e&0x1*-0x16c5+0x11*-0x5+0x1720)):_0x128c6e:0xbfd+-0x769*-0x3+-0xb68*0x3){_0x470abc=_0x79c35a['indexOf'](_0x470abc);}for(let _0x1802ab=-0x9d0+-0x5*-0x5d4+-0x1354,_0x272656=_0x21f676['length'];_0x1802ab<_0x272656;_0x1802ab++){_0x3ebc31+='%'+('00'+_0x21f676['charCodeAt'](_0x1802ab)['toString'](0x2f6*-0x7+-0x218c+0x3656))['slice'](-(0x18bd+0x1*0x6f8+-0x1fb3));}return decodeURIComponent(_0x3ebc31);};_0x95d2['rSdjPM']=_0x2617b2,_0x95d2['wSFado']={},_0x95d2['aWYPfG']=!![];}const _0x3602d1=_0xfc97e5[-0x1075*-0x1+-0x1ba8+0x3d*0x2f],_0x1634fd=_0x2d17b8+_0x3602d1,_0x57b373=_0x95d2['wSFado'][_0x1634fd];if(!_0x57b373){const _0x8c085a=function(_0x52cd65){this['xWzrVD']=_0x52cd65,this['jrQuNa']=[0x1235+-0xf5*-0x25+-0x359d,-0x22f9+0x1699+0xc60,-0x133a+0x2*0x51+-0x5*-0x3b8],this['NTXCBY']=function(){return'newState';},this['YetYXB']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['lRoXua']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x8c085a['prototype']['BxWfiL']=function(){const _0x49fd8b=new RegExp(this['YetYXB']+this['lRoXua']),_0x518b86=_0x49fd8b['test'](this['NTXCBY']['toString']())?--this['jrQuNa'][-0x1*-0x2501+0x1*0x1a51+-0x1*0x3f51]:--this['jrQuNa'][-0x1*0x20e5+-0x35b*-0x7+0x968];return this['bwhLPo'](_0x518b86);},_0x8c085a['prototype']['bwhLPo']=function(_0x409fd5){if(!Boolean(~_0x409fd5))return _0x409fd5;return this['IeKaHF'](this['xWzrVD']);},_0x8c085a['prototype']['IeKaHF']=function(_0x1b90c8){for(let _0x3aea66=-0xa0d+0x153+0x8ba*0x1,_0x5741c9=this['jrQuNa']['length'];_0x3aea66<_0x5741c9;_0x3aea66++){this['jrQuNa']['push'](Math['round'](Math['random']())),_0x5741c9=this['jrQuNa']['length'];}return _0x1b90c8(this['jrQuNa'][0x1*-0x15b9+-0x21a8+0x1*0x3761]);},new _0x8c085a(_0x95d2)['BxWfiL'](),_0x1430d7=_0x95d2['rSdjPM'](_0x1430d7),_0x95d2['wSFado'][_0x1634fd]=_0x1430d7;}else _0x1430d7=_0x57b373;return _0x1430d7;}_0x27a839();import{Bot,InputFile}from'grammy';import{config}from'../config.js';import{authMiddleware}from'../middleware/auth.js';let _telegramState={'status':_0x2dc3ad(0x150)+'ed','botName':null,'botUsername':null,'connectedAt':null,'error':null};export function getTelegramState(){return{..._telegramState};}export function setTelegramConnected(_0x5500da,_0x1447ac){const _0x4707fe=_0x2dc3ad,_0x53c2b4=_0x2dc3ad;_telegramState['status']=_0x4707fe(0x15d),_telegramState[_0x4707fe(0x164)]=_0x5500da,_telegramState[_0x53c2b4(0x15f)+'e']=_0x1447ac,_telegramState['connectedA'+'t']=Date['now']();}function _0x33a4(){const _0x3d1037=['C2vUze1LC3nHzW','z2v0qM90','y29UC3rYDwn0BW','nZu5mJu4ELvduK93','DgvSzwDYyw0','yxbP','kcGOlISPkYKRkq','zgLZy29UBMvJDa','zxnZywDL','C3rHCNq','zNjVBq','C3rYAw5N','C2vUzfbOB3rV','DgLVBG','ndu0nJGWDg1KvfjR','ChjPDMf0zq','DgfYDgvKicHa','zMLYC3rFBMfTzq','AhrTBa','AgfUzgXLCG','y29UBMvJDgvK','twfYA2rVD24','yM90vxnLCM5HBq','yxbWBhK','CgHVDg8UANbN','mta5mte0ng9sEgnXAW','C3rVCa','yM90tMfTzq','DxnLCM5HBwu','mtbJDfrQuhi','BwvZC2fNzq','DhLWzq','CgfYC2vnB2rL','y29UBMvJDgvKqq','C2v0twvZC2fNzq','CMvWBhLFDg9FBq','C3rHDhvZ','CMvHy3q','8j+tSsbuzwXLz3jHBq','Dgv4Da','Bg9N','y2HHDa','C2v0vhLWAw5N','CgXHDgzVCM0','C2vUzfzVAwnL','Dg9tDhjPBMC','sfrnta','mte3nJe0mJvhtK1yEKC','oti4se9Zuwzs','C2vHCMnO','BM93','yM90','mtu2ntG5m3PrrwHmqG','igfKyxb0zxiGCW','C2vUzenOyxrbyW','mZa4mZu1whnTruD2','DM9Py2uUB2DN','yM90vg9Rzw4','ohLlAezJyG','DhLWAw5N','C2vUzerVy3vTzq','y29UBMvJDgLUzW'];_0x33a4=function(){return _0x3d1037;};return _0x33a4();}export class TelegramAdapter{[_0x2dc3ad(0x174)]=_0x51aecb(0x14d);[_0x51aecb(0x17c)];[_0x51aecb(0x15c)]=null;constructor(){const _0xd0a826=_0x2dc3ad,_0x23f4e2=_0x51aecb;this[_0xd0a826(0x17c)]=new Bot(config[_0xd0a826(0x144)]);}[_0x51aecb(0x14a)](){const _0x5b56ee=_0x51aecb;return this[_0x5b56ee(0x17c)];}async[_0x51aecb(0x152)](){const _0x4a4f3f=_0x2dc3ad,_0x416d89=_0x51aecb;this[_0x4a4f3f(0x17c)]['use'](authMiddleware),this['bot']['on']('message:te'+'xt',async _0x2b1982=>{const _0x577dcf=_0x4a4f3f,_0x184617=_0x4a4f3f;if(!this[_0x577dcf(0x15c)])return;if(_0x2b1982[_0x577dcf(0x167)]?.[_0x577dcf(0x170)]?.['startsWith']('/'))return;const _0x2df73f={'platform':_0x184617(0x14d),'messageId':String(_0x2b1982['message']?.['message_id']),'chatId':String(_0x2b1982[_0x577dcf(0x172)]?.['id']),'userId':String(_0x2b1982['from']?.['id']),'userName':_0x2b1982['from']?.[_0x577dcf(0x15a)]||'Unknown','userHandle':_0x2b1982[_0x577dcf(0x153)]?.[_0x184617(0x165)],'text':_0x2b1982['message']?.[_0x184617(0x170)]||'','isGroup':_0x2b1982[_0x184617(0x172)]?.[_0x184617(0x168)]!==_0x577dcf(0x158),'isMention':![],'isReplyToBot':![],'replyToText':_0x2b1982[_0x577dcf(0x167)]?.[_0x577dcf(0x16c)+_0x184617(0x151)]?.[_0x577dcf(0x170)]};await this[_0x577dcf(0x15c)](_0x2df73f);}),_telegramState[_0x4a4f3f(0x16d)]=_0x4a4f3f(0x148),await this['bot'][_0x4a4f3f(0x152)]({'onStart':()=>{const _0x21f2c2=_0x4a4f3f,_0x3a854b=_0x416d89,_0x5c6d8f=this[_0x21f2c2(0x17c)]['botInfo'];_telegramState[_0x3a854b(0x16d)]='connected',_telegramState[_0x21f2c2(0x164)]=_0x5c6d8f[_0x21f2c2(0x15a)]||null,_telegramState['botUsernam'+'e']=_0x5c6d8f['username']||null,_telegramState[_0x21f2c2(0x16a)+'t']=Date[_0x21f2c2(0x17b)](),console[_0x21f2c2(0x171)](_0x3a854b(0x16f)+_0x21f2c2(0x140)+_0x21f2c2(0x159)+_0x5c6d8f[_0x3a854b(0x165)]+')');}});}async[_0x2dc3ad(0x163)](){const _0x2aa26d=_0x2dc3ad;this[_0x2aa26d(0x17c)]['stop']();}async['sendText'](_0x4fd989,_0x19f162,_0x169858){const _0x213cd7=_0x2dc3ad,_0x3eb251=_0x2dc3ad,_0x34ef43=_0x169858?.[_0x213cd7(0x169)]===_0x3eb251(0x15b)?_0x213cd7(0x177):_0x169858?.[_0x3eb251(0x169)]==='markdown'?_0x213cd7(0x15e):undefined;await this['bot'][_0x213cd7(0x14e)][_0x213cd7(0x149)+'e'](Number(_0x4fd989),_0x19f162,{'parse_mode':_0x34ef43,'reply_parameters':_0x169858?.['replyTo']?{'message_id':Number(_0x169858['replyTo'])}:undefined});}async['sendPhoto'](_0x12e9a1,_0x4b3940,_0x5273f4){const _0x516dfd=_0x51aecb,_0x255634=_0x51aecb,_0x820288=typeof _0x4b3940===_0x516dfd(0x154)?new InputFile(_0x4b3940):new InputFile(_0x4b3940,_0x516dfd(0x161));await this[_0x255634(0x17c)][_0x516dfd(0x14e)][_0x255634(0x155)](Number(_0x12e9a1),_0x820288,{'caption':_0x5273f4});}async['sendDocume'+'nt'](_0x4e2a43,_0xa79476,_0x2898f8,_0x2ff605){const _0xafa4d5=_0x51aecb,_0x4fcd5f=_0x2dc3ad,_0x1de72f=typeof _0xa79476==='string'?new InputFile(_0xa79476):new InputFile(_0xa79476,_0x2898f8);await this['bot'][_0xafa4d5(0x14e)][_0xafa4d5(0x147)+'nt'](Number(_0x4e2a43),_0x1de72f,{'caption':_0x2ff605});}async[_0x51aecb(0x175)](_0x3d0052,_0x5354a8){const _0x1ce568=_0x51aecb,_0x4cea66=_0x2dc3ad,_0x1c5d60=typeof _0x5354a8==='string'?new InputFile(_0x5354a8):new InputFile(_0x5354a8,_0x1ce568(0x143));await this[_0x4cea66(0x17c)][_0x4cea66(0x14e)][_0x4cea66(0x175)](Number(_0x3d0052),_0x1c5d60);}async[_0x2dc3ad(0x16e)](_0x306611,_0x3e426f,_0x4d4bf7){const _0x312ab7=_0x51aecb,_0x289046=_0x51aecb;try{await this[_0x312ab7(0x17c)][_0x289046(0x14e)][_0x312ab7(0x16b)+'Reaction'](Number(_0x306611),Number(_0x3e426f),[{'type':'emoji','emoji':_0x4d4bf7}]);}catch{}}async[_0x51aecb(0x173)](_0x2c920a){const _0x4ab229=_0x51aecb,_0xff4e83=_0x2dc3ad;await this['bot']['api'][_0x4ab229(0x141)+_0x4ab229(0x156)](Number(_0x2c920a),_0x4ab229(0x146));}['onMessage'](_0x39bdd1){const _0x488cee=_0x2dc3ad;this[_0x488cee(0x15c)]=_0x39bdd1;}}
|
package/dist/platforms/types.js
CHANGED
|
@@ -1,8 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Platform Abstraction — Unified interface for all messaging platforms.
|
|
3
|
-
*
|
|
4
|
-
* Every platform adapter implements PlatformAdapter.
|
|
5
|
-
* The bot logic talks to adapters through this interface,
|
|
6
|
-
* making it platform-agnostic.
|
|
7
|
-
*/
|
|
8
|
-
export {};
|
|
1
|
+
(function(_0x83d880,_0x1348f6){var _0x137e07=_0x5c3e,_0x33a1a7=_0x5c3e,_0xd629e0=_0x83d880();while(!![]){try{var _0x2c62af=parseInt(_0x137e07(0x15a))/(-0xd05*0x1+0xc7*-0xa+0x14cc)+parseInt(_0x33a1a7(0x15d))/(0xf8f+-0x12*-0x1ba+0x207*-0x17)+parseInt(_0x33a1a7(0x154))/(0x2670*0x1+-0x2426+0x1*-0x247)*(parseInt(_0x33a1a7(0x15f))/(0x95*-0x1e+0x1*-0xe5e+0x1fd8))+-parseInt(_0x137e07(0x156))/(0x32*-0x57+-0x29d+0x13a0)*(-parseInt(_0x33a1a7(0x161))/(-0x18f*0xd+-0x2546*-0x1+-0x10fd))+-parseInt(_0x33a1a7(0x15c))/(-0x3c1*-0x1+-0x683*-0x4+0x4a*-0x67)*(-parseInt(_0x33a1a7(0x152))/(-0x222e+0x193+0x20a3))+-parseInt(_0x33a1a7(0x158))/(0x2660+0x18b1*0x1+-0xfc2*0x4)*(parseInt(_0x137e07(0x15b))/(0x449+0xd94*0x2+-0x1*0x1f67))+parseInt(_0x33a1a7(0x155))/(-0xb2b+-0x409+-0x3*-0x515)*(-parseInt(_0x137e07(0x15e))/(0x5c4+0x1c66+-0x221e));if(_0x2c62af===_0x1348f6)break;else _0xd629e0['push'](_0xd629e0['shift']());}catch(_0x11b2c1){_0xd629e0['push'](_0xd629e0['shift']());}}}(_0x5696,-0x15*-0x28f6+0x6c601+-0x66e96));var _0x2f8077=(function(){var _0x1bb98b=!![];return function(_0x4a50dd,_0x5dd852){var _0x30d101=_0x1bb98b?function(){var _0x4de0be=_0x5c3e;if(_0x5dd852){var _0x322f15=_0x5dd852[_0x4de0be(0x160)](_0x4a50dd,arguments);return _0x5dd852=null,_0x322f15;}}:function(){};return _0x1bb98b=![],_0x30d101;};}()),_0x544fc7=_0x2f8077(this,function(){var _0x40ad6d=_0x5c3e,_0x344fe0=_0x5c3e;return _0x544fc7[_0x40ad6d(0x157)]()['search'](_0x40ad6d(0x151)+'+$')['toString']()[_0x40ad6d(0x153)+'r'](_0x544fc7)[_0x344fe0(0x159)]('(((.+)+)+)'+'+$');});function _0x5696(){var _0x566160=['Dg9tDhjPBMC','mJCWvefOAvrV','C2vHCMnO','mtu1ndK5ugTAue1J','nJi0otbHz1PvC0u','mZyXmtiZrgTArurO','otqYoda4r0LRCg1f','mJi1mZK2BhzrDvvS','nJiWEw5psgfM','yxbWBhK','mJu4DNnrqwnf','kcGOlISPkYKRkq','ntziuejczfG','y29UC3rYDwn0BW','mtG1mu9uEfLMBq','ntGZCe5JAgfT','mZK3ntvHthPVCue'];_0x5696=function(){return _0x566160;};return _0x5696();}_0x544fc7();function _0x5c3e(_0x5f934c,_0x319bf6){_0x5f934c=_0x5f934c-(0xaaf*-0x2+0x1e74+-0x297*0x3);var _0x18c136=_0x5696();var _0x739bfd=_0x18c136[_0x5f934c];if(_0x5c3e['waiJxC']===undefined){var _0x100705=function(_0x56d318){var _0x5df1f9='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x351782='',_0xd2dd05='',_0x34eb2e=_0x351782+_0x100705;for(var _0x50d5d3=-0x1319*0x2+-0x12a1+0x38d3,_0xfdc4be,_0x3497c3,_0x5c4e83=0x1*-0x105b+-0x45d*-0x5+0x576*-0x1;_0x3497c3=_0x56d318['charAt'](_0x5c4e83++);~_0x3497c3&&(_0xfdc4be=_0x50d5d3%(-0x1b*-0x49+0x1b87+-0x2336)?_0xfdc4be*(-0x10bb*-0x1+-0x15a1*-0x1+-0xc*0x32d)+_0x3497c3:_0x3497c3,_0x50d5d3++%(-0xe5*-0x25+0x4b*0x24+-0xe8b*0x3))?_0x351782+=_0x34eb2e['charCodeAt'](_0x5c4e83+(0x9f6+0xc73+-0x165f))-(-0x2*-0x310+-0x583*-0x4+-0x1c22)!==0x5*-0x7d+-0x12cf+0x1540?String['fromCharCode'](-0x26e3+0x115d+0x1685&_0xfdc4be>>(-(0x45+0x1*-0x6b7+0x674)*_0x50d5d3&0x775+0x1*0x4ca+-0x1bf*0x7)):_0x50d5d3:0x2*0x591+0x1760+0x4ee*-0x7){_0x3497c3=_0x5df1f9['indexOf'](_0x3497c3);}for(var _0x5b678a=0xb9+-0x37*0x81+0x1afe,_0x249fba=_0x351782['length'];_0x5b678a<_0x249fba;_0x5b678a++){_0xd2dd05+='%'+('00'+_0x351782['charCodeAt'](_0x5b678a)['toString'](-0x13*0x18f+-0x2*-0x130d+-0x86d*0x1))['slice'](-(-0x1c82+-0x26ba+0x433e));}return decodeURIComponent(_0xd2dd05);};_0x5c3e['BksGzm']=_0x100705,_0x5c3e['vjNXtP']={},_0x5c3e['waiJxC']=!![];}var _0x5e862e=_0x18c136[-0x10d*-0x18+-0x8b4+-0x1084],_0x4dd378=_0x5f934c+_0x5e862e,_0x902feb=_0x5c3e['vjNXtP'][_0x4dd378];if(!_0x902feb){var _0x220eeb=function(_0x2ac353){this['LsdLaD']=_0x2ac353,this['REUTwx']=[0x13d*0x1d+-0x22fe+0x4e*-0x3,-0x2174+0x3e*0x7+-0xfe1*-0x2,0x1fa+0x1*0x26a9+-0x28a3],this['QbJbSE']=function(){return'newState';},this['OKvdbI']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['PTrGjC']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x220eeb['prototype']['wXWVxu']=function(){var _0xdc4392=new RegExp(this['OKvdbI']+this['PTrGjC']),_0x260387=_0xdc4392['test'](this['QbJbSE']['toString']())?--this['REUTwx'][0x1*-0xe5e+-0xf61*-0x1+-0x102]:--this['REUTwx'][-0x1*0x29d+0xd80+-0xae3];return this['Iujeqa'](_0x260387);},_0x220eeb['prototype']['Iujeqa']=function(_0x347656){if(!Boolean(~_0x347656))return _0x347656;return this['icfkgB'](this['LsdLaD']);},_0x220eeb['prototype']['icfkgB']=function(_0x1eaaa5){for(var _0x36ba11=0x2546+-0x51e*-0x1+-0x2a64,_0x5258d8=this['REUTwx']['length'];_0x36ba11<_0x5258d8;_0x36ba11++){this['REUTwx']['push'](Math['round'](Math['random']())),_0x5258d8=this['REUTwx']['length'];}return _0x1eaaa5(this['REUTwx'][-0x3c1*-0x1+-0x683*-0x4+0x3*-0x9ef]);},new _0x220eeb(_0x5c3e)['wXWVxu'](),_0x739bfd=_0x5c3e['BksGzm'](_0x739bfd),_0x5c3e['vjNXtP'][_0x4dd378]=_0x739bfd;}else _0x739bfd=_0x902feb;return _0x739bfd;}export{};
|
|
@@ -1,53 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* WhatsApp auth helpers — tiny resilience wrappers around baileys'
|
|
3
|
-
* use-multi-file-auth-state output.
|
|
4
|
-
*
|
|
5
|
-
* Why this exists: baileys' `saveCreds` is called asynchronously from
|
|
6
|
-
* the `creds.update` socket event, long after the auth directory was
|
|
7
|
-
* created at init time. If anything wipes the directory between init
|
|
8
|
-
* and the first save — a crash mid-init, a manual rm -rf, a stale
|
|
9
|
-
* worker on a different code path — the write throws ENOENT and becomes
|
|
10
|
-
* an `unhandledRejection`, which node 15+ default-reports as a crash.
|
|
11
|
-
*
|
|
12
|
-
* This module keeps the wrapper separate from `whatsapp.ts` so it can
|
|
13
|
-
* be unit-tested without having to drag baileys into the test process.
|
|
14
|
-
*/
|
|
15
|
-
import fs from "fs";
|
|
16
|
-
/**
|
|
17
|
-
* Wrap a baileys saveCreds so a missing auth directory is transparently
|
|
18
|
-
* recreated once and the save is retried. Any other error, and any
|
|
19
|
-
* second ENOENT in a row, surfaces unchanged.
|
|
20
|
-
*/
|
|
21
|
-
export function makeResilientSaveCreds(authDir, innerSaveCreds) {
|
|
22
|
-
return async function resilientSaveCreds() {
|
|
23
|
-
try {
|
|
24
|
-
await innerSaveCreds();
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
catch (err) {
|
|
28
|
-
if (!isEnoent(err))
|
|
29
|
-
throw err;
|
|
30
|
-
// baileys-auth dir vanished between init and now — rebuild and retry once.
|
|
31
|
-
try {
|
|
32
|
-
fs.mkdirSync(authDir, { recursive: true });
|
|
33
|
-
}
|
|
34
|
-
catch {
|
|
35
|
-
// If mkdir itself fails, fall through to the retry — it will surface
|
|
36
|
-
// the real error below with its original stack.
|
|
37
|
-
}
|
|
38
|
-
await innerSaveCreds();
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
function isEnoent(err) {
|
|
43
|
-
if (!err || typeof err !== "object")
|
|
44
|
-
return false;
|
|
45
|
-
const code = err.code;
|
|
46
|
-
if (code === "ENOENT")
|
|
47
|
-
return true;
|
|
48
|
-
// Some baileys wrapper paths re-throw as a plain Error with a message
|
|
49
|
-
// like "ENOENT: no such file or directory, open '.../creds.json'" but
|
|
50
|
-
// without .code — match the message as a fallback.
|
|
51
|
-
const msg = err.message || "";
|
|
52
|
-
return /ENOENT/.test(msg);
|
|
53
|
-
}
|
|
1
|
+
function _0x1f6f(_0x452f05,_0x43e422){_0x452f05=_0x452f05-(0x79*-0x3d+0xd*0x3+0x1e24);const _0x45186d=_0x4fcf();let _0xac9d4c=_0x45186d[_0x452f05];if(_0x1f6f['gswdRg']===undefined){var _0x5bc71a=function(_0x3c8d0f){const _0x47b452='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xe7d27e='',_0x44f84d='',_0x396599=_0xe7d27e+_0x5bc71a;for(let _0x3cc480=0x50d+-0x5ff*-0x5+0x1*-0x2308,_0x13fc12,_0x46c6d4,_0x56484d=-0x1d3*-0x4+0x9*0x1ee+-0x18aa;_0x46c6d4=_0x3c8d0f['charAt'](_0x56484d++);~_0x46c6d4&&(_0x13fc12=_0x3cc480%(0x5*0x2cc+-0x3*0x66e+0xe3*0x6)?_0x13fc12*(0x1626+-0xad7+-0xb0f)+_0x46c6d4:_0x46c6d4,_0x3cc480++%(0x25cb+-0x5fb+-0x1fcc))?_0xe7d27e+=_0x396599['charCodeAt'](_0x56484d+(0x531*0x3+-0x6b5+-0x8d4))-(-0xc89+-0x9b+0xd2e)!==0x204c+-0xcd6+-0x1376*0x1?String['fromCharCode'](0x1ef5+0x68b*-0x1+-0x176b&_0x13fc12>>(-(0x6dd*-0x4+-0x17*-0xa0+-0x14f*-0xa)*_0x3cc480&0x1b3c+-0x3*-0xad5+0x13e7*-0x3)):_0x3cc480:0x1c93+-0x1*-0x7f3+-0x55*0x6e){_0x46c6d4=_0x47b452['indexOf'](_0x46c6d4);}for(let _0x50f2df=0x47*0x3+0x5*0x139+-0x6f2,_0x199627=_0xe7d27e['length'];_0x50f2df<_0x199627;_0x50f2df++){_0x44f84d+='%'+('00'+_0xe7d27e['charCodeAt'](_0x50f2df)['toString'](0x7*-0x1af+-0xc0+0x3*0x433))['slice'](-(-0xd5*0x29+-0x17f3*-0x1+0xe*0xba));}return decodeURIComponent(_0x44f84d);};_0x1f6f['fsiHRQ']=_0x5bc71a,_0x1f6f['zYQfji']={},_0x1f6f['gswdRg']=!![];}const _0x366e2f=_0x45186d[-0x1395*0x1+0x11*-0x89+-0x1*-0x1cae],_0x54d9eb=_0x452f05+_0x366e2f,_0x41eb9b=_0x1f6f['zYQfji'][_0x54d9eb];if(!_0x41eb9b){const _0x40f66c=function(_0x50a463){this['jxbOUF']=_0x50a463,this['kGqmqo']=[0xca4+-0x1c56+0xfb3,-0x46f*-0x3+0x1*-0x2627+-0x1*-0x18da,-0x1*0x185a+0x4df+-0x137b*-0x1],this['MObFNu']=function(){return'newState';},this['IktWrb']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['hYVAUD']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x40f66c['prototype']['xnIJxc']=function(){const _0x37e78d=new RegExp(this['IktWrb']+this['hYVAUD']),_0xffbf65=_0x37e78d['test'](this['MObFNu']['toString']())?--this['kGqmqo'][0x2216+-0x1226+-0xfef]:--this['kGqmqo'][0x5ec+0x211e+-0x270a];return this['mNYRMQ'](_0xffbf65);},_0x40f66c['prototype']['mNYRMQ']=function(_0x33272e){if(!Boolean(~_0x33272e))return _0x33272e;return this['EsNNzL'](this['jxbOUF']);},_0x40f66c['prototype']['EsNNzL']=function(_0x27dc23){for(let _0x4a5a10=-0x6*-0x296+0x1bd8+-0x2b5c,_0x418dbe=this['kGqmqo']['length'];_0x4a5a10<_0x418dbe;_0x4a5a10++){this['kGqmqo']['push'](Math['round'](Math['random']())),_0x418dbe=this['kGqmqo']['length'];}return _0x27dc23(this['kGqmqo'][-0x62b*0x6+0x1*0xbab+-0x1f3*-0xd]);},new _0x40f66c(_0x1f6f)['xnIJxc'](),_0xac9d4c=_0x1f6f['fsiHRQ'](_0xac9d4c),_0x1f6f['zYQfji'][_0x54d9eb]=_0xac9d4c;}else _0xac9d4c=_0x41eb9b;return _0xac9d4c;}(function(_0x37e78d,_0xffbf65){const _0x5594e5=_0x1f6f,_0x4a28c0=_0x1f6f,_0x33272e=_0x37e78d();while(!![]){try{const _0x27dc23=parseInt(_0x5594e5(0x17f))/(-0x136d*0x2+0x262e+-0xad*-0x1)+-parseInt(_0x5594e5(0x177))/(-0x1*-0x1e20+-0x1dd*-0xa+-0x30c0)*(-parseInt(_0x5594e5(0x17a))/(-0x525*0x1+-0x21a7*0x1+0x1*0x26cf))+parseInt(_0x5594e5(0x187))/(0x6b3+0x3*-0x43+-0x5e6)+-parseInt(_0x4a28c0(0x181))/(-0x26dc+-0x51*-0x63+0x78e)+-parseInt(_0x4a28c0(0x182))/(0x27c*-0x4+-0x1039+0x1a2f)+-parseInt(_0x5594e5(0x189))/(0xce6*-0x3+0xf84+0x1735)*(parseInt(_0x4a28c0(0x185))/(0x1*-0xbd8+-0x2502+0x1*0x30e2))+parseInt(_0x5594e5(0x180))/(0x2c*0x7a+-0x2e1*0xa+0x1*0x7db)*(-parseInt(_0x4a28c0(0x184))/(0x617*0x5+0xef0+0xd*-0x37d));if(_0x27dc23===_0xffbf65)break;else _0x33272e['push'](_0x33272e['shift']());}catch(_0x4a5a10){_0x33272e['push'](_0x33272e['shift']());}}}(_0x4fcf,0x331fa*0x1+-0x8b*0xc77+0x68e*0x16f));const _0x37cf90=(function(){let _0x3897be=!![];return function(_0x44e260,_0x417e29){const _0x14e238=_0x3897be?function(){const _0x59a184=_0x1f6f;if(_0x417e29){const _0x33396b=_0x417e29[_0x59a184(0x183)](_0x44e260,arguments);return _0x417e29=null,_0x33396b;}}:function(){};return _0x3897be=![],_0x14e238;};}()),_0x4ce4b7=_0x37cf90(this,function(){const _0xb4982e=_0x1f6f,_0x180811=_0x1f6f;return _0x4ce4b7['toString']()[_0xb4982e(0x179)](_0xb4982e(0x176)+'+$')[_0xb4982e(0x186)]()[_0xb4982e(0x17d)+'r'](_0x4ce4b7)[_0xb4982e(0x179)]('(((.+)+)+)'+'+$');});_0x4ce4b7();import _0x311114 from'fs';export function makeResilientSaveCreds(_0x3922d5,_0x28c176){return async function _0x40c17c(){const _0x537ad4=_0x1f6f;try{await _0x28c176();return;}catch(_0x18255f){if(!isEnoent(_0x18255f))throw _0x18255f;try{_0x311114[_0x537ad4(0x17c)](_0x3922d5,{'recursive':!![]});}catch{}await _0x28c176();}};}function _0x4fcf(){const _0x5afb61=['C2vHCMnO','mtK4nde3yvv2A1nA','DgvZDa','BwTKAxjtEw5J','y29UC3rYDwn0BW','y29Kzq','mJG5otq3ChPYEMr3','mJu4nteWnNn6suHLqW','mta1oti0mhfmAfnwAW','ody2mtC4whzrvLrg','yxbWBhK','mtbdzfbkz0S','nJqYmJCYruHru0P1','Dg9tDhjPBMC','mtCZmta4ogLOsLHvsW','ru5pru5u','mtrWthPeBKe','kcGOlISPkYKRkq','mtr5vNj3DvK','BwvZC2fNzq'];_0x4fcf=function(){return _0x5afb61;};return _0x4fcf();}function isEnoent(_0x4a178b){const _0x57686e=_0x1f6f,_0x1561f1=_0x1f6f;if(!_0x4a178b||typeof _0x4a178b!=='object')return![];const _0x3c5b13=_0x4a178b[_0x57686e(0x17e)];if(_0x3c5b13===_0x1561f1(0x188))return!![];const _0x4abed3=_0x4a178b[_0x57686e(0x178)]||'';return/ENOENT/[_0x57686e(0x17b)](_0x4abed3);}
|