aboutsummaryrefslogtreecommitdiff
path: root/node_modules/ua-parser-js
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2017-05-03 15:35:00 +0200
committerFlorian Dold <florian.dold@gmail.com>2017-05-03 15:35:00 +0200
commitde98e0b232509d5f40c135d540a70e415272ff85 (patch)
treea79222a5b58484ab3b80d18efcaaa7ccc4769b33 /node_modules/ua-parser-js
parente0c9d480a73fa629c1e4a47d3e721f1d2d345406 (diff)
downloadwallet-core-de98e0b232509d5f40c135d540a70e415272ff85.tar.xz
node_modules
Diffstat (limited to 'node_modules/ua-parser-js')
-rw-r--r--node_modules/ua-parser-js/.npmignore24
-rw-r--r--node_modules/ua-parser-js/.travis.yml13
-rw-r--r--node_modules/ua-parser-js/bower.json17
-rw-r--r--node_modules/ua-parser-js/dist/ua-parser.html1
-rw-r--r--node_modules/ua-parser-js/dist/ua-parser.min.js8
-rw-r--r--node_modules/ua-parser-js/dist/ua-parser.pack.js8
-rw-r--r--node_modules/ua-parser-js/package.js12
-rw-r--r--node_modules/ua-parser-js/package.json83
-rw-r--r--node_modules/ua-parser-js/readme.md297
-rw-r--r--node_modules/ua-parser-js/src/ua-parser.js915
-rw-r--r--node_modules/ua-parser-js/test/browser-test.json842
-rw-r--r--node_modules/ua-parser-js/test/cpu-test.json106
-rw-r--r--node_modules/ua-parser-js/test/device-test.json483
-rw-r--r--node_modules/ua-parser-js/test/engine-test.json74
-rw-r--r--node_modules/ua-parser-js/test/mediaplayer-test.json582
-rw-r--r--node_modules/ua-parser-js/test/os-test.json632
-rw-r--r--node_modules/ua-parser-js/test/test.js91
-rw-r--r--node_modules/ua-parser-js/ua-parser-js.jquery.json32
18 files changed, 4220 insertions, 0 deletions
diff --git a/node_modules/ua-parser-js/.npmignore b/node_modules/ua-parser-js/.npmignore
new file mode 100644
index 000000000..154d1f06e
--- /dev/null
+++ b/node_modules/ua-parser-js/.npmignore
@@ -0,0 +1,24 @@
+node_modules/
+npm-debug.log
+### vim ###
+.*.s[a-w][a-z]
+*.un~
+Session.vim
+.netrwhist
+*~
+.versions
+
+### OSX ###
+.DS_Store
+.AppleDouble
+.LSOverride
+Icon
+
+
+# Thumbnails
+._*
+
+# Files that might appear on external disk
+.Spotlight-V100
+.Trashes
+.idea
diff --git a/node_modules/ua-parser-js/.travis.yml b/node_modules/ua-parser-js/.travis.yml
new file mode 100644
index 000000000..4d23aa06a
--- /dev/null
+++ b/node_modules/ua-parser-js/.travis.yml
@@ -0,0 +1,13 @@
+language: node_js
+node_js:
+ - stable
+ - "0.10"
+
+notifications:
+ email: false
+
+cache:
+ directories:
+ - node_modules
+
+sudo: false
diff --git a/node_modules/ua-parser-js/bower.json b/node_modules/ua-parser-js/bower.json
new file mode 100644
index 000000000..c1f71ba19
--- /dev/null
+++ b/node_modules/ua-parser-js/bower.json
@@ -0,0 +1,17 @@
+{
+ "name": "ua-parser-js",
+ "version": "0.7.12",
+ "authors": [
+ "Faisal Salman <fyzlman@gmail.com>"
+ ],
+ "private": false,
+ "main": "src/ua-parser.js",
+ "ignore": [
+ "build",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests"
+ ],
+ "dependencies": {}
+}
diff --git a/node_modules/ua-parser-js/dist/ua-parser.html b/node_modules/ua-parser-js/dist/ua-parser.html
new file mode 100644
index 000000000..1e530bb17
--- /dev/null
+++ b/node_modules/ua-parser-js/dist/ua-parser.html
@@ -0,0 +1 @@
+<script src="./ua-parser.min.js"></script>
diff --git a/node_modules/ua-parser-js/dist/ua-parser.min.js b/node_modules/ua-parser-js/dist/ua-parser.min.js
new file mode 100644
index 000000000..e4d47a18f
--- /dev/null
+++ b/node_modules/ua-parser-js/dist/ua-parser.min.js
@@ -0,0 +1,8 @@
+/**
+ * UAParser.js v0.7.12
+ * Lightweight JavaScript-based User-Agent string parser
+ * https://github.com/faisalman/ua-parser-js
+ *
+ * Copyright © 2012-2016 Faisal Salman <fyzlman@gmail.com>
+ * Dual licensed under GPLv2 & MIT
+ */(function(e,t){"use strict";var n="0.7.12",r="",i="?",s="function",o="undefined",u="object",a="string",f="major",l="model",c="name",h="type",p="vendor",d="version",v="architecture",m="console",g="mobile",y="tablet",b="smarttv",w="wearable",E="embedded",S={extend:function(e,t){var n={};for(var r in e)t[r]&&t[r].length%2===0?n[r]=t[r].concat(e[r]):n[r]=e[r];return n},has:function(e,t){return typeof e=="string"?t.toLowerCase().indexOf(e.toLowerCase())!==-1:!1},lowerize:function(e){return e.toLowerCase()},major:function(e){return typeof e===a?e.replace(/[^\d\.]/g,"").split(".")[0]:t},trim:function(e){return e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}},x={rgx:function(){var e,n=0,r,i,a,f,l,c,h=arguments;while(n<h.length&&!l){var p=h[n],d=h[n+1];if(typeof e===o){e={};for(a in d)d.hasOwnProperty(a)&&(f=d[a],typeof f===u?e[f[0]]=t:e[f]=t)}r=i=0;while(r<p.length&&!l){l=p[r++].exec(this.getUA());if(!!l)for(a=0;a<d.length;a++)c=l[++i],f=d[a],typeof f===u&&f.length>0?f.length==2?typeof f[1]==s?e[f[0]]=f[1].call(this,c):e[f[0]]=f[1]:f.length==3?typeof f[1]===s&&(!f[1].exec||!f[1].test)?e[f[0]]=c?f[1].call(this,c,f[2]):t:e[f[0]]=c?c.replace(f[1],f[2]):t:f.length==4&&(e[f[0]]=c?f[3].call(this,c.replace(f[1],f[2])):t):e[f]=c?c:t}n+=2}return e},str:function(e,n){for(var r in n)if(typeof n[r]===u&&n[r].length>0){for(var s=0;s<n[r].length;s++)if(S.has(n[r][s],e))return r===i?t:r}else if(S.has(n[r],e))return r===i?t:r;return e}},T={browser:{oldsafari:{version:{"1.0":"/8",1.2:"/1",1.3:"/3","2.0":"/412","2.0.2":"/416","2.0.3":"/417","2.0.4":"/419","?":"/"}}},device:{amazon:{model:{"Fire Phone":["SD","KF"]}},sprint:{model:{"Evo Shift 4G":"7373KT"},vendor:{HTC:"APA",Sprint:"Sprint"}}},os:{windows:{version:{ME:"4.90","NT 3.11":"NT3.51","NT 4.0":"NT4.0",2e3:"NT 5.0",XP:["NT 5.1","NT 5.2"],Vista:"NT 6.0",7:"NT 6.1",8:"NT 6.2",8.1:"NT 6.3",10:["NT 6.4","NT 10.0"],RT:"ARM"}}}},N={browser:[[/(opera\smini)\/([\w\.-]+)/i,/(opera\s[mobiletab]+).+version\/([\w\.-]+)/i,/(opera).+version\/([\w\.]+)/i,/(opera)[\/\s]+([\w\.]+)/i],[c,d],[/(opios)[\/\s]+([\w\.]+)/i],[[c,"Opera Mini"],d],[/\s(opr)\/([\w\.]+)/i],[[c,"Opera"],d],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]+)*/i,/(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i,/(?:ms|\()(ie)\s([\w\.]+)/i,/(rekonq)\/([\w\.]+)*/i,/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs)\/([\w\.-]+)/i],[c,d],[/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i],[[c,"IE"],d],[/(edge)\/((\d+)?[\w\.]+)/i],[c,d],[/(yabrowser)\/([\w\.]+)/i],[[c,"Yandex"],d],[/(comodo_dragon)\/([\w\.]+)/i],[[c,/_/g," "],d],[/(micromessenger)\/([\w\.]+)/i],[[c,"WeChat"],d],[/xiaomi\/miuibrowser\/([\w\.]+)/i],[d,[c,"MIUI Browser"]],[/\swv\).+(chrome)\/([\w\.]+)/i],[[c,/(.+)/,"$1 WebView"],d],[/android.+samsungbrowser\/([\w\.]+)/i,/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i],[d,[c,"Android Browser"]],[/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i,/(qqbrowser)[\/\s]?([\w\.]+)/i],[c,d],[/(uc\s?browser)[\/\s]?([\w\.]+)/i,/ucweb.+(ucbrowser)[\/\s]?([\w\.]+)/i,/juc.+(ucweb)[\/\s]?([\w\.]+)/i],[[c,"UCBrowser"],d],[/(dolfin)\/([\w\.]+)/i],[[c,"Dolphin"],d],[/((?:android.+)crmo|crios)\/([\w\.]+)/i],[[c,"Chrome"],d],[/;fbav\/([\w\.]+);/i],[d,[c,"Facebook"]],[/fxios\/([\w\.-]+)/i],[d,[c,"Firefox"]],[/version\/([\w\.]+).+?mobile\/\w+\s(safari)/i],[d,[c,"Mobile Safari"]],[/version\/([\w\.]+).+?(mobile\s?safari|safari)/i],[d,c],[/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i],[c,[d,x.str,T.browser.oldsafari.version]],[/(konqueror)\/([\w\.]+)/i,/(webkit|khtml)\/([\w\.]+)/i],[c,d],[/(navigator|netscape)\/([\w\.-]+)/i],[[c,"Netscape"],d],[/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,/(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\/([\w\.-]+)/i,/(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i,/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i,/(links)\s\(([\w\.]+)/i,/(gobrowser)\/?([\w\.]+)*/i,/(ice\s?browser)\/v?([\w\._]+)/i,/(mosaic)[\/\s]([\w\.]+)/i],[c,d]],cpu:[[/(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i],[[v,"amd64"]],[/(ia32(?=;))/i],[[v,S.lowerize]],[/((?:i[346]|x)86)[;\)]/i],[[v,"ia32"]],[/windows\s(ce|mobile);\sppc;/i],[[v,"arm"]],[/((?:ppc|powerpc)(?:64)?)(?:\smac|;|\))/i],[[v,/ower/,"",S.lowerize]],[/(sun4\w)[;\)]/i],[[v,"sparc"]],[/((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+;))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i],[[v,S.lowerize]]],device:[[/\((ipad|playbook);[\w\s\);-]+(rim|apple)/i],[l,p,[h,y]],[/applecoremedia\/[\w\.]+ \((ipad)/],[l,[p,"Apple"],[h,y]],[/(apple\s{0,1}tv)/i],[[l,"Apple TV"],[p,"Apple"]],[/(archos)\s(gamepad2?)/i,/(hp).+(touchpad)/i,/(hp).+(tablet)/i,/(kindle)\/([\w\.]+)/i,/\s(nook)[\w\s]+build\/(\w+)/i,/(dell)\s(strea[kpr\s\d]*[\dko])/i],[p,l,[h,y]],[/(kf[A-z]+)\sbuild\/[\w\.]+.*silk\//i],[l,[p,"Amazon"],[h,y]],[/(sd|kf)[0349hijorstuw]+\sbuild\/[\w\.]+.*silk\//i],[[l,x.str,T.device.amazon.model],[p,"Amazon"],[h,g]],[/\((ip[honed|\s\w*]+);.+(apple)/i],[l,p,[h,g]],[/\((ip[honed|\s\w*]+);/i],[l,[p,"Apple"],[h,g]],[/(blackberry)[\s-]?(\w+)/i,/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|huawei|meizu|motorola|polytron)[\s_-]?([\w-]+)*/i,/(hp)\s([\w\s]+\w)/i,/(asus)-?(\w+)/i],[p,l,[h,g]],[/\(bb10;\s(\w+)/i],[l,[p,"BlackBerry"],[h,g]],[/android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone)/i],[l,[p,"Asus"],[h,y]],[/(sony)\s(tablet\s[ps])\sbuild\//i,/(sony)?(?:sgp.+)\sbuild\//i],[[p,"Sony"],[l,"Xperia Tablet"],[h,y]],[/(?:sony)?(?:(?:(?:c|d)\d{4})|(?:so[-l].+))\sbuild\//i],[[p,"Sony"],[l,"Xperia Phone"],[h,g]],[/\s(ouya)\s/i,/(nintendo)\s([wids3u]+)/i],[p,l,[h,m]],[/android.+;\s(shield)\sbuild/i],[l,[p,"Nvidia"],[h,m]],[/(playstation\s[34portablevi]+)/i],[l,[p,"Sony"],[h,m]],[/(sprint\s(\w+))/i],[[p,x.str,T.device.sprint.vendor],[l,x.str,T.device.sprint.model],[h,g]],[/(lenovo)\s?(S(?:5000|6000)+(?:[-][\w+]))/i],[p,l,[h,y]],[/(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i,/(zte)-(\w+)*/i,/(alcatel|geeksphone|huawei|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i],[p,[l,/_/g," "],[h,g]],[/(nexus\s9)/i],[l,[p,"HTC"],[h,y]],[/(nexus\s6p)/i],[l,[p,"Huawei"],[h,g]],[/(microsoft);\s(lumia[\s\w]+)/i],[p,l,[h,g]],[/[\s\(;](xbox(?:\sone)?)[\s\);]/i],[l,[p,"Microsoft"],[h,m]],[/(kin\.[onetw]{3})/i],[[l,/\./g," "],[p,"Microsoft"],[h,g]],[/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?(:?\s4g)?)[\w\s]+build\//i,/mot[\s-]?(\w+)*/i,/(XT\d{3,4}) build\//i,/(nexus\s6)/i],[l,[p,"Motorola"],[h,g]],[/android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i],[l,[p,"Motorola"],[h,y]],[/hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i],[[p,S.trim],[l,S.trim],[h,b]],[/hbbtv.+maple;(\d+)/i],[[l,/^/,"SmartTV"],[p,"Samsung"],[h,b]],[/\(dtv[\);].+(aquos)/i],[l,[p,"Sharp"],[h,b]],[/android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i,/((SM-T\w+))/i],[[p,"Samsung"],l,[h,y]],[/smart-tv.+(samsung)/i],[p,[h,b],l],[/((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i,/(sam[sung]*)[\s-]*(\w+-?[\w-]*)*/i,/sec-((sgh\w+))/i],[[p,"Samsung"],l,[h,g]],[/sie-(\w+)*/i],[l,[p,"Siemens"],[h,g]],[/(maemo|nokia).*(n900|lumia\s\d+)/i,/(nokia)[\s_-]?([\w-]+)*/i],[[p,"Nokia"],l,[h,g]],[/android\s3\.[\s\w;-]{10}(a\d{3})/i],[l,[p,"Acer"],[h,y]],[/android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i],[[p,"LG"],l,[h,y]],[/(lg) netcast\.tv/i],[p,l,[h,b]],[/(nexus\s[45])/i,/lg[e;\s\/-]+(\w+)*/i],[l,[p,"LG"],[h,g]],[/android.+(ideatab[a-z0-9\-\s]+)/i],[l,[p,"Lenovo"],[h,y]],[/linux;.+((jolla));/i],[p,l,[h,g]],[/((pebble))app\/[\d\.]+\s/i],[p,l,[h,w]],[/android.+;\s(glass)\s\d/i],[l,[p,"Google"],[h,w]],[/android.+(\w+)\s+build\/hm\1/i,/android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i,/android.+(mi[\s\-_]*(?:one|one[\s_]plus|note lte)?[\s_]*(?:\d\w)?)\s+build/i],[[l,/_/g," "],[p,"Xiaomi"],[h,g]],[/android.+a000(1)\s+build/i],[l,[p,"OnePlus"],[h,g]],[/\s(tablet)[;\/]/i,/\s(mobile)(?:[;\/]|\ssafari)/i],[[h,S.lowerize],p,l]],engine:[[/windows.+\sedge\/([\w\.]+)/i],[d,[c,"EdgeHTML"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i,/(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i,/(icab)[\/\s]([23]\.[\d\.]+)/i],[c,d],[/rv\:([\w\.]+).*(gecko)/i],[d,c]],os:[[/microsoft\s(windows)\s(vista|xp)/i],[c,d],[/(windows)\snt\s6\.2;\s(arm)/i,/(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s]+\w)*/i,/(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i],[c,[d,x.str,T.os.windows.version]],[/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i],[[c,"Windows"],[d,x.str,T.os.windows.version]],[/\((bb)(10);/i],[[c,"BlackBerry"],d],[/(blackberry)\w*\/?([\w\.]+)*/i,/(tizen)[\/\s]([\w\.]+)/i,/(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i,/linux;.+(sailfish);/i],[c,d],[/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i],[[c,"Symbian"],d],[/\((series40);/i],[c],[/mozilla.+\(mobile;.+gecko.+firefox/i],[[c,"Firefox OS"],d],[/(nintendo|playstation)\s([wids34portablevu]+)/i,/(mint)[\/\s\(]?(\w+)*/i,/(mageia|vectorlinux)[;\s]/i,/(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?(?!chrom)([\w\.-]+)*/i,/(hurd|linux)\s?([\w\.]+)*/i,/(gnu)\s?([\w\.]+)*/i],[c,d],[/(cros)\s[\w]+\s([\w\.]+\w)/i],[[c,"Chromium OS"],d],[/(sunos)\s?([\w\.]+\d)*/i],[[c,"Solaris"],d],[/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i],[c,d],[/(haiku)\s(\w+)/i],[c,d],[/(ip[honead]+)(?:.*os\s([\w]+)*\slike\smac|;\sopera)/i],[[c,"iOS"],[d,/_/g,"."]],[/(mac\sos\sx)\s?([\w\s\.]+\w)*/i,/(macintosh|mac(?=_powerpc)\s)/i],[[c,"Mac OS"],[d,/_/g,"."]],[/((?:open)?solaris)[\/\s-]?([\w\.]+)*/i,/(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i,/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i,/(unix)\s?([\w\.]+)*/i],[c,d]]},C=function(t,n){if(this instanceof C){var i=t||(e&&e.navigator&&e.navigator.userAgent?e.navigator.userAgent:r),s=n?S.extend(N,n):N;return this.getBrowser=function(){var e=x.rgx.apply(this,s.browser);return e.major=S.major(e.version),e},this.getCPU=function(){return x.rgx.apply(this,s.cpu)},this.getDevice=function(){return x.rgx.apply(this,s.device)},this.getEngine=function(){return x.rgx.apply(this,s.engine)},this.getOS=function(){return x.rgx.apply(this,s.os)},this.getResult=function(){return{ua:this.getUA(),browser:this.getBrowser(),engine:this.getEngine(),os:this.getOS(),device:this.getDevice(),cpu:this.getCPU()}},this.getUA=function(){return i},this.setUA=function(e){return i=e,this},this}return(new C(t,n)).getResult()};C.VERSION=n,C.BROWSER={NAME:c,MAJOR:f,VERSION:d},C.CPU={ARCHITECTURE:v},C.DEVICE={MODEL:l,VENDOR:p,TYPE:h,CONSOLE:m,MOBILE:g,SMARTTV:b,TABLET:y,WEARABLE:w,EMBEDDED:E},C.ENGINE={NAME:c,VERSION:d},C.OS={NAME:c,VERSION:d},typeof exports!==o?(typeof module!==o&&module.exports&&(exports=module.exports=C),exports.UAParser=C):typeof define===s&&define.amd?define(function(){return C}):e.UAParser=C;var k=e.jQuery||e.Zepto;if(typeof k!==o){var L=new C;k.ua=L.getResult(),k.ua.get=function(){return L.getUA()},k.ua.set=function(e){L.setUA(e);var t=L.getResult();for(var n in t)k.ua[n]=t[n]}}})(typeof window=="object"?window:this); \ No newline at end of file
diff --git a/node_modules/ua-parser-js/dist/ua-parser.pack.js b/node_modules/ua-parser-js/dist/ua-parser.pack.js
new file mode 100644
index 000000000..e4d47a18f
--- /dev/null
+++ b/node_modules/ua-parser-js/dist/ua-parser.pack.js
@@ -0,0 +1,8 @@
+/**
+ * UAParser.js v0.7.12
+ * Lightweight JavaScript-based User-Agent string parser
+ * https://github.com/faisalman/ua-parser-js
+ *
+ * Copyright © 2012-2016 Faisal Salman <fyzlman@gmail.com>
+ * Dual licensed under GPLv2 & MIT
+ */(function(e,t){"use strict";var n="0.7.12",r="",i="?",s="function",o="undefined",u="object",a="string",f="major",l="model",c="name",h="type",p="vendor",d="version",v="architecture",m="console",g="mobile",y="tablet",b="smarttv",w="wearable",E="embedded",S={extend:function(e,t){var n={};for(var r in e)t[r]&&t[r].length%2===0?n[r]=t[r].concat(e[r]):n[r]=e[r];return n},has:function(e,t){return typeof e=="string"?t.toLowerCase().indexOf(e.toLowerCase())!==-1:!1},lowerize:function(e){return e.toLowerCase()},major:function(e){return typeof e===a?e.replace(/[^\d\.]/g,"").split(".")[0]:t},trim:function(e){return e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}},x={rgx:function(){var e,n=0,r,i,a,f,l,c,h=arguments;while(n<h.length&&!l){var p=h[n],d=h[n+1];if(typeof e===o){e={};for(a in d)d.hasOwnProperty(a)&&(f=d[a],typeof f===u?e[f[0]]=t:e[f]=t)}r=i=0;while(r<p.length&&!l){l=p[r++].exec(this.getUA());if(!!l)for(a=0;a<d.length;a++)c=l[++i],f=d[a],typeof f===u&&f.length>0?f.length==2?typeof f[1]==s?e[f[0]]=f[1].call(this,c):e[f[0]]=f[1]:f.length==3?typeof f[1]===s&&(!f[1].exec||!f[1].test)?e[f[0]]=c?f[1].call(this,c,f[2]):t:e[f[0]]=c?c.replace(f[1],f[2]):t:f.length==4&&(e[f[0]]=c?f[3].call(this,c.replace(f[1],f[2])):t):e[f]=c?c:t}n+=2}return e},str:function(e,n){for(var r in n)if(typeof n[r]===u&&n[r].length>0){for(var s=0;s<n[r].length;s++)if(S.has(n[r][s],e))return r===i?t:r}else if(S.has(n[r],e))return r===i?t:r;return e}},T={browser:{oldsafari:{version:{"1.0":"/8",1.2:"/1",1.3:"/3","2.0":"/412","2.0.2":"/416","2.0.3":"/417","2.0.4":"/419","?":"/"}}},device:{amazon:{model:{"Fire Phone":["SD","KF"]}},sprint:{model:{"Evo Shift 4G":"7373KT"},vendor:{HTC:"APA",Sprint:"Sprint"}}},os:{windows:{version:{ME:"4.90","NT 3.11":"NT3.51","NT 4.0":"NT4.0",2e3:"NT 5.0",XP:["NT 5.1","NT 5.2"],Vista:"NT 6.0",7:"NT 6.1",8:"NT 6.2",8.1:"NT 6.3",10:["NT 6.4","NT 10.0"],RT:"ARM"}}}},N={browser:[[/(opera\smini)\/([\w\.-]+)/i,/(opera\s[mobiletab]+).+version\/([\w\.-]+)/i,/(opera).+version\/([\w\.]+)/i,/(opera)[\/\s]+([\w\.]+)/i],[c,d],[/(opios)[\/\s]+([\w\.]+)/i],[[c,"Opera Mini"],d],[/\s(opr)\/([\w\.]+)/i],[[c,"Opera"],d],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]+)*/i,/(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i,/(?:ms|\()(ie)\s([\w\.]+)/i,/(rekonq)\/([\w\.]+)*/i,/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs)\/([\w\.-]+)/i],[c,d],[/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i],[[c,"IE"],d],[/(edge)\/((\d+)?[\w\.]+)/i],[c,d],[/(yabrowser)\/([\w\.]+)/i],[[c,"Yandex"],d],[/(comodo_dragon)\/([\w\.]+)/i],[[c,/_/g," "],d],[/(micromessenger)\/([\w\.]+)/i],[[c,"WeChat"],d],[/xiaomi\/miuibrowser\/([\w\.]+)/i],[d,[c,"MIUI Browser"]],[/\swv\).+(chrome)\/([\w\.]+)/i],[[c,/(.+)/,"$1 WebView"],d],[/android.+samsungbrowser\/([\w\.]+)/i,/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i],[d,[c,"Android Browser"]],[/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i,/(qqbrowser)[\/\s]?([\w\.]+)/i],[c,d],[/(uc\s?browser)[\/\s]?([\w\.]+)/i,/ucweb.+(ucbrowser)[\/\s]?([\w\.]+)/i,/juc.+(ucweb)[\/\s]?([\w\.]+)/i],[[c,"UCBrowser"],d],[/(dolfin)\/([\w\.]+)/i],[[c,"Dolphin"],d],[/((?:android.+)crmo|crios)\/([\w\.]+)/i],[[c,"Chrome"],d],[/;fbav\/([\w\.]+);/i],[d,[c,"Facebook"]],[/fxios\/([\w\.-]+)/i],[d,[c,"Firefox"]],[/version\/([\w\.]+).+?mobile\/\w+\s(safari)/i],[d,[c,"Mobile Safari"]],[/version\/([\w\.]+).+?(mobile\s?safari|safari)/i],[d,c],[/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i],[c,[d,x.str,T.browser.oldsafari.version]],[/(konqueror)\/([\w\.]+)/i,/(webkit|khtml)\/([\w\.]+)/i],[c,d],[/(navigator|netscape)\/([\w\.-]+)/i],[[c,"Netscape"],d],[/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,/(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\/([\w\.-]+)/i,/(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i,/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i,/(links)\s\(([\w\.]+)/i,/(gobrowser)\/?([\w\.]+)*/i,/(ice\s?browser)\/v?([\w\._]+)/i,/(mosaic)[\/\s]([\w\.]+)/i],[c,d]],cpu:[[/(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i],[[v,"amd64"]],[/(ia32(?=;))/i],[[v,S.lowerize]],[/((?:i[346]|x)86)[;\)]/i],[[v,"ia32"]],[/windows\s(ce|mobile);\sppc;/i],[[v,"arm"]],[/((?:ppc|powerpc)(?:64)?)(?:\smac|;|\))/i],[[v,/ower/,"",S.lowerize]],[/(sun4\w)[;\)]/i],[[v,"sparc"]],[/((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+;))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i],[[v,S.lowerize]]],device:[[/\((ipad|playbook);[\w\s\);-]+(rim|apple)/i],[l,p,[h,y]],[/applecoremedia\/[\w\.]+ \((ipad)/],[l,[p,"Apple"],[h,y]],[/(apple\s{0,1}tv)/i],[[l,"Apple TV"],[p,"Apple"]],[/(archos)\s(gamepad2?)/i,/(hp).+(touchpad)/i,/(hp).+(tablet)/i,/(kindle)\/([\w\.]+)/i,/\s(nook)[\w\s]+build\/(\w+)/i,/(dell)\s(strea[kpr\s\d]*[\dko])/i],[p,l,[h,y]],[/(kf[A-z]+)\sbuild\/[\w\.]+.*silk\//i],[l,[p,"Amazon"],[h,y]],[/(sd|kf)[0349hijorstuw]+\sbuild\/[\w\.]+.*silk\//i],[[l,x.str,T.device.amazon.model],[p,"Amazon"],[h,g]],[/\((ip[honed|\s\w*]+);.+(apple)/i],[l,p,[h,g]],[/\((ip[honed|\s\w*]+);/i],[l,[p,"Apple"],[h,g]],[/(blackberry)[\s-]?(\w+)/i,/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|huawei|meizu|motorola|polytron)[\s_-]?([\w-]+)*/i,/(hp)\s([\w\s]+\w)/i,/(asus)-?(\w+)/i],[p,l,[h,g]],[/\(bb10;\s(\w+)/i],[l,[p,"BlackBerry"],[h,g]],[/android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone)/i],[l,[p,"Asus"],[h,y]],[/(sony)\s(tablet\s[ps])\sbuild\//i,/(sony)?(?:sgp.+)\sbuild\//i],[[p,"Sony"],[l,"Xperia Tablet"],[h,y]],[/(?:sony)?(?:(?:(?:c|d)\d{4})|(?:so[-l].+))\sbuild\//i],[[p,"Sony"],[l,"Xperia Phone"],[h,g]],[/\s(ouya)\s/i,/(nintendo)\s([wids3u]+)/i],[p,l,[h,m]],[/android.+;\s(shield)\sbuild/i],[l,[p,"Nvidia"],[h,m]],[/(playstation\s[34portablevi]+)/i],[l,[p,"Sony"],[h,m]],[/(sprint\s(\w+))/i],[[p,x.str,T.device.sprint.vendor],[l,x.str,T.device.sprint.model],[h,g]],[/(lenovo)\s?(S(?:5000|6000)+(?:[-][\w+]))/i],[p,l,[h,y]],[/(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i,/(zte)-(\w+)*/i,/(alcatel|geeksphone|huawei|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i],[p,[l,/_/g," "],[h,g]],[/(nexus\s9)/i],[l,[p,"HTC"],[h,y]],[/(nexus\s6p)/i],[l,[p,"Huawei"],[h,g]],[/(microsoft);\s(lumia[\s\w]+)/i],[p,l,[h,g]],[/[\s\(;](xbox(?:\sone)?)[\s\);]/i],[l,[p,"Microsoft"],[h,m]],[/(kin\.[onetw]{3})/i],[[l,/\./g," "],[p,"Microsoft"],[h,g]],[/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?(:?\s4g)?)[\w\s]+build\//i,/mot[\s-]?(\w+)*/i,/(XT\d{3,4}) build\//i,/(nexus\s6)/i],[l,[p,"Motorola"],[h,g]],[/android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i],[l,[p,"Motorola"],[h,y]],[/hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i],[[p,S.trim],[l,S.trim],[h,b]],[/hbbtv.+maple;(\d+)/i],[[l,/^/,"SmartTV"],[p,"Samsung"],[h,b]],[/\(dtv[\);].+(aquos)/i],[l,[p,"Sharp"],[h,b]],[/android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i,/((SM-T\w+))/i],[[p,"Samsung"],l,[h,y]],[/smart-tv.+(samsung)/i],[p,[h,b],l],[/((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i,/(sam[sung]*)[\s-]*(\w+-?[\w-]*)*/i,/sec-((sgh\w+))/i],[[p,"Samsung"],l,[h,g]],[/sie-(\w+)*/i],[l,[p,"Siemens"],[h,g]],[/(maemo|nokia).*(n900|lumia\s\d+)/i,/(nokia)[\s_-]?([\w-]+)*/i],[[p,"Nokia"],l,[h,g]],[/android\s3\.[\s\w;-]{10}(a\d{3})/i],[l,[p,"Acer"],[h,y]],[/android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i],[[p,"LG"],l,[h,y]],[/(lg) netcast\.tv/i],[p,l,[h,b]],[/(nexus\s[45])/i,/lg[e;\s\/-]+(\w+)*/i],[l,[p,"LG"],[h,g]],[/android.+(ideatab[a-z0-9\-\s]+)/i],[l,[p,"Lenovo"],[h,y]],[/linux;.+((jolla));/i],[p,l,[h,g]],[/((pebble))app\/[\d\.]+\s/i],[p,l,[h,w]],[/android.+;\s(glass)\s\d/i],[l,[p,"Google"],[h,w]],[/android.+(\w+)\s+build\/hm\1/i,/android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i,/android.+(mi[\s\-_]*(?:one|one[\s_]plus|note lte)?[\s_]*(?:\d\w)?)\s+build/i],[[l,/_/g," "],[p,"Xiaomi"],[h,g]],[/android.+a000(1)\s+build/i],[l,[p,"OnePlus"],[h,g]],[/\s(tablet)[;\/]/i,/\s(mobile)(?:[;\/]|\ssafari)/i],[[h,S.lowerize],p,l]],engine:[[/windows.+\sedge\/([\w\.]+)/i],[d,[c,"EdgeHTML"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i,/(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i,/(icab)[\/\s]([23]\.[\d\.]+)/i],[c,d],[/rv\:([\w\.]+).*(gecko)/i],[d,c]],os:[[/microsoft\s(windows)\s(vista|xp)/i],[c,d],[/(windows)\snt\s6\.2;\s(arm)/i,/(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s]+\w)*/i,/(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i],[c,[d,x.str,T.os.windows.version]],[/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i],[[c,"Windows"],[d,x.str,T.os.windows.version]],[/\((bb)(10);/i],[[c,"BlackBerry"],d],[/(blackberry)\w*\/?([\w\.]+)*/i,/(tizen)[\/\s]([\w\.]+)/i,/(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i,/linux;.+(sailfish);/i],[c,d],[/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i],[[c,"Symbian"],d],[/\((series40);/i],[c],[/mozilla.+\(mobile;.+gecko.+firefox/i],[[c,"Firefox OS"],d],[/(nintendo|playstation)\s([wids34portablevu]+)/i,/(mint)[\/\s\(]?(\w+)*/i,/(mageia|vectorlinux)[;\s]/i,/(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?(?!chrom)([\w\.-]+)*/i,/(hurd|linux)\s?([\w\.]+)*/i,/(gnu)\s?([\w\.]+)*/i],[c,d],[/(cros)\s[\w]+\s([\w\.]+\w)/i],[[c,"Chromium OS"],d],[/(sunos)\s?([\w\.]+\d)*/i],[[c,"Solaris"],d],[/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i],[c,d],[/(haiku)\s(\w+)/i],[c,d],[/(ip[honead]+)(?:.*os\s([\w]+)*\slike\smac|;\sopera)/i],[[c,"iOS"],[d,/_/g,"."]],[/(mac\sos\sx)\s?([\w\s\.]+\w)*/i,/(macintosh|mac(?=_powerpc)\s)/i],[[c,"Mac OS"],[d,/_/g,"."]],[/((?:open)?solaris)[\/\s-]?([\w\.]+)*/i,/(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i,/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i,/(unix)\s?([\w\.]+)*/i],[c,d]]},C=function(t,n){if(this instanceof C){var i=t||(e&&e.navigator&&e.navigator.userAgent?e.navigator.userAgent:r),s=n?S.extend(N,n):N;return this.getBrowser=function(){var e=x.rgx.apply(this,s.browser);return e.major=S.major(e.version),e},this.getCPU=function(){return x.rgx.apply(this,s.cpu)},this.getDevice=function(){return x.rgx.apply(this,s.device)},this.getEngine=function(){return x.rgx.apply(this,s.engine)},this.getOS=function(){return x.rgx.apply(this,s.os)},this.getResult=function(){return{ua:this.getUA(),browser:this.getBrowser(),engine:this.getEngine(),os:this.getOS(),device:this.getDevice(),cpu:this.getCPU()}},this.getUA=function(){return i},this.setUA=function(e){return i=e,this},this}return(new C(t,n)).getResult()};C.VERSION=n,C.BROWSER={NAME:c,MAJOR:f,VERSION:d},C.CPU={ARCHITECTURE:v},C.DEVICE={MODEL:l,VENDOR:p,TYPE:h,CONSOLE:m,MOBILE:g,SMARTTV:b,TABLET:y,WEARABLE:w,EMBEDDED:E},C.ENGINE={NAME:c,VERSION:d},C.OS={NAME:c,VERSION:d},typeof exports!==o?(typeof module!==o&&module.exports&&(exports=module.exports=C),exports.UAParser=C):typeof define===s&&define.amd?define(function(){return C}):e.UAParser=C;var k=e.jQuery||e.Zepto;if(typeof k!==o){var L=new C;k.ua=L.getResult(),k.ua.get=function(){return L.getUA()},k.ua.set=function(e){L.setUA(e);var t=L.getResult();for(var n in t)k.ua[n]=t[n]}}})(typeof window=="object"?window:this); \ No newline at end of file
diff --git a/node_modules/ua-parser-js/package.js b/node_modules/ua-parser-js/package.js
new file mode 100644
index 000000000..216597fc6
--- /dev/null
+++ b/node_modules/ua-parser-js/package.js
@@ -0,0 +1,12 @@
+Package.describe({
+ name: 'faisalman:ua-parser-js',
+ version: '0.7.12',
+ summary: 'Lightweight JavaScript-based user-agent string parser',
+ git: 'https://github.com/faisalman/ua-parser-js.git',
+ documentation: 'readme.md'
+});
+
+Package.onUse(function (api) {
+ api.addFiles("src/ua-parser.js");
+ api.export("UAParser");
+});
diff --git a/node_modules/ua-parser-js/package.json b/node_modules/ua-parser-js/package.json
new file mode 100644
index 000000000..f63bab552
--- /dev/null
+++ b/node_modules/ua-parser-js/package.json
@@ -0,0 +1,83 @@
+{
+ "title": "UAParser.js",
+ "name": "ua-parser-js",
+ "version": "0.7.12",
+ "author": "Faisal Salman <fyzlman@gmail.com> (http://faisalman.com)",
+ "description": "Lightweight JavaScript-based user-agent string parser",
+ "keywords": [
+ "user-agent",
+ "parser",
+ "browser",
+ "engine",
+ "os",
+ "device",
+ "cpu"
+ ],
+ "homepage": "http://github.com/faisalman/ua-parser-js",
+ "contributors": [
+ "Faisal Salman <fyzlman@gmail.com>",
+ "Benjamin Bertrand <bertrand.design@gmail.com>",
+ "Carl C Von Lewin <carlchristianlewin@gmail.com>",
+ "Christopher De Cairos <chris.decairos@gmail.com>",
+ "Davit Barbakadze <jayarjo@gmail.com>",
+ "Dmitry Tyschenko <dtyschenko@gmail.com>",
+ "Douglas Li <doug@knotch.it>",
+ "Dumitru Uzun <contact@duzun.me>",
+ "Erik Hesselink <hesselink@gmail.com>",
+ "Fabian Becker <halfdan@xnorfz.de>",
+ "Hendrik Helwich <h.helwich@iplabs.de>",
+ "Jackpoll <jackpoll123456@gmail.com>",
+ "Jake Mc <startswithaj@users.noreply.github.com>",
+ "John Tantalo <john.tantalo@gmail.com>",
+ "John Yanarella <jmy@codecatalyst.com>",
+ "Jon Buckley <jon@jbuckley.ca>",
+ "Kendall Buchanan <kendall@kendagriff.com>",
+ "Lee Treveil <leetreveil@gmail.com>",
+ "Leonardo <leofiore@libero.it>",
+ "Max Maurer <maxemanuel.maurer@gmail.com>",
+ "Michael Hess <mhess@connectify.me>",
+ "OtakuSiD <otakusid@gmail.com>",
+ "Ross Noble <rosshnoble@gmail.com>",
+ "Sandro Sonntag <sandro.sonntag@adorsys.de>"
+ ],
+ "main": "src/ua-parser.js",
+ "scripts": {
+ "build": "uglifyjs src/ua-parser.js > dist/ua-parser.min.js --comments '/UAParser\\.js/' && uglifyjs src/ua-parser.js > dist/ua-parser.pack.js --comments '/UAParser\\.js/' --compress --mangle",
+ "test": "jshint src/ua-parser.js && mocha -R nyan test/test.js",
+ "verup": "node ./node_modules/verup",
+ "version": "node ./node_modules/verup 0"
+ },
+ "verup": {
+ "files": [
+ "ua-parser-js.jquery.json",
+ "component.json",
+ "bower.json",
+ "package.js",
+ "src/ua-parser.js"
+ ],
+ "regs": [
+ "^((?:\\$|(\\s*\\*\\s*@)|(\\s*(?:var|,)?\\s+))(?:LIBVERSION|version)[\\s\\:='\"]+)([0-9]+(?:\\.[0-9]+){2,2})",
+ "^(\\s?\\*.*v)([0-9]+(?:\\.[0-9]+){2,2})"
+ ]
+ },
+ "devDependencies": {
+ "jshint": "~1.1.0",
+ "mocha": "~1.8.0",
+ "requirejs": "^2.3.2",
+ "uglify-js": "~1.3.4",
+ "verup": "^1.3.x"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/faisalman/ua-parser-js.git"
+ },
+ "license": "(GPL-2.0 OR MIT)",
+ "engines": {
+ "node": "*"
+ },
+ "directories": {
+ "dist": "dist",
+ "src": "src",
+ "test": "test"
+ }
+}
diff --git a/node_modules/ua-parser-js/readme.md b/node_modules/ua-parser-js/readme.md
new file mode 100644
index 000000000..7951d0699
--- /dev/null
+++ b/node_modules/ua-parser-js/readme.md
@@ -0,0 +1,297 @@
+# UAParser.js
+
+<img align="right" src="https://raw.githubusercontent.com/faisalman/ua-parser-js/gh-pages/images/logo.png"> A not-so-lightweight-anymore JavaScript-based User-Agent string parser. Can be used either in browser (client-side) or in node.js (server-side) environment. Also available as jQuery/Zepto plugin, Bower/Meteor package, & RequireJS/AMD module. This library aims to identify detailed type of web browser, layout engine, operating system, cpu architecture, and device type/model, entirely from user-agent string with a relatively small footprint (~11KB when minified / ~4KB gzipped). Written in vanilla JavaScript, which means it doesn't require any other library and can be used independently.
+
+[![Build Status](https://travis-ci.org/faisalman/ua-parser-js.svg?branch=master)](https://travis-ci.org/faisalman/ua-parser-js)
+[![NPM](https://img.shields.io/npm/v/ua-parser-js.svg)](https://www.npmjs.com/package/ua-parser-js)
+[![Bower](https://img.shields.io/bower/v/ua-parser-js.svg)](https://bower.io/)
+[![CDNJS](https://img.shields.io/cdnjs/v/UAParser.js.svg)](https://cdnjs.com/libraries/UAParser.js)
+[![Gratipay](https://img.shields.io/gratipay/team/UAParser.js.svg)](https://gratipay.com/UAParser.js)
+[![Flattr this](http://api.flattr.com/button/flattr-badge-large.png)](http://flattr.com/thing/3867907/faisalmanua-parser-js-on-GitHub)
+
+* Author : Faisal Salman <<fyzlman@gmail.com>>
+* Demo : http://faisalman.github.io/ua-parser-js
+* Source : https://github.com/faisalman/ua-parser-js
+
+
+# Methods
+
+* `getBrowser()`
+ * returns `{ name: '', version: '' }`
+
+```
+# Possible 'browser.name':
+Amaya, Android Browser, Arora, Avant, Baidu, Blazer, Bolt, Camino, Chimera, Chrome,
+Chromium, Comodo Dragon, Conkeror, Dillo, Dolphin, Doris, Edge, Epiphany, Fennec,
+Firebird, Firefox, Flock, GoBrowser, iCab, ICE Browser, IceApe, IceCat, IceDragon,
+Iceweasel, IE [Mobile], Iron, Jasmine, K-Meleon, Konqueror, Kindle, Links,
+Lunascape, Lynx, Maemo, Maxthon, Midori, Minimo, MIUI Browser, [Mobile] Safari,
+Mosaic, Mozilla, Netfront, Netscape, NetSurf, Nokia, OmniWeb, Opera [Mini/Mobi/Tablet],
+PhantomJS, Phoenix, Polaris, QQBrowser, RockMelt, Silk, Skyfire, SeaMonkey, SlimBrowser,
+Swiftfox, Tizen, UCBrowser, Vivaldi, w3m, WeChat, Yandex
+
+# 'browser.version' determined dynamically
+```
+
+* `getDevice()`
+ * returns `{ model: '', type: '', vendor: '' }`
+
+```
+# Possible 'device.type':
+console, mobile, tablet, smarttv, wearable, embedded
+
+# Possible 'device.vendor':
+Acer, Alcatel, Amazon, Apple, Archos, Asus, BenQ, BlackBerry, Dell, GeeksPhone,
+Google, HP, HTC, Huawei, Jolla, Lenovo, LG, Meizu, Microsoft, Motorola, Nexian,
+Nintendo, Nokia, Nvidia, Ouya, Palm, Panasonic, Polytron, RIM, Samsung, Sharp,
+Siemens, Sony-Ericsson, Sprint, Xbox, ZTE
+
+# 'device.model' determined dynamically
+```
+
+* `getEngine()`
+ * returns `{ name: '', version: '' }`
+
+```
+# Possible 'engine.name'
+Amaya, EdgeHTML, Gecko, iCab, KHTML, Links, Lynx, NetFront, NetSurf, Presto,
+Tasman, Trident, w3m, WebKit
+
+# 'engine.version' determined dynamically
+```
+
+* `getOS()`
+ * returns `{ name: '', version: '' }`
+
+```
+# Possible 'os.name'
+AIX, Amiga OS, Android, Arch, Bada, BeOS, BlackBerry, CentOS, Chromium OS, Contiki,
+Fedora, Firefox OS, FreeBSD, Debian, DragonFly, Gentoo, GNU, Haiku, Hurd, iOS,
+Joli, Linpus, Linux, Mac OS, Mageia, Mandriva, MeeGo, Minix, Mint, Morph OS, NetBSD,
+Nintendo, OpenBSD, OpenVMS, OS/2, Palm, PCLinuxOS, Plan9, Playstation, QNX, RedHat,
+RIM Tablet OS, RISC OS, Sailfish, Series40, Slackware, Solaris, SUSE, Symbian, Tizen,
+Ubuntu, UNIX, VectorLinux, WebOS, Windows [Phone/Mobile], Zenwalk
+
+# 'os.version' determined dynamically
+```
+
+* `getCPU()`
+ * returns `{ architecture: '' }`
+
+```
+# Possible 'cpu.architecture'
+68k, amd64, arm, arm64, avr, ia32, ia64, irix, irix64, mips, mips64, pa-risc,
+ppc, sparc, sparc64
+```
+
+* `getResult()`
+ * returns `{ ua: '', browser: {}, cpu: {}, device: {}, engine: {}, os: {} }`
+
+* `getUA()`
+ * returns UA string of current instance
+
+* `setUA(uastring)`
+ * set & parse UA string
+
+
+# Example
+
+```html
+<!doctype html>
+<html>
+<head>
+<script type="text/javascript" src="ua-parser.min.js"></script>
+<script type="text/javascript">
+
+ var parser = new UAParser();
+
+ // by default it takes ua string from current browser's window.navigator.userAgent
+ console.log(parser.getResult());
+ /*
+ /// this will print an object structured like this:
+ {
+ ua: "",
+ browser: {
+ name: "",
+ version: ""
+ },
+ engine: {
+ name: "",
+ version: ""
+ },
+ os: {
+ name: "",
+ version: ""
+ },
+ device: {
+ model: "",
+ type: "",
+ vendor: ""
+ },
+ cpu: {
+ architecture: ""
+ }
+ }
+ */
+
+ // let's test a custom user-agent string as an example
+ var uastring = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.2 (KHTML, like Gecko) Ubuntu/11.10 Chromium/15.0.874.106 Chrome/15.0.874.106 Safari/535.2";
+ parser.setUA(uastring);
+
+ var result = parser.getResult();
+ // this will also produce the same result (without instantiation):
+ // var result = UAParser(uastring);
+
+ console.log(result.browser); // {name: "Chromium", version: "15.0.874.106"}
+ console.log(result.device); // {model: undefined, type: undefined, vendor: undefined}
+ console.log(result.os); // {name: "Ubuntu", version: "11.10"}
+ console.log(result.os.version); // "11.10"
+ console.log(result.engine.name); // "WebKit"
+ console.log(result.cpu.architecture); // "amd64"
+
+ // do some other tests
+ var uastring2 = "Mozilla/5.0 (compatible; Konqueror/4.1; OpenBSD) KHTML/4.1.4 (like Gecko)";
+ console.log(parser.setUA(uastring2).getBrowser().name); // "Konqueror"
+ console.log(parser.getOS()); // {name: "OpenBSD", version: undefined}
+ console.log(parser.getEngine()); // {name: "KHTML", version: "4.1.4"}
+
+ var uastring3 = 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 1.0.0; en-US) AppleWebKit/534.11 (KHTML, like Gecko) Version/7.1.0.7 Safari/534.11';
+ console.log(parser.setUA(uastring3).getDevice().model); // "PlayBook"
+ console.log(parser.getOS()) // {name: "RIM Tablet OS", version: "1.0.0"}
+ console.log(parser.getBrowser().name); // "Safari"
+
+</script>
+</head>
+<body>
+</body>
+</html>
+```
+
+## Using node.js
+
+```sh
+$ npm install ua-parser-js
+```
+
+```js
+var http = require('http');
+var parser = require('ua-parser-js');
+
+http.createServer(function (req, res) {
+ // get user-agent header
+ var ua = parser(req.headers['user-agent']);
+ // write the result as response
+ res.end(JSON.stringify(ua, null, ' '));
+})
+.listen(1337, '127.0.0.1');
+
+console.log('Server running at http://127.0.0.1:1337/');
+```
+
+## Using requirejs
+
+```js
+requirejs.config({
+ baseUrl : 'js/lib', // path to your script directory
+ paths : {
+ 'ua-parser-js' : 'ua-parser.min'
+ }
+});
+
+requirejs(['ua-parser-js'], function(UAParser) {
+ var parser = new UAParser();
+ console.log(parser.getResult());
+});
+```
+
+## Using bower
+
+```sh
+$ bower install ua-parser-js
+```
+
+## Using meteor
+
+```sh
+$ meteor add faisalman:ua-parser-js
+```
+
+## Using jQuery/Zepto ($.ua)
+
+Although written in vanilla js (which means it doesn't depends on jQuery), this library will automatically detect if jQuery/Zepto is present and create `$.ua` object based on browser's user-agent (although in case you need, `window.UAParser` constructor is still present). To get/set user-agent you can use: `$.ua.get()` / `$.ua.set(uastring)`.
+
+```js
+// In browser with default user-agent: 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Sprint APA7373KT Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0':
+
+// Do some tests
+console.log($.ua.device); // {vendor: "HTC", model: "Evo Shift 4G", type: "mobile"}
+console.log($.ua.os); // {name: "Android", version: "2.3.4"}
+console.log($.ua.os.name); // "Android"
+console.log($.ua.get()); // "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Sprint APA7373KT Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0"
+
+// reset to custom user-agent
+$.ua.set('Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; Xoom Build/HWI69) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13');
+
+// Test again
+console.log($.ua.browser.name); // "Safari"
+console.log($.ua.engine.name); // "Webkit"
+console.log($.ua.device); // {vendor: "Motorola", model: "Xoom", type: "tablet"}
+console.log(parseInt($.ua.browser.version.split('.')[0], 10)); // 4
+```
+
+## Extending regex patterns
+
+* `UAParser(uastring[, extensions])`
+
+Pass your own regexes to extend the limited matching rules.
+
+```js
+// Example:
+var uaString = 'MyOwnBrowser/1.3';
+var myOwnRegex = [[/(myownbrowser)\/([\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION]];
+var parser = new UAParser(uaString, { browser: myOwnRegex });
+console.log(parser.getBrowser()); // {name: "MyOwnBrowser", version: "1.3"}
+```
+
+
+# Development
+
+## Contribute
+
+* Fork and clone this repository
+* Make some changes as required
+* Write a unit test to showcase your feature
+* Run the test suites to make sure the changes you made didn't break anything
+
+```sh
+$ npm run test
+```
+
+* Commit and push to your own repository
+* Submit a pull request to this repository under `develop` branch
+* Profit?
+
+## Build
+
+Build a minified & packed script
+
+```sh
+$ npm run build
+```
+
+
+# License
+
+Dual licensed under GPLv2 & MIT
+
+Copyright © 2012-2016 Faisal Salman <<fyzlman@gmail.com>>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
diff --git a/node_modules/ua-parser-js/src/ua-parser.js b/node_modules/ua-parser-js/src/ua-parser.js
new file mode 100644
index 000000000..8d5d51341
--- /dev/null
+++ b/node_modules/ua-parser-js/src/ua-parser.js
@@ -0,0 +1,915 @@
+/**
+ * UAParser.js v0.7.12
+ * Lightweight JavaScript-based User-Agent string parser
+ * https://github.com/faisalman/ua-parser-js
+ *
+ * Copyright © 2012-2016 Faisal Salman <fyzlman@gmail.com>
+ * Dual licensed under GPLv2 & MIT
+ */
+
+(function (window, undefined) {
+
+ 'use strict';
+
+ //////////////
+ // Constants
+ /////////////
+
+
+ var LIBVERSION = '0.7.12',
+ EMPTY = '',
+ UNKNOWN = '?',
+ FUNC_TYPE = 'function',
+ UNDEF_TYPE = 'undefined',
+ OBJ_TYPE = 'object',
+ STR_TYPE = 'string',
+ MAJOR = 'major', // deprecated
+ MODEL = 'model',
+ NAME = 'name',
+ TYPE = 'type',
+ VENDOR = 'vendor',
+ VERSION = 'version',
+ ARCHITECTURE= 'architecture',
+ CONSOLE = 'console',
+ MOBILE = 'mobile',
+ TABLET = 'tablet',
+ SMARTTV = 'smarttv',
+ WEARABLE = 'wearable',
+ EMBEDDED = 'embedded';
+
+
+ ///////////
+ // Helper
+ //////////
+
+
+ var util = {
+ extend : function (regexes, extensions) {
+ var margedRegexes = {};
+ for (var i in regexes) {
+ if (extensions[i] && extensions[i].length % 2 === 0) {
+ margedRegexes[i] = extensions[i].concat(regexes[i]);
+ } else {
+ margedRegexes[i] = regexes[i];
+ }
+ }
+ return margedRegexes;
+ },
+ has : function (str1, str2) {
+ if (typeof str1 === "string") {
+ return str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1;
+ } else {
+ return false;
+ }
+ },
+ lowerize : function (str) {
+ return str.toLowerCase();
+ },
+ major : function (version) {
+ return typeof(version) === STR_TYPE ? version.replace(/[^\d\.]/g,'').split(".")[0] : undefined;
+ },
+ trim : function (str) {
+ return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
+ }
+ };
+
+
+ ///////////////
+ // Map helper
+ //////////////
+
+
+ var mapper = {
+
+ rgx : function () {
+
+ var result, i = 0, j, k, p, q, matches, match, args = arguments;
+
+ // loop through all regexes maps
+ while (i < args.length && !matches) {
+
+ var regex = args[i], // even sequence (0,2,4,..)
+ props = args[i + 1]; // odd sequence (1,3,5,..)
+
+ // construct object barebones
+ if (typeof result === UNDEF_TYPE) {
+ result = {};
+ for (p in props) {
+ if (props.hasOwnProperty(p)){
+ q = props[p];
+ if (typeof q === OBJ_TYPE) {
+ result[q[0]] = undefined;
+ } else {
+ result[q] = undefined;
+ }
+ }
+ }
+ }
+
+ // try matching uastring with regexes
+ j = k = 0;
+ while (j < regex.length && !matches) {
+ matches = regex[j++].exec(this.getUA());
+ if (!!matches) {
+ for (p = 0; p < props.length; p++) {
+ match = matches[++k];
+ q = props[p];
+ // check if given property is actually array
+ if (typeof q === OBJ_TYPE && q.length > 0) {
+ if (q.length == 2) {
+ if (typeof q[1] == FUNC_TYPE) {
+ // assign modified match
+ result[q[0]] = q[1].call(this, match);
+ } else {
+ // assign given value, ignore regex match
+ result[q[0]] = q[1];
+ }
+ } else if (q.length == 3) {
+ // check whether function or regex
+ if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
+ // call function (usually string mapper)
+ result[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
+ } else {
+ // sanitize match using given regex
+ result[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
+ }
+ } else if (q.length == 4) {
+ result[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
+ }
+ } else {
+ result[q] = match ? match : undefined;
+ }
+ }
+ }
+ }
+ i += 2;
+ }
+ return result;
+ },
+
+ str : function (str, map) {
+
+ for (var i in map) {
+ // check if array
+ if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {
+ for (var j = 0; j < map[i].length; j++) {
+ if (util.has(map[i][j], str)) {
+ return (i === UNKNOWN) ? undefined : i;
+ }
+ }
+ } else if (util.has(map[i], str)) {
+ return (i === UNKNOWN) ? undefined : i;
+ }
+ }
+ return str;
+ }
+ };
+
+
+ ///////////////
+ // String map
+ //////////////
+
+
+ var maps = {
+
+ browser : {
+ oldsafari : {
+ version : {
+ '1.0' : '/8',
+ '1.2' : '/1',
+ '1.3' : '/3',
+ '2.0' : '/412',
+ '2.0.2' : '/416',
+ '2.0.3' : '/417',
+ '2.0.4' : '/419',
+ '?' : '/'
+ }
+ }
+ },
+
+ device : {
+ amazon : {
+ model : {
+ 'Fire Phone' : ['SD', 'KF']
+ }
+ },
+ sprint : {
+ model : {
+ 'Evo Shift 4G' : '7373KT'
+ },
+ vendor : {
+ 'HTC' : 'APA',
+ 'Sprint' : 'Sprint'
+ }
+ }
+ },
+
+ os : {
+ windows : {
+ version : {
+ 'ME' : '4.90',
+ 'NT 3.11' : 'NT3.51',
+ 'NT 4.0' : 'NT4.0',
+ '2000' : 'NT 5.0',
+ 'XP' : ['NT 5.1', 'NT 5.2'],
+ 'Vista' : 'NT 6.0',
+ '7' : 'NT 6.1',
+ '8' : 'NT 6.2',
+ '8.1' : 'NT 6.3',
+ '10' : ['NT 6.4', 'NT 10.0'],
+ 'RT' : 'ARM'
+ }
+ }
+ }
+ };
+
+
+ //////////////
+ // Regex map
+ /////////////
+
+
+ var regexes = {
+
+ browser : [[
+
+ // Presto based
+ /(opera\smini)\/([\w\.-]+)/i, // Opera Mini
+ /(opera\s[mobiletab]+).+version\/([\w\.-]+)/i, // Opera Mobi/Tablet
+ /(opera).+version\/([\w\.]+)/i, // Opera > 9.80
+ /(opera)[\/\s]+([\w\.]+)/i // Opera < 9.80
+ ], [NAME, VERSION], [
+
+ /(opios)[\/\s]+([\w\.]+)/i // Opera mini on iphone >= 8.0
+ ], [[NAME, 'Opera Mini'], VERSION], [
+
+ /\s(opr)\/([\w\.]+)/i // Opera Webkit
+ ], [[NAME, 'Opera'], VERSION], [
+
+ // Mixed
+ /(kindle)\/([\w\.]+)/i, // Kindle
+ /(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]+)*/i,
+ // Lunascape/Maxthon/Netfront/Jasmine/Blazer
+
+ // Trident based
+ /(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i,
+ // Avant/IEMobile/SlimBrowser/Baidu
+ /(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer
+
+ // Webkit/KHTML based
+ /(rekonq)\/([\w\.]+)*/i, // Rekonq
+ /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs)\/([\w\.-]+)/i
+ // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS
+ ], [NAME, VERSION], [
+
+ /(trident).+rv[:\s]([\w\.]+).+like\sgecko/i // IE11
+ ], [[NAME, 'IE'], VERSION], [
+
+ /(edge)\/((\d+)?[\w\.]+)/i // Microsoft Edge
+ ], [NAME, VERSION], [
+
+ /(yabrowser)\/([\w\.]+)/i // Yandex
+ ], [[NAME, 'Yandex'], VERSION], [
+
+ /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
+ ], [[NAME, /_/g, ' '], VERSION], [
+
+ /(micromessenger)\/([\w\.]+)/i // WeChat
+ ], [[NAME, 'WeChat'], VERSION], [
+
+ /xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
+ ], [VERSION, [NAME, 'MIUI Browser']], [
+
+ /\swv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
+ ], [[NAME, /(.+)/, '$1 WebView'], VERSION], [
+
+ /android.+samsungbrowser\/([\w\.]+)/i,
+ /android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser
+ ], [VERSION, [NAME, 'Android Browser']], [
+
+ /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i,
+ // Chrome/OmniWeb/Arora/Tizen/Nokia
+ /(qqbrowser)[\/\s]?([\w\.]+)/i
+ // QQBrowser
+ ], [NAME, VERSION], [
+
+ /(uc\s?browser)[\/\s]?([\w\.]+)/i,
+ /ucweb.+(ucbrowser)[\/\s]?([\w\.]+)/i,
+ /juc.+(ucweb)[\/\s]?([\w\.]+)/i
+ // UCBrowser
+ ], [[NAME, 'UCBrowser'], VERSION], [
+
+ /(dolfin)\/([\w\.]+)/i // Dolphin
+ ], [[NAME, 'Dolphin'], VERSION], [
+
+ /((?:android.+)crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
+ ], [[NAME, 'Chrome'], VERSION], [
+
+ /;fbav\/([\w\.]+);/i // Facebook App for iOS
+ ], [VERSION, [NAME, 'Facebook']], [
+
+ /fxios\/([\w\.-]+)/i // Firefox for iOS
+ ], [VERSION, [NAME, 'Firefox']], [
+
+ /version\/([\w\.]+).+?mobile\/\w+\s(safari)/i // Mobile Safari
+ ], [VERSION, [NAME, 'Mobile Safari']], [
+
+ /version\/([\w\.]+).+?(mobile\s?safari|safari)/i // Safari & Safari Mobile
+ ], [VERSION, NAME], [
+
+ /webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
+ ], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [
+
+ /(konqueror)\/([\w\.]+)/i, // Konqueror
+ /(webkit|khtml)\/([\w\.]+)/i
+ ], [NAME, VERSION], [
+
+ // Gecko based
+ /(navigator|netscape)\/([\w\.-]+)/i // Netscape
+ ], [[NAME, 'Netscape'], VERSION], [
+ /(swiftfox)/i, // Swiftfox
+ /(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,
+ // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
+ /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\/([\w\.-]+)/i,
+ // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
+ /(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i, // Mozilla
+
+ // Other
+ /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i,
+ // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir
+ /(links)\s\(([\w\.]+)/i, // Links
+ /(gobrowser)\/?([\w\.]+)*/i, // GoBrowser
+ /(ice\s?browser)\/v?([\w\._]+)/i, // ICE Browser
+ /(mosaic)[\/\s]([\w\.]+)/i // Mosaic
+ ], [NAME, VERSION]
+
+ /* /////////////////////
+ // Media players BEGIN
+ ////////////////////////
+
+ , [
+
+ /(apple(?:coremedia|))\/((\d+)[\w\._]+)/i, // Generic Apple CoreMedia
+ /(coremedia) v((\d+)[\w\._]+)/i
+ ], [NAME, VERSION], [
+
+ /(aqualung|lyssna|bsplayer)\/((\d+)?[\w\.-]+)/i // Aqualung/Lyssna/BSPlayer
+ ], [NAME, VERSION], [
+
+ /(ares|ossproxy)\s((\d+)[\w\.-]+)/i // Ares/OSSProxy
+ ], [NAME, VERSION], [
+
+ /(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\/((\d+)[\w\.-]+)/i,
+ // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC
+ // NSPlayer/PSP-InternetRadioPlayer/Videos
+ /(clementine|music player daemon)\s((\d+)[\w\.-]+)/i, // Clementine/MPD
+ /(lg player|nexplayer)\s((\d+)[\d\.]+)/i,
+ /player\/(nexplayer|lg player)\s((\d+)[\w\.-]+)/i // NexPlayer/LG Player
+ ], [NAME, VERSION], [
+ /(nexplayer)\s((\d+)[\w\.-]+)/i // Nexplayer
+ ], [NAME, VERSION], [
+
+ /(flrp)\/((\d+)[\w\.-]+)/i // Flip Player
+ ], [[NAME, 'Flip Player'], VERSION], [
+
+ /(fstream|nativehost|queryseekspider|ia-archiver|facebookexternalhit)/i
+ // FStream/NativeHost/QuerySeekSpider/IA Archiver/facebookexternalhit
+ ], [NAME], [
+
+ /(gstreamer) souphttpsrc (?:\([^\)]+\)){0,1} libsoup\/((\d+)[\w\.-]+)/i
+ // Gstreamer
+ ], [NAME, VERSION], [
+
+ /(htc streaming player)\s[\w_]+\s\/\s((\d+)[\d\.]+)/i, // HTC Streaming Player
+ /(java|python-urllib|python-requests|wget|libcurl)\/((\d+)[\w\.-_]+)/i,
+ // Java/urllib/requests/wget/cURL
+ /(lavf)((\d+)[\d\.]+)/i // Lavf (FFMPEG)
+ ], [NAME, VERSION], [
+
+ /(htc_one_s)\/((\d+)[\d\.]+)/i // HTC One S
+ ], [[NAME, /_/g, ' '], VERSION], [
+
+ /(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+){0,1})/i
+ // MPlayer SVN
+ ], [NAME, VERSION], [
+
+ /(mplayer)(?:\s|\/|[unkow-]+)((\d+)[\w\.-]+)/i // MPlayer
+ ], [NAME, VERSION], [
+
+ /(mplayer)/i, // MPlayer (no other info)
+ /(yourmuze)/i, // YourMuze
+ /(media player classic|nero showtime)/i // Media Player Classic/Nero ShowTime
+ ], [NAME], [
+
+ /(nero (?:home|scout))\/((\d+)[\w\.-]+)/i // Nero Home/Nero Scout
+ ], [NAME, VERSION], [
+
+ /(nokia\d+)\/((\d+)[\w\.-]+)/i // Nokia
+ ], [NAME, VERSION], [
+
+ /\s(songbird)\/((\d+)[\w\.-]+)/i // Songbird/Philips-Songbird
+ ], [NAME, VERSION], [
+
+ /(winamp)3 version ((\d+)[\w\.-]+)/i, // Winamp
+ /(winamp)\s((\d+)[\w\.-]+)/i,
+ /(winamp)mpeg\/((\d+)[\w\.-]+)/i
+ ], [NAME, VERSION], [
+
+ /(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
+ // inlight radio
+ ], [NAME], [
+
+ /(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/((\d+)[\w\.-]+)/i
+ // QuickTime/RealMedia/RadioApp/RadioClientApplication/
+ // SoundTap/Totem/Stagefright/Streamium
+ ], [NAME, VERSION], [
+
+ /(smp)((\d+)[\d\.]+)/i // SMP
+ ], [NAME, VERSION], [
+
+ /(vlc) media player - version ((\d+)[\w\.]+)/i, // VLC Videolan
+ /(vlc)\/((\d+)[\w\.-]+)/i,
+ /(xbmc|gvfs|xine|xmms|irapp)\/((\d+)[\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp
+ /(foobar2000)\/((\d+)[\d\.]+)/i, // Foobar2000
+ /(itunes)\/((\d+)[\d\.]+)/i // iTunes
+ ], [NAME, VERSION], [
+
+ /(wmplayer)\/((\d+)[\w\.-]+)/i, // Windows Media Player
+ /(windows-media-player)\/((\d+)[\w\.-]+)/i
+ ], [[NAME, /-/g, ' '], VERSION], [
+
+ /windows\/((\d+)[\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i
+ // Windows Media Server
+ ], [VERSION, [NAME, 'Windows']], [
+
+ /(com\.riseupradioalarm)\/((\d+)[\d\.]*)/i // RiseUP Radio Alarm
+ ], [NAME, VERSION], [
+
+ /(rad.io)\s((\d+)[\d\.]+)/i, // Rad.io
+ /(radio.(?:de|at|fr))\s((\d+)[\d\.]+)/i
+ ], [[NAME, 'rad.io'], VERSION]
+
+ //////////////////////
+ // Media players END
+ ////////////////////*/
+
+ ],
+
+ cpu : [[
+
+ /(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i // AMD64
+ ], [[ARCHITECTURE, 'amd64']], [
+
+ /(ia32(?=;))/i // IA32 (quicktime)
+ ], [[ARCHITECTURE, util.lowerize]], [
+
+ /((?:i[346]|x)86)[;\)]/i // IA32
+ ], [[ARCHITECTURE, 'ia32']], [
+
+ // PocketPC mistakenly identified as PowerPC
+ /windows\s(ce|mobile);\sppc;/i
+ ], [[ARCHITECTURE, 'arm']], [
+
+ /((?:ppc|powerpc)(?:64)?)(?:\smac|;|\))/i // PowerPC
+ ], [[ARCHITECTURE, /ower/, '', util.lowerize]], [
+
+ /(sun4\w)[;\)]/i // SPARC
+ ], [[ARCHITECTURE, 'sparc']], [
+
+ /((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+;))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i
+ // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
+ ], [[ARCHITECTURE, util.lowerize]]
+ ],
+
+ device : [[
+
+ /\((ipad|playbook);[\w\s\);-]+(rim|apple)/i // iPad/PlayBook
+ ], [MODEL, VENDOR, [TYPE, TABLET]], [
+
+ /applecoremedia\/[\w\.]+ \((ipad)/ // iPad
+ ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [
+
+ /(apple\s{0,1}tv)/i // Apple TV
+ ], [[MODEL, 'Apple TV'], [VENDOR, 'Apple']], [
+
+ /(archos)\s(gamepad2?)/i, // Archos
+ /(hp).+(touchpad)/i, // HP TouchPad
+ /(hp).+(tablet)/i, // HP Tablet
+ /(kindle)\/([\w\.]+)/i, // Kindle
+ /\s(nook)[\w\s]+build\/(\w+)/i, // Nook
+ /(dell)\s(strea[kpr\s\d]*[\dko])/i // Dell Streak
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
+
+ /(kf[A-z]+)\sbuild\/[\w\.]+.*silk\//i // Kindle Fire HD
+ ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
+ /(sd|kf)[0349hijorstuw]+\sbuild\/[\w\.]+.*silk\//i // Fire Phone
+ ], [[MODEL, mapper.str, maps.device.amazon.model], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
+
+ /\((ip[honed|\s\w*]+);.+(apple)/i // iPod/iPhone
+ ], [MODEL, VENDOR, [TYPE, MOBILE]], [
+ /\((ip[honed|\s\w*]+);/i // iPod/iPhone
+ ], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [
+
+ /(blackberry)[\s-]?(\w+)/i, // BlackBerry
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|huawei|meizu|motorola|polytron)[\s_-]?([\w-]+)*/i,
+ // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Huawei/Meizu/Motorola/Polytron
+ /(hp)\s([\w\s]+\w)/i, // HP iPAQ
+ /(asus)-?(\w+)/i // Asus
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
+ /\(bb10;\s(\w+)/i // BlackBerry 10
+ ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
+ // Asus Tablets
+ /android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone)/i
+ ], [MODEL, [VENDOR, 'Asus'], [TYPE, TABLET]], [
+
+ /(sony)\s(tablet\s[ps])\sbuild\//i, // Sony
+ /(sony)?(?:sgp.+)\sbuild\//i
+ ], [[VENDOR, 'Sony'], [MODEL, 'Xperia Tablet'], [TYPE, TABLET]], [
+ /(?:sony)?(?:(?:(?:c|d)\d{4})|(?:so[-l].+))\sbuild\//i
+ ], [[VENDOR, 'Sony'], [MODEL, 'Xperia Phone'], [TYPE, MOBILE]], [
+
+ /\s(ouya)\s/i, // Ouya
+ /(nintendo)\s([wids3u]+)/i // Nintendo
+ ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
+
+ /android.+;\s(shield)\sbuild/i // Nvidia
+ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
+
+ /(playstation\s[34portablevi]+)/i // Playstation
+ ], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [
+
+ /(sprint\s(\w+))/i // Sprint Phones
+ ], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [
+
+ /(lenovo)\s?(S(?:5000|6000)+(?:[-][\w+]))/i // Lenovo tablets
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
+
+ /(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i, // HTC
+ /(zte)-(\w+)*/i, // ZTE
+ /(alcatel|geeksphone|huawei|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i
+ // Alcatel/GeeksPhone/Huawei/Lenovo/Nexian/Panasonic/Sony
+ ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
+
+ /(nexus\s9)/i // HTC Nexus 9
+ ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
+
+ /(nexus\s6p)/i // Huawei Nexus 6P
+ ], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
+
+ /(microsoft);\s(lumia[\s\w]+)/i // Microsoft Lumia
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
+
+ /[\s\(;](xbox(?:\sone)?)[\s\);]/i // Microsoft Xbox
+ ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [
+ /(kin\.[onetw]{3})/i // Microsoft Kin
+ ], [[MODEL, /\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [
+
+ // Motorola
+ /\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?(:?\s4g)?)[\w\s]+build\//i,
+ /mot[\s-]?(\w+)*/i,
+ /(XT\d{3,4}) build\//i,
+ /(nexus\s6)/i
+ ], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [
+ /android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i
+ ], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [
+
+ /hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i // HbbTV devices
+ ], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [
+
+ /hbbtv.+maple;(\d+)/i
+ ], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [
+
+ /\(dtv[\);].+(aquos)/i // Sharp
+ ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
+
+ /android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i,
+ /((SM-T\w+))/i
+ ], [[VENDOR, 'Samsung'], MODEL, [TYPE, TABLET]], [ // Samsung
+ /smart-tv.+(samsung)/i
+ ], [VENDOR, [TYPE, SMARTTV], MODEL], [
+ /((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i,
+ /(sam[sung]*)[\s-]*(\w+-?[\w-]*)*/i,
+ /sec-((sgh\w+))/i
+ ], [[VENDOR, 'Samsung'], MODEL, [TYPE, MOBILE]], [
+
+ /sie-(\w+)*/i // Siemens
+ ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
+
+ /(maemo|nokia).*(n900|lumia\s\d+)/i, // Nokia
+ /(nokia)[\s_-]?([\w-]+)*/i
+ ], [[VENDOR, 'Nokia'], MODEL, [TYPE, MOBILE]], [
+
+ /android\s3\.[\s\w;-]{10}(a\d{3})/i // Acer
+ ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
+
+ /android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i // LG Tablet
+ ], [[VENDOR, 'LG'], MODEL, [TYPE, TABLET]], [
+ /(lg) netcast\.tv/i // LG SmartTV
+ ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
+ /(nexus\s[45])/i, // LG
+ /lg[e;\s\/-]+(\w+)*/i
+ ], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
+
+ /android.+(ideatab[a-z0-9\-\s]+)/i // Lenovo
+ ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
+
+ /linux;.+((jolla));/i // Jolla
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
+
+ /((pebble))app\/[\d\.]+\s/i // Pebble
+ ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
+
+ /android.+;\s(glass)\s\d/i // Google Glass
+ ], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
+
+ /android.+(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
+ /android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Hongmi
+ /android.+(mi[\s\-_]*(?:one|one[\s_]plus|note lte)?[\s_]*(?:\d\w)?)\s+build/i // Xiaomi Mi
+ ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
+
+ /android.+a000(1)\s+build/i // OnePlus
+ ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
+
+ /\s(tablet)[;\/]/i, // Unidentifiable Tablet
+ /\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
+ ], [[TYPE, util.lowerize], VENDOR, MODEL]
+
+ /*//////////////////////////
+ // TODO: move to string map
+ ////////////////////////////
+
+ /(C6603)/i // Sony Xperia Z C6603
+ ], [[MODEL, 'Xperia Z C6603'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [
+ /(C6903)/i // Sony Xperia Z 1
+ ], [[MODEL, 'Xperia Z 1'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [
+
+ /(SM-G900[F|H])/i // Samsung Galaxy S5
+ ], [[MODEL, 'Galaxy S5'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
+ /(SM-G7102)/i // Samsung Galaxy Grand 2
+ ], [[MODEL, 'Galaxy Grand 2'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
+ /(SM-G530H)/i // Samsung Galaxy Grand Prime
+ ], [[MODEL, 'Galaxy Grand Prime'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
+ /(SM-G313HZ)/i // Samsung Galaxy V
+ ], [[MODEL, 'Galaxy V'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
+ /(SM-T805)/i // Samsung Galaxy Tab S 10.5
+ ], [[MODEL, 'Galaxy Tab S 10.5'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
+ /(SM-G800F)/i // Samsung Galaxy S5 Mini
+ ], [[MODEL, 'Galaxy S5 Mini'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
+ /(SM-T311)/i // Samsung Galaxy Tab 3 8.0
+ ], [[MODEL, 'Galaxy Tab 3 8.0'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
+
+ /(R1001)/i // Oppo R1001
+ ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [
+ /(X9006)/i // Oppo Find 7a
+ ], [[MODEL, 'Find 7a'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [
+ /(R2001)/i // Oppo YOYO R2001
+ ], [[MODEL, 'Yoyo R2001'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [
+ /(R815)/i // Oppo Clover R815
+ ], [[MODEL, 'Clover R815'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [
+ /(U707)/i // Oppo Find Way S
+ ], [[MODEL, 'Find Way S'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [
+
+ /(T3C)/i // Advan Vandroid T3C
+ ], [MODEL, [VENDOR, 'Advan'], [TYPE, TABLET]], [
+ /(ADVAN T1J\+)/i // Advan Vandroid T1J+
+ ], [[MODEL, 'Vandroid T1J+'], [VENDOR, 'Advan'], [TYPE, TABLET]], [
+ /(ADVAN S4A)/i // Advan Vandroid S4A
+ ], [[MODEL, 'Vandroid S4A'], [VENDOR, 'Advan'], [TYPE, MOBILE]], [
+
+ /(V972M)/i // ZTE V972M
+ ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
+
+ /(i-mobile)\s(IQ\s[\d\.]+)/i // i-mobile IQ
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
+ /(IQ6.3)/i // i-mobile IQ IQ 6.3
+ ], [[MODEL, 'IQ 6.3'], [VENDOR, 'i-mobile'], [TYPE, MOBILE]], [
+ /(i-mobile)\s(i-style\s[\d\.]+)/i // i-mobile i-STYLE
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
+ /(i-STYLE2.1)/i // i-mobile i-STYLE 2.1
+ ], [[MODEL, 'i-STYLE 2.1'], [VENDOR, 'i-mobile'], [TYPE, MOBILE]], [
+
+ /(mobiistar touch LAI 512)/i // mobiistar touch LAI 512
+ ], [[MODEL, 'Touch LAI 512'], [VENDOR, 'mobiistar'], [TYPE, MOBILE]], [
+
+ /////////////
+ // END TODO
+ ///////////*/
+
+ ],
+
+ engine : [[
+
+ /windows.+\sedge\/([\w\.]+)/i // EdgeHTML
+ ], [VERSION, [NAME, 'EdgeHTML']], [
+
+ /(presto)\/([\w\.]+)/i, // Presto
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m
+ /(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, // KHTML/Tasman/Links
+ /(icab)[\/\s]([23]\.[\d\.]+)/i // iCab
+ ], [NAME, VERSION], [
+
+ /rv\:([\w\.]+).*(gecko)/i // Gecko
+ ], [VERSION, NAME]
+ ],
+
+ os : [[
+
+ // Windows based
+ /microsoft\s(windows)\s(vista|xp)/i // Windows (iTunes)
+ ], [NAME, VERSION], [
+ /(windows)\snt\s6\.2;\s(arm)/i, // Windows RT
+ /(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s]+\w)*/i, // Windows Phone
+ /(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i
+ ], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [
+ /(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i
+ ], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [
+
+ // Mobile/Embedded OS
+ /\((bb)(10);/i // BlackBerry 10
+ ], [[NAME, 'BlackBerry'], VERSION], [
+ /(blackberry)\w*\/?([\w\.]+)*/i, // Blackberry
+ /(tizen)[\/\s]([\w\.]+)/i, // Tizen
+ /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i,
+ // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki
+ /linux;.+(sailfish);/i // Sailfish OS
+ ], [NAME, VERSION], [
+ /(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i // Symbian
+ ], [[NAME, 'Symbian'], VERSION], [
+ /\((series40);/i // Series 40
+ ], [NAME], [
+ /mozilla.+\(mobile;.+gecko.+firefox/i // Firefox OS
+ ], [[NAME, 'Firefox OS'], VERSION], [
+
+ // Console
+ /(nintendo|playstation)\s([wids34portablevu]+)/i, // Nintendo/Playstation
+
+ // GNU/Linux based
+ /(mint)[\/\s\(]?(\w+)*/i, // Mint
+ /(mageia|vectorlinux)[;\s]/i, // Mageia/VectorLinux
+ /(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?(?!chrom)([\w\.-]+)*/i,
+ // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
+ // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus
+ /(hurd|linux)\s?([\w\.]+)*/i, // Hurd/Linux
+ /(gnu)\s?([\w\.]+)*/i // GNU
+ ], [NAME, VERSION], [
+
+ /(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS
+ ], [[NAME, 'Chromium OS'], VERSION],[
+
+ // Solaris
+ /(sunos)\s?([\w\.]+\d)*/i // Solaris
+ ], [[NAME, 'Solaris'], VERSION], [
+
+ // BSD based
+ /\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
+ ], [NAME, VERSION],[
+
+ /(haiku)\s(\w+)/i // Haiku
+ ], [NAME, VERSION],[
+
+ /(ip[honead]+)(?:.*os\s([\w]+)*\slike\smac|;\sopera)/i // iOS
+ ], [[NAME, 'iOS'], [VERSION, /_/g, '.']], [
+
+ /(mac\sos\sx)\s?([\w\s\.]+\w)*/i,
+ /(macintosh|mac(?=_powerpc)\s)/i // Mac OS
+ ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
+
+ // Other
+ /((?:open)?solaris)[\/\s-]?([\w\.]+)*/i, // Solaris
+ /(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i, // AIX
+ /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i,
+ // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS
+ /(unix)\s?([\w\.]+)*/i // UNIX
+ ], [NAME, VERSION]
+ ]
+ };
+
+
+ /////////////////
+ // Constructor
+ ////////////////
+
+
+ var UAParser = function (uastring, extensions) {
+
+ if (!(this instanceof UAParser)) {
+ return new UAParser(uastring, extensions).getResult();
+ }
+
+ var ua = uastring || ((window && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
+ var rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
+
+ this.getBrowser = function () {
+ var browser = mapper.rgx.apply(this, rgxmap.browser);
+ browser.major = util.major(browser.version);
+ return browser;
+ };
+ this.getCPU = function () {
+ return mapper.rgx.apply(this, rgxmap.cpu);
+ };
+ this.getDevice = function () {
+ return mapper.rgx.apply(this, rgxmap.device);
+ };
+ this.getEngine = function () {
+ return mapper.rgx.apply(this, rgxmap.engine);
+ };
+ this.getOS = function () {
+ return mapper.rgx.apply(this, rgxmap.os);
+ };
+ this.getResult = function() {
+ return {
+ ua : this.getUA(),
+ browser : this.getBrowser(),
+ engine : this.getEngine(),
+ os : this.getOS(),
+ device : this.getDevice(),
+ cpu : this.getCPU()
+ };
+ };
+ this.getUA = function () {
+ return ua;
+ };
+ this.setUA = function (uastring) {
+ ua = uastring;
+ return this;
+ };
+ return this;
+ };
+
+ UAParser.VERSION = LIBVERSION;
+ UAParser.BROWSER = {
+ NAME : NAME,
+ MAJOR : MAJOR, // deprecated
+ VERSION : VERSION
+ };
+ UAParser.CPU = {
+ ARCHITECTURE : ARCHITECTURE
+ };
+ UAParser.DEVICE = {
+ MODEL : MODEL,
+ VENDOR : VENDOR,
+ TYPE : TYPE,
+ CONSOLE : CONSOLE,
+ MOBILE : MOBILE,
+ SMARTTV : SMARTTV,
+ TABLET : TABLET,
+ WEARABLE: WEARABLE,
+ EMBEDDED: EMBEDDED
+ };
+ UAParser.ENGINE = {
+ NAME : NAME,
+ VERSION : VERSION
+ };
+ UAParser.OS = {
+ NAME : NAME,
+ VERSION : VERSION
+ };
+
+
+ ///////////
+ // Export
+ //////////
+
+
+ // check js environment
+ if (typeof(exports) !== UNDEF_TYPE) {
+ // nodejs env
+ if (typeof module !== UNDEF_TYPE && module.exports) {
+ exports = module.exports = UAParser;
+ }
+ exports.UAParser = UAParser;
+ } else {
+ // requirejs env (optional)
+ if (typeof(define) === FUNC_TYPE && define.amd) {
+ define(function () {
+ return UAParser;
+ });
+ } else {
+ // browser env
+ window.UAParser = UAParser;
+ }
+ }
+
+ // jQuery/Zepto specific (optional)
+ // Note:
+ // In AMD env the global scope should be kept clean, but jQuery is an exception.
+ // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
+ // and we should catch that.
+ var $ = window.jQuery || window.Zepto;
+ if (typeof $ !== UNDEF_TYPE) {
+ var parser = new UAParser();
+ $.ua = parser.getResult();
+ $.ua.get = function() {
+ return parser.getUA();
+ };
+ $.ua.set = function (uastring) {
+ parser.setUA(uastring);
+ var result = parser.getResult();
+ for (var prop in result) {
+ $.ua[prop] = result[prop];
+ }
+ };
+ }
+
+})(typeof window === 'object' ? window : this);
diff --git a/node_modules/ua-parser-js/test/browser-test.json b/node_modules/ua-parser-js/test/browser-test.json
new file mode 100644
index 000000000..8a01e881b
--- /dev/null
+++ b/node_modules/ua-parser-js/test/browser-test.json
@@ -0,0 +1,842 @@
+[
+ {
+ "desc" : "Android Browser on Galaxy Nexus",
+ "ua" : "Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
+ "expect" :
+ {
+ "name" : "Android Browser",
+ "version" : "4.0",
+ "major" : "4"
+ }
+ },
+ {
+ "desc" : "Android Browser on Galaxy S3",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.4.4; en-us; SAMSUNG GT-I9300I Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Mobile Safari/537.36",
+ "expect" :
+ {
+ "name" : "Android Browser",
+ "version" : "1.5",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "Android Browser on HTC Flyer (P510E)",
+ "ua" : "Mozilla/5.0 (Linux; U; Android 3.2.1; ru-ru; HTC Flyer P510e Build/HTK75C) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
+ "expect" :
+ {
+ "name" : "Android Browser",
+ "version" : "4.0",
+ "major" : "4"
+ }
+ },
+ {
+ "desc" : "Android Browser on Huawei Honor Glory II (U9508)",
+ "ua" : "Mozilla/5.0 (Linux; U; Android 4.0.4; ru-by; HUAWEI U9508 Build/HuaweiU9508) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 ACHEETAHI/2100050044",
+ "expect" :
+ {
+ "name" : "Android Browser",
+ "version" : "4.0",
+ "major" : "4"
+ }
+ },
+ {
+ "desc" : "Android Browser on Huawei P8 (H891L)",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.4.4; HUAWEI H891L Build/HuaweiH891L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36",
+ "expect" :
+ {
+ "name" : "Android Browser",
+ "version" : "4.0",
+ "major" : "4"
+ }
+ },
+ {
+ "desc" : "Android Browser on Samsung S6 (SM-G925F)",
+ "ua" : "Mozilla/5.0 (Linux; Android 5.0.2; SAMSUNG SM-G925F Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/3.0 Chrome/38.0.2125.102 Mobile Safari/537.36",
+ "expect" :
+ {
+ "name" : "Android Browser",
+ "version" : "3.0",
+ "major" : "3"
+ }
+ },
+ {
+ "desc" : "Arora",
+ "ua" : "Mozilla/5.0 (Windows; U; Windows NT 5.1; de-CH) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.2",
+ "expect" :
+ {
+ "name" : "Arora",
+ "version" : "0.2",
+ "major" : "0"
+ }
+ },
+ {
+ "desc" : "Avant",
+ "ua" : "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB5; Avant Browser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
+ "expect" :
+ {
+ "name" : "Avant ",
+ "version" : "undefined",
+ "major" : "undefined"
+ }
+ },
+ {
+ "desc" : "Baidu",
+ "ua" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; baidubrowser 1.x)",
+ "expect" :
+ {
+ "name" : "baidu",
+ "version" : "1.x",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "Bolt",
+ "ua" : "Mozilla/5.0 (X11; 78; CentOS; US-en) AppleWebKit/527+ (KHTML, like Gecko) Bolt/0.862 Version/3.0 Safari/523.15",
+ "expect" :
+ {
+ "name" : "Bolt",
+ "version" : "0.862",
+ "major" : "0"
+ }
+ },
+ {
+ "desc" : "Camino",
+ "ua" : "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; en; rv:1.9.0.19) Gecko/2011091218 Camino/2.0.9 (like Firefox/3.0.19)",
+ "expect" :
+ {
+ "name" : "Camino",
+ "version" : "2.0.9",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "Chimera",
+ "ua" : "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; pl-PL; rv:1.0.1) Gecko/20021111 Chimera/0.6",
+ "expect" :
+ {
+ "name" : "Chimera",
+ "version" : "0.6",
+ "major" : "0"
+ }
+ },
+ {
+ "desc" : "Chrome",
+ "ua" : "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
+ "expect" :
+ {
+ "name" : "Chrome",
+ "version" : "20.0.1090.0",
+ "major" : "20"
+ }
+ },
+ {
+ "desc" : "Chrome WebView",
+ "ua" : "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.65 Mobile Safari/537.36",
+ "expect" :
+ {
+ "name" : "Chrome WebView",
+ "version" : "43.0.2357.65",
+ "major" : "43"
+ }
+ },
+ {
+ "desc" : "Chrome on iOS",
+ "ua" : "Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3",
+ "expect" :
+ {
+ "name" : "Chrome",
+ "version" : "19.0.1084.60",
+ "major" : "19"
+ }
+ },
+ {
+ "desc" : "Chromium",
+ "ua" : "Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Ubuntu/11.10 Chromium/16.0.912.21 Chrome/16.0.912.21 Safari/535.7",
+ "expect" :
+ {
+ "name" : "Chromium",
+ "version" : "16.0.912.21",
+ "major" : "16"
+ }
+ },
+ {
+ "desc" : "Chrome on Android",
+ "ua" : "Mozilla/5.0 (Linux; U; Android-4.0.3; en-us; Galaxy Nexus Build/IML74K) AppleWebKit/535.7 (KHTML, like Gecko) CrMo/16.0.912.75 Mobile Safari/535.7",
+ "expect" :
+ {
+ "name" : "Chrome",
+ "version" : "16.0.912.75",
+ "major" : "16"
+ }
+ },
+ {
+ "desc" : "Dillo",
+ "ua" : "Dillo/2.2",
+ "expect" :
+ {
+ "name" : "Dillo",
+ "version" : "2.2",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "Dolphin",
+ "ua" : "Mozilla/5.0 (SCH-F859/F859DG12;U;NUCLEUS/2.1;Profile/MIDP-2.1 Configuration/CLDC-1.1;480*800;CTC/2.0) Dolfin/2.0",
+ "expect" :
+ {
+ "name" : "Dolphin",
+ "version" : "2.0",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "Doris",
+ "ua" : "Doris/1.15 [en] (Symbian)",
+ "expect" :
+ {
+ "name" : "Doris",
+ "version" : "1.15",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "Epiphany",
+ "ua" : "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7) Gecko/20040628 Epiphany/1.2.6",
+ "expect" :
+ {
+ "name" : "Epiphany",
+ "version" : "1.2.6",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "Facebook in-App Browser",
+ "ua" : "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.121 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/35.0.0.48.273;]",
+ "expect" :
+ {
+ "name" : "Chrome WebView",
+ "version" : "43.0.2357.121",
+ "major" : "43"
+ }
+ },
+ {
+ "desc" : "Firebird",
+ "ua" : "Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.5) Gecko/20031007 Firebird/0.7",
+ "expect" :
+ {
+ "name" : "Firebird",
+ "version" : "0.7",
+ "major" : "0"
+ }
+ },
+ {
+ "desc" : "Firefox",
+ "ua" : "Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20120716 Firefox/15.0a2",
+ "expect" :
+ {
+ "name" : "Firefox",
+ "version" : "15.0a2",
+ "major" : "15"
+ }
+ },
+ {
+ "desc" : "Fennec",
+ "ua" : "Mozilla/5.0 (X11; U; Linux armv61; en-US; rv:1.9.1b2pre) Gecko/20081015 Fennec/1.0a1",
+ "expect" :
+ {
+ "name" : "Fennec",
+ "version" : "1.0a1",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "Flock",
+ "ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008100716 Firefox/3.0.3 Flock/2.0",
+ "expect" :
+ {
+ "name" : "Flock",
+ "version" : "2.0",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "GoBrowser",
+ "ua" : "Nokia5700XpressMusic/GoBrowser/1.6.91",
+ "expect" :
+ {
+ "name" : "GoBrowser",
+ "version" : "1.6.91",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "IceApe",
+ "ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.19) Gecko/20110817 Iceape/2.0.14",
+ "expect" :
+ {
+ "name" : "Iceape",
+ "version" : "2.0.14",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "IceCat",
+ "ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008092921 IceCat/3.0.3-g1",
+ "expect" :
+ {
+ "name" : "IceCat",
+ "version" : "3.0.3-g1",
+ "major" : "3"
+ }
+ },
+ {
+ "desc" : "Iceweasel",
+ "ua" : "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.16) Gecko/2009121610 Iceweasel/3.0.6 (Debian-3.0.6-3)",
+ "expect" :
+ {
+ "name" : "Iceweasel",
+ "version" : "3.0.6",
+ "major" : "3"
+ }
+ },
+ {
+ "desc" : "iCab",
+ "ua" : "iCab/2.9.5 (Macintosh; U; PPC; Mac OS X)",
+ "expect" :
+ {
+ "name" : "iCab",
+ "version" : "2.9.5",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "IEMobile",
+ "ua" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11) 320x240; VZW; Motorola-Q9c; Windows Mobile 6.1 Standard",
+ "expect" :
+ {
+ "name" : "IEMobile",
+ "version" : "7.11",
+ "major" : "7"
+ }
+ },
+ {
+ "desc" : "IE 11 with IE token",
+ "ua" : "Mozilla/5.0 (IE 11.0; Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko",
+ "expect" :
+ {
+ "name" : "IE",
+ "version" : "11.0",
+ "major" : "11"
+ }
+ },
+ {
+ "desc" : "IE 11 without IE token",
+ "ua" : "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko",
+ "expect" :
+ {
+ "name" : "IE",
+ "version" : "11.0",
+ "major" : "11"
+ }
+ },
+ {
+ "desc" : "K-Meleon",
+ "ua" : "Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.5) Gecko/20031016 K-Meleon/0.8.2",
+ "expect" :
+ {
+ "name" : "K-Meleon",
+ "version" : "0.8.2",
+ "major" : "0"
+ }
+ },
+ {
+ "desc" : "Kindle Browser",
+ "ua" : "Mozilla/4.0 (compatible; Linux 2.6.22) NetFront/3.4 Kindle/2.5 (screen 600x800; rotate)",
+ "expect" :
+ {
+ "name" : "Kindle",
+ "version" : "2.5",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "Konqueror",
+ "ua" : "Mozilla/5.0 (compatible; Konqueror/3.5; Linux; X11; x86_64) KHTML/3.5.6 (like Gecko) (Kubuntu)",
+ "expect" :
+ {
+ "name" : "Konqueror",
+ "version" : "3.5",
+ "major" : "3"
+ }
+ },
+ {
+ "desc" : "Lunascape",
+ "ua" : "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.2) Gecko/20090804 Firefox/3.5.2 Lunascape/5.1.4.5",
+ "expect" :
+ {
+ "name" : "Lunascape",
+ "version" : "5.1.4.5",
+ "major" : "5"
+ }
+ },
+ {
+ "desc" : "Lynx",
+ "ua" : "Lynx/2.8.5dev.16 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.6b",
+ "expect" :
+ {
+ "name" : "Lynx",
+ "version" : "2.8.5dev.16",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "Maemo Browser",
+ "ua" : "Mozilla/5.0 (X11; U; Linux armv7l; ru-RU; rv:1.9.2.3pre) Gecko/20100723 Firefox/3.5 Maemo Browser 1.7.4.8 RX-51 N900",
+ "expect" :
+ {
+ "name" : "Maemo Browser",
+ "version" : "1.7.4.8",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "Maxthon",
+ "ua" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)",
+ "expect" :
+ {
+ "name" : "Maxthon",
+ "version" : "undefined",
+ "major" : "undefined"
+ }
+ },
+ {
+ "desc" : "Midori",
+ "ua" : "Midori/0.2.2 (X11; Linux i686; U; en-us) WebKit/531.2+",
+ "expect" :
+ {
+ "name" : "Midori",
+ "version" : "0.2.2",
+ "major" : "0"
+ }
+ },
+ {
+ "desc" : "Minimo",
+ "ua" : "Mozilla/5.0 (X11; U; Linux armv6l; rv 1.8.1.5pre) Gecko/20070619 Minimo/0.020",
+ "expect" :
+ {
+ "name" : "Minimo",
+ "version" : "0.020",
+ "major" : "0"
+ }
+ },
+ {
+ "desc" : "MIUI Browser on Xiaomi Hongmi WCDMA (HM2013023)",
+ "ua" : "Mozilla/5.0 (Linux; U; Android 4.2.2; ru-ru; 2013023 Build/HM2013023) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0",
+ "expect" :
+ {
+ "name" : "MIUI Browser",
+ "version" : "1.0",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "Mobile Safari",
+ "ua" : "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7",
+ "expect" :
+ {
+ "name" : "Mobile Safari",
+ "version" : "4.0.5",
+ "major" : "4"
+ }
+ },
+ {
+ "desc" : "Mosaic",
+ "ua" : "NCSA_Mosaic/2.6 (X11; SunOS 4.1.3 sun4m)",
+ "expect" :
+ {
+ "name" : "Mosaic",
+ "version" : "2.6",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "Mozilla",
+ "ua" : "Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.7) Gecko/20070606",
+ "expect" :
+ {
+ "name" : "Mozilla",
+ "version" : "5.0",
+ "major" : "5"
+ }
+ },
+ {
+ "desc" : "MSIE",
+ "ua" : "Mozilla/4.0 (compatible; MSIE 5.0b1; Mac_PowerPC)",
+ "expect" :
+ {
+ "name" : "IE",
+ "version" : "5.0b1",
+ "major" : "5"
+ }
+ },
+ {
+ "desc" : "NetFront",
+ "ua" : "Mozilla/4.0 (PDA; Windows CE/1.0.1) NetFront/3.0",
+ "expect" :
+ {
+ "name" : "NetFront",
+ "version" : "3.0",
+ "major" : "3"
+ }
+ },
+ {
+ "desc" : "Netscape on Windows ME",
+ "ua" : "Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.8.1.8pre) Gecko/20071015 Firefox/2.0.0.7 Navigator/9.0",
+ "expect" :
+ {
+ "name" : "Netscape",
+ "version" : "9.0",
+ "major" : "9"
+ }
+ },
+ {
+ "desc" : "Netscape on Windows 2000",
+ "ua" : "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.5) Gecko/20050519 Netscape/8.0.1",
+ "expect" :
+ {
+ "name" : "Netscape",
+ "version" : "8.0.1",
+ "major" : "8"
+ }
+ },
+ {
+ "desc" : "Nokia Browser",
+ "ua" : "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaN8-00/025.007; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.37 Mobile Safari/533.4 3gpp-gba",
+ "expect" :
+ {
+ "name" : "NokiaBrowser",
+ "version" : "7.3.1.37",
+ "major" : "7"
+ }
+ },
+ {
+ "desc" : "OmniWeb",
+ "ua" : "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v558.48",
+ "expect" :
+ {
+ "name" : "OmniWeb",
+ "version" : "558.48",
+ "major" : "558"
+ }
+ },
+ {
+ "desc" : "Opera > 9.80",
+ "ua" : "Opera/9.80 (X11; Linux x86_64; U; Linux Mint; en) Presto/2.2.15 Version/10.10",
+ "expect" :
+ {
+ "name" : "Opera",
+ "version" : "10.10",
+ "major" : "10"
+ }
+ },
+ {
+ "desc" : "Opera < 9.80 on Windows",
+ "ua" : "Mozilla/4.0 (compatible; MSIE 5.0; Windows 95) Opera 6.01 [en]",
+ "expect" :
+ {
+ "name" : "Opera",
+ "version" : "6.01",
+ "major" : "6"
+ }
+ },
+ {
+ "desc" : "Opera < 9.80 on OSX",
+ "ua" : "Opera/8.5 (Macintosh; PPC Mac OS X; U; en)",
+ "expect" :
+ {
+ "name" : "Opera",
+ "version" : "8.5",
+ "major" : "8"
+ }
+ },
+ {
+ "desc" : "Opera Mobile",
+ "ua" : "Opera/9.80 (Android 2.3.5; Linux; Opera Mobi/ADR-1111101157; U; de) Presto/2.9.201 Version/11.50",
+ "expect" :
+ {
+ "name" : "Opera Mobi",
+ "version" : "11.50",
+ "major" : "11"
+ }
+ },
+ {
+ "desc" : "Opera Webkit",
+ "ua" : "Mozilla/5.0 AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.123 Mobile Safari/537.22 OPR/14.0.1025.52315",
+ "expect" :
+ {
+ "name" : "Opera",
+ "version" : "14.0.1025.52315",
+ "major" : "14"
+ }
+ },
+ {
+ "desc" : "Opera Mini",
+ "ua" : "Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21214/19.916; U; en) Presto/2.5.25",
+ "expect" :
+ {
+ "name" : "Opera Mini",
+ "version" : "5.1.21214",
+ "major" : "5"
+ }
+ },
+ {
+ "desc" : "Opera Mini 8 above on iPhone",
+ "ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) OPiOS/12.1.1.98980 Mobile/13C75 Safari/9537.53",
+ "expect" :
+ {
+ "name" : "Opera Mini",
+ "version" : "12.1.1.98980",
+ "major" : "12"
+ }
+ },
+ {
+ "desc" : "Opera Tablet",
+ "ua" : "Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1",
+ "expect" :
+ {
+ "name" : "Opera Tablet",
+ "version" : "11.1",
+ "major" : "11"
+ }
+ },
+ {
+ "desc" : "PhantomJS",
+ "ua" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.2 Safari/534.34",
+ "expect" :
+ {
+ "name" : "PhantomJS",
+ "version" : "1.9.2",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "Phoenix",
+ "ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2b) Gecko/20021029 Phoenix/0.4",
+ "expect" :
+ {
+ "name" : "Phoenix",
+ "version" : "0.4",
+ "major" : "0"
+ }
+ },
+ {
+ "desc" : "Polaris",
+ "ua" : "LG-LX600 Polaris/6.0 MMP/2.0 Profile/MIDP-2.1 Configuration/CLDC-1.1",
+ "expect" :
+ {
+ "name" : "Polaris",
+ "version" : "6.0",
+ "major" : "6"
+ }
+ },
+ {
+ "desc" : "RockMelt",
+ "ua" : "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) RockMelt/0.8.36.78 Chrome/7.0.517.44 Safari/534.7",
+ "expect" :
+ {
+ "name" : "RockMelt",
+ "version" : "0.8.36.78",
+ "major" : "0"
+ }
+ },
+ {
+ "desc" : "Safari",
+ "ua" : "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8",
+ "expect" :
+ {
+ "name" : "Safari",
+ "version" : "5.0.1",
+ "major" : "5"
+ }
+ },
+ {
+ "desc" : "Safari < 3.0",
+ "ua" : "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/419 (KHTML, like Gecko) Safari/419.3",
+ "expect" :
+ {
+ "name" : "Safari",
+ "version" : "2.0.4",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "SeaMonkey",
+ "ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b4pre) Gecko/20090405 SeaMonkey/2.0b1pre",
+ "expect" :
+ {
+ "name" : "SeaMonkey",
+ "version" : "2.0b1pre",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "Silk Browser",
+ "ua" : "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.1.0-84)",
+ "expect" :
+ {
+ "name" : "Silk",
+ "version" : "1.1.0-84",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "Skyfire",
+ "ua" : "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Safari/530.17 Skyfire/2.0",
+ "expect" :
+ {
+ "name" : "Skyfire",
+ "version" : "2.0",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "SlimBrowser",
+ "ua" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SlimBrowser)",
+ "expect" :
+ {
+ "name" : "Slim",
+ "version" : "undefined",
+ "major" : "undefined"
+ }
+ },
+ {
+ "desc" : "Swiftfox",
+ "ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20061024 Firefox/2.0 (Swiftfox)",
+ "expect" :
+ {
+ "name" : "Swiftfox",
+ "version" : "undefined",
+ "major" : "undefined"
+ }
+ },
+ {
+ "desc" : "Tizen Browser",
+ "ua" : "Mozilla/5.0 (Linux; U; Tizen/1.0 like Android; en-us; AppleWebKit/534.46 (KHTML, like Gecko) Tizen Browser/1.0 Mobile",
+ "expect" :
+ {
+ "name" : "Tizen Browser",
+ "version" : "1.0",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "UC Browser on Samsung",
+ "ua" : "Mozilla/5.0 (Java; U; Pt-br; samsung-gt-s5620) UCBrowser8.2.1.144/69/352/UCWEB Mobile UNTRUSTED/1.0",
+ "expect" :
+ {
+ "name" : "UCBrowser",
+ "version" : "8.2.1.144",
+ "major" : "8"
+ }
+ },
+ {
+ "desc" : "UC Browser on Nokia",
+ "ua" : "Mozilla/5.0 (S60V3; U; en-in; NokiaN73)/UC Browser8.4.0.159/28/351/UCWEB Mobile",
+ "expect" :
+ {
+ "name" : "UCBrowser",
+ "version" : "8.4.0.159",
+ "major" : "8"
+ }
+ },
+ {
+ "desc" : "UC Browser J2ME",
+ "ua" : "UCWEB/2.0 (MIDP-2.0; U; zh-CN; HTC EVO 3D X515m) U2/1.0.0 UCBrowser/10.4.0.558 U2/1.0.0 Mobile",
+ "expect" :
+ {
+ "name" : "UCBrowser",
+ "version" : "10.4.0.558",
+ "major" : "10"
+ }
+ },
+ {
+ "desc" : "UC Browser J2ME 2",
+ "ua" : "JUC (Linux; U; 2.3.5; zh-cn; GT-I9100; 480*800) UCWEB7.9.0.94/139/800",
+ "expect" :
+ {
+ "name" : "UCBrowser",
+ "version" : "7.9.0.94",
+ "major" : "7"
+ }
+ },
+ {
+ "desc": "WeChat on iOS",
+ "ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 8_4_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12H321 MicroMessenger/6.3.6 NetType/WIFI Language/zh_CN",
+ "expect":
+ {
+ "name": "WeChat",
+ "version": "6.3.6",
+ "major": "6"
+ }
+ },
+ {
+ "desc": "WeChat on Android",
+ "ua": "Mozilla/5.0 (Linux; U; Android 5.1; zh-cn; Lenovo K50-t5 Build/LMY47D) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.4 TBS/025478 Mobile Safari/533.1 MicroMessenger/6.3.5.50_r1573191.640 NetType/WIFI Language/zh_CN",
+ "expect":
+ {
+ "name": "WeChat",
+ "version": "6.3.5.50_r1573191.640",
+ "major": "6"
+ }
+ },
+ {
+ "desc" : "Vivaldi",
+ "ua" : "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.89 Vivaldi/1.0.83.38 Safari/537.36",
+ "expect" :
+ {
+ "name" : "Vivaldi",
+ "version" : "1.0.83.38",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "Yandex",
+ "ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.5 (KHTML, like Gecko) YaBrowser/1.0.1084.5402 Chrome/19.0.1084.5402 Safari/536.5",
+ "expect" :
+ {
+ "name" : "Yandex",
+ "version" : "1.0.1084.5402",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "Microsoft Edge",
+ "ua" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0",
+ "expect" :
+ {
+ "name" : "Edge",
+ "version" : "12.0",
+ "major" : "12"
+ }
+ },
+ {
+ "desc" : "Iridium",
+ "ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Iridium/43.8 Safari/537.36 Chrome/43.0.2357.132",
+ "expect" :
+ {
+ "name" : "Iridium",
+ "version" : "43.8",
+ "major" : "43"
+ }
+ },
+ {
+ "desc" : "Firefox iOS",
+ "ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) FxiOS/1.1 Mobile/13B143 Safari/601.1.46",
+ "expect" :
+ {
+ "name" : "Firefox",
+ "version" : "1.1",
+ "major" : "1"
+ }
+ }
+]
diff --git a/node_modules/ua-parser-js/test/cpu-test.json b/node_modules/ua-parser-js/test/cpu-test.json
new file mode 100644
index 000000000..8e9befcca
--- /dev/null
+++ b/node_modules/ua-parser-js/test/cpu-test.json
@@ -0,0 +1,106 @@
+[
+ {
+ "desc" : "i686",
+ "ua" : "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:19.0) Gecko/20100101 Firefox/19.0",
+ "expect" :
+ {
+ "architecture" : "ia32"
+ }
+ },
+ {
+ "desc" : "i386",
+ "ua" : "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7) Gecko/20040628 Epiphany/1.2.6",
+ "expect" :
+ {
+ "architecture" : "ia32"
+ }
+ },
+ {
+ "desc" : "x86-64",
+ "ua" : "Opera/9.80 (X11; Linux x86_64; U; Linux Mint; en) Presto/2.2.15 Version/10.10",
+ "expect" :
+ {
+ "architecture" : "amd64"
+ }
+ },
+ {
+ "desc" : "win64",
+ "ua" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Win64; x64; Trident/6.0; .NET4.0E; .NET4.0C)",
+ "expect" :
+ {
+ "architecture" : "amd64"
+ }
+ },
+ {
+ "desc" : "WOW64",
+ "ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)",
+ "expect" :
+ {
+ "architecture" : "amd64"
+ }
+ },
+ {
+ "desc" : "ARMv6",
+ "ua" : "Mozilla/5.0 (X11; U; Linux armv61; en-US; rv:1.9.1b2pre) Gecko/20081015 Fennec/1.0a1",
+ "expect" :
+ {
+ "architecture" : "arm"
+ }
+ },
+ {
+ "desc" : "Pocket PC",
+ "ua" : "Opera/9.7 (Windows Mobile; PPC; Opera Mobi/35166; U; en) Presto/2.2.1",
+ "expect" :
+ {
+ "architecture" : "arm"
+ }
+ },
+ {
+ "desc" : "Mac PowerPC",
+ "ua" : "Mozilla/4.0 (compatible; MSIE 4.5; Mac_PowerPC)",
+ "expect" :
+ {
+ "architecture" : "ppc"
+ }
+ },
+ {
+ "desc" : "Mac PowerPC",
+ "ua" : "Mozilla/4.0 (compatible; MSIE 5.17; Mac_PowerPC Mac OS; en)",
+ "expect" :
+ {
+ "architecture" : "ppc"
+ }
+ },
+ {
+ "desc" : "Mac PowerPC",
+ "ua" : "iCab/2.9.5 (Macintosh; U; PPC; Mac OS X)",
+ "expect" :
+ {
+ "architecture" : "ppc"
+ }
+ },
+ {
+ "desc" : "UltraSPARC",
+ "ua" : "Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.9b5) Gecko/2008032620 Firefox/3.0b5",
+ "expect" :
+ {
+ "architecture" : "sparc"
+ }
+ },
+ {
+ "desc" : "QuickTime",
+ "ua" : "QuickTime/7.5.6 (qtver=7.5.6;cpu=IA32;os=Mac 10.5.8)",
+ "expect" :
+ {
+ "architecture" : "ia32"
+ }
+ },
+ {
+ "desc" : "XBMC",
+ "ua" : "XBMC/12.0 Git:20130127-fb595f2 (Windows NT 6.1;WOW64;Win64;x64; http://www.xbmc.org)",
+ "expect" :
+ {
+ "architecture" : "amd64"
+ }
+ }
+]
diff --git a/node_modules/ua-parser-js/test/device-test.json b/node_modules/ua-parser-js/test/device-test.json
new file mode 100644
index 000000000..2a0c75e8e
--- /dev/null
+++ b/node_modules/ua-parser-js/test/device-test.json
@@ -0,0 +1,483 @@
+[
+ {
+ "desc" : "Asus Nexus 7",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 7 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "Asus",
+ "model" : "Nexus 7",
+ "type" : "tablet"
+ }
+ },
+ {
+ "desc" : "Asus Padfone",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.1.1; PadFone 2 Build/JRO03L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "Asus",
+ "model" : "PadFone",
+ "type" : "tablet"
+ }
+ },
+ {
+ "desc" : "Desktop (IE11 with Tablet string)",
+ "ua" : "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; Tablet PC 2.0; GWX:MANAGED; rv:11.0) like Gecko",
+ "expect" :
+ {
+ "vendor" : "undefined",
+ "model" : "undefined",
+ "type" : "undefined"
+ }
+ },
+ {
+ "desc" : "HTC Evo Shift 4G",
+ "ua" : "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Sprint APA7373KT Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0",
+ "expect" :
+ {
+ "vendor" : "HTC",
+ "model" : "Evo Shift 4G",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "HTC Nexus 9",
+ "ua" : "Mozilla/5.0 (Linux; Android 5.0; Nexus 9 Build/LRX21R) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Mobile Crosswalk/7.36.154.13 Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "HTC",
+ "model" : "Nexus 9",
+ "type" : "tablet"
+ }
+ },
+ {
+ "desc" : "Huawei Nexus 6P",
+ "ua" : "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 6P Build/MTC19V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.81 Mobile Safari/537",
+ "expect" :
+ {
+ "vendor" : "Huawei",
+ "model" : "Nexus 6P",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "iPod",
+ "ua" : "Mozilla/5.0 (iPod touch; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53",
+ "expect" :
+ {
+ "vendor" : "Apple",
+ "model" : "iPod touch",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "LG Nexus 4",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.2.1; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19",
+ "expect" :
+ {
+ "vendor" : "LG",
+ "model" : "Nexus 4",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "LG Nexus 5",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19",
+ "expect" :
+ {
+ "vendor" : "LG",
+ "model" : "Nexus 5",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Microsoft Lumia 950",
+ "ua" : "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/13.10586",
+ "expect" :
+ {
+ "vendor" : "Microsoft",
+ "model" : "Lumia 950",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Motorola Moto X",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.4.4; XT1097 Build/KXE21.187-38) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.109 Mobile Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "Motorola",
+ "model" : "XT1097",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Motorola Nexus 6",
+ "ua" : "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.20 Mobile Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "Motorola",
+ "model" : "Nexus 6",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Motorola Droid RAZR 4G",
+ "ua" : "Mozilla/5.0 (Linux; U; Android 2.3; xx-xx; DROID RAZR 4G Build/6.5.1-73_DHD-11_M1-29) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+ "expect" :
+ {
+ "vendor" : "Motorola",
+ "model" : "DROID RAZR 4G",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "iPhone",
+ "ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53",
+ "expect" :
+ {
+ "vendor" : "Apple",
+ "model" : "iPhone",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Motorola Droid RAZR 4G",
+ "ua" : "Mozilla/5.0 (iPod touch; CPU iPhone OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A501 Safari/9537.53",
+ "expect" :
+ {
+ "vendor" : "Apple",
+ "model" : "iPod touch",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Moto X",
+ "ua" : "Mozilla/5.0 (Linux; U; Android 4.2; xx-xx; XT1058 Build/13.9.0Q2.X-70-GHOST-ATT_LE-2) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
+ "expect" :
+ {
+ "vendor" : "Motorola",
+ "model" : "XT1058",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Nokia3xx",
+ "ua" : "Nokia303/14.87 CLDC-1.1",
+ "expect" :
+ {
+ "vendor" : "Nokia",
+ "model" : "303",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "OnePlus One",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.4.4; A0001 Build/KTU84Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.59 Mobile Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "OnePlus",
+ "model" : "1",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Philips SmartTV",
+ "ua" : "Opera/9.80 HbbTV/1.1.1 (; Philips; ; ; ; ) NETTV/4.0.2; en) Version/11.60",
+ "expect" :
+ {
+ "vendor" : "Philips",
+ "model" : "",
+ "type" : "smarttv"
+ }
+ },
+ {
+ "desc" : "Kindle Fire HD",
+ "ua" : "Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.4 Mobile Safari/535.19 Silk-Accelerated=true",
+ "expect" :
+ {
+ "vendor" : "Amazon",
+ "model" : "KFTT",
+ "type" : "tablet"
+ }
+ },
+ {
+ "desc" : "Samsung Galaxy Note 8",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.2.2; GT-N5100 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "Samsung",
+ "model" : "GT-N5100",
+ "type" : "tablet"
+ }
+ },
+ {
+ "desc" : "Samsung SM-T231",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.4.2; SM-T231 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "Samsung",
+ "model" : "SM-T231",
+ "type" : "tablet"
+ }
+ },
+ {
+ "desc" : "Samsung SM-T700",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.4.2; SM-T700 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "Samsung",
+ "model" : "SM-T700",
+ "type" : "tablet"
+ }
+ },
+ {
+ "desc" : "Samsung SM-T520",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.4.2; SM-T520 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "Samsung",
+ "model" : "SM-T520",
+ "type" : "tablet"
+ }
+ },
+ {
+ "desc" : "Samsung SmartTV2011",
+ "ua" : "HbbTV/1.1.1 (;;;;;) Maple;2011",
+ "expect" :
+ {
+ "vendor" : "Samsung",
+ "model" : "SmartTV2011",
+ "type" : "smarttv"
+ }
+ },
+ {
+ "desc" : "Samsung SmartTV2012",
+ "ua" : "HbbTV/1.1.1 (;Samsung;SmartTV2012;;;) WebKit",
+ "expect" :
+ {
+ "vendor" : "Samsung",
+ "model" : "SmartTV2012",
+ "type" : "smarttv"
+ }
+ },
+ {
+ "desc" : "Samsung SmartTV2014",
+ "ua" : "HbbTV/1.1.1 (;Samsung;SmartTV2014;T-NT14UDEUC-1060.4;;) WebKit",
+ "expect" :
+ {
+ "vendor" : "Samsung",
+ "model" : "SmartTV2014",
+ "type" : "smarttv"
+ }
+ },
+ {
+ "desc" : "Samsung SmartTV",
+ "ua" : "Mozilla/5.0 (SMART-TV; Linux; Tizen 2.3) AppleWebkit/538.1 (KHTML, like Gecko) SamsungBrowser/1.0 TV Safari/538.1",
+ "expect" :
+ {
+ "vendor" : "Samsung",
+ "model" : "undefined",
+ "type" : "smarttv"
+ }
+ },
+ {
+ "desc" : "Sony C5303 (Xperia SP)",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.3; C5303 Build/12.1.A.1.205) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "Sony",
+ "model" : "Xperia Phone",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Sony SO-02F (Xperia Z1 F)",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.2.2; SO-02F Build/14.1.H.2.119) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "Sony",
+ "model" : "Xperia Phone",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Sony D6653 (Xperia Z3)",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.4; D6653 Build/23.0.A.0.376) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "Sony",
+ "model" : "Xperia Phone",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Sony Xperia SOL25 (ZL2)",
+ "ua" : "Mozilla/5.0 (Linux; U; Android 4.4; SOL25 Build/17.1.1.C.1.64) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
+ "expect" :
+ {
+ "vendor" : "Sony",
+ "model" : "Xperia Phone",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Sony Xperia SP",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.3; C5302 Build/12.1.A.1.201) AppleWebkit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "Sony",
+ "model" : "Xperia Phone",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Sony SGP521 (Xperia Z2 Tablet)",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.4; SGP521 Build/17.1.A.0.432) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "Sony",
+ "model" : "Xperia Tablet",
+ "type" : "tablet"
+ }
+ },
+ {
+ "desc" : "Sony Tablet S",
+ "ua" : "Mozilla/5.0 (Linux; U; Android 3.1; Sony Tablet S Build/THMAS10000) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
+ "expect" :
+ {
+ "vendor" : "Sony",
+ "model" : "Xperia Tablet",
+ "type" : "tablet"
+ }
+ },
+ {
+ "desc" : "Sony Tablet Z LTE",
+ "ua" : "Mozilla/5.0 (Linux; U; Android 4.1; SonySGP321 Build/10.2.C.0.143) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30",
+ "expect" :
+ {
+ "vendor" : "Sony",
+ "model" : "Xperia Tablet",
+ "type" : "tablet"
+ }
+ },
+ {
+ "desc" : "Xiaomi 2013023",
+ "ua" : "Mozilla/5.0 (Linux; U; Android 4.2.2; en-US; 2013023 Build/HM2013023) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/10.0.1.512 U3/0.8.0 Mobile Safari/533.1",
+ "expect" :
+ {
+ "vendor" : "Xiaomi",
+ "model" : "2013023",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Xiaomi Hongmi Note 1W",
+ "ua" : "Mozilla/5.0 (Linux; U; Android 4.2.2; zh-CN; HM NOTE 1W Build/JDQ39) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.7.9.439 U3/0.8.0 Mobile Safari/533.1",
+ "expect" :
+ {
+ "vendor" : "Xiaomi",
+ "model" : "HM NOTE 1W",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Xiaomi Mi 3C",
+ "ua" : "Mozilla/5.0 (Linux; U; Android 4.3; zh-CN; MI 3C Build/JLS36C) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.7.9.439 U3/0.8.0 Mobile Safari/533.1",
+ "expect" :
+ {
+ "vendor" : "Xiaomi",
+ "model" : "MI 3C",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Xiaomi Mi Note",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.4.4; MI NOTE LTE Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "Xiaomi",
+ "model" : "MI NOTE LTE",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Xiaomi Mi One Plus",
+ "ua" : "Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; MI-ONE Plus Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
+ "expect" :
+ {
+ "vendor" : "Xiaomi",
+ "model" : "MI-ONE Plus",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "PlayStation 4",
+ "ua" : "Mozilla/5.0 (PlayStation 4 3.00) AppleWebKit/537.73 (KHTML, like Gecko)",
+ "expect" :
+ {
+ "vendor" : "Sony",
+ "model" : "PlayStation 4",
+ "type" : "console"
+ }
+ },
+ {
+ "desc" : "Galaxy Nexus",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19",
+ "expect" :
+ {
+ "vendor" : "Samsung",
+ "model" : "Galaxy Nexus",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Samsung Galaxy S5",
+ "ua" : "Mozilla/5.0 (Linux; Android 5.0; SM-G900F Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.78 Mobile Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "Samsung",
+ "model" : "SM-G900F",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Samsung Galaxy S6",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.4.2; SM-G920I Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "Samsung",
+ "model" : "SM-G920I",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Samsung Galaxy S6 Edge",
+ "ua" : "Mozilla/5.0 (Linux; Android 4.4.2; SM-G925I Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "Samsung",
+ "model" : "SM-G925I",
+ "type" : "mobile"
+ }
+ },
+ {
+ "desc" : "Samsung Galaxy Note 5 Chrome",
+ "ua" : "Mozilla/5.0 (Linux; Android 5.1.1; SM-N920C Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.91 Mobile Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "Samsung",
+ "model" : "SM-N920C",
+ "type" : "mobile"
+ }
+ }
+,
+ {
+ "desc" : "Samsung Galaxy Note 5 Samsung Browser",
+ "ua" : "Mozilla/5.0 (Linux; Android 5.1.1; SAMSUNG SM-N920C Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.0 Chrome/44.0.2403.133 Mobile Safari/537.36",
+ "expect" :
+ {
+ "vendor" : "Samsung",
+ "model" : "SM-N920C",
+ "type" : "mobile"
+ }
+ }
+]
diff --git a/node_modules/ua-parser-js/test/engine-test.json b/node_modules/ua-parser-js/test/engine-test.json
new file mode 100644
index 000000000..875057da0
--- /dev/null
+++ b/node_modules/ua-parser-js/test/engine-test.json
@@ -0,0 +1,74 @@
+[
+ {
+ "desc" : "EdgeHTML",
+ "ua" : "Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36 Edge/12.0",
+ "expect" :
+ {
+ "name" : "EdgeHTML",
+ "version" : "12.0"
+ }
+ },
+ {
+ "desc" : "Gecko",
+ "ua" : "Mozilla/5.0 (X11; Linux x86_64; rv:2.0b9pre) Gecko/20110111 Firefox/4.0b9pre",
+ "expect" :
+ {
+ "name" : "Gecko",
+ "version" : "2.0b9pre"
+ }
+ },
+ {
+ "desc" : "KHTML",
+ "ua" : "Mozilla/5.0 (compatible; Konqueror/4.5; FreeBSD) KHTML/4.5.4 (like Gecko)",
+ "expect" :
+ {
+ "name" : "KHTML",
+ "version" : "4.5.4"
+ }
+ },
+ {
+ "desc" : "NetFront",
+ "ua" : "Mozilla/4.0 (PDA; Windows CE/1.0.1) NetFront/3.0",
+ "expect" :
+ {
+ "name" : "NetFront",
+ "version" : "3.0"
+ }
+ },
+ {
+ "desc" : "Presto",
+ "ua" : "Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1",
+ "expect" :
+ {
+ "name" : "Presto",
+ "version" : "2.8.149"
+ }
+ },
+ {
+ "desc" : "Tasman",
+ "ua" : "Mozilla/4.0 (compatible; MSIE 6.0; PPC Mac OS X 10.4.7; Tasman 1.0)",
+ "expect" :
+ {
+ "name" : "Tasman",
+ "version" : "1.0"
+ }
+ },
+ {
+ "desc" : "Trident",
+ "ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)",
+ "expect" :
+ {
+ "name" : "Trident",
+ "version" : "6.0"
+ }
+ },
+ {
+ "desc" : "WebKit",
+ "ua" : "Mozilla/5.0 (Windows; U; Windows NT 6.1; sv-SE) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4",
+ "expect" :
+ {
+ "name" : "WebKit",
+ "version" : "533.19.4"
+ }
+ }
+]
diff --git a/node_modules/ua-parser-js/test/mediaplayer-test.json b/node_modules/ua-parser-js/test/mediaplayer-test.json
new file mode 100644
index 000000000..d40ba04f0
--- /dev/null
+++ b/node_modules/ua-parser-js/test/mediaplayer-test.json
@@ -0,0 +1,582 @@
+[
+ {
+ "desc" : "Coremedia",
+ "ua" : "Apple Mac OS X v10.6.4 CoreMedia v1.0.0.10F2108",
+ "expect" :
+ {
+ "name" : "CoreMedia",
+ "version" : "1.0.0.10F2108",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "AppleCoreMedia",
+ "ua" : "AppleCoreMedia/1.0.0.10A403 (iPad; U; CPU OS 6_0 like Mac OS X; it_it)",
+ "expect" :
+ {
+ "name" : "AppleCoreMedia",
+ "version" : "1.0.0.10A403",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "AppleTv",
+ "ua" : "AppleTV/3.0.2 (Macintosh; Intel Mac OS X 10.4.7) AppleWebKit/528.18",
+ "expect" :
+ {
+ "name" : "WebKit",
+ "version" : "528.18",
+ "major" : "528"
+ }
+ },
+ {
+ "desc" : "Aqualung",
+ "ua" : "Aqualung/R-1114",
+ "expect" :
+ {
+ "name" : "Aqualung",
+ "version" : "R-1114",
+ "major" : "undefined"
+ }
+ },
+ {
+ "desc" : "Ares",
+ "ua" : "Ares 2.2.4.3048",
+ "expect" :
+ {
+ "name" : "Ares",
+ "version" : "2.2.4.3048",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "Audacious",
+ "ua" : "Audacious/3.2.2 neon/0.29.3",
+ "expect" :
+ {
+ "name" : "Audacious",
+ "version" : "3.2.2",
+ "major" : "3"
+ }
+ },
+ {
+ "desc" : "AudiMusicStream",
+ "ua" : "AudiMusicStream/3020.130826151911",
+ "expect" :
+ {
+ "name" : "AudiMusicStream",
+ "version" : "3020.130826151911",
+ "major" : "3020"
+ }
+ },
+ {
+ "desc" : "BASS",
+ "ua" : "BASS/2.4",
+ "expect" :
+ {
+ "name" : "BASS",
+ "version" : "2.4",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "BSPlayer",
+ "ua" : "BSPlayer/2",
+ "expect" :
+ {
+ "name" : "BSPlayer",
+ "version" : "2",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "Core",
+ "ua" : "CORE/6.506.4.1",
+ "expect" :
+ {
+ "name" : "CORE",
+ "version" : "6.506.4.1",
+ "major" : "6"
+ }
+ },
+ {
+ "desc" : "Clementine",
+ "ua" : "Clementine 1.1",
+ "expect" :
+ {
+ "name" : "Clementine",
+ "version" : "1.1",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "Dalvik",
+ "ua" : "Dalvik/1.2.0 (Linux; U; Android 2.2.1; GT-S5830L Build/FROYO)",
+ "expect" :
+ {
+ "name" : "Dalvik",
+ "version" : "1.2.0",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "NexPlayer",
+ "ua" : "E97510d/ Player/NexPlayer 4.0",
+ "expect" :
+ {
+ "name" : "NexPlayer",
+ "version" : "4.0",
+ "major" : "4"
+ }
+ },
+ {
+ "desc" : "FLRP",
+ "ua" : "FLRP/2.5 CFNetwork/609.1.4 Darwin/13.0.0",
+ "expect" :
+ {
+ "name" : "Flip Player",
+ "version" : "2.5",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "FStream",
+ "ua" : "FStream",
+ "expect" :
+ {
+ "name" : "FStream",
+ "version" : "undefined",
+ "major" : "undefined"
+ }
+ },
+ {
+ "desc" : "GStreamer",
+ "ua" : "GStreamer souphttpsrc (compatible; LG NetCast.TV-2012) libsoup/2.34.2",
+ "expect" :
+ {
+ "name" : "GStreamer",
+ "version" : "2.34.2",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "GnomeMplayer",
+ "ua" : "GnomeMplayer/1.0.2",
+ "expect" :
+ {
+ "name" : "GnomeMplayer",
+ "version" : "1.0.2",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "HTC Streaming Player",
+ "ua" : "HTC Streaming Player htc_asia_wwe / 1.0 / endeavoru / 4.1.1",
+ "expect" :
+ {
+ "name" : "HTC Streaming Player",
+ "version" : "1.0",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "HTC One S",
+ "ua" : "HTC_One_S/3.16.111.10",
+ "expect" :
+ {
+ "name" : "HTC One S",
+ "version" : "3.16.111.10",
+ "major" : "3"
+ }
+ },
+ {
+ "desc" : "Java",
+ "ua" : "Java/1.4.1_04",
+ "expect" :
+ {
+ "name" : "Java",
+ "version" : "1.4.1_04",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "LG Player",
+ "ua" : "LG Player 1.0; Android",
+ "expect" :
+ {
+ "name" : "LG Player",
+ "version" : "1.0",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "NexPlayer",
+ "ua" : "LG-P700/V10k-DEC-12-2012 Player/NexPlayer 4.0 for Android",
+ "expect" :
+ {
+ "name" : "NexPlayer",
+ "version" : "4.0",
+ "major" : "4"
+ }
+ },
+ {
+ "desc" : "LG Player",
+ "ua" : "LGE400/V10b Player/LG Player 1.0",
+ "expect" :
+ {
+ "name" : "LG Player",
+ "version" : "1.0",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "Lavf",
+ "ua" : "Lavf52.111.0",
+ "expect" :
+ {
+ "name" : "Lavf",
+ "version" : "52.111.0",
+ "major" : "52"
+ }
+ },
+ {
+ "desc" : "Lyssna",
+ "ua" : "Lyssna/46 CFNetwork/609.1.4 Darwin/13.0.0",
+ "expect" :
+ {
+ "name" : "Lyssna",
+ "version" : "46",
+ "major" : "46"
+ }
+ },
+ {
+ "desc" : "MPlayer",
+ "ua" : "MPlayer 1.1-4.2.1",
+ "expect" :
+ {
+ "name" : "MPlayer",
+ "version" : "1.1-4.2.1",
+ "major" : ""
+ }
+ },
+ {
+ "desc" : "MPlayer SVN",
+ "ua" : "MPlayer SVN-r33713-4.6.1",
+ "expect" :
+ {
+ "name" : "MPlayer",
+ "version" : "r33713-4.6.1",
+ "major" : "undefined"
+ }
+ },
+ {
+ "desc" : "MPlayer ubuntu",
+ "ua" : "MPlayer svn r34540 (Ubuntu), built with gcc-4.6",
+ "expect" :
+ {
+ "name" : "MPlayer",
+ "version" : "r34540",
+ "major" : "undefined"
+ }
+ },
+ {
+ "desc" : "MoC",
+ "ua" : "Music On Console/2.5.0-beta1",
+ "expect" :
+ {
+ "name" : "Music On Console",
+ "version" : "2.5.0-beta1",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "MPD",
+ "ua" : "Music Player Daemon 0.17.4",
+ "expect" :
+ {
+ "name" : "Music Player Daemon",
+ "version" : "0.17.4",
+ "major" : "0"
+ }
+ },
+ {
+ "desc" : "NSPlayer",
+ "ua" : "NSPlayer/11.0.5358.4827 WMFSDK/11.0",
+ "expect" :
+ {
+ "name" : "NSPlayer",
+ "version" : "11.0.5358.4827",
+ "major" : "11"
+ }
+ },
+ {
+ "desc" : "Nero Home",
+ "ua" : "Nero Home/1.5.3.0 (compatible; Nero AG; Nero Home 1.5.3.0)",
+ "expect" :
+ {
+ "name" : "Nero Home",
+ "version" : "1.5.3.0",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "NexPlayer",
+ "ua" : "NexPlayer 4.0 for Android( stagefright alternative )",
+ "expect" :
+ {
+ "name" : "NexPlayer",
+ "version" : "4.0",
+ "major" : "4"
+ }
+ },
+ {
+ "desc" : "Nokia3xx",
+ "ua" : "Nokia303/14.87 CLDC-1.1",
+ "expect" :
+ {
+ "name" : "Nokia303",
+ "version" : "14.87",
+ "major" : "14"
+ }
+ },
+ {
+ "desc" : "MPlayer SVN Sherpya",
+ "ua" : "MPlayer Sherpya-SVN-r33124-4.2.5",
+ "expect" :
+ {
+ "name" : "MPlayer",
+ "version" : "r33124-4.2.5",
+ "major" : "undefined"
+ }
+ },
+ {
+ "desc" : "Philips Songbird",
+ "ua" : "NotMoz/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.2.3) Gecko/20101207 Philips-Songbird/5.4.1980 Songbird/1.9.4 (20110302030555)",
+ "expect" :
+ {
+ "name" : "Songbird",
+ "version" : "1.9.4",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "Ossproxy",
+ "ua" : "OSSProxy 1.3.336.320 (Build 336.320 Win32 en-us)(Aug 16 2013 17:38:43)",
+ "expect" :
+ {
+ "name" : "OSSProxy",
+ "version" : "1.3.336.320",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "Winamp3",
+ "ua" : "Nullsoft Winamp3 version 3.0 (compatible)",
+ "expect" :
+ {
+ "name" : "Winamp",
+ "version" : "3.0",
+ "major" : "3"
+ }
+ },
+ {
+ "desc" : "PSP",
+ "ua" : "PSP-InternetRadioPlayer/1.00",
+ "expect" :
+ {
+ "name" : "PSP-InternetRadioPlayer",
+ "version" : "1.00",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "urllib",
+ "ua" : "Python-urllib/2.7",
+ "expect" :
+ {
+ "name" : "Python-urllib",
+ "version" : "2.7",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "QuickTime",
+ "ua" : "QuickTime/7.5.6 (qtver=7.5.6;cpu=IA32;os=Mac 10.5.8)",
+ "expect" :
+ {
+ "name" : "QuickTime",
+ "version" : "7.5.6",
+ "major" : "7"
+ }
+ },
+ {
+ "desc" : "RMA",
+ "ua" : "RMA/1.0 (compatible; RealMedia)",
+ "expect" :
+ {
+ "name" : "RMA",
+ "version" : "1.0",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "RadioApp",
+ "ua" : "RadioApp/1.0 CFNetwork/609.1.4 Darwin/11.4.2",
+ "expect" :
+ {
+ "name" : "RadioApp",
+ "version" : "1.0",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "RadioClientApplication",
+ "ua" : "RadioClientApplication/20 CFNetwork/609.1.4 Darwin/13.0.0",
+ "expect" :
+ {
+ "name" : "RadioClientApplication",
+ "version" : "20",
+ "major" : "undefined"
+ }
+ },
+ {
+ "desc" : "stagefright",
+ "ua" : "Samsung GT-I9070 stagefright/1.1 (Linux;Android 2.3.6)",
+ "expect" :
+ {
+ "name" : "stagefright",
+ "version" : "1.1",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "Soundtap",
+ "ua" : "Soundtap/1.2.4 CFNetwork/672.0.2 Darwin/14.0.0",
+ "expect" :
+ {
+ "name" : "Soundtap",
+ "version" : "1.2.4",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "Streamium",
+ "ua" : "Streamium/1.0",
+ "expect" :
+ {
+ "name" : "Streamium",
+ "version" : "1.0",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "Totem",
+ "ua" : "Totem/3.0.1",
+ "expect" :
+ {
+ "name" : "Totem",
+ "version" : "3.0.1",
+ "major" : "3"
+ }
+ },
+ {
+ "desc" : "VLC",
+ "ua" : "VLC media player - version 0.8.6c Janus - (c) 1996-2007 the VideoLAN team",
+ "expect" :
+ {
+ "name" : "VLC",
+ "version" : "0.8.6c",
+ "major" : "0"
+ }
+ },
+ {
+ "desc" : "VLC",
+ "ua" : "VLC/2.0.0 LibVLC/2.0.0",
+ "expect" :
+ {
+ "name" : "VLC",
+ "version" : "2.0.0",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "Videos",
+ "ua" : "Videos/3.8.2",
+ "expect" :
+ {
+ "name" : "Video",
+ "version" : "3.8.2",
+ "major" : "3"
+ }
+ },
+ {
+ "desc" : "Wget",
+ "ua" : "Wget/1.12 (darwin10.7.0)",
+ "expect" :
+ {
+ "name" : "Wget",
+ "version" : "1.12",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "Winamp",
+ "ua" : "Winamp 2.81",
+ "expect" :
+ {
+ "name" : "Winamp",
+ "version" : "2.81",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "Winamp",
+ "ua" : "WinampMPEG/2.00",
+ "expect" :
+ {
+ "name" : "Winamp",
+ "version" : "2.00",
+ "major" : "2"
+ }
+ },
+ {
+ "desc" : "Windows Media Player",
+ "ua" : "Windows-Media-Player/10.00.00.4019",
+ "expect" :
+ {
+ "name" : "Windows Media Player",
+ "version" : "10.00.00.4019",
+ "major" : "10"
+ }
+ },
+ {
+ "desc" : "XBMC",
+ "ua" : "XBMC/12.0 Git:20130127-fb595f2 (Windows NT 6.1;WOW64;Win64;x64; http://www.xbmc.org)",
+ "expect" :
+ {
+ "name" : "XBMC",
+ "version" : "12.0",
+ "major" : "12"
+ }
+ },
+ {
+ "desc" : "rad.io",
+ "ua" : "rad.io 1.18.1 rv:593 (iPhone 4S; iPhone OS 7.0.4; it_IT)",
+ "expect" :
+ {
+ "name" : "rad.io",
+ "version" : "1.18.1",
+ "major" : "1"
+ }
+ },
+ {
+ "desc" : "BE-Test",
+ "ua" : "APP-BE Test/1.0 (iPad; Apple; CPU iPhone OS 7_0_2 like Mac OS X)",
+ "expect" :
+ {
+ "name" : "BE Test",
+ "version" : "1.0",
+ "major" : "1"
+ }
+ }
+]
diff --git a/node_modules/ua-parser-js/test/os-test.json b/node_modules/ua-parser-js/test/os-test.json
new file mode 100644
index 000000000..c0100d024
--- /dev/null
+++ b/node_modules/ua-parser-js/test/os-test.json
@@ -0,0 +1,632 @@
+[
+ {
+ "desc" : "Windows 95",
+ "ua" : "Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)",
+ "expect" :
+ {
+ "name" : "Windows",
+ "version" : "95"
+ }
+ },
+ {
+ "desc" : "Windows 98",
+ "ua" : "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)",
+ "expect" :
+ {
+ "name" : "Windows",
+ "version" : "98"
+ }
+ },
+ {
+ "desc" : "Windows ME",
+ "ua" : "Mozilla/5.0 (Windows; U; Win 9x 4.90) Gecko/20020502 CS 2000 7.0/7.0",
+ "expect" :
+ {
+ "name" : "Windows",
+ "version" : "ME"
+ }
+ },
+ {
+ "desc" : "Windows 2000",
+ "ua" : "Mozilla/3.0 (compatible; MSIE 3.0; Windows NT 5.0)",
+ "expect" :
+ {
+ "name" : "Windows",
+ "version" : "2000"
+ }
+ },
+ {
+ "desc" : "Windows XP",
+ "ua" : "Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 5.2)",
+ "expect" :
+ {
+ "name" : "Windows",
+ "version" : "XP"
+ }
+ },
+ {
+ "desc" : "Windows Vista",
+ "ua" : "Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; fr-FR)",
+ "expect" :
+ {
+ "name" : "Windows",
+ "version" : "Vista"
+ }
+ },
+ {
+ "desc" : "Windows 7",
+ "ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)",
+ "expect" :
+ {
+ "name" : "Windows",
+ "version" : "7"
+ }
+ },
+ {
+ "desc" : "Windows 8",
+ "ua" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Win64; x64; Trident/6.0; .NET4.0E; .NET4.0C)",
+ "expect" :
+ {
+ "name" : "Windows",
+ "version" : "8"
+ }
+ },
+ {
+ "desc" : "Windows 10",
+ "ua" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0",
+ "expect" :
+ {
+ "name" : "Windows",
+ "version" : "10"
+ }
+ },
+ {
+ "desc" : "Windows RT",
+ "ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)",
+ "expect" :
+ {
+ "name" : "Windows",
+ "version" : "RT"
+ }
+ },
+ {
+ "desc" : "Windows CE",
+ "ua" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)",
+ "expect" :
+ {
+ "name" : "Windows",
+ "version" : "CE"
+ }
+ },
+ {
+ "desc" : "Windows Mobile",
+ "ua" : "Mozilla/5.0 (ZTE-E_N72/N72V1.0.0B02;U;Windows Mobile/6.1;Profile/MIDP-2.0 Configuration/CLDC-1.1;320*240;CTC/2.0) IE/6.0 (compatible; MSIE 4.01; Windows CE; PPC)/UC Browser7.7.1.88",
+ "expect" :
+ {
+ "name" : "Windows Mobile",
+ "version" : "6.1"
+ }
+ },
+ {
+ "desc" : "Windows Phone",
+ "ua" : "Opera/9.80 (Windows Phone; Opera Mini/7.6.8/35.7518; U; ru) Presto/2.8.119 Version/11.10",
+ "expect" :
+ {
+ "name" : "Windows Phone",
+ "version" : "undefined"
+ }
+ },
+ {
+ "desc" : "Windows Phone OS",
+ "ua" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; DELL; Venue Pro)",
+ "expect" :
+ {
+ "name" : "Windows Phone OS",
+ "version" : "7.0"
+ }
+ },
+ {
+ "desc" : "Windows Phone 8",
+ "ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; HTC; Windows Phone 8X by HTC)",
+ "expect" :
+ {
+ "name" : "Windows Phone",
+ "version" : "8.0"
+ }
+ },
+ {
+ "desc" : "BlackBerry",
+ "ua" : "BlackBerry9300/5.0.0.912 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/378",
+ "expect" :
+ {
+ "name" : "BlackBerry",
+ "version" : "5.0.0.912"
+ }
+ },
+ {
+ "desc" : "BlackBerry 10",
+ "ua" : "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.3+ (KHTML, like Gecko) Version/10.0.9.386 Mobile Safari/537.3+",
+ "expect" :
+ {
+ "name" : "BlackBerry",
+ "version" : "10"
+ }
+ },
+ {
+ "desc" : "Tizen",
+ "ua" : "Mozilla/5.0 (Linux; Tizen 2.3; SAMSUNG SM-Z130H) AppleWebKit/537.3 (KHTML, like Gecko) Version/2.3 Mobile Safari/537.3",
+ "expect" :
+ {
+ "name" : "Tizen",
+ "version" : "2.3"
+ }
+ },
+ {
+ "desc" : "Android",
+ "ua" : "Mozilla/5.0 (Linux; U; Android 2.2.2; en-us; VM670 Build/FRG83G) AppleWebKit/533.1 (KHTML, like Gecko)",
+ "expect" :
+ {
+ "name" : "Android",
+ "version" : "2.2.2"
+ }
+ },
+ {
+ "desc" : "WebOS",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "Palm OS",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "QNX",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "Bada",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "RIM Tablet OS",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "MeeGo",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "Symbian",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "Firefox OS",
+ "ua" : "Mozilla/5.0 (Mobile; rv:14.0) Gecko/14.0 Firefox/14.0",
+ "expect" :
+ {
+ "name" : "Firefox OS",
+ "version" : "undefined"
+ }
+ },
+ {
+ "desc" : "Nintendo",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "PlayStation",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "PlayStation 4",
+ "ua" : "Mozilla/5.0 (PlayStation 4 3.00) AppleWebKit/537.73 (KHTML, like Gecko)",
+ "expect" :
+ {
+ "name" : "PlayStation",
+ "version" : "4"
+ }
+ },
+ {
+ "desc" : "Mint",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "Joli",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "Ubuntu",
+ "ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.22+ (KHTML, like Gecko) Chromium/17.0.963.56 Chrome/17.0.963.56 Safari/535.22+ Ubuntu/12.04 (3.4.1-0ubuntu1) Epiphany/3.4.1",
+ "expect" :
+ {
+ "name" : "Ubuntu",
+ "version" : "12.04"
+ }
+ },
+ {
+ "desc" : "Ubuntu",
+ "ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/31.0.1650.63 Chrome/31.0.1650.63 Safari/537.36",
+ "expect" :
+ {
+ "name" : "Ubuntu",
+ "version" : "undefined"
+ }
+ },
+ {
+ "desc" : "Debian",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "OpenSUSE",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "Gentoo",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "Arch",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "Slackware",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "Fedora",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "Mandriva",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "CentOS",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "PCLinuxOS",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "RedHat",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "Zenwalk",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "Hurd",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "Linux",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "GNU",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "Chromium OS",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "Solaris",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "FreeBSD",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "OpenBSD",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "NetBSD",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "DragonFly",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "iOS with Chrome",
+ "ua" : "Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3",
+ "expect" :
+ {
+ "name" : "iOS",
+ "version" : "5.1.1"
+ }
+ },
+ {
+ "desc" : "iOS with Opera Mini",
+ "ua" : "Opera/9.80 (iPhone; Opera Mini/7.1.32694/27.1407; U; en) Presto/2.8.119 Version/11.10",
+ "expect" :
+ {
+ "name" : "iOS",
+ "version" : "undefined"
+ }
+ },
+ {
+ "desc" : "Mac OS",
+ "ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36",
+ "expect" :
+ {
+ "name" : "Mac OS",
+ "version" : "10.6.8"
+ }
+ },
+ {
+ "desc" : "Haiku",
+ "ua" : "Mozilla/5.0 (Macintosh; Intel Haiku R1 x86) AppleWebKit/602.1.1 (KHTML, like Gecko) WebPositive/1.2 Version/8.0 Safari/602.1.1",
+ "expect" :
+ {
+ "name" : "Haiku",
+ "version" : "R1"
+ }
+ },
+ {
+ "desc" : "AIX",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "Plan9",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "Minix",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "BeOS",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "OS/2",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "AmigaOS",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "MorphOS",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "UNIX",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "iTunes Windows Vista",
+ "ua" : "iTunes/10.7 (Windows; Microsoft Windows Vista Home Premium Edition Service Pack 1 (Build 6001)) AppleWebKit/536.26.9",
+ "expect" :
+ {
+ "name" : "Windows",
+ "version" : "Vista"
+ }
+ },
+ {
+ "desc" : "",
+ "ua" : "",
+ "expect" :
+ {
+ "name" : "",
+ "version" : ""
+ }
+ },
+ {
+ "desc" : "iOS BE App",
+ "ua" : "APP-BE Test/1.0 (iPad; Apple; CPU iPhone OS 7_0_2 like Mac OS X)",
+ "expect" :
+ {
+ "name" : "iOS",
+ "version" : "7.0.2"
+ }
+ },
+ {
+ "desc" : "KTB-Nexus 5",
+ "ua" : "APP-My App/1.0 (Linux; Android 4.2.1; Nexus 5 Build/JOP40D)",
+ "expect" :
+ {
+ "name" : "Android",
+ "version" : "4.2.1"
+ }
+ }
+]
diff --git a/node_modules/ua-parser-js/test/test.js b/node_modules/ua-parser-js/test/test.js
new file mode 100644
index 000000000..40a6e0d16
--- /dev/null
+++ b/node_modules/ua-parser-js/test/test.js
@@ -0,0 +1,91 @@
+var assert = require('assert');
+var requirejs = require('requirejs');
+var UAParser = require('./../src/ua-parser');
+var browsers = require('./browser-test.json');
+var cpus = require('./cpu-test.json');
+var devices = require('./device-test.json');
+var engines = require('./engine-test.json');
+var os = require('./os-test.json');
+var parser = new UAParser();
+var methods = [
+ {
+ title : 'getBrowser',
+ label : 'browser',
+ list : browsers,
+ properties : ['name', 'major', 'version']
+ },
+ {
+ title : 'getCPU',
+ label : 'cpu',
+ list : cpus,
+ properties : ['architecture']
+ },
+ {
+ title : 'getDevice',
+ label : 'device',
+ list : devices,
+ properties : ['model', 'type', 'vendor']
+ },
+ {
+ title : 'getEngine',
+ label : 'engine',
+ list : engines,
+ properties : ['name', 'version']
+ },
+ {
+ title : 'getOS',
+ label : 'os',
+ list : os,
+ properties : ['name', 'version']
+}];
+
+describe('UAParser()', function () {
+ var ua = 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6';
+ assert.deepEqual(UAParser(ua), new UAParser().setUA(ua).getResult());
+});
+
+for (var i in methods) {
+ describe(methods[i]['title'], function () {
+ for (var j in methods[i]['list']) {
+ if (!!methods[i]['list'][j].ua) {
+ describe('[' + methods[i]['list'][j].desc + ']', function () {
+ describe('"' + methods[i]['list'][j].ua + '"', function () {
+ var expect = methods[i]['list'][j].expect;
+ var result = parser.setUA(methods[i]['list'][j].ua).getResult()[methods[i]['label']];
+
+ methods[i]['properties'].forEach(function(m) {
+ it('should return ' + methods[i]['label'] + ' ' + m + ': ' + expect[m], function () {
+ assert.equal(result[m], expect[m] != 'undefined' ? expect[m] : undefined);
+ });
+ });
+ });
+ });
+ }
+ }
+ });
+}
+
+describe('Extending Regex', function () {
+ var uaString = 'Mozilla/5.0 MyOwnBrowser/1.3';
+ var myOwnBrowser = [[/(myownbrowser)\/((\d+)?[\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION, UAParser.BROWSER.MAJOR]];
+ var parser = new UAParser(uaString, {browser: myOwnBrowser});
+ assert.equal(parser.getBrowser().name, 'MyOwnBrowser');
+ assert.equal(parser.getBrowser().version, '1.3');
+ assert.equal(parser.getBrowser().major, '1');
+});
+
+describe('Using Require.js', function () {
+ it('should loaded automatically', function(done) {
+ requirejs.config({
+ baseUrl : 'dist',
+ paths : {
+ 'ua-parser-js' : 'ua-parser.min'
+ }
+ });
+ requirejs(['ua-parser-js'], function(ua) {
+ var parser = new ua('Dillo/1.0');
+ assert.deepEqual(parser.getBrowser().name, 'Dillo');
+ done();
+ });
+ });
+}); \ No newline at end of file
diff --git a/node_modules/ua-parser-js/ua-parser-js.jquery.json b/node_modules/ua-parser-js/ua-parser-js.jquery.json
new file mode 100644
index 000000000..04a66873f
--- /dev/null
+++ b/node_modules/ua-parser-js/ua-parser-js.jquery.json
@@ -0,0 +1,32 @@
+{
+ "title": "UAParser.js",
+ "name": "ua-parser-js",
+ "version": "0.7.12",
+ "description": "Lightweight JavaScript-based user-agent string parser",
+ "keywords": [
+ "user-agent",
+ "parser",
+ "browser",
+ "engine",
+ "os",
+ "device",
+ "cpu"
+ ],
+ "homepage": "https://faisalman.github.com/ua-parser-js",
+ "author": {
+ "name": "Faisal Salman",
+ "email": "fyzlman@gmail.com"
+ },
+ "dependencies": {
+ "jquery": ">=1.5"
+ },
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "http://www.opensource.org/licenses/mit-license.php"
+ }
+ ],
+ "bugs": "https://github.com/faisalman/ua-parser-js/issues",
+ "docs": "https://github.com/faisalman/ua-parser-js",
+ "download": "https://raw.github.com/faisalman/ua-parser-js/master/dist/ua-parser.min.js"
+}