simple-support-chat 0.1.0 → 0.2.0

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.
@@ -1,10 +1,51 @@
1
1
  'use strict';
2
2
 
3
3
  var webApi = require('@slack/web-api');
4
+ var crypto = require('crypto');
5
+
6
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
+
8
+ var crypto__default = /*#__PURE__*/_interopDefault(crypto);
9
+
10
+ // src/server/handler.ts
11
+
12
+ // src/server/store.ts
13
+ var InMemoryStore = class {
14
+ /** sessionId -> ThreadRecord */
15
+ threads = /* @__PURE__ */ new Map();
16
+ /** threadTs -> sessionId (reverse lookup) */
17
+ threadTsIndex = /* @__PURE__ */ new Map();
18
+ /** sessionId -> Reply[] */
19
+ replies = /* @__PURE__ */ new Map();
20
+ async saveThread(sessionId, threadTs, metadata) {
21
+ const record = { sessionId, threadTs, metadata };
22
+ this.threads.set(sessionId, record);
23
+ this.threadTsIndex.set(threadTs, sessionId);
24
+ }
25
+ async getThreadBySession(sessionId) {
26
+ return this.threads.get(sessionId) ?? null;
27
+ }
28
+ async getThreadByTs(threadTs) {
29
+ const sessionId = this.threadTsIndex.get(threadTs);
30
+ if (!sessionId) return null;
31
+ return this.threads.get(sessionId) ?? null;
32
+ }
33
+ async saveReply(sessionId, reply) {
34
+ const existing = this.replies.get(sessionId) ?? [];
35
+ existing.push(reply);
36
+ this.replies.set(sessionId, existing);
37
+ }
38
+ async getReplies(sessionId, since) {
39
+ const all = this.replies.get(sessionId) ?? [];
40
+ if (!since) return [...all];
41
+ const sinceTime = new Date(since).getTime();
42
+ return all.filter((r) => new Date(r.timestamp).getTime() > sinceTime);
43
+ }
44
+ };
4
45
 
5
46
  // src/server/handler.ts
6
47
  async function handleMessage(body, options) {
7
- const { slack, slackChannel, botName, botIcon, onMessage, threadMap } = options;
48
+ const { slack, slackChannel, botName, botIcon, onMessage, store } = options;
8
49
  if (!body.message || typeof body.message !== "string") {
9
50
  return {
10
51
  data: { success: false, error: "Missing required field: message" },
@@ -24,7 +65,8 @@ async function handleMessage(body, options) {
24
65
  }
25
66
  }
26
67
  const lookupKey = body.user?.id ?? body.sessionId;
27
- const existingThread = threadMap.get(lookupKey);
68
+ const existingRecord = await store.getThreadBySession(lookupKey);
69
+ const existingThread = existingRecord?.threadTs;
28
70
  try {
29
71
  const userLabel = body.user ? `${body.user.name ?? "User"} (${body.user.email ?? body.user.id})` : `Anonymous (session ${body.sessionId.substring(0, 8)})`;
30
72
  const contextLines = [];
@@ -61,7 +103,11 @@ ${body.message}`,
61
103
  status: 500
62
104
  };
63
105
  }
64
- threadMap.set(lookupKey, threadTs);
106
+ await store.saveThread(lookupKey, threadTs, {
107
+ sessionId: body.sessionId,
108
+ user: body.user,
109
+ context: body.context
110
+ });
65
111
  return {
66
112
  data: { success: true, threadId: threadTs },
67
113
  status: 200
@@ -76,9 +122,9 @@ ${body.message}`,
76
122
  }
77
123
  }
78
124
  function createSupportHandler(options) {
79
- const { slackBotToken, slackChannel, botName, botIcon, onMessage } = options;
125
+ const { slackBotToken, slackChannel, botName, botIcon, onMessage, store } = options;
80
126
  const slack = new webApi.WebClient(slackBotToken);
81
- const threadMap = /* @__PURE__ */ new Map();
127
+ const resolvedStore = store ?? new InMemoryStore();
82
128
  return async (request) => {
83
129
  if (request.method !== "POST") {
84
130
  return jsonResponse(
@@ -101,15 +147,15 @@ function createSupportHandler(options) {
101
147
  botName,
102
148
  botIcon,
103
149
  onMessage,
104
- threadMap
150
+ store: resolvedStore
105
151
  });
106
152
  return jsonResponse(result.data, result.status);
107
153
  };
108
154
  }
109
155
  function createExpressHandler(options) {
110
- const { slackBotToken, slackChannel, botName, botIcon, onMessage } = options;
156
+ const { slackBotToken, slackChannel, botName, botIcon, onMessage, store } = options;
111
157
  const slack = new webApi.WebClient(slackBotToken);
112
- const threadMap = /* @__PURE__ */ new Map();
158
+ const resolvedStore = store ?? new InMemoryStore();
113
159
  return async (req, res) => {
114
160
  const body = req.body;
115
161
  const result = await handleMessage(body, {
@@ -118,7 +164,7 @@ function createExpressHandler(options) {
118
164
  botName,
119
165
  botIcon,
120
166
  onMessage,
121
- threadMap
167
+ store: resolvedStore
122
168
  });
123
169
  res.status(result.status).json(result.data);
124
170
  };
@@ -146,8 +192,2129 @@ function jsonResponse(data, status = 200) {
146
192
  });
147
193
  }
148
194
 
195
+ // node_modules/.pnpm/gemoji@8.1.0/node_modules/gemoji/index.js
196
+ var nameToEmoji = {
197
+ 100: "\u{1F4AF}",
198
+ 1234: "\u{1F522}",
199
+ grinning: "\u{1F600}",
200
+ smiley: "\u{1F603}",
201
+ smile: "\u{1F604}",
202
+ grin: "\u{1F601}",
203
+ laughing: "\u{1F606}",
204
+ satisfied: "\u{1F606}",
205
+ sweat_smile: "\u{1F605}",
206
+ rofl: "\u{1F923}",
207
+ joy: "\u{1F602}",
208
+ slightly_smiling_face: "\u{1F642}",
209
+ upside_down_face: "\u{1F643}",
210
+ melting_face: "\u{1FAE0}",
211
+ wink: "\u{1F609}",
212
+ blush: "\u{1F60A}",
213
+ innocent: "\u{1F607}",
214
+ smiling_face_with_three_hearts: "\u{1F970}",
215
+ heart_eyes: "\u{1F60D}",
216
+ star_struck: "\u{1F929}",
217
+ kissing_heart: "\u{1F618}",
218
+ kissing: "\u{1F617}",
219
+ relaxed: "\u263A\uFE0F",
220
+ kissing_closed_eyes: "\u{1F61A}",
221
+ kissing_smiling_eyes: "\u{1F619}",
222
+ smiling_face_with_tear: "\u{1F972}",
223
+ yum: "\u{1F60B}",
224
+ stuck_out_tongue: "\u{1F61B}",
225
+ stuck_out_tongue_winking_eye: "\u{1F61C}",
226
+ zany_face: "\u{1F92A}",
227
+ stuck_out_tongue_closed_eyes: "\u{1F61D}",
228
+ money_mouth_face: "\u{1F911}",
229
+ hugs: "\u{1F917}",
230
+ hand_over_mouth: "\u{1F92D}",
231
+ face_with_open_eyes_and_hand_over_mouth: "\u{1FAE2}",
232
+ face_with_peeking_eye: "\u{1FAE3}",
233
+ shushing_face: "\u{1F92B}",
234
+ thinking: "\u{1F914}",
235
+ saluting_face: "\u{1FAE1}",
236
+ zipper_mouth_face: "\u{1F910}",
237
+ raised_eyebrow: "\u{1F928}",
238
+ neutral_face: "\u{1F610}",
239
+ expressionless: "\u{1F611}",
240
+ no_mouth: "\u{1F636}",
241
+ dotted_line_face: "\u{1FAE5}",
242
+ face_in_clouds: "\u{1F636}\u200D\u{1F32B}\uFE0F",
243
+ smirk: "\u{1F60F}",
244
+ unamused: "\u{1F612}",
245
+ roll_eyes: "\u{1F644}",
246
+ grimacing: "\u{1F62C}",
247
+ face_exhaling: "\u{1F62E}\u200D\u{1F4A8}",
248
+ lying_face: "\u{1F925}",
249
+ shaking_face: "\u{1FAE8}",
250
+ relieved: "\u{1F60C}",
251
+ pensive: "\u{1F614}",
252
+ sleepy: "\u{1F62A}",
253
+ drooling_face: "\u{1F924}",
254
+ sleeping: "\u{1F634}",
255
+ mask: "\u{1F637}",
256
+ face_with_thermometer: "\u{1F912}",
257
+ face_with_head_bandage: "\u{1F915}",
258
+ nauseated_face: "\u{1F922}",
259
+ vomiting_face: "\u{1F92E}",
260
+ sneezing_face: "\u{1F927}",
261
+ hot_face: "\u{1F975}",
262
+ cold_face: "\u{1F976}",
263
+ woozy_face: "\u{1F974}",
264
+ dizzy_face: "\u{1F635}",
265
+ face_with_spiral_eyes: "\u{1F635}\u200D\u{1F4AB}",
266
+ exploding_head: "\u{1F92F}",
267
+ cowboy_hat_face: "\u{1F920}",
268
+ partying_face: "\u{1F973}",
269
+ disguised_face: "\u{1F978}",
270
+ sunglasses: "\u{1F60E}",
271
+ nerd_face: "\u{1F913}",
272
+ monocle_face: "\u{1F9D0}",
273
+ confused: "\u{1F615}",
274
+ face_with_diagonal_mouth: "\u{1FAE4}",
275
+ worried: "\u{1F61F}",
276
+ slightly_frowning_face: "\u{1F641}",
277
+ frowning_face: "\u2639\uFE0F",
278
+ open_mouth: "\u{1F62E}",
279
+ hushed: "\u{1F62F}",
280
+ astonished: "\u{1F632}",
281
+ flushed: "\u{1F633}",
282
+ pleading_face: "\u{1F97A}",
283
+ face_holding_back_tears: "\u{1F979}",
284
+ frowning: "\u{1F626}",
285
+ anguished: "\u{1F627}",
286
+ fearful: "\u{1F628}",
287
+ cold_sweat: "\u{1F630}",
288
+ disappointed_relieved: "\u{1F625}",
289
+ cry: "\u{1F622}",
290
+ sob: "\u{1F62D}",
291
+ scream: "\u{1F631}",
292
+ confounded: "\u{1F616}",
293
+ persevere: "\u{1F623}",
294
+ disappointed: "\u{1F61E}",
295
+ sweat: "\u{1F613}",
296
+ weary: "\u{1F629}",
297
+ tired_face: "\u{1F62B}",
298
+ yawning_face: "\u{1F971}",
299
+ triumph: "\u{1F624}",
300
+ rage: "\u{1F621}",
301
+ pout: "\u{1F621}",
302
+ angry: "\u{1F620}",
303
+ cursing_face: "\u{1F92C}",
304
+ smiling_imp: "\u{1F608}",
305
+ imp: "\u{1F47F}",
306
+ skull: "\u{1F480}",
307
+ skull_and_crossbones: "\u2620\uFE0F",
308
+ hankey: "\u{1F4A9}",
309
+ poop: "\u{1F4A9}",
310
+ shit: "\u{1F4A9}",
311
+ clown_face: "\u{1F921}",
312
+ japanese_ogre: "\u{1F479}",
313
+ japanese_goblin: "\u{1F47A}",
314
+ ghost: "\u{1F47B}",
315
+ alien: "\u{1F47D}",
316
+ space_invader: "\u{1F47E}",
317
+ robot: "\u{1F916}",
318
+ smiley_cat: "\u{1F63A}",
319
+ smile_cat: "\u{1F638}",
320
+ joy_cat: "\u{1F639}",
321
+ heart_eyes_cat: "\u{1F63B}",
322
+ smirk_cat: "\u{1F63C}",
323
+ kissing_cat: "\u{1F63D}",
324
+ scream_cat: "\u{1F640}",
325
+ crying_cat_face: "\u{1F63F}",
326
+ pouting_cat: "\u{1F63E}",
327
+ see_no_evil: "\u{1F648}",
328
+ hear_no_evil: "\u{1F649}",
329
+ speak_no_evil: "\u{1F64A}",
330
+ love_letter: "\u{1F48C}",
331
+ cupid: "\u{1F498}",
332
+ gift_heart: "\u{1F49D}",
333
+ sparkling_heart: "\u{1F496}",
334
+ heartpulse: "\u{1F497}",
335
+ heartbeat: "\u{1F493}",
336
+ revolving_hearts: "\u{1F49E}",
337
+ two_hearts: "\u{1F495}",
338
+ heart_decoration: "\u{1F49F}",
339
+ heavy_heart_exclamation: "\u2763\uFE0F",
340
+ broken_heart: "\u{1F494}",
341
+ heart_on_fire: "\u2764\uFE0F\u200D\u{1F525}",
342
+ mending_heart: "\u2764\uFE0F\u200D\u{1FA79}",
343
+ heart: "\u2764\uFE0F",
344
+ pink_heart: "\u{1FA77}",
345
+ orange_heart: "\u{1F9E1}",
346
+ yellow_heart: "\u{1F49B}",
347
+ green_heart: "\u{1F49A}",
348
+ blue_heart: "\u{1F499}",
349
+ light_blue_heart: "\u{1FA75}",
350
+ purple_heart: "\u{1F49C}",
351
+ brown_heart: "\u{1F90E}",
352
+ black_heart: "\u{1F5A4}",
353
+ grey_heart: "\u{1FA76}",
354
+ white_heart: "\u{1F90D}",
355
+ kiss: "\u{1F48B}",
356
+ anger: "\u{1F4A2}",
357
+ boom: "\u{1F4A5}",
358
+ collision: "\u{1F4A5}",
359
+ dizzy: "\u{1F4AB}",
360
+ sweat_drops: "\u{1F4A6}",
361
+ dash: "\u{1F4A8}",
362
+ hole: "\u{1F573}\uFE0F",
363
+ speech_balloon: "\u{1F4AC}",
364
+ eye_speech_bubble: "\u{1F441}\uFE0F\u200D\u{1F5E8}\uFE0F",
365
+ left_speech_bubble: "\u{1F5E8}\uFE0F",
366
+ right_anger_bubble: "\u{1F5EF}\uFE0F",
367
+ thought_balloon: "\u{1F4AD}",
368
+ zzz: "\u{1F4A4}",
369
+ wave: "\u{1F44B}",
370
+ raised_back_of_hand: "\u{1F91A}",
371
+ raised_hand_with_fingers_splayed: "\u{1F590}\uFE0F",
372
+ hand: "\u270B",
373
+ raised_hand: "\u270B",
374
+ vulcan_salute: "\u{1F596}",
375
+ rightwards_hand: "\u{1FAF1}",
376
+ leftwards_hand: "\u{1FAF2}",
377
+ palm_down_hand: "\u{1FAF3}",
378
+ palm_up_hand: "\u{1FAF4}",
379
+ leftwards_pushing_hand: "\u{1FAF7}",
380
+ rightwards_pushing_hand: "\u{1FAF8}",
381
+ ok_hand: "\u{1F44C}",
382
+ pinched_fingers: "\u{1F90C}",
383
+ pinching_hand: "\u{1F90F}",
384
+ v: "\u270C\uFE0F",
385
+ crossed_fingers: "\u{1F91E}",
386
+ hand_with_index_finger_and_thumb_crossed: "\u{1FAF0}",
387
+ love_you_gesture: "\u{1F91F}",
388
+ metal: "\u{1F918}",
389
+ call_me_hand: "\u{1F919}",
390
+ point_left: "\u{1F448}",
391
+ point_right: "\u{1F449}",
392
+ point_up_2: "\u{1F446}",
393
+ middle_finger: "\u{1F595}",
394
+ fu: "\u{1F595}",
395
+ point_down: "\u{1F447}",
396
+ point_up: "\u261D\uFE0F",
397
+ index_pointing_at_the_viewer: "\u{1FAF5}",
398
+ "+1": "\u{1F44D}",
399
+ thumbsup: "\u{1F44D}",
400
+ "-1": "\u{1F44E}",
401
+ thumbsdown: "\u{1F44E}",
402
+ fist_raised: "\u270A",
403
+ fist: "\u270A",
404
+ fist_oncoming: "\u{1F44A}",
405
+ facepunch: "\u{1F44A}",
406
+ punch: "\u{1F44A}",
407
+ fist_left: "\u{1F91B}",
408
+ fist_right: "\u{1F91C}",
409
+ clap: "\u{1F44F}",
410
+ raised_hands: "\u{1F64C}",
411
+ heart_hands: "\u{1FAF6}",
412
+ open_hands: "\u{1F450}",
413
+ palms_up_together: "\u{1F932}",
414
+ handshake: "\u{1F91D}",
415
+ pray: "\u{1F64F}",
416
+ writing_hand: "\u270D\uFE0F",
417
+ nail_care: "\u{1F485}",
418
+ selfie: "\u{1F933}",
419
+ muscle: "\u{1F4AA}",
420
+ mechanical_arm: "\u{1F9BE}",
421
+ mechanical_leg: "\u{1F9BF}",
422
+ leg: "\u{1F9B5}",
423
+ foot: "\u{1F9B6}",
424
+ ear: "\u{1F442}",
425
+ ear_with_hearing_aid: "\u{1F9BB}",
426
+ nose: "\u{1F443}",
427
+ brain: "\u{1F9E0}",
428
+ anatomical_heart: "\u{1FAC0}",
429
+ lungs: "\u{1FAC1}",
430
+ tooth: "\u{1F9B7}",
431
+ bone: "\u{1F9B4}",
432
+ eyes: "\u{1F440}",
433
+ eye: "\u{1F441}\uFE0F",
434
+ tongue: "\u{1F445}",
435
+ lips: "\u{1F444}",
436
+ biting_lip: "\u{1FAE6}",
437
+ baby: "\u{1F476}",
438
+ child: "\u{1F9D2}",
439
+ boy: "\u{1F466}",
440
+ girl: "\u{1F467}",
441
+ adult: "\u{1F9D1}",
442
+ blond_haired_person: "\u{1F471}",
443
+ man: "\u{1F468}",
444
+ bearded_person: "\u{1F9D4}",
445
+ man_beard: "\u{1F9D4}\u200D\u2642\uFE0F",
446
+ woman_beard: "\u{1F9D4}\u200D\u2640\uFE0F",
447
+ red_haired_man: "\u{1F468}\u200D\u{1F9B0}",
448
+ curly_haired_man: "\u{1F468}\u200D\u{1F9B1}",
449
+ white_haired_man: "\u{1F468}\u200D\u{1F9B3}",
450
+ bald_man: "\u{1F468}\u200D\u{1F9B2}",
451
+ woman: "\u{1F469}",
452
+ red_haired_woman: "\u{1F469}\u200D\u{1F9B0}",
453
+ person_red_hair: "\u{1F9D1}\u200D\u{1F9B0}",
454
+ curly_haired_woman: "\u{1F469}\u200D\u{1F9B1}",
455
+ person_curly_hair: "\u{1F9D1}\u200D\u{1F9B1}",
456
+ white_haired_woman: "\u{1F469}\u200D\u{1F9B3}",
457
+ person_white_hair: "\u{1F9D1}\u200D\u{1F9B3}",
458
+ bald_woman: "\u{1F469}\u200D\u{1F9B2}",
459
+ person_bald: "\u{1F9D1}\u200D\u{1F9B2}",
460
+ blond_haired_woman: "\u{1F471}\u200D\u2640\uFE0F",
461
+ blonde_woman: "\u{1F471}\u200D\u2640\uFE0F",
462
+ blond_haired_man: "\u{1F471}\u200D\u2642\uFE0F",
463
+ older_adult: "\u{1F9D3}",
464
+ older_man: "\u{1F474}",
465
+ older_woman: "\u{1F475}",
466
+ frowning_person: "\u{1F64D}",
467
+ frowning_man: "\u{1F64D}\u200D\u2642\uFE0F",
468
+ frowning_woman: "\u{1F64D}\u200D\u2640\uFE0F",
469
+ pouting_face: "\u{1F64E}",
470
+ pouting_man: "\u{1F64E}\u200D\u2642\uFE0F",
471
+ pouting_woman: "\u{1F64E}\u200D\u2640\uFE0F",
472
+ no_good: "\u{1F645}",
473
+ no_good_man: "\u{1F645}\u200D\u2642\uFE0F",
474
+ ng_man: "\u{1F645}\u200D\u2642\uFE0F",
475
+ no_good_woman: "\u{1F645}\u200D\u2640\uFE0F",
476
+ ng_woman: "\u{1F645}\u200D\u2640\uFE0F",
477
+ ok_person: "\u{1F646}",
478
+ ok_man: "\u{1F646}\u200D\u2642\uFE0F",
479
+ ok_woman: "\u{1F646}\u200D\u2640\uFE0F",
480
+ tipping_hand_person: "\u{1F481}",
481
+ information_desk_person: "\u{1F481}",
482
+ tipping_hand_man: "\u{1F481}\u200D\u2642\uFE0F",
483
+ sassy_man: "\u{1F481}\u200D\u2642\uFE0F",
484
+ tipping_hand_woman: "\u{1F481}\u200D\u2640\uFE0F",
485
+ sassy_woman: "\u{1F481}\u200D\u2640\uFE0F",
486
+ raising_hand: "\u{1F64B}",
487
+ raising_hand_man: "\u{1F64B}\u200D\u2642\uFE0F",
488
+ raising_hand_woman: "\u{1F64B}\u200D\u2640\uFE0F",
489
+ deaf_person: "\u{1F9CF}",
490
+ deaf_man: "\u{1F9CF}\u200D\u2642\uFE0F",
491
+ deaf_woman: "\u{1F9CF}\u200D\u2640\uFE0F",
492
+ bow: "\u{1F647}",
493
+ bowing_man: "\u{1F647}\u200D\u2642\uFE0F",
494
+ bowing_woman: "\u{1F647}\u200D\u2640\uFE0F",
495
+ facepalm: "\u{1F926}",
496
+ man_facepalming: "\u{1F926}\u200D\u2642\uFE0F",
497
+ woman_facepalming: "\u{1F926}\u200D\u2640\uFE0F",
498
+ shrug: "\u{1F937}",
499
+ man_shrugging: "\u{1F937}\u200D\u2642\uFE0F",
500
+ woman_shrugging: "\u{1F937}\u200D\u2640\uFE0F",
501
+ health_worker: "\u{1F9D1}\u200D\u2695\uFE0F",
502
+ man_health_worker: "\u{1F468}\u200D\u2695\uFE0F",
503
+ woman_health_worker: "\u{1F469}\u200D\u2695\uFE0F",
504
+ student: "\u{1F9D1}\u200D\u{1F393}",
505
+ man_student: "\u{1F468}\u200D\u{1F393}",
506
+ woman_student: "\u{1F469}\u200D\u{1F393}",
507
+ teacher: "\u{1F9D1}\u200D\u{1F3EB}",
508
+ man_teacher: "\u{1F468}\u200D\u{1F3EB}",
509
+ woman_teacher: "\u{1F469}\u200D\u{1F3EB}",
510
+ judge: "\u{1F9D1}\u200D\u2696\uFE0F",
511
+ man_judge: "\u{1F468}\u200D\u2696\uFE0F",
512
+ woman_judge: "\u{1F469}\u200D\u2696\uFE0F",
513
+ farmer: "\u{1F9D1}\u200D\u{1F33E}",
514
+ man_farmer: "\u{1F468}\u200D\u{1F33E}",
515
+ woman_farmer: "\u{1F469}\u200D\u{1F33E}",
516
+ cook: "\u{1F9D1}\u200D\u{1F373}",
517
+ man_cook: "\u{1F468}\u200D\u{1F373}",
518
+ woman_cook: "\u{1F469}\u200D\u{1F373}",
519
+ mechanic: "\u{1F9D1}\u200D\u{1F527}",
520
+ man_mechanic: "\u{1F468}\u200D\u{1F527}",
521
+ woman_mechanic: "\u{1F469}\u200D\u{1F527}",
522
+ factory_worker: "\u{1F9D1}\u200D\u{1F3ED}",
523
+ man_factory_worker: "\u{1F468}\u200D\u{1F3ED}",
524
+ woman_factory_worker: "\u{1F469}\u200D\u{1F3ED}",
525
+ office_worker: "\u{1F9D1}\u200D\u{1F4BC}",
526
+ man_office_worker: "\u{1F468}\u200D\u{1F4BC}",
527
+ woman_office_worker: "\u{1F469}\u200D\u{1F4BC}",
528
+ scientist: "\u{1F9D1}\u200D\u{1F52C}",
529
+ man_scientist: "\u{1F468}\u200D\u{1F52C}",
530
+ woman_scientist: "\u{1F469}\u200D\u{1F52C}",
531
+ technologist: "\u{1F9D1}\u200D\u{1F4BB}",
532
+ man_technologist: "\u{1F468}\u200D\u{1F4BB}",
533
+ woman_technologist: "\u{1F469}\u200D\u{1F4BB}",
534
+ singer: "\u{1F9D1}\u200D\u{1F3A4}",
535
+ man_singer: "\u{1F468}\u200D\u{1F3A4}",
536
+ woman_singer: "\u{1F469}\u200D\u{1F3A4}",
537
+ artist: "\u{1F9D1}\u200D\u{1F3A8}",
538
+ man_artist: "\u{1F468}\u200D\u{1F3A8}",
539
+ woman_artist: "\u{1F469}\u200D\u{1F3A8}",
540
+ pilot: "\u{1F9D1}\u200D\u2708\uFE0F",
541
+ man_pilot: "\u{1F468}\u200D\u2708\uFE0F",
542
+ woman_pilot: "\u{1F469}\u200D\u2708\uFE0F",
543
+ astronaut: "\u{1F9D1}\u200D\u{1F680}",
544
+ man_astronaut: "\u{1F468}\u200D\u{1F680}",
545
+ woman_astronaut: "\u{1F469}\u200D\u{1F680}",
546
+ firefighter: "\u{1F9D1}\u200D\u{1F692}",
547
+ man_firefighter: "\u{1F468}\u200D\u{1F692}",
548
+ woman_firefighter: "\u{1F469}\u200D\u{1F692}",
549
+ police_officer: "\u{1F46E}",
550
+ cop: "\u{1F46E}",
551
+ policeman: "\u{1F46E}\u200D\u2642\uFE0F",
552
+ policewoman: "\u{1F46E}\u200D\u2640\uFE0F",
553
+ detective: "\u{1F575}\uFE0F",
554
+ male_detective: "\u{1F575}\uFE0F\u200D\u2642\uFE0F",
555
+ female_detective: "\u{1F575}\uFE0F\u200D\u2640\uFE0F",
556
+ guard: "\u{1F482}",
557
+ guardsman: "\u{1F482}\u200D\u2642\uFE0F",
558
+ guardswoman: "\u{1F482}\u200D\u2640\uFE0F",
559
+ ninja: "\u{1F977}",
560
+ construction_worker: "\u{1F477}",
561
+ construction_worker_man: "\u{1F477}\u200D\u2642\uFE0F",
562
+ construction_worker_woman: "\u{1F477}\u200D\u2640\uFE0F",
563
+ person_with_crown: "\u{1FAC5}",
564
+ prince: "\u{1F934}",
565
+ princess: "\u{1F478}",
566
+ person_with_turban: "\u{1F473}",
567
+ man_with_turban: "\u{1F473}\u200D\u2642\uFE0F",
568
+ woman_with_turban: "\u{1F473}\u200D\u2640\uFE0F",
569
+ man_with_gua_pi_mao: "\u{1F472}",
570
+ woman_with_headscarf: "\u{1F9D5}",
571
+ person_in_tuxedo: "\u{1F935}",
572
+ man_in_tuxedo: "\u{1F935}\u200D\u2642\uFE0F",
573
+ woman_in_tuxedo: "\u{1F935}\u200D\u2640\uFE0F",
574
+ person_with_veil: "\u{1F470}",
575
+ man_with_veil: "\u{1F470}\u200D\u2642\uFE0F",
576
+ woman_with_veil: "\u{1F470}\u200D\u2640\uFE0F",
577
+ bride_with_veil: "\u{1F470}\u200D\u2640\uFE0F",
578
+ pregnant_woman: "\u{1F930}",
579
+ pregnant_man: "\u{1FAC3}",
580
+ pregnant_person: "\u{1FAC4}",
581
+ breast_feeding: "\u{1F931}",
582
+ woman_feeding_baby: "\u{1F469}\u200D\u{1F37C}",
583
+ man_feeding_baby: "\u{1F468}\u200D\u{1F37C}",
584
+ person_feeding_baby: "\u{1F9D1}\u200D\u{1F37C}",
585
+ angel: "\u{1F47C}",
586
+ santa: "\u{1F385}",
587
+ mrs_claus: "\u{1F936}",
588
+ mx_claus: "\u{1F9D1}\u200D\u{1F384}",
589
+ superhero: "\u{1F9B8}",
590
+ superhero_man: "\u{1F9B8}\u200D\u2642\uFE0F",
591
+ superhero_woman: "\u{1F9B8}\u200D\u2640\uFE0F",
592
+ supervillain: "\u{1F9B9}",
593
+ supervillain_man: "\u{1F9B9}\u200D\u2642\uFE0F",
594
+ supervillain_woman: "\u{1F9B9}\u200D\u2640\uFE0F",
595
+ mage: "\u{1F9D9}",
596
+ mage_man: "\u{1F9D9}\u200D\u2642\uFE0F",
597
+ mage_woman: "\u{1F9D9}\u200D\u2640\uFE0F",
598
+ fairy: "\u{1F9DA}",
599
+ fairy_man: "\u{1F9DA}\u200D\u2642\uFE0F",
600
+ fairy_woman: "\u{1F9DA}\u200D\u2640\uFE0F",
601
+ vampire: "\u{1F9DB}",
602
+ vampire_man: "\u{1F9DB}\u200D\u2642\uFE0F",
603
+ vampire_woman: "\u{1F9DB}\u200D\u2640\uFE0F",
604
+ merperson: "\u{1F9DC}",
605
+ merman: "\u{1F9DC}\u200D\u2642\uFE0F",
606
+ mermaid: "\u{1F9DC}\u200D\u2640\uFE0F",
607
+ elf: "\u{1F9DD}",
608
+ elf_man: "\u{1F9DD}\u200D\u2642\uFE0F",
609
+ elf_woman: "\u{1F9DD}\u200D\u2640\uFE0F",
610
+ genie: "\u{1F9DE}",
611
+ genie_man: "\u{1F9DE}\u200D\u2642\uFE0F",
612
+ genie_woman: "\u{1F9DE}\u200D\u2640\uFE0F",
613
+ zombie: "\u{1F9DF}",
614
+ zombie_man: "\u{1F9DF}\u200D\u2642\uFE0F",
615
+ zombie_woman: "\u{1F9DF}\u200D\u2640\uFE0F",
616
+ troll: "\u{1F9CC}",
617
+ massage: "\u{1F486}",
618
+ massage_man: "\u{1F486}\u200D\u2642\uFE0F",
619
+ massage_woman: "\u{1F486}\u200D\u2640\uFE0F",
620
+ haircut: "\u{1F487}",
621
+ haircut_man: "\u{1F487}\u200D\u2642\uFE0F",
622
+ haircut_woman: "\u{1F487}\u200D\u2640\uFE0F",
623
+ walking: "\u{1F6B6}",
624
+ walking_man: "\u{1F6B6}\u200D\u2642\uFE0F",
625
+ walking_woman: "\u{1F6B6}\u200D\u2640\uFE0F",
626
+ standing_person: "\u{1F9CD}",
627
+ standing_man: "\u{1F9CD}\u200D\u2642\uFE0F",
628
+ standing_woman: "\u{1F9CD}\u200D\u2640\uFE0F",
629
+ kneeling_person: "\u{1F9CE}",
630
+ kneeling_man: "\u{1F9CE}\u200D\u2642\uFE0F",
631
+ kneeling_woman: "\u{1F9CE}\u200D\u2640\uFE0F",
632
+ person_with_probing_cane: "\u{1F9D1}\u200D\u{1F9AF}",
633
+ man_with_probing_cane: "\u{1F468}\u200D\u{1F9AF}",
634
+ woman_with_probing_cane: "\u{1F469}\u200D\u{1F9AF}",
635
+ person_in_motorized_wheelchair: "\u{1F9D1}\u200D\u{1F9BC}",
636
+ man_in_motorized_wheelchair: "\u{1F468}\u200D\u{1F9BC}",
637
+ woman_in_motorized_wheelchair: "\u{1F469}\u200D\u{1F9BC}",
638
+ person_in_manual_wheelchair: "\u{1F9D1}\u200D\u{1F9BD}",
639
+ man_in_manual_wheelchair: "\u{1F468}\u200D\u{1F9BD}",
640
+ woman_in_manual_wheelchair: "\u{1F469}\u200D\u{1F9BD}",
641
+ runner: "\u{1F3C3}",
642
+ running: "\u{1F3C3}",
643
+ running_man: "\u{1F3C3}\u200D\u2642\uFE0F",
644
+ running_woman: "\u{1F3C3}\u200D\u2640\uFE0F",
645
+ woman_dancing: "\u{1F483}",
646
+ dancer: "\u{1F483}",
647
+ man_dancing: "\u{1F57A}",
648
+ business_suit_levitating: "\u{1F574}\uFE0F",
649
+ dancers: "\u{1F46F}",
650
+ dancing_men: "\u{1F46F}\u200D\u2642\uFE0F",
651
+ dancing_women: "\u{1F46F}\u200D\u2640\uFE0F",
652
+ sauna_person: "\u{1F9D6}",
653
+ sauna_man: "\u{1F9D6}\u200D\u2642\uFE0F",
654
+ sauna_woman: "\u{1F9D6}\u200D\u2640\uFE0F",
655
+ climbing: "\u{1F9D7}",
656
+ climbing_man: "\u{1F9D7}\u200D\u2642\uFE0F",
657
+ climbing_woman: "\u{1F9D7}\u200D\u2640\uFE0F",
658
+ person_fencing: "\u{1F93A}",
659
+ horse_racing: "\u{1F3C7}",
660
+ skier: "\u26F7\uFE0F",
661
+ snowboarder: "\u{1F3C2}",
662
+ golfing: "\u{1F3CC}\uFE0F",
663
+ golfing_man: "\u{1F3CC}\uFE0F\u200D\u2642\uFE0F",
664
+ golfing_woman: "\u{1F3CC}\uFE0F\u200D\u2640\uFE0F",
665
+ surfer: "\u{1F3C4}",
666
+ surfing_man: "\u{1F3C4}\u200D\u2642\uFE0F",
667
+ surfing_woman: "\u{1F3C4}\u200D\u2640\uFE0F",
668
+ rowboat: "\u{1F6A3}",
669
+ rowing_man: "\u{1F6A3}\u200D\u2642\uFE0F",
670
+ rowing_woman: "\u{1F6A3}\u200D\u2640\uFE0F",
671
+ swimmer: "\u{1F3CA}",
672
+ swimming_man: "\u{1F3CA}\u200D\u2642\uFE0F",
673
+ swimming_woman: "\u{1F3CA}\u200D\u2640\uFE0F",
674
+ bouncing_ball_person: "\u26F9\uFE0F",
675
+ bouncing_ball_man: "\u26F9\uFE0F\u200D\u2642\uFE0F",
676
+ basketball_man: "\u26F9\uFE0F\u200D\u2642\uFE0F",
677
+ bouncing_ball_woman: "\u26F9\uFE0F\u200D\u2640\uFE0F",
678
+ basketball_woman: "\u26F9\uFE0F\u200D\u2640\uFE0F",
679
+ weight_lifting: "\u{1F3CB}\uFE0F",
680
+ weight_lifting_man: "\u{1F3CB}\uFE0F\u200D\u2642\uFE0F",
681
+ weight_lifting_woman: "\u{1F3CB}\uFE0F\u200D\u2640\uFE0F",
682
+ bicyclist: "\u{1F6B4}",
683
+ biking_man: "\u{1F6B4}\u200D\u2642\uFE0F",
684
+ biking_woman: "\u{1F6B4}\u200D\u2640\uFE0F",
685
+ mountain_bicyclist: "\u{1F6B5}",
686
+ mountain_biking_man: "\u{1F6B5}\u200D\u2642\uFE0F",
687
+ mountain_biking_woman: "\u{1F6B5}\u200D\u2640\uFE0F",
688
+ cartwheeling: "\u{1F938}",
689
+ man_cartwheeling: "\u{1F938}\u200D\u2642\uFE0F",
690
+ woman_cartwheeling: "\u{1F938}\u200D\u2640\uFE0F",
691
+ wrestling: "\u{1F93C}",
692
+ men_wrestling: "\u{1F93C}\u200D\u2642\uFE0F",
693
+ women_wrestling: "\u{1F93C}\u200D\u2640\uFE0F",
694
+ water_polo: "\u{1F93D}",
695
+ man_playing_water_polo: "\u{1F93D}\u200D\u2642\uFE0F",
696
+ woman_playing_water_polo: "\u{1F93D}\u200D\u2640\uFE0F",
697
+ handball_person: "\u{1F93E}",
698
+ man_playing_handball: "\u{1F93E}\u200D\u2642\uFE0F",
699
+ woman_playing_handball: "\u{1F93E}\u200D\u2640\uFE0F",
700
+ juggling_person: "\u{1F939}",
701
+ man_juggling: "\u{1F939}\u200D\u2642\uFE0F",
702
+ woman_juggling: "\u{1F939}\u200D\u2640\uFE0F",
703
+ lotus_position: "\u{1F9D8}",
704
+ lotus_position_man: "\u{1F9D8}\u200D\u2642\uFE0F",
705
+ lotus_position_woman: "\u{1F9D8}\u200D\u2640\uFE0F",
706
+ bath: "\u{1F6C0}",
707
+ sleeping_bed: "\u{1F6CC}",
708
+ people_holding_hands: "\u{1F9D1}\u200D\u{1F91D}\u200D\u{1F9D1}",
709
+ two_women_holding_hands: "\u{1F46D}",
710
+ couple: "\u{1F46B}",
711
+ two_men_holding_hands: "\u{1F46C}",
712
+ couplekiss: "\u{1F48F}",
713
+ couplekiss_man_woman: "\u{1F469}\u200D\u2764\uFE0F\u200D\u{1F48B}\u200D\u{1F468}",
714
+ couplekiss_man_man: "\u{1F468}\u200D\u2764\uFE0F\u200D\u{1F48B}\u200D\u{1F468}",
715
+ couplekiss_woman_woman: "\u{1F469}\u200D\u2764\uFE0F\u200D\u{1F48B}\u200D\u{1F469}",
716
+ couple_with_heart: "\u{1F491}",
717
+ couple_with_heart_woman_man: "\u{1F469}\u200D\u2764\uFE0F\u200D\u{1F468}",
718
+ couple_with_heart_man_man: "\u{1F468}\u200D\u2764\uFE0F\u200D\u{1F468}",
719
+ couple_with_heart_woman_woman: "\u{1F469}\u200D\u2764\uFE0F\u200D\u{1F469}",
720
+ family: "\u{1F46A}",
721
+ family_man_woman_boy: "\u{1F468}\u200D\u{1F469}\u200D\u{1F466}",
722
+ family_man_woman_girl: "\u{1F468}\u200D\u{1F469}\u200D\u{1F467}",
723
+ family_man_woman_girl_boy: "\u{1F468}\u200D\u{1F469}\u200D\u{1F467}\u200D\u{1F466}",
724
+ family_man_woman_boy_boy: "\u{1F468}\u200D\u{1F469}\u200D\u{1F466}\u200D\u{1F466}",
725
+ family_man_woman_girl_girl: "\u{1F468}\u200D\u{1F469}\u200D\u{1F467}\u200D\u{1F467}",
726
+ family_man_man_boy: "\u{1F468}\u200D\u{1F468}\u200D\u{1F466}",
727
+ family_man_man_girl: "\u{1F468}\u200D\u{1F468}\u200D\u{1F467}",
728
+ family_man_man_girl_boy: "\u{1F468}\u200D\u{1F468}\u200D\u{1F467}\u200D\u{1F466}",
729
+ family_man_man_boy_boy: "\u{1F468}\u200D\u{1F468}\u200D\u{1F466}\u200D\u{1F466}",
730
+ family_man_man_girl_girl: "\u{1F468}\u200D\u{1F468}\u200D\u{1F467}\u200D\u{1F467}",
731
+ family_woman_woman_boy: "\u{1F469}\u200D\u{1F469}\u200D\u{1F466}",
732
+ family_woman_woman_girl: "\u{1F469}\u200D\u{1F469}\u200D\u{1F467}",
733
+ family_woman_woman_girl_boy: "\u{1F469}\u200D\u{1F469}\u200D\u{1F467}\u200D\u{1F466}",
734
+ family_woman_woman_boy_boy: "\u{1F469}\u200D\u{1F469}\u200D\u{1F466}\u200D\u{1F466}",
735
+ family_woman_woman_girl_girl: "\u{1F469}\u200D\u{1F469}\u200D\u{1F467}\u200D\u{1F467}",
736
+ family_man_boy: "\u{1F468}\u200D\u{1F466}",
737
+ family_man_boy_boy: "\u{1F468}\u200D\u{1F466}\u200D\u{1F466}",
738
+ family_man_girl: "\u{1F468}\u200D\u{1F467}",
739
+ family_man_girl_boy: "\u{1F468}\u200D\u{1F467}\u200D\u{1F466}",
740
+ family_man_girl_girl: "\u{1F468}\u200D\u{1F467}\u200D\u{1F467}",
741
+ family_woman_boy: "\u{1F469}\u200D\u{1F466}",
742
+ family_woman_boy_boy: "\u{1F469}\u200D\u{1F466}\u200D\u{1F466}",
743
+ family_woman_girl: "\u{1F469}\u200D\u{1F467}",
744
+ family_woman_girl_boy: "\u{1F469}\u200D\u{1F467}\u200D\u{1F466}",
745
+ family_woman_girl_girl: "\u{1F469}\u200D\u{1F467}\u200D\u{1F467}",
746
+ speaking_head: "\u{1F5E3}\uFE0F",
747
+ bust_in_silhouette: "\u{1F464}",
748
+ busts_in_silhouette: "\u{1F465}",
749
+ people_hugging: "\u{1FAC2}",
750
+ footprints: "\u{1F463}",
751
+ monkey_face: "\u{1F435}",
752
+ monkey: "\u{1F412}",
753
+ gorilla: "\u{1F98D}",
754
+ orangutan: "\u{1F9A7}",
755
+ dog: "\u{1F436}",
756
+ dog2: "\u{1F415}",
757
+ guide_dog: "\u{1F9AE}",
758
+ service_dog: "\u{1F415}\u200D\u{1F9BA}",
759
+ poodle: "\u{1F429}",
760
+ wolf: "\u{1F43A}",
761
+ fox_face: "\u{1F98A}",
762
+ raccoon: "\u{1F99D}",
763
+ cat: "\u{1F431}",
764
+ cat2: "\u{1F408}",
765
+ black_cat: "\u{1F408}\u200D\u2B1B",
766
+ lion: "\u{1F981}",
767
+ tiger: "\u{1F42F}",
768
+ tiger2: "\u{1F405}",
769
+ leopard: "\u{1F406}",
770
+ horse: "\u{1F434}",
771
+ moose: "\u{1FACE}",
772
+ donkey: "\u{1FACF}",
773
+ racehorse: "\u{1F40E}",
774
+ unicorn: "\u{1F984}",
775
+ zebra: "\u{1F993}",
776
+ deer: "\u{1F98C}",
777
+ bison: "\u{1F9AC}",
778
+ cow: "\u{1F42E}",
779
+ ox: "\u{1F402}",
780
+ water_buffalo: "\u{1F403}",
781
+ cow2: "\u{1F404}",
782
+ pig: "\u{1F437}",
783
+ pig2: "\u{1F416}",
784
+ boar: "\u{1F417}",
785
+ pig_nose: "\u{1F43D}",
786
+ ram: "\u{1F40F}",
787
+ sheep: "\u{1F411}",
788
+ goat: "\u{1F410}",
789
+ dromedary_camel: "\u{1F42A}",
790
+ camel: "\u{1F42B}",
791
+ llama: "\u{1F999}",
792
+ giraffe: "\u{1F992}",
793
+ elephant: "\u{1F418}",
794
+ mammoth: "\u{1F9A3}",
795
+ rhinoceros: "\u{1F98F}",
796
+ hippopotamus: "\u{1F99B}",
797
+ mouse: "\u{1F42D}",
798
+ mouse2: "\u{1F401}",
799
+ rat: "\u{1F400}",
800
+ hamster: "\u{1F439}",
801
+ rabbit: "\u{1F430}",
802
+ rabbit2: "\u{1F407}",
803
+ chipmunk: "\u{1F43F}\uFE0F",
804
+ beaver: "\u{1F9AB}",
805
+ hedgehog: "\u{1F994}",
806
+ bat: "\u{1F987}",
807
+ bear: "\u{1F43B}",
808
+ polar_bear: "\u{1F43B}\u200D\u2744\uFE0F",
809
+ koala: "\u{1F428}",
810
+ panda_face: "\u{1F43C}",
811
+ sloth: "\u{1F9A5}",
812
+ otter: "\u{1F9A6}",
813
+ skunk: "\u{1F9A8}",
814
+ kangaroo: "\u{1F998}",
815
+ badger: "\u{1F9A1}",
816
+ feet: "\u{1F43E}",
817
+ paw_prints: "\u{1F43E}",
818
+ turkey: "\u{1F983}",
819
+ chicken: "\u{1F414}",
820
+ rooster: "\u{1F413}",
821
+ hatching_chick: "\u{1F423}",
822
+ baby_chick: "\u{1F424}",
823
+ hatched_chick: "\u{1F425}",
824
+ bird: "\u{1F426}",
825
+ penguin: "\u{1F427}",
826
+ dove: "\u{1F54A}\uFE0F",
827
+ eagle: "\u{1F985}",
828
+ duck: "\u{1F986}",
829
+ swan: "\u{1F9A2}",
830
+ owl: "\u{1F989}",
831
+ dodo: "\u{1F9A4}",
832
+ feather: "\u{1FAB6}",
833
+ flamingo: "\u{1F9A9}",
834
+ peacock: "\u{1F99A}",
835
+ parrot: "\u{1F99C}",
836
+ wing: "\u{1FABD}",
837
+ black_bird: "\u{1F426}\u200D\u2B1B",
838
+ goose: "\u{1FABF}",
839
+ frog: "\u{1F438}",
840
+ crocodile: "\u{1F40A}",
841
+ turtle: "\u{1F422}",
842
+ lizard: "\u{1F98E}",
843
+ snake: "\u{1F40D}",
844
+ dragon_face: "\u{1F432}",
845
+ dragon: "\u{1F409}",
846
+ sauropod: "\u{1F995}",
847
+ "t-rex": "\u{1F996}",
848
+ whale: "\u{1F433}",
849
+ whale2: "\u{1F40B}",
850
+ dolphin: "\u{1F42C}",
851
+ flipper: "\u{1F42C}",
852
+ seal: "\u{1F9AD}",
853
+ fish: "\u{1F41F}",
854
+ tropical_fish: "\u{1F420}",
855
+ blowfish: "\u{1F421}",
856
+ shark: "\u{1F988}",
857
+ octopus: "\u{1F419}",
858
+ shell: "\u{1F41A}",
859
+ coral: "\u{1FAB8}",
860
+ jellyfish: "\u{1FABC}",
861
+ snail: "\u{1F40C}",
862
+ butterfly: "\u{1F98B}",
863
+ bug: "\u{1F41B}",
864
+ ant: "\u{1F41C}",
865
+ bee: "\u{1F41D}",
866
+ honeybee: "\u{1F41D}",
867
+ beetle: "\u{1FAB2}",
868
+ lady_beetle: "\u{1F41E}",
869
+ cricket: "\u{1F997}",
870
+ cockroach: "\u{1FAB3}",
871
+ spider: "\u{1F577}\uFE0F",
872
+ spider_web: "\u{1F578}\uFE0F",
873
+ scorpion: "\u{1F982}",
874
+ mosquito: "\u{1F99F}",
875
+ fly: "\u{1FAB0}",
876
+ worm: "\u{1FAB1}",
877
+ microbe: "\u{1F9A0}",
878
+ bouquet: "\u{1F490}",
879
+ cherry_blossom: "\u{1F338}",
880
+ white_flower: "\u{1F4AE}",
881
+ lotus: "\u{1FAB7}",
882
+ rosette: "\u{1F3F5}\uFE0F",
883
+ rose: "\u{1F339}",
884
+ wilted_flower: "\u{1F940}",
885
+ hibiscus: "\u{1F33A}",
886
+ sunflower: "\u{1F33B}",
887
+ blossom: "\u{1F33C}",
888
+ tulip: "\u{1F337}",
889
+ hyacinth: "\u{1FABB}",
890
+ seedling: "\u{1F331}",
891
+ potted_plant: "\u{1FAB4}",
892
+ evergreen_tree: "\u{1F332}",
893
+ deciduous_tree: "\u{1F333}",
894
+ palm_tree: "\u{1F334}",
895
+ cactus: "\u{1F335}",
896
+ ear_of_rice: "\u{1F33E}",
897
+ herb: "\u{1F33F}",
898
+ shamrock: "\u2618\uFE0F",
899
+ four_leaf_clover: "\u{1F340}",
900
+ maple_leaf: "\u{1F341}",
901
+ fallen_leaf: "\u{1F342}",
902
+ leaves: "\u{1F343}",
903
+ empty_nest: "\u{1FAB9}",
904
+ nest_with_eggs: "\u{1FABA}",
905
+ mushroom: "\u{1F344}",
906
+ grapes: "\u{1F347}",
907
+ melon: "\u{1F348}",
908
+ watermelon: "\u{1F349}",
909
+ tangerine: "\u{1F34A}",
910
+ orange: "\u{1F34A}",
911
+ mandarin: "\u{1F34A}",
912
+ lemon: "\u{1F34B}",
913
+ banana: "\u{1F34C}",
914
+ pineapple: "\u{1F34D}",
915
+ mango: "\u{1F96D}",
916
+ apple: "\u{1F34E}",
917
+ green_apple: "\u{1F34F}",
918
+ pear: "\u{1F350}",
919
+ peach: "\u{1F351}",
920
+ cherries: "\u{1F352}",
921
+ strawberry: "\u{1F353}",
922
+ blueberries: "\u{1FAD0}",
923
+ kiwi_fruit: "\u{1F95D}",
924
+ tomato: "\u{1F345}",
925
+ olive: "\u{1FAD2}",
926
+ coconut: "\u{1F965}",
927
+ avocado: "\u{1F951}",
928
+ eggplant: "\u{1F346}",
929
+ potato: "\u{1F954}",
930
+ carrot: "\u{1F955}",
931
+ corn: "\u{1F33D}",
932
+ hot_pepper: "\u{1F336}\uFE0F",
933
+ bell_pepper: "\u{1FAD1}",
934
+ cucumber: "\u{1F952}",
935
+ leafy_green: "\u{1F96C}",
936
+ broccoli: "\u{1F966}",
937
+ garlic: "\u{1F9C4}",
938
+ onion: "\u{1F9C5}",
939
+ peanuts: "\u{1F95C}",
940
+ beans: "\u{1FAD8}",
941
+ chestnut: "\u{1F330}",
942
+ ginger_root: "\u{1FADA}",
943
+ pea_pod: "\u{1FADB}",
944
+ bread: "\u{1F35E}",
945
+ croissant: "\u{1F950}",
946
+ baguette_bread: "\u{1F956}",
947
+ flatbread: "\u{1FAD3}",
948
+ pretzel: "\u{1F968}",
949
+ bagel: "\u{1F96F}",
950
+ pancakes: "\u{1F95E}",
951
+ waffle: "\u{1F9C7}",
952
+ cheese: "\u{1F9C0}",
953
+ meat_on_bone: "\u{1F356}",
954
+ poultry_leg: "\u{1F357}",
955
+ cut_of_meat: "\u{1F969}",
956
+ bacon: "\u{1F953}",
957
+ hamburger: "\u{1F354}",
958
+ fries: "\u{1F35F}",
959
+ pizza: "\u{1F355}",
960
+ hotdog: "\u{1F32D}",
961
+ sandwich: "\u{1F96A}",
962
+ taco: "\u{1F32E}",
963
+ burrito: "\u{1F32F}",
964
+ tamale: "\u{1FAD4}",
965
+ stuffed_flatbread: "\u{1F959}",
966
+ falafel: "\u{1F9C6}",
967
+ egg: "\u{1F95A}",
968
+ fried_egg: "\u{1F373}",
969
+ shallow_pan_of_food: "\u{1F958}",
970
+ stew: "\u{1F372}",
971
+ fondue: "\u{1FAD5}",
972
+ bowl_with_spoon: "\u{1F963}",
973
+ green_salad: "\u{1F957}",
974
+ popcorn: "\u{1F37F}",
975
+ butter: "\u{1F9C8}",
976
+ salt: "\u{1F9C2}",
977
+ canned_food: "\u{1F96B}",
978
+ bento: "\u{1F371}",
979
+ rice_cracker: "\u{1F358}",
980
+ rice_ball: "\u{1F359}",
981
+ rice: "\u{1F35A}",
982
+ curry: "\u{1F35B}",
983
+ ramen: "\u{1F35C}",
984
+ spaghetti: "\u{1F35D}",
985
+ sweet_potato: "\u{1F360}",
986
+ oden: "\u{1F362}",
987
+ sushi: "\u{1F363}",
988
+ fried_shrimp: "\u{1F364}",
989
+ fish_cake: "\u{1F365}",
990
+ moon_cake: "\u{1F96E}",
991
+ dango: "\u{1F361}",
992
+ dumpling: "\u{1F95F}",
993
+ fortune_cookie: "\u{1F960}",
994
+ takeout_box: "\u{1F961}",
995
+ crab: "\u{1F980}",
996
+ lobster: "\u{1F99E}",
997
+ shrimp: "\u{1F990}",
998
+ squid: "\u{1F991}",
999
+ oyster: "\u{1F9AA}",
1000
+ icecream: "\u{1F366}",
1001
+ shaved_ice: "\u{1F367}",
1002
+ ice_cream: "\u{1F368}",
1003
+ doughnut: "\u{1F369}",
1004
+ cookie: "\u{1F36A}",
1005
+ birthday: "\u{1F382}",
1006
+ cake: "\u{1F370}",
1007
+ cupcake: "\u{1F9C1}",
1008
+ pie: "\u{1F967}",
1009
+ chocolate_bar: "\u{1F36B}",
1010
+ candy: "\u{1F36C}",
1011
+ lollipop: "\u{1F36D}",
1012
+ custard: "\u{1F36E}",
1013
+ honey_pot: "\u{1F36F}",
1014
+ baby_bottle: "\u{1F37C}",
1015
+ milk_glass: "\u{1F95B}",
1016
+ coffee: "\u2615",
1017
+ teapot: "\u{1FAD6}",
1018
+ tea: "\u{1F375}",
1019
+ sake: "\u{1F376}",
1020
+ champagne: "\u{1F37E}",
1021
+ wine_glass: "\u{1F377}",
1022
+ cocktail: "\u{1F378}",
1023
+ tropical_drink: "\u{1F379}",
1024
+ beer: "\u{1F37A}",
1025
+ beers: "\u{1F37B}",
1026
+ clinking_glasses: "\u{1F942}",
1027
+ tumbler_glass: "\u{1F943}",
1028
+ pouring_liquid: "\u{1FAD7}",
1029
+ cup_with_straw: "\u{1F964}",
1030
+ bubble_tea: "\u{1F9CB}",
1031
+ beverage_box: "\u{1F9C3}",
1032
+ mate: "\u{1F9C9}",
1033
+ ice_cube: "\u{1F9CA}",
1034
+ chopsticks: "\u{1F962}",
1035
+ plate_with_cutlery: "\u{1F37D}\uFE0F",
1036
+ fork_and_knife: "\u{1F374}",
1037
+ spoon: "\u{1F944}",
1038
+ hocho: "\u{1F52A}",
1039
+ knife: "\u{1F52A}",
1040
+ jar: "\u{1FAD9}",
1041
+ amphora: "\u{1F3FA}",
1042
+ earth_africa: "\u{1F30D}",
1043
+ earth_americas: "\u{1F30E}",
1044
+ earth_asia: "\u{1F30F}",
1045
+ globe_with_meridians: "\u{1F310}",
1046
+ world_map: "\u{1F5FA}\uFE0F",
1047
+ japan: "\u{1F5FE}",
1048
+ compass: "\u{1F9ED}",
1049
+ mountain_snow: "\u{1F3D4}\uFE0F",
1050
+ mountain: "\u26F0\uFE0F",
1051
+ volcano: "\u{1F30B}",
1052
+ mount_fuji: "\u{1F5FB}",
1053
+ camping: "\u{1F3D5}\uFE0F",
1054
+ beach_umbrella: "\u{1F3D6}\uFE0F",
1055
+ desert: "\u{1F3DC}\uFE0F",
1056
+ desert_island: "\u{1F3DD}\uFE0F",
1057
+ national_park: "\u{1F3DE}\uFE0F",
1058
+ stadium: "\u{1F3DF}\uFE0F",
1059
+ classical_building: "\u{1F3DB}\uFE0F",
1060
+ building_construction: "\u{1F3D7}\uFE0F",
1061
+ bricks: "\u{1F9F1}",
1062
+ rock: "\u{1FAA8}",
1063
+ wood: "\u{1FAB5}",
1064
+ hut: "\u{1F6D6}",
1065
+ houses: "\u{1F3D8}\uFE0F",
1066
+ derelict_house: "\u{1F3DA}\uFE0F",
1067
+ house: "\u{1F3E0}",
1068
+ house_with_garden: "\u{1F3E1}",
1069
+ office: "\u{1F3E2}",
1070
+ post_office: "\u{1F3E3}",
1071
+ european_post_office: "\u{1F3E4}",
1072
+ hospital: "\u{1F3E5}",
1073
+ bank: "\u{1F3E6}",
1074
+ hotel: "\u{1F3E8}",
1075
+ love_hotel: "\u{1F3E9}",
1076
+ convenience_store: "\u{1F3EA}",
1077
+ school: "\u{1F3EB}",
1078
+ department_store: "\u{1F3EC}",
1079
+ factory: "\u{1F3ED}",
1080
+ japanese_castle: "\u{1F3EF}",
1081
+ european_castle: "\u{1F3F0}",
1082
+ wedding: "\u{1F492}",
1083
+ tokyo_tower: "\u{1F5FC}",
1084
+ statue_of_liberty: "\u{1F5FD}",
1085
+ church: "\u26EA",
1086
+ mosque: "\u{1F54C}",
1087
+ hindu_temple: "\u{1F6D5}",
1088
+ synagogue: "\u{1F54D}",
1089
+ shinto_shrine: "\u26E9\uFE0F",
1090
+ kaaba: "\u{1F54B}",
1091
+ fountain: "\u26F2",
1092
+ tent: "\u26FA",
1093
+ foggy: "\u{1F301}",
1094
+ night_with_stars: "\u{1F303}",
1095
+ cityscape: "\u{1F3D9}\uFE0F",
1096
+ sunrise_over_mountains: "\u{1F304}",
1097
+ sunrise: "\u{1F305}",
1098
+ city_sunset: "\u{1F306}",
1099
+ city_sunrise: "\u{1F307}",
1100
+ bridge_at_night: "\u{1F309}",
1101
+ hotsprings: "\u2668\uFE0F",
1102
+ carousel_horse: "\u{1F3A0}",
1103
+ playground_slide: "\u{1F6DD}",
1104
+ ferris_wheel: "\u{1F3A1}",
1105
+ roller_coaster: "\u{1F3A2}",
1106
+ barber: "\u{1F488}",
1107
+ circus_tent: "\u{1F3AA}",
1108
+ steam_locomotive: "\u{1F682}",
1109
+ railway_car: "\u{1F683}",
1110
+ bullettrain_side: "\u{1F684}",
1111
+ bullettrain_front: "\u{1F685}",
1112
+ train2: "\u{1F686}",
1113
+ metro: "\u{1F687}",
1114
+ light_rail: "\u{1F688}",
1115
+ station: "\u{1F689}",
1116
+ tram: "\u{1F68A}",
1117
+ monorail: "\u{1F69D}",
1118
+ mountain_railway: "\u{1F69E}",
1119
+ train: "\u{1F68B}",
1120
+ bus: "\u{1F68C}",
1121
+ oncoming_bus: "\u{1F68D}",
1122
+ trolleybus: "\u{1F68E}",
1123
+ minibus: "\u{1F690}",
1124
+ ambulance: "\u{1F691}",
1125
+ fire_engine: "\u{1F692}",
1126
+ police_car: "\u{1F693}",
1127
+ oncoming_police_car: "\u{1F694}",
1128
+ taxi: "\u{1F695}",
1129
+ oncoming_taxi: "\u{1F696}",
1130
+ car: "\u{1F697}",
1131
+ red_car: "\u{1F697}",
1132
+ oncoming_automobile: "\u{1F698}",
1133
+ blue_car: "\u{1F699}",
1134
+ pickup_truck: "\u{1F6FB}",
1135
+ truck: "\u{1F69A}",
1136
+ articulated_lorry: "\u{1F69B}",
1137
+ tractor: "\u{1F69C}",
1138
+ racing_car: "\u{1F3CE}\uFE0F",
1139
+ motorcycle: "\u{1F3CD}\uFE0F",
1140
+ motor_scooter: "\u{1F6F5}",
1141
+ manual_wheelchair: "\u{1F9BD}",
1142
+ motorized_wheelchair: "\u{1F9BC}",
1143
+ auto_rickshaw: "\u{1F6FA}",
1144
+ bike: "\u{1F6B2}",
1145
+ kick_scooter: "\u{1F6F4}",
1146
+ skateboard: "\u{1F6F9}",
1147
+ roller_skate: "\u{1F6FC}",
1148
+ busstop: "\u{1F68F}",
1149
+ motorway: "\u{1F6E3}\uFE0F",
1150
+ railway_track: "\u{1F6E4}\uFE0F",
1151
+ oil_drum: "\u{1F6E2}\uFE0F",
1152
+ fuelpump: "\u26FD",
1153
+ wheel: "\u{1F6DE}",
1154
+ rotating_light: "\u{1F6A8}",
1155
+ traffic_light: "\u{1F6A5}",
1156
+ vertical_traffic_light: "\u{1F6A6}",
1157
+ stop_sign: "\u{1F6D1}",
1158
+ construction: "\u{1F6A7}",
1159
+ anchor: "\u2693",
1160
+ ring_buoy: "\u{1F6DF}",
1161
+ boat: "\u26F5",
1162
+ sailboat: "\u26F5",
1163
+ canoe: "\u{1F6F6}",
1164
+ speedboat: "\u{1F6A4}",
1165
+ passenger_ship: "\u{1F6F3}\uFE0F",
1166
+ ferry: "\u26F4\uFE0F",
1167
+ motor_boat: "\u{1F6E5}\uFE0F",
1168
+ ship: "\u{1F6A2}",
1169
+ airplane: "\u2708\uFE0F",
1170
+ small_airplane: "\u{1F6E9}\uFE0F",
1171
+ flight_departure: "\u{1F6EB}",
1172
+ flight_arrival: "\u{1F6EC}",
1173
+ parachute: "\u{1FA82}",
1174
+ seat: "\u{1F4BA}",
1175
+ helicopter: "\u{1F681}",
1176
+ suspension_railway: "\u{1F69F}",
1177
+ mountain_cableway: "\u{1F6A0}",
1178
+ aerial_tramway: "\u{1F6A1}",
1179
+ artificial_satellite: "\u{1F6F0}\uFE0F",
1180
+ rocket: "\u{1F680}",
1181
+ flying_saucer: "\u{1F6F8}",
1182
+ bellhop_bell: "\u{1F6CE}\uFE0F",
1183
+ luggage: "\u{1F9F3}",
1184
+ hourglass: "\u231B",
1185
+ hourglass_flowing_sand: "\u23F3",
1186
+ watch: "\u231A",
1187
+ alarm_clock: "\u23F0",
1188
+ stopwatch: "\u23F1\uFE0F",
1189
+ timer_clock: "\u23F2\uFE0F",
1190
+ mantelpiece_clock: "\u{1F570}\uFE0F",
1191
+ clock12: "\u{1F55B}",
1192
+ clock1230: "\u{1F567}",
1193
+ clock1: "\u{1F550}",
1194
+ clock130: "\u{1F55C}",
1195
+ clock2: "\u{1F551}",
1196
+ clock230: "\u{1F55D}",
1197
+ clock3: "\u{1F552}",
1198
+ clock330: "\u{1F55E}",
1199
+ clock4: "\u{1F553}",
1200
+ clock430: "\u{1F55F}",
1201
+ clock5: "\u{1F554}",
1202
+ clock530: "\u{1F560}",
1203
+ clock6: "\u{1F555}",
1204
+ clock630: "\u{1F561}",
1205
+ clock7: "\u{1F556}",
1206
+ clock730: "\u{1F562}",
1207
+ clock8: "\u{1F557}",
1208
+ clock830: "\u{1F563}",
1209
+ clock9: "\u{1F558}",
1210
+ clock930: "\u{1F564}",
1211
+ clock10: "\u{1F559}",
1212
+ clock1030: "\u{1F565}",
1213
+ clock11: "\u{1F55A}",
1214
+ clock1130: "\u{1F566}",
1215
+ new_moon: "\u{1F311}",
1216
+ waxing_crescent_moon: "\u{1F312}",
1217
+ first_quarter_moon: "\u{1F313}",
1218
+ moon: "\u{1F314}",
1219
+ waxing_gibbous_moon: "\u{1F314}",
1220
+ full_moon: "\u{1F315}",
1221
+ waning_gibbous_moon: "\u{1F316}",
1222
+ last_quarter_moon: "\u{1F317}",
1223
+ waning_crescent_moon: "\u{1F318}",
1224
+ crescent_moon: "\u{1F319}",
1225
+ new_moon_with_face: "\u{1F31A}",
1226
+ first_quarter_moon_with_face: "\u{1F31B}",
1227
+ last_quarter_moon_with_face: "\u{1F31C}",
1228
+ thermometer: "\u{1F321}\uFE0F",
1229
+ sunny: "\u2600\uFE0F",
1230
+ full_moon_with_face: "\u{1F31D}",
1231
+ sun_with_face: "\u{1F31E}",
1232
+ ringed_planet: "\u{1FA90}",
1233
+ star: "\u2B50",
1234
+ star2: "\u{1F31F}",
1235
+ stars: "\u{1F320}",
1236
+ milky_way: "\u{1F30C}",
1237
+ cloud: "\u2601\uFE0F",
1238
+ partly_sunny: "\u26C5",
1239
+ cloud_with_lightning_and_rain: "\u26C8\uFE0F",
1240
+ sun_behind_small_cloud: "\u{1F324}\uFE0F",
1241
+ sun_behind_large_cloud: "\u{1F325}\uFE0F",
1242
+ sun_behind_rain_cloud: "\u{1F326}\uFE0F",
1243
+ cloud_with_rain: "\u{1F327}\uFE0F",
1244
+ cloud_with_snow: "\u{1F328}\uFE0F",
1245
+ cloud_with_lightning: "\u{1F329}\uFE0F",
1246
+ tornado: "\u{1F32A}\uFE0F",
1247
+ fog: "\u{1F32B}\uFE0F",
1248
+ wind_face: "\u{1F32C}\uFE0F",
1249
+ cyclone: "\u{1F300}",
1250
+ rainbow: "\u{1F308}",
1251
+ closed_umbrella: "\u{1F302}",
1252
+ open_umbrella: "\u2602\uFE0F",
1253
+ umbrella: "\u2614",
1254
+ parasol_on_ground: "\u26F1\uFE0F",
1255
+ zap: "\u26A1",
1256
+ snowflake: "\u2744\uFE0F",
1257
+ snowman_with_snow: "\u2603\uFE0F",
1258
+ snowman: "\u26C4",
1259
+ comet: "\u2604\uFE0F",
1260
+ fire: "\u{1F525}",
1261
+ droplet: "\u{1F4A7}",
1262
+ ocean: "\u{1F30A}",
1263
+ jack_o_lantern: "\u{1F383}",
1264
+ christmas_tree: "\u{1F384}",
1265
+ fireworks: "\u{1F386}",
1266
+ sparkler: "\u{1F387}",
1267
+ firecracker: "\u{1F9E8}",
1268
+ sparkles: "\u2728",
1269
+ balloon: "\u{1F388}",
1270
+ tada: "\u{1F389}",
1271
+ confetti_ball: "\u{1F38A}",
1272
+ tanabata_tree: "\u{1F38B}",
1273
+ bamboo: "\u{1F38D}",
1274
+ dolls: "\u{1F38E}",
1275
+ flags: "\u{1F38F}",
1276
+ wind_chime: "\u{1F390}",
1277
+ rice_scene: "\u{1F391}",
1278
+ red_envelope: "\u{1F9E7}",
1279
+ ribbon: "\u{1F380}",
1280
+ gift: "\u{1F381}",
1281
+ reminder_ribbon: "\u{1F397}\uFE0F",
1282
+ tickets: "\u{1F39F}\uFE0F",
1283
+ ticket: "\u{1F3AB}",
1284
+ medal_military: "\u{1F396}\uFE0F",
1285
+ trophy: "\u{1F3C6}",
1286
+ medal_sports: "\u{1F3C5}",
1287
+ "1st_place_medal": "\u{1F947}",
1288
+ "2nd_place_medal": "\u{1F948}",
1289
+ "3rd_place_medal": "\u{1F949}",
1290
+ soccer: "\u26BD",
1291
+ baseball: "\u26BE",
1292
+ softball: "\u{1F94E}",
1293
+ basketball: "\u{1F3C0}",
1294
+ volleyball: "\u{1F3D0}",
1295
+ football: "\u{1F3C8}",
1296
+ rugby_football: "\u{1F3C9}",
1297
+ tennis: "\u{1F3BE}",
1298
+ flying_disc: "\u{1F94F}",
1299
+ bowling: "\u{1F3B3}",
1300
+ cricket_game: "\u{1F3CF}",
1301
+ field_hockey: "\u{1F3D1}",
1302
+ ice_hockey: "\u{1F3D2}",
1303
+ lacrosse: "\u{1F94D}",
1304
+ ping_pong: "\u{1F3D3}",
1305
+ badminton: "\u{1F3F8}",
1306
+ boxing_glove: "\u{1F94A}",
1307
+ martial_arts_uniform: "\u{1F94B}",
1308
+ goal_net: "\u{1F945}",
1309
+ golf: "\u26F3",
1310
+ ice_skate: "\u26F8\uFE0F",
1311
+ fishing_pole_and_fish: "\u{1F3A3}",
1312
+ diving_mask: "\u{1F93F}",
1313
+ running_shirt_with_sash: "\u{1F3BD}",
1314
+ ski: "\u{1F3BF}",
1315
+ sled: "\u{1F6F7}",
1316
+ curling_stone: "\u{1F94C}",
1317
+ dart: "\u{1F3AF}",
1318
+ yo_yo: "\u{1FA80}",
1319
+ kite: "\u{1FA81}",
1320
+ gun: "\u{1F52B}",
1321
+ "8ball": "\u{1F3B1}",
1322
+ crystal_ball: "\u{1F52E}",
1323
+ magic_wand: "\u{1FA84}",
1324
+ video_game: "\u{1F3AE}",
1325
+ joystick: "\u{1F579}\uFE0F",
1326
+ slot_machine: "\u{1F3B0}",
1327
+ game_die: "\u{1F3B2}",
1328
+ jigsaw: "\u{1F9E9}",
1329
+ teddy_bear: "\u{1F9F8}",
1330
+ pinata: "\u{1FA85}",
1331
+ mirror_ball: "\u{1FAA9}",
1332
+ nesting_dolls: "\u{1FA86}",
1333
+ spades: "\u2660\uFE0F",
1334
+ hearts: "\u2665\uFE0F",
1335
+ diamonds: "\u2666\uFE0F",
1336
+ clubs: "\u2663\uFE0F",
1337
+ chess_pawn: "\u265F\uFE0F",
1338
+ black_joker: "\u{1F0CF}",
1339
+ mahjong: "\u{1F004}",
1340
+ flower_playing_cards: "\u{1F3B4}",
1341
+ performing_arts: "\u{1F3AD}",
1342
+ framed_picture: "\u{1F5BC}\uFE0F",
1343
+ art: "\u{1F3A8}",
1344
+ thread: "\u{1F9F5}",
1345
+ sewing_needle: "\u{1FAA1}",
1346
+ yarn: "\u{1F9F6}",
1347
+ knot: "\u{1FAA2}",
1348
+ eyeglasses: "\u{1F453}",
1349
+ dark_sunglasses: "\u{1F576}\uFE0F",
1350
+ goggles: "\u{1F97D}",
1351
+ lab_coat: "\u{1F97C}",
1352
+ safety_vest: "\u{1F9BA}",
1353
+ necktie: "\u{1F454}",
1354
+ shirt: "\u{1F455}",
1355
+ tshirt: "\u{1F455}",
1356
+ jeans: "\u{1F456}",
1357
+ scarf: "\u{1F9E3}",
1358
+ gloves: "\u{1F9E4}",
1359
+ coat: "\u{1F9E5}",
1360
+ socks: "\u{1F9E6}",
1361
+ dress: "\u{1F457}",
1362
+ kimono: "\u{1F458}",
1363
+ sari: "\u{1F97B}",
1364
+ one_piece_swimsuit: "\u{1FA71}",
1365
+ swim_brief: "\u{1FA72}",
1366
+ shorts: "\u{1FA73}",
1367
+ bikini: "\u{1F459}",
1368
+ womans_clothes: "\u{1F45A}",
1369
+ folding_hand_fan: "\u{1FAAD}",
1370
+ purse: "\u{1F45B}",
1371
+ handbag: "\u{1F45C}",
1372
+ pouch: "\u{1F45D}",
1373
+ shopping: "\u{1F6CD}\uFE0F",
1374
+ school_satchel: "\u{1F392}",
1375
+ thong_sandal: "\u{1FA74}",
1376
+ mans_shoe: "\u{1F45E}",
1377
+ shoe: "\u{1F45E}",
1378
+ athletic_shoe: "\u{1F45F}",
1379
+ hiking_boot: "\u{1F97E}",
1380
+ flat_shoe: "\u{1F97F}",
1381
+ high_heel: "\u{1F460}",
1382
+ sandal: "\u{1F461}",
1383
+ ballet_shoes: "\u{1FA70}",
1384
+ boot: "\u{1F462}",
1385
+ hair_pick: "\u{1FAAE}",
1386
+ crown: "\u{1F451}",
1387
+ womans_hat: "\u{1F452}",
1388
+ tophat: "\u{1F3A9}",
1389
+ mortar_board: "\u{1F393}",
1390
+ billed_cap: "\u{1F9E2}",
1391
+ military_helmet: "\u{1FA96}",
1392
+ rescue_worker_helmet: "\u26D1\uFE0F",
1393
+ prayer_beads: "\u{1F4FF}",
1394
+ lipstick: "\u{1F484}",
1395
+ ring: "\u{1F48D}",
1396
+ gem: "\u{1F48E}",
1397
+ mute: "\u{1F507}",
1398
+ speaker: "\u{1F508}",
1399
+ sound: "\u{1F509}",
1400
+ loud_sound: "\u{1F50A}",
1401
+ loudspeaker: "\u{1F4E2}",
1402
+ mega: "\u{1F4E3}",
1403
+ postal_horn: "\u{1F4EF}",
1404
+ bell: "\u{1F514}",
1405
+ no_bell: "\u{1F515}",
1406
+ musical_score: "\u{1F3BC}",
1407
+ musical_note: "\u{1F3B5}",
1408
+ notes: "\u{1F3B6}",
1409
+ studio_microphone: "\u{1F399}\uFE0F",
1410
+ level_slider: "\u{1F39A}\uFE0F",
1411
+ control_knobs: "\u{1F39B}\uFE0F",
1412
+ microphone: "\u{1F3A4}",
1413
+ headphones: "\u{1F3A7}",
1414
+ radio: "\u{1F4FB}",
1415
+ saxophone: "\u{1F3B7}",
1416
+ accordion: "\u{1FA97}",
1417
+ guitar: "\u{1F3B8}",
1418
+ musical_keyboard: "\u{1F3B9}",
1419
+ trumpet: "\u{1F3BA}",
1420
+ violin: "\u{1F3BB}",
1421
+ banjo: "\u{1FA95}",
1422
+ drum: "\u{1F941}",
1423
+ long_drum: "\u{1FA98}",
1424
+ maracas: "\u{1FA87}",
1425
+ flute: "\u{1FA88}",
1426
+ iphone: "\u{1F4F1}",
1427
+ calling: "\u{1F4F2}",
1428
+ phone: "\u260E\uFE0F",
1429
+ telephone: "\u260E\uFE0F",
1430
+ telephone_receiver: "\u{1F4DE}",
1431
+ pager: "\u{1F4DF}",
1432
+ fax: "\u{1F4E0}",
1433
+ battery: "\u{1F50B}",
1434
+ low_battery: "\u{1FAAB}",
1435
+ electric_plug: "\u{1F50C}",
1436
+ computer: "\u{1F4BB}",
1437
+ desktop_computer: "\u{1F5A5}\uFE0F",
1438
+ printer: "\u{1F5A8}\uFE0F",
1439
+ keyboard: "\u2328\uFE0F",
1440
+ computer_mouse: "\u{1F5B1}\uFE0F",
1441
+ trackball: "\u{1F5B2}\uFE0F",
1442
+ minidisc: "\u{1F4BD}",
1443
+ floppy_disk: "\u{1F4BE}",
1444
+ cd: "\u{1F4BF}",
1445
+ dvd: "\u{1F4C0}",
1446
+ abacus: "\u{1F9EE}",
1447
+ movie_camera: "\u{1F3A5}",
1448
+ film_strip: "\u{1F39E}\uFE0F",
1449
+ film_projector: "\u{1F4FD}\uFE0F",
1450
+ clapper: "\u{1F3AC}",
1451
+ tv: "\u{1F4FA}",
1452
+ camera: "\u{1F4F7}",
1453
+ camera_flash: "\u{1F4F8}",
1454
+ video_camera: "\u{1F4F9}",
1455
+ vhs: "\u{1F4FC}",
1456
+ mag: "\u{1F50D}",
1457
+ mag_right: "\u{1F50E}",
1458
+ candle: "\u{1F56F}\uFE0F",
1459
+ bulb: "\u{1F4A1}",
1460
+ flashlight: "\u{1F526}",
1461
+ izakaya_lantern: "\u{1F3EE}",
1462
+ lantern: "\u{1F3EE}",
1463
+ diya_lamp: "\u{1FA94}",
1464
+ notebook_with_decorative_cover: "\u{1F4D4}",
1465
+ closed_book: "\u{1F4D5}",
1466
+ book: "\u{1F4D6}",
1467
+ open_book: "\u{1F4D6}",
1468
+ green_book: "\u{1F4D7}",
1469
+ blue_book: "\u{1F4D8}",
1470
+ orange_book: "\u{1F4D9}",
1471
+ books: "\u{1F4DA}",
1472
+ notebook: "\u{1F4D3}",
1473
+ ledger: "\u{1F4D2}",
1474
+ page_with_curl: "\u{1F4C3}",
1475
+ scroll: "\u{1F4DC}",
1476
+ page_facing_up: "\u{1F4C4}",
1477
+ newspaper: "\u{1F4F0}",
1478
+ newspaper_roll: "\u{1F5DE}\uFE0F",
1479
+ bookmark_tabs: "\u{1F4D1}",
1480
+ bookmark: "\u{1F516}",
1481
+ label: "\u{1F3F7}\uFE0F",
1482
+ moneybag: "\u{1F4B0}",
1483
+ coin: "\u{1FA99}",
1484
+ yen: "\u{1F4B4}",
1485
+ dollar: "\u{1F4B5}",
1486
+ euro: "\u{1F4B6}",
1487
+ pound: "\u{1F4B7}",
1488
+ money_with_wings: "\u{1F4B8}",
1489
+ credit_card: "\u{1F4B3}",
1490
+ receipt: "\u{1F9FE}",
1491
+ chart: "\u{1F4B9}",
1492
+ envelope: "\u2709\uFE0F",
1493
+ email: "\u{1F4E7}",
1494
+ "e-mail": "\u{1F4E7}",
1495
+ incoming_envelope: "\u{1F4E8}",
1496
+ envelope_with_arrow: "\u{1F4E9}",
1497
+ outbox_tray: "\u{1F4E4}",
1498
+ inbox_tray: "\u{1F4E5}",
1499
+ package: "\u{1F4E6}",
1500
+ mailbox: "\u{1F4EB}",
1501
+ mailbox_closed: "\u{1F4EA}",
1502
+ mailbox_with_mail: "\u{1F4EC}",
1503
+ mailbox_with_no_mail: "\u{1F4ED}",
1504
+ postbox: "\u{1F4EE}",
1505
+ ballot_box: "\u{1F5F3}\uFE0F",
1506
+ pencil2: "\u270F\uFE0F",
1507
+ black_nib: "\u2712\uFE0F",
1508
+ fountain_pen: "\u{1F58B}\uFE0F",
1509
+ pen: "\u{1F58A}\uFE0F",
1510
+ paintbrush: "\u{1F58C}\uFE0F",
1511
+ crayon: "\u{1F58D}\uFE0F",
1512
+ memo: "\u{1F4DD}",
1513
+ pencil: "\u{1F4DD}",
1514
+ briefcase: "\u{1F4BC}",
1515
+ file_folder: "\u{1F4C1}",
1516
+ open_file_folder: "\u{1F4C2}",
1517
+ card_index_dividers: "\u{1F5C2}\uFE0F",
1518
+ date: "\u{1F4C5}",
1519
+ calendar: "\u{1F4C6}",
1520
+ spiral_notepad: "\u{1F5D2}\uFE0F",
1521
+ spiral_calendar: "\u{1F5D3}\uFE0F",
1522
+ card_index: "\u{1F4C7}",
1523
+ chart_with_upwards_trend: "\u{1F4C8}",
1524
+ chart_with_downwards_trend: "\u{1F4C9}",
1525
+ bar_chart: "\u{1F4CA}",
1526
+ clipboard: "\u{1F4CB}",
1527
+ pushpin: "\u{1F4CC}",
1528
+ round_pushpin: "\u{1F4CD}",
1529
+ paperclip: "\u{1F4CE}",
1530
+ paperclips: "\u{1F587}\uFE0F",
1531
+ straight_ruler: "\u{1F4CF}",
1532
+ triangular_ruler: "\u{1F4D0}",
1533
+ scissors: "\u2702\uFE0F",
1534
+ card_file_box: "\u{1F5C3}\uFE0F",
1535
+ file_cabinet: "\u{1F5C4}\uFE0F",
1536
+ wastebasket: "\u{1F5D1}\uFE0F",
1537
+ lock: "\u{1F512}",
1538
+ unlock: "\u{1F513}",
1539
+ lock_with_ink_pen: "\u{1F50F}",
1540
+ closed_lock_with_key: "\u{1F510}",
1541
+ key: "\u{1F511}",
1542
+ old_key: "\u{1F5DD}\uFE0F",
1543
+ hammer: "\u{1F528}",
1544
+ axe: "\u{1FA93}",
1545
+ pick: "\u26CF\uFE0F",
1546
+ hammer_and_pick: "\u2692\uFE0F",
1547
+ hammer_and_wrench: "\u{1F6E0}\uFE0F",
1548
+ dagger: "\u{1F5E1}\uFE0F",
1549
+ crossed_swords: "\u2694\uFE0F",
1550
+ bomb: "\u{1F4A3}",
1551
+ boomerang: "\u{1FA83}",
1552
+ bow_and_arrow: "\u{1F3F9}",
1553
+ shield: "\u{1F6E1}\uFE0F",
1554
+ carpentry_saw: "\u{1FA9A}",
1555
+ wrench: "\u{1F527}",
1556
+ screwdriver: "\u{1FA9B}",
1557
+ nut_and_bolt: "\u{1F529}",
1558
+ gear: "\u2699\uFE0F",
1559
+ clamp: "\u{1F5DC}\uFE0F",
1560
+ balance_scale: "\u2696\uFE0F",
1561
+ probing_cane: "\u{1F9AF}",
1562
+ link: "\u{1F517}",
1563
+ chains: "\u26D3\uFE0F",
1564
+ hook: "\u{1FA9D}",
1565
+ toolbox: "\u{1F9F0}",
1566
+ magnet: "\u{1F9F2}",
1567
+ ladder: "\u{1FA9C}",
1568
+ alembic: "\u2697\uFE0F",
1569
+ test_tube: "\u{1F9EA}",
1570
+ petri_dish: "\u{1F9EB}",
1571
+ dna: "\u{1F9EC}",
1572
+ microscope: "\u{1F52C}",
1573
+ telescope: "\u{1F52D}",
1574
+ satellite: "\u{1F4E1}",
1575
+ syringe: "\u{1F489}",
1576
+ drop_of_blood: "\u{1FA78}",
1577
+ pill: "\u{1F48A}",
1578
+ adhesive_bandage: "\u{1FA79}",
1579
+ crutch: "\u{1FA7C}",
1580
+ stethoscope: "\u{1FA7A}",
1581
+ x_ray: "\u{1FA7B}",
1582
+ door: "\u{1F6AA}",
1583
+ elevator: "\u{1F6D7}",
1584
+ mirror: "\u{1FA9E}",
1585
+ window: "\u{1FA9F}",
1586
+ bed: "\u{1F6CF}\uFE0F",
1587
+ couch_and_lamp: "\u{1F6CB}\uFE0F",
1588
+ chair: "\u{1FA91}",
1589
+ toilet: "\u{1F6BD}",
1590
+ plunger: "\u{1FAA0}",
1591
+ shower: "\u{1F6BF}",
1592
+ bathtub: "\u{1F6C1}",
1593
+ mouse_trap: "\u{1FAA4}",
1594
+ razor: "\u{1FA92}",
1595
+ lotion_bottle: "\u{1F9F4}",
1596
+ safety_pin: "\u{1F9F7}",
1597
+ broom: "\u{1F9F9}",
1598
+ basket: "\u{1F9FA}",
1599
+ roll_of_paper: "\u{1F9FB}",
1600
+ bucket: "\u{1FAA3}",
1601
+ soap: "\u{1F9FC}",
1602
+ bubbles: "\u{1FAE7}",
1603
+ toothbrush: "\u{1FAA5}",
1604
+ sponge: "\u{1F9FD}",
1605
+ fire_extinguisher: "\u{1F9EF}",
1606
+ shopping_cart: "\u{1F6D2}",
1607
+ smoking: "\u{1F6AC}",
1608
+ coffin: "\u26B0\uFE0F",
1609
+ headstone: "\u{1FAA6}",
1610
+ funeral_urn: "\u26B1\uFE0F",
1611
+ nazar_amulet: "\u{1F9FF}",
1612
+ hamsa: "\u{1FAAC}",
1613
+ moyai: "\u{1F5FF}",
1614
+ placard: "\u{1FAA7}",
1615
+ identification_card: "\u{1FAAA}",
1616
+ atm: "\u{1F3E7}",
1617
+ put_litter_in_its_place: "\u{1F6AE}",
1618
+ potable_water: "\u{1F6B0}",
1619
+ wheelchair: "\u267F",
1620
+ mens: "\u{1F6B9}",
1621
+ womens: "\u{1F6BA}",
1622
+ restroom: "\u{1F6BB}",
1623
+ baby_symbol: "\u{1F6BC}",
1624
+ wc: "\u{1F6BE}",
1625
+ passport_control: "\u{1F6C2}",
1626
+ customs: "\u{1F6C3}",
1627
+ baggage_claim: "\u{1F6C4}",
1628
+ left_luggage: "\u{1F6C5}",
1629
+ warning: "\u26A0\uFE0F",
1630
+ children_crossing: "\u{1F6B8}",
1631
+ no_entry: "\u26D4",
1632
+ no_entry_sign: "\u{1F6AB}",
1633
+ no_bicycles: "\u{1F6B3}",
1634
+ no_smoking: "\u{1F6AD}",
1635
+ do_not_litter: "\u{1F6AF}",
1636
+ "non-potable_water": "\u{1F6B1}",
1637
+ no_pedestrians: "\u{1F6B7}",
1638
+ no_mobile_phones: "\u{1F4F5}",
1639
+ underage: "\u{1F51E}",
1640
+ radioactive: "\u2622\uFE0F",
1641
+ biohazard: "\u2623\uFE0F",
1642
+ arrow_up: "\u2B06\uFE0F",
1643
+ arrow_upper_right: "\u2197\uFE0F",
1644
+ arrow_right: "\u27A1\uFE0F",
1645
+ arrow_lower_right: "\u2198\uFE0F",
1646
+ arrow_down: "\u2B07\uFE0F",
1647
+ arrow_lower_left: "\u2199\uFE0F",
1648
+ arrow_left: "\u2B05\uFE0F",
1649
+ arrow_upper_left: "\u2196\uFE0F",
1650
+ arrow_up_down: "\u2195\uFE0F",
1651
+ left_right_arrow: "\u2194\uFE0F",
1652
+ leftwards_arrow_with_hook: "\u21A9\uFE0F",
1653
+ arrow_right_hook: "\u21AA\uFE0F",
1654
+ arrow_heading_up: "\u2934\uFE0F",
1655
+ arrow_heading_down: "\u2935\uFE0F",
1656
+ arrows_clockwise: "\u{1F503}",
1657
+ arrows_counterclockwise: "\u{1F504}",
1658
+ back: "\u{1F519}",
1659
+ end: "\u{1F51A}",
1660
+ on: "\u{1F51B}",
1661
+ soon: "\u{1F51C}",
1662
+ top: "\u{1F51D}",
1663
+ place_of_worship: "\u{1F6D0}",
1664
+ atom_symbol: "\u269B\uFE0F",
1665
+ om: "\u{1F549}\uFE0F",
1666
+ star_of_david: "\u2721\uFE0F",
1667
+ wheel_of_dharma: "\u2638\uFE0F",
1668
+ yin_yang: "\u262F\uFE0F",
1669
+ latin_cross: "\u271D\uFE0F",
1670
+ orthodox_cross: "\u2626\uFE0F",
1671
+ star_and_crescent: "\u262A\uFE0F",
1672
+ peace_symbol: "\u262E\uFE0F",
1673
+ menorah: "\u{1F54E}",
1674
+ six_pointed_star: "\u{1F52F}",
1675
+ khanda: "\u{1FAAF}",
1676
+ aries: "\u2648",
1677
+ taurus: "\u2649",
1678
+ gemini: "\u264A",
1679
+ cancer: "\u264B",
1680
+ leo: "\u264C",
1681
+ virgo: "\u264D",
1682
+ libra: "\u264E",
1683
+ scorpius: "\u264F",
1684
+ sagittarius: "\u2650",
1685
+ capricorn: "\u2651",
1686
+ aquarius: "\u2652",
1687
+ pisces: "\u2653",
1688
+ ophiuchus: "\u26CE",
1689
+ twisted_rightwards_arrows: "\u{1F500}",
1690
+ repeat: "\u{1F501}",
1691
+ repeat_one: "\u{1F502}",
1692
+ arrow_forward: "\u25B6\uFE0F",
1693
+ fast_forward: "\u23E9",
1694
+ next_track_button: "\u23ED\uFE0F",
1695
+ play_or_pause_button: "\u23EF\uFE0F",
1696
+ arrow_backward: "\u25C0\uFE0F",
1697
+ rewind: "\u23EA",
1698
+ previous_track_button: "\u23EE\uFE0F",
1699
+ arrow_up_small: "\u{1F53C}",
1700
+ arrow_double_up: "\u23EB",
1701
+ arrow_down_small: "\u{1F53D}",
1702
+ arrow_double_down: "\u23EC",
1703
+ pause_button: "\u23F8\uFE0F",
1704
+ stop_button: "\u23F9\uFE0F",
1705
+ record_button: "\u23FA\uFE0F",
1706
+ eject_button: "\u23CF\uFE0F",
1707
+ cinema: "\u{1F3A6}",
1708
+ low_brightness: "\u{1F505}",
1709
+ high_brightness: "\u{1F506}",
1710
+ signal_strength: "\u{1F4F6}",
1711
+ wireless: "\u{1F6DC}",
1712
+ vibration_mode: "\u{1F4F3}",
1713
+ mobile_phone_off: "\u{1F4F4}",
1714
+ female_sign: "\u2640\uFE0F",
1715
+ male_sign: "\u2642\uFE0F",
1716
+ transgender_symbol: "\u26A7\uFE0F",
1717
+ heavy_multiplication_x: "\u2716\uFE0F",
1718
+ heavy_plus_sign: "\u2795",
1719
+ heavy_minus_sign: "\u2796",
1720
+ heavy_division_sign: "\u2797",
1721
+ heavy_equals_sign: "\u{1F7F0}",
1722
+ infinity: "\u267E\uFE0F",
1723
+ bangbang: "\u203C\uFE0F",
1724
+ interrobang: "\u2049\uFE0F",
1725
+ question: "\u2753",
1726
+ grey_question: "\u2754",
1727
+ grey_exclamation: "\u2755",
1728
+ exclamation: "\u2757",
1729
+ heavy_exclamation_mark: "\u2757",
1730
+ wavy_dash: "\u3030\uFE0F",
1731
+ currency_exchange: "\u{1F4B1}",
1732
+ heavy_dollar_sign: "\u{1F4B2}",
1733
+ medical_symbol: "\u2695\uFE0F",
1734
+ recycle: "\u267B\uFE0F",
1735
+ fleur_de_lis: "\u269C\uFE0F",
1736
+ trident: "\u{1F531}",
1737
+ name_badge: "\u{1F4DB}",
1738
+ beginner: "\u{1F530}",
1739
+ o: "\u2B55",
1740
+ white_check_mark: "\u2705",
1741
+ ballot_box_with_check: "\u2611\uFE0F",
1742
+ heavy_check_mark: "\u2714\uFE0F",
1743
+ x: "\u274C",
1744
+ negative_squared_cross_mark: "\u274E",
1745
+ curly_loop: "\u27B0",
1746
+ loop: "\u27BF",
1747
+ part_alternation_mark: "\u303D\uFE0F",
1748
+ eight_spoked_asterisk: "\u2733\uFE0F",
1749
+ eight_pointed_black_star: "\u2734\uFE0F",
1750
+ sparkle: "\u2747\uFE0F",
1751
+ copyright: "\xA9\uFE0F",
1752
+ registered: "\xAE\uFE0F",
1753
+ tm: "\u2122\uFE0F",
1754
+ hash: "#\uFE0F\u20E3",
1755
+ asterisk: "*\uFE0F\u20E3",
1756
+ zero: "0\uFE0F\u20E3",
1757
+ one: "1\uFE0F\u20E3",
1758
+ two: "2\uFE0F\u20E3",
1759
+ three: "3\uFE0F\u20E3",
1760
+ four: "4\uFE0F\u20E3",
1761
+ five: "5\uFE0F\u20E3",
1762
+ six: "6\uFE0F\u20E3",
1763
+ seven: "7\uFE0F\u20E3",
1764
+ eight: "8\uFE0F\u20E3",
1765
+ nine: "9\uFE0F\u20E3",
1766
+ keycap_ten: "\u{1F51F}",
1767
+ capital_abcd: "\u{1F520}",
1768
+ abcd: "\u{1F521}",
1769
+ symbols: "\u{1F523}",
1770
+ abc: "\u{1F524}",
1771
+ a: "\u{1F170}\uFE0F",
1772
+ ab: "\u{1F18E}",
1773
+ b: "\u{1F171}\uFE0F",
1774
+ cl: "\u{1F191}",
1775
+ cool: "\u{1F192}",
1776
+ free: "\u{1F193}",
1777
+ information_source: "\u2139\uFE0F",
1778
+ id: "\u{1F194}",
1779
+ m: "\u24C2\uFE0F",
1780
+ new: "\u{1F195}",
1781
+ ng: "\u{1F196}",
1782
+ o2: "\u{1F17E}\uFE0F",
1783
+ ok: "\u{1F197}",
1784
+ parking: "\u{1F17F}\uFE0F",
1785
+ sos: "\u{1F198}",
1786
+ up: "\u{1F199}",
1787
+ vs: "\u{1F19A}",
1788
+ koko: "\u{1F201}",
1789
+ sa: "\u{1F202}\uFE0F",
1790
+ u6708: "\u{1F237}\uFE0F",
1791
+ u6709: "\u{1F236}",
1792
+ u6307: "\u{1F22F}",
1793
+ ideograph_advantage: "\u{1F250}",
1794
+ u5272: "\u{1F239}",
1795
+ u7121: "\u{1F21A}",
1796
+ u7981: "\u{1F232}",
1797
+ accept: "\u{1F251}",
1798
+ u7533: "\u{1F238}",
1799
+ u5408: "\u{1F234}",
1800
+ u7a7a: "\u{1F233}",
1801
+ congratulations: "\u3297\uFE0F",
1802
+ secret: "\u3299\uFE0F",
1803
+ u55b6: "\u{1F23A}",
1804
+ u6e80: "\u{1F235}",
1805
+ red_circle: "\u{1F534}",
1806
+ orange_circle: "\u{1F7E0}",
1807
+ yellow_circle: "\u{1F7E1}",
1808
+ green_circle: "\u{1F7E2}",
1809
+ large_blue_circle: "\u{1F535}",
1810
+ purple_circle: "\u{1F7E3}",
1811
+ brown_circle: "\u{1F7E4}",
1812
+ black_circle: "\u26AB",
1813
+ white_circle: "\u26AA",
1814
+ red_square: "\u{1F7E5}",
1815
+ orange_square: "\u{1F7E7}",
1816
+ yellow_square: "\u{1F7E8}",
1817
+ green_square: "\u{1F7E9}",
1818
+ blue_square: "\u{1F7E6}",
1819
+ purple_square: "\u{1F7EA}",
1820
+ brown_square: "\u{1F7EB}",
1821
+ black_large_square: "\u2B1B",
1822
+ white_large_square: "\u2B1C",
1823
+ black_medium_square: "\u25FC\uFE0F",
1824
+ white_medium_square: "\u25FB\uFE0F",
1825
+ black_medium_small_square: "\u25FE",
1826
+ white_medium_small_square: "\u25FD",
1827
+ black_small_square: "\u25AA\uFE0F",
1828
+ white_small_square: "\u25AB\uFE0F",
1829
+ large_orange_diamond: "\u{1F536}",
1830
+ large_blue_diamond: "\u{1F537}",
1831
+ small_orange_diamond: "\u{1F538}",
1832
+ small_blue_diamond: "\u{1F539}",
1833
+ small_red_triangle: "\u{1F53A}",
1834
+ small_red_triangle_down: "\u{1F53B}",
1835
+ diamond_shape_with_a_dot_inside: "\u{1F4A0}",
1836
+ radio_button: "\u{1F518}",
1837
+ white_square_button: "\u{1F533}",
1838
+ black_square_button: "\u{1F532}",
1839
+ checkered_flag: "\u{1F3C1}",
1840
+ triangular_flag_on_post: "\u{1F6A9}",
1841
+ crossed_flags: "\u{1F38C}",
1842
+ black_flag: "\u{1F3F4}",
1843
+ white_flag: "\u{1F3F3}\uFE0F",
1844
+ rainbow_flag: "\u{1F3F3}\uFE0F\u200D\u{1F308}",
1845
+ transgender_flag: "\u{1F3F3}\uFE0F\u200D\u26A7\uFE0F",
1846
+ pirate_flag: "\u{1F3F4}\u200D\u2620\uFE0F",
1847
+ ascension_island: "\u{1F1E6}\u{1F1E8}",
1848
+ andorra: "\u{1F1E6}\u{1F1E9}",
1849
+ united_arab_emirates: "\u{1F1E6}\u{1F1EA}",
1850
+ afghanistan: "\u{1F1E6}\u{1F1EB}",
1851
+ antigua_barbuda: "\u{1F1E6}\u{1F1EC}",
1852
+ anguilla: "\u{1F1E6}\u{1F1EE}",
1853
+ albania: "\u{1F1E6}\u{1F1F1}",
1854
+ armenia: "\u{1F1E6}\u{1F1F2}",
1855
+ angola: "\u{1F1E6}\u{1F1F4}",
1856
+ antarctica: "\u{1F1E6}\u{1F1F6}",
1857
+ argentina: "\u{1F1E6}\u{1F1F7}",
1858
+ american_samoa: "\u{1F1E6}\u{1F1F8}",
1859
+ austria: "\u{1F1E6}\u{1F1F9}",
1860
+ australia: "\u{1F1E6}\u{1F1FA}",
1861
+ aruba: "\u{1F1E6}\u{1F1FC}",
1862
+ aland_islands: "\u{1F1E6}\u{1F1FD}",
1863
+ azerbaijan: "\u{1F1E6}\u{1F1FF}",
1864
+ bosnia_herzegovina: "\u{1F1E7}\u{1F1E6}",
1865
+ barbados: "\u{1F1E7}\u{1F1E7}",
1866
+ bangladesh: "\u{1F1E7}\u{1F1E9}",
1867
+ belgium: "\u{1F1E7}\u{1F1EA}",
1868
+ burkina_faso: "\u{1F1E7}\u{1F1EB}",
1869
+ bulgaria: "\u{1F1E7}\u{1F1EC}",
1870
+ bahrain: "\u{1F1E7}\u{1F1ED}",
1871
+ burundi: "\u{1F1E7}\u{1F1EE}",
1872
+ benin: "\u{1F1E7}\u{1F1EF}",
1873
+ st_barthelemy: "\u{1F1E7}\u{1F1F1}",
1874
+ bermuda: "\u{1F1E7}\u{1F1F2}",
1875
+ brunei: "\u{1F1E7}\u{1F1F3}",
1876
+ bolivia: "\u{1F1E7}\u{1F1F4}",
1877
+ caribbean_netherlands: "\u{1F1E7}\u{1F1F6}",
1878
+ brazil: "\u{1F1E7}\u{1F1F7}",
1879
+ bahamas: "\u{1F1E7}\u{1F1F8}",
1880
+ bhutan: "\u{1F1E7}\u{1F1F9}",
1881
+ bouvet_island: "\u{1F1E7}\u{1F1FB}",
1882
+ botswana: "\u{1F1E7}\u{1F1FC}",
1883
+ belarus: "\u{1F1E7}\u{1F1FE}",
1884
+ belize: "\u{1F1E7}\u{1F1FF}",
1885
+ canada: "\u{1F1E8}\u{1F1E6}",
1886
+ cocos_islands: "\u{1F1E8}\u{1F1E8}",
1887
+ congo_kinshasa: "\u{1F1E8}\u{1F1E9}",
1888
+ central_african_republic: "\u{1F1E8}\u{1F1EB}",
1889
+ congo_brazzaville: "\u{1F1E8}\u{1F1EC}",
1890
+ switzerland: "\u{1F1E8}\u{1F1ED}",
1891
+ cote_divoire: "\u{1F1E8}\u{1F1EE}",
1892
+ cook_islands: "\u{1F1E8}\u{1F1F0}",
1893
+ chile: "\u{1F1E8}\u{1F1F1}",
1894
+ cameroon: "\u{1F1E8}\u{1F1F2}",
1895
+ cn: "\u{1F1E8}\u{1F1F3}",
1896
+ colombia: "\u{1F1E8}\u{1F1F4}",
1897
+ clipperton_island: "\u{1F1E8}\u{1F1F5}",
1898
+ costa_rica: "\u{1F1E8}\u{1F1F7}",
1899
+ cuba: "\u{1F1E8}\u{1F1FA}",
1900
+ cape_verde: "\u{1F1E8}\u{1F1FB}",
1901
+ curacao: "\u{1F1E8}\u{1F1FC}",
1902
+ christmas_island: "\u{1F1E8}\u{1F1FD}",
1903
+ cyprus: "\u{1F1E8}\u{1F1FE}",
1904
+ czech_republic: "\u{1F1E8}\u{1F1FF}",
1905
+ de: "\u{1F1E9}\u{1F1EA}",
1906
+ diego_garcia: "\u{1F1E9}\u{1F1EC}",
1907
+ djibouti: "\u{1F1E9}\u{1F1EF}",
1908
+ denmark: "\u{1F1E9}\u{1F1F0}",
1909
+ dominica: "\u{1F1E9}\u{1F1F2}",
1910
+ dominican_republic: "\u{1F1E9}\u{1F1F4}",
1911
+ algeria: "\u{1F1E9}\u{1F1FF}",
1912
+ ceuta_melilla: "\u{1F1EA}\u{1F1E6}",
1913
+ ecuador: "\u{1F1EA}\u{1F1E8}",
1914
+ estonia: "\u{1F1EA}\u{1F1EA}",
1915
+ egypt: "\u{1F1EA}\u{1F1EC}",
1916
+ western_sahara: "\u{1F1EA}\u{1F1ED}",
1917
+ eritrea: "\u{1F1EA}\u{1F1F7}",
1918
+ es: "\u{1F1EA}\u{1F1F8}",
1919
+ ethiopia: "\u{1F1EA}\u{1F1F9}",
1920
+ eu: "\u{1F1EA}\u{1F1FA}",
1921
+ european_union: "\u{1F1EA}\u{1F1FA}",
1922
+ finland: "\u{1F1EB}\u{1F1EE}",
1923
+ fiji: "\u{1F1EB}\u{1F1EF}",
1924
+ falkland_islands: "\u{1F1EB}\u{1F1F0}",
1925
+ micronesia: "\u{1F1EB}\u{1F1F2}",
1926
+ faroe_islands: "\u{1F1EB}\u{1F1F4}",
1927
+ fr: "\u{1F1EB}\u{1F1F7}",
1928
+ gabon: "\u{1F1EC}\u{1F1E6}",
1929
+ gb: "\u{1F1EC}\u{1F1E7}",
1930
+ uk: "\u{1F1EC}\u{1F1E7}",
1931
+ grenada: "\u{1F1EC}\u{1F1E9}",
1932
+ georgia: "\u{1F1EC}\u{1F1EA}",
1933
+ french_guiana: "\u{1F1EC}\u{1F1EB}",
1934
+ guernsey: "\u{1F1EC}\u{1F1EC}",
1935
+ ghana: "\u{1F1EC}\u{1F1ED}",
1936
+ gibraltar: "\u{1F1EC}\u{1F1EE}",
1937
+ greenland: "\u{1F1EC}\u{1F1F1}",
1938
+ gambia: "\u{1F1EC}\u{1F1F2}",
1939
+ guinea: "\u{1F1EC}\u{1F1F3}",
1940
+ guadeloupe: "\u{1F1EC}\u{1F1F5}",
1941
+ equatorial_guinea: "\u{1F1EC}\u{1F1F6}",
1942
+ greece: "\u{1F1EC}\u{1F1F7}",
1943
+ south_georgia_south_sandwich_islands: "\u{1F1EC}\u{1F1F8}",
1944
+ guatemala: "\u{1F1EC}\u{1F1F9}",
1945
+ guam: "\u{1F1EC}\u{1F1FA}",
1946
+ guinea_bissau: "\u{1F1EC}\u{1F1FC}",
1947
+ guyana: "\u{1F1EC}\u{1F1FE}",
1948
+ hong_kong: "\u{1F1ED}\u{1F1F0}",
1949
+ heard_mcdonald_islands: "\u{1F1ED}\u{1F1F2}",
1950
+ honduras: "\u{1F1ED}\u{1F1F3}",
1951
+ croatia: "\u{1F1ED}\u{1F1F7}",
1952
+ haiti: "\u{1F1ED}\u{1F1F9}",
1953
+ hungary: "\u{1F1ED}\u{1F1FA}",
1954
+ canary_islands: "\u{1F1EE}\u{1F1E8}",
1955
+ indonesia: "\u{1F1EE}\u{1F1E9}",
1956
+ ireland: "\u{1F1EE}\u{1F1EA}",
1957
+ israel: "\u{1F1EE}\u{1F1F1}",
1958
+ isle_of_man: "\u{1F1EE}\u{1F1F2}",
1959
+ india: "\u{1F1EE}\u{1F1F3}",
1960
+ british_indian_ocean_territory: "\u{1F1EE}\u{1F1F4}",
1961
+ iraq: "\u{1F1EE}\u{1F1F6}",
1962
+ iran: "\u{1F1EE}\u{1F1F7}",
1963
+ iceland: "\u{1F1EE}\u{1F1F8}",
1964
+ it: "\u{1F1EE}\u{1F1F9}",
1965
+ jersey: "\u{1F1EF}\u{1F1EA}",
1966
+ jamaica: "\u{1F1EF}\u{1F1F2}",
1967
+ jordan: "\u{1F1EF}\u{1F1F4}",
1968
+ jp: "\u{1F1EF}\u{1F1F5}",
1969
+ kenya: "\u{1F1F0}\u{1F1EA}",
1970
+ kyrgyzstan: "\u{1F1F0}\u{1F1EC}",
1971
+ cambodia: "\u{1F1F0}\u{1F1ED}",
1972
+ kiribati: "\u{1F1F0}\u{1F1EE}",
1973
+ comoros: "\u{1F1F0}\u{1F1F2}",
1974
+ st_kitts_nevis: "\u{1F1F0}\u{1F1F3}",
1975
+ north_korea: "\u{1F1F0}\u{1F1F5}",
1976
+ kr: "\u{1F1F0}\u{1F1F7}",
1977
+ kuwait: "\u{1F1F0}\u{1F1FC}",
1978
+ cayman_islands: "\u{1F1F0}\u{1F1FE}",
1979
+ kazakhstan: "\u{1F1F0}\u{1F1FF}",
1980
+ laos: "\u{1F1F1}\u{1F1E6}",
1981
+ lebanon: "\u{1F1F1}\u{1F1E7}",
1982
+ st_lucia: "\u{1F1F1}\u{1F1E8}",
1983
+ liechtenstein: "\u{1F1F1}\u{1F1EE}",
1984
+ sri_lanka: "\u{1F1F1}\u{1F1F0}",
1985
+ liberia: "\u{1F1F1}\u{1F1F7}",
1986
+ lesotho: "\u{1F1F1}\u{1F1F8}",
1987
+ lithuania: "\u{1F1F1}\u{1F1F9}",
1988
+ luxembourg: "\u{1F1F1}\u{1F1FA}",
1989
+ latvia: "\u{1F1F1}\u{1F1FB}",
1990
+ libya: "\u{1F1F1}\u{1F1FE}",
1991
+ morocco: "\u{1F1F2}\u{1F1E6}",
1992
+ monaco: "\u{1F1F2}\u{1F1E8}",
1993
+ moldova: "\u{1F1F2}\u{1F1E9}",
1994
+ montenegro: "\u{1F1F2}\u{1F1EA}",
1995
+ st_martin: "\u{1F1F2}\u{1F1EB}",
1996
+ madagascar: "\u{1F1F2}\u{1F1EC}",
1997
+ marshall_islands: "\u{1F1F2}\u{1F1ED}",
1998
+ macedonia: "\u{1F1F2}\u{1F1F0}",
1999
+ mali: "\u{1F1F2}\u{1F1F1}",
2000
+ myanmar: "\u{1F1F2}\u{1F1F2}",
2001
+ mongolia: "\u{1F1F2}\u{1F1F3}",
2002
+ macau: "\u{1F1F2}\u{1F1F4}",
2003
+ northern_mariana_islands: "\u{1F1F2}\u{1F1F5}",
2004
+ martinique: "\u{1F1F2}\u{1F1F6}",
2005
+ mauritania: "\u{1F1F2}\u{1F1F7}",
2006
+ montserrat: "\u{1F1F2}\u{1F1F8}",
2007
+ malta: "\u{1F1F2}\u{1F1F9}",
2008
+ mauritius: "\u{1F1F2}\u{1F1FA}",
2009
+ maldives: "\u{1F1F2}\u{1F1FB}",
2010
+ malawi: "\u{1F1F2}\u{1F1FC}",
2011
+ mexico: "\u{1F1F2}\u{1F1FD}",
2012
+ malaysia: "\u{1F1F2}\u{1F1FE}",
2013
+ mozambique: "\u{1F1F2}\u{1F1FF}",
2014
+ namibia: "\u{1F1F3}\u{1F1E6}",
2015
+ new_caledonia: "\u{1F1F3}\u{1F1E8}",
2016
+ niger: "\u{1F1F3}\u{1F1EA}",
2017
+ norfolk_island: "\u{1F1F3}\u{1F1EB}",
2018
+ nigeria: "\u{1F1F3}\u{1F1EC}",
2019
+ nicaragua: "\u{1F1F3}\u{1F1EE}",
2020
+ netherlands: "\u{1F1F3}\u{1F1F1}",
2021
+ norway: "\u{1F1F3}\u{1F1F4}",
2022
+ nepal: "\u{1F1F3}\u{1F1F5}",
2023
+ nauru: "\u{1F1F3}\u{1F1F7}",
2024
+ niue: "\u{1F1F3}\u{1F1FA}",
2025
+ new_zealand: "\u{1F1F3}\u{1F1FF}",
2026
+ oman: "\u{1F1F4}\u{1F1F2}",
2027
+ panama: "\u{1F1F5}\u{1F1E6}",
2028
+ peru: "\u{1F1F5}\u{1F1EA}",
2029
+ french_polynesia: "\u{1F1F5}\u{1F1EB}",
2030
+ papua_new_guinea: "\u{1F1F5}\u{1F1EC}",
2031
+ philippines: "\u{1F1F5}\u{1F1ED}",
2032
+ pakistan: "\u{1F1F5}\u{1F1F0}",
2033
+ poland: "\u{1F1F5}\u{1F1F1}",
2034
+ st_pierre_miquelon: "\u{1F1F5}\u{1F1F2}",
2035
+ pitcairn_islands: "\u{1F1F5}\u{1F1F3}",
2036
+ puerto_rico: "\u{1F1F5}\u{1F1F7}",
2037
+ palestinian_territories: "\u{1F1F5}\u{1F1F8}",
2038
+ portugal: "\u{1F1F5}\u{1F1F9}",
2039
+ palau: "\u{1F1F5}\u{1F1FC}",
2040
+ paraguay: "\u{1F1F5}\u{1F1FE}",
2041
+ qatar: "\u{1F1F6}\u{1F1E6}",
2042
+ reunion: "\u{1F1F7}\u{1F1EA}",
2043
+ romania: "\u{1F1F7}\u{1F1F4}",
2044
+ serbia: "\u{1F1F7}\u{1F1F8}",
2045
+ ru: "\u{1F1F7}\u{1F1FA}",
2046
+ rwanda: "\u{1F1F7}\u{1F1FC}",
2047
+ saudi_arabia: "\u{1F1F8}\u{1F1E6}",
2048
+ solomon_islands: "\u{1F1F8}\u{1F1E7}",
2049
+ seychelles: "\u{1F1F8}\u{1F1E8}",
2050
+ sudan: "\u{1F1F8}\u{1F1E9}",
2051
+ sweden: "\u{1F1F8}\u{1F1EA}",
2052
+ singapore: "\u{1F1F8}\u{1F1EC}",
2053
+ st_helena: "\u{1F1F8}\u{1F1ED}",
2054
+ slovenia: "\u{1F1F8}\u{1F1EE}",
2055
+ svalbard_jan_mayen: "\u{1F1F8}\u{1F1EF}",
2056
+ slovakia: "\u{1F1F8}\u{1F1F0}",
2057
+ sierra_leone: "\u{1F1F8}\u{1F1F1}",
2058
+ san_marino: "\u{1F1F8}\u{1F1F2}",
2059
+ senegal: "\u{1F1F8}\u{1F1F3}",
2060
+ somalia: "\u{1F1F8}\u{1F1F4}",
2061
+ suriname: "\u{1F1F8}\u{1F1F7}",
2062
+ south_sudan: "\u{1F1F8}\u{1F1F8}",
2063
+ sao_tome_principe: "\u{1F1F8}\u{1F1F9}",
2064
+ el_salvador: "\u{1F1F8}\u{1F1FB}",
2065
+ sint_maarten: "\u{1F1F8}\u{1F1FD}",
2066
+ syria: "\u{1F1F8}\u{1F1FE}",
2067
+ swaziland: "\u{1F1F8}\u{1F1FF}",
2068
+ tristan_da_cunha: "\u{1F1F9}\u{1F1E6}",
2069
+ turks_caicos_islands: "\u{1F1F9}\u{1F1E8}",
2070
+ chad: "\u{1F1F9}\u{1F1E9}",
2071
+ french_southern_territories: "\u{1F1F9}\u{1F1EB}",
2072
+ togo: "\u{1F1F9}\u{1F1EC}",
2073
+ thailand: "\u{1F1F9}\u{1F1ED}",
2074
+ tajikistan: "\u{1F1F9}\u{1F1EF}",
2075
+ tokelau: "\u{1F1F9}\u{1F1F0}",
2076
+ timor_leste: "\u{1F1F9}\u{1F1F1}",
2077
+ turkmenistan: "\u{1F1F9}\u{1F1F2}",
2078
+ tunisia: "\u{1F1F9}\u{1F1F3}",
2079
+ tonga: "\u{1F1F9}\u{1F1F4}",
2080
+ tr: "\u{1F1F9}\u{1F1F7}",
2081
+ trinidad_tobago: "\u{1F1F9}\u{1F1F9}",
2082
+ tuvalu: "\u{1F1F9}\u{1F1FB}",
2083
+ taiwan: "\u{1F1F9}\u{1F1FC}",
2084
+ tanzania: "\u{1F1F9}\u{1F1FF}",
2085
+ ukraine: "\u{1F1FA}\u{1F1E6}",
2086
+ uganda: "\u{1F1FA}\u{1F1EC}",
2087
+ us_outlying_islands: "\u{1F1FA}\u{1F1F2}",
2088
+ united_nations: "\u{1F1FA}\u{1F1F3}",
2089
+ us: "\u{1F1FA}\u{1F1F8}",
2090
+ uruguay: "\u{1F1FA}\u{1F1FE}",
2091
+ uzbekistan: "\u{1F1FA}\u{1F1FF}",
2092
+ vatican_city: "\u{1F1FB}\u{1F1E6}",
2093
+ st_vincent_grenadines: "\u{1F1FB}\u{1F1E8}",
2094
+ venezuela: "\u{1F1FB}\u{1F1EA}",
2095
+ british_virgin_islands: "\u{1F1FB}\u{1F1EC}",
2096
+ us_virgin_islands: "\u{1F1FB}\u{1F1EE}",
2097
+ vietnam: "\u{1F1FB}\u{1F1F3}",
2098
+ vanuatu: "\u{1F1FB}\u{1F1FA}",
2099
+ wallis_futuna: "\u{1F1FC}\u{1F1EB}",
2100
+ samoa: "\u{1F1FC}\u{1F1F8}",
2101
+ kosovo: "\u{1F1FD}\u{1F1F0}",
2102
+ yemen: "\u{1F1FE}\u{1F1EA}",
2103
+ mayotte: "\u{1F1FE}\u{1F1F9}",
2104
+ south_africa: "\u{1F1FF}\u{1F1E6}",
2105
+ zambia: "\u{1F1FF}\u{1F1F2}",
2106
+ zimbabwe: "\u{1F1FF}\u{1F1FC}",
2107
+ england: "\u{1F3F4}\u{E0067}\u{E0062}\u{E0065}\u{E006E}\u{E0067}\u{E007F}",
2108
+ scotland: "\u{1F3F4}\u{E0067}\u{E0062}\u{E0073}\u{E0063}\u{E0074}\u{E007F}",
2109
+ wales: "\u{1F3F4}\u{E0067}\u{E0062}\u{E0077}\u{E006C}\u{E0073}\u{E007F}"
2110
+ };
2111
+
2112
+ // src/server/emojify.ts
2113
+ function emojify(text) {
2114
+ return text.replace(/:([a-zA-Z0-9_+-]+):/g, (match, name) => {
2115
+ return nameToEmoji[name] ?? match;
2116
+ });
2117
+ }
2118
+
2119
+ // src/server/webhook.ts
2120
+ function verifySlackSignature(signingSecret, signature, timestamp, rawBody) {
2121
+ const fiveMinutesAgo = Math.floor(Date.now() / 1e3) - 300;
2122
+ if (parseInt(timestamp, 10) < fiveMinutesAgo) {
2123
+ return false;
2124
+ }
2125
+ const sigBasestring = `v0:${timestamp}:${rawBody}`;
2126
+ const hmac = crypto__default.default.createHmac("sha256", signingSecret);
2127
+ hmac.update(sigBasestring);
2128
+ const expectedSignature = `v0=${hmac.digest("hex")}`;
2129
+ try {
2130
+ return crypto__default.default.timingSafeEqual(
2131
+ Buffer.from(signature),
2132
+ Buffer.from(expectedSignature)
2133
+ );
2134
+ } catch {
2135
+ return false;
2136
+ }
2137
+ }
2138
+ function createWebhookHandler(options) {
2139
+ const { store, signingSecret } = options;
2140
+ return async (request) => {
2141
+ let rawBody;
2142
+ try {
2143
+ rawBody = await request.text();
2144
+ } catch {
2145
+ return jsonResponse2({ error: "Failed to read request body" }, 400);
2146
+ }
2147
+ const signature = request.headers.get("x-slack-signature") ?? "";
2148
+ const timestamp = request.headers.get("x-slack-request-timestamp") ?? "";
2149
+ if (!signature || !timestamp) {
2150
+ return jsonResponse2({ error: "Missing Slack signature headers" }, 401);
2151
+ }
2152
+ if (!verifySlackSignature(signingSecret, signature, timestamp, rawBody)) {
2153
+ return jsonResponse2({ error: "Invalid signature" }, 401);
2154
+ }
2155
+ let payload;
2156
+ try {
2157
+ payload = JSON.parse(rawBody);
2158
+ } catch {
2159
+ return jsonResponse2({ error: "Invalid JSON body" }, 400);
2160
+ }
2161
+ if (payload.type === "url_verification" && payload.challenge) {
2162
+ return new Response(JSON.stringify({ challenge: payload.challenge }), {
2163
+ status: 200,
2164
+ headers: { "Content-Type": "application/json" }
2165
+ });
2166
+ }
2167
+ if (payload.type === "event_callback" && payload.event) {
2168
+ const event = payload.event;
2169
+ if (event.type !== "message") {
2170
+ return jsonResponse2({ ok: true }, 200);
2171
+ }
2172
+ if (event.bot_id || event.subtype === "bot_message") {
2173
+ return jsonResponse2({ ok: true }, 200);
2174
+ }
2175
+ if (!event.thread_ts || event.ts === event.thread_ts) {
2176
+ return jsonResponse2({ ok: true }, 200);
2177
+ }
2178
+ const threadRecord = await store.getThreadByTs(event.thread_ts);
2179
+ if (!threadRecord) {
2180
+ return jsonResponse2({ ok: true }, 200);
2181
+ }
2182
+ const reply = {
2183
+ id: event.ts ?? crypto__default.default.randomUUID(),
2184
+ text: emojify(event.text ?? ""),
2185
+ sender: event.user_profile?.display_name ?? event.user_profile?.real_name ?? event.user ?? "Team",
2186
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
2187
+ threadTs: event.thread_ts
2188
+ };
2189
+ await store.saveReply(threadRecord.sessionId, reply);
2190
+ return jsonResponse2({ ok: true }, 200);
2191
+ }
2192
+ return jsonResponse2({ ok: true }, 200);
2193
+ };
2194
+ }
2195
+ function createExpressWebhookHandler(options) {
2196
+ const { store, signingSecret } = options;
2197
+ return async (req, res) => {
2198
+ const rawBody = typeof req.body === "string" ? req.body : Buffer.isBuffer(req.body) ? req.body.toString("utf-8") : JSON.stringify(req.body);
2199
+ const signature = req.headers?.["x-slack-signature"] ?? "";
2200
+ const timestamp = req.headers?.["x-slack-request-timestamp"] ?? "";
2201
+ if (!signature || !timestamp) {
2202
+ res.status(401).json({ error: "Missing Slack signature headers" });
2203
+ return;
2204
+ }
2205
+ if (!verifySlackSignature(signingSecret, signature, timestamp, rawBody)) {
2206
+ res.status(401).json({ error: "Invalid signature" });
2207
+ return;
2208
+ }
2209
+ let payload;
2210
+ try {
2211
+ payload = typeof req.body === "string" ? JSON.parse(req.body) : Buffer.isBuffer(req.body) ? JSON.parse(req.body.toString("utf-8")) : req.body;
2212
+ } catch {
2213
+ res.status(400).json({ error: "Invalid JSON body" });
2214
+ return;
2215
+ }
2216
+ if (payload.type === "url_verification" && payload.challenge) {
2217
+ res.status(200).json({ challenge: payload.challenge });
2218
+ return;
2219
+ }
2220
+ if (payload.type === "event_callback" && payload.event) {
2221
+ const event = payload.event;
2222
+ if (event.type !== "message") {
2223
+ res.status(200).json({ ok: true });
2224
+ return;
2225
+ }
2226
+ if (event.bot_id || event.subtype === "bot_message") {
2227
+ res.status(200).json({ ok: true });
2228
+ return;
2229
+ }
2230
+ if (!event.thread_ts || event.ts === event.thread_ts) {
2231
+ res.status(200).json({ ok: true });
2232
+ return;
2233
+ }
2234
+ const threadRecord = await store.getThreadByTs(event.thread_ts);
2235
+ if (!threadRecord) {
2236
+ res.status(200).json({ ok: true });
2237
+ return;
2238
+ }
2239
+ const reply = {
2240
+ id: event.ts ?? crypto__default.default.randomUUID(),
2241
+ text: emojify(event.text ?? ""),
2242
+ sender: event.user_profile?.display_name ?? event.user_profile?.real_name ?? event.user ?? "Team",
2243
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
2244
+ threadTs: event.thread_ts
2245
+ };
2246
+ await store.saveReply(threadRecord.sessionId, reply);
2247
+ res.status(200).json({ ok: true });
2248
+ return;
2249
+ }
2250
+ res.status(200).json({ ok: true });
2251
+ };
2252
+ }
2253
+ function jsonResponse2(data, status = 200) {
2254
+ return new Response(JSON.stringify(data), {
2255
+ status,
2256
+ headers: { "Content-Type": "application/json" }
2257
+ });
2258
+ }
2259
+
2260
+ // src/server/replies.ts
2261
+ function createRepliesHandler(options) {
2262
+ const { store } = options;
2263
+ return async (request) => {
2264
+ const url = new URL(request.url);
2265
+ const sessionId = url.searchParams.get("sessionId");
2266
+ const since = url.searchParams.get("since");
2267
+ if (!sessionId) {
2268
+ return jsonResponse3(
2269
+ { error: "Missing required query parameter: sessionId" },
2270
+ 400
2271
+ );
2272
+ }
2273
+ const replies = await store.getReplies(
2274
+ sessionId,
2275
+ since ?? void 0
2276
+ );
2277
+ const response = {
2278
+ replies,
2279
+ lastChecked: (/* @__PURE__ */ new Date()).toISOString()
2280
+ };
2281
+ return jsonResponse3(response, 200);
2282
+ };
2283
+ }
2284
+ function createExpressRepliesHandler(options) {
2285
+ const { store } = options;
2286
+ return async (req, res) => {
2287
+ const sessionId = req.query?.sessionId;
2288
+ const since = req.query?.since;
2289
+ if (!sessionId || typeof sessionId !== "string") {
2290
+ res.status(400).json({ error: "Missing required query parameter: sessionId" });
2291
+ return;
2292
+ }
2293
+ const sinceStr = typeof since === "string" ? since : void 0;
2294
+ const replies = await store.getReplies(sessionId, sinceStr);
2295
+ const response = {
2296
+ replies,
2297
+ lastChecked: (/* @__PURE__ */ new Date()).toISOString()
2298
+ };
2299
+ res.status(200).json(response);
2300
+ };
2301
+ }
2302
+ function jsonResponse3(data, status = 200) {
2303
+ return new Response(JSON.stringify(data), {
2304
+ status,
2305
+ headers: { "Content-Type": "application/json" }
2306
+ });
2307
+ }
2308
+
2309
+ exports.InMemoryStore = InMemoryStore;
149
2310
  exports.createExpressHandler = createExpressHandler;
2311
+ exports.createExpressRepliesHandler = createExpressRepliesHandler;
2312
+ exports.createExpressWebhookHandler = createExpressWebhookHandler;
2313
+ exports.createRepliesHandler = createRepliesHandler;
150
2314
  exports.createSupportHandler = createSupportHandler;
2315
+ exports.createWebhookHandler = createWebhookHandler;
2316
+ exports.emojify = emojify;
151
2317
  exports.validateSlackToken = validateSlackToken;
2318
+ exports.verifySlackSignature = verifySlackSignature;
152
2319
  //# sourceMappingURL=index.cjs.map
153
2320
  //# sourceMappingURL=index.cjs.map