ua-parser-js 0.7.20 → 0.7.28

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.

Potentially problematic release.


This version of ua-parser-js might be problematic. Click here for more details.

package/src/ua-parser.js CHANGED
@@ -1,9 +1,9 @@
1
- /*!
2
- * UAParser.js v0.7.20
1
+ /*!@license
2
+ * UAParser.js v0.7.28
3
3
  * Lightweight JavaScript-based User-Agent string parser
4
4
  * https://github.com/faisalman/ua-parser-js
5
5
  *
6
- * Copyright © 2012-2019 Faisal Salman <f@faisalman.com>
6
+ * Copyright © 2012-2021 Faisal Salman <f@faisalman.com>
7
7
  * Licensed under MIT License
8
8
  */
9
9
 
@@ -16,7 +16,7 @@
16
16
  /////////////
17
17
 
18
18
 
19
- var LIBVERSION = '0.7.20',
19
+ var LIBVERSION = '0.7.28',
20
20
  EMPTY = '',
21
21
  UNKNOWN = '?',
22
22
  FUNC_TYPE = 'function',
@@ -35,7 +35,8 @@
35
35
  TABLET = 'tablet',
36
36
  SMARTTV = 'smarttv',
37
37
  WEARABLE = 'wearable',
38
- EMBEDDED = 'embedded';
38
+ EMBEDDED = 'embedded',
39
+ UA_MAX_LENGTH = 255;
39
40
 
40
41
 
41
42
  ///////////
@@ -56,11 +57,7 @@
56
57
  return mergedRegexes;
57
58
  },
58
59
  has : function (str1, str2) {
59
- if (typeof str1 === "string") {
60
- return str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1;
61
- } else {
62
- return false;
63
- }
60
+ return typeof str1 === STR_TYPE ? str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1 : false;
64
61
  },
65
62
  lowerize : function (str) {
66
63
  return str.toLowerCase();
@@ -68,8 +65,9 @@
68
65
  major : function (version) {
69
66
  return typeof(version) === STR_TYPE ? version.replace(/[^\d\.]/g,'').split(".")[0] : undefined;
70
67
  },
71
- trim : function (str) {
72
- return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
68
+ trim : function (str, len) {
69
+ str = str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
70
+ return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
73
71
  }
74
72
  };
75
73
 
@@ -160,7 +158,8 @@
160
158
  var maps = {
161
159
 
162
160
  browser : {
163
- oldsafari : {
161
+ // Safari < 3.0
162
+ oldSafari : {
164
163
  version : {
165
164
  '1.0' : '/8',
166
165
  '1.2' : '/1',
@@ -171,22 +170,16 @@
171
170
  '2.0.4' : '/419',
172
171
  '?' : '/'
173
172
  }
174
- }
175
- },
176
-
177
- device : {
178
- amazon : {
179
- model : {
180
- 'Fire Phone' : ['SD', 'KF']
181
- }
182
173
  },
183
- sprint : {
184
- model : {
185
- 'Evo Shift 4G' : '7373KT'
186
- },
187
- vendor : {
188
- 'HTC' : 'APA',
189
- 'Sprint' : 'Sprint'
174
+ oldEdge : {
175
+ version : {
176
+ '0.1' : '12.',
177
+ '21' : '13.',
178
+ '31' : '14.',
179
+ '39' : '15.',
180
+ '41' : '16.',
181
+ '42' : '17.',
182
+ '44' : '18.'
190
183
  }
191
184
  }
192
185
  },
@@ -220,144 +213,110 @@
220
213
 
221
214
  browser : [[
222
215
 
216
+ /\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
217
+ ], [VERSION, [NAME, 'Chrome']], [
218
+ /edg(?:e|ios|a)?\/([\w\.]+)/i // Microsoft Edge
219
+ ], [VERSION, [NAME, 'Edge']], [
220
+ // breaking change (reserved for next major release):
221
+ ///edge\/([\w\.]+)/i // Old Edge (Trident)
222
+ //], [[VERSION, mapper.str, maps.browser.oldEdge.version], [NAME, 'Edge']], [
223
+
223
224
  // Presto based
224
225
  /(opera\smini)\/([\w\.-]+)/i, // Opera Mini
225
- /(opera\s[mobiletab]+).+version\/([\w\.-]+)/i, // Opera Mobi/Tablet
226
- /(opera).+version\/([\w\.]+)/i, // Opera > 9.80
227
- /(opera)[\/\s]+([\w\.]+)/i // Opera < 9.80
226
+ /(opera\s[mobiletab]{3,6})\b.+version\/([\w\.-]+)/i, // Opera Mobi/Tablet
227
+ /(opera)(?:.+version\/|[\/\s]+)([\w\.]+)/i, // Opera
228
228
  ], [NAME, VERSION], [
229
-
230
- /(opios)[\/\s]+([\w\.]+)/i // Opera mini on iphone >= 8.0
231
- ], [[NAME, 'Opera Mini'], VERSION], [
232
-
233
- /\s(opr)\/([\w\.]+)/i // Opera Webkit
234
- ], [[NAME, 'Opera'], VERSION], [
229
+ /opios[\/\s]+([\w\.]+)/i // Opera mini on iphone >= 8.0
230
+ ], [VERSION, [NAME, 'Opera Mini']], [
231
+ /\sopr\/([\w\.]+)/i // Opera Webkit
232
+ ], [VERSION, [NAME, 'Opera']], [
235
233
 
236
234
  // Mixed
237
235
  /(kindle)\/([\w\.]+)/i, // Kindle
238
- /(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]*)/i,
239
- // Lunascape/Maxthon/Netfront/Jasmine/Blazer
240
-
236
+ /(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer
241
237
  // Trident based
242
- /(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i,
243
- // Avant/IEMobile/SlimBrowser/Baidu
238
+ /(avant\s|iemobile|slim)(?:browser)?[\/\s]?([\w\.]*)/i, // Avant/IEMobile/SlimBrowser
239
+ /(ba?idubrowser)[\/\s]?([\w\.]+)/i, // Baidu Browser
244
240
  /(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer
245
241
 
246
242
  // Webkit/KHTML based
247
- /(rekonq)\/([\w\.]*)/i, // Rekonq
248
- /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\/([\w\.-]+)/i
249
- // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
243
+ /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\/([\w\.-]+)/i,
244
+ // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
245
+ /(rekonq|puffin|brave|whale|qqbrowserlite|qq)\/([\w\.]+)/i, // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ
246
+ /(weibo)__([\d\.]+)/i // Weibo
250
247
  ], [NAME, VERSION], [
251
-
252
- /(konqueror)\/([\w\.]+)/i // Konqueror
253
- ], [[NAME, 'Konqueror'], VERSION], [
254
-
255
- /(trident).+rv[:\s]([\w\.]+).+like\sgecko/i // IE11
256
- ], [[NAME, 'IE'], VERSION], [
257
-
258
- /(edge|edgios|edga|edg)\/((\d+)?[\w\.]+)/i // Microsoft Edge
259
- ], [[NAME, 'Edge'], VERSION], [
260
-
261
- /(yabrowser)\/([\w\.]+)/i // Yandex
262
- ], [[NAME, 'Yandex'], VERSION], [
263
-
264
- /(puffin)\/([\w\.]+)/i // Puffin
265
- ], [[NAME, 'Puffin'], VERSION], [
266
-
267
- /(focus)\/([\w\.]+)/i // Firefox Focus
268
- ], [[NAME, 'Firefox Focus'], VERSION], [
269
-
270
- /(opt)\/([\w\.]+)/i // Opera Touch
271
- ], [[NAME, 'Opera Touch'], VERSION], [
272
-
273
- /((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i // UCBrowser
274
- ], [[NAME, 'UCBrowser'], VERSION], [
275
-
248
+ /(?:[\s\/]uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i // UCBrowser
249
+ ], [VERSION, [NAME, 'UCBrowser']], [
250
+ /(?:windowswechat)?\sqbcore\/([\w\.]+)\b.*(?:windowswechat)?/i // WeChat Desktop for Windows Built-in Browser
251
+ ], [VERSION, [NAME, 'WeChat(Win) Desktop']], [
252
+ /micromessenger\/([\w\.]+)/i // WeChat
253
+ ], [VERSION, [NAME, 'WeChat']], [
254
+ /konqueror\/([\w\.]+)/i // Konqueror
255
+ ], [VERSION, [NAME, 'Konqueror']], [
256
+ /trident.+rv[:\s]([\w\.]{1,9})\b.+like\sgecko/i // IE11
257
+ ], [VERSION, [NAME, 'IE']], [
258
+ /yabrowser\/([\w\.]+)/i // Yandex
259
+ ], [VERSION, [NAME, 'Yandex']], [
260
+ /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
261
+ ], [[NAME, /(.+)/, '$1 Secure Browser'], VERSION], [
262
+ /focus\/([\w\.]+)/i // Firefox Focus
263
+ ], [VERSION, [NAME, 'Firefox Focus']], [
264
+ /opt\/([\w\.]+)/i // Opera Touch
265
+ ], [VERSION, [NAME, 'Opera Touch']], [
266
+ /coc_coc_browser\/([\w\.]+)/i // Coc Coc Browser
267
+ ], [VERSION, [NAME, 'Coc Coc']], [
268
+ /dolfin\/([\w\.]+)/i // Dolphin
269
+ ], [VERSION, [NAME, 'Dolphin']], [
270
+ /coast\/([\w\.]+)/i // Opera Coast
271
+ ], [VERSION, [NAME, 'Opera Coast']],
272
+ [/xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
273
+ ], [VERSION, [NAME, 'MIUI Browser']], [
274
+ /fxios\/([\w\.-]+)/i // Firefox for iOS
275
+ ], [VERSION, [NAME, 'Firefox']], [
276
+ /(qihu|qhbrowser|qihoobrowser|360browser)/i // 360
277
+ ], [[NAME, '360 Browser']], [
278
+ /(oculus|samsung|sailfish)browser\/([\w\.]+)/i
279
+ ], [[NAME, /(.+)/, '$1 Browser'], VERSION], [ // Oculus/Samsung/Sailfish Browser
276
280
  /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
277
281
  ], [[NAME, /_/g, ' '], VERSION], [
278
-
279
- /(windowswechat qbcore)\/([\w\.]+)/i // WeChat Desktop for Windows Built-in Browser
280
- ], [[NAME, 'WeChat(Win) Desktop'], VERSION], [
281
-
282
- /(micromessenger)\/([\w\.]+)/i // WeChat
283
- ], [[NAME, 'WeChat'], VERSION], [
284
-
285
- /(brave)\/([\w\.]+)/i // Brave browser
286
- ], [[NAME, 'Brave'], VERSION], [
287
-
288
- /(qqbrowserlite)\/([\w\.]+)/i // QQBrowserLite
289
- ], [NAME, VERSION], [
290
-
291
- /(QQ)\/([\d\.]+)/i // QQ, aka ShouQ
292
- ], [NAME, VERSION], [
293
-
294
- /m?(qqbrowser)[\/\s]?([\w\.]+)/i // QQBrowser
295
- ], [NAME, VERSION], [
296
-
297
- /(BIDUBrowser)[\/\s]?([\w\.]+)/i // Baidu Browser
282
+ /\s(electron)\/([\w\.]+)\ssafari/i, // Electron-based App
283
+ /(tesla)(?:\sqtcarbrowser|\/(20[12]\d\.[\w\.-]+))/i, // Tesla
284
+ /m?(qqbrowser|baiduboxapp|2345Explorer)[\/\s]?([\w\.]+)/i // QQBrowser/Baidu App/2345 Browser
298
285
  ], [NAME, VERSION], [
299
-
300
- /(2345Explorer)[\/\s]?([\w\.]+)/i // 2345 Browser
301
- ], [NAME, VERSION], [
302
-
303
- /(MetaSr)[\/\s]?([\w\.]+)/i // SouGouBrowser
304
- ], [NAME], [
305
-
306
- /(LBBROWSER)/i // LieBao Browser
286
+ /(MetaSr)[\/\s]?([\w\.]+)/i, // SouGouBrowser
287
+ /(LBBROWSER)/i // LieBao Browser
307
288
  ], [NAME], [
308
289
 
309
- /xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
310
- ], [VERSION, [NAME, 'MIUI Browser']], [
311
-
312
- /;fbav\/([\w\.]+);/i // Facebook App for iOS & Android
290
+ // WebView
291
+ /;fbav\/([\w\.]+);/i // Facebook App for iOS & Android with version
313
292
  ], [VERSION, [NAME, 'Facebook']], [
314
-
293
+ /FBAN\/FBIOS|FB_IAB\/FB4A/i // Facebook App for iOS & Android without version
294
+ ], [[NAME, 'Facebook']], [
315
295
  /safari\s(line)\/([\w\.]+)/i, // Line App for iOS
316
- /android.+(line)\/([\w\.]+)\/iab/i // Line App for Android
296
+ /\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
297
+ /(chromium|instagram)[\/\s]([\w\.-]+)/i // Chromium/Instagram
317
298
  ], [NAME, VERSION], [
299
+ /\bgsa\/([\w\.]+)\s.*safari\//i // Google Search Appliance on iOS
300
+ ], [VERSION, [NAME, 'GSA']], [
318
301
 
319
302
  /headlesschrome(?:\/([\w\.]+)|\s)/i // Chrome Headless
320
303
  ], [VERSION, [NAME, 'Chrome Headless']], [
321
304
 
322
305
  /\swv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
323
- ], [[NAME, /(.+)/, '$1 WebView'], VERSION], [
306
+ ], [[NAME, 'Chrome WebView'], VERSION], [
324
307
 
325
- /((?:oculus|samsung)browser)\/([\w\.]+)/i
326
- ], [[NAME, /(.+(?:g|us))(.+)/, '$1 $2'], VERSION], [ // Oculus / Samsung Browser
327
-
328
- /android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser
308
+ /droid.+\sversion\/([\w\.]+)\b.+(?:mobile\ssafari|safari)/i // Android Browser
329
309
  ], [VERSION, [NAME, 'Android Browser']], [
330
310
 
331
- /(sailfishbrowser)\/([\w\.]+)/i // Sailfish Browser
332
- ], [[NAME, 'Sailfish Browser'], VERSION], [
333
-
334
- /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i
335
- // Chrome/OmniWeb/Arora/Tizen/Nokia
311
+ /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
336
312
  ], [NAME, VERSION], [
337
313
 
338
- /(dolfin)\/([\w\.]+)/i // Dolphin
339
- ], [[NAME, 'Dolphin'], VERSION], [
340
-
341
- /((?:android.+)crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
342
- ], [[NAME, 'Chrome'], VERSION], [
343
-
344
- /(coast)\/([\w\.]+)/i // Opera Coast
345
- ], [[NAME, 'Opera Coast'], VERSION], [
346
-
347
- /fxios\/([\w\.-]+)/i // Firefox for iOS
348
- ], [VERSION, [NAME, 'Firefox']], [
349
-
350
- /version\/([\w\.]+).+?mobile\/\w+\s(safari)/i // Mobile Safari
314
+ /version\/([\w\.]+)\s.*mobile\/\w+\s(safari)/i // Mobile Safari
351
315
  ], [VERSION, [NAME, 'Mobile Safari']], [
352
-
353
- /version\/([\w\.]+).+?(mobile\s?safari|safari)/i // Safari & Safari Mobile
316
+ /version\/([\w\.]+)\s.*(mobile\s?safari|safari)/i // Safari & Safari Mobile
354
317
  ], [VERSION, NAME], [
355
-
356
- /webkit.+?(gsa)\/([\w\.]+).+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Google Search Appliance on iOS
357
- ], [[NAME, 'GSA'], VERSION], [
358
-
359
318
  /webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
360
- ], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [
319
+ ], [NAME, [VERSION, mapper.str, maps.browser.oldSafari.version]], [
361
320
 
362
321
  /(webkit|khtml)\/([\w\.]+)/i
363
322
  ], [NAME, VERSION], [
@@ -365,13 +324,16 @@
365
324
  // Gecko based
366
325
  /(navigator|netscape)\/([\w\.-]+)/i // Netscape
367
326
  ], [[NAME, 'Netscape'], VERSION], [
327
+ /ile\svr;\srv:([\w\.]+)\).+firefox/i // Firefox Reality
328
+ ], [VERSION, [NAME, 'Firefox Reality']], [
329
+ /ekiohf.+(flow)\/([\w\.]+)/i, // Flow
368
330
  /(swiftfox)/i, // Swiftfox
369
331
  /(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,
370
332
  // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
371
333
  /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([\w\.-]+)$/i,
372
-
373
334
  // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
374
- /(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i, // Mozilla
335
+ /(firefox)\/([\w\.]+)\s[\w\s\-]+\/[\w\.]+$/i, // Other Firefox-based
336
+ /(mozilla)\/([\w\.]+)\s.+rv\:.+gecko\/\d+/i, // Mozilla
375
337
 
376
338
  // Other
377
339
  /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i,
@@ -385,15 +347,21 @@
385
347
 
386
348
  cpu : [[
387
349
 
388
- /(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i // AMD64
350
+ /(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i // AMD64 (x64)
389
351
  ], [[ARCHITECTURE, 'amd64']], [
390
352
 
391
353
  /(ia32(?=;))/i // IA32 (quicktime)
392
354
  ], [[ARCHITECTURE, util.lowerize]], [
393
355
 
394
- /((?:i[346]|x)86)[;\)]/i // IA32
356
+ /((?:i[346]|x)86)[;\)]/i // IA32 (x86)
395
357
  ], [[ARCHITECTURE, 'ia32']], [
396
358
 
359
+ /\b(aarch64|armv?8e?l?)\b/i // ARM64
360
+ ], [[ARCHITECTURE, 'arm64']], [
361
+
362
+ /\b(arm(?:v[67])?ht?n?[fl]p?)\b/i // ARMHF
363
+ ], [[ARCHITECTURE, 'armhf']], [
364
+
397
365
  // PocketPC mistakenly identified as PowerPC
398
366
  /windows\s(ce|mobile);\sppc;/i
399
367
  ], [[ARCHITECTURE, 'arm']], [
@@ -404,264 +372,301 @@
404
372
  /(sun4\w)[;\)]/i // SPARC
405
373
  ], [[ARCHITECTURE, 'sparc']], [
406
374
 
407
- /((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+[;l]))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i
375
+ /((?:avr32|ia64(?=;))|68k(?=\))|\barm(?:64|(?=v(?:[1-7]|[5-7]1)l?|;|eabi))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i
408
376
  // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
409
377
  ], [[ARCHITECTURE, util.lowerize]]
410
378
  ],
411
379
 
412
380
  device : [[
413
381
 
414
- /\((ipad|playbook);[\w\s\),;-]+(rim|apple)/i // iPad/PlayBook
415
- ], [MODEL, VENDOR, [TYPE, TABLET]], [
416
-
417
- /applecoremedia\/[\w\.]+ \((ipad)/ // iPad
418
- ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [
419
-
420
- /(apple\s{0,1}tv)/i // Apple TV
421
- ], [[MODEL, 'Apple TV'], [VENDOR, 'Apple']], [
422
-
423
- /(archos)\s(gamepad2?)/i, // Archos
424
- /(hp).+(touchpad)/i, // HP TouchPad
425
- /(hp).+(tablet)/i, // HP Tablet
426
- /(kindle)\/([\w\.]+)/i, // Kindle
427
- /\s(nook)[\w\s]+build\/(\w+)/i, // Nook
428
- /(dell)\s(strea[kpr\s\d]*[\dko])/i // Dell Streak
429
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
430
-
431
- /(kf[A-z]+)\sbuild\/.+silk\//i // Kindle Fire HD
432
- ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
433
- /(sd|kf)[0349hijorstuw]+\sbuild\/.+silk\//i // Fire Phone
434
- ], [[MODEL, mapper.str, maps.device.amazon.model], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
435
- /android.+aft([bms])\sbuild/i // Fire TV
436
- ], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [
437
-
438
- /\((ip[honed|\s\w*]+);.+(apple)/i // iPod/iPhone
439
- ], [MODEL, VENDOR, [TYPE, MOBILE]], [
440
- /\((ip[honed|\s\w*]+);/i // iPod/iPhone
382
+ //////////////////////////
383
+ // MOBILES & TABLETS
384
+ // Ordered by popularity
385
+ /////////////////////////
386
+
387
+ // Samsung
388
+ /\b(sch-i[89]0\d|shw-m380s|sm-[pt]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus\s10)/i
389
+ ], [MODEL, [VENDOR, 'Samsung'], [TYPE, TABLET]], [
390
+ /\b((?:s[cgp]h|gt|sm)-\w+|galaxy\snexus)/i,
391
+ /\ssamsung[\s-]([\w-]+)/i,
392
+ /sec-(sgh\w+)/i
393
+ ], [MODEL, [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
394
+
395
+ // Apple
396
+ /\((ip(?:hone|od)[\s\w]*);/i // iPod/iPhone
441
397
  ], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [
398
+ /\((ipad);[\w\s\),;-]+apple/i, // iPad
399
+ /applecoremedia\/[\w\.]+\s\((ipad)/i,
400
+ /\b(ipad)\d\d?,\d\d?[;\]].+ios/i
401
+ ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [
442
402
 
443
- /(blackberry)[\s-]?(\w+)/i, // BlackBerry
444
- /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i,
445
- // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
446
- /(hp)\s([\w\s]+\w)/i, // HP iPAQ
447
- /(asus)-?(\w+)/i // Asus
448
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
449
- /\(bb10;\s(\w+)/i // BlackBerry 10
450
- ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
451
- // Asus Tablets
452
- /android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone|p00c)/i
453
- ], [MODEL, [VENDOR, 'Asus'], [TYPE, TABLET]], [
454
-
455
- /(sony)\s(tablet\s[ps])\sbuild\//i, // Sony
456
- /(sony)?(?:sgp.+)\sbuild\//i
457
- ], [[VENDOR, 'Sony'], [MODEL, 'Xperia Tablet'], [TYPE, TABLET]], [
458
- /android.+\s([c-g]\d{4}|so[-l]\w+)(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i
459
- ], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
460
-
461
- /\s(ouya)\s/i, // Ouya
462
- /(nintendo)\s([wids3u]+)/i // Nintendo
463
- ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
464
-
465
- /android.+;\s(shield)\sbuild/i // Nvidia
466
- ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
467
-
468
- /(playstation\s[34portablevi]+)/i // Playstation
469
- ], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [
470
-
471
- /(sprint\s(\w+))/i // Sprint Phones
472
- ], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [
473
-
474
- /(htc)[;_\s-]+([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC
475
- /(zte)-(\w*)/i, // ZTE
476
- /(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i
477
- // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
478
- ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
479
-
480
- /(nexus\s9)/i // HTC Nexus 9
481
- ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
482
-
403
+ // Huawei
404
+ /\b((?:agr|ags[23]|bah2?|sht?)-a?[lw]\d{2})/i,
405
+ ], [MODEL, [VENDOR, 'Huawei'], [TYPE, TABLET]], [
483
406
  /d\/huawei([\w\s-]+)[;\)]/i,
484
- /(nexus\s6p)/i // Huawei
407
+ /\b(nexus\s6p|vog-[at]?l\d\d|ane-[at]?l[x\d]\d|eml-a?l\d\da?|lya-[at]?l\d[\dc]|clt-a?l\d\di?|ele-l\d\d)/i,
408
+ /\b(\w{2,4}-[atu][ln][01259][019])[;\)\s]/i
485
409
  ], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
486
410
 
487
- /(microsoft);\s(lumia[\s\w]+)/i // Microsoft Lumia
488
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
489
-
490
- /[\s\(;](xbox(?:\sone)?)[\s\);]/i // Microsoft Xbox
491
- ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [
492
- /(kin\.[onetw]{3})/i // Microsoft Kin
493
- ], [[MODEL, /\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [
494
-
495
- // Motorola
496
- /\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)[\w\s]+build\//i,
497
- /mot[\s-]?(\w*)/i,
498
- /(XT\d{3,4}) build\//i,
499
- /(nexus\s6)/i
500
- ], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [
501
- /android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i
502
- ], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [
503
-
504
- /hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i // HbbTV devices
505
- ], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [
506
-
507
- /hbbtv.+maple;(\d+)/i
508
- ], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [
509
-
510
- /\(dtv[\);].+(aquos)/i // Sharp
511
- ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
411
+ // Xiaomi
412
+ /\b(poco[\s\w]+)(?:\sbuild|\))/i, // Xiaomi POCO
413
+ /\b;\s(\w+)\sbuild\/hm\1/i, // Xiaomi Hongmi 'numeric' models
414
+ /\b(hm[\s\-_]?note?[\s_]?(?:\d\w)?)\sbuild/i, // Xiaomi Hongmi
415
+ /\b(redmi[\s\-_]?(?:note|k)?[\w\s_]+)(?:\sbuild|\))/i, // Xiaomi Redmi
416
+ /\b(mi[\s\-_]?(?:a\d|one|one[\s_]plus|note lte)?[\s_]?(?:\d?\w?)[\s_]?(?:plus)?)\sbuild/i // Xiaomi Mi
417
+ ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
418
+ /\b(mi[\s\-_]?(?:pad)(?:[\w\s_]+))(?:\sbuild|\))/i // Mi Pad tablets
419
+ ],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
512
420
 
513
- /android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i,
514
- /((SM-T\w+))/i
515
- ], [[VENDOR, 'Samsung'], MODEL, [TYPE, TABLET]], [ // Samsung
516
- /smart-tv.+(samsung)/i
517
- ], [VENDOR, [TYPE, SMARTTV], MODEL], [
518
- /((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i,
519
- /(sam[sung]*)[\s-]*(\w+-?[\w-]*)/i,
520
- /sec-((sgh\w+))/i
521
- ], [[VENDOR, 'Samsung'], MODEL, [TYPE, MOBILE]], [
421
+ // OPPO
422
+ /;\s(\w+)\sbuild.+\soppo/i,
423
+ /\s(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007)\b/i
424
+ ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [
522
425
 
523
- /sie-(\w*)/i // Siemens
524
- ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
426
+ // Vivo
427
+ /\svivo\s(\w+)(?:\sbuild|\))/i,
428
+ /\s(v[12]\d{3}\w?[at])(?:\sbuild|;)/i
429
+ ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
525
430
 
526
- /(maemo|nokia).*(n900|lumia\s\d+)/i, // Nokia
527
- /(nokia)[\s_-]?([\w-]*)/i
528
- ], [[VENDOR, 'Nokia'], MODEL, [TYPE, MOBILE]], [
431
+ // Realme
432
+ /\s(rmx[12]\d{3})(?:\sbuild|;)/i
433
+ ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
529
434
 
530
- /android[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i // Acer
531
- ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
435
+ // Motorola
436
+ /\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)\b[\w\s]+build\//i,
437
+ /\smot(?:orola)?[\s-](\w*)/i,
438
+ /((?:moto[\s\w\(\)]+|xt\d{3,4}|nexus\s6)(?=\sbuild|\)))/i
439
+ ], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [
440
+ /\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i
441
+ ], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [
532
442
 
533
- /android.+([vl]k\-?\d{3})\s+build/i // LG Tablet
443
+ // LG
444
+ /((?=lg)?[vl]k\-?\d{3})\sbuild|\s3\.[\s\w;-]{10}lg?-([06cv9]{3,4})/i
534
445
  ], [MODEL, [VENDOR, 'LG'], [TYPE, TABLET]], [
535
- /android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i // LG Tablet
536
- ], [[VENDOR, 'LG'], MODEL, [TYPE, TABLET]], [
537
- /(lg) netcast\.tv/i // LG SmartTV
538
- ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
539
- /(nexus\s[45])/i, // LG
540
- /lg[e;\s\/-]+(\w*)/i,
541
- /android.+lg(\-?[\d\w]+)\s+build/i
446
+ /(lm-?f100[nv]?|nexus\s[45])/i,
447
+ /lg[e;\s\/-]+((?!browser|netcast)\w+)/i,
448
+ /\blg(\-?[\d\w]+)\sbuild/i
542
449
  ], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
543
450
 
544
- /(lenovo)\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+))/i // Lenovo tablets
545
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
546
- /android.+(ideatab[a-z0-9\-\s]+)/i // Lenovo
451
+ // Lenovo
452
+ /(ideatab[\w\-\s]+)/i,
453
+ /lenovo\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+)|yt[\d\w-]{6}|tb[\d\w-]{6})/i // Lenovo tablets
547
454
  ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
548
- /(lenovo)[_\s-]?([\w-]+)/i
549
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
550
455
 
551
- /linux;.+((jolla));/i // Jolla
552
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
456
+ // Nokia
457
+ /(?:maemo|nokia).*(n900|lumia\s\d+)/i,
458
+ /nokia[\s_-]?([\w\.-]*)/i
459
+ ], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [
553
460
 
554
- /((pebble))app\/[\d\.]+\s/i // Pebble
555
- ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
461
+ // Google
462
+ /droid.+;\s(pixel\sc)[\s)]/i // Google Pixel C
463
+ ], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
464
+ /droid.+;\s(pixel[\s\daxl]{0,6})(?:\sbuild|\))/i // Google Pixel
465
+ ], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
556
466
 
557
- /android.+;\s(oppo)\s?([\w\s]+)\sbuild/i // OPPO
558
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
467
+ // Sony
468
+ /droid.+\s([c-g]\d{4}|so[-l]\w+|xq-a\w[4-7][12])(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i
469
+ ], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
470
+ /sony\stablet\s[ps]\sbuild\//i,
471
+ /(?:sony)?sgp\w+(?:\sbuild\/|\))/i
472
+ ], [[MODEL, 'Xperia Tablet'], [VENDOR, 'Sony'], [TYPE, TABLET]], [
473
+
474
+ // OnePlus
475
+ /\s(kb2005|in20[12]5|be20[12][59])\b/i,
476
+ /\ba000(1)\sbuild/i, // OnePlus
477
+ /\boneplus\s(a\d{4})[\s)]/i
478
+ ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
559
479
 
560
- /crkey/i // Google Chromecast
561
- ], [[MODEL, 'Chromecast'], [VENDOR, 'Google']], [
480
+ // Amazon
481
+ /(alexa)webm/i,
482
+ /(kf[a-z]{2}wi)(\sbuild\/|\))/i, // Kindle Fire without Silk
483
+ /(kf[a-z]+)(\sbuild\/|\)).+silk\//i // Kindle Fire HD
484
+ ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
485
+ /(sd|kf)[0349hijorstuw]+(\sbuild\/|\)).+silk\//i // Fire Phone
486
+ ], [[MODEL, 'Fire Phone'], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
562
487
 
563
- /android.+;\s(glass)\s\d/i // Google Glass
564
- ], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
488
+ // BlackBerry
489
+ /\((playbook);[\w\s\),;-]+(rim)/i // BlackBerry PlayBook
490
+ ], [MODEL, VENDOR, [TYPE, TABLET]], [
491
+ /((?:bb[a-f]|st[hv])100-\d)/i,
492
+ /\(bb10;\s(\w+)/i // BlackBerry 10
493
+ ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
565
494
 
566
- /android.+;\s(pixel c)[\s)]/i // Google Pixel C
567
- ], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
495
+ // Asus
496
+ /(?:\b|asus_)(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus\s7|padfone|p00[cj])/i
497
+ ], [MODEL, [VENDOR, 'ASUS'], [TYPE, TABLET]], [
498
+ /\s(z[es]6[027][01][km][ls]|zenfone\s\d\w?)\b/i
499
+ ], [MODEL, [VENDOR, 'ASUS'], [TYPE, MOBILE]], [
568
500
 
569
- /android.+;\s(pixel( [23])?( xl)?)[\s)]/i // Google Pixel
570
- ], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
501
+ // HTC
502
+ /(nexus\s9)/i // HTC Nexus 9
503
+ ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
504
+ /(htc)[;_\s-]{1,2}([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC
571
505
 
572
- /android.+;\s(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
573
- /android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Hongmi
574
- /android.+(mi[\s\-_]*(?:a\d|one|one[\s_]plus|note lte)?[\s_]*(?:\d?\w?)[\s_]*(?:plus)?)\s+build/i,
575
- // Xiaomi Mi
576
- /android.+(redmi[\s\-_]*(?:note)?(?:[\s_]*[\w\s]+))\s+build/i // Redmi Phones
577
- ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
578
- /android.+(mi[\s\-_]*(?:pad)(?:[\s_]*[\w\s]+))\s+build/i // Mi Pad tablets
579
- ],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
580
- /android.+;\s(m[1-5]\snote)\sbuild/i // Meizu
506
+ // ZTE
507
+ /(zte)-(\w*)/i,
508
+ /(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
509
+ ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
510
+
511
+ // Acer
512
+ /droid[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i
513
+ ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
514
+
515
+ // Meizu
516
+ /droid.+;\s(m[1-5]\snote)\sbuild/i,
517
+ /\bmz-([\w-]{2,})/i
581
518
  ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
582
- /(mz)-([\w-]{2,})/i
583
- ], [[VENDOR, 'Meizu'], MODEL, [TYPE, MOBILE]], [
584
519
 
585
- /android.+a000(1)\s+build/i, // OnePlus
586
- /android.+oneplus\s(a\d{4})\s+build/i
587
- ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
520
+ // MIXED
521
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i,
522
+ // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
523
+ /(hp)\s([\w\s]+\w)/i, // HP iPAQ
524
+ /(asus)-?(\w+)/i, // Asus
525
+ /(microsoft);\s(lumia[\s\w]+)/i, // Microsoft Lumia
526
+ /(lenovo)[_\s-]?([\w-]+)/i, // Lenovo
527
+ /linux;.+(jolla);/i, // Jolla
528
+ /droid.+;\s(oppo)\s?([\w\s]+)\sbuild/i // OPPO
529
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
588
530
 
589
- /android.+[;\/]\s*(RCT[\d\w]+)\s+build/i // RCA Tablets
590
- ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
531
+ /(archos)\s(gamepad2?)/i, // Archos
532
+ /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad
533
+ /(kindle)\/([\w\.]+)/i, // Kindle
534
+ /\s(nook)[\w\s]+build\/(\w+)/i, // Nook
535
+ /(dell)\s(strea[kpr\s\d]*[\dko])/i, // Dell Streak
536
+ /[;\/]\s?(le[\s\-]+pan)[\s\-]+(\w{1,9})\sbuild/i, // Le Pan Tablets
537
+ /[;\/]\s?(trinity)[\-\s]*(t\d{3})\sbuild/i, // Trinity Tablets
538
+ /\b(gigaset)[\s\-]+(q\w{1,9})\sbuild/i, // Gigaset Tablets
539
+ /\b(vodafone)\s([\w\s]+)(?:\)|\sbuild)/i // Vodafone
540
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
591
541
 
592
- /android.+[;\/\s]+(Venue[\d\s]{2,7})\s+build/i // Dell Venue Tablets
542
+ /\s(surface\sduo)\s/i // Surface Duo
543
+ ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, TABLET]], [
544
+ /droid\s[\d\.]+;\s(fp\du?)\sbuild/i
545
+ ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [
546
+ /\s(u304aa)\sbuild/i // AT&T
547
+ ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [
548
+ /sie-(\w*)/i // Siemens
549
+ ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
550
+ /[;\/]\s?(rct\w+)\sbuild/i // RCA Tablets
551
+ ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
552
+ /[;\/\s](venue[\d\s]{2,7})\sbuild/i // Dell Venue Tablets
593
553
  ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
594
-
595
- /android.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i // Verizon Tablet
554
+ /[;\/]\s?(q(?:mv|ta)\w+)\sbuild/i // Verizon Tablet
596
555
  ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
597
-
598
- /android.+[;\/]\s+(Barnes[&\s]+Noble\s+|BN[RT])(V?.*)\s+build/i // Barnes & Noble Tablet
599
- ], [[VENDOR, 'Barnes & Noble'], MODEL, [TYPE, TABLET]], [
600
-
601
- /android.+[;\/]\s+(TM\d{3}.*\b)\s+build/i // Barnes & Noble Tablet
556
+ /[;\/]\s(?:barnes[&\s]+noble\s|bn[rt])([\w\s\+]*)\sbuild/i // Barnes & Noble Tablet
557
+ ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [
558
+ /[;\/]\s(tm\d{3}\w+)\sbuild/i
602
559
  ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
603
-
604
- /android.+;\s(k88)\sbuild/i // ZTE K Series Tablet
560
+ /;\s(k88)\sbuild/i // ZTE K Series Tablet
605
561
  ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [
606
-
607
- /android.+[;\/]\s*(gen\d{3})\s+build.*49h/i // Swiss GEN Mobile
562
+ /;\s(nx\d{3}j)\sbuild/i // ZTE Nubia
563
+ ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
564
+ /[;\/]\s?(gen\d{3})\sbuild.*49h/i // Swiss GEN Mobile
608
565
  ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
609
-
610
- /android.+[;\/]\s*(zur\d{3})\s+build/i // Swiss ZUR Tablet
566
+ /[;\/]\s?(zur\d{3})\sbuild/i // Swiss ZUR Tablet
611
567
  ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
612
-
613
- /android.+[;\/]\s*((Zeki)?TB.*\b)\s+build/i // Zeki Tablets
568
+ /[;\/]\s?((zeki)?tb.*\b)\sbuild/i // Zeki Tablets
614
569
  ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
615
-
616
- /(android).+[;\/]\s+([YR]\d{2})\s+build/i,
617
- /android.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(\w{5})\sbuild/i // Dragon Touch Tablet
570
+ /[;\/]\s([yr]\d{2})\sbuild/i,
571
+ /[;\/]\s(dragon[\-\s]+touch\s|dt)(\w{5})\sbuild/i // Dragon Touch Tablet
618
572
  ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [
619
-
620
- /android.+[;\/]\s*(NS-?\w{0,9})\sbuild/i // Insignia Tablets
573
+ /[;\/]\s?(ns-?\w{0,9})\sbuild/i // Insignia Tablets
621
574
  ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
622
-
623
- /android.+[;\/]\s*((NX|Next)-?\w{0,9})\s+build/i // NextBook Tablets
575
+ /[;\/]\s?((nxa|Next)-?\w{0,9})\sbuild/i // NextBook Tablets
624
576
  ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
625
-
626
- /android.+[;\/]\s*(Xtreme\_)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i
577
+ /[;\/]\s?(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05]))\sbuild/i
627
578
  ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [ // Voice Xtreme Phones
628
-
629
- /android.+[;\/]\s*(LVTEL\-)?(V1[12])\s+build/i // LvTel Phones
579
+ /[;\/]\s?(lvtel\-)?(v1[12])\sbuild/i // LvTel Phones
630
580
  ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
631
-
632
- /android.+;\s(PH-1)\s/i
581
+ /;\s(ph-1)\s/i
633
582
  ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [ // Essential PH-1
634
-
635
- /android.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i // Envizen Tablets
583
+ /[;\/]\s?(v(100md|700na|7011|917g).*\b)\sbuild/i // Envizen Tablets
636
584
  ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
585
+ /[;\/]\s?(trio[\s\w\-\.]+)\sbuild/i // MachSpeed Tablets
586
+ ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
587
+ /[;\/]\s?tu_(1491)\sbuild/i // Rotor Tablets
588
+ ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
589
+ /(shield[\w\s]+)\sbuild/i // Nvidia Shield Tablets
590
+ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [
591
+ /(sprint)\s(\w+)/i // Sprint Phones
592
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
593
+ /(kin\.[onetw]{3})/i // Microsoft Kin
594
+ ], [[MODEL, /\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [
595
+ /droid\s[\d\.]+;\s(cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra
596
+ ], [MODEL, [VENDOR, 'Zebra'], [TYPE, TABLET]], [
597
+ /droid\s[\d\.]+;\s(ec30|ps20|tc[2-8]\d[kx])\)/i
598
+ ], [MODEL, [VENDOR, 'Zebra'], [TYPE, MOBILE]], [
637
599
 
638
- /android.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(\w{1,9})\s+build/i // Le Pan Tablets
639
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
600
+ ///////////////////
601
+ // CONSOLES
602
+ ///////////////////
640
603
 
641
- /android.+[;\/]\s*(Trio[\s\-]*.*)\s+build/i // MachSpeed Tablets
642
- ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
604
+ /\s(ouya)\s/i, // Ouya
605
+ /(nintendo)\s([wids3utch]+)/i // Nintendo
606
+ ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
607
+ /droid.+;\s(shield)\sbuild/i // Nvidia
608
+ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
609
+ /(playstation\s[345portablevi]+)/i // Playstation
610
+ ], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [
611
+ /[\s\(;](xbox(?:\sone)?(?!;\sxbox))[\s\);]/i // Microsoft Xbox
612
+ ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [
643
613
 
644
- /android.+[;\/]\s*(Trinity)[\-\s]*(T\d{3})\s+build/i // Trinity Tablets
645
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
614
+ ///////////////////
615
+ // SMARTTVS
616
+ ///////////////////
646
617
 
647
- /android.+[;\/]\s*TU_(1491)\s+build/i // Rotor Tablets
648
- ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
618
+ /smart-tv.+(samsung)/i // Samsung
619
+ ], [VENDOR, [TYPE, SMARTTV]], [
620
+ /hbbtv.+maple;(\d+)/i
621
+ ], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [
622
+ /(?:linux;\snetcast.+smarttv|lg\snetcast\.tv-201\d)/i, // LG SmartTV
623
+ ], [[VENDOR, 'LG'], [TYPE, SMARTTV]], [
624
+ /(apple)\s?tv/i // Apple TV
625
+ ], [VENDOR, [MODEL, 'Apple TV'], [TYPE, SMARTTV]], [
626
+ /crkey/i // Google Chromecast
627
+ ], [[MODEL, 'Chromecast'], [VENDOR, 'Google'], [TYPE, SMARTTV]], [
628
+ /droid.+aft([\w])(\sbuild\/|\))/i // Fire TV
629
+ ], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [
630
+ /\(dtv[\);].+(aquos)/i // Sharp
631
+ ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
632
+ /hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i // HbbTV devices
633
+ ], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [
634
+ /[\s\/\(](android\s|smart[-\s]?|opera\s)tv[;\)\s]/i // SmartTV from Unidentified Vendors
635
+ ], [[TYPE, SMARTTV]], [
649
636
 
650
- /android.+(KS(.+))\s+build/i // Amazon Kindle Tablets
651
- ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
637
+ ///////////////////
638
+ // WEARABLES
639
+ ///////////////////
652
640
 
653
- /android.+(Gigaset)[\s\-]+(Q\w{1,9})\s+build/i // Gigaset Tablets
654
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
641
+ /((pebble))app\/[\d\.]+\s/i // Pebble
642
+ ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
643
+ /droid.+;\s(glass)\s\d/i // Google Glass
644
+ ], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
645
+ /droid\s[\d\.]+;\s(wt63?0{2,3})\)/i
646
+ ], [MODEL, [VENDOR, 'Zebra'], [TYPE, WEARABLE]], [
655
647
 
656
- /\s(tablet|tab)[;\/]/i, // Unidentifiable Tablet
657
- /\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
658
- ], [[TYPE, util.lowerize], VENDOR, MODEL], [
648
+ ///////////////////
649
+ // EMBEDDED
650
+ ///////////////////
659
651
 
660
- /[\s\/\(](smart-?tv)[;\)]/i // SmartTV
661
- ], [[TYPE, SMARTTV]], [
652
+ /(tesla)(?:\sqtcarbrowser|\/20[12]\d\.[\w\.-]+)/i // Tesla
653
+ ], [VENDOR, [TYPE, EMBEDDED]], [
654
+
655
+ ////////////////////
656
+ // MIXED (GENERIC)
657
+ ///////////////////
662
658
 
659
+ /droid .+?; ([^;]+?)(?: build|\) applewebkit).+? mobile safari/i // Android Phones from Unidentified Vendors
660
+ ], [MODEL, [TYPE, MOBILE]], [
661
+ /droid .+?;\s([^;]+?)(?: build|\) applewebkit).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors
662
+ ], [MODEL, [TYPE, TABLET]], [
663
+ /\s(tablet|tab)[;\/]/i, // Unidentifiable Tablet
664
+ /\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
665
+ ], [[TYPE, util.lowerize]], [
663
666
  /(android[\w\.\s\-]{0,9});.+build/i // Generic Android Device
664
- ], [MODEL, [VENDOR, 'Generic']]
667
+ ], [MODEL, [VENDOR, 'Generic']], [
668
+ /(phone)/i
669
+ ], [[TYPE, MOBILE]]
665
670
  ],
666
671
 
667
672
  engine : [[
@@ -669,87 +674,86 @@
669
674
  /windows.+\sedge\/([\w\.]+)/i // EdgeHTML
670
675
  ], [VERSION, [NAME, 'EdgeHTML']], [
671
676
 
672
- /webkit\/537\.36.+chrome\/(?!27)/i // Blink
673
- ], [[NAME, 'Blink']], [
677
+ /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
678
+ ], [VERSION, [NAME, 'Blink']], [
674
679
 
675
680
  /(presto)\/([\w\.]+)/i, // Presto
676
- /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,
677
- // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
681
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
682
+ /ekioh(flow)\/([\w\.]+)/i, // Flow
678
683
  /(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, // KHTML/Tasman/Links
679
684
  /(icab)[\/\s]([23]\.[\d\.]+)/i // iCab
680
685
  ], [NAME, VERSION], [
681
686
 
682
- /rv\:([\w\.]{1,9}).+(gecko)/i // Gecko
687
+ /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
683
688
  ], [VERSION, NAME]
684
689
  ],
685
690
 
686
691
  os : [[
687
692
 
688
- // Windows based
693
+ // Windows
689
694
  /microsoft\s(windows)\s(vista|xp)/i // Windows (iTunes)
690
695
  ], [NAME, VERSION], [
691
696
  /(windows)\snt\s6\.2;\s(arm)/i, // Windows RT
692
697
  /(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s\w]*)/i, // Windows Phone
693
- /(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i
698
+ /(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)(?!.+xbox)/i
694
699
  ], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [
695
700
  /(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i
696
701
  ], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [
697
702
 
698
- // Mobile/Embedded OS
699
- /\((bb)(10);/i // BlackBerry 10
700
- ], [[NAME, 'BlackBerry'], VERSION], [
701
- /(blackberry)\w*\/?([\w\.]*)/i, // Blackberry
702
- /(tizen)[\/\s]([\w\.]+)/i, // Tizen
703
- /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i
704
- // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS
705
- ], [NAME, VERSION], [
706
- /(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]*)/i // Symbian
707
- ], [[NAME, 'Symbian'], VERSION], [
703
+ // iOS/macOS
704
+ /ip[honead]{2,4}\b(?:.*os\s([\w]+)\slike\smac|;\sopera)/i, // iOS
705
+ /cfnetwork\/.+darwin/i
706
+ ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
707
+ /(mac\sos\sx)\s?([\w\s\.]*)/i,
708
+ /(macintosh|mac(?=_powerpc)\s)(?!.+haiku)/i // Mac OS
709
+ ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
710
+
711
+ // Mobile OSes // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS
712
+ /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i,
713
+ /(blackberry)\w*\/([\w\.]*)/i, // Blackberry
714
+ /(tizen|kaios)[\/\s]([\w\.]+)/i, // Tizen/KaiOS
708
715
  /\((series40);/i // Series 40
709
- ], [NAME], [
716
+ ], [NAME, VERSION], [
717
+ /\(bb(10);/i // BlackBerry 10
718
+ ], [VERSION, [NAME, 'BlackBerry']], [
719
+ /(?:symbian\s?os|symbos|s60(?=;)|series60)[\/\s-]?([\w\.]*)/i // Symbian
720
+ ], [VERSION, [NAME, 'Symbian']], [
710
721
  /mozilla.+\(mobile;.+gecko.+firefox/i // Firefox OS
711
- ], [[NAME, 'Firefox OS'], VERSION], [
722
+ ], [[NAME, 'Firefox OS']], [
723
+ /web0s;.+rt(tv)/i,
724
+ /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i // WebOS
725
+ ], [VERSION, [NAME, 'webOS']], [
726
+
727
+ // Google Chromecast
728
+ /crkey\/([\d\.]+)/i // Google Chromecast
729
+ ], [VERSION, [NAME, 'Chromecast']], [
730
+ /(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS
731
+ ], [[NAME, 'Chromium OS'], VERSION],[
712
732
 
713
733
  // Console
714
- /(nintendo|playstation)\s([wids34portablevu]+)/i, // Nintendo/Playstation
734
+ /(nintendo|playstation)\s([wids345portablevuch]+)/i, // Nintendo/Playstation
735
+ /(xbox);\s+xbox\s([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
715
736
 
716
737
  // GNU/Linux based
717
- /(mint)[\/\s\(]?(\w*)/i, // Mint
738
+ /(mint)[\/\s\(\)]?(\w*)/i, // Mint
718
739
  /(mageia|vectorlinux)[;\s]/i, // Mageia/VectorLinux
719
- /(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?(?!chrom)([\w\.-]*)/i,
740
+ /(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?=\slinux)|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus|raspbian)(?:\sgnu\/linux)?(?:\slinux)?[\/\s-]?(?!chrom|package)([\w\.-]*)/i,
720
741
  // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
721
742
  // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus
722
743
  /(hurd|linux)\s?([\w\.]*)/i, // Hurd/Linux
723
- /(gnu)\s?([\w\.]*)/i // GNU
724
- ], [NAME, VERSION], [
725
-
726
- /(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS
727
- ], [[NAME, 'Chromium OS'], VERSION],[
728
-
729
- // Solaris
730
- /(sunos)\s?([\w\.\d]*)/i // Solaris
731
- ], [[NAME, 'Solaris'], VERSION], [
744
+ /(gnu)\s?([\w\.]*)/i, // GNU
732
745
 
733
746
  // BSD based
734
- /\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]*)/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
735
- ], [NAME, VERSION],[
736
-
747
+ /\s([frentopc-]{0,4}bsd|dragonfly)\s?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
737
748
  /(haiku)\s(\w+)/i // Haiku
738
- ], [NAME, VERSION],[
739
-
740
- /cfnetwork\/.+darwin/i,
741
- /ip[honead]{2,4}(?:.*os\s([\w]+)\slike\smac|;\sopera)/i // iOS
742
- ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
743
-
744
- /(mac\sos\sx)\s?([\w\s\.]*)/i,
745
- /(macintosh|mac(?=_powerpc)\s)/i // Mac OS
746
- ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
749
+ ], [NAME, VERSION], [
747
750
 
748
751
  // Other
752
+ /(sunos)\s?([\w\.\d]*)/i // Solaris
753
+ ], [[NAME, 'Solaris'], VERSION], [
749
754
  /((?:open)?solaris)[\/\s-]?([\w\.]*)/i, // Solaris
750
755
  /(aix)\s((\d)(?=\.|\)|\s)[\w\.])*/i, // AIX
751
- /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms|fuchsia)/i,
752
- // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS/Fuchsia
756
+ /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms|fuchsia)/i, // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS/Fuchsia
753
757
  /(unix)\s?([\w\.]*)/i // UNIX
754
758
  ], [NAME, VERSION]
755
759
  ]
@@ -759,45 +763,45 @@
759
763
  /////////////////
760
764
  // Constructor
761
765
  ////////////////
762
- var UAParser = function (uastring, extensions) {
766
+ var UAParser = function (ua, extensions) {
763
767
 
764
- if (typeof uastring === 'object') {
765
- extensions = uastring;
766
- uastring = undefined;
768
+ if (typeof ua === 'object') {
769
+ extensions = ua;
770
+ ua = undefined;
767
771
  }
768
772
 
769
773
  if (!(this instanceof UAParser)) {
770
- return new UAParser(uastring, extensions).getResult();
774
+ return new UAParser(ua, extensions).getResult();
771
775
  }
772
776
 
773
- var ua = uastring || ((window && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
774
- var rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
777
+ var _ua = ua || ((typeof window !== 'undefined' && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
778
+ var _rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
775
779
 
776
780
  this.getBrowser = function () {
777
- var browser = { name: undefined, version: undefined };
778
- mapper.rgx.call(browser, ua, rgxmap.browser);
779
- browser.major = util.major(browser.version); // deprecated
780
- return browser;
781
+ var _browser = { name: undefined, version: undefined };
782
+ mapper.rgx.call(_browser, _ua, _rgxmap.browser);
783
+ _browser.major = util.major(_browser.version); // deprecated
784
+ return _browser;
781
785
  };
782
786
  this.getCPU = function () {
783
- var cpu = { architecture: undefined };
784
- mapper.rgx.call(cpu, ua, rgxmap.cpu);
785
- return cpu;
787
+ var _cpu = { architecture: undefined };
788
+ mapper.rgx.call(_cpu, _ua, _rgxmap.cpu);
789
+ return _cpu;
786
790
  };
787
791
  this.getDevice = function () {
788
- var device = { vendor: undefined, model: undefined, type: undefined };
789
- mapper.rgx.call(device, ua, rgxmap.device);
790
- return device;
792
+ var _device = { vendor: undefined, model: undefined, type: undefined };
793
+ mapper.rgx.call(_device, _ua, _rgxmap.device);
794
+ return _device;
791
795
  };
792
796
  this.getEngine = function () {
793
- var engine = { name: undefined, version: undefined };
794
- mapper.rgx.call(engine, ua, rgxmap.engine);
795
- return engine;
797
+ var _engine = { name: undefined, version: undefined };
798
+ mapper.rgx.call(_engine, _ua, _rgxmap.engine);
799
+ return _engine;
796
800
  };
797
801
  this.getOS = function () {
798
- var os = { name: undefined, version: undefined };
799
- mapper.rgx.call(os, ua, rgxmap.os);
800
- return os;
802
+ var _os = { name: undefined, version: undefined };
803
+ mapper.rgx.call(_os, _ua, _rgxmap.os);
804
+ return _os;
801
805
  };
802
806
  this.getResult = function () {
803
807
  return {
@@ -810,12 +814,13 @@
810
814
  };
811
815
  };
812
816
  this.getUA = function () {
813
- return ua;
817
+ return _ua;
814
818
  };
815
- this.setUA = function (uastring) {
816
- ua = uastring;
819
+ this.setUA = function (ua) {
820
+ _ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? util.trim(ua, UA_MAX_LENGTH) : ua;
817
821
  return this;
818
822
  };
823
+ this.setUA(_ua);
819
824
  return this;
820
825
  };
821
826
 
@@ -866,7 +871,7 @@
866
871
  define(function () {
867
872
  return UAParser;
868
873
  });
869
- } else if (window) {
874
+ } else if (typeof window !== 'undefined') {
870
875
  // browser env
871
876
  window.UAParser = UAParser;
872
877
  }
@@ -877,8 +882,8 @@
877
882
  // In AMD env the global scope should be kept clean, but jQuery is an exception.
878
883
  // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
879
884
  // and we should catch that.
880
- var $ = window && (window.jQuery || window.Zepto);
881
- if (typeof $ !== UNDEF_TYPE && !$.ua) {
885
+ var $ = typeof window !== 'undefined' && (window.jQuery || window.Zepto);
886
+ if ($ && !$.ua) {
882
887
  var parser = new UAParser();
883
888
  $.ua = parser.getResult();
884
889
  $.ua.get = function () {