@bigbinary/neeto-molecules 5.2.16 → 5.2.18

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 (44) hide show
  1. package/dist/AuditLogs.js +33 -2
  2. package/dist/AuditLogs.js.map +1 -1
  3. package/dist/BrowserSupport.js +1 -1
  4. package/dist/DownloadMobileAppCallout.js +1 -1
  5. package/dist/FloatingActionMenu.js +1 -1
  6. package/dist/KeyboardShortcuts.js +1 -1
  7. package/dist/cjs/AuditLogs.js +33 -2
  8. package/dist/cjs/AuditLogs.js.map +1 -1
  9. package/dist/cjs/BrowserSupport.js +2 -2
  10. package/dist/cjs/BrowserSupport.js.map +1 -1
  11. package/dist/cjs/DownloadMobileAppCallout.js +2 -2
  12. package/dist/cjs/DownloadMobileAppCallout.js.map +1 -1
  13. package/dist/cjs/FloatingActionMenu.js +1 -1
  14. package/dist/cjs/KeyboardShortcuts.js +2 -2
  15. package/dist/cjs/KeyboardShortcuts.js.map +1 -1
  16. package/dist/cjs/v2/AuditLogs.js +33 -2
  17. package/dist/cjs/v2/AuditLogs.js.map +1 -1
  18. package/dist/cjs/v2/BrowserSupport.js +2 -2
  19. package/dist/cjs/v2/BrowserSupport.js.map +1 -1
  20. package/dist/cjs/v2/DownloadMobileAppCallout.js +2 -2
  21. package/dist/cjs/v2/DownloadMobileAppCallout.js.map +1 -1
  22. package/dist/cjs/v2/FloatingActionMenu.js +1 -1
  23. package/dist/cjs/v2/KeyboardShortcuts.js +2 -2
  24. package/dist/cjs/v2/KeyboardShortcuts.js.map +1 -1
  25. package/dist/cjs/v2/Metadata.js +12 -8
  26. package/dist/cjs/v2/Metadata.js.map +1 -1
  27. package/dist/cjs/v2/SessionEnvironment.js +6 -5
  28. package/dist/cjs/v2/SessionEnvironment.js.map +1 -1
  29. package/dist/v2/AuditLogs.js +33 -2
  30. package/dist/v2/AuditLogs.js.map +1 -1
  31. package/dist/v2/BrowserSupport.js +1 -1
  32. package/dist/v2/DownloadMobileAppCallout.js +1 -1
  33. package/dist/v2/FloatingActionMenu.js +1 -1
  34. package/dist/v2/KeyboardShortcuts.js +1 -1
  35. package/dist/v2/Metadata.js +12 -8
  36. package/dist/v2/Metadata.js.map +1 -1
  37. package/dist/v2/SessionEnvironment.js +6 -5
  38. package/dist/v2/SessionEnvironment.js.map +1 -1
  39. package/package.json +4 -3
  40. package/src/translations/en.json +17 -16
  41. package/dist/cjs/ua-parser-DN07nD-R.js +0 -1522
  42. package/dist/cjs/ua-parser-DN07nD-R.js.map +0 -1
  43. package/dist/ua-parser-BLkTkt4a.js +0 -1520
  44. package/dist/ua-parser-BLkTkt4a.js.map +0 -1
@@ -1,1522 +0,0 @@
1
- 'use strict';
2
-
3
- // Generated ESM version of ua-parser-js
4
- // DO NOT EDIT THIS FILE!
5
- // Source: /src/main/ua-parser.js
6
-
7
- /////////////////////////////////////////////////////////////////////////////////
8
- /* UAParser.js v2.0.10
9
- Copyright © 2012-2026 Faisal Salman <f@faisalman.com>
10
- AGPLv3 License *//*
11
- Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
12
- Supports browser & node.js environment.
13
- Demo : https://uaparser.dev
14
- Source : https://github.com/faisalman/ua-parser-js */
15
- /////////////////////////////////////////////////////////////////////////////////
16
-
17
- /* jshint esversion: 6 */
18
- /* globals window */
19
-
20
-
21
-
22
- //////////////
23
- // Constants
24
- /////////////
25
-
26
- var LIBVERSION = '2.0.10',
27
- UA_MAX_LENGTH = 500,
28
- USER_AGENT = 'user-agent',
29
- EMPTY = '',
30
- UNKNOWN = '?',
31
- TYPEOF = {
32
- FUNCTION : 'function',
33
- OBJECT : 'object',
34
- STRING : 'string',
35
- UNDEFINED : 'undefined'
36
- },
37
-
38
- // properties
39
- BROWSER = 'browser',
40
- CPU = 'cpu',
41
- DEVICE = 'device',
42
- ENGINE = 'engine',
43
- OS = 'os',
44
- RESULT = 'result',
45
-
46
- NAME = 'name',
47
- TYPE = 'type',
48
- VENDOR = 'vendor',
49
- VERSION = 'version',
50
- ARCHITECTURE= 'architecture',
51
- MAJOR = 'major',
52
- MODEL = 'model',
53
-
54
- // device types
55
- CONSOLE = 'console',
56
- MOBILE = 'mobile',
57
- TABLET = 'tablet',
58
- SMARTTV = 'smarttv',
59
- WEARABLE = 'wearable',
60
- XR = 'xr',
61
- EMBEDDED = 'embedded',
62
-
63
- // browser types
64
- FETCHER = 'fetcher',
65
- INAPP = 'inapp',
66
-
67
- // client hints
68
- BRANDS = 'brands',
69
- FORMFACTORS = 'formFactors',
70
- FULLVERLIST = 'fullVersionList',
71
- PLATFORM = 'platform',
72
- PLATFORMVER = 'platformVersion',
73
- BITNESS = 'bitness',
74
- CH = 'sec-ch-ua',
75
- CH_FULL_VER_LIST= CH + '-full-version-list',
76
- CH_ARCH = CH + '-arch',
77
- CH_BITNESS = CH + '-' + BITNESS,
78
- CH_FORM_FACTORS = CH + '-form-factors',
79
- CH_MOBILE = CH + '-' + MOBILE,
80
- CH_MODEL = CH + '-' + MODEL,
81
- CH_PLATFORM = CH + '-' + PLATFORM,
82
- CH_PLATFORM_VER = CH_PLATFORM + '-version',
83
- CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS],
84
-
85
- // device vendors
86
- AMAZON = 'Amazon',
87
- APPLE = 'Apple',
88
- ASUS = 'ASUS',
89
- BLACKBERRY = 'BlackBerry',
90
- GOOGLE = 'Google',
91
- HUAWEI = 'Huawei',
92
- LENOVO = 'Lenovo',
93
- HONOR = 'Honor',
94
- LG = 'LG',
95
- MICROSOFT = 'Microsoft',
96
- MOTOROLA = 'Motorola',
97
- NVIDIA = 'Nvidia',
98
- ONEPLUS = 'OnePlus',
99
- OPPO = 'OPPO',
100
- SAMSUNG = 'Samsung',
101
- SHARP = 'Sharp',
102
- SONY = 'Sony',
103
- XIAOMI = 'Xiaomi',
104
- ZEBRA = 'Zebra',
105
-
106
- // browsers
107
- CHROME = 'Chrome',
108
- CHROMIUM = 'Chromium',
109
- CHROMECAST = 'Chromecast',
110
- EDGE = 'Edge',
111
- FIREFOX = 'Firefox',
112
- OPERA = 'Opera',
113
- FACEBOOK = 'Facebook',
114
- SOGOU = 'Sogou',
115
-
116
- PREFIX_MOBILE = 'Mobile ',
117
- SUFFIX_BROWSER = ' Browser',
118
-
119
- // os
120
- WINDOWS = 'Windows';
121
-
122
- var isWindow = typeof window !== TYPEOF.UNDEFINED,
123
- NAVIGATOR = (isWindow && window.navigator) ?
124
- window.navigator :
125
- undefined,
126
- NAVIGATOR_UADATA = (NAVIGATOR && NAVIGATOR.userAgentData) ?
127
- NAVIGATOR.userAgentData :
128
- undefined;
129
-
130
- ///////////
131
- // Helper
132
- //////////
133
-
134
- var extend = function (defaultRgx, extensions) {
135
- var mergedRgx = {};
136
- var extraRgx = extensions;
137
- if (!isExtensions(extensions)) {
138
- extraRgx = {};
139
- for (var i in extensions) {
140
- for (var j in extensions[i]) {
141
- extraRgx[j] = extensions[i][j].concat(extraRgx[j] ? extraRgx[j] : []);
142
- }
143
- }
144
- }
145
- for (var k in defaultRgx) {
146
- mergedRgx[k] = extraRgx[k] && extraRgx[k].length % 2 === 0 ? extraRgx[k].concat(defaultRgx[k]) : defaultRgx[k];
147
- }
148
- return mergedRgx;
149
- },
150
- enumerize = function (arr) {
151
- var enums = {};
152
- for (var i=0; i<arr.length; i++) {
153
- enums[arr[i].toUpperCase()] = arr[i];
154
- }
155
- return enums;
156
- },
157
- has = function (str1, str2) {
158
- if (typeof str1 === TYPEOF.OBJECT && str1.length > 0) {
159
- for (var i in str1) {
160
- if (lowerize(str2) == lowerize(str1[i])) return true;
161
- }
162
- return false;
163
- }
164
- return isString(str1) ? lowerize(str2) == lowerize(str1) : false;
165
- },
166
- isExtensions = function (obj, deep) {
167
- for (var prop in obj) {
168
- return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);
169
- }
170
- },
171
- isString = function (val) {
172
- return typeof val === TYPEOF.STRING;
173
- },
174
- itemListToArray = function (header) {
175
- if (!header) return undefined;
176
- var arr = [];
177
- var tokens = normalizeHeaderValue(header).split(',');
178
- for (var i = 0; i < tokens.length; i++) {
179
- if (tokens[i].indexOf(';') > -1) {
180
- var token = trim(tokens[i]).split(';v=');
181
- arr[i] = { brand : token[0], version : token[1] };
182
- } else {
183
- arr[i] = trim(tokens[i]);
184
- }
185
- }
186
- return arr;
187
- },
188
- lowerize = function (str) {
189
- return isString(str) ? str.toLowerCase() : str;
190
- },
191
- majorize = function (version) {
192
- return isString(version) ? strip(/[^\d\.]/g, version).split('.')[0] : undefined;
193
- },
194
- normalizeHeaderValue = function (str) {
195
- return isString(str) ? trim(strip(/\\?\"/g, str), UA_MAX_LENGTH) : undefined;
196
- },
197
- setProps = function (arr) {
198
- for (var i in arr) {
199
- if (!arr.hasOwnProperty(i)) continue;
200
-
201
- var propName = arr[i];
202
- if (typeof propName == TYPEOF.OBJECT && propName.length == 2) {
203
- this[propName[0]] = propName[1];
204
- } else {
205
- this[propName] = undefined;
206
- }
207
- }
208
- return this;
209
- },
210
- strip = function (pattern, str) {
211
- return isString(str) ? str.replace(pattern, EMPTY) : str;
212
- },
213
- trim = function (str, len) {
214
- str = strip(/^\s\s*/, String(str));
215
- return typeof len === TYPEOF.UNDEFINED ? str : str.substring(0, len);
216
- };
217
-
218
- ///////////////
219
- // Map helper
220
- //////////////
221
-
222
- var rgxMapper = function (ua, arrays) {
223
-
224
- if(!ua || !arrays) return;
225
-
226
- var i = 0, j, k, p, q, matches, match;
227
-
228
- // loop through all regexes maps
229
- while (i < arrays.length && !matches) {
230
-
231
- var regex = arrays[i], // even sequence (0,2,4,..)
232
- props = arrays[i + 1]; // odd sequence (1,3,5,..)
233
- j = k = 0;
234
-
235
- // try matching uastring with regexes
236
- while (j < regex.length && !matches) {
237
-
238
- if (!regex[j]) { break; }
239
- matches = regex[j++].exec(ua);
240
-
241
- if (!!matches) {
242
- for (p = 0; p < props.length; p++) {
243
- match = matches[++k];
244
- q = props[p];
245
- // check if given property is actually array
246
- if (typeof q === TYPEOF.OBJECT && q.length > 0) {
247
- if (q.length === 2) {
248
- if (typeof q[1] == TYPEOF.FUNCTION) {
249
- // assign modified match
250
- this[q[0]] = q[1].call(this, match);
251
- } else {
252
- // assign given value, ignore regex match
253
- this[q[0]] = q[1];
254
- }
255
- } else if (q.length >= 3) {
256
- // Check whether q[1] FUNCTION or REGEX
257
- if (typeof q[1] === TYPEOF.FUNCTION && !(q[1].exec && q[1].test)) {
258
- if (q.length > 3) {
259
- this[q[0]] = match ? q[1].apply(this, q.slice(2)) : undefined;
260
- } else {
261
- // call function (usually string mapper)
262
- this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
263
- }
264
- } else {
265
- if (q.length == 3) {
266
- // sanitize match using given regex
267
- this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
268
- } else if (q.length == 4) {
269
- this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
270
- } else if (q.length > 4) {
271
- this[q[0]] = match ? q[3].apply(this, [match.replace(q[1], q[2])].concat(q.slice(4))) : undefined;
272
- }
273
- }
274
- }
275
- } else {
276
- this[q] = match ? match : undefined;
277
- }
278
- }
279
- }
280
- }
281
- i += 2;
282
- }
283
- },
284
-
285
- strTest = function (str, map) {
286
- return map.test.test(str) ? map.ifTrue : map.ifFalse;
287
- },
288
-
289
- strMapper = function (str, map) {
290
-
291
- for (var i in map) {
292
- // check if current value is array
293
- if (typeof map[i] === TYPEOF.OBJECT && map[i].length > 0) {
294
- for (var j = 0; j < map[i].length; j++) {
295
- if (has(map[i][j], str)) {
296
- return (i === UNKNOWN) ? undefined : i;
297
- }
298
- }
299
- } else if (has(map[i], str)) {
300
- return (i === UNKNOWN) ? undefined : i;
301
- }
302
- }
303
- return map.hasOwnProperty('*') ? map['*'] : str;
304
- };
305
-
306
- ///////////////
307
- // String map
308
- //////////////
309
-
310
- var windowsVersionMap = {
311
- 'ME' : '4.90',
312
- 'NT 3.51': '3.51',
313
- 'NT 4.0': '4.0',
314
- '2000' : ['5.0', '5.01'],
315
- 'XP' : ['5.1', '5.2'],
316
- 'Vista' : '6.0',
317
- '7' : '6.1',
318
- '8' : '6.2',
319
- '8.1' : '6.3',
320
- '10' : ['6.4', '10.0'],
321
- 'NT' : ''
322
- },
323
-
324
- formFactorsMap = {
325
- 'embedded' : 'Automotive',
326
- 'mobile' : 'Mobile',
327
- 'tablet' : ['Tablet', 'EInk'],
328
- 'smarttv' : 'TV',
329
- 'wearable' : 'Watch',
330
- 'xr' : ['VR', 'XR'],
331
- '?' : ['Desktop', 'Unknown'],
332
- '*' : undefined
333
- },
334
-
335
- browserHintsMap = {
336
- 'Chrome' : 'Google Chrome',
337
- 'Edge' : 'Microsoft Edge',
338
- 'Edge WebView2' : 'Microsoft Edge WebView2',
339
- 'Chrome WebView': 'Android WebView',
340
- 'Chrome Headless':'HeadlessChrome',
341
- 'Huawei Browser': 'HuaweiBrowser',
342
- 'MIUI Browser' : 'Miui Browser',
343
- 'Opera Mobi' : 'OperaMobile',
344
- 'Yandex' : 'YaBrowser'
345
- };
346
-
347
- //////////////
348
- // Regex map
349
- /////////////
350
-
351
- var defaultRegexes = {
352
-
353
- browser : [[
354
-
355
- // Most common regardless engine
356
- /\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
357
- ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [
358
- /webview.+edge\/([\w\.]+)/i // Microsoft Edge
359
- ], [VERSION, [NAME, EDGE+' WebView'], [TYPE, INAPP]], [
360
- /edg(?:e|ios|a)?\/([\w\.]+)/i
361
- ], [VERSION, [NAME, 'Edge']], [
362
-
363
- // Presto based
364
- /(opera mini)\/([-\w\.]+)/i, // Opera Mini
365
- /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i, // Opera Mobi/Tablet
366
- /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i // Opera
367
- ], [NAME, VERSION], [
368
- /opios[\/ ]+([\w\.]+)/i // Opera mini on iphone >= 8.0
369
- ], [VERSION, [NAME, OPERA+' Mini']], [
370
- /\bop(?:rg)?x\/([\w\.]+)/i // Opera GX
371
- ], [VERSION, [NAME, OPERA+' GX']], [
372
- /\bopr\/([\w\.]+)/i // Opera Webkit
373
- ], [VERSION, [NAME, OPERA]], [
374
-
375
- // Mixed
376
- /\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i // Baidu
377
- ], [VERSION, [NAME, 'Baidu']], [
378
- /\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i // Maxthon
379
- ], [VERSION, [NAME, 'Maxthon']], [
380
- /(kindle)\/([\w\.]+)/i, // Kindle
381
- /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,
382
- // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir
383
- // Trident based
384
- /(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet
385
- /(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
386
-
387
- // Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon/HiBrowser
388
- /(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:hi|lg |ovi|qute)browser|palemoon)\/v?([-\w\.]+)/i,
389
- // Atlas/Rekonq/Puffin/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
390
- /(brave)(?: chrome)?\/([\d\.]+)/i, // Brave
391
- /(aloha|heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i, // Aloha/HeyTap/Ovi/115/Surf
392
- /(qwant)(?:ios|mobile)\/([\d\.]+)/i, // Qwant
393
- /(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i // Ecosia/Weibo
394
- ], [NAME, VERSION], [
395
- /quark(?:pc)?\/([-\w\.]+)/i // Quark
396
- ], [VERSION, [NAME, 'Quark']], [
397
- /\bddg\/([\w\.]+)/i // DuckDuckGo
398
- ], [VERSION, [NAME, 'DuckDuckGo']], [
399
- /(?:\buc? ?browser|(?:juc.+)ucweb| ucpc)[\/ ]?([\w\.]+)/i // UCBrowser
400
- ], [VERSION, [NAME, 'UCBrowser']], [
401
- /microm.+\bqbcore\/([\w\.]+)/i, // WeChat Desktop for Windows Built-in Browser
402
- /\bqbcore\/([\w\.]+).+microm/i,
403
- /micromessenger\/([\w\.]+)/i // WeChat
404
- ], [VERSION, [NAME, 'WeChat']], [
405
- /konqueror\/([\w\.]+)/i // Konqueror
406
- ], [VERSION, [NAME, 'Konqueror']], [
407
- /trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i // IE11
408
- ], [VERSION, [NAME, 'IE']], [
409
- /ya(?:search)?browser\/([\w\.]+)/i // Yandex
410
- ], [VERSION, [NAME, 'Yandex']], [
411
- /slbrowser\/([\w\.]+)/i // Smart Lenovo Browser
412
- ], [VERSION, [NAME, 'Smart ' + LENOVO + SUFFIX_BROWSER]], [
413
- /(av(?:ast|g|ira))\/([\w\.]+)/i // Avast/AVG/Avira Secure Browser
414
- ], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [
415
- /norton\/([\w\.]+)/i // Norton Private Browser
416
- ], [VERSION, [NAME, 'Norton Private' + SUFFIX_BROWSER]], [
417
- /\bfocus\/([\w\.]+)/i // Firefox Focus
418
- ], [VERSION, [NAME, FIREFOX+' Focus']], [
419
- / mms\/([\w\.]+)$/i // Opera Neon
420
- ], [VERSION, [NAME, OPERA+' Neon']], [
421
- / opt\/([\w\.]+)$/i // Opera Touch
422
- ], [VERSION, [NAME, OPERA+' Touch']], [
423
- /coc_coc\w+\/([\w\.]+)/i // Coc Coc Browser
424
- ], [VERSION, [NAME, 'Coc Coc']], [
425
- /dolfin\/([\w\.]+)/i // Dolphin
426
- ], [VERSION, [NAME, 'Dolphin']], [
427
- /coast\/([\w\.]+)/i // Opera Coast
428
- ], [VERSION, [NAME, OPERA+' Coast']], [
429
- /miuibrowser\/([\w\.]+)/i // MIUI Browser
430
- ], [VERSION, [NAME, 'MIUI' + SUFFIX_BROWSER]], [
431
- /fxios\/([\w\.-]+)/i // Firefox for iOS
432
- ], [VERSION, [NAME, PREFIX_MOBILE + FIREFOX]], [
433
- /\bqihoobrowser\/?([\w\.]*)/i // 360
434
- ], [VERSION, [NAME, '360']], [
435
- /\b(qq)\/([\w\.]+)/i // QQ
436
- ], [[NAME, /(.+)/, '$1Browser'], VERSION], [
437
- /(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i
438
- ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/VivoBrowser/PicoBrowser
439
- / HBPC\/([\w\.]+)/ // Huawei Browser
440
- ], [VERSION, [NAME, HUAWEI + SUFFIX_BROWSER]], [
441
- /samsungbrowser\/([\w\.]+)/i // Samsung Internet
442
- ], [VERSION, [NAME, SAMSUNG + ' Internet']], [
443
- /metasr[\/ ]?([\d\.]+)/i // Sogou Explorer
444
- ], [VERSION, [NAME, SOGOU + ' Explorer']], [
445
- /(sogou)mo\w+\/([\d\.]+)/i // Sogou Mobile
446
- ], [[NAME, SOGOU + ' Mobile'], VERSION], [
447
- /(electron)\/([\w\.]+) safari/i, // Electron-based App
448
- /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i, // Tesla
449
- /m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i // QQ/2345
450
- ], [NAME, VERSION], [
451
- /(lbbrowser|luakit|rekonq|steam(?= (clie|tenf|gameo)))/i // LieBao Browser/Luakit/Rekonq/Steam
452
- ], [NAME], [
453
- /ome\/([\w\.]+).+(iron(?= saf)|360(?=[es]e$))/i // Iron / 360
454
- ], [VERSION, NAME], [
455
-
456
- // WebView
457
- /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i // Facebook App for iOS & Android
458
- ], [[NAME, FACEBOOK], VERSION, [TYPE, INAPP]], [
459
- /(kakao(?:talk|story))[\/ ]([\w\.]+)/i, // Kakao App
460
- /(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp
461
- /(daum)apps[\/ ]([\w\.]+)/i, // Daum App
462
- /safari (line)\/([\w\.]+)/i, // Line App for iOS
463
- /\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
464
- /(alipay)client\/([\w\.]+)/i, // Alipay
465
- /(twitter)(?:and| f.+e\/([\w\.]+))/i, // Twitter
466
- /(bing)(?:web|sapphire)\/([\w\.]+)/i, // Bing
467
- /(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i // Instagram/Snapchat/Klarna
468
- ], [NAME, VERSION, [TYPE, INAPP]], [
469
- /\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
470
- ], [VERSION, [NAME, 'GSA'], [TYPE, INAPP]], [
471
- /(?:musical_ly|trill)(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
472
- ], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [
473
- /\[(linkedin)app\]/i // LinkedIn App for iOS & Android
474
- ], [NAME, [TYPE, INAPP]], [
475
- /(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i // Zalo
476
- ], [[NAME, /(.+)/, 'Zalo'], VERSION, [TYPE, INAPP]], [
477
-
478
- /(chromium)[\/ ]([-\w\.]+)/i // Chromium
479
- ], [NAME, VERSION], [
480
-
481
- /ome-(lighthouse)$/i // Chrome Lighthouse
482
- ], [NAME, [TYPE, FETCHER]], [
483
-
484
- /headlesschrome(?:\/([\w\.]+)| )/i // Chrome Headless
485
- ], [VERSION, [NAME, CHROME+' Headless']], [
486
-
487
- /wv\).+chrome\/([\w\.]+).+edgw\//i // Edge WebView2
488
- ], [VERSION, [NAME, EDGE+' WebView2'], [TYPE, INAPP]], [
489
-
490
- /; wv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
491
- ], [[NAME, CHROME+' WebView'], VERSION, [TYPE, INAPP]], [
492
-
493
- /droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i // Android Browser
494
- ], [VERSION, [NAME, 'Android' + SUFFIX_BROWSER]], [
495
-
496
- /chrome\/([\w\.]+) mobile/i // Chrome Mobile
497
- ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [
498
-
499
- /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
500
- ], [NAME, VERSION], [
501
-
502
- /version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i // Safari Mobile
503
- ], [VERSION, [NAME, PREFIX_MOBILE + 'Safari']], [
504
- /iphone .*mobile(?:\/\w+ | ?)safari/i
505
- ], [[NAME, PREFIX_MOBILE + 'Safari']], [
506
- /version\/([\w\.\,]+) .*(safari)/i // Safari
507
- ], [VERSION, NAME], [
508
- /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
509
- ], [NAME, [VERSION, '1']], [
510
-
511
- /(webkit|khtml)\/([\w\.]+)/i
512
- ], [NAME, VERSION], [
513
-
514
- // Gecko based
515
- /(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i // Firefox Mobile
516
- ], [[NAME, PREFIX_MOBILE + FIREFOX], VERSION], [
517
- /(navigator|netscape\d?)\/([-\w\.]+)/i // Netscape
518
- ], [[NAME, 'Netscape'], VERSION], [
519
- /(wolvic|librewolf)\/([\w\.]+)/i // Wolvic/LibreWolf
520
- ], [NAME, VERSION], [
521
- /mobile vr; rv:([\w\.]+)\).+firefox/i // Firefox Reality
522
- ], [VERSION, [NAME, FIREFOX+' Reality']], [
523
- /ekiohf.+(flow)\/([\w\.]+)/i, // Flow
524
- /(swiftfox)/i, // Swiftfox
525
- /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,
526
- // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
527
- /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,
528
- // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
529
- /(firefox)\/([\w\.]+)/i, // Other Firefox-based
530
- /(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i, // Mozilla
531
-
532
- // Other
533
- /(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
534
- // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird
535
- /\b(links) \(([\w\.]+)/i // Links
536
- ], [NAME, [VERSION, /_/g, '.']], [
537
-
538
- /(cobalt)\/([\w\.]+)/i // Cobalt
539
- ], [NAME, [VERSION, /[^\d\.]+./, EMPTY]]
540
- ],
541
-
542
- cpu : [[
543
-
544
- /\b((amd|x|x86[-_]?|wow|win)64)\b/i // AMD64 (x64)
545
- ], [[ARCHITECTURE, 'amd64']], [
546
-
547
- /(ia32(?=;))/i, // IA32 (quicktime)
548
- /\b((i[346]|x)86)(pc)?\b/i // IA32 (x86)
549
- ], [[ARCHITECTURE, 'ia32']], [
550
-
551
- /\b(aarch64|arm(v?[89]e?l?|_?64))\b/i // ARM64
552
- ], [[ARCHITECTURE, 'arm64']], [
553
-
554
- /\b(arm(v[67])?ht?n?[fl]p?)\b/i // ARMHF
555
- ], [[ARCHITECTURE, 'armhf']], [
556
-
557
- // PocketPC mistakenly identified as PowerPC
558
- /( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i
559
- ], [[ARCHITECTURE, 'arm']], [
560
-
561
- / sun4\w[;\)]/i // SPARC
562
- ], [[ARCHITECTURE, 'sparc']], [
563
- // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
564
- /\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,
565
- /((ppc|powerpc)(64)?)( mac|;|\))/i, // PowerPC
566
- /(?:osf1|[freopnt]{3,4}bsd) (alpha)/i // Alpha
567
- ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [
568
- /mc680.0/i
569
- ], [[ARCHITECTURE, '68k']], [
570
- /winnt.+\[axp/i
571
- ], [[ARCHITECTURE, 'alpha']]
572
- ],
573
-
574
- device : [[
575
-
576
- //////////////////////////
577
- // MOBILES & TABLETS
578
- /////////////////////////
579
-
580
- // Samsung
581
- /\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i
582
- ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [
583
- /\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
584
- /samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,
585
- /sec-(sgh\w+)/i
586
- ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [
587
-
588
- // Apple
589
- /(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i // iPod/iPhone
590
- ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [
591
- /\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i, // iPad
592
- /\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i
593
- ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [
594
- /(macintosh);/i
595
- ], [MODEL, [VENDOR, APPLE]], [
596
-
597
- // Sharp
598
- /\b(sh-?[altvz]?\d\d[a-ekm]?)/i
599
- ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [
600
-
601
- // Honor
602
- /\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i
603
- ], [MODEL, [VENDOR, HONOR], [TYPE, TABLET]], [
604
- /honor([-\w ]+)[;\)]/i
605
- ], [MODEL, [VENDOR, HONOR], [TYPE, MOBILE]], [
606
-
607
- // Huawei
608
- /\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i
609
- ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [
610
- /(?:huawei) ?([-\w ]+)[;\)]/i,
611
- /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i
612
- ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [
613
-
614
- // Xiaomi
615
- /oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,
616
- /\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i // Mi Pad tablets
617
- ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
618
-
619
- /\b; (\w+) build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
620
- /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
621
- // Xiaomi Redmi / POCO / Black Shark / Qin
622
- /oid[^\)]+; (redmi[\-_ ]?(?:note|k)?[\w_ ]+|m?[12]\d[01]\d\w{3,6}|poco[\w ]+|(shark )?\w{3}-[ah]0|qin ?[1-3](s\+|ultra| pro)?)( bui|; wv|\))/i,
623
- // Xiaomi Mi
624
- /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,
625
- /; ([\w ]+) miui\/v?\d/i
626
- ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
627
-
628
- // OnePlus
629
- /droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-l]\w[1m]10)\b/i,
630
- /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
631
- ], [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]], [
632
-
633
- // OPPO
634
- /; (\w+) bui.+ oppo/i,
635
- /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i
636
- ], [MODEL, [VENDOR, OPPO], [TYPE, MOBILE]], [
637
- /\b(opd2(\d{3}a?))(?: bui|\))/i
638
- ], [MODEL, [VENDOR, strMapper, { 'OnePlus' : ['203', '304', '403', '404', '413', '415'], '*' : OPPO }], [TYPE, TABLET]], [
639
-
640
- // BLU
641
- /(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i // Vivo series
642
- ], [MODEL, [VENDOR, 'BLU'], [TYPE, MOBILE]], [
643
-
644
- // Vivo
645
- /; vivo (\w+)(?: bui|\))/i,
646
- /\b(v[12]\d{3}\w?[at])(?: bui|;)/i
647
- ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
648
-
649
- // Realme
650
- /\b(rmx[1-3]\d{3})(?: bui|;|\))/i
651
- ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
652
-
653
- // Lenovo
654
- /(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,
655
- /lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i
656
- ], [MODEL, [VENDOR, LENOVO], [TYPE, TABLET]], [
657
- /lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i
658
- ], [MODEL, [VENDOR, LENOVO], [TYPE, MOBILE]], [
659
-
660
- // Motorola
661
- /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
662
- /\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,
663
- /((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i
664
- ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [
665
- /\b(mz60\d|xoom[2 ]{0,2}) build\//i
666
- ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [
667
-
668
- // LG
669
- /\b(?:lg)?([vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
670
- ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [
671
- /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
672
- /\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,
673
- /\blg-?([\d\w]+) bui/i
674
- ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [
675
-
676
- // Nokia
677
- /(nokia) (t[12][01])/i
678
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
679
- /(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,
680
- /nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i
681
- ], [[MODEL, /_/g, ' '], [TYPE, MOBILE], [VENDOR, 'Nokia']], [
682
-
683
- // Google
684
- /(pixel (c|tablet))\b/i // Google Pixel C/Tablet
685
- ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [
686
- // Google Pixel
687
- /droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i
688
- ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [
689
- /(google) (pixelbook( go)?)/i
690
- ], [VENDOR, MODEL], [
691
-
692
- // Sony
693
- /droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i
694
- ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [
695
- /sony tablet [ps]/i,
696
- /\b(?:sony)?sgp\w+(?: bui|\))/i
697
- ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [
698
-
699
- // Amazon
700
- /(alexa)webm/i,
701
- /(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i, // Kindle Fire without Silk / Echo Show
702
- /(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD
703
- ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [
704
- /((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone
705
- ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [
706
-
707
- // BlackBerry
708
- /(playbook);[-\w\),; ]+(rim)/i // BlackBerry PlayBook
709
- ], [MODEL, VENDOR, [TYPE, TABLET]], [
710
- /\b((?:bb[a-f]|st[hv])100-\d)/i,
711
- /(?:blackberry|\(bb10;) (\w+)/i
712
- ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [
713
-
714
- // Asus
715
- /(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i
716
- ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [
717
- / (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i
718
- ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [
719
-
720
- // HTC
721
- /(nexus 9)/i // HTC Nexus 9
722
- ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
723
- /(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i, // HTC
724
-
725
- // ZTE
726
- /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
727
- /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
728
- ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
729
-
730
- // TCL
731
- /tcl (xess p17aa)/i,
732
- /droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i
733
- ], [MODEL, [VENDOR, 'TCL'], [TYPE, TABLET]], [
734
- /droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i
735
- ], [MODEL, [VENDOR, 'TCL'], [TYPE, MOBILE]], [
736
-
737
- // itel
738
- /(itel) ((\w+))/i
739
- ], [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { 'tablet' : ['p10001l', 'w7001'], '*' : 'mobile' }]], [
740
-
741
- // Acer
742
- /droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
743
- ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
744
-
745
- // Meizu
746
- /droid.+; (m[1-5] note) bui/i,
747
- /\bmz-([-\w]{2,})/i
748
- ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
749
-
750
- // Ulefone
751
- /; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
752
- ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [
753
-
754
- // Energizer
755
- /; (energy ?\w+)(?: bui|\))/i,
756
- /; energizer ([\w ]+)(?: bui|\))/i
757
- ], [MODEL, [VENDOR, 'Energizer'], [TYPE, MOBILE]], [
758
-
759
- // Cat
760
- /; cat (b35);/i,
761
- /; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i
762
- ], [MODEL, [VENDOR, 'Cat'], [TYPE, MOBILE]], [
763
-
764
- // Smartfren
765
- /((?:new )?andromax[\w- ]+)(?: bui|\))/i
766
- ], [MODEL, [VENDOR, 'Smartfren'], [TYPE, MOBILE]], [
767
-
768
- // Nothing
769
- /droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i
770
- ], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [
771
-
772
- // Archos
773
- /; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,
774
- /archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i
775
- ], [MODEL, [VENDOR, 'Archos'], [TYPE, TABLET]], [
776
- /archos ([\w ]+)( b|\))/i,
777
- /; (ac[3-6]\d\w{2,8})( b|\))/i
778
- ], [MODEL, [VENDOR, 'Archos'], [TYPE, MOBILE]], [
779
-
780
- // Blackview
781
- /blackview ([-\w ]+)( b|\))/i,
782
- /; (bv\d{4}[-\w ]*)( b|\))/i
783
- ], [MODEL, [VENDOR, 'Blackview'], [TYPE, MOBILE]], [
784
-
785
- // HMD
786
- /; (n159v)/i
787
- ], [MODEL, [VENDOR, 'HMD'], [TYPE, MOBILE]], [
788
-
789
- // T-Mobile
790
- /((revvl[ \w\+]+|tm(?:rv|af)\w*[45]g(?:tb)?))( b|\))/i
791
- ], [MODEL, [TYPE, strTest, { 'test': /ta?b/i, 'ifTrue': TABLET, 'ifFalse': MOBILE }], [VENDOR, 'T-Mobile']], [
792
-
793
- // MIXED
794
- /(imo) (tab \w+)/i, // IMO
795
- /(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i // Infinix XPad / Tecno
796
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
797
-
798
- /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
799
- // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan
800
- // BLU/Coolpad/CUBOT/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko
801
- /; (blu|coolpad|cubot|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([-\w\+ ]+?)(?: bui|\)|; r)/i,
802
- /(hp) ([\w ]+\w)/i, // HP iPAQ
803
- /(microsoft); (lumia[\w ]+)/i, // Microsoft Lumia
804
- /(oppo) ?([\w ]+) bui/i, // OPPO
805
- /(hisense) ([ehv][\w ]+)\)/i, // Hisense
806
- /droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i // Philips
807
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
808
-
809
- /(kobo)\s(ereader|touch)/i, // Kobo
810
- /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad
811
- /(kindle)\/([\w\.]+)/i // Kindle
812
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
813
-
814
- /(surface duo)/i // Surface Duo
815
- ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [
816
- /droid [\d\.]+; (fp\du?)(?: b|\))/i // Fairphone
817
- ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [
818
- /((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i // Nvidia Tablets
819
- ], [MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]], [
820
- /(sprint) (\w+)/i // Sprint Phones
821
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
822
- /(kin\.[onetw]{3})/i // Microsoft Kin
823
- ], [[MODEL, /\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [
824
- /droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra
825
- ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [
826
- /droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i
827
- ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [
828
-
829
- ///////////////////
830
- // SMARTTVS
831
- ///////////////////
832
-
833
- /(philips)[\w ]+tv/i, // Philips
834
- /smart-tv.+(samsung)/i // Samsung
835
- ], [VENDOR, [TYPE, SMARTTV]], [
836
- /hbbtv.+maple;(\d+)/i
837
- ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [
838
- /(vizio)(?: |.+model\/)(\w+-\w+)/i, // Vizio
839
- /tcast.+(lg)e?. ([-\w]+)/i // LG SmartTV
840
- ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
841
- /(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i
842
- ], [[VENDOR, LG], [TYPE, SMARTTV]], [
843
- /(apple) ?tv/i // Apple TV
844
- ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [
845
- /crkey.*devicetype\/chromecast/i // Google Chromecast Third Generation
846
- ], [[MODEL, CHROMECAST+' Third Generation'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
847
- /crkey.*devicetype\/([^/]*)/i // Google Chromecast with specific device type
848
- ], [[MODEL, /^/, 'Chromecast '], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
849
- /fuchsia.*crkey/i // Google Chromecast Nest Hub
850
- ], [[MODEL, CHROMECAST+' Nest Hub'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
851
- /crkey/i // Google Chromecast, Linux-based or unknown
852
- ], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
853
- /(portaltv)/i // Facebook Portal TV
854
- ], [MODEL, [VENDOR, FACEBOOK], [TYPE, SMARTTV]], [
855
- /droid.+aft(\w+)( bui|\))/i // Fire TV
856
- ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
857
- /(shield \w+ tv)/i // Nvidia Shield TV
858
- ], [MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]], [
859
- /\(dtv[\);].+(aquos)/i,
860
- /(aquos-tv[\w ]+)\)/i // Sharp
861
- ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[
862
- /(bravia[\w ]+)( bui|\))/i // Sony
863
- ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [
864
- /(mi(tv|box)-?\w+) bui/i // Xiaomi
865
- ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [
866
- /Hbbtv.*(technisat) (.*);/i // TechniSAT
867
- ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
868
- /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku
869
- /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices
870
- ], [[VENDOR, /.+\/(\w+)/, '$1', strMapper, {'LG':'lge'}], [MODEL, trim], [TYPE, SMARTTV]], [
871
-
872
- ///////////////////
873
- // CONSOLES
874
- ///////////////////
875
-
876
- /(playstation \w+)/i // Playstation
877
- ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [
878
- /\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox
879
- ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [
880
- /(ouya)/i, // Ouya
881
- /(nintendo) (\w+)/i, // Nintendo
882
- /(retroid) (pocket ([^\)]+))/i, // Retroid Pocket
883
- /(valve).+(steam deck)/i,
884
- /droid.+; ((shield|rgcube|gr0006))( bui|\))/i // Nvidia Portable/Anbernic/Logitech
885
- ], [[VENDOR, strMapper, { 'Nvidia': 'Shield', 'Anbernic': 'RGCUBE', 'Logitech': 'GR0006' }], MODEL, [TYPE, CONSOLE]], [
886
-
887
- ///////////////////
888
- // WEARABLES
889
- ///////////////////
890
-
891
- /\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i // Samsung Galaxy Watch
892
- ], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [
893
- /((pebble))app/i, // Pebble
894
- /(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\w ]*)( bui|\))/i // Asus ZenWatch / LG Watch / Pixel Watch / Xiaomi Watch
895
- ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
896
- /(ow(?:19|20)?we?[1-3]{1,3})/i // Oppo Watch
897
- ], [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]], [
898
- /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
899
- ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [
900
- /(opwwe\d{3})/i // OnePlus Watch
901
- ], [MODEL, [VENDOR, ONEPLUS], [TYPE, WEARABLE]], [
902
- /(moto 360)/i // Motorola 360
903
- ], [MODEL, [VENDOR, MOTOROLA], [TYPE, WEARABLE]], [
904
- /(smartwatch 3)/i // Sony SmartWatch
905
- ], [MODEL, [VENDOR, SONY], [TYPE, WEARABLE]], [
906
- /(g watch r)/i // LG G Watch R
907
- ], [MODEL, [VENDOR, LG], [TYPE, WEARABLE]], [
908
- /droid.+; (wt63?0{2,3})\)/i
909
- ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [
910
-
911
- ///////////////////
912
- // XR
913
- ///////////////////
914
-
915
- /droid.+; (glass) \d/i // Google Glass
916
- ], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [
917
- /(pico) ([\w ]+) os\d/i // Pico
918
- ], [VENDOR, MODEL, [TYPE, XR]], [
919
- /(quest( \d| pro)?s?).+vr/i // Meta Quest
920
- ], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [
921
- /mobile vr; rv.+firefox/i // Unidentifiable VR device using Firefox Reality / Wolvic
922
- ], [[TYPE, XR]], [
923
-
924
- ///////////////////
925
- // EMBEDDED
926
- ///////////////////
927
-
928
- /(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i // Tesla
929
- ], [VENDOR, [TYPE, EMBEDDED]], [
930
- /(aeobc)\b/i // Echo Dot
931
- ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [
932
- /(homepod).+mac os/i // Apple HomePod
933
- ], [MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]], [
934
- /windows iot/i // Unidentifiable embedded device using Windows IoT
935
- ], [[TYPE, EMBEDDED]], [
936
-
937
- ////////////////////
938
- // MIXED (GENERIC)
939
- ///////////////////
940
-
941
- /droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i // Unidentifiable SmartTV
942
- ], [MODEL, [TYPE, SMARTTV]], [
943
- /\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i
944
- ], [[TYPE, SMARTTV]], [
945
- /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i
946
- ], [MODEL, [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]], [
947
- /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet
948
- ], [[TYPE, TABLET]], [
949
- /(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile
950
- ], [[TYPE, MOBILE]], [
951
- /droid .+?; ([\w\. -]+)( bui|\))/i // Generic Android Device
952
- ], [MODEL, [VENDOR, 'Generic']]
953
- ],
954
-
955
- engine : [[
956
-
957
- /windows.+ edge\/([\w\.]+)/i // EdgeHTML
958
- ], [VERSION, [NAME, EDGE+'HTML']], [
959
-
960
- /(arkweb)\/([\w\.]+)/i // ArkWeb
961
- ], [NAME, VERSION], [
962
-
963
- /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
964
- ], [VERSION, [NAME, 'Blink']], [
965
-
966
- /(presto)\/([\w\.]+)/i, // Presto
967
- /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo
968
- /ekioh(flow)\/([\w\.]+)/i, // Flow
969
- /(khtml|tasman|links|dillo)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links/Dillo
970
- /(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab
971
-
972
- /\b(libweb)/i // LibWeb
973
- ], [NAME, VERSION], [
974
- /ladybird\//i
975
- ], [[NAME, 'LibWeb']], [
976
-
977
- /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
978
- ], [VERSION, NAME]
979
- ],
980
-
981
- os : [[
982
-
983
- // Windows
984
- /(windows nt) (6\.[23]); arm/i // Windows RT
985
- ], [[NAME, /N/, 'R'], [VERSION, strMapper, windowsVersionMap]], [
986
- /(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i, // Windows IoT/Mobile/Phone
987
- // Windows NT/3.1/95/98/ME/2000/XP/Vista/7/8/8.1/10/11
988
- /(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i
989
- ], [NAME, VERSION], [
990
- /windows nt ?([\d\.\)]*)(?!.+xbox)/i,
991
- /\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i
992
- ], [[VERSION, /(;|\))/g, '', strMapper, windowsVersionMap], [NAME, WINDOWS]], [
993
- /(windows ce)\/?([\d\.]*)/i // Windows CE
994
- ], [NAME, VERSION], [
995
-
996
- // iOS/macOS
997
- /[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
998
- /(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\/ ]([\w\.]+)/i,
999
- /\btvos ?([\w\.]+)/i,
1000
- /cfnetwork\/.+darwin/i
1001
- ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
1002
- /(mac os x) ?([\w\. ]*)/i,
1003
- /(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i // Mac OS
1004
- ], [[NAME, 'macOS'], [VERSION, /_/g, '.']], [
1005
-
1006
- // Google Chromecast
1007
- /android ([\d\.]+).*crkey/i // Google Chromecast, Android-based
1008
- ], [VERSION, [NAME, CHROMECAST + ' Android']], [
1009
- /fuchsia.*crkey\/([\d\.]+)/i // Google Chromecast, Fuchsia-based
1010
- ], [VERSION, [NAME, CHROMECAST + ' Fuchsia']], [
1011
- /crkey\/([\d\.]+).*devicetype\/smartspeaker/i // Google Chromecast, Linux-based Smart Speaker
1012
- ], [VERSION, [NAME, CHROMECAST + ' SmartSpeaker']], [
1013
- /linux.*crkey\/([\d\.]+)/i // Google Chromecast, Legacy Linux-based
1014
- ], [VERSION, [NAME, CHROMECAST + ' Linux']], [
1015
- /crkey\/([\d\.]+)/i // Google Chromecast, unknown
1016
- ], [VERSION, [NAME, CHROMECAST]], [
1017
-
1018
- // Mobile OSes
1019
- /droid ([\w\.]+)\b.+(android[- ]x86)/i // Android-x86
1020
- ], [VERSION, NAME], [
1021
- /(ubuntu) ([\w\.]+) like android/i // Ubuntu Touch
1022
- ], [[NAME, /(.+)/, '$1 Touch'], VERSION], [
1023
- /(harmonyos)[\/ ]?([\d\.]*)/i, // HarmonyOS
1024
- // Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen
1025
- /(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i
1026
- ], [NAME, VERSION], [
1027
- /\(bb(10);/i // BlackBerry 10
1028
- ], [VERSION, [NAME, BLACKBERRY]], [
1029
- /(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i // Symbian
1030
- ], [VERSION, [NAME, 'Symbian']], [
1031
- /mozilla\/[\d\.]+ \((?:mobile[;\w ]*|tablet|tv|[^\)]*(?:viera|lg(?:l25|-d300)|alcatel ?o.+|y300-f1)); rv:([\w\.]+)\).+gecko\//i // Firefox OS
1032
- ], [VERSION, [NAME, FIREFOX+' OS']], [
1033
- /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i, // WebOS
1034
- /webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i
1035
- ], [VERSION, [NAME, 'webOS']], [
1036
- /web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i
1037
- // https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine
1038
- ], [[VERSION, strMapper, {'25':'120','24':'108','23':'94','22':'87','6':'79','5':'68','4':'53','3':'38','2':'538','1':'537','*':'TV'}], [NAME, 'webOS']], [
1039
- /watch(?: ?os[,\/ ]|\d,\d\/)([\d\.]+)/i // watchOS
1040
- ], [VERSION, [NAME, 'watchOS']], [
1041
-
1042
- // Google ChromeOS
1043
- /cros [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
1044
- ], [VERSION, [NAME, 'Chrome OS']],[
1045
-
1046
- // Smart TVs
1047
- /kepler ([\w\.]+); (aft|aeo)/i // Vega OS
1048
- ], [VERSION, [NAME, 'Vega OS']],[
1049
- /(netrange)mmh/i, // Netrange
1050
- /(nettv)\/(\d+\.[\w\.]+)/i, // NetTV
1051
-
1052
- // Console
1053
- /(nintendo|playstation) (\w+)/i, // Nintendo/Playstation
1054
- /(xbox); +xbox ([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
1055
- /(pico) .+os([\w\.]+)/i, // Pico
1056
-
1057
- // Other
1058
- /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i, // Joli/Palm
1059
- /linux.+(mint)[\/\(\) ]?([\w\.]*)/i, // Mint
1060
- /(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i, // Mageia/VectorLinux/Fuchsia/ArcaOS/Arch
1061
- /([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,
1062
- // Ubuntu/Debian/SUSE/Gentoo/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire/Knoppix
1063
- /((?:open)?solaris)[-\/ ]?([\w\.]*)/i, // Solaris
1064
- /\b(aix)[; ]([1-9\.]{0,4})/i, // AIX
1065
- /(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i, // Hurd/Linux/MorphOS
1066
- /(gnu) ?([\w\.]*)/i, // GNU
1067
- /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
1068
- /(haiku) ?(r\d)?/i // Haiku
1069
- ], [NAME, VERSION], [
1070
- /(sunos) ?([\d\.]*)/i // Solaris
1071
- ], [[NAME, 'Solaris'], VERSION], [
1072
- /\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/OpenVMS/HP-UX/SerenityOS
1073
- /(unix) ?([\w\.]*)/i // UNIX
1074
- ], [NAME, VERSION]
1075
- ]
1076
- };
1077
-
1078
- /////////////////
1079
- // Factories
1080
- ////////////////
1081
-
1082
- var defaultProps = (function () {
1083
- var props = { init : {}, isIgnore : {}, isIgnoreRgx : {}, toString : {}};
1084
- setProps.call(props.init, [
1085
- [BROWSER, [NAME, VERSION, MAJOR, TYPE]],
1086
- [CPU, [ARCHITECTURE]],
1087
- [DEVICE, [TYPE, MODEL, VENDOR]],
1088
- [ENGINE, [NAME, VERSION]],
1089
- [OS, [NAME, VERSION]]
1090
- ]);
1091
- setProps.call(props.isIgnore, [
1092
- [BROWSER, [VERSION, MAJOR]],
1093
- [ENGINE, [VERSION]],
1094
- [OS, [VERSION]]
1095
- ]);
1096
- setProps.call(props.isIgnoreRgx, [
1097
- [BROWSER, / ?browser$/i],
1098
- [OS, / ?os$/i]
1099
- ]);
1100
- setProps.call(props.toString, [
1101
- [BROWSER, [NAME, VERSION]],
1102
- [CPU, [ARCHITECTURE]],
1103
- [DEVICE, [VENDOR, MODEL]],
1104
- [ENGINE, [NAME, VERSION]],
1105
- [OS, [NAME, VERSION]]
1106
- ]);
1107
- return props;
1108
- })();
1109
-
1110
- var createIData = function (item, itemType) {
1111
-
1112
- var init_props = defaultProps.init[itemType],
1113
- is_ignoreProps = defaultProps.isIgnore[itemType] || 0,
1114
- is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0,
1115
- toString_props = defaultProps.toString[itemType] || 0;
1116
-
1117
- function IData () {
1118
- setProps.call(this, init_props);
1119
- }
1120
-
1121
- IData.prototype.getItem = function () {
1122
- return item;
1123
- };
1124
-
1125
- IData.prototype.withClientHints = function () {
1126
-
1127
- // nodejs / non-client-hints browsers
1128
- if (!NAVIGATOR_UADATA) {
1129
- return item
1130
- .parseCH()
1131
- .get();
1132
- }
1133
-
1134
- // browsers based on chromium 85+
1135
- return NAVIGATOR_UADATA
1136
- .getHighEntropyValues(CH_ALL_VALUES)
1137
- .then(function (res) {
1138
- return item
1139
- .setCH(new UACHData(res, false))
1140
- .parseCH()
1141
- .get();
1142
- });
1143
- };
1144
-
1145
- IData.prototype.withFeatureCheck = function () {
1146
- return item.detectFeature().get();
1147
- };
1148
-
1149
- if (itemType != RESULT) {
1150
- IData.prototype.is = function (strToCheck) {
1151
- var is = false;
1152
- for (var i in this) {
1153
- if (this.hasOwnProperty(i) && !has(is_ignoreProps, i) && lowerize(is_ignoreRgx ? strip(is_ignoreRgx, this[i]) : this[i]) == lowerize(is_ignoreRgx ? strip(is_ignoreRgx, strToCheck) : strToCheck)) {
1154
- is = true;
1155
- if (strToCheck != TYPEOF.UNDEFINED) break;
1156
- } else if (strToCheck == TYPEOF.UNDEFINED && is) {
1157
- is = !is;
1158
- break;
1159
- }
1160
- }
1161
- return is;
1162
- };
1163
- IData.prototype.toString = function () {
1164
- var str = EMPTY;
1165
- for (var i in toString_props) {
1166
- if (typeof(this[toString_props[i]]) !== TYPEOF.UNDEFINED) {
1167
- str += (str ? ' ' : EMPTY) + this[toString_props[i]];
1168
- }
1169
- }
1170
- return str || TYPEOF.UNDEFINED;
1171
- };
1172
- }
1173
-
1174
- IData.prototype.then = function (cb) {
1175
- var that = this;
1176
- var IDataResolve = function () {
1177
- for (var prop in that) {
1178
- if (that.hasOwnProperty(prop)) {
1179
- this[prop] = that[prop];
1180
- }
1181
- }
1182
- };
1183
- IDataResolve.prototype = {
1184
- is : IData.prototype.is,
1185
- toString : IData.prototype.toString,
1186
- withClientHints : IData.prototype.withClientHints,
1187
- withFeatureCheck : IData.prototype.withFeatureCheck
1188
- };
1189
- var resolveData = new IDataResolve();
1190
- cb(resolveData);
1191
- return resolveData;
1192
- };
1193
-
1194
- return new IData();
1195
- };
1196
-
1197
- /////////////////
1198
- // Constructor
1199
- ////////////////
1200
-
1201
- function UACHData (uach, isHttpUACH) {
1202
- uach = uach || {};
1203
- setProps.call(this, CH_ALL_VALUES);
1204
- if (isHttpUACH) {
1205
- setProps.call(this, [
1206
- [BRANDS, itemListToArray(uach[CH])],
1207
- [FULLVERLIST, itemListToArray(uach[CH_FULL_VER_LIST])],
1208
- [MOBILE, /\?1/.test(uach[CH_MOBILE])],
1209
- [MODEL, normalizeHeaderValue(uach[CH_MODEL])],
1210
- [PLATFORM, normalizeHeaderValue(uach[CH_PLATFORM])],
1211
- [PLATFORMVER, normalizeHeaderValue(uach[CH_PLATFORM_VER])],
1212
- [ARCHITECTURE, normalizeHeaderValue(uach[CH_ARCH])],
1213
- [FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],
1214
- [BITNESS, normalizeHeaderValue(uach[CH_BITNESS])]
1215
- ]);
1216
- } else {
1217
- for (var prop in uach) {
1218
- if(this.hasOwnProperty(prop) && typeof uach[prop] !== TYPEOF.UNDEFINED) this[prop] = uach[prop];
1219
- }
1220
- }
1221
- }
1222
-
1223
- function UAItem (itemType, ua, rgxMap, uaCH) {
1224
- setProps.call(this, [
1225
- ['itemType', itemType],
1226
- ['ua', ua],
1227
- ['uaCH', uaCH],
1228
- ['rgxMap', rgxMap],
1229
- ['data', createIData(this, itemType)]
1230
- ]);
1231
- return this;
1232
- }
1233
-
1234
- UAItem.prototype.get = function (prop) {
1235
- if (!prop) return this.data;
1236
- return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined;
1237
- };
1238
-
1239
- UAItem.prototype.set = function (prop, val) {
1240
- this.data[prop] = val;
1241
- return this;
1242
- };
1243
-
1244
- UAItem.prototype.setCH = function (ch) {
1245
- this.uaCH = ch;
1246
- return this;
1247
- };
1248
-
1249
- UAItem.prototype.detectFeature = function () {
1250
- if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {
1251
- switch (this.itemType) {
1252
- case BROWSER:
1253
- // Brave-specific detection
1254
- if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == TYPEOF.FUNCTION) {
1255
- this.set(NAME, 'Brave');
1256
- }
1257
- break;
1258
- case DEVICE:
1259
- // Chrome-specific detection: check for 'mobile' value of navigator.userAgentData
1260
- if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {
1261
- this.set(TYPE, MOBILE);
1262
- }
1263
- // iPadOS-specific detection: identified as Mac, but has some iOS-only properties
1264
- if (this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== TYPEOF.UNDEFINED && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {
1265
- this.set(MODEL, 'iPad')
1266
- .set(TYPE, TABLET);
1267
- }
1268
- break;
1269
- case OS:
1270
- // Chrome-specific detection: check for 'platform' value of navigator.userAgentData
1271
- if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {
1272
- this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);
1273
- }
1274
- break;
1275
- case RESULT:
1276
- var data = this.data;
1277
- var detect = function (itemType) {
1278
- return data[itemType]
1279
- .getItem()
1280
- .detectFeature()
1281
- .get();
1282
- };
1283
- this.set(BROWSER, detect(BROWSER))
1284
- .set(CPU, detect(CPU))
1285
- .set(DEVICE, detect(DEVICE))
1286
- .set(ENGINE, detect(ENGINE))
1287
- .set(OS, detect(OS));
1288
- }
1289
- }
1290
- return this;
1291
- };
1292
-
1293
- UAItem.prototype.parseUA = function () {
1294
- if (this.itemType != RESULT) {
1295
- rgxMapper.call(this.data, this.ua, this.rgxMap);
1296
- }
1297
- switch (this.itemType) {
1298
- case BROWSER:
1299
- this.set(MAJOR, majorize(this.get(VERSION)));
1300
- break;
1301
- case OS:
1302
- // Since iOS 26, Safari's UA reports the OS version as frozen at 18:
1303
- // https://webkit.org/blog/17333/webkit-features-in-safari-26-0/#update-to-ua-string
1304
- if (this.get(NAME) == 'iOS' && this.get(VERSION)) {
1305
- // Only perform this if iOS version is 18/19
1306
- if (/^1[89][^\d]/.exec(this.get(VERSION))) {
1307
- // Based on the assumption that "iOS" version is tightly coupled with "Safari" version
1308
- var realVersion = /\) Version\/((\d+)[\d\.]*)/.exec(this.ua);
1309
- if (realVersion && parseInt(realVersion[2], 10) >= 26) {
1310
- // iOS version = Safari version
1311
- this.set(VERSION, realVersion[1]);
1312
- }
1313
- }
1314
- }
1315
- break;
1316
- }
1317
- return this;
1318
- };
1319
-
1320
- UAItem.prototype.parseCH = function () {
1321
- var uaCH = this.uaCH,
1322
- rgxMap = this.rgxMap;
1323
-
1324
- switch (this.itemType) {
1325
- case BROWSER:
1326
- case ENGINE:
1327
- var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;
1328
- if (brands) {
1329
- for (var i=0; i<brands.length; i++) {
1330
- var brandName = brands[i].brand || brands[i],
1331
- brandVersion = brands[i].version;
1332
- if (this.itemType == BROWSER &&
1333
- !/not.a.brand/i.test(brandName) &&
1334
- (!prevName ||
1335
- (/Chrom/.test(prevName) && brandName != CHROMIUM) ||
1336
- (prevName == EDGE && /WebView2/.test(brandName))
1337
- )) {
1338
- brandName = strMapper(brandName, browserHintsMap);
1339
- prevName = this.get(NAME);
1340
- if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) {
1341
- this.set(NAME, brandName)
1342
- .set(VERSION, brandVersion)
1343
- .set(MAJOR, majorize(brandVersion));
1344
- }
1345
- prevName = brandName;
1346
- }
1347
- if (this.itemType == ENGINE && brandName == CHROMIUM) {
1348
- this.set(VERSION, brandVersion);
1349
- }
1350
- }
1351
- }
1352
- break;
1353
- case CPU:
1354
- var archName = uaCH[ARCHITECTURE];
1355
- if (archName) {
1356
- if (archName && uaCH[BITNESS] == '64') archName += '64';
1357
- rgxMapper.call(this.data, archName + ';', rgxMap);
1358
- }
1359
- break;
1360
- case DEVICE:
1361
- if (uaCH[MOBILE]) {
1362
- this.set(TYPE, MOBILE);
1363
- }
1364
- if (uaCH[MODEL]) {
1365
- this.set(MODEL, uaCH[MODEL]);
1366
- if (!this.get(TYPE) || !this.get(VENDOR)) {
1367
- var reParse = {};
1368
- rgxMapper.call(reParse, 'droid 9; ' + uaCH[MODEL] + ')', rgxMap);
1369
- if (!this.get(TYPE) && !!reParse.type) {
1370
- this.set(TYPE, reParse.type);
1371
- }
1372
- if (!this.get(VENDOR) && !!reParse.vendor) {
1373
- this.set(VENDOR, reParse.vendor);
1374
- }
1375
- }
1376
- }
1377
- if (uaCH[FORMFACTORS]) {
1378
- var ff;
1379
- if (typeof uaCH[FORMFACTORS] !== 'string') {
1380
- var idx = 0;
1381
- while (!ff && idx < uaCH[FORMFACTORS].length) {
1382
- ff = strMapper(uaCH[FORMFACTORS][idx++], formFactorsMap);
1383
- }
1384
- } else {
1385
- ff = strMapper(uaCH[FORMFACTORS], formFactorsMap);
1386
- }
1387
- this.set(TYPE, ff);
1388
- }
1389
- break;
1390
- case OS:
1391
- var osName = uaCH[PLATFORM];
1392
- if(osName) {
1393
- var osVersion = uaCH[PLATFORMVER];
1394
- if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10');
1395
- this.set(NAME, osName)
1396
- .set(VERSION, osVersion);
1397
- }
1398
- // Xbox-Specific Detection
1399
- if (this.get(NAME) == WINDOWS && uaCH[MODEL] == 'Xbox') {
1400
- this.set(NAME, 'Xbox')
1401
- .set(VERSION, undefined);
1402
- }
1403
- break;
1404
- case RESULT:
1405
- var data = this.data;
1406
- var parse = function (itemType) {
1407
- return data[itemType]
1408
- .getItem()
1409
- .setCH(uaCH)
1410
- .parseCH()
1411
- .get();
1412
- };
1413
- this.set(BROWSER, parse(BROWSER))
1414
- .set(CPU, parse(CPU))
1415
- .set(DEVICE, parse(DEVICE))
1416
- .set(ENGINE, parse(ENGINE))
1417
- .set(OS, parse(OS));
1418
- }
1419
- return this;
1420
- };
1421
-
1422
- function UAParser (ua, extensions, headers) {
1423
-
1424
- if (typeof ua === TYPEOF.OBJECT) {
1425
- if (isExtensions(ua, true)) {
1426
- if (typeof extensions === TYPEOF.OBJECT) {
1427
- headers = extensions; // case UAParser(extensions, headers)
1428
- }
1429
- extensions = ua; // case UAParser(extensions)
1430
- } else {
1431
- headers = ua; // case UAParser(headers)
1432
- extensions = undefined;
1433
- }
1434
- ua = undefined;
1435
- } else if (typeof ua === TYPEOF.STRING && !isExtensions(extensions, true)) {
1436
- headers = extensions; // case UAParser(ua, headers)
1437
- extensions = undefined;
1438
- }
1439
-
1440
- if (headers) {
1441
- if (typeof headers.append === TYPEOF.FUNCTION) {
1442
- // Convert Headers object into a plain object
1443
- var kv = {};
1444
- headers.forEach(function (v, k) { kv[String(k).toLowerCase()] = v; });
1445
- headers = kv;
1446
- } else {
1447
- // Normalize headers field name into lowercase
1448
- var normalized = {};
1449
- for (var header in headers) {
1450
- if (headers.hasOwnProperty(header)) {
1451
- normalized[String(header).toLowerCase()] = headers[header];
1452
- }
1453
- }
1454
- headers = normalized;
1455
- }
1456
- }
1457
-
1458
- if (!(this instanceof UAParser)) {
1459
- return new UAParser(ua, extensions, headers).getResult();
1460
- }
1461
-
1462
- var userAgent = typeof ua === TYPEOF.STRING ? ua : // Passed user-agent string
1463
- (headers && headers[USER_AGENT] ? headers[USER_AGENT] : // User-Agent from passed headers
1464
- ((NAVIGATOR && NAVIGATOR.userAgent) ? NAVIGATOR.userAgent : // navigator.userAgent
1465
- EMPTY)), // empty string
1466
-
1467
- httpUACH = new UACHData(headers, true),
1468
- regexMap = defaultRegexes,
1469
-
1470
- createItemFunc = function (itemType) {
1471
- if (itemType == RESULT) {
1472
- return function () {
1473
- return new UAItem(itemType, userAgent, regexMap, httpUACH)
1474
- .set('ua', userAgent)
1475
- .set(BROWSER, this.getBrowser())
1476
- .set(CPU, this.getCPU())
1477
- .set(DEVICE, this.getDevice())
1478
- .set(ENGINE, this.getEngine())
1479
- .set(OS, this.getOS())
1480
- .get();
1481
- };
1482
- } else {
1483
- return function () {
1484
- return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH)
1485
- .parseUA()
1486
- .get();
1487
- };
1488
- }
1489
- };
1490
-
1491
- // public methods
1492
- setProps.call(this, [
1493
- ['getBrowser', createItemFunc(BROWSER)],
1494
- ['getCPU', createItemFunc(CPU)],
1495
- ['getDevice', createItemFunc(DEVICE)],
1496
- ['getEngine', createItemFunc(ENGINE)],
1497
- ['getOS', createItemFunc(OS)],
1498
- ['getResult', createItemFunc(RESULT)],
1499
- ['getUA', function () { return userAgent; }],
1500
- ['setUA', function (ua) {
1501
- if (isString(ua)) userAgent = trim(ua, UA_MAX_LENGTH);
1502
- return this;
1503
- }],
1504
- ['useExtension', function (exts) {
1505
- if (exts) regexMap = extend(regexMap, exts);
1506
- return this;
1507
- }]
1508
- ])
1509
- .setUA(userAgent)
1510
- .useExtension(extensions);
1511
-
1512
- return this;
1513
- }
1514
-
1515
- UAParser.VERSION = LIBVERSION;
1516
- UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR, TYPE]);
1517
- UAParser.CPU = enumerize([ARCHITECTURE]);
1518
- UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);
1519
- UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);
1520
-
1521
- exports.UAParser = UAParser;
1522
- //# sourceMappingURL=ua-parser-DN07nD-R.js.map