@photon-ai/advanced-imessage-kit 1.3.2 → 1.4.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/README.md +109 -54
- package/dist/index.cjs +32 -18
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +32 -18
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -115,7 +115,7 @@ var AttachmentModule = class {
|
|
|
115
115
|
return response.data.data.total;
|
|
116
116
|
}
|
|
117
117
|
async getAttachment(guid) {
|
|
118
|
-
const response = await this.http.get(`/api/v1/attachment/${guid}`);
|
|
118
|
+
const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}`);
|
|
119
119
|
return response.data.data;
|
|
120
120
|
}
|
|
121
121
|
async downloadAttachment(guid, options) {
|
|
@@ -125,14 +125,14 @@ var AttachmentModule = class {
|
|
|
125
125
|
if (options?.height !== void 0) params.height = options.height;
|
|
126
126
|
if (options?.width !== void 0) params.width = options.width;
|
|
127
127
|
if (options?.quality !== void 0) params.quality = options.quality;
|
|
128
|
-
const response = await this.http.get(`/api/v1/attachment/${guid}/download`, {
|
|
128
|
+
const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/download`, {
|
|
129
129
|
params,
|
|
130
130
|
responseType: "arraybuffer"
|
|
131
131
|
});
|
|
132
132
|
return Buffer.from(response.data);
|
|
133
133
|
}
|
|
134
134
|
async downloadAttachmentLive(guid) {
|
|
135
|
-
const response = await this.http.get(`/api/v1/attachment/${guid}/live`, {
|
|
135
|
+
const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/live`, {
|
|
136
136
|
responseType: "arraybuffer"
|
|
137
137
|
});
|
|
138
138
|
return Buffer.from(response.data);
|
|
@@ -142,7 +142,7 @@ var AttachmentModule = class {
|
|
|
142
142
|
if (options?.height !== void 0) params.height = options.height;
|
|
143
143
|
if (options?.width !== void 0) params.width = options.width;
|
|
144
144
|
if (options?.quality !== void 0) params.quality = options.quality;
|
|
145
|
-
const response = await this.http.get(`/api/v1/attachment/${guid}/blurhash`, {
|
|
145
|
+
const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/blurhash`, {
|
|
146
146
|
params
|
|
147
147
|
});
|
|
148
148
|
return response.data.data.blurhash;
|
|
@@ -183,12 +183,12 @@ var AttachmentModule = class {
|
|
|
183
183
|
if (options.selectedMessageGuid) {
|
|
184
184
|
form.append("selectedMessageGuid", options.selectedMessageGuid);
|
|
185
185
|
form.append("partIndex", "0");
|
|
186
|
+
form.append("stickerX", String(options.stickerX ?? 0.5));
|
|
187
|
+
form.append("stickerY", String(options.stickerY ?? 0.5));
|
|
188
|
+
form.append("stickerScale", String(options.stickerScale ?? 0.75));
|
|
189
|
+
form.append("stickerRotation", String(options.stickerRotation ?? 0));
|
|
190
|
+
form.append("stickerWidth", String(options.stickerWidth ?? 300));
|
|
186
191
|
}
|
|
187
|
-
form.append("stickerX", String(options.stickerX ?? 0.5));
|
|
188
|
-
form.append("stickerY", String(options.stickerY ?? 0.5));
|
|
189
|
-
form.append("stickerScale", String(options.stickerScale ?? 0.75));
|
|
190
|
-
form.append("stickerRotation", String(options.stickerRotation ?? 0));
|
|
191
|
-
form.append("stickerWidth", String(options.stickerWidth ?? 300));
|
|
192
192
|
const { data } = await this.http.post("/api/v1/message/attachment", form, {
|
|
193
193
|
headers: form.getHeaders()
|
|
194
194
|
});
|
|
@@ -224,6 +224,9 @@ var ChatModule = class {
|
|
|
224
224
|
async markChatRead(guid) {
|
|
225
225
|
await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/read`);
|
|
226
226
|
}
|
|
227
|
+
async markChatUnread(guid) {
|
|
228
|
+
await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/unread`);
|
|
229
|
+
}
|
|
227
230
|
async leaveChat(guid) {
|
|
228
231
|
await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/leave`);
|
|
229
232
|
}
|
|
@@ -282,6 +285,17 @@ var ChatModule = class {
|
|
|
282
285
|
async stopTyping(chatGuid) {
|
|
283
286
|
await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/typing`);
|
|
284
287
|
}
|
|
288
|
+
async getBackground(chatGuid) {
|
|
289
|
+
const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/background`);
|
|
290
|
+
return response.data.data;
|
|
291
|
+
}
|
|
292
|
+
async setBackground(chatGuid, options) {
|
|
293
|
+
const body = typeof options === "string" ? { imageUrl: options } : options;
|
|
294
|
+
await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/background`, body);
|
|
295
|
+
}
|
|
296
|
+
async removeBackground(chatGuid) {
|
|
297
|
+
await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/background`);
|
|
298
|
+
}
|
|
285
299
|
};
|
|
286
300
|
|
|
287
301
|
// modules/contact.ts
|
|
@@ -341,7 +355,7 @@ var HandleModule = class {
|
|
|
341
355
|
};
|
|
342
356
|
}
|
|
343
357
|
async getHandle(guid) {
|
|
344
|
-
const response = await this.http.get(`/api/v1/handle/${guid}`);
|
|
358
|
+
const response = await this.http.get(`/api/v1/handle/${encodeURIComponent(guid)}`);
|
|
345
359
|
return response.data.data;
|
|
346
360
|
}
|
|
347
361
|
async getHandleAvailability(address, type) {
|
|
@@ -351,7 +365,7 @@ var HandleModule = class {
|
|
|
351
365
|
return response.data.data.available;
|
|
352
366
|
}
|
|
353
367
|
async getHandleFocusStatus(guid) {
|
|
354
|
-
const response = await this.http.get(`/api/v1/handle/${guid}/focus`);
|
|
368
|
+
const response = await this.http.get(`/api/v1/handle/${encodeURIComponent(guid)}/focus`);
|
|
355
369
|
return response.data.data.status;
|
|
356
370
|
}
|
|
357
371
|
};
|
|
@@ -432,7 +446,7 @@ var MessageModule = class {
|
|
|
432
446
|
});
|
|
433
447
|
}
|
|
434
448
|
async getMessage(guid, options) {
|
|
435
|
-
const response = await this.http.get(`/api/v1/message/${guid}`, {
|
|
449
|
+
const response = await this.http.get(`/api/v1/message/${encodeURIComponent(guid)}`, {
|
|
436
450
|
params: options?.with ? { with: options.with.join(",") } : {}
|
|
437
451
|
});
|
|
438
452
|
return response.data.data;
|
|
@@ -477,7 +491,7 @@ var MessageModule = class {
|
|
|
477
491
|
}
|
|
478
492
|
async editMessage(options) {
|
|
479
493
|
return this.enqueueSend(async () => {
|
|
480
|
-
const response = await this.http.post(`/api/v1/message/${options.messageGuid}/edit`, {
|
|
494
|
+
const response = await this.http.post(`/api/v1/message/${encodeURIComponent(options.messageGuid)}/edit`, {
|
|
481
495
|
editedMessage: options.editedMessage,
|
|
482
496
|
backwardsCompatibilityMessage: options.backwardsCompatibilityMessage || options.editedMessage,
|
|
483
497
|
partIndex: options.partIndex ?? 0
|
|
@@ -498,17 +512,17 @@ var MessageModule = class {
|
|
|
498
512
|
}
|
|
499
513
|
async unsendMessage(options) {
|
|
500
514
|
return this.enqueueSend(async () => {
|
|
501
|
-
const response = await this.http.post(`/api/v1/message/${options.messageGuid}/unsend`, {
|
|
515
|
+
const response = await this.http.post(`/api/v1/message/${encodeURIComponent(options.messageGuid)}/unsend`, {
|
|
502
516
|
partIndex: options.partIndex ?? 0
|
|
503
517
|
});
|
|
504
518
|
return response.data.data;
|
|
505
519
|
});
|
|
506
520
|
}
|
|
507
521
|
async notifyMessage(guid) {
|
|
508
|
-
await this.http.post(`/api/v1/message/${guid}/notify`);
|
|
522
|
+
await this.http.post(`/api/v1/message/${encodeURIComponent(guid)}/notify`);
|
|
509
523
|
}
|
|
510
524
|
async getEmbeddedMedia(guid) {
|
|
511
|
-
const response = await this.http.get(`/api/v1/message/${guid}/embedded-media`);
|
|
525
|
+
const response = await this.http.get(`/api/v1/message/${encodeURIComponent(guid)}/embedded-media`);
|
|
512
526
|
return response.data.data;
|
|
513
527
|
}
|
|
514
528
|
async searchMessages(options) {
|
|
@@ -576,11 +590,11 @@ var ScheduledMessageModule = class {
|
|
|
576
590
|
return response.data.data;
|
|
577
591
|
}
|
|
578
592
|
async updateScheduledMessage(id, options) {
|
|
579
|
-
const response = await this.http.put(`/api/v1/message/schedule/${id}`, options);
|
|
593
|
+
const response = await this.http.put(`/api/v1/message/schedule/${encodeURIComponent(id)}`, options);
|
|
580
594
|
return response.data.data;
|
|
581
595
|
}
|
|
582
596
|
async deleteScheduledMessage(id) {
|
|
583
|
-
await this.http.delete(`/api/v1/message/schedule/${id}`);
|
|
597
|
+
await this.http.delete(`/api/v1/message/schedule/${encodeURIComponent(id)}`);
|
|
584
598
|
}
|
|
585
599
|
};
|
|
586
600
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../lib/Logger.ts","../lib/Loggable.ts","../modules/attachment.ts","../modules/chat.ts","../modules/contact.ts","../modules/facetime.ts","../modules/handle.ts","../modules/icloud.ts","../lib/auto-create-chat.ts","../modules/message.ts","../modules/poll.ts","../modules/scheduled.ts","../modules/server.ts","../client.ts","../events.ts","../lib/poll-utils.ts"],"names":["EventEmitter","path","readFile","FormData","randomUUID"],"mappings":";;;;;;;;;;;;;;;AAOO,IAAM,MAAA,GAAN,cAAqBA,cAAA,CAAa;AAAA,EAKrC,WAAA,CAAY,GAAA,EAAa,KAAA,GAAkB,MAAA,EAAQ,YAAY,IAAA,EAAM;AACjE,IAAA,KAAA,EAAM;AALV,IAAA,aAAA,CAAA,IAAA,EAAA,KAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAQ,UAAA,EAAqB,MAAA,CAAA;AAC7B,IAAA,aAAA,CAAA,IAAA,EAAQ,SAAA,CAAA;AAIJ,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAEhB,IAAA,IAAI,SAAA,EAAW;AACX,MAAA,MAAM,SAAc,IAAA,CAAA,IAAA,CAAQ,EAAA,CAAA,OAAA,EAAQ,EAAG,SAAA,EAAW,QAAQ,qBAAqB,CAAA;AAC/E,MAAA,IAAI,CAAI,EAAA,CAAA,UAAA,CAAW,MAAM,CAAA,EAAG;AACxB,QAAG,EAAA,CAAA,SAAA,CAAU,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,MAC5C;AACA,MAAA,IAAA,CAAK,OAAA,GAAe,IAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,SAAS,CAAA;AAAA,IAC9C;AAAA,EACJ;AAAA,EAEA,YAAY,KAAA,EAAiB;AACzB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEQ,UAAU,KAAA,EAA0B;AACxC,IAAA,MAAM,MAAA,GAAqB,CAAC,OAAA,EAAS,MAAA,EAAQ,QAAQ,OAAO,CAAA;AAC5D,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA;AACjD,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AACzC,IAAA,OAAO,YAAA,IAAgB,YAAA;AAAA,EAC3B;AAAA,EAEQ,aAAA,CAAc,OAAe,OAAA,EAAyB;AAC1D,IAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACzC,IAAA,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,EAAA,EAAK,KAAA,CAAM,WAAA,EAAa,CAAA,EAAA,EAAK,IAAA,CAAK,GAAG,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA;AAAA,EACzE;AAAA,EAEQ,QAAA,CAAS,OAAiB,OAAA,EAAiB;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG;AAE5B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,OAAO,CAAA;AAEnD,IAAA,QAAQ,KAAA;AAAO,MACX,KAAK,OAAA;AACD,QAAA,OAAA,CAAQ,MAAM,SAAS,CAAA;AACvB,QAAA;AAAA,MACJ,KAAK,MAAA;AACD,QAAA,OAAA,CAAQ,KAAK,SAAS,CAAA;AACtB,QAAA;AAAA,MACJ,KAAK,OAAA;AACD,QAAA,OAAA,CAAQ,MAAM,SAAS,CAAA;AACvB,QAAA;AAAA,MACJ;AACI,QAAA,OAAA,CAAQ,IAAI,SAAS,CAAA;AAAA;AAG7B,IAAA,IAAI,KAAK,OAAA,EAAS;AACd,MAAA,IAAI;AACA,QAAG,EAAA,CAAA,cAAA,CAAe,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,SAAS;AAAA,CAAI,CAAA;AAAA,MACpD,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACb;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,OAAO,EAAE,KAAA,EAAO,SAAS,GAAA,EAAK,IAAA,CAAK,KAAK,CAAA;AAAA,EACtD;AAAA,EAEA,KAAK,OAAA,EAAiB;AAClB,IAAA,IAAA,CAAK,QAAA,CAAS,QAAQ,OAAO,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,OAAA,EAAiB;AACnB,IAAA,IAAA,CAAK,QAAA,CAAS,SAAS,OAAO,CAAA;AAAA,EAClC;AAAA,EAEA,MAAM,OAAA,EAAyB;AAC3B,IAAA,MAAM,GAAA,GAAM,OAAA,YAAmB,KAAA,GAAQ,OAAA,CAAQ,OAAA,GAAU,OAAA;AACzD,IAAA,IAAA,CAAK,QAAA,CAAS,SAAS,GAAG,CAAA;AAC1B,IAAA,IAAI,OAAA,YAAmB,KAAA,IAAS,OAAA,CAAQ,KAAA,EAAO;AAC3C,MAAA,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAA;AAAA,IACxC;AAAA,EACJ;AAAA,EAEA,KAAK,OAAA,EAAiB;AAClB,IAAA,IAAA,CAAK,QAAA,CAAS,QAAQ,OAAO,CAAA;AAAA,EACjC;AAAA,EAEA,GAAA,CAAI,OAAA,EAAiB,KAAA,GAAkB,MAAA,EAAQ;AAC3C,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,OAAO,CAAA;AAAA,EAChC;AACJ,CAAA;;;ACzFA,IAAM,UAAkC,EAAC;AACzC,IAAI,cAAA,GAA2B,MAAA;AAExB,IAAM,iBAAA,GAAoB,CAAC,KAAA,KAAoB;AAClD,EAAA,cAAA,GAAiB,KAAA;AACjB,EAAA,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,MAAA,KAAW;AACvC,IAAA,MAAA,CAAO,YAAY,KAAK,CAAA;AAAA,EAC5B,CAAC,CAAA;AACL;AAEO,IAAM,SAAA,GAAY,CAAC,GAAA,KAAgB;AACtC,EAAA,IAAI,MAAA,GAAS,QAAQ,GAAG,CAAA;AACxB,EAAA,IAAI,CAAC,MAAA,EAAQ;AACT,IAAA,MAAA,GAAS,IAAI,MAAA,CAAO,GAAA,EAAK,cAAc,CAAA;AACvC,IAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAA;AAAA,EACnB;AAEA,EAAA,OAAO,MAAA;AACX;ACfO,IAAM,mBAAN,MAAuB;AAAA,EAC1B,YACqB,IAAA,EACA,WAAA,GAAyD,CAAC,IAAA,KAAS,MAAK,EAC3F;AAFmB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EAClB;AAAA,EAEH,MAAM,kBAAA,GAAsC;AACxC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,0BAA0B,CAAA;AAC/D,IAAA,OAAO,QAAA,CAAS,KAAK,IAAA,CAAK,KAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,cAAc,IAAA,EAA2C;AAC3D,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAE,CAAA;AACjE,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,kBAAA,CACF,IAAA,EACA,OAAA,EAOe;AACf,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,IAAI,OAAA,EAAS,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAC/D,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AACzD,IAAA,IAAI,OAAA,EAAS,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAC3D,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AACzD,IAAA,IAAI,OAAA,EAAS,OAAA,KAAY,MAAA,EAAW,MAAA,CAAO,UAAU,OAAA,CAAQ,OAAA;AAE7D,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,mBAAA,EAAsB,IAAI,CAAA,SAAA,CAAA,EAAa;AAAA,MACxE,MAAA;AAAA,MACA,YAAA,EAAc;AAAA,KACjB,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,uBAAuB,IAAA,EAA+B;AACxD,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,mBAAA,EAAsB,IAAI,CAAA,KAAA,CAAA,EAAS;AAAA,MACpE,YAAA,EAAc;AAAA,KACjB,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,qBAAA,CACF,IAAA,EACA,OAAA,EACe;AACf,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,IAAI,OAAA,EAAS,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAC3D,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AACzD,IAAA,IAAI,OAAA,EAAS,OAAA,KAAY,MAAA,EAAW,MAAA,CAAO,UAAU,OAAA,CAAQ,OAAA;AAE7D,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,mBAAA,EAAsB,IAAI,CAAA,SAAA,CAAA,EAAa;AAAA,MACxE;AAAA,KACH,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,KAAK,IAAA,CAAK,QAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,eAAe,OAAA,EAA0D;AAC3E,IAAA,OAAO,IAAA,CAAK,YAAY,YAAY;AAChC,MAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AAClD,MAAA,MAAM,WAAW,OAAA,CAAQ,QAAA,IAAYC,aAAAA,CAAK,QAAA,CAAS,QAAQ,QAAQ,CAAA;AAEnE,MAAA,MAAM,IAAA,GAAO,IAAI,QAAA,EAAS;AAC1B,MAAA,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA;AACxC,MAAA,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc,UAAA,EAAY,QAAQ,CAAA;AAC9C,MAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAC5B,MAAA,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,UAAA,EAAY,CAAA;AACpC,MAAA,IAAI,OAAA,CAAQ,mBAAmB,MAAA,EAAW;AACtC,QAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAkB,OAAA,CAAQ,cAAA,CAAe,UAAU,CAAA;AAC/D,QAAA,IAAI,QAAQ,cAAA,EAAgB;AACxB,UAAA,IAAA,CAAK,MAAA,CAAO,UAAU,aAAa,CAAA;AAAA,QACvC;AAAA,MACJ;AACA,MAAA,IAAI,QAAQ,mBAAA,EAAqB;AAC7B,QAAA,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAuB,OAAA,CAAQ,mBAAmB,CAAA;AAAA,MAClE;AAEA,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,8BAA8B,IAAA,EAAM;AAAA,QACtE,OAAA,EAAS,KAAK,UAAA;AAAW,OAC5B,CAAA;AAED,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACzB,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,YAAY,OAAA,EAAuD;AACrE,IAAA,OAAO,IAAA,CAAK,YAAY,YAAY;AAChC,MAAA,MAAM,WAAW,OAAA,CAAQ,QAAA,IAAYA,aAAAA,CAAK,QAAA,CAAS,QAAQ,QAAQ,CAAA;AACnE,MAAA,MAAM,IAAA,GAAO,IAAI,QAAA,EAAS;AAE1B,MAAA,IAAA,CAAK,OAAO,YAAA,EAAc,MAAM,SAAS,OAAA,CAAQ,QAAQ,GAAG,QAAQ,CAAA;AACpE,MAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAC5B,MAAA,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA;AACxC,MAAA,IAAA,CAAK,MAAA,CAAO,aAAa,MAAM,CAAA;AAC/B,MAAA,IAAA,CAAK,MAAA,CAAO,UAAU,aAAa,CAAA;AACnC,MAAA,IAAI,QAAQ,mBAAA,EAAqB;AAC7B,QAAA,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAuB,OAAA,CAAQ,mBAAmB,CAAA;AAC9D,QAAA,IAAA,CAAK,MAAA,CAAO,aAAa,GAAG,CAAA;AAAA,MAChC;AACA,MAAA,IAAA,CAAK,OAAO,UAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,QAAA,IAAY,GAAG,CAAC,CAAA;AACvD,MAAA,IAAA,CAAK,OAAO,UAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,QAAA,IAAY,GAAG,CAAC,CAAA;AACvD,MAAA,IAAA,CAAK,OAAO,cAAA,EAAgB,MAAA,CAAO,OAAA,CAAQ,YAAA,IAAgB,IAAI,CAAC,CAAA;AAChE,MAAA,IAAA,CAAK,OAAO,iBAAA,EAAmB,MAAA,CAAO,OAAA,CAAQ,eAAA,IAAmB,CAAC,CAAC,CAAA;AACnE,MAAA,IAAA,CAAK,OAAO,cAAA,EAAgB,MAAA,CAAO,OAAA,CAAQ,YAAA,IAAgB,GAAG,CAAC,CAAA;AAE/D,MAAA,MAAM,EAAE,MAAK,GAAI,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,8BAA8B,IAAA,EAAM;AAAA,QACtE,OAAA,EAAS,KAAK,UAAA;AAAW,OAC5B,CAAA;AAED,MAAA,OAAO,IAAA,CAAK,IAAA;AAAA,IAChB,CAAC,CAAA;AAAA,EACL;AACJ,CAAA;ACtHO,IAAM,aAAN,MAAiB;AAAA,EACpB,YAA6B,IAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAsB;AAAA,EAEnD,MAAM,SAAS,OAAA,EAMa;AACxB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,oBAAA,EAAsB,OAAA,IAAW,EAAE,CAAA;AACzE,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,WAAW,OAAA,EASS;AACtB,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,oBAAoB,OAAO,CAAA;AACjE,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,OAAA,CAAQ,IAAA,EAAc,OAAA,EAAsD;AAC9E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,aAAA,EAAgB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,MAC7E,MAAA,EAAQ,OAAA,EAAS,IAAA,GAAO,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,EAAE,GAAI;AAAC,KAC/D,CAAA;AACD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,UAAA,CAAW,IAAA,EAAc,OAAA,EAA0D;AACrF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,gBAAgB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA;AACxF,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,WAAW,IAAA,EAA6B;AAC1C,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,CAAO,gBAAgB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACrE;AAAA,EAEA,MAAM,aAAa,IAAA,EAA6B;AAC5C,IAAA,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,gBAAgB,kBAAA,CAAmB,IAAI,CAAC,CAAA,KAAA,CAAO,CAAA;AAAA,EACxE;AAAA,EAEA,MAAM,UAAU,IAAA,EAA6B;AACzC,IAAA,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,gBAAgB,kBAAA,CAAmB,IAAI,CAAC,CAAA,MAAA,CAAQ,CAAA;AAAA,EACzE;AAAA,EAEA,MAAM,cAAA,CAAe,QAAA,EAAkB,OAAA,EAAwC;AAC3E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,aAAA,EAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,YAAA,CAAA,EAAgB;AAAA,MAC9F;AAAA,KACH,CAAA;AACD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,iBAAA,CAAkB,QAAA,EAAkB,OAAA,EAAwC;AAC9E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,aAAA,EAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,YAAA,CAAA,EAAgB;AAAA,MAChG,IAAA,EAAM,EAAE,OAAA;AAAQ,KACnB,CAAA;AACD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,eAAA,CACF,QAAA,EACA,OAAA,EAQ0B;AAC1B,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,IAAI,OAAA,EAAS,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAC3D,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AACzD,IAAA,IAAI,OAAA,EAAS,IAAA,EAAM,MAAA,CAAO,IAAA,GAAO,OAAA,CAAQ,IAAA;AACzC,IAAA,IAAI,OAAA,EAAS,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAC3D,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AACzD,IAAA,IAAI,SAAS,IAAA,EAAM,MAAA,CAAO,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,GAAG,CAAA;AAEtD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,aAAA,EAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,QAAA,CAAA,EAAY;AAAA,MACzF;AAAA,KACH,CAAA;AACD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,YAAA,CAAa,QAAA,EAAkB,QAAA,EAAiC;AAClE,IAAA,MAAM,UAAA,GAAa,MAAMC,QAAAA,CAAS,QAAQ,CAAA;AAC1C,IAAA,MAAM,QAAA,GAAWD,aAAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,IAAIE,QAAAA,EAAS;AAC1B,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,UAAA,EAAY,QAAQ,CAAA;AAExC,IAAA,MAAM,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA,aAAA,EAAgB,mBAAmB,QAAQ,CAAC,SAAS,IAAA,EAAM;AAAA,MAC5E,OAAA,EAAS,KAAK,UAAA;AAAW,KAC5B,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,gBAAgB,QAAA,EAAiC;AACnD,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,CAAO,gBAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,KAAA,CAAO,CAAA;AAAA,EAC9E;AAAA,EAEA,MAAM,aAAa,QAAA,EAAmC;AAClD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,aAAA,EAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,KAAA,CAAA,EAAS;AAAA,MACtF,YAAA,EAAc;AAAA,KACjB,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,aAAa,OAAA,EAGhB;AACC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,oBAAA,EAAsB;AAAA,MACvD,MAAA,EAAQ,SAAS,eAAA,KAAoB,MAAA,GAAY,EAAE,eAAA,EAAiB,OAAA,CAAQ,eAAA,EAAgB,GAAI;AAAC,KACpG,CAAA;AACD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,YAAY,QAAA,EAAiC;AAC/C,IAAA,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,gBAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,OAAA,CAAS,CAAA;AAAA,EAC9E;AAAA,EAEA,MAAM,WAAW,QAAA,EAAiC;AAC9C,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,CAAO,gBAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,OAAA,CAAS,CAAA;AAAA,EAChF;AACJ,CAAA;;;ACtIO,IAAM,gBAAN,MAAoB;AAAA,EACvB,YAA6B,IAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAsB;AAAA,EAEnD,MAAM,WAAA,GAA8B;AAChC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,iBAAiB,CAAA;AACtD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,eAAe,OAAA,EAA+B;AAChD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,wBAAA,EAA0B;AAAA,MAC3D,MAAA,EAAQ,EAAE,OAAA;AAAQ,KACrB,CAAA;AACD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,iBAAiB,QAAA,EAAiC;AACpD,IAAA,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,gBAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,cAAA,CAAgB,CAAA;AAAA,EACrF;AAAA,EAEA,MAAM,mBAAmB,QAAA,EAAoC;AACzD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,aAAA,EAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,qBAAA,CAAuB,CAAA;AACxG,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AACJ,CAAA;;;ACvBO,IAAM,iBAAN,MAAqB;AAAA,EACxB,YAA6B,IAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAsB;AAAA,EAEnD,MAAM,kBAAA,GAAsC;AACxC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,0BAA0B,CAAA;AAChE,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AACJ,CAAA;;;ACPO,IAAM,eAAN,MAAmB;AAAA,EACtB,YAA6B,IAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAsB;AAAA,EAEnD,MAAM,cAAA,GAAkC;AACpC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,sBAAsB,CAAA;AAC3D,IAAA,OAAO,QAAA,CAAS,KAAK,IAAA,CAAK,KAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,aAAa,OAAA,EAGhB;AACC,IAAA,MAAM,OAA4B,EAAC;AACnC,IAAA,IAAI,OAAA,EAAS,OAAA,EAAS,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,OAAA;AAC7C,IAAA,IAAI,SAAS,IAAA,EAAM,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,GAAG,CAAA;AACpD,IAAA,IAAI,OAAA,EAAS,MAAA,KAAW,MAAA,EAAW,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACzD,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AAEvD,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,wBAAwB,IAAI,CAAA;AAClE,IAAA,OAAO;AAAA,MACH,IAAA,EAAM,SAAS,IAAA,CAAK,IAAA;AAAA,MACpB,QAAA,EAAU,SAAS,IAAA,CAAK;AAAA,KAC5B;AAAA,EACJ;AAAA,EAEA,MAAM,UAAU,IAAA,EAA4B;AACxC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAE,CAAA;AAC7D,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,qBAAA,CAAsB,OAAA,EAAiB,IAAA,EAAiD;AAC1F,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,4BAAA,EAA+B,IAAI,CAAA,CAAA,EAAI;AAAA,MACxE,MAAA,EAAQ,EAAE,OAAA;AAAQ,KACrB,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,KAAK,IAAA,CAAK,SAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,qBAAqB,IAAA,EAA+B;AACtD,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,eAAA,EAAkB,IAAI,CAAA,MAAA,CAAQ,CAAA;AACnE,IAAA,OAAO,QAAA,CAAS,KAAK,IAAA,CAAK,MAAA;AAAA,EAC9B;AACJ,CAAA;;;ACzCO,IAAM,eAAN,MAAmB;AAAA,EACtB,YAA6B,IAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAsB;AAAA,EAEnD,MAAM,gBAAA,GAAmC;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,+BAA+B,CAAA;AACpE,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,oBAAA,GAAsC;AACxC,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,uCAAuC,CAAA;AAAA,EAChE;AACJ,CAAA;;;ACRO,SAAS,oBAAoB,KAAA,EAAyB;AACzD,EAAA,MAAM,UAAA,GAAa,KAAA;AACnB,EAAA,MAAM,QAAA,GAAW,YAAY,QAAA,EAAU,IAAA,EAAM,OAAO,OAAA,IAAW,UAAA,EAAY,QAAA,EAAU,IAAA,EAAM,OAAA,IAAW,EAAA;AACtG,EAAA,MAAM,QAAA,GAAW,SAAS,WAAA,EAAY;AACtC,EAAA,OAAO,SAAS,QAAA,CAAS,qBAAqB,CAAA,IAAK,QAAA,CAAS,SAAS,gBAAgB,CAAA;AACzF;AAQO,SAAS,eAAe,QAAA,EAAsC;AACjE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA;AAClC,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,IAAK,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG;AACjC,IAAA,OAAO,MAAA;AAAA,EACX;AACA,EAAA,OAAO,MAAM,CAAC,CAAA;AAClB;AAMA,eAAsB,sBAAsB,OAAA,EAOxB;AAChB,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,QAAA,EAAU,OAAA,EAAS,UAAS,GAAI,OAAA;AAChE,EAAA,IAAI;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,kBAAA,EAAoB;AAAA,MACjD,SAAA,EAAW,CAAC,OAAO,CAAA;AAAA,MACnB,OAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACH,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,KAAK,IAAA,EAAM,IAAA;AAAA,EAC/B,SAAS,KAAA,EAAO;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACN,CAAA,oCAAA,EAAuC,OAAO,CAAA,GAAA,EAC1C,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACzD,CAAA;AAAA,KACJ;AAAA,EACJ;AACJ;;;AClDO,IAAM,gBAAN,MAAoB;AAAA,EACvB,YACqB,IAAA,EACA,WAAA,GAAyD,CAAC,IAAA,KAAS,MAAK,EAC3F;AAFmB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EAClB;AAAA,EAEH,MAAM,YAAY,OAAA,EAAuD;AACrE,IAAA,OAAO,IAAA,CAAK,YAAY,YAAY;AAChC,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAYC,UAAAA,EAAW;AAChD,MAAA,MAAM,OAAA,GAAU,EAAE,GAAG,OAAA,EAAS,QAAA,EAAS;AAEvC,MAAA,IAAI;AACA,QAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,wBAAwB,OAAO,CAAA;AACrE,QAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,MACzB,SAAS,KAAA,EAAgB;AACrB,QAAA,IAAI,CAAC,mBAAA,CAAoB,KAAK,CAAA,EAAG,MAAM,KAAA;AAEvC,QAAA,MAAM,OAAA,GAAU,cAAA,CAAe,OAAA,CAAQ,QAAQ,CAAA;AAC/C,QAAA,IAAI,CAAC,SAAS,MAAM,KAAA;AAEpB,QAAA,MAAM,qBAAA,CAAsB;AAAA,UACxB,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,OAAA;AAAA,UACA,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,QAAA;AAAA,UACA,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,UAAU,OAAA,CAAQ;AAAA,SACrB,CAAA;AACD,QAAA,OAAO,EAAE,MAAM,QAAA,EAAU,IAAA,EAAM,QAAQ,OAAA,EAAS,WAAA,EAAa,IAAA,CAAK,GAAA,EAAI,EAAE;AAAA,MAC5E;AAAA,IACJ,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,UAAA,CAAW,IAAA,EAAc,OAAA,EAAyD;AACpF,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,gBAAA,EAAmB,IAAI,CAAA,CAAA,EAAI;AAAA,MAC5D,MAAA,EAAQ,OAAA,EAAS,IAAA,GAAO,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,EAAE,GAAI;AAAC,KAC/D,CAAA;AACD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,YAAY,OAAA,EAQa;AAC3B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,uBAAA,EAAyB,OAAA,IAAW,EAAE,CAAA;AAC5E,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,gBAAgB,OAAA,EAMF;AAChB,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AACzD,IAAA,IAAI,OAAA,EAAS,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAC3D,IAAA,IAAI,OAAA,EAAS,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,OAAA,CAAQ,QAAA;AACjD,IAAA,IAAI,OAAA,EAAS,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAC/D,IAAA,IAAI,OAAA,EAAS,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAE/D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,uBAAA,EAAyB,EAAE,QAAQ,CAAA;AACxE,IAAA,OAAO,QAAA,CAAS,KAAK,IAAA,CAAK,KAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,uBAAuB,OAAA,EAMT;AAChB,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AACzD,IAAA,IAAI,OAAA,EAAS,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAC3D,IAAA,IAAI,OAAA,EAAS,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,OAAA,CAAQ,QAAA;AACjD,IAAA,IAAI,OAAA,EAAS,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAC/D,IAAA,IAAI,OAAA,EAAS,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAE/D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,+BAAA,EAAiC;AAAA,MAClE;AAAA,KACH,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,KAAK,IAAA,CAAK,KAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,oBAAoB,OAAA,EAMN;AAChB,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AACzD,IAAA,IAAI,OAAA,EAAS,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAC3D,IAAA,IAAI,OAAA,EAAS,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,OAAA,CAAQ,QAAA;AACjD,IAAA,IAAI,OAAA,EAAS,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAC/D,IAAA,IAAI,OAAA,EAAS,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAE/D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,0BAAA,EAA4B;AAAA,MAC7D;AAAA,KACH,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,KAAK,IAAA,CAAK,KAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,YAAY,OAAA,EAKW;AACzB,IAAA,OAAO,IAAA,CAAK,YAAY,YAAY;AAChC,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,gBAAA,EAAmB,OAAA,CAAQ,WAAW,CAAA,KAAA,CAAA,EAAS;AAAA,QACjF,eAAe,OAAA,CAAQ,aAAA;AAAA,QACvB,6BAAA,EAA+B,OAAA,CAAQ,6BAAA,IAAiC,OAAA,CAAQ,aAAA;AAAA,QAChF,SAAA,EAAW,QAAQ,SAAA,IAAa;AAAA,OACnC,CAAA;AACD,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACzB,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,aAAa,OAAA,EAKU;AACzB,IAAA,OAAO,IAAA,CAAK,YAAY,YAAY;AAChC,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,uBAAA,EAAyB;AAAA,QAC3D,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,qBAAqB,OAAA,CAAQ,WAAA;AAAA,QAC7B,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,SAAA,EAAW,QAAQ,SAAA,IAAa;AAAA,OACnC,CAAA;AACD,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACzB,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,cAAc,OAAA,EAAgF;AAChG,IAAA,OAAO,IAAA,CAAK,YAAY,YAAY;AAChC,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,gBAAA,EAAmB,OAAA,CAAQ,WAAW,CAAA,OAAA,CAAA,EAAW;AAAA,QACnF,SAAA,EAAW,QAAQ,SAAA,IAAa;AAAA,OACnC,CAAA;AACD,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACzB,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,cAAc,IAAA,EAA6B;AAC7C,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,CAAA,gBAAA,EAAmB,IAAI,CAAA,OAAA,CAAS,CAAA;AAAA,EACzD;AAAA,EAEA,MAAM,iBAAiB,IAAA,EAGpB;AACC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,gBAAA,EAAmB,IAAI,CAAA,eAAA,CAAiB,CAAA;AAC7E,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,eAAe,OAAA,EASU;AAC3B,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,0BAA0B,OAAO,CAAA;AACvE,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AACJ,CAAA;;;ACpLO,IAAM,aAAN,MAAiB;AAAA,EACpB,YAA6B,IAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAsB;AAAA,EAEnD,MAAM,OAAO,OAAA,EAA0D;AACnE,IAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,qBAAA,EAAuB;AAAA,MACzD,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,SAAS,OAAA,CAAQ;AAAA,KACpB,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EAChB;AAAA,EAEA,MAAM,KAAK,OAAA,EAAwD;AAC/D,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,mBAAA,EAAqB;AAAA,MACvD,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,kBAAkB,OAAA,CAAQ;AAAA,KAC7B,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EAChB;AAAA,EAEA,MAAM,OAAO,OAAA,EAAwD;AACjE,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,qBAAA,EAAuB;AAAA,MACzD,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,kBAAkB,OAAA,CAAQ;AAAA,KAC7B,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EAChB;AAAA,EAEA,MAAM,UAAU,OAAA,EAA6D;AACzE,IAAA,IAAI,CAAC,QAAQ,UAAA,IAAc,OAAA,CAAQ,WAAW,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AAC/D,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,qBAAA,EAAuB;AAAA,MACzD,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,YAAY,OAAA,CAAQ;AAAA,KACvB,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EAChB;AACJ,CAAA;;;ACnDO,IAAM,yBAAN,MAA6B;AAAA,EAChC,YAA6B,IAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAsB;AAAA,EAEnD,MAAM,uBAAuB,OAAA,EAA4B;AACrD,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,4BAA4B,OAAO,CAAA;AACzE,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,oBAAA,GAAuC;AACzC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,0BAA0B,CAAA;AAC/D,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,sBAAA,CAAuB,EAAA,EAAY,OAAA,EAA4B;AACjE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,yBAAA,EAA4B,EAAE,IAAI,OAAO,CAAA;AAC9E,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,uBAAuB,EAAA,EAA2B;AACpD,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,CAAA,yBAAA,EAA4B,EAAE,CAAA,CAAE,CAAA;AAAA,EAC3D;AACJ,CAAA;;;ACrBO,IAAM,eAAN,MAAmB;AAAA,EACtB,YAA6B,IAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAsB;AAAA,EAEnD,MAAM,aAAA,GAA8B;AAChC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,qBAAqB,CAAA;AAC1D,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,eAAA,GAAgC;AAClC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,kCAAkC,CAAA;AACvE,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,cAAc,KAAA,EAAmC;AACnD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,qBAAA,EAAuB;AAAA,MACxD,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,KAAU;AAAC,KAC9C,CAAA;AACD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,mBAAmB,OAAA,EAA6C;AAClE,IAAA,MAAM,SAA8B,EAAC;AACrC,IAAA,IAAI,SAAS,IAAA,EAAM,MAAA,CAAO,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,GAAG,CAAA;AAEtD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,iCAAA,EAAmC;AAAA,MACpE;AAAA,KACH,CAAA;AACD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,yBAAyB,OAAA,EAA6C;AACxE,IAAA,MAAM,SAA8B,EAAC;AACrC,IAAA,IAAI,SAAS,IAAA,EAAM,MAAA,CAAO,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,GAAG,CAAA;AAEtD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,sCAAA,EAAwC;AAAA,MACzE;AAAA,KACH,CAAA;AACD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AACJ,CAAA;;;ACtBO,IAAM,oBAAA,GAAN,MAAM,oBAAA,SAA4BJ,YAAAA,CAA0C;AAAA,EAsDvE,WAAA,CAAY,MAAA,GAAuB,EAAC,EAAG;AAC3C,IAAA,KAAA,EAAM;AAvCV;AAAA,IAAA,aAAA,CAAA,IAAA,EAAgB,QAAA,CAAA;AAChB,IAAA,aAAA,CAAA,IAAA,EAAgB,QAAA,EAAS,UAAU,qBAAqB,CAAA,CAAA;AACxD,IAAA,aAAA,CAAA,IAAA,EAAgB,MAAA,CAAA;AAChB,IAAA,aAAA,CAAA,IAAA,EAAgB,QAAA,CAAA;AAEhB,IAAA,aAAA,CAAA,IAAA,EAAgB,aAAA,CAAA;AAChB,IAAA,aAAA,CAAA,IAAA,EAAgB,UAAA,CAAA;AAChB,IAAA,aAAA,CAAA,IAAA,EAAgB,OAAA,CAAA;AAEhB,IAAA,aAAA,CAAA,IAAA,EAAgB,UAAA,CAAA;AAChB,IAAA,aAAA,CAAA,IAAA,EAAgB,SAAA,CAAA;AAEhB,IAAA,aAAA,CAAA,IAAA,EAAgB,UAAA,CAAA;AAChB,IAAA,aAAA,CAAA,IAAA,EAAgB,QAAA,CAAA;AAEhB,IAAA,aAAA,CAAA,IAAA,EAAgB,OAAA,CAAA;AAChB,IAAA,aAAA,CAAA,IAAA,EAAgB,mBAAA,CAAA;AAChB,IAAA,aAAA,CAAA,IAAA,EAAgB,QAAA,CAAA;AAOhB;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAQ,mBAAA,sBAAwB,GAAA,EAAY,CAAA;AAM5C;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAQ,WAAA,EAA8B,QAAQ,OAAA,EAAQ,CAAA;AAMtD;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAQ,cAAA,EAAe,KAAA,CAAA;AAKnB,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACV,SAAA,EAAW,uBAAA;AAAA,MACX,QAAA,EAAU,MAAA;AAAA,MACV,GAAG;AAAA,KACP;AAEA,IAAA,IAAI,IAAA,CAAK,OAAO,QAAA,EAAU;AACtB,MAAA,iBAAA,CAAkB,IAAA,CAAK,OAAO,QAAoB,CAAA;AAAA,IACtD;AAEA,IAAA,IAAA,CAAK,IAAA,GAAO,MAAM,MAAA,CAAO;AAAA,MACrB,OAAA,EAAS,KAAK,MAAA,CAAO,SAAA;AAAA,MACrB,OAAA,EAAS,KAAK,MAAA,CAAO,MAAA,GAAS,EAAE,WAAA,EAAa,IAAA,CAAK,MAAA,CAAO,MAAA,EAAO,GAAI;AAAA,KACvE,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,GAAS,EAAA,CAAG,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAAA,MACpC,IAAA,EAAM,KAAK,MAAA,CAAO,MAAA,GAAS,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,EAAO,GAAI,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAc5D,UAAA,EAAY,CAAC,WAAW,CAAA;AAAA;AAAA,MACxB,OAAA,EAAS,GAAA;AAAA;AAAA,MACT,QAAA,EAAU;AAAA;AAAA,KACb,CAAA;AAGD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAE9C,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,gBAAA,CAAiB,IAAA,CAAK,MAAM,WAAW,CAAA;AAC9D,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,aAAA,CAAc,IAAA,CAAK,MAAM,WAAW,CAAA;AACxD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAErC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AAC3C,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAEzC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAC5C,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAExC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AACrC,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAI,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA;AAC7D,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAAA,EAC5C;AAAA,EAtGA,OAAc,YAAY,MAAA,EAA4C;AAClE,IAAA,MAAM,QAAA,GAAW,qBAAoB,YAAA,EAAa;AAClD,IAAA,IAAI,UAAU,OAAO,QAAA;AAErB,IAAA,MAAM,QAAA,GAAW,IAAI,oBAAA,CAAoB,MAAM,CAAA;AAC/C,IAAA,oBAAA,CAAoB,aAAa,QAAQ,CAAA;AACzC,IAAA,OAAO,QAAA;AAAA,EACX;AAAA,EAqGS,IAAA,CAAK,UAA2B,IAAA,EAA0B;AAC/D,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,GAAI,IAAgC,CAAA;AAAA,EACjE;AAAA,EAMS,EAAA,CAAG,OAAwB,QAAA,EAA8C;AAC9E,IAAA,OAAO,KAAA,CAAM,EAAA,CAAG,KAAA,EAAO,QAAwC,CAAA;AAAA,EACnE;AAAA,EAMS,IAAA,CAAK,OAAwB,QAAA,EAA8C;AAChF,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,QAAwC,CAAA;AAAA,EACrE;AAAA,EAMS,GAAA,CAAI,OAAwB,QAAA,EAA8C;AAC/E,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,KAAA,EAAO,QAAwC,CAAA;AAAA,EACpE;AAAA,EAMS,WAAA,CAAY,OAAwB,QAAA,EAA8C;AACvF,IAAA,OAAO,KAAA,CAAM,WAAA,CAAY,KAAA,EAAO,QAAwC,CAAA;AAAA,EAC5E;AAAA,EAMS,cAAA,CAAe,OAAwB,QAAA,EAA8C;AAC1F,IAAA,OAAO,KAAA,CAAM,cAAA,CAAe,KAAA,EAAO,QAAwC,CAAA;AAAA,EAC/E;AAAA,EAEA,MAAM,OAAA,GAAU;AACZ,IAAA,MAAM,YAAA,GAAyC;AAAA,MAC3C,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,iBAAA;AAAA,MACA,0BAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA,qBAAA;AAAA,MACA,kBAAA;AAAA,MACA,oBAAA;AAAA,MACA,oBAAA;AAAA,MACA,oBAAA;AAAA,MACA,kBAAA;AAAA,MACA,YAAA;AAAA,MACA,mBAAA;AAAA,MACA,wBAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,KAAA,MAAW,aAAa,YAAA,EAAc;AAClC,MAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,SAAA,EAAW,CAAA,GAAI,IAAA,KAAoB;AAQ9C,QAAA,IAAI,SAAA,KAAc,aAAA,IAAiB,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAChD,UAAA,MAAM,OAAA,GAAU,KAAK,CAAC,CAAA;AACtB,UAAA,IAAI,SAAS,IAAA,EAAM;AAEf,YAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC1C,cAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,+CAAA,EAAkD,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAClF,cAAA;AAAA,YACJ;AAEA,YAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AAAA,UAC3C;AAAA,QACJ;AAEA,QAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACjB,UAAA,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,QACjC,CAAA,MAAO;AACH,UAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,QACxB;AAAA,MACJ,CAAC,CAAA;AAAA,IACL;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,YAAA,EAAc,MAAM;AAC/B,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,mCAAmC,CAAA;AACpD,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,MAAA,IAAA,CAAK,KAAK,YAAY,CAAA;AAAA,IAC1B,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,SAAA,EAAW,MAAM;AAC5B,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,2BAA2B,CAAA;AAC5C,MAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACpB,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,QAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,MACrB;AAAA,IACJ,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,YAAA,EAAc,CAAC,KAAA,KAAgD;AAC1E,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,uBAAA,EAA0B,KAAA,CAAM,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,MAAA,GAAS,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AACtG,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,IAAI,KAAA,CAAM,0BAA0B,KAAA,CAAM,OAAO,EAAE,CAAC,CAAA;AAAA,IAC3E,CAAC,CAAA;AAED,IAAA,IAAI,IAAA,CAAK,OAAO,SAAA,EAAW;AACvB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,sCAAsC,CAAA;AACvD,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,MAAM;AAC9B,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,6DAA6D,CAAA;AAE9E,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ;AACrB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,mEAAmE,CAAA;AACpF,QAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACpB,UAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,UAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,QACrB;AAAA,MACJ;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AACxB,MAAA,IAAA,CAAK,OAAO,OAAA,EAAQ;AAAA,IACxB;AAAA,EACJ;AAAA,EAEA,MAAM,KAAA,GAAQ;AACV,IAAA,IAAA,CAAK,OAAO,UAAA,EAAW;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,sBAAA,CAAuB,UAAkB,GAAA,EAAM;AAClD,IAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,IAAA,GAAO,OAAA,EAAS;AACvC,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,iBAAiB,CAAA;AAClD,MAAA,IAAA,CAAK,kBAAkB,KAAA,EAAM;AAE7B,MAAA,QAAA,CAAS,KAAA,CAAM,CAAC,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,IAAA,KAAS;AACvD,QAAA,IAAA,CAAK,iBAAA,CAAkB,IAAI,IAAI,CAAA;AAAA,MACnC,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,OAAO,KAAA,CAAM,CAAA,4CAAA,EAA+C,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA,SAAA,CAAW,CAAA;AAAA,IAC3G;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKO,wBAAA,GAAmC;AACtC,IAAA,OAAO,KAAK,iBAAA,CAAkB,IAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,YAAe,IAAA,EAAoC;AACtD,IAAA,MAAM,SAAS,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,MAAM,MAAM,CAAA;AAE/C,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AACtC,IAAA,OAAO,MAAA;AAAA,EACX;AACJ,CAAA;AAlSI,aAAA,CADS,oBAAA,EACM,cAAA,EAAe,MAAmC,UAAA,CAAmB,uBAAA,IAA2B,IAAA,CAAA;AAC/G,aAAA,CAFS,oBAAA,EAEM,cAAA,EAAe,CAAC,GAAA,KAA6B;AACxD,EAAC,WAAmB,uBAAA,GAA0B,GAAA;AAClD,CAAA,CAAA;AAJG,IAAM,mBAAA,GAAN;AAqSA,IAAM,MAAM,mBAAA,CAAoB;;;ACxThC,IAAM,uBAAA,GAA0B;AAChC,IAAM,sBAAA,GAAyB;AAC/B,IAAM,yBAAA,GAA4B;AAClC,IAAM,yBAAA,GAA4B;AAClC,IAAM,yBAAA,GAA4B;AAClC,IAAM,WAAA,GAAc;AACpB,IAAM,kBAAA,GAAqB;AAC3B,IAAM,eAAA,GAAkB;AACxB,IAAM,UAAA,GAAa;AACnB,IAAM,mBAAA,GAAsB;AAC5B,IAAM,iBAAA,GAAoB;AAC1B,IAAM,gBAAA,GAAmB;AACzB,IAAM,kBAAA,GAAqB;AAC3B,IAAM,kBAAA,GAAqB;AAC3B,IAAM,wBAAA,GAA2B;AACjC,IAAM,WAAA,GAAc;AACpB,IAAM,gBAAA,GAAmB;AACzB,IAAM,aAAA,GAAgB;AACtB,IAAM,yBAAA,GAA4B;AAClC,IAAM,wBAAA,GAA2B;AACjC,IAAM,iBAAA,GAAoB;AAC1B,IAAM,iBAAA,GAAoB;AAC1B,IAAM,uBAAA,GAA0B;AAChC,IAAM,uBAAA,GAA0B;AAChC,IAAM,uBAAA,GAA0B;AAChC,IAAM,oBAAA,GAAuB;AAC7B,IAAM,oBAAA,GAAuB;AAC7B,IAAM,oBAAA,GAAuB;AAC7B,IAAM,wBAAA,GAA2B;AACjC,IAAM,sBAAA,GAAyB;AAC/B,IAAM,mBAAA,GAAsB;;;AC3B5B,IAAM,sBAAA,GACT,wFAAA;AAEJ,IAAM,SAAA,uBAAgB,GAAA,EAAwB;AAEvC,SAAS,SAAA,CAAU,aAAqB,IAAA,EAAwB;AACnE,EAAA,SAAA,CAAU,GAAA,CAAI,aAAa,IAAI,CAAA;AACnC;AAMO,SAAS,kBAAkB,QAAA,EAAiC;AAC/D,EAAA,KAAA,MAAW,IAAA,IAAQ,SAAA,CAAU,MAAA,EAAO,EAAG;AACnC,IAAA,MAAM,MAAA,GAAS,KAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,qBAAqB,QAAQ,CAAA;AACvE,IAAA,IAAI,MAAA,SAAe,MAAA,CAAO,IAAA;AAAA,EAC9B;AACA,EAAA,OAAO,IAAA;AACX;AAEO,SAAS,cAAc,OAAA,EAAmC;AAC7D,EAAA,OAAO,QAAQ,eAAA,KAAoB,sBAAA;AACvC;AAEO,SAAS,WAAW,OAAA,EAAmC;AAC1D,EAAA,OAAO,aAAA,CAAc,OAAO,CAAA,IAAK,OAAA,CAAQ,qBAAA,KAA0B,MAAA;AACvE;AAYA,SAAS,eAAe,WAAA,EAAmE;AACvF,EAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,MAAA,KAAW,GAAG,OAAO,IAAA;AAErD,EAAA,MAAM,OAAA,GAAU,YAAY,CAAC,CAAA;AAC7B,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,IAAI,OAAA,CAAQ,GAAA,IAAO,OAAO,OAAA,CAAQ,QAAQ,QAAA,EAAU;AAChD,IAAA,OAAO,OAAA,CAAQ,GAAA;AAAA,EACnB;AAEA,EAAA,MAAM,UAAU,OAAA,CAAQ,QAAA;AACxB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AACxB,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACvB,MAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AACzC,QAAA,IAAI,IAAI,aAAa,CAAA,IAAK,OAAO,GAAA,CAAI,aAAa,MAAM,QAAA,EAAU;AAC9D,UAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,aAAa,EAAE,GAAG,CAAA;AAClD,UAAA,IAAI,OAAO,WAAA,KAAgB,QAAA,IAAY,WAAA,CAAY,UAAA,CAAW,QAAQ,CAAA,EAAG;AACrE,YAAA,OAAO,WAAA;AAAA,UACX;AAAA,QACJ;AACA,QAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,UAAA,CAAW,QAAQ,CAAA,EAAG;AACrD,UAAA,OAAO,GAAA;AAAA,QACX;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,EAAA,OAAO,IAAA;AACX;AAEA,SAAS,aAAa,OAAA,EAAiC;AACnD,EAAA,IAAI;AACA,IAAA,MAAM,MAAA,GAAS,QAAA;AACf,IAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,MAAM,GAAG,OAAO,IAAA;AAExC,IAAA,IAAI,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AACtC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACnC,IAAA,IAAI,eAAe,CAAA,CAAA,EAAI;AACnB,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA;AAAA,IACnC;AAEA,IAAA,IAAA,GAAO,mBAAmB,IAAI,CAAA;AAE9B,IAAA,IAAI;AACA,MAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AACJ,MAAA,MAAM,UAAU,MAAA,CAAO,IAAA,CAAK,MAAM,QAAQ,CAAA,CAAE,SAAS,OAAO,CAAA;AAC5D,MAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC7B;AAAA,EACJ,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;AAEO,SAAS,oBAAoB,OAAA,EAA6C;AAC7E,EAAA,IAAI,CAAC,aAAA,CAAc,OAAO,CAAA,EAAG,OAAO,IAAA;AACpC,EAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,IAAA;AAEhC,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,OAAA,CAAQ,WAAW,CAAA;AAClD,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,MAAM,IAAA,GAAO,aAAa,OAAO,CAAA;AACjC,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,MAAM,OAAO,IAAA;AAEhC,EAAA,MAAM,MAAA,GAAqB;AAAA,IACvB,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,KAAA,IAAS,EAAA;AAAA,IAC1B,aAAA,EAAe,IAAA,CAAK,IAAA,CAAK,aAAA,IAAiB,EAAA;AAAA,IAC1C,OAAA,EAAS,IAAA,CAAK,IAAA,CAAK,kBAAA,IAAsB;AAAC,GAC9C;AAEA,EAAA,IAAI,QAAQ,IAAA,EAAM;AACd,IAAA,SAAA,CAAU,OAAA,CAAQ,MAAM,MAAM,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,MAAA;AACX;AAEO,SAAS,eAAe,OAAA,EAAiD;AAC5E,EAAA,IAAI,CAAC,aAAA,CAAc,OAAO,CAAA,EAAG,OAAO,IAAA;AACpC,EAAA,IAAI,CAAC,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,IAAA;AAEjC,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,OAAA,CAAQ,WAAW,CAAA;AAClD,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,MAAM,IAAA,GAAO,aAAa,OAAO,CAAA;AACjC,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,MAAM,OAAO,IAAA;AAEhC,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,KAAA,IAAS;AAAC,GAC/B;AACJ;AAEO,SAAS,eAAe,OAAA,EAAkC;AAC7D,EAAA,IAAI,CAAC,aAAA,CAAc,OAAO,CAAA,EAAG;AACzB,IAAA,OAAO,QAAQ,IAAA,IAAQ,WAAA;AAAA,EAC3B;AAEA,EAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACrB,IAAA,MAAM,QAAA,GAAW,eAAe,OAAO,CAAA;AACvC,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACvC,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAClB,GAAA,CAAI,CAAC,CAAA,KAAM;AACR,QAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,CAAA,CAAE,oBAAoB,CAAA;AAC3D,QAAA,MAAM,gBAAgB,UAAA,GAAa,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,CAAA,GAAM,CAAA,OAAA,EAAU,EAAE,oBAAoB,CAAA,CAAA;AACvF,QAAA,OAAO,CAAA,EAAG,CAAA,CAAE,iBAAA,IAAqB,SAAS,UAAU,aAAa,CAAA,CAAA;AAAA,MACrE,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AACd,MAAA,OAAO,eAAe,KAAK,CAAA,CAAA;AAAA,IAC/B;AACA,IAAA,OAAO,aAAA;AAAA,EACX;AAEA,EAAA,MAAM,QAAA,GAAW,oBAAoB,OAAO,CAAA;AAC5C,EAAA,IAAI,QAAA,EAAU;AACV,IAAA,MAAM,QAAQ,QAAA,CAAS,KAAA,GAAQ,CAAA,CAAA,EAAI,QAAA,CAAS,KAAK,CAAA,CAAA,CAAA,GAAM,iBAAA;AACvD,IAAA,MAAM,cAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAK,CAAA,KAAM,CAAA,EAAA,EAAK,CAAA,GAAI,CAAC,KAAK,GAAA,CAAI,IAAI,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AACzF,IAAA,OAAO,UAAU,KAAK;AAAA,EAAK,WAAW,CAAA,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,0BAAA;AACX;AAEO,SAAS,gBAAgB,OAAA,EAAkC;AAC9D,EAAA,IAAI,CAAC,aAAA,CAAc,OAAO,CAAA,EAAG;AACzB,IAAA,OAAO,QAAQ,IAAA,IAAQ,WAAA;AAAA,EAC3B;AAEA,EAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACrB,IAAA,MAAM,QAAA,GAAW,eAAe,OAAO,CAAA;AACvC,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACvC,MAAA,OAAO,CAAA,YAAA,EAAe,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,QAAA,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,aAAA;AAAA,EACX;AAEA,EAAA,MAAM,QAAA,GAAW,oBAAoB,OAAO,CAAA;AAC5C,EAAA,IAAI,QAAA,EAAU;AACV,IAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,IAAS,MAAA;AAChC,IAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,OAAA,CAC3B,KAAA,CAAM,GAAG,CAAC,CAAA,CACV,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CACjB,KAAK,IAAI,CAAA;AACd,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,MAAM,QAAA,CAAS,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,KAAA,CAAA,GAAU,EAAA;AAC7F,IAAA,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,EAAA,EAAK,cAAc,GAAG,WAAW,CAAA,CAAA;AAAA,EACrD;AAEA,EAAA,OAAO,QAAA;AACX","file":"index.js","sourcesContent":["import EventEmitter from \"node:events\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport class Logger extends EventEmitter {\n tag: string;\n private logLevel: LogLevel = \"info\";\n private logFile?: string;\n\n constructor(tag: string, level: LogLevel = \"info\", logToFile = true) {\n super();\n this.tag = tag;\n this.logLevel = level;\n\n if (logToFile) {\n const logDir = path.join(os.homedir(), \"Library\", \"Logs\", \"AdvancedIMessageKit\");\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true });\n }\n this.logFile = path.join(logDir, \"sdk.log\");\n }\n }\n\n setLogLevel(level: LogLevel) {\n this.logLevel = level;\n }\n\n private shouldLog(level: LogLevel): boolean {\n const levels: LogLevel[] = [\"debug\", \"info\", \"warn\", \"error\"];\n const currentIndex = levels.indexOf(this.logLevel);\n const messageIndex = levels.indexOf(level);\n return messageIndex >= currentIndex;\n }\n\n private formatMessage(level: string, message: string): string {\n const timestamp = new Date().toISOString();\n return `[${timestamp}][${level.toUpperCase()}][${this.tag}] ${message}`;\n }\n\n private writeLog(level: LogLevel, message: string) {\n if (!this.shouldLog(level)) return;\n\n const formatted = this.formatMessage(level, message);\n\n switch (level) {\n case \"error\":\n console.error(formatted);\n break;\n case \"warn\":\n console.warn(formatted);\n break;\n case \"debug\":\n console.debug(formatted);\n break;\n default:\n console.log(formatted);\n }\n\n if (this.logFile) {\n try {\n fs.appendFileSync(this.logFile, `${formatted}\\n`);\n } catch {}\n }\n\n this.emit(\"log\", { level, message, tag: this.tag });\n }\n\n info(message: string) {\n this.writeLog(\"info\", message);\n }\n\n debug(message: string) {\n this.writeLog(\"debug\", message);\n }\n\n error(message: string | Error) {\n const msg = message instanceof Error ? message.message : message;\n this.writeLog(\"error\", msg);\n if (message instanceof Error && message.stack) {\n this.writeLog(\"error\", message.stack);\n }\n }\n\n warn(message: string) {\n this.writeLog(\"warn\", message);\n }\n\n log(message: string, level: LogLevel = \"info\") {\n this.writeLog(level, message);\n }\n}\n","import { EventEmitter as EventEmitterClass } from \"node:events\";\nimport type { LogLevel } from \"./Logger\";\nimport { Logger } from \"./Logger\";\n\nconst loggers: Record<string, Logger> = {};\nlet globalLogLevel: LogLevel = \"info\";\n\nexport const setGlobalLogLevel = (level: LogLevel) => {\n globalLogLevel = level;\n Object.values(loggers).forEach((logger) => {\n logger.setLogLevel(level);\n });\n};\n\nexport const getLogger = (tag: string) => {\n let logger = loggers[tag];\n if (!logger) {\n logger = new Logger(tag, globalLogLevel);\n loggers[tag] = logger;\n }\n\n return logger;\n};\n\nexport class Loggable extends EventEmitterClass {\n tag?: string;\n\n get log() {\n const name = this.tag ?? this.constructor.name;\n return getLogger(name);\n }\n\n constructor(tag?: string) {\n super();\n\n if (tag) {\n this.tag = tag;\n }\n }\n\n onLog(listener: (data: { level: string; message: string; tag: string }) => void) {\n this.log.on(\"log\", listener);\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AxiosInstance } from \"axios\";\nimport FormData from \"form-data\";\nimport type { AttachmentResponse, MessageResponse, SendAttachmentOptions, SendStickerOptions } from \"../types\";\n\nexport class AttachmentModule {\n constructor(\n private readonly http: AxiosInstance,\n private readonly enqueueSend: <T>(task: () => Promise<T>) => Promise<T> = (task) => task(),\n ) {}\n\n async getAttachmentCount(): Promise<number> {\n const response = await this.http.get(\"/api/v1/attachment/count\");\n return response.data.data.total;\n }\n\n async getAttachment(guid: string): Promise<AttachmentResponse> {\n const response = await this.http.get(`/api/v1/attachment/${guid}`);\n return response.data.data;\n }\n\n async downloadAttachment(\n guid: string,\n options?: {\n original?: boolean;\n force?: boolean;\n height?: number;\n width?: number;\n quality?: number;\n },\n ): Promise<Buffer> {\n const params: Record<string, unknown> = {};\n if (options?.original !== undefined) params.original = options.original;\n if (options?.force !== undefined) params.force = options.force;\n if (options?.height !== undefined) params.height = options.height;\n if (options?.width !== undefined) params.width = options.width;\n if (options?.quality !== undefined) params.quality = options.quality;\n\n const response = await this.http.get(`/api/v1/attachment/${guid}/download`, {\n params,\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async downloadAttachmentLive(guid: string): Promise<Buffer> {\n const response = await this.http.get(`/api/v1/attachment/${guid}/live`, {\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async getAttachmentBlurhash(\n guid: string,\n options?: { height?: number; width?: number; quality?: number },\n ): Promise<string> {\n const params: Record<string, unknown> = {};\n if (options?.height !== undefined) params.height = options.height;\n if (options?.width !== undefined) params.width = options.width;\n if (options?.quality !== undefined) params.quality = options.quality;\n\n const response = await this.http.get(`/api/v1/attachment/${guid}/blurhash`, {\n params,\n });\n return response.data.data.blurhash;\n }\n\n async sendAttachment(options: SendAttachmentOptions): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const fileBuffer = await readFile(options.filePath);\n const fileName = options.fileName || path.basename(options.filePath);\n\n const form = new FormData();\n form.append(\"chatGuid\", options.chatGuid);\n form.append(\"attachment\", fileBuffer, fileName);\n form.append(\"name\", fileName);\n form.append(\"tempGuid\", randomUUID());\n if (options.isAudioMessage !== undefined) {\n form.append(\"isAudioMessage\", options.isAudioMessage.toString());\n if (options.isAudioMessage) {\n form.append(\"method\", \"private-api\");\n }\n }\n if (options.selectedMessageGuid) {\n form.append(\"selectedMessageGuid\", options.selectedMessageGuid);\n }\n\n const response = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n\n return response.data.data;\n });\n }\n\n async sendSticker(options: SendStickerOptions): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const fileName = options.fileName || path.basename(options.filePath);\n const form = new FormData();\n\n form.append(\"attachment\", await readFile(options.filePath), fileName);\n form.append(\"name\", fileName);\n form.append(\"chatGuid\", options.chatGuid);\n form.append(\"isSticker\", \"true\");\n form.append(\"method\", \"private-api\");\n if (options.selectedMessageGuid) {\n form.append(\"selectedMessageGuid\", options.selectedMessageGuid);\n form.append(\"partIndex\", \"0\");\n }\n form.append(\"stickerX\", String(options.stickerX ?? 0.5));\n form.append(\"stickerY\", String(options.stickerY ?? 0.5));\n form.append(\"stickerScale\", String(options.stickerScale ?? 0.75));\n form.append(\"stickerRotation\", String(options.stickerRotation ?? 0));\n form.append(\"stickerWidth\", String(options.stickerWidth ?? 300));\n\n const { data } = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n\n return data.data;\n });\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AxiosInstance } from \"axios\";\nimport FormData from \"form-data\";\nimport type { ChatResponse, MessageResponse } from \"../types\";\n\nexport class ChatModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getChats(options?: {\n withLastMessage?: boolean;\n withArchived?: boolean;\n offset?: number;\n limit?: number;\n sort?: string;\n }): Promise<ChatResponse[]> {\n const response = await this.http.post(\"/api/v1/chat/query\", options ?? {});\n return response.data.data;\n }\n\n async createChat(options: {\n addresses: string[];\n message?: string;\n method?: \"apple-script\" | \"private-api\";\n service?: \"iMessage\" | \"SMS\";\n tempGuid?: string;\n subject?: string;\n effectId?: string;\n attributedBody?: Record<string, unknown>;\n }): Promise<ChatResponse> {\n const response = await this.http.post(\"/api/v1/chat/new\", options);\n return response.data.data;\n }\n\n async getChat(guid: string, options?: { with?: string[] }): Promise<ChatResponse> {\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(guid)}`, {\n params: options?.with ? { with: options.with.join(\",\") } : {},\n });\n return response.data.data;\n }\n\n async updateChat(guid: string, options: { displayName?: string }): Promise<ChatResponse> {\n const response = await this.http.put(`/api/v1/chat/${encodeURIComponent(guid)}`, options);\n return response.data.data;\n }\n\n async deleteChat(guid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${encodeURIComponent(guid)}`);\n }\n\n async markChatRead(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/read`);\n }\n\n async leaveChat(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/leave`);\n }\n\n async addParticipant(chatGuid: string, address: string): Promise<ChatResponse> {\n const response = await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/participant`, {\n address,\n });\n return response.data.data;\n }\n\n async removeParticipant(chatGuid: string, address: string): Promise<ChatResponse> {\n const response = await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/participant`, {\n data: { address },\n });\n return response.data.data;\n }\n\n async getChatMessages(\n chatGuid: string,\n options?: {\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n with?: string[];\n },\n ): Promise<MessageResponse[]> {\n const params: Record<string, unknown> = {};\n if (options?.offset !== undefined) params.offset = options.offset;\n if (options?.limit !== undefined) params.limit = options.limit;\n if (options?.sort) params.sort = options.sort;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.after !== undefined) params.after = options.after;\n if (options?.with) params.with = options.with.join(\",\");\n\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/message`, {\n params,\n });\n return response.data.data;\n }\n\n async setGroupIcon(chatGuid: string, filePath: string): Promise<void> {\n const fileBuffer = await readFile(filePath);\n const fileName = path.basename(filePath);\n const form = new FormData();\n form.append(\"icon\", fileBuffer, fileName);\n\n await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`, form, {\n headers: form.getHeaders(),\n });\n }\n\n async removeGroupIcon(chatGuid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`);\n }\n\n async getGroupIcon(chatGuid: string): Promise<Buffer> {\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`, {\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async getChatCount(options?: { includeArchived?: boolean }): Promise<{\n total: number;\n breakdown: Record<string, number>;\n }> {\n const response = await this.http.get(\"/api/v1/chat/count\", {\n params: options?.includeArchived !== undefined ? { includeArchived: options.includeArchived } : {},\n });\n return response.data.data;\n }\n\n async startTyping(chatGuid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/typing`);\n }\n\n async stopTyping(chatGuid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/typing`);\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ContactModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getContacts(): Promise<any[]> {\n const response = await this.http.get(\"/api/v1/contact\");\n return response.data.data;\n }\n\n async getContactCard(address: string): Promise<any> {\n const response = await this.http.get(\"/api/v1/icloud/contact\", {\n params: { address },\n });\n return response.data.data;\n }\n\n async shareContactCard(chatGuid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/share/contact`);\n }\n\n async shouldShareContact(chatGuid: string): Promise<boolean> {\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/share/contact/status`);\n return response.data.data;\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class FaceTimeModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async createFaceTimeLink(): Promise<string> {\n const response = await this.http.post(\"/api/v1/facetime/session\");\n return response.data.data;\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class HandleModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getHandleCount(): Promise<number> {\n const response = await this.http.get(\"/api/v1/handle/count\");\n return response.data.data.total;\n }\n\n async queryHandles(options?: { address?: string; with?: string[]; offset?: number; limit?: number }): Promise<{\n data: any[];\n metadata: { total: number; offset: number; limit: number; count: number };\n }> {\n const body: Record<string, any> = {};\n if (options?.address) body.address = options.address;\n if (options?.with) body.with = options.with.join(\",\");\n if (options?.offset !== undefined) body.offset = options.offset;\n if (options?.limit !== undefined) body.limit = options.limit;\n\n const response = await this.http.post(\"/api/v1/handle/query\", body);\n return {\n data: response.data.data,\n metadata: response.data.metadata,\n };\n }\n\n async getHandle(guid: string): Promise<any> {\n const response = await this.http.get(`/api/v1/handle/${guid}`);\n return response.data.data;\n }\n\n async getHandleAvailability(address: string, type: \"imessage\" | \"facetime\"): Promise<boolean> {\n const response = await this.http.get(`/api/v1/handle/availability/${type}`, {\n params: { address },\n });\n return response.data.data.available;\n }\n\n async getHandleFocusStatus(guid: string): Promise<string> {\n const response = await this.http.get(`/api/v1/handle/${guid}/focus`);\n return response.data.data.status;\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ICloudModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getFindMyFriends(): Promise<any[]> {\n const response = await this.http.get(\"/api/v1/icloud/findmy/friends\");\n return response.data.data;\n }\n\n async refreshFindMyFriends(): Promise<void> {\n await this.http.post(\"/api/v1/icloud/findmy/friends/refresh\");\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\n/**\n * Checks if an error indicates that a chat does not exist.\n */\nexport function isChatNotExistError(error: unknown): boolean {\n const axiosError = error as { response?: { data?: { error?: { message?: string }; message?: string } } };\n const errorMsg = axiosError?.response?.data?.error?.message || axiosError?.response?.data?.message || \"\";\n const lowerMsg = errorMsg.toLowerCase();\n return lowerMsg.includes(\"chat does not exist\") || lowerMsg.includes(\"chat not found\");\n}\n\n/**\n * Extracts the address from a chatGuid.\n * Expected format: \"service;-;address\"\n * e.g., \"any;-;+1xxxxxxxxxx\" -> \"+1xxxxxxxxxx\"\n * Returns undefined if chatGuid is malformed.\n */\nexport function extractAddress(chatGuid: string): string | undefined {\n const parts = chatGuid.split(\";-;\");\n if (parts.length !== 2 || !parts[1]) {\n return undefined;\n }\n return parts[1];\n}\n\n/**\n * Creates a chat with an initial message.\n * Returns the created chat's GUID.\n */\nexport async function createChatWithMessage(options: {\n http: AxiosInstance;\n address: string;\n message: string;\n tempGuid?: string;\n subject?: string;\n effectId?: string;\n}): Promise<string> {\n const { http, address, message, tempGuid, subject, effectId } = options;\n try {\n const response = await http.post(\"/api/v1/chat/new\", {\n addresses: [address],\n message,\n tempGuid,\n subject,\n effectId,\n });\n return response.data.data?.guid;\n } catch (error) {\n throw new Error(\n `Failed to create chat with address \"${address}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { AxiosInstance } from \"axios\";\nimport { createChatWithMessage, extractAddress, isChatNotExistError } from \"../lib/auto-create-chat\";\nimport type { MessageResponse, SendMessageOptions } from \"../types\";\n\nexport class MessageModule {\n constructor(\n private readonly http: AxiosInstance,\n private readonly enqueueSend: <T>(task: () => Promise<T>) => Promise<T> = (task) => task(),\n ) {}\n\n async sendMessage(options: SendMessageOptions): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const tempGuid = options.tempGuid || randomUUID();\n const payload = { ...options, tempGuid };\n\n try {\n const response = await this.http.post(\"/api/v1/message/text\", payload);\n return response.data.data;\n } catch (error: unknown) {\n if (!isChatNotExistError(error)) throw error;\n\n const address = extractAddress(options.chatGuid);\n if (!address) throw error;\n\n await createChatWithMessage({\n http: this.http,\n address,\n message: options.message,\n tempGuid,\n subject: options.subject,\n effectId: options.effectId,\n });\n return { guid: tempGuid, text: options.message, dateCreated: Date.now() } as MessageResponse;\n }\n });\n }\n\n async getMessage(guid: string, options?: { with?: string[] }): Promise<MessageResponse> {\n const response = await this.http.get(`/api/v1/message/${guid}`, {\n params: options?.with ? { with: options.with.join(\",\") } : {},\n });\n return response.data.data;\n }\n\n async getMessages(options?: {\n chatGuid?: string;\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n with?: string[];\n }): Promise<MessageResponse[]> {\n const response = await this.http.post(\"/api/v1/message/query\", options ?? {});\n return response.data.data;\n }\n\n async getMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n if (options?.after !== undefined) params.after = options.after;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count\", { params });\n return response.data.data.total;\n }\n\n async getUpdatedMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n if (options?.after !== undefined) params.after = options.after;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count/updated\", {\n params,\n });\n return response.data.data.total;\n }\n\n async getSentMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n if (options?.after !== undefined) params.after = options.after;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count/me\", {\n params,\n });\n return response.data.data.total;\n }\n\n async editMessage(options: {\n messageGuid: string;\n editedMessage: string;\n backwardsCompatibilityMessage?: string;\n partIndex?: number;\n }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const response = await this.http.post(`/api/v1/message/${options.messageGuid}/edit`, {\n editedMessage: options.editedMessage,\n backwardsCompatibilityMessage: options.backwardsCompatibilityMessage || options.editedMessage,\n partIndex: options.partIndex ?? 0,\n });\n return response.data.data;\n });\n }\n\n async sendReaction(options: {\n chatGuid: string;\n messageGuid: string;\n reaction: string;\n partIndex?: number;\n }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const response = await this.http.post(\"/api/v1/message/react\", {\n chatGuid: options.chatGuid,\n selectedMessageGuid: options.messageGuid,\n reaction: options.reaction,\n partIndex: options.partIndex ?? 0,\n });\n return response.data.data;\n });\n }\n\n async unsendMessage(options: { messageGuid: string; partIndex?: number }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const response = await this.http.post(`/api/v1/message/${options.messageGuid}/unsend`, {\n partIndex: options.partIndex ?? 0,\n });\n return response.data.data;\n });\n }\n\n async notifyMessage(guid: string): Promise<void> {\n await this.http.post(`/api/v1/message/${guid}/notify`);\n }\n\n async getEmbeddedMedia(guid: string): Promise<{\n path?: string;\n data?: string;\n }> {\n const response = await this.http.get(`/api/v1/message/${guid}/embedded-media`);\n return response.data.data;\n }\n\n async searchMessages(options: {\n query: string;\n chatGuid?: string;\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n matchType?: \"contains\" | \"exact\";\n }): Promise<MessageResponse[]> {\n const response = await this.http.post(\"/api/v1/message/search\", options);\n return response.data.data;\n }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { AddPollOptionOptions, CreatePollOptions, PollMessageResponse, VotePollOptions } from \"../types/poll\";\n\nexport class PollModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async create(options: CreatePollOptions): Promise<PollMessageResponse> {\n if (options.options.length < 2) {\n throw new Error(\"Poll must have at least 2 options\");\n }\n\n const { data } = await this.http.post(\"/api/v1/poll/create\", {\n chatGuid: options.chatGuid,\n title: options.title ?? \"\",\n options: options.options,\n });\n\n return data.data;\n }\n\n async vote(options: VotePollOptions): Promise<PollMessageResponse> {\n const { data } = await this.http.post(\"/api/v1/poll/vote\", {\n chatGuid: options.chatGuid,\n pollMessageGuid: options.pollMessageGuid,\n optionIdentifier: options.optionIdentifier,\n });\n\n return data.data;\n }\n\n async unvote(options: VotePollOptions): Promise<PollMessageResponse> {\n const { data } = await this.http.post(\"/api/v1/poll/unvote\", {\n chatGuid: options.chatGuid,\n pollMessageGuid: options.pollMessageGuid,\n optionIdentifier: options.optionIdentifier,\n });\n\n return data.data;\n }\n\n async addOption(options: AddPollOptionOptions): Promise<PollMessageResponse> {\n if (!options.optionText || options.optionText.trim().length === 0) {\n throw new Error(\"Option text cannot be empty\");\n }\n\n const { data } = await this.http.post(\"/api/v1/poll/option\", {\n chatGuid: options.chatGuid,\n pollMessageGuid: options.pollMessageGuid,\n optionText: options.optionText,\n });\n\n return data.data;\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ScheduledMessageModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async createScheduledMessage(options: any): Promise<any> {\n const response = await this.http.post(\"/api/v1/message/schedule\", options);\n return response.data.data;\n }\n\n async getScheduledMessages(): Promise<any[]> {\n const response = await this.http.get(\"/api/v1/message/schedule\");\n return response.data.data;\n }\n\n async updateScheduledMessage(id: string, options: any): Promise<any> {\n const response = await this.http.put(`/api/v1/message/schedule/${id}`, options);\n return response.data.data;\n }\n\n async deleteScheduledMessage(id: string): Promise<void> {\n await this.http.delete(`/api/v1/message/schedule/${id}`);\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ServerModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getServerInfo(): Promise<any> {\n const response = await this.http.get(\"/api/v1/server/info\");\n return response.data.data;\n }\n\n async getMessageStats(): Promise<any> {\n const response = await this.http.get(\"/api/v1/server/statistics/totals\");\n return response.data.data;\n }\n\n async getServerLogs(count?: number): Promise<string[]> {\n const response = await this.http.get(\"/api/v1/server/logs\", {\n params: count !== undefined ? { count } : {},\n });\n return response.data.data;\n }\n\n async getMediaStatistics(options?: { only?: string[] }): Promise<any> {\n const params: Record<string, any> = {};\n if (options?.only) params.only = options.only.join(\",\");\n\n const response = await this.http.get(\"/api/v1/server/statistics/media\", {\n params,\n });\n return response.data.data;\n }\n\n async getMediaStatisticsByChat(options?: { only?: string[] }): Promise<any> {\n const params: Record<string, any> = {};\n if (options?.only) params.only = options.only.join(\",\");\n\n const response = await this.http.get(\"/api/v1/server/statistics/media/chat\", {\n params,\n });\n return response.data.data;\n }\n}\n","import { EventEmitter } from \"node:events\";\nimport axios, { type AxiosInstance } from \"axios\";\nimport io from \"socket.io-client\";\nimport { getLogger, setGlobalLogLevel } from \"./lib/Loggable\";\nimport type { LogLevel } from \"./lib/Logger\";\nimport {\n AttachmentModule,\n ChatModule,\n ContactModule,\n FaceTimeModule,\n HandleModule,\n ICloudModule,\n MessageModule,\n PollModule,\n ScheduledMessageModule,\n ServerModule,\n} from \"./modules\";\nimport type { ClientConfig, PhotonEventMap, TypedEventEmitter } from \"./types\";\n\nexport class AdvancedIMessageKit extends EventEmitter implements TypedEventEmitter {\n private static getGlobalSdk = (): AdvancedIMessageKit | null => (globalThis as any).__AdvancedIMessageKit__ ?? null;\n private static setGlobalSdk = (sdk: AdvancedIMessageKit) => {\n (globalThis as any).__AdvancedIMessageKit__ = sdk;\n };\n\n public static getInstance(config?: ClientConfig): AdvancedIMessageKit {\n const existing = AdvancedIMessageKit.getGlobalSdk();\n if (existing) return existing;\n\n const instance = new AdvancedIMessageKit(config);\n AdvancedIMessageKit.setGlobalSdk(instance);\n return instance;\n }\n\n // Core\n public readonly config: ClientConfig;\n public readonly logger = getLogger(\"AdvancedIMessageKit\");\n public readonly http: AxiosInstance;\n public readonly socket: ReturnType<typeof io>;\n\n public readonly attachments: AttachmentModule;\n public readonly messages: MessageModule;\n public readonly chats: ChatModule;\n\n public readonly contacts: ContactModule;\n public readonly handles: HandleModule;\n\n public readonly facetime: FaceTimeModule;\n public readonly icloud: ICloudModule;\n\n public readonly polls: PollModule;\n public readonly scheduledMessages: ScheduledMessageModule;\n public readonly server: ServerModule;\n\n // Message deduplication feature\n //\n // Purpose: Prevent message reply loops caused by server repeatedly pushing\n // the same message content with different GUIDs due to unstable Socket.IO connections.\n // This is especially problematic when the polling transport causes connection issues.\n private processedMessages = new Set<string>();\n\n // Send queue for sequential message delivery\n //\n // Purpose: Ensure all outgoing messages (text, attachments, stickers, etc.) from\n // a single user/SDK instance are sent in strict order, preventing race conditions.\n private sendQueue: Promise<unknown> = Promise.resolve();\n\n // Flag to track if 'ready' event has been emitted\n //\n // Purpose: Prevent duplicate 'ready' events when both legacy mode (no API key)\n // and auth-ok events occur, which would cause user callbacks to fire twice.\n private readyEmitted = false;\n\n private constructor(config: ClientConfig = {}) {\n super();\n\n this.config = {\n serverUrl: \"http://localhost:1234\",\n logLevel: \"info\",\n ...config,\n };\n\n if (this.config.logLevel) {\n setGlobalLogLevel(this.config.logLevel as LogLevel);\n }\n\n this.http = axios.create({\n baseURL: this.config.serverUrl,\n headers: this.config.apiKey ? { \"X-API-Key\": this.config.apiKey } : undefined,\n });\n\n this.socket = io(this.config.serverUrl, {\n auth: this.config.apiKey ? { apiKey: this.config.apiKey } : undefined,\n // 🚨 IMPORTANT: Polling transport configuration notes\n //\n // Root cause analysis:\n // 1. Socket.IO 'polling' transport can cause unstable connections in certain network environments\n // 2. When \"xhr poll error\" occurs, Socket.IO attempts to reconnect\n // 3. During reconnection, the server may repeatedly push the same message with different GUIDs\n // 4. This is not simple client-side duplicate processing, but server-side message duplication\n //\n // Solutions:\n // - Prioritize WebSocket transport, fallback to polling as backup\n // - Set reasonable timeout to avoid frequent reconnections\n // - Use forceNew to ensure fresh connections and avoid state pollution\n // - Implement client-side message deduplication as the last line of defense\n transports: [\"websocket\"], // Only WebSocket - polling disabled to prevent message duplication\n timeout: 10000, // 10 second timeout to avoid overly frequent reconnections\n forceNew: true, // Force new connection to avoid connection state pollution\n });\n\n // Bind enqueueSend to this instance for use in modules\n const enqueueSend = this.enqueueSend.bind(this);\n\n this.attachments = new AttachmentModule(this.http, enqueueSend);\n this.messages = new MessageModule(this.http, enqueueSend);\n this.chats = new ChatModule(this.http);\n\n this.contacts = new ContactModule(this.http);\n this.handles = new HandleModule(this.http);\n\n this.facetime = new FaceTimeModule(this.http);\n this.icloud = new ICloudModule(this.http);\n\n this.polls = new PollModule(this.http);\n this.scheduledMessages = new ScheduledMessageModule(this.http);\n this.server = new ServerModule(this.http);\n }\n\n override emit<K extends keyof PhotonEventMap>(\n event: K,\n ...args: PhotonEventMap[K] extends undefined ? [] : [PhotonEventMap[K]]\n ): boolean;\n override emit(event: string | symbol, ...args: unknown[]): boolean {\n return super.emit(event, ...(args as [unknown, ...unknown[]]));\n }\n\n override on<K extends keyof PhotonEventMap>(\n event: K,\n listener: PhotonEventMap[K] extends undefined ? () => void : (data: PhotonEventMap[K]) => void,\n ): this;\n override on(event: string | symbol, listener: (...args: unknown[]) => void): this {\n return super.on(event, listener as (...args: unknown[]) => void);\n }\n\n override once<K extends keyof PhotonEventMap>(\n event: K,\n listener: PhotonEventMap[K] extends undefined ? () => void : (data: PhotonEventMap[K]) => void,\n ): this;\n override once(event: string | symbol, listener: (...args: unknown[]) => void): this {\n return super.once(event, listener as (...args: unknown[]) => void);\n }\n\n override off<K extends keyof PhotonEventMap>(\n event: K,\n listener: PhotonEventMap[K] extends undefined ? () => void : (data: PhotonEventMap[K]) => void,\n ): this;\n override off(event: string | symbol, listener: (...args: unknown[]) => void): this {\n return super.off(event, listener as (...args: unknown[]) => void);\n }\n\n override addListener<K extends keyof PhotonEventMap>(\n event: K,\n listener: PhotonEventMap[K] extends undefined ? () => void : (data: PhotonEventMap[K]) => void,\n ): this;\n override addListener(event: string | symbol, listener: (...args: unknown[]) => void): this {\n return super.addListener(event, listener as (...args: unknown[]) => void);\n }\n\n override removeListener<K extends keyof PhotonEventMap>(\n event: K,\n listener: PhotonEventMap[K] extends undefined ? () => void : (data: PhotonEventMap[K]) => void,\n ): this;\n override removeListener(event: string | symbol, listener: (...args: unknown[]) => void): this {\n return super.removeListener(event, listener as (...args: unknown[]) => void);\n }\n\n async connect() {\n const serverEvents: (keyof PhotonEventMap)[] = [\n \"new-message\",\n \"message-updated\",\n \"updated-message\",\n \"chat-read-status-changed\",\n \"group-name-change\",\n \"participant-added\",\n \"participant-removed\",\n \"participant-left\",\n \"group-icon-changed\",\n \"group-icon-removed\",\n \"message-send-error\",\n \"typing-indicator\",\n \"new-server\",\n \"incoming-facetime\",\n \"ft-call-status-changed\",\n \"hello-world\",\n ];\n\n for (const eventName of serverEvents) {\n this.socket.on(eventName, (...args: unknown[]) => {\n // Message deduplication logic\n //\n // Problem: When Socket.IO connection is unstable (especially with polling transport),\n // the server may repeatedly push the same message content with different GUIDs.\n // This bypasses traditional GUID-based deduplication and causes message reply loops.\n //\n // Solution: Use GUID as unique identifier for deduplication\n if (eventName === \"new-message\" && args.length > 0) {\n const message = args[0] as { guid?: string };\n if (message?.guid) {\n // Check if this message has already been processed\n if (this.processedMessages.has(message.guid)) {\n this.logger.debug(`Message already processed, skipping duplicate: ${message.guid}`);\n return;\n }\n // Mark message as processed\n this.processedMessages.add(message.guid);\n }\n }\n\n if (args.length > 0) {\n super.emit(eventName, args[0]);\n } else {\n super.emit(eventName);\n }\n });\n }\n\n this.socket.on(\"disconnect\", () => {\n this.logger.info(\"Disconnected from iMessage server\");\n this.readyEmitted = false;\n this.emit(\"disconnect\");\n });\n\n // Listen for authentication success\n this.socket.on(\"auth-ok\", () => {\n this.logger.info(\"Authentication successful\");\n if (!this.readyEmitted) {\n this.readyEmitted = true;\n this.emit(\"ready\");\n }\n });\n\n // Listen for authentication errors\n this.socket.on(\"auth-error\", (error: { message: string; reason?: string }) => {\n this.logger.error(`Authentication failed: ${error.message} ${error.reason ? `(${error.reason})` : \"\"}`);\n this.emit(\"error\", new Error(`Authentication failed: ${error.message}`));\n });\n\n if (this.socket.connected) {\n this.logger.info(\"Already connected to iMessage server\");\n return;\n }\n\n this.socket.once(\"connect\", () => {\n this.logger.info(\"Connected to iMessage server, waiting for authentication...\");\n // If no apiKey, assume legacy server that doesn't require auth - emit ready immediately\n if (!this.config.apiKey) {\n this.logger.info(\"No API key provided, skipping authentication (legacy server mode)\");\n if (!this.readyEmitted) {\n this.readyEmitted = true;\n this.emit(\"ready\");\n }\n }\n });\n\n if (!this.socket.connected) {\n this.socket.connect();\n }\n }\n\n async close() {\n this.socket.disconnect();\n }\n\n /**\n * Clear processed message records (prevent memory leaks)\n * @param maxSize Maximum number of messages to retain, default 1000\n */\n public clearProcessedMessages(maxSize: number = 1000) {\n if (this.processedMessages.size > maxSize) {\n const messages = Array.from(this.processedMessages);\n this.processedMessages.clear();\n // Keep the most recent portion of messages\n messages.slice(-Math.floor(maxSize / 2)).forEach((guid) => {\n this.processedMessages.add(guid);\n });\n this.logger.debug(`Cleared processed message records, retained ${this.processedMessages.size} messages`);\n }\n }\n\n /**\n * Get the count of processed messages\n */\n public getProcessedMessageCount(): number {\n return this.processedMessages.size;\n }\n\n /**\n * Enqueue a send operation to ensure sequential delivery.\n * All send operations (messages, attachments, stickers) should use this method\n * to guarantee order for a single user.\n * @param task The async send operation to enqueue\n * @returns Promise that resolves with the task result\n */\n public enqueueSend<T>(task: () => Promise<T>): Promise<T> {\n const result = this.sendQueue.then(() => task());\n // Update queue, swallow errors to not block subsequent sends\n this.sendQueue = result.catch(() => {});\n return result;\n }\n}\n\nexport const SDK = AdvancedIMessageKit.getInstance;\n","export const SCHEDULED_MESSAGE_ERROR = \"scheduled-message-error\";\nexport const SCHEDULED_MESSAGE_SENT = \"scheduled-message-sent\";\nexport const SCHEDULED_MESSAGE_DELETED = \"scheduled-message-deleted\";\nexport const SCHEDULED_MESSAGE_UPDATED = \"scheduled-message-updated\";\nexport const SCHEDULED_MESSAGE_CREATED = \"scheduled-message-created\";\nexport const NEW_MESSAGE = \"new-message\";\nexport const MESSAGE_SEND_ERROR = \"message-send-error\";\nexport const MESSAGE_UPDATED = \"updated-message\";\nexport const NEW_SERVER = \"new-server\";\nexport const PARTICIPANT_REMOVED = \"participant-removed\";\nexport const PARTICIPANT_ADDED = \"participant-added\";\nexport const PARTICIPANT_LEFT = \"participant-left\";\nexport const GROUP_ICON_CHANGED = \"group-icon-changed\";\nexport const GROUP_ICON_REMOVED = \"group-icon-removed\";\nexport const CHAT_READ_STATUS_CHANGED = \"chat-read-status-changed\";\nexport const HELLO_WORLD = \"hello-world\";\nexport const TYPING_INDICATOR = \"typing-indicator\";\nexport const SERVER_UPDATE = \"server-update\";\nexport const SERVER_UPDATE_DOWNLOADING = \"server-update-downloading\";\nexport const SERVER_UPDATE_INSTALLING = \"server-update-installing\";\nexport const GROUP_NAME_CHANGE = \"group-name-change\";\nexport const INCOMING_FACETIME = \"incoming-facetime\";\nexport const SETTINGS_BACKUP_CREATED = \"settings-backup-created\";\nexport const SETTINGS_BACKUP_DELETED = \"settings-backup-deleted\";\nexport const SETTINGS_BACKUP_UPDATED = \"settings-backup-updated\";\nexport const THEME_BACKUP_CREATED = \"theme-backup-created\";\nexport const THEME_BACKUP_DELETED = \"theme-backup-deleted\";\nexport const THEME_BACKUP_UPDATED = \"theme-backup-updated\";\nexport const IMESSAGE_ALIASES_REMOVED = \"imessage-aliases-removed\";\nexport const FT_CALL_STATUS_CHANGED = \"ft-call-status-changed\";\nexport const NEW_FINDMY_LOCATION = \"new-findmy-location\";\n","import type { MessageResponse } from \"../types/message\";\nimport type { PollDefinition, PollOption, PollVote, PollVoteResponse } from \"../types/poll\";\n\nexport const POLL_BALLOON_BUNDLE_ID =\n \"com.apple.messages.MSMessageExtensionBalloonPlugin:0000000000:com.apple.messages.Polls\";\n\nconst pollCache = new Map<string, ParsedPoll>();\n\nexport function cachePoll(messageGuid: string, poll: ParsedPoll): void {\n pollCache.set(messageGuid, poll);\n}\n\nexport function getCachedPoll(messageGuid: string): ParsedPoll | null {\n return pollCache.get(messageGuid) ?? null;\n}\n\nexport function getOptionTextById(optionId: string): string | null {\n for (const poll of pollCache.values()) {\n const option = poll.options.find((o) => o.optionIdentifier === optionId);\n if (option) return option.text;\n }\n return null;\n}\n\nexport function isPollMessage(message: MessageResponse): boolean {\n return message.balloonBundleId === POLL_BALLOON_BUNDLE_ID;\n}\n\nexport function isPollVote(message: MessageResponse): boolean {\n return isPollMessage(message) && message.associatedMessageType === \"4000\";\n}\n\nexport interface ParsedPoll {\n title: string;\n creatorHandle: string;\n options: PollOption[];\n}\n\nexport interface ParsedPollVote {\n votes: PollVote[];\n}\n\nfunction extractDataUrl(payloadData: NodeJS.Dict<any>[] | null | undefined): string | null {\n if (!payloadData || payloadData.length === 0) return null;\n\n const payload = payloadData[0];\n if (!payload) return null;\n\n if (payload.URL && typeof payload.URL === \"string\") {\n return payload.URL;\n }\n\n const objects = payload.$objects;\n if (Array.isArray(objects)) {\n for (const obj of objects) {\n if (typeof obj === \"object\" && obj !== null) {\n if (obj[\"NS.relative\"] && typeof obj[\"NS.relative\"] === \"object\") {\n const relativeObj = objects[obj[\"NS.relative\"].UID];\n if (typeof relativeObj === \"string\" && relativeObj.startsWith(\"data:,\")) {\n return relativeObj;\n }\n }\n if (typeof obj === \"string\" && obj.startsWith(\"data:,\")) {\n return obj;\n }\n }\n }\n }\n\n return null;\n}\n\nfunction parseDataUrl(dataUrl: string): unknown | null {\n try {\n const prefix = \"data:,\";\n if (!dataUrl.startsWith(prefix)) return null;\n\n let data = dataUrl.slice(prefix.length);\n const queryIndex = data.indexOf(\"?\");\n if (queryIndex !== -1) {\n data = data.slice(0, queryIndex);\n }\n\n data = decodeURIComponent(data);\n\n try {\n return JSON.parse(data);\n } catch {\n const decoded = Buffer.from(data, \"base64\").toString(\"utf-8\");\n return JSON.parse(decoded);\n }\n } catch {\n return null;\n }\n}\n\nexport function parsePollDefinition(message: MessageResponse): ParsedPoll | null {\n if (!isPollMessage(message)) return null;\n if (isPollVote(message)) return null; // Vote messages don't contain the poll definition\n\n const dataUrl = extractDataUrl(message.payloadData);\n if (!dataUrl) return null;\n\n const data = parseDataUrl(dataUrl) as PollDefinition | null;\n if (!data || !data.item) return null;\n\n const parsed: ParsedPoll = {\n title: data.item.title || \"\",\n creatorHandle: data.item.creatorHandle || \"\",\n options: data.item.orderedPollOptions || [],\n };\n\n if (message.guid) {\n cachePoll(message.guid, parsed);\n }\n\n return parsed;\n}\n\nexport function parsePollVotes(message: MessageResponse): ParsedPollVote | null {\n if (!isPollMessage(message)) return null;\n if (!isPollVote(message)) return null;\n\n const dataUrl = extractDataUrl(message.payloadData);\n if (!dataUrl) return null;\n\n const data = parseDataUrl(dataUrl) as PollVoteResponse | null;\n if (!data || !data.item) return null;\n\n return {\n votes: data.item.votes || [],\n };\n}\n\nexport function getPollSummary(message: MessageResponse): string {\n if (!isPollMessage(message)) {\n return message.text || \"(no text)\";\n }\n\n if (isPollVote(message)) {\n const voteData = parsePollVotes(message);\n if (voteData && voteData.votes.length > 0) {\n const votes = voteData.votes\n .map((v) => {\n const optionText = getOptionTextById(v.voteOptionIdentifier);\n const optionDisplay = optionText ? `\"${optionText}\"` : `option ${v.voteOptionIdentifier}`;\n return `${v.participantHandle || \"Someone\"} voted ${optionDisplay}`;\n })\n .join(\", \");\n return `[Poll Vote] ${votes}`;\n }\n return \"[Poll Vote]\";\n }\n\n const pollData = parsePollDefinition(message);\n if (pollData) {\n const title = pollData.title ? `\"${pollData.title}\"` : \"(untitled poll)\";\n const optionsList = pollData.options.map((opt, i) => ` ${i + 1}. ${opt.text}`).join(\"\\n\");\n return `[Poll] ${title}\\n${optionsList}`;\n }\n\n return \"[Poll] (unable to parse)\";\n}\n\nexport function getPollOneLiner(message: MessageResponse): string {\n if (!isPollMessage(message)) {\n return message.text || \"(no text)\";\n }\n\n if (isPollVote(message)) {\n const voteData = parsePollVotes(message);\n if (voteData && voteData.votes.length > 0) {\n return `[Poll Vote] ${voteData.votes.length} vote(s)`;\n }\n return \"[Poll Vote]\";\n }\n\n const pollData = parsePollDefinition(message);\n if (pollData) {\n const title = pollData.title || \"Poll\";\n const optionsPreview = pollData.options\n .slice(0, 2)\n .map((o) => o.text)\n .join(\", \");\n const moreOptions = pollData.options.length > 2 ? `, +${pollData.options.length - 2} more` : \"\";\n return `[${title}] ${optionsPreview}${moreOptions}`;\n }\n\n return \"[Poll]\";\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../lib/Logger.ts","../lib/Loggable.ts","../modules/attachment.ts","../modules/chat.ts","../modules/contact.ts","../modules/facetime.ts","../modules/handle.ts","../modules/icloud.ts","../lib/auto-create-chat.ts","../modules/message.ts","../modules/poll.ts","../modules/scheduled.ts","../modules/server.ts","../client.ts","../events.ts","../lib/poll-utils.ts"],"names":["EventEmitter","path","readFile","FormData","randomUUID"],"mappings":"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","file":"index.js","sourcesContent":["import EventEmitter from \"node:events\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport class Logger extends EventEmitter {\n tag: string;\n private logLevel: LogLevel = \"info\";\n private logFile?: string;\n\n constructor(tag: string, level: LogLevel = \"info\", logToFile = true) {\n super();\n this.tag = tag;\n this.logLevel = level;\n\n if (logToFile) {\n const logDir = path.join(os.homedir(), \"Library\", \"Logs\", \"AdvancedIMessageKit\");\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true });\n }\n this.logFile = path.join(logDir, \"sdk.log\");\n }\n }\n\n setLogLevel(level: LogLevel) {\n this.logLevel = level;\n }\n\n private shouldLog(level: LogLevel): boolean {\n const levels: LogLevel[] = [\"debug\", \"info\", \"warn\", \"error\"];\n const currentIndex = levels.indexOf(this.logLevel);\n const messageIndex = levels.indexOf(level);\n return messageIndex >= currentIndex;\n }\n\n private formatMessage(level: string, message: string): string {\n const timestamp = new Date().toISOString();\n return `[${timestamp}][${level.toUpperCase()}][${this.tag}] ${message}`;\n }\n\n private writeLog(level: LogLevel, message: string) {\n if (!this.shouldLog(level)) return;\n\n const formatted = this.formatMessage(level, message);\n\n switch (level) {\n case \"error\":\n console.error(formatted);\n break;\n case \"warn\":\n console.warn(formatted);\n break;\n case \"debug\":\n console.debug(formatted);\n break;\n default:\n console.log(formatted);\n }\n\n if (this.logFile) {\n try {\n fs.appendFileSync(this.logFile, `${formatted}\\n`);\n } catch {}\n }\n\n this.emit(\"log\", { level, message, tag: this.tag });\n }\n\n info(message: string) {\n this.writeLog(\"info\", message);\n }\n\n debug(message: string) {\n this.writeLog(\"debug\", message);\n }\n\n error(message: string | Error) {\n const msg = message instanceof Error ? message.message : message;\n this.writeLog(\"error\", msg);\n if (message instanceof Error && message.stack) {\n this.writeLog(\"error\", message.stack);\n }\n }\n\n warn(message: string) {\n this.writeLog(\"warn\", message);\n }\n\n log(message: string, level: LogLevel = \"info\") {\n this.writeLog(level, message);\n }\n}\n","import { EventEmitter as EventEmitterClass } from \"node:events\";\nimport type { LogLevel } from \"./Logger\";\nimport { Logger } from \"./Logger\";\n\nconst loggers: Record<string, Logger> = {};\nlet globalLogLevel: LogLevel = \"info\";\n\nexport const setGlobalLogLevel = (level: LogLevel) => {\n globalLogLevel = level;\n Object.values(loggers).forEach((logger) => {\n logger.setLogLevel(level);\n });\n};\n\nexport const getLogger = (tag: string) => {\n let logger = loggers[tag];\n if (!logger) {\n logger = new Logger(tag, globalLogLevel);\n loggers[tag] = logger;\n }\n\n return logger;\n};\n\nexport class Loggable extends EventEmitterClass {\n tag?: string;\n\n get log() {\n const name = this.tag ?? this.constructor.name;\n return getLogger(name);\n }\n\n constructor(tag?: string) {\n super();\n\n if (tag) {\n this.tag = tag;\n }\n }\n\n onLog(listener: (data: { level: string; message: string; tag: string }) => void) {\n this.log.on(\"log\", listener);\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AxiosInstance } from \"axios\";\nimport FormData from \"form-data\";\nimport type { AttachmentResponse, MessageResponse, SendAttachmentOptions, SendStickerOptions } from \"../types\";\n\nexport class AttachmentModule {\n constructor(\n private readonly http: AxiosInstance,\n private readonly enqueueSend: <T>(task: () => Promise<T>) => Promise<T> = (task) => task(),\n ) {}\n\n async getAttachmentCount(): Promise<number> {\n const response = await this.http.get(\"/api/v1/attachment/count\");\n return response.data.data.total;\n }\n\n async getAttachment(guid: string): Promise<AttachmentResponse> {\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}`);\n return response.data.data;\n }\n\n async downloadAttachment(\n guid: string,\n options?: {\n original?: boolean;\n force?: boolean;\n height?: number;\n width?: number;\n quality?: number;\n },\n ): Promise<Buffer> {\n const params: Record<string, unknown> = {};\n if (options?.original !== undefined) params.original = options.original;\n if (options?.force !== undefined) params.force = options.force;\n if (options?.height !== undefined) params.height = options.height;\n if (options?.width !== undefined) params.width = options.width;\n if (options?.quality !== undefined) params.quality = options.quality;\n\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/download`, {\n params,\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async downloadAttachmentLive(guid: string): Promise<Buffer> {\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/live`, {\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async getAttachmentBlurhash(\n guid: string,\n options?: { height?: number; width?: number; quality?: number },\n ): Promise<string> {\n const params: Record<string, unknown> = {};\n if (options?.height !== undefined) params.height = options.height;\n if (options?.width !== undefined) params.width = options.width;\n if (options?.quality !== undefined) params.quality = options.quality;\n\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/blurhash`, {\n params,\n });\n return response.data.data.blurhash;\n }\n\n async sendAttachment(options: SendAttachmentOptions): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const fileBuffer = await readFile(options.filePath);\n const fileName = options.fileName || path.basename(options.filePath);\n\n const form = new FormData();\n form.append(\"chatGuid\", options.chatGuid);\n form.append(\"attachment\", fileBuffer, fileName);\n form.append(\"name\", fileName);\n form.append(\"tempGuid\", randomUUID());\n if (options.isAudioMessage !== undefined) {\n form.append(\"isAudioMessage\", options.isAudioMessage.toString());\n if (options.isAudioMessage) {\n form.append(\"method\", \"private-api\");\n }\n }\n if (options.selectedMessageGuid) {\n form.append(\"selectedMessageGuid\", options.selectedMessageGuid);\n }\n\n const response = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n\n return response.data.data;\n });\n }\n\n async sendSticker(options: SendStickerOptions): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const fileName = options.fileName || path.basename(options.filePath);\n const form = new FormData();\n\n form.append(\"attachment\", await readFile(options.filePath), fileName);\n form.append(\"name\", fileName);\n form.append(\"chatGuid\", options.chatGuid);\n form.append(\"isSticker\", \"true\");\n form.append(\"method\", \"private-api\"); // Sticker requires Private API\n if (options.selectedMessageGuid) {\n form.append(\"selectedMessageGuid\", options.selectedMessageGuid);\n form.append(\"partIndex\", \"0\");\n form.append(\"stickerX\", String(options.stickerX ?? 0.5));\n form.append(\"stickerY\", String(options.stickerY ?? 0.5));\n form.append(\"stickerScale\", String(options.stickerScale ?? 0.75));\n form.append(\"stickerRotation\", String(options.stickerRotation ?? 0));\n form.append(\"stickerWidth\", String(options.stickerWidth ?? 300));\n }\n\n const { data } = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n\n return data.data;\n });\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AxiosInstance } from \"axios\";\nimport FormData from \"form-data\";\nimport type { ChatResponse, MessageResponse } from \"../types\";\n\nexport class ChatModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getChats(options?: {\n withLastMessage?: boolean;\n withArchived?: boolean;\n offset?: number;\n limit?: number;\n sort?: string;\n }): Promise<ChatResponse[]> {\n const response = await this.http.post(\"/api/v1/chat/query\", options ?? {});\n return response.data.data;\n }\n\n async createChat(options: {\n addresses: string[];\n message?: string;\n method?: \"apple-script\" | \"private-api\";\n service?: \"iMessage\" | \"SMS\";\n tempGuid?: string;\n subject?: string;\n effectId?: string;\n attributedBody?: Record<string, unknown>;\n }): Promise<ChatResponse> {\n const response = await this.http.post(\"/api/v1/chat/new\", options);\n return response.data.data;\n }\n\n async getChat(guid: string, options?: { with?: string[] }): Promise<ChatResponse> {\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(guid)}`, {\n params: options?.with ? { with: options.with.join(\",\") } : {},\n });\n return response.data.data;\n }\n\n async updateChat(guid: string, options: { displayName?: string }): Promise<ChatResponse> {\n const response = await this.http.put(`/api/v1/chat/${encodeURIComponent(guid)}`, options);\n return response.data.data;\n }\n\n async deleteChat(guid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${encodeURIComponent(guid)}`);\n }\n\n async markChatRead(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/read`);\n }\n\n async markChatUnread(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/unread`);\n }\n\n async leaveChat(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/leave`);\n }\n\n async addParticipant(chatGuid: string, address: string): Promise<ChatResponse> {\n const response = await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/participant`, {\n address,\n });\n return response.data.data;\n }\n\n async removeParticipant(chatGuid: string, address: string): Promise<ChatResponse> {\n const response = await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/participant`, {\n data: { address },\n });\n return response.data.data;\n }\n\n async getChatMessages(\n chatGuid: string,\n options?: {\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n with?: string[];\n },\n ): Promise<MessageResponse[]> {\n const params: Record<string, unknown> = {};\n if (options?.offset !== undefined) params.offset = options.offset;\n if (options?.limit !== undefined) params.limit = options.limit;\n if (options?.sort) params.sort = options.sort;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.after !== undefined) params.after = options.after;\n if (options?.with) params.with = options.with.join(\",\");\n\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/message`, {\n params,\n });\n return response.data.data;\n }\n\n async setGroupIcon(chatGuid: string, filePath: string): Promise<void> {\n const fileBuffer = await readFile(filePath);\n const fileName = path.basename(filePath);\n const form = new FormData();\n form.append(\"icon\", fileBuffer, fileName);\n\n await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`, form, {\n headers: form.getHeaders(),\n });\n }\n\n async removeGroupIcon(chatGuid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`);\n }\n\n async getGroupIcon(chatGuid: string): Promise<Buffer> {\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`, {\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async getChatCount(options?: { includeArchived?: boolean }): Promise<{\n total: number;\n breakdown: Record<string, number>;\n }> {\n const response = await this.http.get(\"/api/v1/chat/count\", {\n params: options?.includeArchived !== undefined ? { includeArchived: options.includeArchived } : {},\n });\n return response.data.data;\n }\n\n async startTyping(chatGuid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/typing`);\n }\n\n async stopTyping(chatGuid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/typing`);\n }\n\n async getBackground(chatGuid: string): Promise<{\n hasBackground: boolean;\n backgroundChannelGUID?: string | null;\n imageUrl?: string | null;\n backgroundId?: string | null;\n }> {\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/background`);\n return response.data.data;\n }\n\n async setBackground(\n chatGuid: string,\n options: string | { imageUrl?: string; filePath?: string; fileData?: string },\n ): Promise<void> {\n const body = typeof options === \"string\" ? { imageUrl: options } : options;\n await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/background`, body);\n }\n\n async removeBackground(chatGuid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/background`);\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ContactModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getContacts(): Promise<any[]> {\n const response = await this.http.get(\"/api/v1/contact\");\n return response.data.data;\n }\n\n async getContactCard(address: string): Promise<any> {\n const response = await this.http.get(\"/api/v1/icloud/contact\", {\n params: { address },\n });\n return response.data.data;\n }\n\n async shareContactCard(chatGuid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/share/contact`);\n }\n\n async shouldShareContact(chatGuid: string): Promise<boolean> {\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/share/contact/status`);\n return response.data.data;\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class FaceTimeModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async createFaceTimeLink(): Promise<string> {\n const response = await this.http.post(\"/api/v1/facetime/session\");\n return response.data.data;\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class HandleModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getHandleCount(): Promise<number> {\n const response = await this.http.get(\"/api/v1/handle/count\");\n return response.data.data.total;\n }\n\n async queryHandles(options?: { address?: string; with?: string[]; offset?: number; limit?: number }): Promise<{\n data: any[];\n metadata: { total: number; offset: number; limit: number; count: number };\n }> {\n const body: Record<string, any> = {};\n if (options?.address) body.address = options.address;\n if (options?.with) body.with = options.with.join(\",\");\n if (options?.offset !== undefined) body.offset = options.offset;\n if (options?.limit !== undefined) body.limit = options.limit;\n\n const response = await this.http.post(\"/api/v1/handle/query\", body);\n return {\n data: response.data.data,\n metadata: response.data.metadata,\n };\n }\n\n async getHandle(guid: string): Promise<any> {\n const response = await this.http.get(`/api/v1/handle/${encodeURIComponent(guid)}`);\n return response.data.data;\n }\n\n async getHandleAvailability(address: string, type: \"imessage\" | \"facetime\"): Promise<boolean> {\n const response = await this.http.get(`/api/v1/handle/availability/${type}`, {\n params: { address },\n });\n return response.data.data.available;\n }\n\n async getHandleFocusStatus(guid: string): Promise<string> {\n const response = await this.http.get(`/api/v1/handle/${encodeURIComponent(guid)}/focus`);\n return response.data.data.status;\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ICloudModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getFindMyFriends(): Promise<any[]> {\n const response = await this.http.get(\"/api/v1/icloud/findmy/friends\");\n return response.data.data;\n }\n\n async refreshFindMyFriends(): Promise<void> {\n await this.http.post(\"/api/v1/icloud/findmy/friends/refresh\");\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\n/**\n * Checks if an error indicates that a chat does not exist.\n */\nexport function isChatNotExistError(error: unknown): boolean {\n const axiosError = error as { response?: { data?: { error?: { message?: string }; message?: string } } };\n const errorMsg = axiosError?.response?.data?.error?.message || axiosError?.response?.data?.message || \"\";\n const lowerMsg = errorMsg.toLowerCase();\n return lowerMsg.includes(\"chat does not exist\") || lowerMsg.includes(\"chat not found\");\n}\n\n/**\n * Extracts the address from a chatGuid.\n * Expected format: \"service;-;address\"\n * e.g., \"any;-;+1xxxxxxxxxx\" -> \"+1xxxxxxxxxx\"\n * Returns undefined if chatGuid is malformed.\n */\nexport function extractAddress(chatGuid: string): string | undefined {\n const parts = chatGuid.split(\";-;\");\n if (parts.length !== 2 || !parts[1]) {\n return undefined;\n }\n return parts[1];\n}\n\n/**\n * Creates a chat with an initial message.\n * Returns the created chat's GUID.\n */\nexport async function createChatWithMessage(options: {\n http: AxiosInstance;\n address: string;\n message: string;\n tempGuid?: string;\n subject?: string;\n effectId?: string;\n}): Promise<string> {\n const { http, address, message, tempGuid, subject, effectId } = options;\n try {\n const response = await http.post(\"/api/v1/chat/new\", {\n addresses: [address],\n message,\n tempGuid,\n subject,\n effectId,\n });\n return response.data.data?.guid;\n } catch (error) {\n throw new Error(\n `Failed to create chat with address \"${address}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { AxiosInstance } from \"axios\";\nimport { createChatWithMessage, extractAddress, isChatNotExistError } from \"../lib/auto-create-chat\";\nimport type { MessageResponse, SendMessageOptions } from \"../types\";\n\nexport class MessageModule {\n constructor(\n private readonly http: AxiosInstance,\n private readonly enqueueSend: <T>(task: () => Promise<T>) => Promise<T> = (task) => task(),\n ) {}\n\n async sendMessage(options: SendMessageOptions): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const tempGuid = options.tempGuid || randomUUID();\n const payload = { ...options, tempGuid };\n\n try {\n const response = await this.http.post(\"/api/v1/message/text\", payload);\n return response.data.data;\n } catch (error: unknown) {\n if (!isChatNotExistError(error)) throw error;\n\n const address = extractAddress(options.chatGuid);\n if (!address) throw error;\n\n await createChatWithMessage({\n http: this.http,\n address,\n message: options.message,\n tempGuid,\n subject: options.subject,\n effectId: options.effectId,\n });\n return { guid: tempGuid, text: options.message, dateCreated: Date.now() } as MessageResponse;\n }\n });\n }\n\n async getMessage(guid: string, options?: { with?: string[] }): Promise<MessageResponse> {\n const response = await this.http.get(`/api/v1/message/${encodeURIComponent(guid)}`, {\n params: options?.with ? { with: options.with.join(\",\") } : {},\n });\n return response.data.data;\n }\n\n async getMessages(options?: {\n chatGuid?: string;\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n with?: string[];\n }): Promise<MessageResponse[]> {\n const response = await this.http.post(\"/api/v1/message/query\", options ?? {});\n return response.data.data;\n }\n\n async getMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n if (options?.after !== undefined) params.after = options.after;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count\", { params });\n return response.data.data.total;\n }\n\n async getUpdatedMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n if (options?.after !== undefined) params.after = options.after;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count/updated\", {\n params,\n });\n return response.data.data.total;\n }\n\n async getSentMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n if (options?.after !== undefined) params.after = options.after;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count/me\", {\n params,\n });\n return response.data.data.total;\n }\n\n async editMessage(options: {\n messageGuid: string;\n editedMessage: string;\n backwardsCompatibilityMessage?: string;\n partIndex?: number;\n }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const response = await this.http.post(`/api/v1/message/${encodeURIComponent(options.messageGuid)}/edit`, {\n editedMessage: options.editedMessage,\n backwardsCompatibilityMessage: options.backwardsCompatibilityMessage || options.editedMessage,\n partIndex: options.partIndex ?? 0,\n });\n return response.data.data;\n });\n }\n\n async sendReaction(options: {\n chatGuid: string;\n messageGuid: string;\n reaction: string;\n partIndex?: number;\n }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const response = await this.http.post(\"/api/v1/message/react\", {\n chatGuid: options.chatGuid,\n selectedMessageGuid: options.messageGuid,\n reaction: options.reaction,\n partIndex: options.partIndex ?? 0,\n });\n return response.data.data;\n });\n }\n\n async unsendMessage(options: { messageGuid: string; partIndex?: number }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const response = await this.http.post(`/api/v1/message/${encodeURIComponent(options.messageGuid)}/unsend`, {\n partIndex: options.partIndex ?? 0,\n });\n return response.data.data;\n });\n }\n\n async notifyMessage(guid: string): Promise<void> {\n await this.http.post(`/api/v1/message/${encodeURIComponent(guid)}/notify`);\n }\n\n async getEmbeddedMedia(guid: string): Promise<{\n path?: string;\n data?: string;\n }> {\n const response = await this.http.get(`/api/v1/message/${encodeURIComponent(guid)}/embedded-media`);\n return response.data.data;\n }\n\n async searchMessages(options: {\n query: string;\n chatGuid?: string;\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n matchType?: \"contains\" | \"exact\";\n }): Promise<MessageResponse[]> {\n const response = await this.http.post(\"/api/v1/message/search\", options);\n return response.data.data;\n }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { AddPollOptionOptions, CreatePollOptions, PollMessageResponse, VotePollOptions } from \"../types/poll\";\n\nexport class PollModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async create(options: CreatePollOptions): Promise<PollMessageResponse> {\n if (options.options.length < 2) {\n throw new Error(\"Poll must have at least 2 options\");\n }\n\n const { data } = await this.http.post(\"/api/v1/poll/create\", {\n chatGuid: options.chatGuid,\n title: options.title ?? \"\",\n options: options.options,\n });\n\n return data.data;\n }\n\n async vote(options: VotePollOptions): Promise<PollMessageResponse> {\n const { data } = await this.http.post(\"/api/v1/poll/vote\", {\n chatGuid: options.chatGuid,\n pollMessageGuid: options.pollMessageGuid,\n optionIdentifier: options.optionIdentifier,\n });\n\n return data.data;\n }\n\n async unvote(options: VotePollOptions): Promise<PollMessageResponse> {\n const { data } = await this.http.post(\"/api/v1/poll/unvote\", {\n chatGuid: options.chatGuid,\n pollMessageGuid: options.pollMessageGuid,\n optionIdentifier: options.optionIdentifier,\n });\n\n return data.data;\n }\n\n async addOption(options: AddPollOptionOptions): Promise<PollMessageResponse> {\n if (!options.optionText || options.optionText.trim().length === 0) {\n throw new Error(\"Option text cannot be empty\");\n }\n\n const { data } = await this.http.post(\"/api/v1/poll/option\", {\n chatGuid: options.chatGuid,\n pollMessageGuid: options.pollMessageGuid,\n optionText: options.optionText,\n });\n\n return data.data;\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ScheduledMessageModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async createScheduledMessage(options: any): Promise<any> {\n const response = await this.http.post(\"/api/v1/message/schedule\", options);\n return response.data.data;\n }\n\n async getScheduledMessages(): Promise<any[]> {\n const response = await this.http.get(\"/api/v1/message/schedule\");\n return response.data.data;\n }\n\n async updateScheduledMessage(id: string, options: any): Promise<any> {\n const response = await this.http.put(`/api/v1/message/schedule/${encodeURIComponent(id)}`, options);\n return response.data.data;\n }\n\n async deleteScheduledMessage(id: string): Promise<void> {\n await this.http.delete(`/api/v1/message/schedule/${encodeURIComponent(id)}`);\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ServerModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getServerInfo(): Promise<any> {\n const response = await this.http.get(\"/api/v1/server/info\");\n return response.data.data;\n }\n\n async getMessageStats(): Promise<any> {\n const response = await this.http.get(\"/api/v1/server/statistics/totals\");\n return response.data.data;\n }\n\n async getServerLogs(count?: number): Promise<string[]> {\n const response = await this.http.get(\"/api/v1/server/logs\", {\n params: count !== undefined ? { count } : {},\n });\n return response.data.data;\n }\n\n async getMediaStatistics(options?: { only?: string[] }): Promise<any> {\n const params: Record<string, any> = {};\n if (options?.only) params.only = options.only.join(\",\");\n\n const response = await this.http.get(\"/api/v1/server/statistics/media\", {\n params,\n });\n return response.data.data;\n }\n\n async getMediaStatisticsByChat(options?: { only?: string[] }): Promise<any> {\n const params: Record<string, any> = {};\n if (options?.only) params.only = options.only.join(\",\");\n\n const response = await this.http.get(\"/api/v1/server/statistics/media/chat\", {\n params,\n });\n return response.data.data;\n }\n}\n","import { EventEmitter } from \"node:events\";\nimport axios, { type AxiosInstance } from \"axios\";\nimport io from \"socket.io-client\";\nimport { getLogger, setGlobalLogLevel } from \"./lib/Loggable\";\nimport type { LogLevel } from \"./lib/Logger\";\nimport {\n AttachmentModule,\n ChatModule,\n ContactModule,\n FaceTimeModule,\n HandleModule,\n ICloudModule,\n MessageModule,\n PollModule,\n ScheduledMessageModule,\n ServerModule,\n} from \"./modules\";\nimport type { ClientConfig, PhotonEventMap, TypedEventEmitter } from \"./types\";\n\nexport class AdvancedIMessageKit extends EventEmitter implements TypedEventEmitter {\n private static getGlobalSdk = (): AdvancedIMessageKit | null => (globalThis as any).__AdvancedIMessageKit__ ?? null;\n private static setGlobalSdk = (sdk: AdvancedIMessageKit) => {\n (globalThis as any).__AdvancedIMessageKit__ = sdk;\n };\n\n public static getInstance(config?: ClientConfig): AdvancedIMessageKit {\n const existing = AdvancedIMessageKit.getGlobalSdk();\n if (existing) return existing;\n\n const instance = new AdvancedIMessageKit(config);\n AdvancedIMessageKit.setGlobalSdk(instance);\n return instance;\n }\n\n // Core\n public readonly config: ClientConfig;\n public readonly logger = getLogger(\"AdvancedIMessageKit\");\n public readonly http: AxiosInstance;\n public readonly socket: ReturnType<typeof io>;\n\n public readonly attachments: AttachmentModule;\n public readonly messages: MessageModule;\n public readonly chats: ChatModule;\n\n public readonly contacts: ContactModule;\n public readonly handles: HandleModule;\n\n public readonly facetime: FaceTimeModule;\n public readonly icloud: ICloudModule;\n\n public readonly polls: PollModule;\n public readonly scheduledMessages: ScheduledMessageModule;\n public readonly server: ServerModule;\n\n // Message deduplication feature\n //\n // Purpose: Prevent message reply loops caused by server repeatedly pushing\n // the same message content with different GUIDs due to unstable Socket.IO connections.\n // This is especially problematic when the polling transport causes connection issues.\n private processedMessages = new Set<string>();\n\n // Send queue for sequential message delivery\n //\n // Purpose: Ensure all outgoing messages (text, attachments, stickers, etc.) from\n // a single user/SDK instance are sent in strict order, preventing race conditions.\n private sendQueue: Promise<unknown> = Promise.resolve();\n\n // Flag to track if 'ready' event has been emitted\n //\n // Purpose: Prevent duplicate 'ready' events when both legacy mode (no API key)\n // and auth-ok events occur, which would cause user callbacks to fire twice.\n private readyEmitted = false;\n\n private constructor(config: ClientConfig = {}) {\n super();\n\n this.config = {\n serverUrl: \"http://localhost:1234\",\n logLevel: \"info\",\n ...config,\n };\n\n if (this.config.logLevel) {\n setGlobalLogLevel(this.config.logLevel as LogLevel);\n }\n\n this.http = axios.create({\n baseURL: this.config.serverUrl,\n headers: this.config.apiKey ? { \"X-API-Key\": this.config.apiKey } : undefined,\n });\n\n this.socket = io(this.config.serverUrl, {\n auth: this.config.apiKey ? { apiKey: this.config.apiKey } : undefined,\n // 🚨 IMPORTANT: Polling transport configuration notes\n //\n // Root cause analysis:\n // 1. Socket.IO 'polling' transport can cause unstable connections in certain network environments\n // 2. When \"xhr poll error\" occurs, Socket.IO attempts to reconnect\n // 3. During reconnection, the server may repeatedly push the same message with different GUIDs\n // 4. This is not simple client-side duplicate processing, but server-side message duplication\n //\n // Solutions:\n // - Prioritize WebSocket transport, fallback to polling as backup\n // - Set reasonable timeout to avoid frequent reconnections\n // - Use forceNew to ensure fresh connections and avoid state pollution\n // - Implement client-side message deduplication as the last line of defense\n transports: [\"websocket\"], // Only WebSocket - polling disabled to prevent message duplication\n timeout: 10000, // 10 second timeout to avoid overly frequent reconnections\n forceNew: true, // Force new connection to avoid connection state pollution\n });\n\n // Bind enqueueSend to this instance for use in modules\n const enqueueSend = this.enqueueSend.bind(this);\n\n this.attachments = new AttachmentModule(this.http, enqueueSend);\n this.messages = new MessageModule(this.http, enqueueSend);\n this.chats = new ChatModule(this.http);\n\n this.contacts = new ContactModule(this.http);\n this.handles = new HandleModule(this.http);\n\n this.facetime = new FaceTimeModule(this.http);\n this.icloud = new ICloudModule(this.http);\n\n this.polls = new PollModule(this.http);\n this.scheduledMessages = new ScheduledMessageModule(this.http);\n this.server = new ServerModule(this.http);\n }\n\n override emit<K extends keyof PhotonEventMap>(\n event: K,\n ...args: PhotonEventMap[K] extends undefined ? [] : [PhotonEventMap[K]]\n ): boolean;\n override emit(event: string | symbol, ...args: unknown[]): boolean {\n return super.emit(event, ...(args as [unknown, ...unknown[]]));\n }\n\n override on<K extends keyof PhotonEventMap>(\n event: K,\n listener: PhotonEventMap[K] extends undefined ? () => void : (data: PhotonEventMap[K]) => void,\n ): this;\n override on(event: string | symbol, listener: (...args: unknown[]) => void): this {\n return super.on(event, listener as (...args: unknown[]) => void);\n }\n\n override once<K extends keyof PhotonEventMap>(\n event: K,\n listener: PhotonEventMap[K] extends undefined ? () => void : (data: PhotonEventMap[K]) => void,\n ): this;\n override once(event: string | symbol, listener: (...args: unknown[]) => void): this {\n return super.once(event, listener as (...args: unknown[]) => void);\n }\n\n override off<K extends keyof PhotonEventMap>(\n event: K,\n listener: PhotonEventMap[K] extends undefined ? () => void : (data: PhotonEventMap[K]) => void,\n ): this;\n override off(event: string | symbol, listener: (...args: unknown[]) => void): this {\n return super.off(event, listener as (...args: unknown[]) => void);\n }\n\n override addListener<K extends keyof PhotonEventMap>(\n event: K,\n listener: PhotonEventMap[K] extends undefined ? () => void : (data: PhotonEventMap[K]) => void,\n ): this;\n override addListener(event: string | symbol, listener: (...args: unknown[]) => void): this {\n return super.addListener(event, listener as (...args: unknown[]) => void);\n }\n\n override removeListener<K extends keyof PhotonEventMap>(\n event: K,\n listener: PhotonEventMap[K] extends undefined ? () => void : (data: PhotonEventMap[K]) => void,\n ): this;\n override removeListener(event: string | symbol, listener: (...args: unknown[]) => void): this {\n return super.removeListener(event, listener as (...args: unknown[]) => void);\n }\n\n async connect() {\n const serverEvents: (keyof PhotonEventMap)[] = [\n \"new-message\",\n \"message-updated\",\n \"updated-message\",\n \"chat-read-status-changed\",\n \"group-name-change\",\n \"participant-added\",\n \"participant-removed\",\n \"participant-left\",\n \"group-icon-changed\",\n \"group-icon-removed\",\n \"message-send-error\",\n \"typing-indicator\",\n \"new-server\",\n \"incoming-facetime\",\n \"ft-call-status-changed\",\n \"hello-world\",\n ];\n\n for (const eventName of serverEvents) {\n this.socket.on(eventName, (...args: unknown[]) => {\n // Message deduplication logic\n //\n // Problem: When Socket.IO connection is unstable (especially with polling transport),\n // the server may repeatedly push the same message content with different GUIDs.\n // This bypasses traditional GUID-based deduplication and causes message reply loops.\n //\n // Solution: Use GUID as unique identifier for deduplication\n if (eventName === \"new-message\" && args.length > 0) {\n const message = args[0] as { guid?: string };\n if (message?.guid) {\n // Check if this message has already been processed\n if (this.processedMessages.has(message.guid)) {\n this.logger.debug(`Message already processed, skipping duplicate: ${message.guid}`);\n return;\n }\n // Mark message as processed\n this.processedMessages.add(message.guid);\n }\n }\n\n if (args.length > 0) {\n super.emit(eventName, args[0]);\n } else {\n super.emit(eventName);\n }\n });\n }\n\n this.socket.on(\"disconnect\", () => {\n this.logger.info(\"Disconnected from iMessage server\");\n this.readyEmitted = false;\n this.emit(\"disconnect\");\n });\n\n // Listen for authentication success\n this.socket.on(\"auth-ok\", () => {\n this.logger.info(\"Authentication successful\");\n if (!this.readyEmitted) {\n this.readyEmitted = true;\n this.emit(\"ready\");\n }\n });\n\n // Listen for authentication errors\n this.socket.on(\"auth-error\", (error: { message: string; reason?: string }) => {\n this.logger.error(`Authentication failed: ${error.message} ${error.reason ? `(${error.reason})` : \"\"}`);\n this.emit(\"error\", new Error(`Authentication failed: ${error.message}`));\n });\n\n if (this.socket.connected) {\n this.logger.info(\"Already connected to iMessage server\");\n return;\n }\n\n this.socket.once(\"connect\", () => {\n this.logger.info(\"Connected to iMessage server, waiting for authentication...\");\n // If no apiKey, assume legacy server that doesn't require auth - emit ready immediately\n if (!this.config.apiKey) {\n this.logger.info(\"No API key provided, skipping authentication (legacy server mode)\");\n if (!this.readyEmitted) {\n this.readyEmitted = true;\n this.emit(\"ready\");\n }\n }\n });\n\n if (!this.socket.connected) {\n this.socket.connect();\n }\n }\n\n async close() {\n this.socket.disconnect();\n }\n\n /**\n * Clear processed message records (prevent memory leaks)\n * @param maxSize Maximum number of messages to retain, default 1000\n */\n public clearProcessedMessages(maxSize: number = 1000) {\n if (this.processedMessages.size > maxSize) {\n const messages = Array.from(this.processedMessages);\n this.processedMessages.clear();\n // Keep the most recent portion of messages\n messages.slice(-Math.floor(maxSize / 2)).forEach((guid) => {\n this.processedMessages.add(guid);\n });\n this.logger.debug(`Cleared processed message records, retained ${this.processedMessages.size} messages`);\n }\n }\n\n /**\n * Get the count of processed messages\n */\n public getProcessedMessageCount(): number {\n return this.processedMessages.size;\n }\n\n /**\n * Enqueue a send operation to ensure sequential delivery.\n * All send operations (messages, attachments, stickers) should use this method\n * to guarantee order for a single user.\n * @param task The async send operation to enqueue\n * @returns Promise that resolves with the task result\n */\n public enqueueSend<T>(task: () => Promise<T>): Promise<T> {\n const result = this.sendQueue.then(() => task());\n // Update queue, swallow errors to not block subsequent sends\n this.sendQueue = result.catch(() => {});\n return result;\n }\n}\n\nexport const SDK = AdvancedIMessageKit.getInstance;\n","export const SCHEDULED_MESSAGE_ERROR = \"scheduled-message-error\";\nexport const SCHEDULED_MESSAGE_SENT = \"scheduled-message-sent\";\nexport const SCHEDULED_MESSAGE_DELETED = \"scheduled-message-deleted\";\nexport const SCHEDULED_MESSAGE_UPDATED = \"scheduled-message-updated\";\nexport const SCHEDULED_MESSAGE_CREATED = \"scheduled-message-created\";\nexport const NEW_MESSAGE = \"new-message\";\nexport const MESSAGE_SEND_ERROR = \"message-send-error\";\nexport const MESSAGE_UPDATED = \"updated-message\";\nexport const NEW_SERVER = \"new-server\";\nexport const PARTICIPANT_REMOVED = \"participant-removed\";\nexport const PARTICIPANT_ADDED = \"participant-added\";\nexport const PARTICIPANT_LEFT = \"participant-left\";\nexport const GROUP_ICON_CHANGED = \"group-icon-changed\";\nexport const GROUP_ICON_REMOVED = \"group-icon-removed\";\nexport const CHAT_READ_STATUS_CHANGED = \"chat-read-status-changed\";\nexport const HELLO_WORLD = \"hello-world\";\nexport const TYPING_INDICATOR = \"typing-indicator\";\nexport const SERVER_UPDATE = \"server-update\";\nexport const SERVER_UPDATE_DOWNLOADING = \"server-update-downloading\";\nexport const SERVER_UPDATE_INSTALLING = \"server-update-installing\";\nexport const GROUP_NAME_CHANGE = \"group-name-change\";\nexport const INCOMING_FACETIME = \"incoming-facetime\";\nexport const SETTINGS_BACKUP_CREATED = \"settings-backup-created\";\nexport const SETTINGS_BACKUP_DELETED = \"settings-backup-deleted\";\nexport const SETTINGS_BACKUP_UPDATED = \"settings-backup-updated\";\nexport const THEME_BACKUP_CREATED = \"theme-backup-created\";\nexport const THEME_BACKUP_DELETED = \"theme-backup-deleted\";\nexport const THEME_BACKUP_UPDATED = \"theme-backup-updated\";\nexport const IMESSAGE_ALIASES_REMOVED = \"imessage-aliases-removed\";\nexport const FT_CALL_STATUS_CHANGED = \"ft-call-status-changed\";\nexport const NEW_FINDMY_LOCATION = \"new-findmy-location\";\n","import type { MessageResponse } from \"../types/message\";\nimport type { PollDefinition, PollOption, PollVote, PollVoteResponse } from \"../types/poll\";\n\nexport const POLL_BALLOON_BUNDLE_ID =\n \"com.apple.messages.MSMessageExtensionBalloonPlugin:0000000000:com.apple.messages.Polls\";\n\nconst pollCache = new Map<string, ParsedPoll>();\n\nexport function cachePoll(messageGuid: string, poll: ParsedPoll): void {\n pollCache.set(messageGuid, poll);\n}\n\nexport function getCachedPoll(messageGuid: string): ParsedPoll | null {\n return pollCache.get(messageGuid) ?? null;\n}\n\nexport function getOptionTextById(optionId: string): string | null {\n for (const poll of pollCache.values()) {\n const option = poll.options.find((o) => o.optionIdentifier === optionId);\n if (option) return option.text;\n }\n return null;\n}\n\nexport function isPollMessage(message: MessageResponse): boolean {\n return message.balloonBundleId === POLL_BALLOON_BUNDLE_ID;\n}\n\nexport function isPollVote(message: MessageResponse): boolean {\n return isPollMessage(message) && message.associatedMessageType === \"4000\";\n}\n\nexport interface ParsedPoll {\n title: string;\n creatorHandle: string;\n options: PollOption[];\n}\n\nexport interface ParsedPollVote {\n votes: PollVote[];\n}\n\nfunction extractDataUrl(payloadData: NodeJS.Dict<any>[] | null | undefined): string | null {\n if (!payloadData || payloadData.length === 0) return null;\n\n const payload = payloadData[0];\n if (!payload) return null;\n\n if (payload.URL && typeof payload.URL === \"string\") {\n return payload.URL;\n }\n\n const objects = payload.$objects;\n if (Array.isArray(objects)) {\n for (const obj of objects) {\n if (typeof obj === \"object\" && obj !== null) {\n if (obj[\"NS.relative\"] && typeof obj[\"NS.relative\"] === \"object\") {\n const relativeObj = objects[obj[\"NS.relative\"].UID];\n if (typeof relativeObj === \"string\" && relativeObj.startsWith(\"data:,\")) {\n return relativeObj;\n }\n }\n if (typeof obj === \"string\" && obj.startsWith(\"data:,\")) {\n return obj;\n }\n }\n }\n }\n\n return null;\n}\n\nfunction parseDataUrl(dataUrl: string): unknown | null {\n try {\n const prefix = \"data:,\";\n if (!dataUrl.startsWith(prefix)) return null;\n\n let data = dataUrl.slice(prefix.length);\n const queryIndex = data.indexOf(\"?\");\n if (queryIndex !== -1) {\n data = data.slice(0, queryIndex);\n }\n\n data = decodeURIComponent(data);\n\n try {\n return JSON.parse(data);\n } catch {\n const decoded = Buffer.from(data, \"base64\").toString(\"utf-8\");\n return JSON.parse(decoded);\n }\n } catch {\n return null;\n }\n}\n\nexport function parsePollDefinition(message: MessageResponse): ParsedPoll | null {\n if (!isPollMessage(message)) return null;\n if (isPollVote(message)) return null; // Vote messages don't contain the poll definition\n\n const dataUrl = extractDataUrl(message.payloadData);\n if (!dataUrl) return null;\n\n const data = parseDataUrl(dataUrl) as PollDefinition | null;\n if (!data || !data.item) return null;\n\n const parsed: ParsedPoll = {\n title: data.item.title || \"\",\n creatorHandle: data.item.creatorHandle || \"\",\n options: data.item.orderedPollOptions || [],\n };\n\n if (message.guid) {\n cachePoll(message.guid, parsed);\n }\n\n return parsed;\n}\n\nexport function parsePollVotes(message: MessageResponse): ParsedPollVote | null {\n if (!isPollMessage(message)) return null;\n if (!isPollVote(message)) return null;\n\n const dataUrl = extractDataUrl(message.payloadData);\n if (!dataUrl) return null;\n\n const data = parseDataUrl(dataUrl) as PollVoteResponse | null;\n if (!data || !data.item) return null;\n\n return {\n votes: data.item.votes || [],\n };\n}\n\nexport function getPollSummary(message: MessageResponse): string {\n if (!isPollMessage(message)) {\n return message.text || \"(no text)\";\n }\n\n if (isPollVote(message)) {\n const voteData = parsePollVotes(message);\n if (voteData && voteData.votes.length > 0) {\n const votes = voteData.votes\n .map((v) => {\n const optionText = getOptionTextById(v.voteOptionIdentifier);\n const optionDisplay = optionText ? `\"${optionText}\"` : `option ${v.voteOptionIdentifier}`;\n return `${v.participantHandle || \"Someone\"} voted ${optionDisplay}`;\n })\n .join(\", \");\n return `[Poll Vote] ${votes}`;\n }\n return \"[Poll Vote]\";\n }\n\n const pollData = parsePollDefinition(message);\n if (pollData) {\n const title = pollData.title ? `\"${pollData.title}\"` : \"(untitled poll)\";\n const optionsList = pollData.options.map((opt, i) => ` ${i + 1}. ${opt.text}`).join(\"\\n\");\n return `[Poll] ${title}\\n${optionsList}`;\n }\n\n return \"[Poll] (unable to parse)\";\n}\n\nexport function getPollOneLiner(message: MessageResponse): string {\n if (!isPollMessage(message)) {\n return message.text || \"(no text)\";\n }\n\n if (isPollVote(message)) {\n const voteData = parsePollVotes(message);\n if (voteData && voteData.votes.length > 0) {\n return `[Poll Vote] ${voteData.votes.length} vote(s)`;\n }\n return \"[Poll Vote]\";\n }\n\n const pollData = parsePollDefinition(message);\n if (pollData) {\n const title = pollData.title || \"Poll\";\n const optionsPreview = pollData.options\n .slice(0, 2)\n .map((o) => o.text)\n .join(\", \");\n const moreOptions = pollData.options.length > 2 ? `, +${pollData.options.length - 2} more` : \"\";\n return `[${title}] ${optionsPreview}${moreOptions}`;\n }\n\n return \"[Poll]\";\n}\n"]}
|