@neoxr/wb 2.6.7 → 3.0.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.
Files changed (46) hide show
  1. package/README.md +2 -2
  2. package/Utils/Cmd.js +2 -0
  3. package/Utils/Connection.js +2 -0
  4. package/Utils/Connector.js +2 -0
  5. package/Utils/Converter.js +2 -0
  6. package/Utils/Cooldown.js +2 -0
  7. package/Utils/Exif.js +2 -0
  8. package/Utils/Function.js +2 -0
  9. package/Utils/Loader.js +2 -0
  10. package/Utils/Local.js +2 -0
  11. package/Utils/Logs.js +2 -0
  12. package/Utils/Message.js +2 -0
  13. package/Utils/Mongo.js +2 -0
  14. package/Utils/Queue.js +2 -0
  15. package/Utils/Scraper.js +2 -0
  16. package/Utils/Serialize.js +2 -0
  17. package/Utils/Session.js +2 -0
  18. package/Utils/Spam.js +2 -0
  19. package/Utils/Store.js +2 -0
  20. package/Utils/_Connection.js +2 -0
  21. package/Utils/_Serialize.js +2 -0
  22. package/Utils/_Store.js +2 -0
  23. package/example/index.js +3 -1
  24. package/example/package.json +3 -3
  25. package/index.js +23 -29
  26. package/package.json +1 -2
  27. package/auto-language/baileys.js +0 -1
  28. package/auto-language/index.js +0 -33
  29. package/host/baileys.js +0 -1
  30. package/host/index.js +0 -31
  31. package/system/baileys.js +0 -1
  32. package/system/converter.js +0 -81
  33. package/system/cooldown.js +0 -1
  34. package/system/exif.js +0 -133
  35. package/system/functions.js +0 -1256
  36. package/system/logs.js +0 -1
  37. package/system/mongo.js +0 -84
  38. package/system/neoxr.js +0 -1
  39. package/system/neoxrApi.js +0 -1
  40. package/system/queue.js +0 -22
  41. package/system/scraper.js +0 -381
  42. package/system/spamDetector.js +0 -1
  43. package/system/translator.js +0 -1
  44. package/system/youtube.js +0 -1
  45. /package/{system/multidb.js → Utils/Multi.js} +0 -0
  46. /package/{system/pg.js → Utils/Postgre.js} +0 -0
@@ -1,1256 +0,0 @@
1
- const axios = require('axios')
2
- const fetch = require('node-fetch')
3
- const cheerio = require('cheerio')
4
- const fs = require('fs')
5
- const mime = require('mime-types')
6
- const chalk = require('chalk')
7
- const path = require('path')
8
- const FormData = require('form-data')
9
- const { fromBuffer } = require('file-type')
10
- const { green, blueBright, redBright } = require('chalk')
11
- const { tmpdir } = require('os')
12
- const moment = require('moment-timezone')
13
- moment.tz.setDefault(process.env.TZ)
14
- const NodeID3 = require('node-id3')
15
- const { read, MIME_JPEG, RESIZE_BILINEAR, AUTO } = require('jimp')
16
- const cloudscraper = require('cloudscraper')
17
- const Miniget = require('miniget')
18
- const stream = require('stream')
19
-
20
- module.exports = class Function {
21
- /* Delay
22
- * @param {Integer} time
23
- */
24
- delay = time => new Promise(res => setTimeout(res, time))
25
-
26
- /* Image Resizer for Thumbnail
27
- * @param {String|Buffer} source
28
- */
29
- createThumb = async (source, width = 200) => {
30
- const { file } = await this.getFile(source)
31
- let jimp = await read(await this.fetchBuffer(file))
32
- let buff = await jimp
33
- .quality(100)
34
- .resize(width, AUTO, RESIZE_BILINEAR)
35
- .getBufferAsync(MIME_JPEG)
36
- return buff
37
- }
38
-
39
- /* URL Validator
40
- * @param {String} url
41
- */
42
- isUrl = (url) => {
43
- return url.match(new RegExp(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%.+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%+.~#?&/=]*)/, 'gi'))
44
- }
45
-
46
- /* Fetching JSON
47
- * @param {String} url
48
- * @param {Object} head
49
- */
50
- fetchJson = async (url, options = {}) => {
51
- try {
52
- const result = await (await axios.get(url, {
53
- ...options
54
- })).data
55
- return result
56
- } catch (e) {
57
- return ({
58
- status: false,
59
- msg: e.message
60
- })
61
- }
62
- }
63
-
64
- /* Converting to Buffer
65
- * @param {String|Buffer} file
66
- * @param {Object} options
67
- */
68
- fetchBuffer = async (file, options = {}) => {
69
- try {
70
- if (this.isUrl(file)) {
71
- const buffer = await (await axios.get(file, {
72
- responseType: "arraybuffer",
73
- ...options
74
- })).data
75
- return buffer
76
- } else {
77
- const buffer = fs.readFileSync(file)
78
- return buffer
79
- }
80
- } catch (e) {
81
- return ({
82
- status: false,
83
- msg: e.message
84
- })
85
- }
86
- }
87
-
88
-
89
- /* Parse Cookie
90
- * @param {String} url
91
- * @param {Object} options
92
- */
93
- parseCookie = async (file, options = {}) => {
94
- return new Promise(async (resolve, reject) => {
95
- try {
96
- let cookie = await (await axios.get(file, {
97
- responseType: "arraybuffer",
98
- headers: options
99
- })).headers['set-cookie']
100
- resolve(cookie)
101
- } catch (e) {
102
- return ({
103
- status: false,
104
- msg: e.message
105
- })
106
- }
107
- })
108
- }
109
-
110
- /* Audio Metadata
111
- * @param {String|Buffer} source
112
- * @param {Object} tags
113
- */
114
- metaAudio = (source, tags = {}) => {
115
- return new Promise(async (resolve) => {
116
- try {
117
- const { status, file, mime } = await this.getFile(await this.fetchBuffer(source))
118
- if (!status) return resolve({
119
- status: false
120
- })
121
- if (!/audio/.test(mime)) return resolve({
122
- status: true,
123
- file
124
- })
125
- NodeID3.write(tags, await this.fetchBuffer(file), function(err, buffer) {
126
- if (err) return resolve({
127
- status: false
128
- })
129
- fs.writeFileSync(file, buffer)
130
- resolve({
131
- status: true,
132
- file
133
- })
134
- })
135
- } catch (e) {
136
- console.log(e)
137
- resolve({
138
- status: false
139
- })
140
- }
141
- })
142
- }
143
-
144
- /* Text Style
145
- * @param {String} type
146
- * @param {String} text
147
- */
148
- texted = (type, text) => {
149
- switch (type) {
150
- case 'bold':
151
- return '*' + text + '*'
152
- break
153
- case 'italic':
154
- return '_' + text + '_'
155
- break
156
- case 'monospace':
157
- return '```' + text + '```'
158
- }
159
- }
160
-
161
- /* Example Format
162
- * @param {String} isPrefix
163
- * @param {String} command
164
- * @param {String} args
165
- */
166
- example = (isPrefix, command, args) => {
167
- return `• ${this.texted('bold', 'Example')} : ${isPrefix + command} ${args}`
168
- }
169
-
170
- /* Fix Instagram URL
171
- * @param {String} url
172
- */
173
- igFixed = (url) => {
174
- let count = url.split('/')
175
- if (count.length == 7) {
176
- let username = count[3]
177
- let destruct = this.removeItem(count, username)
178
- return destruct.map(v => v).join('/')
179
- } else return url
180
- }
181
-
182
- /* Fix Tiktok URL
183
- * @param {String} url
184
- */
185
- ttFixed = (url) => {
186
- if (!url.match(/(tiktok.com\/t\/)/g)) return url
187
- let id = url.split('/t/')[1]
188
- return 'https://vm.tiktok.com/' + id
189
- }
190
-
191
- /* Time Format
192
- * @param {Integer} ms
193
- */
194
- toTime = (ms) => {
195
- let h = Math.floor(ms / 3600000)
196
- let m = Math.floor(ms / 60000) % 60
197
- let s = Math.floor(ms / 1000) % 60
198
- return [h, m, s].map(v => v.toString().padStart(2, 0)).join(':')
199
- }
200
-
201
- /* Readable Time
202
- * @param {Integer} ms
203
- */
204
- readTime = (ms) => {
205
- const days = Math.floor(ms / (24 * 60 * 60 * 1000))
206
- const daysms = ms % (24 * 60 * 60 * 1000)
207
- const hours = Math.floor(daysms / (60 * 60 * 1000))
208
- const hoursms = ms % (60 * 60 * 1000)
209
- const minutes = Math.floor(hoursms / (60 * 1000))
210
- const minutesms = ms % (60 * 1000)
211
- const sec = Math.floor(minutesms / 1000)
212
- const format = [days, hours, minutes, sec].map(v => v.toString().padStart(2, 0))
213
- return {
214
- days: Number(format[0]),
215
- hours: Number(format[1]),
216
- minutes: Number(format[2]),
217
- seconds: Number(format[3])
218
- }
219
- }
220
-
221
- /* Random Filename
222
- * @param {String} extension
223
- */
224
- filename = (extension) => {
225
- return `${Math.floor(Math.random() * 10000)}.${extension}`
226
- }
227
-
228
- /* Create UUID */
229
- uuid = () => {
230
- var dt = new Date().getTime()
231
- var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
232
- var r = (dt + Math.random() * 16) % 16 | 0;
233
- var y = Math.floor(dt / 16);
234
- return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);
235
- });
236
- return uuid
237
- }
238
-
239
- /* Random Element From Array
240
- * @param {Array} list
241
- */
242
- random = (list) => {
243
- return list[Math.floor(Math.random() * list.length)]
244
- }
245
-
246
- /* Random Number
247
- * @param {Integer} min
248
- * @param {Integer} max
249
- */
250
- randomInt = (min, max) => {
251
- min = Math.ceil(min)
252
- max = Math.floor(max)
253
- return Math.floor(Math.random() * (max - min + 1)) + min
254
- }
255
-
256
- /* Format Number \w Dot
257
- * @param {Integer} integer
258
- */
259
- formatter = (integer) => {
260
- let numb = parseInt(integer)
261
- return Number(numb).toLocaleString().replace(/,/g, '.')
262
- }
263
-
264
- formatNumber = (integer) => {
265
- let numb = parseInt(integer)
266
- return Number(numb).toLocaleString().replace(/,/g, '.')
267
- }
268
-
269
- /* H2K Format
270
- * @param {Integer} integer
271
- */
272
- h2k = (integer) => {
273
- let numb = parseInt(integer)
274
- return new Intl.NumberFormat('en-US', {
275
- notation: 'compact'
276
- }).format(numb)
277
- }
278
-
279
- /* To Readable Size
280
- * @param {Integer} size
281
- */
282
- formatSize = (size) => {
283
- function round(value, precision) {
284
- var multiplier = Math.pow(10, precision || 0)
285
- return Math.round(value * multiplier) / multiplier
286
- }
287
- var megaByte = 1024 * 1024
288
- var gigaByte = 1024 * megaByte
289
- var teraByte = 1024 * gigaByte
290
- if (size < 1024) {
291
- return size + ' B'
292
- } else if (size < megaByte) {
293
- return round(size / 1024, 1) + ' KB'
294
- } else if (size < gigaByte) {
295
- return round(size / megaByte, 1) + ' MB'
296
- } else if (size < teraByte) {
297
- return round(size / gigaByte, 1) + ' GB'
298
- } else {
299
- return round(size / teraByte, 1) + ' TB'
300
- }
301
- return ''
302
- }
303
-
304
- /* Fix Instagram URL
305
- * @param {String|Integer} str
306
- */
307
- getSize = async (str) => {
308
- if (!isNaN(str)) return this.formatSize(str)
309
- let header = await (await axios.get(str)).headers
310
- return this.formatSize(header['content-length'])
311
- }
312
-
313
- /* Download File To /tmp Folder
314
- * @param {String|Buffer} source
315
- * @param {String} filename
316
- * @param {String} referer
317
- */
318
- getFile = async (source, filename, options) => {
319
- try {
320
- if (Buffer.isBuffer(source)) {
321
- let ext, mime
322
- try {
323
- mime = await (await fromBuffer(source)).mime
324
- ext = await (await fromBuffer(source)).ext
325
- } catch {
326
- mime = require('mime-types').lookup(filename ? filename.split`.`.pop() : 'txt')
327
- ext = require('mime-types').extension(mime)
328
- }
329
- const extension = filename ? filename.split`.`.pop() : ext
330
- const size = Buffer.byteLength(source)
331
- const filepath = 'temp/' + (this.uuid() + '.' + extension)
332
- const file = fs.writeFileSync(filepath, source)
333
- const name = filename || path.basename(filepath)
334
- return new Promise(resolve => {
335
- const data = {
336
- status: true,
337
- file: filepath,
338
- filename: name,
339
- mime: mime,
340
- extension: ext,
341
- size: this.formatSize(size),
342
- bytes: size
343
- }
344
- return resolve(data)
345
- })
346
- } else if (source.startsWith('./') || source.startsWith('/')) {
347
- const mime = require('mime-types').lookup(filename ? filename.split`.`.pop() : source.split`.`.pop())
348
- const ext = require('mime-types').extension(mime)
349
- const extension = filename ? filename.split`.`.pop() : ext
350
- const size = fs.statSync(source).size
351
- const name = filename || path.basename(source)
352
- return new Promise(resolve => {
353
- const data = {
354
- status: true,
355
- file: source,
356
- filename: name,
357
- mime: mime,
358
- extension: extension,
359
- size: this.formatSize(size),
360
- bytes: size
361
- }
362
- return resolve(data)
363
- })
364
- } else {
365
- return new Promise(resolve => {
366
- try {
367
- const mg = new Miniget(source, {
368
- headers: {
369
- // "Accept": "*/*",
370
- // "Cache-Control": "no-cache",
371
- // "Connection": "Keep-Alive",
372
- "Dnt": "1",
373
- // "Referrer-Policy": "strict-origin-when-cross-origin",
374
- // "sec-ch-ua": '"Chromium";v="107", "Not=A?Brand";v="24"',
375
- // "sec-ch-ua-platform": "Android",
376
- // "sec-fetch-dest": "empty",
377
- // "sec-fetch-mode": "cors",
378
- // "sec-fetch-site": "same-origin",
379
- // "Pragma": "no-cache",
380
- // "Priority": "u=1, i",
381
- // "User-Agent": "Mozilla/5.0 (X11; CrOS x86_64 14541.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
382
- "Upgrade-Insecure-Requests": "1",
383
- // "X-Requested-With": "XMLHttpRequest",
384
- ...options
385
- }
386
- })
387
- mg.on('error', (err) => {
388
- if (err.statusCode > 400) {
389
- resolve({
390
- status: false,
391
- msg: `[${err.statusCode}] : Error while getting file`
392
- })
393
- } else {
394
- resolve({
395
- status: false,
396
- msg: `[${err.message}] : Error while getting file`
397
- })
398
- }
399
- mg.destroy()
400
- })
401
- mg.on('response', (response) => {
402
- if (response.statusCode !== 200) {
403
- resolve({
404
- status: false,
405
- msg: `[${response.statusCode}] : Error while getting file`
406
- })
407
- return
408
- }
409
- const extension = filename ? filename.split`.`.pop() : mime.extension(response.headers['content-type'])
410
- const file = fs.createWriteStream(`temp/${this.uuid() + '.' + extension}`)
411
- const name = filename || path.basename(file.path)
412
- const transformStream = new stream.Transform({
413
- transform(chunk, encoding, callback) {
414
- callback(null, chunk)
415
- }
416
- })
417
- mg.pipe(transformStream).pipe(file)
418
- file.on('finish', () => {
419
- const data = {
420
- status: true,
421
- file: file.path,
422
- filename: name,
423
- mime: mime.lookup(file.path),
424
- extension: extension,
425
- size: this.formatSize(response.headers['content-length'] ? response.headers['content-length'] : 0),
426
- bytes: response.headers['content-length'] ? parseInt(response.headers['content-length']) : 0,
427
- headers: response.headers
428
- }
429
- resolve(data)
430
- })
431
- .on('error', (error) => {
432
- resolve({
433
- status: false,
434
- msg: `Error when getting the file`
435
- })
436
- })
437
- })
438
- } catch (e) {
439
- return ({
440
- status: false,
441
- msg: e.message
442
- })
443
- }
444
- })
445
- }
446
- } catch (e) {
447
- return ({
448
- status: false,
449
- msg: e.message
450
- })
451
- }
452
- }
453
-
454
- /* Generate Color
455
- * @param {String} text
456
- * @param {String} color
457
- */
458
- color = (text, color) => {
459
- return chalk.keyword(color || 'green').bold(text)
460
- }
461
-
462
- /* Get Message Type
463
- * @param {String|Object} data
464
- */
465
- mtype = (data) => {
466
- function replaceAll(str) {
467
- let res = str.replace(new RegExp('```', 'g'), '')
468
- .replace(new RegExp('_', 'g'), '')
469
- .replace(new RegExp(/[*]/, 'g'), '')
470
- return res
471
- }
472
- let type = (typeof data.text !== 'object') ? replaceAll(data.text) : ''
473
- return type
474
- }
475
-
476
- /* Size Limitation
477
- * @param {String} str
478
- * @param {Integer} max
479
- */
480
- sizeLimit = (str, max) => {
481
- let data
482
- if (str.match('G') || str.match('GB') || str.match('T') || str.match('TB')) return data = {
483
- oversize: true
484
- }
485
- if (str.match('M') || str.match('MB')) {
486
- let first = str.replace(/MB|M|G|T/g, '').trim()
487
- if (isNaN(first)) return data = {
488
- oversize: true
489
- }
490
- if (first > max) return data = {
491
- oversize: true
492
- }
493
- return data = {
494
- oversize: false
495
- }
496
- } else {
497
- return data = {
498
- oversize: false
499
- }
500
- }
501
- }
502
-
503
- /* Link Extractor
504
- * @param {String} text
505
- */
506
- generateLink = (text) => {
507
- let regex = /(https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})/gi;
508
- return text.match(regex)
509
- }
510
-
511
- /* File Reloader
512
- * @param {String} file
513
- */
514
- reload = (file) => {
515
- fs.watchFile(file, () => {
516
- fs.unwatchFile(file)
517
- console.log(redBright.bold('[ UPDATE ]'), blueBright(moment(new Date() * 1).format('DD/MM/YY HH:mm:ss')), green.bold('~ ' + path.basename(file)))
518
- delete require.cache[file]
519
- require(file)
520
- })
521
- }
522
-
523
- /* File Reloader V2
524
- * @param {String} file
525
- */
526
- updateFile = file => {
527
- const watcher = fs.watch(file, (eventType, filename) => {
528
- fs.unwatchFile(file)
529
- if (eventType === 'change') {
530
- console.log(redBright.bold('[ UPDATE ]'), blueBright(moment(new Date() * 1).format('DD/MM/YY HH:mm:ss')), green.bold('~ ' + path.basename(file)))
531
- delete require.cache[require.resolve(file)]
532
- require(file)
533
- }
534
- })
535
-
536
- process.on('exit', () => {
537
- watcher.close()
538
- })
539
- }
540
-
541
- /* File Reloader V2
542
- * @param {String} file
543
- */
544
-
545
-
546
- /* Print JSON
547
- * @param {Object} obj
548
- */
549
- jsonFormat = (obj) => {
550
- try {
551
- let print = (obj && (obj.constructor.name == 'Object' || obj.constructor.name == 'Array')) ? require('util').format(JSON.stringify(obj, null, 2)) : require('util').format(obj)
552
- return print
553
- } catch {
554
- return require('util').format(obj)
555
- }
556
- }
557
-
558
- /* Ucword Format
559
- * @param {String} str
560
- */
561
- ucword = (str) => {
562
- return (str + '').replace(/^([a-z])|\s+([a-z])/g, function($1) {
563
- return $1.toUpperCase();
564
- })
565
- }
566
-
567
- /* Next Level Array Concat
568
- * @param {Array} arr
569
- */
570
- arrayJoin = (arr) => {
571
- var construct = []
572
- for (var i = 0; i < arr.length; i++) construct = construct.concat(arr[i])
573
- return construct
574
- }
575
-
576
- /* Remove Element Form Array
577
- * @param {Array} arr
578
- * @param {String} value
579
- */
580
- removeItem = (arr, value) => {
581
- let index = arr.indexOf(value)
582
- if (index > -1) arr.splice(index, 1)
583
- return arr
584
- }
585
-
586
- /* Hitstat
587
- * @param {String} cmd
588
- * @param {String} who
589
- */
590
- hitstat = (cmd, who) => {
591
- if (/bot|help|menu|stat|hitstat|hitdaily/.test(cmd)) return
592
- if (typeof global.db == 'undefined') return
593
- global.db.statistic = global.db.statistic ? global.db.statistic : {}
594
- if (!global.db.statistic[cmd]) {
595
- global.db.statistic[cmd] = {
596
- hitstat: 1,
597
- today: 1,
598
- lasthit: new Date * 1,
599
- sender: who.split`@` [0]
600
- }
601
- } else {
602
- global.db.statistic[cmd].hitstat += 1
603
- global.db.statistic[cmd].today += 1
604
- global.db.statistic[cmd].lasthit = new Date * 1
605
- global.db.statistic[cmd].sender = who.split`@` [0]
606
- }
607
- }
608
-
609
- /* Socmed Link Validator
610
- * @param {String} url
611
- */
612
- socmed = (url) => {
613
- const regex = [
614
- /^(?:https?:\/\/(web\.|www\.|m\.)?(facebook|fb)\.(com|watch)\S+)?$/,
615
- /^(?:https?:\/\/)?(?:www\.)?(?:instagram\.com\/)(?:tv\/|p\/|reel\/)(?:\S+)?$/,
616
- /^(?:https?:\/\/)?(?:www\.)?(?:instagram\.com\/)(?:stories\/)(?:\S+)?$/,
617
- /^(?:https?:\/\/)?(?:www\.)?(?:instagram\.com\/)(?:s\/)(?:\S+)?$/,
618
- /^(?:https?:\/\/)?(?:www\.)?(?:mediafire\.com\/)(?:\S+)?$/,
619
- /pin(?:terest)?(?:\.it|\.com)/,
620
- /^(?:https?:\/\/)?(?:www\.|vt\.|vm\.|t\.)?(?:tiktok\.com\/)(?:\S+)?$/,
621
- /http(?:s)?:\/\/(?:www\.|mobile\.)?twitter\.com\/([a-zA-Z0-9_]+)/,
622
- /^(?:https?:\/\/)?(?:www\.|m\.|music\.)?youtu\.?be(?:\.com)?\/?.*(?:watch|embed)?(?:.*v=|v\/|\/)([\w\-_]+)\&?/,
623
- /^(?:https?:\/\/)?(?:podcasts\.)?(?:google\.com\/)(?:feed\/)(?:\S+)?$/
624
- ]
625
- return regex.some(v => url.match(v))
626
- }
627
-
628
- /* Did You Mean ??
629
- * @param {String} string
630
- * @param {Array} array
631
- * @param {String|Object} options
632
- */
633
- matcher = (string, array, options) => {
634
- function levenshtein(value, other, insensitive) {
635
- var cache = []
636
- var codes = []
637
- var length
638
- var lengthOther
639
- var code
640
- var result
641
- var distance
642
- var distanceOther
643
- var index
644
- var indexOther
645
-
646
- if (value === other) {
647
- return 0
648
- }
649
-
650
- length = value.length
651
- lengthOther = other.length
652
-
653
- if (length === 0) {
654
- return lengthOther
655
- }
656
-
657
- if (lengthOther === 0) {
658
- return length
659
- }
660
-
661
- if (insensitive) {
662
- value = value.toLowerCase()
663
- other = other.toLowerCase()
664
- }
665
-
666
- index = 0
667
-
668
- while (index < length) {
669
- codes[index] = value.charCodeAt(index)
670
- cache[index] = ++index
671
- }
672
-
673
- indexOther = 0
674
-
675
- while (indexOther < lengthOther) {
676
- code = other.charCodeAt(indexOther)
677
- result = distance = indexOther++
678
- index = -1
679
-
680
- while (++index < length) {
681
- distanceOther = code === codes[index] ? distance : distance + 1
682
- distance = cache[index]
683
- cache[index] = result =
684
- distance > result ?
685
- distanceOther > result ?
686
- result + 1 :
687
- distanceOther :
688
- distanceOther > distance ?
689
- distance + 1 :
690
- distanceOther
691
- }
692
- }
693
- return result
694
- }
695
-
696
- function similarity(a, b, options) {
697
- var left = a || ''
698
- var right = b || ''
699
- var insensitive = !(options || {}).sensitive
700
- var longest = Math.max(left.length, right.length)
701
- return ((longest === 0 ?
702
- 1 :
703
- (longest - levenshtein(left, right, insensitive)) / longest) * 100).toFixed(1)
704
- }
705
-
706
- let data = []
707
- let isArray = array.constructor.name == 'Array' ? array : [array] || []
708
- isArray.map(v => data.push({
709
- string: v,
710
- accuracy: similarity(string, v)
711
- }))
712
- return data
713
- }
714
-
715
- /* Miliseconds to Date
716
- * @param {Integer} ms
717
- */
718
- toDate = (ms) => {
719
- let temp = ms
720
- let days = Math.floor(ms / (24 * 60 * 60 * 1000));
721
- let daysms = ms % (24 * 60 * 60 * 1000);
722
- let hours = Math.floor((daysms) / (60 * 60 * 1000));
723
- let hoursms = ms % (60 * 60 * 1000);
724
- let minutes = Math.floor((hoursms) / (60 * 1000));
725
- let minutesms = ms % (60 * 1000);
726
- let sec = Math.floor((minutesms) / (1000));
727
- if (days == 0 && hours == 0 && minutes == 0) {
728
- return "Recently"
729
- } else {
730
- return days + "D " + hours + "H " + minutes + "M";
731
- }
732
- }
733
-
734
- /* Time Formater
735
- * @param {Integer} value
736
- */
737
- timeFormat = (value) => {
738
- const sec = parseInt(value, 10)
739
- let hours = Math.floor(sec / 3600)
740
- let minutes = Math.floor((sec - (hours * 3600)) / 60)
741
- let seconds = sec - (hours * 3600) - (minutes * 60)
742
- if (hours < 10) hours = '0' + hours
743
- if (minutes < 10) minutes = '0' + minutes
744
- if (seconds < 10) seconds = '0' + seconds
745
- if (hours == parseInt('00')) return minutes + ':' + seconds
746
- return hours + ':' + minutes + ':' + seconds
747
- }
748
-
749
- /* Switcher
750
- * @param {Boolen} status
751
- * @param {String} isTrue
752
- * @param {String} isFalse
753
- */
754
- switcher = (status, isTrue, isFalse) => {
755
- return (status) ? this.texted('bold', isTrue) : this.texted('bold', isFalse)
756
- }
757
-
758
- /* Random ID
759
- * @param {Integer} length
760
- */
761
- makeId = (length) => {
762
- var result = ''
763
- var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
764
- var charactersLength = characters.length
765
- for (var i = 0; i < length; i++) {
766
- result += characters.charAt(Math.floor(Math.random() * charactersLength))
767
- }
768
- return result
769
- }
770
-
771
- /* Timeout
772
- * @param {Integer} ms
773
- */
774
- timeReverse = (duration) => {
775
- let milliseconds = parseInt((duration % 1000) / 100),
776
- seconds = Math.floor((duration / 1000) % 60),
777
- minutes = Math.floor((duration / (1000 * 60)) % 60),
778
- hours = Math.floor((duration / (1000 * 60 * 60)) % 24),
779
- days = Math.floor(duration / (24 * 60 * 60 * 1000))
780
- let hoursF = (hours < 10) ? "0" + hours : hours
781
- let minutesF = (minutes < 10) ? "0" + minutes : minutes
782
- let secondsF = (seconds < 10) ? "0" + seconds : seconds
783
- let daysF = (days < 10) ? "0" + days : days
784
- // return hours + " Jam " + minutes + " Menit" + seconds + " Detik" + milliseconds;
785
- return daysF + "D " + hoursF + "H " + minutesF + "M"
786
- }
787
-
788
- /* Timeout
789
- * @param ()
790
- */
791
- greeting = () => {
792
- let time = moment.tz(process.env.TZ || 'Asia/Jakarta').format('HH')
793
- let res = `Don't forget to sleep`
794
- if (time >= 3) res = `Good Evening`
795
- if (time > 6) res = `Good Morning`
796
- if (time >= 11) res = `Good Afternoon`
797
- if (time >= 18) res = `Good Night`
798
- return res
799
- }
800
-
801
- /* Random JSON From File
802
- * @param ()
803
- */
804
- jsonRandom = (file) => {
805
- let json = JSON.parse(fs.readFileSync(file))
806
- return json[Math.floor(Math.random() * json.length)]
807
- }
808
-
809
- /* Leveling
810
- * @param {Integer} xp
811
- * @param {Integer} multiplier
812
- */
813
- level = (xp, multiplier = 5) => {
814
- var XPAsli = xp
815
- var level = 1
816
- while (xp > 1) {
817
- xp /= multiplier
818
- if (xp < 1) {
819
- level == level
820
- } else {
821
- level += 1
822
- }
823
- }
824
- var XPLevel = 1
825
- while (XPAsli >= XPLevel) {
826
- XPLevel = XPLevel + XPLevel
827
- }
828
- var sisaXP = XPLevel - XPAsli
829
- if (sisaXP == 0) sisaXP = XPLevel + XPLevel
830
- let kurang = XPLevel - sisaXP
831
- return [level, XPLevel, sisaXP, kurang]
832
- }
833
-
834
- /* Leveling V2
835
- * @param {Integer} xp
836
- * @param {Integer} multiplier
837
- * @param {Integer} def
838
- */
839
- leveling = (xp, multiplier, def = 87200) => {
840
- const xpLevel1 = def * Number(multiplier)
841
- let currentLevel = (xp <= xpLevel1) ? 1 : Math.floor(xp / xpLevel1)
842
- let nextLevel = currentLevel + 1
843
- let xpToLevelUp = xpLevel1 * nextLevel
844
- let remainingXp = xpToLevelUp - xp
845
- let result = {
846
- currentXp: xp,
847
- currentLevel: currentLevel,
848
- nextLevel: nextLevel,
849
- xpToLevelUp: xpToLevelUp,
850
- remainingXp: remainingXp,
851
- }
852
- return result
853
- }
854
-
855
- /* Roles
856
- * @param {Integer} level
857
- */
858
- role = (level) => {
859
- let roles = '-'
860
- if (level <= 2) {
861
- roles = 'Newbie ㋡'
862
- } else if (level <= 4) {
863
- roles = 'Beginner Grade 1 ⚊¹'
864
- } else if (level <= 6) {
865
- roles = 'Beginner Grade 2 ⚊²'
866
- } else if (level <= 8) {
867
- roles = 'Beginner Grade 3 ⚊³'
868
- } else if (level <= 10) {
869
- roles = 'Beginner Grade 4 ⚊⁴'
870
- } else if (level <= 12) {
871
- roles = 'Private Grade 1 ⚌¹'
872
- } else if (level <= 14) {
873
- roles = 'Private Grade 2 ⚌²'
874
- } else if (level <= 16) {
875
- roles = 'Private Grade 3 ⚌³'
876
- } else if (level <= 18) {
877
- roles = 'Private Grade 4 ⚌⁴'
878
- } else if (level <= 20) {
879
- roles = 'Private Grade 5 ⚌⁵'
880
- } else if (level <= 22) {
881
- roles = 'Corporal Grade 1 ☰¹'
882
- } else if (level <= 24) {
883
- roles = 'Corporal Grade 2 ☰²'
884
- } else if (level <= 26) {
885
- roles = 'Corporal Grade 3 ☰³'
886
- } else if (level <= 28) {
887
- roles = 'Corporal Grade 4 ☰⁴'
888
- } else if (level <= 30) {
889
- roles = 'Corporal Grade 5 ☰⁵'
890
- } else if (level <= 32) {
891
- roles = 'Sergeant Grade 1 ≣¹'
892
- } else if (level <= 34) {
893
- roles = 'Sergeant Grade 2 ≣²'
894
- } else if (level <= 36) {
895
- roles = 'Sergeant Grade 3 ≣³'
896
- } else if (level <= 38) {
897
- roles = 'Sergeant Grade 4 ≣⁴'
898
- } else if (level <= 40) {
899
- roles = 'Sergeant Grade 5 ≣⁵'
900
- } else if (level <= 42) {
901
- roles = 'Staff Grade 1 ﹀¹'
902
- } else if (level <= 44) {
903
- roles = 'Staff Grade 2 ﹀²'
904
- } else if (level <= 46) {
905
- roles = 'Staff Grade 3 ﹀³'
906
- } else if (level <= 48) {
907
- roles = 'Staff Grade 4 ﹀⁴'
908
- } else if (level <= 50) {
909
- roles = 'Staff Grade 5 ﹀⁵'
910
- } else if (level <= 52) {
911
- roles = 'Sergeant Grade 1 ︾¹'
912
- } else if (level <= 54) {
913
- roles = 'Sergeant Grade 2 ︾²'
914
- } else if (level <= 56) {
915
- roles = 'Sergeant Grade 3 ︾³'
916
- } else if (level <= 58) {
917
- roles = 'Sergeant Grade 4 ︾⁴'
918
- } else if (level <= 60) {
919
- roles = 'Sergeant Grade 5 ︾⁵'
920
- } else if (level <= 62) {
921
- roles = '2nd Lt. Grade 1 ♢¹ '
922
- } else if (level <= 64) {
923
- roles = '2nd Lt. Grade 2 ♢²'
924
- } else if (level <= 66) {
925
- roles = '2nd Lt. Grade 3 ♢³'
926
- } else if (level <= 68) {
927
- roles = '2nd Lt. Grade 4 ♢⁴'
928
- } else if (level <= 70) {
929
- roles = '2nd Lt. Grade 5 ♢⁵'
930
- } else if (level <= 72) {
931
- roles = '1st Lt. Grade 1 ♢♢¹'
932
- } else if (level <= 74) {
933
- roles = '1st Lt. Grade 2 ♢♢²'
934
- } else if (level <= 76) {
935
- roles = '1st Lt. Grade 3 ♢♢³'
936
- } else if (level <= 78) {
937
- roles = '1st Lt. Grade 4 ♢♢⁴'
938
- } else if (level <= 80) {
939
- roles = '1st Lt. Grade 5 ♢♢⁵'
940
- } else if (level <= 82) {
941
- roles = 'Major Grade 1 ✷¹'
942
- } else if (level <= 84) {
943
- roles = 'Major Grade 2 ✷²'
944
- } else if (level <= 86) {
945
- roles = 'Major Grade 3 ✷³'
946
- } else if (level <= 88) {
947
- roles = 'Major Grade 4 ✷⁴'
948
- } else if (level <= 90) {
949
- roles = 'Major Grade 5 ✷⁵'
950
- } else if (level <= 92) {
951
- roles = 'Colonel Grade 1 ✷✷¹'
952
- } else if (level <= 94) {
953
- roles = 'Colonel Grade 2 ✷✷²'
954
- } else if (level <= 96) {
955
- roles = 'Colonel Grade 3 ✷✷³'
956
- } else if (level <= 98) {
957
- roles = 'Colonel Grade 4 ✷✷⁴'
958
- } else if (level <= 100) {
959
- roles = 'Colonel Grade 5 ✷✷⁵'
960
- } else if (level <= 102) {
961
- roles = 'Brigadier Early ✰'
962
- } else if (level <= 104) {
963
- roles = 'Brigadier Silver ✩'
964
- } else if (level <= 106) {
965
- roles = 'Brigadier gold ✯'
966
- } else if (level <= 108) {
967
- roles = 'Brigadier Platinum ✬'
968
- } else if (level <= 110) {
969
- roles = 'Brigadier Diamond ✪'
970
- } else if (level <= 112) {
971
- roles = 'Major General Early ✰'
972
- } else if (level <= 114) {
973
- roles = 'Major General Silver ✩'
974
- } else if (level <= 116) {
975
- roles = 'Major General gold ✯'
976
- } else if (level <= 118) {
977
- roles = 'Major General Platinum ✬'
978
- } else if (level <= 120) {
979
- roles = 'Major General Diamond ✪'
980
- } else if (level <= 122) {
981
- roles = 'Lt. General Early ✰'
982
- } else if (level <= 124) {
983
- roles = 'Lt. General Silver ✩'
984
- } else if (level <= 126) {
985
- roles = 'Lt. General gold ✯'
986
- } else if (level <= 128) {
987
- roles = 'Lt. General Platinum ✬'
988
- } else if (level <= 130) {
989
- roles = 'Lt. General Diamond ✪'
990
- } else if (level <= 132) {
991
- roles = 'General Early ✰'
992
- } else if (level <= 134) {
993
- roles = 'General Silver ✩'
994
- } else if (level <= 136) {
995
- roles = 'General gold ✯'
996
- } else if (level <= 138) {
997
- roles = 'General Platinum ✬'
998
- } else if (level <= 140) {
999
- roles = 'General Diamond ✪'
1000
- } else if (level <= 142) {
1001
- roles = 'Commander Early ★'
1002
- } else if (level <= 144) {
1003
- roles = 'Commander Intermediate ⍣'
1004
- } else if (level <= 146) {
1005
- roles = 'Commander Elite ≛'
1006
- } else if (level <= 148) {
1007
- roles = 'The Commander Hero ⍟'
1008
- } else if (level <= 152) {
1009
- roles = 'Legends 忍'
1010
- } else if (level <= 154) {
1011
- roles = 'Legends 忍'
1012
- } else if (level <= 156) {
1013
- roles = 'Legends 忍'
1014
- } else if (level <= 158) {
1015
- roles = 'Legends 忍'
1016
- } else if (level <= 160) {
1017
- roles = 'Legends 忍'
1018
- } else if (level <= 162) {
1019
- roles = 'Legends 忍'
1020
- } else if (level <= 164) {
1021
- roles = 'Legends 忍'
1022
- } else if (level <= 166) {
1023
- roles = 'Legends 忍'
1024
- } else if (level <= 168) {
1025
- roles = 'Legends 忍'
1026
- } else if (level <= 170) {
1027
- roles = 'Legends 忍'
1028
- } else if (level <= 172) {
1029
- roles = 'Legends 忍'
1030
- } else if (level <= 174) {
1031
- roles = 'Legends 忍'
1032
- } else if (level <= 176) {
1033
- roles = 'Legends 忍'
1034
- } else if (level <= 178) {
1035
- roles = 'Legends 忍'
1036
- } else if (level <= 180) {
1037
- roles = 'Legends 忍'
1038
- } else if (level <= 182) {
1039
- roles = 'Legends 忍'
1040
- } else if (level <= 184) {
1041
- roles = 'Legends 忍'
1042
- } else if (level <= 186) {
1043
- roles = 'Legends 忍'
1044
- } else if (level <= 188) {
1045
- roles = 'Legends 忍'
1046
- } else if (level <= 190) {
1047
- roles = 'Legends 忍'
1048
- } else if (level <= 192) {
1049
- roles = 'Legends 忍'
1050
- } else if (level <= 194) {
1051
- roles = 'Legends 忍'
1052
- } else if (level <= 196) {
1053
- roles = 'Legends 忍'
1054
- } else if (level <= 198) {
1055
- roles = 'Legends 忍'
1056
- } else if (level <= 200) {
1057
- roles = 'Legends 忍'
1058
- } else if (level <= 210) {
1059
- roles = 'Legends 忍'
1060
- } else if (level <= 220) {
1061
- roles = 'Legends 忍'
1062
- } else if (level <= 230) {
1063
- roles = 'Legends 忍'
1064
- } else if (level <= 240) {
1065
- roles = 'Legends 忍'
1066
- } else if (level <= 250) {
1067
- roles = 'Legends 忍'
1068
- } else if (level <= 260) {
1069
- roles = 'Legends 忍'
1070
- } else if (level <= 270) {
1071
- roles = 'Legends 忍'
1072
- } else if (level <= 280) {
1073
- roles = 'Legends 忍'
1074
- } else if (level <= 290) {
1075
- roles = 'Legends 忍'
1076
- } else if (level <= 300) {
1077
- roles = 'Legends 忍'
1078
- } else if (level <= 310) {
1079
- roles = 'Legends 忍'
1080
- } else if (level <= 320) {
1081
- roles = 'Legends 忍'
1082
- } else if (level <= 330) {
1083
- roles = 'Legends 忍'
1084
- } else if (level <= 340) {
1085
- roles = 'Legends 忍'
1086
- } else if (level <= 350) {
1087
- roles = 'Legends 忍'
1088
- } else if (level <= 360) {
1089
- roles = 'Legends 忍'
1090
- } else if (level <= 370) {
1091
- roles = 'Legends 忍'
1092
- } else if (level <= 380) {
1093
- roles = 'Legends 忍'
1094
- } else if (level <= 390) {
1095
- roles = 'Legends 忍'
1096
- } else if (level <= 400) {
1097
- roles = 'Legends 忍'
1098
- } else if (level <= 410) {
1099
- roles = 'Legends 忍'
1100
- } else if (level <= 420) {
1101
- roles = 'Legends 忍'
1102
- } else if (level <= 430) {
1103
- roles = 'Legends 忍'
1104
- } else if (level <= 440) {
1105
- roles = 'Legends 忍'
1106
- } else if (level <= 450) {
1107
- roles = 'Legends 忍'
1108
- } else if (level <= 460) {
1109
- roles = 'Legends 忍'
1110
- } else if (level <= 470) {
1111
- roles = 'Legends 忍'
1112
- } else if (level <= 480) {
1113
- roles = 'Legends 忍'
1114
- } else if (level <= 490) {
1115
- roles = 'Legends 忍'
1116
- } else if (level <= 500) {
1117
- roles = 'Legends 忍'
1118
- } else if (level <= 600) {
1119
- roles = 'Legends 忍'
1120
- } else if (level <= 700) {
1121
- roles = 'Legends 忍'
1122
- } else if (level <= 800) {
1123
- roles = 'Legends 忍'
1124
- } else if (level <= 900) {
1125
- roles = 'Legends 忍'
1126
- } else if (level <= 1000) {
1127
- roles = 'Legends 忍'
1128
- } else if (level <= 2000) {
1129
- roles = 'Legends 忍'
1130
- } else if (level <= 3000) {
1131
- roles = 'Legends 忍'
1132
- } else if (level <= 4000) {
1133
- roles = 'Legends 忍'
1134
- } else if (level <= 5000) {
1135
- roles = 'Legends 忍'
1136
- } else if (level <= 6000) {
1137
- roles = 'Legends 忍'
1138
- } else if (level <= 7000) {
1139
- roles = 'Legends 忍'
1140
- } else if (level <= 8000) {
1141
- roles = 'Legends 忍'
1142
- } else if (level <= 9000) {
1143
- roles = 'Legends 忍'
1144
- } else if (level <= 10000) {
1145
- roles = 'Legends 忍'
1146
- }
1147
- return roles
1148
- }
1149
-
1150
- /* Text Cutter
1151
- * @param {String} text
1152
- */
1153
- filter = (text) => {
1154
- if (text.length > 10) {
1155
- return text.substr(text.length - 5)
1156
- } else if (text.length > 7) {
1157
- return text.substr(text.length - 4)
1158
- } else if (text.length > 5) {
1159
- return text.substr(text.length - 3)
1160
- } else if (text.length > 2) {
1161
- return text.substr(text.length - 2)
1162
- } else if (text.length > 1) {
1163
- return text.substr(text.length - 1)
1164
- }
1165
- }
1166
-
1167
- /* Random String
1168
- * @param {String} text
1169
- */
1170
- randomString = (len, charSet) => {
1171
- charSet = charSet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/+=*-%$();?!#@';
1172
- var randomString = '';
1173
- for (var i = 0; i < len; i++) {
1174
- var randomPoz = Math.floor(Math.random() * charSet.length);
1175
- randomString += charSet.substring(randomPoz, randomPoz + 1);
1176
- }
1177
- return randomString
1178
- }
1179
-
1180
- /* Remove Emoji
1181
- * @param {String} string
1182
- */
1183
- removeEmojis = (string) => {
1184
- var regex = /(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/g;
1185
- return string.replace(regex, '')
1186
- }
1187
-
1188
- /* Image Resizer
1189
- * @param {Buffer} buffer
1190
- * @param {Integer} x
1191
- * @param {Integer} y
1192
- */
1193
- reSize = async (buffer, x, z) => {
1194
- return new Promise(async (resolve, reject) => {
1195
- var buff = await read(buffer)
1196
- var ab = await buff.resize(x, z).getBufferAsync(MIME_JPEG)
1197
- resolve(ab)
1198
- })
1199
- }
1200
-
1201
- /* Text Style
1202
- * @param {String} text
1203
- * @param {Integer} style
1204
- */
1205
- Styles = (text, style = 1) => {
1206
- var xStr = 'abcdefghijklmnopqrstuvwxyz1234567890'.split('')
1207
- var yStr = Object.freeze({
1208
- 1: 'ᴀʙᴄᴅᴇꜰɢʜɪᴊᴋʟᴍɴᴏᴘqʀꜱᴛᴜᴠᴡxʏᴢ1234567890'
1209
- })
1210
- var replacer = []
1211
- xStr.map((v, i) => replacer.push({
1212
- original: v,
1213
- convert: yStr[style].split('')[i]
1214
- }))
1215
- var str = text.toLowerCase().split('')
1216
- var output = []
1217
- str.map(v => {
1218
- const find = replacer.find(x => x.original == v)
1219
- find ? output.push(find.convert) : output.push(v)
1220
- })
1221
- return output.join('')
1222
- }
1223
-
1224
- /* Log File
1225
- * @param {String} log
1226
- * @param {String} filename
1227
- */
1228
- logFile = (log, filename = 'bot') => {
1229
- const log_file = fs.createWriteStream(path.join(process.cwd(), `${filename}.log`), {
1230
- flags: 'a'
1231
- })
1232
- const time = moment(new Date() * 1).format('DD/MM/YY HH:mm:ss')
1233
- log_file.write(`[${time}] - ${log}\n`)
1234
- }
1235
-
1236
- /* Get Emoji from String
1237
- * @param {String} str
1238
- */
1239
- getEmoji = str => {
1240
- const regex = /[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26D3\uFE0F?(?:\u200D\uD83D\uDCA5)?|\u26F9(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF43\uDF45-\uDF4A\uDF4C-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDF44(?:\u200D\uD83D\uDFEB)?|\uDF4B(?:\u200D\uD83D\uDFE9)?|\uDFC3(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4\uDEB5](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE41\uDE43\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC08(?:\u200D\u2B1B)?|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC26(?:\u200D(?:\u2B1B|\uD83D\uDD25))?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE])))?))?|\uDC6F(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDD75(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?|\uDE42(?:\u200D[\u2194\u2195]\uFE0F?)?|\uDEB6(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE88\uDE90-\uDEBD\uDEBF-\uDEC2\uDECE-\uDEDB\uDEE0-\uDEE8]|\uDD3C(?:\u200D[\u2640\u2642]\uFE0F?|\uD83C[\uDFFB-\uDFFF])?|\uDDCE(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1|\uDDD1\u200D\uD83E\uDDD2(?:\u200D\uD83E\uDDD2)?|\uDDD2(?:\u200D\uD83E\uDDD2)?))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)/g
1241
- return str.match(regex)
1242
- }
1243
-
1244
- /* Emoji Prefix Check
1245
- * @param {String} str
1246
- */
1247
- isEmojiPrefix = str => {
1248
- const regex = /^(?:[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26D3\uFE0F?(?:\u200D\uD83D\uDCA5)?|\u26F9(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF43\uDF45-\uDF4A\uDF4C-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDF44(?:\u200D\uD83D\uDFEB)?|\uDF4B(?:\u200D\uD83D\uDFE9)?|\uDFC3(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4\uDEB5](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE41\uDE43\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC08(?:\u200D\u2B1B)?|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC26(?:\u200D(?:\u2B1B|\uD83D\uDD25))?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE])))?))?|\uDC6F(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDD75(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?|\uDE42(?:\u200D[\u2194\u2195]\uFE0F?)?|\uDEB6(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE88\uDE90-\uDEBD\uDEBF-\uDEC2\uDECE-\uDEDB\uDEE0-\uDEE8]|\uDD3C(?:\u200D[\u2640\u2642]\uFE0F?|\uD83C[\uDFFB-\uDFFF])?|\uDDCE(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1|\uDDD1\u200D\uD83E\uDDD2(?:\u200D\uD83E\uDDD2)?|\uDDD2(?:\u200D\uD83E\uDDD2)?))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?))\w+/;
1249
- return regex.test(str)
1250
- }
1251
-
1252
- /* Get Device
1253
- * @param {String} id
1254
- */
1255
- getDevice = id => id.length > 21 ? 'Android' : id.substring(0, 2) === '3A' ? 'IOS' : 'WhatsApp Web'
1256
- }