@bigbinary/neeto-molecules 4.0.47 → 4.0.48

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