ua-parser-js 1.0.37 → 2.0.2

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 (205) hide show
  1. package/LICENSE.md +616 -0
  2. package/README.md +251 -0
  3. package/dist/icons/color/LICENSE.md +3 -0
  4. package/dist/icons/color/browser/android-browser.svg +1 -0
  5. package/dist/icons/color/browser/avant.png +0 -0
  6. package/dist/icons/color/browser/basilisk.png +0 -0
  7. package/dist/icons/color/browser/basilisk.svg +1 -0
  8. package/dist/icons/color/browser/brave.png +0 -0
  9. package/dist/icons/color/browser/brave.svg +1 -0
  10. package/dist/icons/color/browser/chrome.png +0 -0
  11. package/dist/icons/color/browser/chrome.svg +1 -0
  12. package/dist/icons/color/browser/chromium.png +0 -0
  13. package/dist/icons/color/browser/chromium.svg +1 -0
  14. package/dist/icons/color/browser/coc-coc.png +0 -0
  15. package/dist/icons/color/browser/default.png +0 -0
  16. package/dist/icons/color/browser/default.svg +1 -0
  17. package/dist/icons/color/browser/dolphin.png +0 -0
  18. package/dist/icons/color/browser/edge.png +0 -0
  19. package/dist/icons/color/browser/edge.svg +1 -0
  20. package/dist/icons/color/browser/electron.png +0 -0
  21. package/dist/icons/color/browser/electron.svg +1 -0
  22. package/dist/icons/color/browser/falkon.png +0 -0
  23. package/dist/icons/color/browser/falkon.svg +1 -0
  24. package/dist/icons/color/browser/firefox-reality.png +0 -0
  25. package/dist/icons/color/browser/firefox-reality.svg +1 -0
  26. package/dist/icons/color/browser/firefox.png +0 -0
  27. package/dist/icons/color/browser/firefox.svg +1 -0
  28. package/dist/icons/color/browser/gsa.svg +9 -0
  29. package/dist/icons/color/browser/icecat.png +0 -0
  30. package/dist/icons/color/browser/ie.svg +6 -0
  31. package/dist/icons/color/browser/konqueror.png +0 -0
  32. package/dist/icons/color/browser/konqueror.svg +1 -0
  33. package/dist/icons/color/browser/maxthon.png +0 -0
  34. package/dist/icons/color/browser/midori.png +0 -0
  35. package/dist/icons/color/browser/midori.svg +1 -0
  36. package/dist/icons/color/browser/netsurf.png +0 -0
  37. package/dist/icons/color/browser/netsurf.svg +1 -0
  38. package/dist/icons/color/browser/opera-gx.png +0 -0
  39. package/dist/icons/color/browser/opera-gx.svg +1 -0
  40. package/dist/icons/color/browser/opera-mini.png +0 -0
  41. package/dist/icons/color/browser/opera-touch.png +0 -0
  42. package/dist/icons/color/browser/opera.png +0 -0
  43. package/dist/icons/color/browser/opera.svg +1 -0
  44. package/dist/icons/color/browser/palemoon.png +0 -0
  45. package/dist/icons/color/browser/puffin.png +0 -0
  46. package/dist/icons/color/browser/safari.png +0 -0
  47. package/dist/icons/color/browser/safari.svg +1 -0
  48. package/dist/icons/color/browser/samsung-internet.png +0 -0
  49. package/dist/icons/color/browser/samsung-internet.svg +1 -0
  50. package/dist/icons/color/browser/seamonkey.png +0 -0
  51. package/dist/icons/color/browser/silk.png +0 -0
  52. package/dist/icons/color/browser/sogou-mobile.png +0 -0
  53. package/dist/icons/color/browser/ucbrowser.png +0 -0
  54. package/dist/icons/color/browser/ucbrowser.svg +1 -0
  55. package/dist/icons/color/browser/vivaldi.png +0 -0
  56. package/dist/icons/color/browser/vivaldi.svg +1 -0
  57. package/dist/icons/color/browser/webkit.png +0 -0
  58. package/dist/icons/color/browser/webkit.svg +1 -0
  59. package/dist/icons/color/browser/yandex.png +0 -0
  60. package/dist/icons/color/os/centos.svg +1 -0
  61. package/dist/icons/mono/LICENSE.md +3 -0
  62. package/dist/icons/mono/browser/alipay.svg +1 -0
  63. package/dist/icons/mono/browser/android-browser.svg +1 -0
  64. package/dist/icons/mono/browser/avast-secure-browser.svg +1 -0
  65. package/dist/icons/mono/browser/baidu-browser.svg +1 -0
  66. package/dist/icons/mono/browser/brave.svg +1 -0
  67. package/dist/icons/mono/browser/chrome-headless.svg +1 -0
  68. package/dist/icons/mono/browser/chrome-webview.svg +1 -0
  69. package/dist/icons/mono/browser/chrome.svg +1 -0
  70. package/dist/icons/mono/browser/chromium.svg +1 -0
  71. package/dist/icons/mono/browser/duckduckgo.svg +1 -0
  72. package/dist/icons/mono/browser/edge.svg +1 -0
  73. package/dist/icons/mono/browser/electron.svg +1 -0
  74. package/dist/icons/mono/browser/facebook.svg +1 -0
  75. package/dist/icons/mono/browser/firefox-focus.svg +1 -0
  76. package/dist/icons/mono/browser/firefox-reality.svg +1 -0
  77. package/dist/icons/mono/browser/firefox.svg +1 -0
  78. package/dist/icons/mono/browser/gsa.svg +1 -0
  79. package/dist/icons/mono/browser/huawei-browser.svg +1 -0
  80. package/dist/icons/mono/browser/icecat.svg +1 -0
  81. package/dist/icons/mono/browser/ie.svg +1 -0
  82. package/dist/icons/mono/browser/instagram.svg +1 -0
  83. package/dist/icons/mono/browser/jasmine.svg +1 -0
  84. package/dist/icons/mono/browser/kakaotalk.svg +1 -0
  85. package/dist/icons/mono/browser/klarna.svg +1 -0
  86. package/dist/icons/mono/browser/line.svg +1 -0
  87. package/dist/icons/mono/browser/linkedin.svg +1 -0
  88. package/dist/icons/mono/browser/miui-browser.svg +1 -0
  89. package/dist/icons/mono/browser/mobile-chrome.svg +1 -0
  90. package/dist/icons/mono/browser/mobile-firefox.svg +1 -0
  91. package/dist/icons/mono/browser/mobile-safari.svg +1 -0
  92. package/dist/icons/mono/browser/mozilla.svg +1 -0
  93. package/dist/icons/mono/browser/naver.svg +1 -0
  94. package/dist/icons/mono/browser/nokia-browser.svg +1 -0
  95. package/dist/icons/mono/browser/oculus-browser.svg +1 -0
  96. package/dist/icons/mono/browser/opera-coast.svg +1 -0
  97. package/dist/icons/mono/browser/opera-gx.svg +1 -0
  98. package/dist/icons/mono/browser/opera-mini.svg +1 -0
  99. package/dist/icons/mono/browser/opera-mobi.svg +1 -0
  100. package/dist/icons/mono/browser/opera-tablet.svg +1 -0
  101. package/dist/icons/mono/browser/opera-touch.svg +1 -0
  102. package/dist/icons/mono/browser/opera.svg +1 -0
  103. package/dist/icons/mono/browser/qqbrowser.svg +1 -0
  104. package/dist/icons/mono/browser/qqbrowserlite.svg +1 -0
  105. package/dist/icons/mono/browser/safari.svg +1 -0
  106. package/dist/icons/mono/browser/sailfish-browser.svg +1 -0
  107. package/dist/icons/mono/browser/samsung-internet.svg +1 -0
  108. package/dist/icons/mono/browser/smart-lenovo-browser.svg +1 -0
  109. package/dist/icons/mono/browser/snapchat.svg +1 -0
  110. package/dist/icons/mono/browser/sogou-explorer.svg +1 -0
  111. package/dist/icons/mono/browser/sogou-mobile.svg +1 -0
  112. package/dist/icons/mono/browser/tesla.svg +1 -0
  113. package/dist/icons/mono/browser/tiktok.svg +1 -0
  114. package/dist/icons/mono/browser/twitter.svg +1 -0
  115. package/dist/icons/mono/browser/vivaldi.svg +1 -0
  116. package/dist/icons/mono/browser/vivo-browser.svg +1 -0
  117. package/dist/icons/mono/browser/wechat.svg +1 -0
  118. package/dist/icons/mono/browser/weibo.svg +1 -0
  119. package/dist/icons/mono/browser/yandex.svg +1 -0
  120. package/dist/icons/mono/device/acer.svg +1 -0
  121. package/dist/icons/mono/device/amazon.svg +1 -0
  122. package/dist/icons/mono/device/apple.svg +1 -0
  123. package/dist/icons/mono/device/asus.svg +1 -0
  124. package/dist/icons/mono/device/att.svg +1 -0
  125. package/dist/icons/mono/device/blackberry.svg +1 -0
  126. package/dist/icons/mono/device/dell.svg +1 -0
  127. package/dist/icons/mono/device/facebook.svg +1 -0
  128. package/dist/icons/mono/device/fairphone.svg +1 -0
  129. package/dist/icons/mono/device/google.svg +1 -0
  130. package/dist/icons/mono/device/hp.svg +1 -0
  131. package/dist/icons/mono/device/huawei.svg +1 -0
  132. package/dist/icons/mono/device/lenovo.svg +1 -0
  133. package/dist/icons/mono/device/lg.svg +1 -0
  134. package/dist/icons/mono/device/meizu.svg +1 -0
  135. package/dist/icons/mono/device/microsoft.svg +1 -0
  136. package/dist/icons/mono/device/motorola.svg +1 -0
  137. package/dist/icons/mono/device/nintendo.svg +1 -0
  138. package/dist/icons/mono/device/nokia.svg +1 -0
  139. package/dist/icons/mono/device/nvidia.svg +1 -0
  140. package/dist/icons/mono/device/oneplus.svg +1 -0
  141. package/dist/icons/mono/device/oppo.svg +1 -0
  142. package/dist/icons/mono/device/panasonic.svg +1 -0
  143. package/dist/icons/mono/device/roku.svg +1 -0
  144. package/dist/icons/mono/device/samsung.svg +1 -0
  145. package/dist/icons/mono/device/siemens.svg +1 -0
  146. package/dist/icons/mono/device/sony.svg +1 -0
  147. package/dist/icons/mono/device/tesla.svg +1 -0
  148. package/dist/icons/mono/device/vivo.svg +1 -0
  149. package/dist/icons/mono/device/vodafone.svg +1 -0
  150. package/dist/icons/mono/device/xiaomi.svg +1 -0
  151. package/dist/icons/mono/device/zebra.svg +1 -0
  152. package/dist/icons/mono/os/android.svg +1 -0
  153. package/dist/icons/mono/os/arch.svg +1 -0
  154. package/dist/icons/mono/os/blackberry.svg +1 -0
  155. package/dist/icons/mono/os/centos.svg +1 -0
  156. package/dist/icons/mono/os/chrome-os.svg +1 -0
  157. package/dist/icons/mono/os/chromecast.svg +1 -0
  158. package/dist/icons/mono/os/debian.svg +1 -0
  159. package/dist/icons/mono/os/deepin.svg +1 -0
  160. package/dist/icons/mono/os/elementary-os.svg +1 -0
  161. package/dist/icons/mono/os/fedora.svg +1 -0
  162. package/dist/icons/mono/os/firefox.svg +1 -0
  163. package/dist/icons/mono/os/freebsd.svg +1 -0
  164. package/dist/icons/mono/os/gentoo.svg +1 -0
  165. package/dist/icons/mono/os/gnu.svg +1 -0
  166. package/dist/icons/mono/os/harmonyos.svg +1 -0
  167. package/dist/icons/mono/os/ios.svg +1 -0
  168. package/dist/icons/mono/os/kaios.svg +1 -0
  169. package/dist/icons/mono/os/linux.svg +1 -0
  170. package/dist/icons/mono/os/macos.svg +1 -0
  171. package/dist/icons/mono/os/manjaro.svg +1 -0
  172. package/dist/icons/mono/os/mint.svg +1 -0
  173. package/dist/icons/mono/os/netbsd.svg +1 -0
  174. package/dist/icons/mono/os/nintendo.svg +1 -0
  175. package/dist/icons/mono/os/openbsd.svg +1 -0
  176. package/dist/icons/mono/os/playstation.svg +1 -0
  177. package/dist/icons/mono/os/raspbian.svg +1 -0
  178. package/dist/icons/mono/os/redhat.svg +1 -0
  179. package/dist/icons/mono/os/sailfish.svg +1 -0
  180. package/dist/icons/mono/os/slackware.svg +1 -0
  181. package/dist/icons/mono/os/suse.svg +1 -0
  182. package/dist/icons/mono/os/ubuntu.svg +1 -0
  183. package/dist/icons/mono/os/windows.svg +1 -0
  184. package/dist/icons/mono/os/xbox.svg +1 -0
  185. package/dist/ua-parser.min.js +4 -4
  186. package/dist/ua-parser.min.mjs +4 -0
  187. package/dist/ua-parser.pack.js +4 -4
  188. package/dist/ua-parser.pack.mjs +4 -0
  189. package/package.json +86 -36
  190. package/script/cli.js +4 -0
  191. package/src/enums/ua-parser-enums.d.ts +366 -0
  192. package/src/enums/ua-parser-enums.js +393 -0
  193. package/src/enums/ua-parser-enums.mjs +397 -0
  194. package/src/extensions/ua-parser-extensions.d.ts +16 -0
  195. package/src/extensions/ua-parser-extensions.js +366 -0
  196. package/src/extensions/ua-parser-extensions.mjs +370 -0
  197. package/src/helpers/ua-parser-helpers.d.ts +27 -0
  198. package/src/helpers/ua-parser-helpers.js +137 -0
  199. package/src/helpers/ua-parser-helpers.mjs +141 -0
  200. package/src/main/ua-parser.d.ts +113 -0
  201. package/src/main/ua-parser.js +1439 -0
  202. package/src/main/ua-parser.mjs +1397 -0
  203. package/license.md +0 -21
  204. package/readme.md +0 -385
  205. package/src/ua-parser.js +0 -946
package/src/ua-parser.js DELETED
@@ -1,946 +0,0 @@
1
- /////////////////////////////////////////////////////////////////////////////////
2
- /* UAParser.js v1.0.37
3
- Copyright © 2012-2021 Faisal Salman <f@faisalman.com>
4
- MIT License *//*
5
- Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
6
- Supports browser & node.js environment.
7
- Demo : https://faisalman.github.io/ua-parser-js
8
- Source : https://github.com/faisalman/ua-parser-js */
9
- /////////////////////////////////////////////////////////////////////////////////
10
-
11
- (function (window, undefined) {
12
-
13
- 'use strict';
14
-
15
- //////////////
16
- // Constants
17
- /////////////
18
-
19
-
20
- var LIBVERSION = '1.0.37',
21
- EMPTY = '',
22
- UNKNOWN = '?',
23
- FUNC_TYPE = 'function',
24
- UNDEF_TYPE = 'undefined',
25
- OBJ_TYPE = 'object',
26
- STR_TYPE = 'string',
27
- MAJOR = 'major',
28
- MODEL = 'model',
29
- NAME = 'name',
30
- TYPE = 'type',
31
- VENDOR = 'vendor',
32
- VERSION = 'version',
33
- ARCHITECTURE= 'architecture',
34
- CONSOLE = 'console',
35
- MOBILE = 'mobile',
36
- TABLET = 'tablet',
37
- SMARTTV = 'smarttv',
38
- WEARABLE = 'wearable',
39
- EMBEDDED = 'embedded',
40
- UA_MAX_LENGTH = 500;
41
-
42
- var AMAZON = 'Amazon',
43
- APPLE = 'Apple',
44
- ASUS = 'ASUS',
45
- BLACKBERRY = 'BlackBerry',
46
- BROWSER = 'Browser',
47
- CHROME = 'Chrome',
48
- EDGE = 'Edge',
49
- FIREFOX = 'Firefox',
50
- GOOGLE = 'Google',
51
- HUAWEI = 'Huawei',
52
- LG = 'LG',
53
- MICROSOFT = 'Microsoft',
54
- MOTOROLA = 'Motorola',
55
- OPERA = 'Opera',
56
- SAMSUNG = 'Samsung',
57
- SHARP = 'Sharp',
58
- SONY = 'Sony',
59
- XIAOMI = 'Xiaomi',
60
- ZEBRA = 'Zebra',
61
- FACEBOOK = 'Facebook',
62
- CHROMIUM_OS = 'Chromium OS',
63
- MAC_OS = 'Mac OS';
64
-
65
- ///////////
66
- // Helper
67
- //////////
68
-
69
- var extend = function (regexes, extensions) {
70
- var mergedRegexes = {};
71
- for (var i in regexes) {
72
- if (extensions[i] && extensions[i].length % 2 === 0) {
73
- mergedRegexes[i] = extensions[i].concat(regexes[i]);
74
- } else {
75
- mergedRegexes[i] = regexes[i];
76
- }
77
- }
78
- return mergedRegexes;
79
- },
80
- enumerize = function (arr) {
81
- var enums = {};
82
- for (var i=0; i<arr.length; i++) {
83
- enums[arr[i].toUpperCase()] = arr[i];
84
- }
85
- return enums;
86
- },
87
- has = function (str1, str2) {
88
- return typeof str1 === STR_TYPE ? lowerize(str2).indexOf(lowerize(str1)) !== -1 : false;
89
- },
90
- lowerize = function (str) {
91
- return str.toLowerCase();
92
- },
93
- majorize = function (version) {
94
- return typeof(version) === STR_TYPE ? version.replace(/[^\d\.]/g, EMPTY).split('.')[0] : undefined;
95
- },
96
- trim = function (str, len) {
97
- if (typeof(str) === STR_TYPE) {
98
- str = str.replace(/^\s\s*/, EMPTY);
99
- return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
100
- }
101
- };
102
-
103
- ///////////////
104
- // Map helper
105
- //////////////
106
-
107
- var rgxMapper = function (ua, arrays) {
108
-
109
- var i = 0, j, k, p, q, matches, match;
110
-
111
- // loop through all regexes maps
112
- while (i < arrays.length && !matches) {
113
-
114
- var regex = arrays[i], // even sequence (0,2,4,..)
115
- props = arrays[i + 1]; // odd sequence (1,3,5,..)
116
- j = k = 0;
117
-
118
- // try matching uastring with regexes
119
- while (j < regex.length && !matches) {
120
-
121
- if (!regex[j]) { break; }
122
- matches = regex[j++].exec(ua);
123
-
124
- if (!!matches) {
125
- for (p = 0; p < props.length; p++) {
126
- match = matches[++k];
127
- q = props[p];
128
- // check if given property is actually array
129
- if (typeof q === OBJ_TYPE && q.length > 0) {
130
- if (q.length === 2) {
131
- if (typeof q[1] == FUNC_TYPE) {
132
- // assign modified match
133
- this[q[0]] = q[1].call(this, match);
134
- } else {
135
- // assign given value, ignore regex match
136
- this[q[0]] = q[1];
137
- }
138
- } else if (q.length === 3) {
139
- // check whether function or regex
140
- if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
141
- // call function (usually string mapper)
142
- this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
143
- } else {
144
- // sanitize match using given regex
145
- this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
146
- }
147
- } else if (q.length === 4) {
148
- this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
149
- }
150
- } else {
151
- this[q] = match ? match : undefined;
152
- }
153
- }
154
- }
155
- }
156
- i += 2;
157
- }
158
- },
159
-
160
- strMapper = function (str, map) {
161
-
162
- for (var i in map) {
163
- // check if current value is array
164
- if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {
165
- for (var j = 0; j < map[i].length; j++) {
166
- if (has(map[i][j], str)) {
167
- return (i === UNKNOWN) ? undefined : i;
168
- }
169
- }
170
- } else if (has(map[i], str)) {
171
- return (i === UNKNOWN) ? undefined : i;
172
- }
173
- }
174
- return str;
175
- };
176
-
177
- ///////////////
178
- // String map
179
- //////////////
180
-
181
- // Safari < 3.0
182
- var oldSafariMap = {
183
- '1.0' : '/8',
184
- '1.2' : '/1',
185
- '1.3' : '/3',
186
- '2.0' : '/412',
187
- '2.0.2' : '/416',
188
- '2.0.3' : '/417',
189
- '2.0.4' : '/419',
190
- '?' : '/'
191
- },
192
- windowsVersionMap = {
193
- 'ME' : '4.90',
194
- 'NT 3.11' : 'NT3.51',
195
- 'NT 4.0' : 'NT4.0',
196
- '2000' : 'NT 5.0',
197
- 'XP' : ['NT 5.1', 'NT 5.2'],
198
- 'Vista' : 'NT 6.0',
199
- '7' : 'NT 6.1',
200
- '8' : 'NT 6.2',
201
- '8.1' : 'NT 6.3',
202
- '10' : ['NT 6.4', 'NT 10.0'],
203
- 'RT' : 'ARM'
204
- };
205
-
206
- //////////////
207
- // Regex map
208
- /////////////
209
-
210
- var regexes = {
211
-
212
- browser : [[
213
-
214
- /\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
215
- ], [VERSION, [NAME, 'Chrome']], [
216
- /edg(?:e|ios|a)?\/([\w\.]+)/i // Microsoft Edge
217
- ], [VERSION, [NAME, 'Edge']], [
218
-
219
- // Presto based
220
- /(opera mini)\/([-\w\.]+)/i, // Opera Mini
221
- /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i, // Opera Mobi/Tablet
222
- /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i // Opera
223
- ], [NAME, VERSION], [
224
- /opios[\/ ]+([\w\.]+)/i // Opera mini on iphone >= 8.0
225
- ], [VERSION, [NAME, OPERA+' Mini']], [
226
- /\bopr\/([\w\.]+)/i // Opera Webkit
227
- ], [VERSION, [NAME, OPERA]], [
228
-
229
- // Mixed
230
- /\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i // Baidu
231
- ], [VERSION, [NAME, 'Baidu']], [
232
- /(kindle)\/([\w\.]+)/i, // Kindle
233
- /(lunascape|maxthon|netfront|jasmine|blazer)[\/ ]?([\w\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer
234
- // Trident based
235
- /(avant|iemobile|slim)\s?(?:browser)?[\/ ]?([\w\.]*)/i, // Avant/IEMobile/SlimBrowser
236
- /(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
237
-
238
- // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
239
- /(flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|qq|duckduckgo)\/([-\w\.]+)/i,
240
- // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ
241
- /(heytap|ovi)browser\/([\d\.]+)/i, // Heytap/Ovi
242
- /(weibo)__([\d\.]+)/i // Weibo
243
- ], [NAME, VERSION], [
244
- /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser
245
- ], [VERSION, [NAME, 'UC'+BROWSER]], [
246
- /microm.+\bqbcore\/([\w\.]+)/i, // WeChat Desktop for Windows Built-in Browser
247
- /\bqbcore\/([\w\.]+).+microm/i,
248
- /micromessenger\/([\w\.]+)/i // WeChat
249
- ], [VERSION, [NAME, 'WeChat']], [
250
- /konqueror\/([\w\.]+)/i // Konqueror
251
- ], [VERSION, [NAME, 'Konqueror']], [
252
- /trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i // IE11
253
- ], [VERSION, [NAME, 'IE']], [
254
- /ya(?:search)?browser\/([\w\.]+)/i // Yandex
255
- ], [VERSION, [NAME, 'Yandex']], [
256
- /slbrowser\/([\w\.]+)/i // Smart Lenovo Browser
257
- ], [VERSION, [NAME, 'Smart Lenovo '+BROWSER]], [
258
- /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
259
- ], [[NAME, /(.+)/, '$1 Secure '+BROWSER], VERSION], [
260
- /\bfocus\/([\w\.]+)/i // Firefox Focus
261
- ], [VERSION, [NAME, FIREFOX+' Focus']], [
262
- /\bopt\/([\w\.]+)/i // Opera Touch
263
- ], [VERSION, [NAME, OPERA+' Touch']], [
264
- /coc_coc\w+\/([\w\.]+)/i // Coc Coc Browser
265
- ], [VERSION, [NAME, 'Coc Coc']], [
266
- /dolfin\/([\w\.]+)/i // Dolphin
267
- ], [VERSION, [NAME, 'Dolphin']], [
268
- /coast\/([\w\.]+)/i // Opera Coast
269
- ], [VERSION, [NAME, OPERA+' Coast']], [
270
- /miuibrowser\/([\w\.]+)/i // MIUI Browser
271
- ], [VERSION, [NAME, 'MIUI '+BROWSER]], [
272
- /fxios\/([-\w\.]+)/i // Firefox for iOS
273
- ], [VERSION, [NAME, FIREFOX]], [
274
- /\bqihu|(qi?ho?o?|360)browser/i // 360
275
- ], [[NAME, '360 ' + BROWSER]], [
276
- /(oculus|sailfish|huawei|vivo)browser\/([\w\.]+)/i
277
- ], [[NAME, /(.+)/, '$1 ' + BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser
278
- /samsungbrowser\/([\w\.]+)/i // Samsung Internet
279
- ], [VERSION, [NAME, SAMSUNG + ' Internet']], [
280
- /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
281
- ], [[NAME, /_/g, ' '], VERSION], [
282
- /metasr[\/ ]?([\d\.]+)/i // Sogou Explorer
283
- ], [VERSION, [NAME, 'Sogou Explorer']], [
284
- /(sogou)mo\w+\/([\d\.]+)/i // Sogou Mobile
285
- ], [[NAME, 'Sogou Mobile'], VERSION], [
286
- /(electron)\/([\w\.]+) safari/i, // Electron-based App
287
- /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i, // Tesla
288
- /m?(qqbrowser|2345Explorer)[\/ ]?([\w\.]+)/i // QQBrowser/2345 Browser
289
- ], [NAME, VERSION], [
290
- /(lbbrowser)/i, // LieBao Browser
291
- /\[(linkedin)app\]/i // LinkedIn App for iOS & Android
292
- ], [NAME], [
293
-
294
- // WebView
295
- /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i // Facebook App for iOS & Android
296
- ], [[NAME, FACEBOOK], VERSION], [
297
- /(Klarna)\/([\w\.]+)/i, // Klarna Shopping Browser for iOS & Android
298
- /(kakao(?:talk|story))[\/ ]([\w\.]+)/i, // Kakao App
299
- /(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp
300
- /safari (line)\/([\w\.]+)/i, // Line App for iOS
301
- /\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
302
- /(alipay)client\/([\w\.]+)/i, // Alipay
303
- /(chromium|instagram|snapchat)[\/ ]([-\w\.]+)/i // Chromium/Instagram/Snapchat
304
- ], [NAME, VERSION], [
305
- /\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
306
- ], [VERSION, [NAME, 'GSA']], [
307
- /musical_ly(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
308
- ], [VERSION, [NAME, 'TikTok']], [
309
-
310
- /headlesschrome(?:\/([\w\.]+)| )/i // Chrome Headless
311
- ], [VERSION, [NAME, CHROME+' Headless']], [
312
-
313
- / wv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
314
- ], [[NAME, CHROME+' WebView'], VERSION], [
315
-
316
- /droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i // Android Browser
317
- ], [VERSION, [NAME, 'Android '+BROWSER]], [
318
-
319
- /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
320
- ], [NAME, VERSION], [
321
-
322
- /version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i // Mobile Safari
323
- ], [VERSION, [NAME, 'Mobile Safari']], [
324
- /version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i // Safari & Safari Mobile
325
- ], [VERSION, NAME], [
326
- /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
327
- ], [NAME, [VERSION, strMapper, oldSafariMap]], [
328
-
329
- /(webkit|khtml)\/([\w\.]+)/i
330
- ], [NAME, VERSION], [
331
-
332
- // Gecko based
333
- /(navigator|netscape\d?)\/([-\w\.]+)/i // Netscape
334
- ], [[NAME, 'Netscape'], VERSION], [
335
- /mobile vr; rv:([\w\.]+)\).+firefox/i // Firefox Reality
336
- ], [VERSION, [NAME, FIREFOX+' Reality']], [
337
- /ekiohf.+(flow)\/([\w\.]+)/i, // Flow
338
- /(swiftfox)/i, // Swiftfox
339
- /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\/ ]?([\w\.\+]+)/i,
340
- // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror/Klar
341
- /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i,
342
- // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
343
- /(firefox)\/([\w\.]+)/i, // Other Firefox-based
344
- /(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i, // Mozilla
345
-
346
- // Other
347
- /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
348
- // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir/Obigo/Mosaic/Go/ICE/UP.Browser
349
- /(links) \(([\w\.]+)/i, // Links
350
- /panasonic;(viera)/i // Panasonic Viera
351
- ], [NAME, VERSION], [
352
-
353
- /(cobalt)\/([\w\.]+)/i // Cobalt
354
- ], [NAME, [VERSION, /master.|lts./, ""]]
355
- ],
356
-
357
- cpu : [[
358
-
359
- /(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\)]/i // AMD64 (x64)
360
- ], [[ARCHITECTURE, 'amd64']], [
361
-
362
- /(ia32(?=;))/i // IA32 (quicktime)
363
- ], [[ARCHITECTURE, lowerize]], [
364
-
365
- /((?:i[346]|x)86)[;\)]/i // IA32 (x86)
366
- ], [[ARCHITECTURE, 'ia32']], [
367
-
368
- /\b(aarch64|arm(v?8e?l?|_?64))\b/i // ARM64
369
- ], [[ARCHITECTURE, 'arm64']], [
370
-
371
- /\b(arm(?:v[67])?ht?n?[fl]p?)\b/i // ARMHF
372
- ], [[ARCHITECTURE, 'armhf']], [
373
-
374
- // PocketPC mistakenly identified as PowerPC
375
- /windows (ce|mobile); ppc;/i
376
- ], [[ARCHITECTURE, 'arm']], [
377
-
378
- /((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i // PowerPC
379
- ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [
380
-
381
- /(sun4\w)[;\)]/i // SPARC
382
- ], [[ARCHITECTURE, 'sparc']], [
383
-
384
- /((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i
385
- // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
386
- ], [[ARCHITECTURE, lowerize]]
387
- ],
388
-
389
- device : [[
390
-
391
- //////////////////////////
392
- // MOBILES & TABLETS
393
- /////////////////////////
394
-
395
- // Samsung
396
- /\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
397
- ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [
398
- /\b((?:s[cgp]h|gt|sm)-\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
399
- /samsung[- ]([-\w]+)/i,
400
- /sec-(sgh\w+)/i
401
- ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [
402
-
403
- // Apple
404
- /(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i // iPod/iPhone
405
- ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [
406
- /\((ipad);[-\w\),; ]+apple/i, // iPad
407
- /applecoremedia\/[\w\.]+ \((ipad)/i,
408
- /\b(ipad)\d\d?,\d\d?[;\]].+ios/i
409
- ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [
410
- /(macintosh);/i
411
- ], [MODEL, [VENDOR, APPLE]], [
412
-
413
- // Sharp
414
- /\b(sh-?[altvz]?\d\d[a-ekm]?)/i
415
- ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [
416
-
417
- // Huawei
418
- /\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i
419
- ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [
420
- /(?:huawei|honor)([-\w ]+)[;\)]/i,
421
- /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i
422
- ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [
423
-
424
- // Xiaomi
425
- /\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i, // Xiaomi POCO
426
- /\b; (\w+) build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
427
- /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
428
- /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi
429
- /oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i, // Xiaomi Redmi 'numeric' models
430
- /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i // Xiaomi Mi
431
- ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
432
- /oid[^\)]+; (2\d{4}(283|rpbf)[cgl])( bui|\))/i, // Redmi Pad
433
- /\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i // Mi Pad tablets
434
- ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
435
-
436
- // OPPO
437
- /; (\w+) bui.+ oppo/i,
438
- /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i
439
- ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [
440
-
441
- // Vivo
442
- /vivo (\w+)(?: bui|\))/i,
443
- /\b(v[12]\d{3}\w?[at])(?: bui|;)/i
444
- ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
445
-
446
- // Realme
447
- /\b(rmx[1-3]\d{3})(?: bui|;|\))/i
448
- ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
449
-
450
- // Motorola
451
- /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
452
- /\bmot(?:orola)?[- ](\w*)/i,
453
- /((?:moto[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i
454
- ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [
455
- /\b(mz60\d|xoom[2 ]{0,2}) build\//i
456
- ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [
457
-
458
- // LG
459
- /((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
460
- ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [
461
- /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
462
- /\blg[-e;\/ ]+((?!browser|netcast|android tv)\w+)/i,
463
- /\blg-?([\d\w]+) bui/i
464
- ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [
465
-
466
- // Lenovo
467
- /(ideatab[-\w ]+)/i,
468
- /lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i
469
- ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
470
-
471
- // Nokia
472
- /(?:maemo|nokia).*(n900|lumia \d+)/i,
473
- /nokia[-_ ]?([-\w\.]*)/i
474
- ], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [
475
-
476
- // Google
477
- /(pixel c)\b/i // Google Pixel C
478
- ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [
479
- /droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i // Google Pixel
480
- ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [
481
-
482
- // Sony
483
- /droid.+ (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i
484
- ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [
485
- /sony tablet [ps]/i,
486
- /\b(?:sony)?sgp\w+(?: bui|\))/i
487
- ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [
488
-
489
- // OnePlus
490
- / (kb2005|in20[12]5|be20[12][59])\b/i,
491
- /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
492
- ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
493
-
494
- // Amazon
495
- /(alexa)webm/i,
496
- /(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i, // Kindle Fire without Silk / Echo Show
497
- /(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD
498
- ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [
499
- /((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone
500
- ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [
501
-
502
- // BlackBerry
503
- /(playbook);[-\w\),; ]+(rim)/i // BlackBerry PlayBook
504
- ], [MODEL, VENDOR, [TYPE, TABLET]], [
505
- /\b((?:bb[a-f]|st[hv])100-\d)/i,
506
- /\(bb10; (\w+)/i // BlackBerry 10
507
- ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [
508
-
509
- // Asus
510
- /(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i
511
- ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [
512
- / (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i
513
- ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [
514
-
515
- // HTC
516
- /(nexus 9)/i // HTC Nexus 9
517
- ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
518
- /(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i, // HTC
519
-
520
- // ZTE
521
- /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
522
- /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
523
- ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
524
-
525
- // Acer
526
- /droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
527
- ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
528
-
529
- // Meizu
530
- /droid.+; (m[1-5] note) bui/i,
531
- /\bmz-([-\w]{2,})/i
532
- ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
533
-
534
- // Ulefone
535
- /; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
536
- ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [
537
-
538
- // MIXED
539
- /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno)[-_ ]?([-\w]*)/i,
540
- // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
541
- /(hp) ([\w ]+\w)/i, // HP iPAQ
542
- /(asus)-?(\w+)/i, // Asus
543
- /(microsoft); (lumia[\w ]+)/i, // Microsoft Lumia
544
- /(lenovo)[-_ ]?([-\w]+)/i, // Lenovo
545
- /(jolla)/i, // Jolla
546
- /(oppo) ?([\w ]+) bui/i // OPPO
547
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
548
-
549
- /(kobo)\s(ereader|touch)/i, // Kobo
550
- /(archos) (gamepad2?)/i, // Archos
551
- /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad
552
- /(kindle)\/([\w\.]+)/i, // Kindle
553
- /(nook)[\w ]+build\/(\w+)/i, // Nook
554
- /(dell) (strea[kpr\d ]*[\dko])/i, // Dell Streak
555
- /(le[- ]+pan)[- ]+(\w{1,9}) bui/i, // Le Pan Tablets
556
- /(trinity)[- ]*(t\d{3}) bui/i, // Trinity Tablets
557
- /(gigaset)[- ]+(q\w{1,9}) bui/i, // Gigaset Tablets
558
- /(vodafone) ([\w ]+)(?:\)| bui)/i // Vodafone
559
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
560
-
561
- /(surface duo)/i // Surface Duo
562
- ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [
563
- /droid [\d\.]+; (fp\du?)(?: b|\))/i // Fairphone
564
- ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [
565
- /(u304aa)/i // AT&T
566
- ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [
567
- /\bsie-(\w*)/i // Siemens
568
- ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
569
- /\b(rct\w+) b/i // RCA Tablets
570
- ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
571
- /\b(venue[\d ]{2,7}) b/i // Dell Venue Tablets
572
- ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
573
- /\b(q(?:mv|ta)\w+) b/i // Verizon Tablet
574
- ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
575
- /\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i // Barnes & Noble Tablet
576
- ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [
577
- /\b(tm\d{3}\w+) b/i
578
- ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
579
- /\b(k88) b/i // ZTE K Series Tablet
580
- ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [
581
- /\b(nx\d{3}j) b/i // ZTE Nubia
582
- ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
583
- /\b(gen\d{3}) b.+49h/i // Swiss GEN Mobile
584
- ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
585
- /\b(zur\d{3}) b/i // Swiss ZUR Tablet
586
- ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
587
- /\b((zeki)?tb.*\b) b/i // Zeki Tablets
588
- ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
589
- /\b([yr]\d{2}) b/i,
590
- /\b(dragon[- ]+touch |dt)(\w{5}) b/i // Dragon Touch Tablet
591
- ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [
592
- /\b(ns-?\w{0,9}) b/i // Insignia Tablets
593
- ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
594
- /\b((nxa|next)-?\w{0,9}) b/i // NextBook Tablets
595
- ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
596
- /\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones
597
- ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [
598
- /\b(lvtel\-)?(v1[12]) b/i // LvTel Phones
599
- ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
600
- /\b(ph-1) /i // Essential PH-1
601
- ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [
602
- /\b(v(100md|700na|7011|917g).*\b) b/i // Envizen Tablets
603
- ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
604
- /\b(trio[-\w\. ]+) b/i // MachSpeed Tablets
605
- ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
606
- /\btu_(1491) b/i // Rotor Tablets
607
- ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
608
- /(shield[\w ]+) b/i // Nvidia Shield Tablets
609
- ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [
610
- /(sprint) (\w+)/i // Sprint Phones
611
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
612
- /(kin\.[onetw]{3})/i // Microsoft Kin
613
- ], [[MODEL, /\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [
614
- /droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra
615
- ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [
616
- /droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i
617
- ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [
618
-
619
- ///////////////////
620
- // SMARTTVS
621
- ///////////////////
622
-
623
- /smart-tv.+(samsung)/i // Samsung
624
- ], [VENDOR, [TYPE, SMARTTV]], [
625
- /hbbtv.+maple;(\d+)/i
626
- ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [
627
- /(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i // LG SmartTV
628
- ], [[VENDOR, LG], [TYPE, SMARTTV]], [
629
- /(apple) ?tv/i // Apple TV
630
- ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [
631
- /crkey/i // Google Chromecast
632
- ], [[MODEL, CHROME+'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
633
- /droid.+aft(\w+)( bui|\))/i // Fire TV
634
- ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
635
- /\(dtv[\);].+(aquos)/i,
636
- /(aquos-tv[\w ]+)\)/i // Sharp
637
- ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[
638
- /(bravia[\w ]+)( bui|\))/i // Sony
639
- ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [
640
- /(mitv-\w{5}) bui/i // Xiaomi
641
- ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [
642
- /Hbbtv.*(technisat) (.*);/i // TechniSAT
643
- ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
644
- /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku
645
- /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices
646
- ], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [
647
- /\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i // SmartTV from Unidentified Vendors
648
- ], [[TYPE, SMARTTV]], [
649
-
650
- ///////////////////
651
- // CONSOLES
652
- ///////////////////
653
-
654
- /(ouya)/i, // Ouya
655
- /(nintendo) ([wids3utch]+)/i // Nintendo
656
- ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
657
- /droid.+; (shield) bui/i // Nvidia
658
- ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
659
- /(playstation [345portablevi]+)/i // Playstation
660
- ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [
661
- /\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox
662
- ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [
663
-
664
- ///////////////////
665
- // WEARABLES
666
- ///////////////////
667
-
668
- /((pebble))app/i // Pebble
669
- ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
670
- /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
671
- ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [
672
- /droid.+; (glass) \d/i // Google Glass
673
- ], [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]], [
674
- /droid.+; (wt63?0{2,3})\)/i
675
- ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [
676
- /(quest( 2| pro)?)/i // Oculus Quest
677
- ], [MODEL, [VENDOR, FACEBOOK], [TYPE, WEARABLE]], [
678
-
679
- ///////////////////
680
- // EMBEDDED
681
- ///////////////////
682
-
683
- /(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i // Tesla
684
- ], [VENDOR, [TYPE, EMBEDDED]], [
685
- /(aeobc)\b/i // Echo Dot
686
- ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [
687
-
688
- ////////////////////
689
- // MIXED (GENERIC)
690
- ///////////////////
691
-
692
- /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors
693
- ], [MODEL, [TYPE, MOBILE]], [
694
- /droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors
695
- ], [MODEL, [TYPE, TABLET]], [
696
- /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet
697
- ], [[TYPE, TABLET]], [
698
- /(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile
699
- ], [[TYPE, MOBILE]], [
700
- /(android[-\w\. ]{0,9});.+buil/i // Generic Android Device
701
- ], [MODEL, [VENDOR, 'Generic']]
702
- ],
703
-
704
- engine : [[
705
-
706
- /windows.+ edge\/([\w\.]+)/i // EdgeHTML
707
- ], [VERSION, [NAME, EDGE+'HTML']], [
708
-
709
- /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
710
- ], [VERSION, [NAME, 'Blink']], [
711
-
712
- /(presto)\/([\w\.]+)/i, // Presto
713
- /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
714
- /ekioh(flow)\/([\w\.]+)/i, // Flow
715
- /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links
716
- /(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab
717
- /\b(libweb)/i
718
- ], [NAME, VERSION], [
719
-
720
- /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
721
- ], [VERSION, NAME]
722
- ],
723
-
724
- os : [[
725
-
726
- // Windows
727
- /microsoft (windows) (vista|xp)/i // Windows (iTunes)
728
- ], [NAME, VERSION], [
729
- /(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i // Windows Phone
730
- ], [NAME, [VERSION, strMapper, windowsVersionMap]], [
731
- /windows nt 6\.2; (arm)/i, // Windows RT
732
- /windows[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i,
733
- /(?:win(?=3|9|n)|win 9x )([nt\d\.]+)/i
734
- ], [[VERSION, strMapper, windowsVersionMap], [NAME, 'Windows']], [
735
-
736
- // iOS/macOS
737
- /ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
738
- /(?:ios;fbsv\/|iphone.+ios[\/ ])([\d\.]+)/i,
739
- /cfnetwork\/.+darwin/i
740
- ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
741
- /(mac os x) ?([\w\. ]*)/i,
742
- /(macintosh|mac_powerpc\b)(?!.+haiku)/i // Mac OS
743
- ], [[NAME, MAC_OS], [VERSION, /_/g, '.']], [
744
-
745
- // Mobile OSes
746
- /droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS
747
- ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS
748
- /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i,
749
- /(blackberry)\w*\/([\w\.]*)/i, // Blackberry
750
- /(tizen|kaios)[\/ ]([\w\.]+)/i, // Tizen/KaiOS
751
- /\((series40);/i // Series 40
752
- ], [NAME, VERSION], [
753
- /\(bb(10);/i // BlackBerry 10
754
- ], [VERSION, [NAME, BLACKBERRY]], [
755
- /(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i // Symbian
756
- ], [VERSION, [NAME, 'Symbian']], [
757
- /mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i // Firefox OS
758
- ], [VERSION, [NAME, FIREFOX+' OS']], [
759
- /web0s;.+rt(tv)/i,
760
- /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i // WebOS
761
- ], [VERSION, [NAME, 'webOS']], [
762
- /watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i // watchOS
763
- ], [VERSION, [NAME, 'watchOS']], [
764
-
765
- // Google Chromecast
766
- /crkey\/([\d\.]+)/i // Google Chromecast
767
- ], [VERSION, [NAME, CHROME+'cast']], [
768
- /(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
769
- ], [[NAME, CHROMIUM_OS], VERSION],[
770
-
771
- // Smart TVs
772
- /panasonic;(viera)/i, // Panasonic Viera
773
- /(netrange)mmh/i, // Netrange
774
- /(nettv)\/(\d+\.[\w\.]+)/i, // NetTV
775
-
776
- // Console
777
- /(nintendo|playstation) ([wids345portablevuch]+)/i, // Nintendo/Playstation
778
- /(xbox); +xbox ([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
779
-
780
- // Other
781
- /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i, // Joli/Palm
782
- /(mint)[\/\(\) ]?(\w*)/i, // Mint
783
- /(mageia|vectorlinux)[; ]/i, // Mageia/VectorLinux
784
- /([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,
785
- // Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire
786
- /(hurd|linux) ?([\w\.]*)/i, // Hurd/Linux
787
- /(gnu) ?([\w\.]*)/i, // GNU
788
- /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
789
- /(haiku) (\w+)/i // Haiku
790
- ], [NAME, VERSION], [
791
- /(sunos) ?([\w\.\d]*)/i // Solaris
792
- ], [[NAME, 'Solaris'], VERSION], [
793
- /((?:open)?solaris)[-\/ ]?([\w\.]*)/i, // Solaris
794
- /(aix) ((\d)(?=\.|\)| )[\w\.])*/i, // AIX
795
- /\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX/SerenityOS
796
- /(unix) ?([\w\.]*)/i // UNIX
797
- ], [NAME, VERSION]
798
- ]
799
- };
800
-
801
- /////////////////
802
- // Constructor
803
- ////////////////
804
-
805
- var UAParser = function (ua, extensions) {
806
-
807
- if (typeof ua === OBJ_TYPE) {
808
- extensions = ua;
809
- ua = undefined;
810
- }
811
-
812
- if (!(this instanceof UAParser)) {
813
- return new UAParser(ua, extensions).getResult();
814
- }
815
-
816
- var _navigator = (typeof window !== UNDEF_TYPE && window.navigator) ? window.navigator : undefined;
817
- var _ua = ua || ((_navigator && _navigator.userAgent) ? _navigator.userAgent : EMPTY);
818
- var _uach = (_navigator && _navigator.userAgentData) ? _navigator.userAgentData : undefined;
819
- var _rgxmap = extensions ? extend(regexes, extensions) : regexes;
820
- var _isSelfNav = _navigator && _navigator.userAgent == _ua;
821
-
822
- this.getBrowser = function () {
823
- var _browser = {};
824
- _browser[NAME] = undefined;
825
- _browser[VERSION] = undefined;
826
- rgxMapper.call(_browser, _ua, _rgxmap.browser);
827
- _browser[MAJOR] = majorize(_browser[VERSION]);
828
- // Brave-specific detection
829
- if (_isSelfNav && _navigator && _navigator.brave && typeof _navigator.brave.isBrave == FUNC_TYPE) {
830
- _browser[NAME] = 'Brave';
831
- }
832
- return _browser;
833
- };
834
- this.getCPU = function () {
835
- var _cpu = {};
836
- _cpu[ARCHITECTURE] = undefined;
837
- rgxMapper.call(_cpu, _ua, _rgxmap.cpu);
838
- return _cpu;
839
- };
840
- this.getDevice = function () {
841
- var _device = {};
842
- _device[VENDOR] = undefined;
843
- _device[MODEL] = undefined;
844
- _device[TYPE] = undefined;
845
- rgxMapper.call(_device, _ua, _rgxmap.device);
846
- if (_isSelfNav && !_device[TYPE] && _uach && _uach.mobile) {
847
- _device[TYPE] = MOBILE;
848
- }
849
- // iPadOS-specific detection: identified as Mac, but has some iOS-only properties
850
- if (_isSelfNav && _device[MODEL] == 'Macintosh' && _navigator && typeof _navigator.standalone !== UNDEF_TYPE && _navigator.maxTouchPoints && _navigator.maxTouchPoints > 2) {
851
- _device[MODEL] = 'iPad';
852
- _device[TYPE] = TABLET;
853
- }
854
- return _device;
855
- };
856
- this.getEngine = function () {
857
- var _engine = {};
858
- _engine[NAME] = undefined;
859
- _engine[VERSION] = undefined;
860
- rgxMapper.call(_engine, _ua, _rgxmap.engine);
861
- return _engine;
862
- };
863
- this.getOS = function () {
864
- var _os = {};
865
- _os[NAME] = undefined;
866
- _os[VERSION] = undefined;
867
- rgxMapper.call(_os, _ua, _rgxmap.os);
868
- if (_isSelfNav && !_os[NAME] && _uach && _uach.platform != 'Unknown') {
869
- _os[NAME] = _uach.platform
870
- .replace(/chrome os/i, CHROMIUM_OS)
871
- .replace(/macos/i, MAC_OS); // backward compatibility
872
- }
873
- return _os;
874
- };
875
- this.getResult = function () {
876
- return {
877
- ua : this.getUA(),
878
- browser : this.getBrowser(),
879
- engine : this.getEngine(),
880
- os : this.getOS(),
881
- device : this.getDevice(),
882
- cpu : this.getCPU()
883
- };
884
- };
885
- this.getUA = function () {
886
- return _ua;
887
- };
888
- this.setUA = function (ua) {
889
- _ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? trim(ua, UA_MAX_LENGTH) : ua;
890
- return this;
891
- };
892
- this.setUA(_ua);
893
- return this;
894
- };
895
-
896
- UAParser.VERSION = LIBVERSION;
897
- UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR]);
898
- UAParser.CPU = enumerize([ARCHITECTURE]);
899
- UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);
900
- UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);
901
-
902
- ///////////
903
- // Export
904
- //////////
905
-
906
- // check js environment
907
- if (typeof(exports) !== UNDEF_TYPE) {
908
- // nodejs env
909
- if (typeof module !== UNDEF_TYPE && module.exports) {
910
- exports = module.exports = UAParser;
911
- }
912
- exports.UAParser = UAParser;
913
- } else {
914
- // requirejs env (optional)
915
- if (typeof(define) === FUNC_TYPE && define.amd) {
916
- define(function () {
917
- return UAParser;
918
- });
919
- } else if (typeof window !== UNDEF_TYPE) {
920
- // browser env
921
- window.UAParser = UAParser;
922
- }
923
- }
924
-
925
- // jQuery/Zepto specific (optional)
926
- // Note:
927
- // In AMD env the global scope should be kept clean, but jQuery is an exception.
928
- // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
929
- // and we should catch that.
930
- var $ = typeof window !== UNDEF_TYPE && (window.jQuery || window.Zepto);
931
- if ($ && !$.ua) {
932
- var parser = new UAParser();
933
- $.ua = parser.getResult();
934
- $.ua.get = function () {
935
- return parser.getUA();
936
- };
937
- $.ua.set = function (ua) {
938
- parser.setUA(ua);
939
- var result = parser.getResult();
940
- for (var prop in result) {
941
- $.ua[prop] = result[prop];
942
- }
943
- };
944
- }
945
-
946
- })(typeof window === 'object' ? window : this);