ua-parser-js
Advanced tools
Comparing version 1.0.34 to 2.0.0-alpha.1
@@ -1,4 +0,4 @@ | ||
/* UAParser.js v1.0.34 | ||
Copyright © 2012-2021 Faisal Salman <f@faisalman.com> | ||
/* UAParser.js v2.0.0-alpha.1 | ||
Copyright © 2012-2023 Faisal Salman <f@faisalman.com> | ||
MIT License */ | ||
(function(window,undefined){"use strict";var LIBVERSION="1.0.34",EMPTY="",UNKNOWN="?",FUNC_TYPE="function",UNDEF_TYPE="undefined",OBJ_TYPE="object",STR_TYPE="string",MAJOR="major",MODEL="model",NAME="name",TYPE="type",VENDOR="vendor",VERSION="version",ARCHITECTURE="architecture",CONSOLE="console",MOBILE="mobile",TABLET="tablet",SMARTTV="smarttv",WEARABLE="wearable",EMBEDDED="embedded",UA_MAX_LENGTH=350;var AMAZON="Amazon",APPLE="Apple",ASUS="ASUS",BLACKBERRY="BlackBerry",BROWSER="Browser",CHROME="Chrome",EDGE="Edge",FIREFOX="Firefox",GOOGLE="Google",HUAWEI="Huawei",LG="LG",MICROSOFT="Microsoft",MOTOROLA="Motorola",OPERA="Opera",SAMSUNG="Samsung",SHARP="Sharp",SONY="Sony",VIERA="Viera",XIAOMI="Xiaomi",ZEBRA="Zebra",FACEBOOK="Facebook",CHROMIUM_OS="Chromium OS",MAC_OS="Mac OS";var extend=function(regexes,extensions){var mergedRegexes={};for(var i in regexes){if(extensions[i]&&extensions[i].length%2===0){mergedRegexes[i]=extensions[i].concat(regexes[i])}else{mergedRegexes[i]=regexes[i]}}return mergedRegexes},enumerize=function(arr){var enums={};for(var i=0;i<arr.length;i++){enums[arr[i].toUpperCase()]=arr[i]}return enums},has=function(str1,str2){return typeof str1===STR_TYPE?lowerize(str2).indexOf(lowerize(str1))!==-1:false},lowerize=function(str){return str.toLowerCase()},majorize=function(version){return typeof version===STR_TYPE?version.replace(/[^\d\.]/g,EMPTY).split(".")[0]:undefined},trim=function(str,len){if(typeof str===STR_TYPE){str=str.replace(/^\s\s*/,EMPTY);return typeof len===UNDEF_TYPE?str:str.substring(0,UA_MAX_LENGTH)}};var rgxMapper=function(ua,arrays){var i=0,j,k,p,q,matches,match;while(i<arrays.length&&!matches){var regex=arrays[i],props=arrays[i+1];j=k=0;while(j<regex.length&&!matches){if(!regex[j]){break}matches=regex[j++].exec(ua);if(!!matches){for(p=0;p<props.length;p++){match=matches[++k];q=props[p];if(typeof q===OBJ_TYPE&&q.length>0){if(q.length===2){if(typeof q[1]==FUNC_TYPE){this[q[0]]=q[1].call(this,match)}else{this[q[0]]=q[1]}}else if(q.length===3){if(typeof q[1]===FUNC_TYPE&&!(q[1].exec&&q[1].test)){this[q[0]]=match?q[1].call(this,match,q[2]):undefined}else{this[q[0]]=match?match.replace(q[1],q[2]):undefined}}else if(q.length===4){this[q[0]]=match?q[3].call(this,match.replace(q[1],q[2])):undefined}}else{this[q]=match?match:undefined}}}}i+=2}},strMapper=function(str,map){for(var i in map){if(typeof map[i]===OBJ_TYPE&&map[i].length>0){for(var j=0;j<map[i].length;j++){if(has(map[i][j],str)){return i===UNKNOWN?undefined:i}}}else if(has(map[i],str)){return i===UNKNOWN?undefined:i}}return str};var oldSafariMap={"1.0":"/8",1.2:"/1",1.3:"/3","2.0":"/412","2.0.2":"/416","2.0.3":"/417","2.0.4":"/419","?":"/"},windowsVersionMap={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"};var regexes={browser:[[/\b(?:crmo|crios)\/([\w\.]+)/i],[VERSION,[NAME,"Chrome"]],[/edg(?:e|ios|a)?\/([\w\.]+)/i],[VERSION,[NAME,"Edge"]],[/(opera mini)\/([-\w\.]+)/i,/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i],[NAME,VERSION],[/opios[\/ ]+([\w\.]+)/i],[VERSION,[NAME,OPERA+" Mini"]],[/\bopr\/([\w\.]+)/i],[VERSION,[NAME,OPERA]],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer)[\/ ]?([\w\.]*)/i,/(avant |iemobile|slim)(?:browser)?[\/ ]?([\w\.]*)/i,/(ba?idubrowser)[\/ ]?([\w\.]+)/i,/(?:ms|\()(ie) ([\w\.]+)/i,/(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|qq|duckduckgo)\/([-\w\.]+)/i,/(weibo)__([\d\.]+)/i],[NAME,VERSION],[/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i],[VERSION,[NAME,"UC"+BROWSER]],[/microm.+\bqbcore\/([\w\.]+)/i,/\bqbcore\/([\w\.]+).+microm/i],[VERSION,[NAME,"WeChat(Win) Desktop"]],[/micromessenger\/([\w\.]+)/i],[VERSION,[NAME,"WeChat"]],[/konqueror\/([\w\.]+)/i],[VERSION,[NAME,"Konqueror"]],[/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],[VERSION,[NAME,"IE"]],[/yabrowser\/([\w\.]+)/i],[VERSION,[NAME,"Yandex"]],[/(avast|avg)\/([\w\.]+)/i],[[NAME,/(.+)/,"$1 Secure "+BROWSER],VERSION],[/\bfocus\/([\w\.]+)/i],[VERSION,[NAME,FIREFOX+" Focus"]],[/\bopt\/([\w\.]+)/i],[VERSION,[NAME,OPERA+" Touch"]],[/coc_coc\w+\/([\w\.]+)/i],[VERSION,[NAME,"Coc Coc"]],[/dolfin\/([\w\.]+)/i],[VERSION,[NAME,"Dolphin"]],[/coast\/([\w\.]+)/i],[VERSION,[NAME,OPERA+" Coast"]],[/miuibrowser\/([\w\.]+)/i],[VERSION,[NAME,"MIUI "+BROWSER]],[/fxios\/([-\w\.]+)/i],[VERSION,[NAME,FIREFOX]],[/\bqihu|(qi?ho?o?|360)browser/i],[[NAME,"360 "+BROWSER]],[/(oculus|samsung|sailfish|huawei)browser\/([\w\.]+)/i],[[NAME,/(.+)/,"$1 "+BROWSER],VERSION],[/(comodo_dragon)\/([\w\.]+)/i],[[NAME,/_/g," "],VERSION],[/(electron)\/([\w\.]+) safari/i,/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,/m?(qqbrowser|baiduboxapp|2345Explorer)[\/ ]?([\w\.]+)/i],[NAME,VERSION],[/(metasr)[\/ ]?([\w\.]+)/i,/(lbbrowser)/i,/\[(linkedin)app\]/i],[NAME],[/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],[[NAME,FACEBOOK],VERSION],[/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,/safari (line)\/([\w\.]+)/i,/\b(line)\/([\w\.]+)\/iab/i,/(chromium|instagram)[\/ ]([-\w\.]+)/i],[NAME,VERSION],[/\bgsa\/([\w\.]+) .*safari\//i],[VERSION,[NAME,"GSA"]],[/headlesschrome(?:\/([\w\.]+)| )/i],[VERSION,[NAME,CHROME+" Headless"]],[/ wv\).+(chrome)\/([\w\.]+)/i],[[NAME,CHROME+" WebView"],VERSION],[/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],[VERSION,[NAME,"Android "+BROWSER]],[/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],[NAME,VERSION],[/version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i],[VERSION,[NAME,"Mobile Safari"]],[/version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i],[VERSION,NAME],[/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],[NAME,[VERSION,strMapper,oldSafariMap]],[/(webkit|khtml)\/([\w\.]+)/i],[NAME,VERSION],[/(navigator|netscape\d?)\/([-\w\.]+)/i],[[NAME,"Netscape"],VERSION],[/mobile vr; rv:([\w\.]+)\).+firefox/i],[VERSION,[NAME,FIREFOX+" Reality"]],[/ekiohf.+(flow)\/([\w\.]+)/i,/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\/ ]?([\w\.\+]+)/i,/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i,/(firefox)\/([\w\.]+)/i,/(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i,/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,/(links) \(([\w\.]+)/i,/panasonic;(viera)/i],[NAME,VERSION],[/(cobalt)\/([\w\.]+)/i],[NAME,[VERSION,/master.|lts./,""]]],cpu:[[/(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\)]/i],[[ARCHITECTURE,"amd64"]],[/(ia32(?=;))/i],[[ARCHITECTURE,lowerize]],[/((?:i[346]|x)86)[;\)]/i],[[ARCHITECTURE,"ia32"]],[/\b(aarch64|arm(v?8e?l?|_?64))\b/i],[[ARCHITECTURE,"arm64"]],[/\b(arm(?:v[67])?ht?n?[fl]p?)\b/i],[[ARCHITECTURE,"armhf"]],[/windows (ce|mobile); ppc;/i],[[ARCHITECTURE,"arm"]],[/((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i],[[ARCHITECTURE,/ower/,EMPTY,lowerize]],[/(sun4\w)[;\)]/i],[[ARCHITECTURE,"sparc"]],[/((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i],[[ARCHITECTURE,lowerize]]],device:[[/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i],[MODEL,[VENDOR,SAMSUNG],[TYPE,TABLET]],[/\b((?:s[cgp]h|gt|sm)-\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,/samsung[- ]([-\w]+)/i,/sec-(sgh\w+)/i],[MODEL,[VENDOR,SAMSUNG],[TYPE,MOBILE]],[/\((ip(?:hone|od)[\w ]*);/i],[MODEL,[VENDOR,APPLE],[TYPE,MOBILE]],[/\((ipad);[-\w\),; ]+apple/i,/applecoremedia\/[\w\.]+ \((ipad)/i,/\b(ipad)\d\d?,\d\d?[;\]].+ios/i],[MODEL,[VENDOR,APPLE],[TYPE,TABLET]],[/(macintosh);/i],[MODEL,[VENDOR,APPLE]],[/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],[MODEL,[VENDOR,SHARP],[TYPE,MOBILE]],[/\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i],[MODEL,[VENDOR,HUAWEI],[TYPE,TABLET]],[/(?:huawei|honor)([-\w ]+)[;\)]/i,/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i],[MODEL,[VENDOR,HUAWEI],[TYPE,MOBILE]],[/\b(poco[\w ]+)(?: bui|\))/i,/\b; (\w+) build\/hm\1/i,/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,/\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i],[[MODEL,/_/g," "],[VENDOR,XIAOMI],[TYPE,MOBILE]],[/\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i],[[MODEL,/_/g," "],[VENDOR,XIAOMI],[TYPE,TABLET]],[/; (\w+) bui.+ oppo/i,/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],[MODEL,[VENDOR,"OPPO"],[TYPE,MOBILE]],[/vivo (\w+)(?: bui|\))/i,/\b(v[12]\d{3}\w?[at])(?: bui|;)/i],[MODEL,[VENDOR,"Vivo"],[TYPE,MOBILE]],[/\b(rmx[12]\d{3})(?: bui|;|\))/i],[MODEL,[VENDOR,"Realme"],[TYPE,MOBILE]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,/\bmot(?:orola)?[- ](\w*)/i,/((?:moto[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i],[MODEL,[VENDOR,MOTOROLA],[TYPE,MOBILE]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i],[MODEL,[VENDOR,MOTOROLA],[TYPE,TABLET]],[/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],[MODEL,[VENDOR,LG],[TYPE,TABLET]],[/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,/\blg[-e;\/ ]+((?!browser|netcast|android tv)\w+)/i,/\blg-?([\d\w]+) bui/i],[MODEL,[VENDOR,LG],[TYPE,MOBILE]],[/(ideatab[-\w ]+)/i,/lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i],[MODEL,[VENDOR,"Lenovo"],[TYPE,TABLET]],[/(?:maemo|nokia).*(n900|lumia \d+)/i,/nokia[-_ ]?([-\w\.]*)/i],[[MODEL,/_/g," "],[VENDOR,"Nokia"],[TYPE,MOBILE]],[/(pixel c)\b/i],[MODEL,[VENDOR,GOOGLE],[TYPE,TABLET]],[/droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i],[MODEL,[VENDOR,GOOGLE],[TYPE,MOBILE]],[/droid.+ (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[MODEL,[VENDOR,SONY],[TYPE,MOBILE]],[/sony tablet [ps]/i,/\b(?:sony)?sgp\w+(?: bui|\))/i],[[MODEL,"Xperia Tablet"],[VENDOR,SONY],[TYPE,TABLET]],[/ (kb2005|in20[12]5|be20[12][59])\b/i,/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],[MODEL,[VENDOR,"OnePlus"],[TYPE,MOBILE]],[/(alexa)webm/i,/(kf[a-z]{2}wi)( bui|\))/i,/(kf[a-z]+)( bui|\)).+silk\//i],[MODEL,[VENDOR,AMAZON],[TYPE,TABLET]],[/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],[[MODEL,/(.+)/g,"Fire Phone $1"],[VENDOR,AMAZON],[TYPE,MOBILE]],[/(playbook);[-\w\),; ]+(rim)/i],[MODEL,VENDOR,[TYPE,TABLET]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,/\(bb10; (\w+)/i],[MODEL,[VENDOR,BLACKBERRY],[TYPE,MOBILE]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],[MODEL,[VENDOR,ASUS],[TYPE,TABLET]],[/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],[MODEL,[VENDOR,ASUS],[TYPE,MOBILE]],[/(nexus 9)/i],[MODEL,[VENDOR,"HTC"],[TYPE,TABLET]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i],[VENDOR,[MODEL,/_/g," "],[TYPE,MOBILE]],[/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],[MODEL,[VENDOR,"Acer"],[TYPE,TABLET]],[/droid.+; (m[1-5] note) bui/i,/\bmz-([-\w]{2,})/i],[MODEL,[VENDOR,"Meizu"],[TYPE,MOBILE]],[/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[-_ ]?([-\w]*)/i,/(hp) ([\w ]+\w)/i,/(asus)-?(\w+)/i,/(microsoft); (lumia[\w ]+)/i,/(lenovo)[-_ ]?([-\w]+)/i,/(jolla)/i,/(oppo) ?([\w ]+) bui/i],[VENDOR,MODEL,[TYPE,MOBILE]],[/(kobo)\s(ereader|touch)/i,/(archos) (gamepad2?)/i,/(hp).+(touchpad(?!.+tablet)|tablet)/i,/(kindle)\/([\w\.]+)/i,/(nook)[\w ]+build\/(\w+)/i,/(dell) (strea[kpr\d ]*[\dko])/i,/(le[- ]+pan)[- ]+(\w{1,9}) bui/i,/(trinity)[- ]*(t\d{3}) bui/i,/(gigaset)[- ]+(q\w{1,9}) bui/i,/(vodafone) ([\w ]+)(?:\)| bui)/i],[VENDOR,MODEL,[TYPE,TABLET]],[/(surface duo)/i],[MODEL,[VENDOR,MICROSOFT],[TYPE,TABLET]],[/droid [\d\.]+; (fp\du?)(?: b|\))/i],[MODEL,[VENDOR,"Fairphone"],[TYPE,MOBILE]],[/(u304aa)/i],[MODEL,[VENDOR,"AT&T"],[TYPE,MOBILE]],[/\bsie-(\w*)/i],[MODEL,[VENDOR,"Siemens"],[TYPE,MOBILE]],[/\b(rct\w+) b/i],[MODEL,[VENDOR,"RCA"],[TYPE,TABLET]],[/\b(venue[\d ]{2,7}) b/i],[MODEL,[VENDOR,"Dell"],[TYPE,TABLET]],[/\b(q(?:mv|ta)\w+) b/i],[MODEL,[VENDOR,"Verizon"],[TYPE,TABLET]],[/\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i],[MODEL,[VENDOR,"Barnes & Noble"],[TYPE,TABLET]],[/\b(tm\d{3}\w+) b/i],[MODEL,[VENDOR,"NuVision"],[TYPE,TABLET]],[/\b(k88) b/i],[MODEL,[VENDOR,"ZTE"],[TYPE,TABLET]],[/\b(nx\d{3}j) b/i],[MODEL,[VENDOR,"ZTE"],[TYPE,MOBILE]],[/\b(gen\d{3}) b.+49h/i],[MODEL,[VENDOR,"Swiss"],[TYPE,MOBILE]],[/\b(zur\d{3}) b/i],[MODEL,[VENDOR,"Swiss"],[TYPE,TABLET]],[/\b((zeki)?tb.*\b) b/i],[MODEL,[VENDOR,"Zeki"],[TYPE,TABLET]],[/\b([yr]\d{2}) b/i,/\b(dragon[- ]+touch |dt)(\w{5}) b/i],[[VENDOR,"Dragon Touch"],MODEL,[TYPE,TABLET]],[/\b(ns-?\w{0,9}) b/i],[MODEL,[VENDOR,"Insignia"],[TYPE,TABLET]],[/\b((nxa|next)-?\w{0,9}) b/i],[MODEL,[VENDOR,"NextBook"],[TYPE,TABLET]],[/\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i],[[VENDOR,"Voice"],MODEL,[TYPE,MOBILE]],[/\b(lvtel\-)?(v1[12]) b/i],[[VENDOR,"LvTel"],MODEL,[TYPE,MOBILE]],[/\b(ph-1) /i],[MODEL,[VENDOR,"Essential"],[TYPE,MOBILE]],[/\b(v(100md|700na|7011|917g).*\b) b/i],[MODEL,[VENDOR,"Envizen"],[TYPE,TABLET]],[/\b(trio[-\w\. ]+) b/i],[MODEL,[VENDOR,"MachSpeed"],[TYPE,TABLET]],[/\btu_(1491) b/i],[MODEL,[VENDOR,"Rotor"],[TYPE,TABLET]],[/(shield[\w ]+) b/i],[MODEL,[VENDOR,"Nvidia"],[TYPE,TABLET]],[/(sprint) (\w+)/i],[VENDOR,MODEL,[TYPE,MOBILE]],[/(kin\.[onetw]{3})/i],[[MODEL,/\./g," "],[VENDOR,MICROSOFT],[TYPE,MOBILE]],[/droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],[MODEL,[VENDOR,ZEBRA],[TYPE,TABLET]],[/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],[MODEL,[VENDOR,ZEBRA],[TYPE,MOBILE]],[/smart-tv.+(samsung)/i],[VENDOR,[TYPE,SMARTTV]],[/hbbtv.+maple;(\d+)/i],[[MODEL,/^/,"SmartTV"],[VENDOR,SAMSUNG],[TYPE,SMARTTV]],[/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],[[VENDOR,LG],[TYPE,SMARTTV]],[/(apple) ?tv/i],[VENDOR,[MODEL,APPLE+" TV"],[TYPE,SMARTTV]],[/crkey/i],[[MODEL,CHROME+"cast"],[VENDOR,GOOGLE],[TYPE,SMARTTV]],[/droid.+aft(\w)( bui|\))/i],[MODEL,[VENDOR,AMAZON],[TYPE,SMARTTV]],[/\(dtv[\);].+(aquos)/i,/(aquos-tv[\w ]+)\)/i],[MODEL,[VENDOR,SHARP],[TYPE,SMARTTV]],[/(bravia[\w ]+)( bui|\))/i],[MODEL,[VENDOR,SONY],[TYPE,SMARTTV]],[/(mitv-\w{5}) bui/i],[MODEL,[VENDOR,XIAOMI],[TYPE,SMARTTV]],[/Hbbtv.*(technisat) (.*);/i],[VENDOR,MODEL,[TYPE,SMARTTV]],[/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],[[VENDOR,trim],[MODEL,trim],[TYPE,SMARTTV]],[/\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i],[[TYPE,SMARTTV]],[/(ouya)/i,/(nintendo) ([wids3utch]+)/i],[VENDOR,MODEL,[TYPE,CONSOLE]],[/droid.+; (shield) bui/i],[MODEL,[VENDOR,"Nvidia"],[TYPE,CONSOLE]],[/(playstation [345portablevi]+)/i],[MODEL,[VENDOR,SONY],[TYPE,CONSOLE]],[/\b(xbox(?: one)?(?!; xbox))[\); ]/i],[MODEL,[VENDOR,MICROSOFT],[TYPE,CONSOLE]],[/((pebble))app/i],[VENDOR,MODEL,[TYPE,WEARABLE]],[/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],[MODEL,[VENDOR,APPLE],[TYPE,WEARABLE]],[/droid.+; (glass) \d/i],[MODEL,[VENDOR,GOOGLE],[TYPE,WEARABLE]],[/droid.+; (wt63?0{2,3})\)/i],[MODEL,[VENDOR,ZEBRA],[TYPE,WEARABLE]],[/(quest( 2| pro)?)/i],[MODEL,[VENDOR,FACEBOOK],[TYPE,WEARABLE]],[/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],[VENDOR,[TYPE,EMBEDDED]],[/droid .+?; ([^;]+?)(?: bui|\) applew).+? mobile safari/i],[MODEL,[TYPE,MOBILE]],[/droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i],[MODEL,[TYPE,TABLET]],[/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],[[TYPE,TABLET]],[/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],[[TYPE,MOBILE]],[/(android[-\w\. ]{0,9});.+buil/i],[MODEL,[VENDOR,"Generic"]]],engine:[[/windows.+ edge\/([\w\.]+)/i],[VERSION,[NAME,EDGE+"HTML"]],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[VERSION,[NAME,"Blink"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,/ekioh(flow)\/([\w\.]+)/i,/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,/(icab)[\/ ]([23]\.[\d\.]+)/i],[NAME,VERSION],[/rv\:([\w\.]{1,9})\b.+(gecko)/i],[VERSION,NAME]],os:[[/microsoft (windows) (vista|xp)/i],[NAME,VERSION],[/(windows) nt 6\.2; (arm)/i,/(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i,/(windows)[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i],[NAME,[VERSION,strMapper,windowsVersionMap]],[/(win(?=3|9|n)|win 9x )([nt\d\.]+)/i],[[NAME,"Windows"],[VERSION,strMapper,windowsVersionMap]],[/ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i,/cfnetwork\/.+darwin/i],[[VERSION,/_/g,"."],[NAME,"iOS"]],[/(mac os x) ?([\w\. ]*)/i,/(macintosh|mac_powerpc\b)(?!.+haiku)/i],[[NAME,MAC_OS],[VERSION,/_/g,"."]],[/droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i],[VERSION,NAME],[/(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i,/(blackberry)\w*\/([\w\.]*)/i,/(tizen|kaios)[\/ ]([\w\.]+)/i,/\((series40);/i],[NAME,VERSION],[/\(bb(10);/i],[VERSION,[NAME,BLACKBERRY]],[/(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i],[VERSION,[NAME,"Symbian"]],[/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i],[VERSION,[NAME,FIREFOX+" OS"]],[/web0s;.+rt(tv)/i,/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i],[VERSION,[NAME,"webOS"]],[/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i],[VERSION,[NAME,"watchOS"]],[/crkey\/([\d\.]+)/i],[VERSION,[NAME,CHROME+"cast"]],[/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i],[[NAME,CHROMIUM_OS],VERSION],[/panasonic;(viera)/i,/(netrange)mmh/i,/(nettv)\/(\d+\.[\w\.]+)/i,/(nintendo|playstation) ([wids345portablevuch]+)/i,/(xbox); +xbox ([^\);]+)/i,/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,/(mint)[\/\(\) ]?(\w*)/i,/(mageia|vectorlinux)[; ]/i,/([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,/(hurd|linux) ?([\w\.]*)/i,/(gnu) ?([\w\.]*)/i,/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,/(haiku) (\w+)/i],[NAME,VERSION],[/(sunos) ?([\w\.\d]*)/i],[[NAME,"Solaris"],VERSION],[/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,/(aix) ((\d)(?=\.|\)| )[\w\.])*/i,/\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux)/i,/(unix) ?([\w\.]*)/i],[NAME,VERSION]]};var UAParser=function(ua,extensions){if(typeof ua===OBJ_TYPE){extensions=ua;ua=undefined}if(!(this instanceof UAParser)){return new UAParser(ua,extensions).getResult()}var _navigator=typeof window!==UNDEF_TYPE&&window.navigator?window.navigator:undefined;var _ua=ua||(_navigator&&_navigator.userAgent?_navigator.userAgent:EMPTY);var _uach=_navigator&&_navigator.userAgentData?_navigator.userAgentData:undefined;var _rgxmap=extensions?extend(regexes,extensions):regexes;this.getBrowser=function(){var _browser={};_browser[NAME]=undefined;_browser[VERSION]=undefined;rgxMapper.call(_browser,_ua,_rgxmap.browser);_browser[MAJOR]=majorize(_browser[VERSION]);if(_navigator&&_navigator.brave&&typeof _navigator.brave.isBrave==FUNC_TYPE){_browser[NAME]="Brave"}return _browser};this.getCPU=function(){var _cpu={};_cpu[ARCHITECTURE]=undefined;rgxMapper.call(_cpu,_ua,_rgxmap.cpu);return _cpu};this.getDevice=function(){var _device={};_device[VENDOR]=undefined;_device[MODEL]=undefined;_device[TYPE]=undefined;rgxMapper.call(_device,_ua,_rgxmap.device);if(!_device[TYPE]&&_uach&&_uach.mobile){_device[TYPE]=MOBILE}if(_device[MODEL]=="Macintosh"&&_navigator&&typeof _navigator.standalone!==UNDEF_TYPE&&_navigator.maxTouchPoints&&_navigator.maxTouchPoints>2){_device[MODEL]="iPad";_device[TYPE]=TABLET}return _device};this.getEngine=function(){var _engine={};_engine[NAME]=undefined;_engine[VERSION]=undefined;rgxMapper.call(_engine,_ua,_rgxmap.engine);return _engine};this.getOS=function(){var _os={};_os[NAME]=undefined;_os[VERSION]=undefined;rgxMapper.call(_os,_ua,_rgxmap.os);if(!_os[NAME]&&_uach&&_uach.platform!="Unknown"){_os[NAME]=_uach.platform.replace(/chrome os/i,CHROMIUM_OS).replace(/macos/i,MAC_OS)}return _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(ua){_ua=typeof ua===STR_TYPE&&ua.length>UA_MAX_LENGTH?trim(ua,UA_MAX_LENGTH):ua;return this};this.setUA(_ua);return this};UAParser.VERSION=LIBVERSION;UAParser.BROWSER=enumerize([NAME,VERSION,MAJOR]);UAParser.CPU=enumerize([ARCHITECTURE]);UAParser.DEVICE=enumerize([MODEL,VENDOR,TYPE,CONSOLE,MOBILE,SMARTTV,TABLET,WEARABLE,EMBEDDED]);UAParser.ENGINE=UAParser.OS=enumerize([NAME,VERSION]);if(typeof exports!==UNDEF_TYPE){if(typeof module!==UNDEF_TYPE&&module.exports){exports=module.exports=UAParser}exports.UAParser=UAParser}else{if(typeof define===FUNC_TYPE&&define.amd){define(function(){return UAParser})}else if(typeof window!==UNDEF_TYPE){window.UAParser=UAParser}}var $=typeof window!==UNDEF_TYPE&&(window.jQuery||window.Zepto);if($&&!$.ua){var parser=new UAParser;$.ua=parser.getResult();$.ua.get=function(){return parser.getUA()};$.ua.set=function(ua){parser.setUA(ua);var result=parser.getResult();for(var prop in result){$.ua[prop]=result[prop]}}}})(typeof window==="object"?window:this); | ||
(function(window,undefined){"use strict";var LIBVERSION="2.0.0-alpha.1",EMPTY="",UNKNOWN="?",FUNC_TYPE="function",UNDEF_TYPE="undefined",OBJ_TYPE="object",STR_TYPE="string",MAJOR="major",MODEL="model",NAME="name",TYPE="type",VENDOR="vendor",VERSION="version",ARCHITECTURE="architecture",CONSOLE="console",MOBILE="mobile",TABLET="tablet",SMARTTV="smarttv",WEARABLE="wearable",EMBEDDED="embedded",USER_AGENT="user-agent",UA_MAX_LENGTH=350,BRANDS="brands",FULLVERLIST="fullVersionList",PLATFORM="platform",PLATFORMVER="platformVersion",BITNESS="bitness",CH_HEADER="sec-ch-ua",CH_HEADER_FULL_VER_LIST=CH_HEADER+"-full-version-list",CH_HEADER_ARCH=CH_HEADER+"-arch",CH_HEADER_BITNESS=CH_HEADER+"-bitness",CH_HEADER_MOBILE=CH_HEADER+"-mobile",CH_HEADER_MODEL=CH_HEADER+"-model",CH_HEADER_PLATFORM=CH_HEADER+"-platform",CH_HEADER_PLATFORM_VER=CH_HEADER_PLATFORM+"-version",CH_ALL_VALUES=["brands","fullVersionList",MOBILE,MODEL,"platform","platformVersion",ARCHITECTURE,"bitness"],UA_BROWSER="browser",UA_CPU="cpu",UA_DEVICE="device",UA_ENGINE="engine",UA_OS="os",UA_RESULT="result",AMAZON="Amazon",APPLE="Apple",ASUS="ASUS",BLACKBERRY="BlackBerry",GOOGLE="Google",HUAWEI="Huawei",LG="LG",MICROSOFT="Microsoft",MOTOROLA="Motorola",SAMSUNG="Samsung",SHARP="Sharp",SONY="Sony",XIAOMI="Xiaomi",ZEBRA="Zebra",PREFIX_MOBILE="Mobile ",SUFFIX_BROWSER=" Browser",CHROME="Chrome",EDGE="Edge",FIREFOX="Firefox",OPERA="Opera",FACEBOOK="Facebook",WINDOWS="Windows";var NAVIGATOR=typeof window!==UNDEF_TYPE&&window.navigator?window.navigator:undefined,NAVIGATOR_UADATA=NAVIGATOR&&NAVIGATOR.userAgentData?NAVIGATOR.userAgentData:undefined;var assignFromEntries=function(arr){for(var i in arr){var propName=arr[i];if(typeof propName==OBJ_TYPE&&propName.length==2){this[propName[0]]=propName[1]}else{this[propName]=undefined}}return this},extend=function(regexes,extensions){var mergedRegexes={};for(var i in regexes){mergedRegexes[i]=extensions[i]&&extensions[i].length%2===0?extensions[i].concat(regexes[i]):regexes[i]}return mergedRegexes},enumerize=function(arr){var enums={};for(var i=0;i<arr.length;i++){enums[arr[i].toUpperCase()]=arr[i]}return enums},has=function(str1,str2){if(typeof str1===OBJ_TYPE&&str1.length>0){for(var i in str1){if(lowerize(str1[i])==lowerize(str2))return true}return false}return typeof str1===STR_TYPE?lowerize(str2).indexOf(lowerize(str1))!==-1:false},isExtensions=function(obj){for(var prop in obj){return/^(browser|cpu|device|engine|os)$/.test(prop)}},itemListToArray=function(header){if(!header)return undefined;var arr=[];var tokens=strip(/\\?\"/g,header).split(", ");for(var i=0;i<tokens.length;i++){var token=tokens[i].split(";v=");arr[i]={brand:token[0],version:token[1]}}return arr},lowerize=function(str){return typeof str===STR_TYPE?str.toLowerCase():str},majorize=function(version){return typeof version===STR_TYPE?strip(/[^\d\.]/g,version).split(".")[0]:undefined},strip=function(pattern,str){return str.replace(pattern,EMPTY)},stripQuotes=function(val){return typeof val===STR_TYPE?strip(/\"/g,val):val},trim=function(str,len){if(typeof str===STR_TYPE){str=strip(/^\s\s*/,str);return typeof len===UNDEF_TYPE?str:str.substring(0,UA_MAX_LENGTH)}};var rgxMapper=function(ua,arrays){if(!ua||!arrays)return;var i=0,j,k,p,q,matches,match;while(i<arrays.length&&!matches){var regex=arrays[i],props=arrays[i+1];j=k=0;while(j<regex.length&&!matches){if(!regex[j]){break}matches=regex[j++].exec(ua);if(!!matches){for(p=0;p<props.length;p++){match=matches[++k];q=props[p];if(typeof q===OBJ_TYPE&&q.length>0){if(q.length===2){if(typeof q[1]==FUNC_TYPE){this[q[0]]=q[1].call(this,match)}else{this[q[0]]=q[1]}}else if(q.length===3){if(typeof q[1]===FUNC_TYPE&&!(q[1].exec&&q[1].test)){this[q[0]]=match?q[1].call(this,match,q[2]):undefined}else{this[q[0]]=match?match.replace(q[1],q[2]):undefined}}else if(q.length===4){this[q[0]]=match?q[3].call(this,match.replace(q[1],q[2])):undefined}}else{this[q]=match?match:undefined}}}}i+=2}},strMapper=function(str,map){for(var i in map){if(typeof map[i]===OBJ_TYPE&&map[i].length>0){for(var j=0;j<map[i].length;j++){if(has(map[i][j],str)){return i===UNKNOWN?undefined:i}}}else if(has(map[i],str)){return i===UNKNOWN?undefined:i}}return str};var oldSafariMap={"1.0":"/8",1.2:"/1",1.3:"/3","2.0":"/412","2.0.2":"/416","2.0.3":"/417","2.0.4":"/419","?":"/"},windowsVersionMap={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"};var defaultRegexes={browser:[[/\b(?:crmo|crios)\/([\w\.]+)/i],[VERSION,[NAME,PREFIX_MOBILE+"Chrome"]],[/edg(?:e|ios|a)?\/([\w\.]+)/i],[VERSION,[NAME,"Edge"]],[/(opera mini)\/([-\w\.]+)/i,/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i],[NAME,VERSION],[/opios[\/ ]+([\w\.]+)/i],[VERSION,[NAME,OPERA+" Mini"]],[/\bopr\/([\w\.]+)/i],[VERSION,[NAME,OPERA]],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer)[\/ ]?([\w\.]*)/i,/(avant |iemobile|slim)(?:browser)?[\/ ]?([\w\.]*)/i,/(ba?idubrowser)[\/ ]?([\w\.]+)/i,/(?:ms|\()(ie) ([\w\.]+)/i,/(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|qq|duckduckgo)\/([-\w\.]+)/i,/(heytap|ovi)browser\/([\d\.]+)/i,/(weibo)__([\d\.]+)/i],[NAME,VERSION],[/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i],[VERSION,[NAME,"UCBrowser"]],[/microm.+\bqbcore\/([\w\.]+)/i,/\bqbcore\/([\w\.]+).+microm/i],[VERSION,[NAME,"WeChat(Win) Desktop"]],[/micromessenger\/([\w\.]+)/i],[VERSION,[NAME,"WeChat"]],[/konqueror\/([\w\.]+)/i],[VERSION,[NAME,"Konqueror"]],[/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],[VERSION,[NAME,"IE"]],[/ya(?:search)?browser\/([\w\.]+)/i],[VERSION,[NAME,"Yandex"]],[/(avast|avg)\/([\w\.]+)/i],[[NAME,/(.+)/,"$1 Secure"+SUFFIX_BROWSER],VERSION],[/\bfocus\/([\w\.]+)/i],[VERSION,[NAME,FIREFOX+" Focus"]],[/\bopt\/([\w\.]+)/i],[VERSION,[NAME,OPERA+" Touch"]],[/coc_coc\w+\/([\w\.]+)/i],[VERSION,[NAME,"Coc Coc"]],[/dolfin\/([\w\.]+)/i],[VERSION,[NAME,"Dolphin"]],[/coast\/([\w\.]+)/i],[VERSION,[NAME,OPERA+" Coast"]],[/miuibrowser\/([\w\.]+)/i],[VERSION,[NAME,"MIUI"+SUFFIX_BROWSER]],[/fxios\/([\w\.-]+)/i],[VERSION,[NAME,PREFIX_MOBILE+"Firefox"]],[/\bqihu|(qi?ho?o?|360)browser/i],[[NAME,"360"+SUFFIX_BROWSER]],[/(oculus|samsung|sailfish|huawei)browser\/([\w\.]+)/i],[[NAME,/(.+)/,"$1"+SUFFIX_BROWSER],VERSION],[/(comodo_dragon)\/([\w\.]+)/i],[[NAME,/_/g," "],VERSION],[/(electron)\/([\w\.]+) safari/i,/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,/m?(qqbrowser|baiduboxapp|2345Explorer)[\/ ]?([\w\.]+)/i],[NAME,VERSION],[/(metasr)[\/ ]?([\w\.]+)/i,/(lbbrowser)/i,/\[(linkedin)app\]/i],[NAME],[/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],[[NAME,FACEBOOK],VERSION],[/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,/safari (line)\/([\w\.]+)/i,/\b(line)\/([\w\.]+)\/iab/i,/(chromium|instagram)[\/ ]([-\w\.]+)/i],[NAME,VERSION],[/\bgsa\/([\w\.]+) .*safari\//i],[VERSION,[NAME,"GSA"]],[/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i],[VERSION,[NAME,"TikTok"]],[/headlesschrome(?:\/([\w\.]+)| )/i],[VERSION,[NAME,CHROME+" Headless"]],[/ wv\).+(chrome)\/([\w\.]+)/i],[[NAME,CHROME+" WebView"],VERSION],[/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],[VERSION,[NAME,"Android"+SUFFIX_BROWSER]],[/chrome\/([\w\.]+) mobile/i],[VERSION,[NAME,PREFIX_MOBILE+"Chrome"]],[/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],[NAME,VERSION],[/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i],[VERSION,[NAME,PREFIX_MOBILE+"Safari"]],[/iphone .*mobile(?:\/\w+ | ?)safari/i],[[NAME,PREFIX_MOBILE+"Safari"]],[/version\/([\w\.\,]+) .*(safari)/i],[VERSION,NAME],[/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],[NAME,[VERSION,strMapper,oldSafariMap]],[/(webkit|khtml)\/([\w\.]+)/i],[NAME,VERSION],[/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i],[[NAME,PREFIX_MOBILE+"Firefox"],VERSION],[/(navigator|netscape\d?)\/([-\w\.]+)/i],[[NAME,"Netscape"],VERSION],[/mobile vr; rv:([\w\.]+)\).+firefox/i],[VERSION,[NAME,FIREFOX+" Reality"]],[/ekiohf.+(flow)\/([\w\.]+)/i,/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\/ ]?([\w\.\+]+)/i,/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i,/(firefox)\/([\w\.]+)/i,/(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i,/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,/(links) \(([\w\.]+)/i,/panasonic;(viera)/i],[NAME,VERSION],[/(cobalt)\/([\w\.]+)/i],[NAME,[VERSION,/[^\d\.]+./,EMPTY]]],cpu:[[/\b(?:(amd|x|x86[-_]?|wow|win)64)\b/i],[[ARCHITECTURE,"amd64"]],[/(ia32(?=;))/i,/((?:i[346]|x)86)[;\)]/i],[[ARCHITECTURE,"ia32"]],[/\b(aarch64|arm(v?8e?l?|_?64))\b/i],[[ARCHITECTURE,"arm64"]],[/\b(arm(?:v[67])?ht?n?[fl]p?)\b/i],[[ARCHITECTURE,"armhf"]],[/windows (ce|mobile); ppc;/i],[[ARCHITECTURE,"arm"]],[/((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i],[[ARCHITECTURE,/ower/,EMPTY,lowerize]],[/(sun4\w)[;\)]/i],[[ARCHITECTURE,"sparc"]],[/((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i],[[ARCHITECTURE,lowerize]]],device:[[/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i],[MODEL,[VENDOR,SAMSUNG],[TYPE,TABLET]],[/\b((?:s[cgp]h|gt|sm)-\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,/samsung[- ]([-\w]+)/i,/sec-(sgh\w+)/i],[MODEL,[VENDOR,SAMSUNG],[TYPE,MOBILE]],[/(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i],[MODEL,[VENDOR,APPLE],[TYPE,MOBILE]],[/\((ipad);[-\w\),; ]+apple/i,/applecoremedia\/[\w\.]+ \((ipad)/i,/\b(ipad)\d\d?,\d\d?[;\]].+ios/i],[MODEL,[VENDOR,APPLE],[TYPE,TABLET]],[/(macintosh);/i],[MODEL,[VENDOR,APPLE]],[/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],[MODEL,[VENDOR,SHARP],[TYPE,MOBILE]],[/\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i],[MODEL,[VENDOR,HUAWEI],[TYPE,TABLET]],[/(?:huawei|honor)([-\w ]+)[;\)]/i,/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i],[MODEL,[VENDOR,HUAWEI],[TYPE,MOBILE]],[/\b(poco[\w ]+)(?: bui|\))/i,/\b; (\w+) build\/hm\1/i,/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,/\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i],[[MODEL,/_/g," "],[VENDOR,XIAOMI],[TYPE,MOBILE]],[/\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i],[[MODEL,/_/g," "],[VENDOR,XIAOMI],[TYPE,TABLET]],[/; (\w+) bui.+ oppo/i,/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],[MODEL,[VENDOR,"OPPO"],[TYPE,MOBILE]],[/vivo (\w+)(?: bui|\))/i,/\b(v[12]\d{3}\w?[at])(?: bui|;)/i],[MODEL,[VENDOR,"Vivo"],[TYPE,MOBILE]],[/\b(rmx[12]\d{3})(?: bui|;|\))/i],[MODEL,[VENDOR,"Realme"],[TYPE,MOBILE]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,/\bmot(?:orola)?[- ](\w*)/i,/((?:moto[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i],[MODEL,[VENDOR,MOTOROLA],[TYPE,MOBILE]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i],[MODEL,[VENDOR,MOTOROLA],[TYPE,TABLET]],[/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],[MODEL,[VENDOR,LG],[TYPE,TABLET]],[/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,/\blg[-e;\/ ]+((?!browser|netcast|android tv)\w+)/i,/\blg-?([\d\w]+) bui/i],[MODEL,[VENDOR,LG],[TYPE,MOBILE]],[/(ideatab[-\w ]+)/i,/lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i],[MODEL,[VENDOR,"Lenovo"],[TYPE,TABLET]],[/(?:maemo|nokia).*(n900|lumia \d+)/i,/nokia[-_ ]?([-\w\.]*)/i],[[MODEL,/_/g," "],[VENDOR,"Nokia"],[TYPE,MOBILE]],[/(pixel c)\b/i],[MODEL,[VENDOR,GOOGLE],[TYPE,TABLET]],[/droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i],[MODEL,[VENDOR,GOOGLE],[TYPE,MOBILE]],[/droid.+ (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[MODEL,[VENDOR,SONY],[TYPE,MOBILE]],[/sony tablet [ps]/i,/\b(?:sony)?sgp\w+(?: bui|\))/i],[[MODEL,"Xperia Tablet"],[VENDOR,SONY],[TYPE,TABLET]],[/ (kb2005|in20[12]5|be20[12][59])\b/i,/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],[MODEL,[VENDOR,"OnePlus"],[TYPE,MOBILE]],[/(alexa)webm/i,/(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i,/(kf[a-z]+)( bui|\)).+silk\//i],[MODEL,[VENDOR,AMAZON],[TYPE,TABLET]],[/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],[[MODEL,/(.+)/g,"Fire Phone $1"],[VENDOR,AMAZON],[TYPE,MOBILE]],[/(playbook);[-\w\),; ]+(rim)/i],[MODEL,VENDOR,[TYPE,TABLET]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,/\(bb10; (\w+)/i],[MODEL,[VENDOR,BLACKBERRY],[TYPE,MOBILE]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],[MODEL,[VENDOR,ASUS],[TYPE,TABLET]],[/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],[MODEL,[VENDOR,ASUS],[TYPE,MOBILE]],[/(nexus 9)/i],[MODEL,[VENDOR,"HTC"],[TYPE,TABLET]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i],[VENDOR,[MODEL,/_/g," "],[TYPE,MOBILE]],[/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],[MODEL,[VENDOR,"Acer"],[TYPE,TABLET]],[/droid.+; (m[1-5] note) bui/i,/\bmz-([-\w]{2,})/i],[MODEL,[VENDOR,"Meizu"],[TYPE,MOBILE]],[/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[-_ ]?([-\w]*)/i,/(hp) ([\w ]+\w)/i,/(asus)-?(\w+)/i,/(microsoft); (lumia[\w ]+)/i,/(lenovo)[-_ ]?([-\w]+)/i,/(jolla)/i,/(oppo) ?([\w ]+) bui/i],[VENDOR,MODEL,[TYPE,MOBILE]],[/(kobo)\s(ereader|touch)/i,/(archos) (gamepad2?)/i,/(hp).+(touchpad(?!.+tablet)|tablet)/i,/(kindle)\/([\w\.]+)/i],[VENDOR,MODEL,[TYPE,TABLET]],[/(surface duo)/i],[MODEL,[VENDOR,MICROSOFT],[TYPE,TABLET]],[/droid [\d\.]+; (fp\du?)(?: b|\))/i],[MODEL,[VENDOR,"Fairphone"],[TYPE,MOBILE]],[/(shield[\w ]+) b/i],[MODEL,[VENDOR,"Nvidia"],[TYPE,TABLET]],[/(sprint) (\w+)/i],[VENDOR,MODEL,[TYPE,MOBILE]],[/(kin\.[onetw]{3})/i],[[MODEL,/\./g," "],[VENDOR,MICROSOFT],[TYPE,MOBILE]],[/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],[MODEL,[VENDOR,ZEBRA],[TYPE,TABLET]],[/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],[MODEL,[VENDOR,ZEBRA],[TYPE,MOBILE]],[/smart-tv.+(samsung)/i],[VENDOR,[TYPE,SMARTTV]],[/hbbtv.+maple;(\d+)/i],[[MODEL,/^/,"SmartTV"],[VENDOR,SAMSUNG],[TYPE,SMARTTV]],[/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],[[VENDOR,LG],[TYPE,SMARTTV]],[/(apple) ?tv/i],[VENDOR,[MODEL,APPLE+" TV"],[TYPE,SMARTTV]],[/crkey/i],[[MODEL,CHROME+"cast"],[VENDOR,GOOGLE],[TYPE,SMARTTV]],[/droid.+aft(\w)( bui|\))/i],[MODEL,[VENDOR,AMAZON],[TYPE,SMARTTV]],[/\(dtv[\);].+(aquos)/i,/(aquos-tv[\w ]+)\)/i],[MODEL,[VENDOR,SHARP],[TYPE,SMARTTV]],[/(bravia[\w ]+)( bui|\))/i],[MODEL,[VENDOR,SONY],[TYPE,SMARTTV]],[/(mitv-\w{5}) bui/i],[MODEL,[VENDOR,XIAOMI],[TYPE,SMARTTV]],[/Hbbtv.*(technisat) (.*);/i],[VENDOR,MODEL,[TYPE,SMARTTV]],[/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],[[VENDOR,trim],[MODEL,trim],[TYPE,SMARTTV]],[/\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i],[[TYPE,SMARTTV]],[/(ouya)/i,/(nintendo) (\w+)/i],[VENDOR,MODEL,[TYPE,CONSOLE]],[/droid.+; (shield) bui/i],[MODEL,[VENDOR,"Nvidia"],[TYPE,CONSOLE]],[/(playstation \w+)/i],[MODEL,[VENDOR,SONY],[TYPE,CONSOLE]],[/\b(xbox(?: one)?(?!; xbox))[\); ]/i],[MODEL,[VENDOR,MICROSOFT],[TYPE,CONSOLE]],[/((pebble))app/i],[VENDOR,MODEL,[TYPE,WEARABLE]],[/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],[MODEL,[VENDOR,APPLE],[TYPE,WEARABLE]],[/droid.+; (glass) \d/i],[MODEL,[VENDOR,GOOGLE],[TYPE,WEARABLE]],[/droid.+; (wt63?0{2,3})\)/i],[MODEL,[VENDOR,ZEBRA],[TYPE,WEARABLE]],[/(quest( 2| pro)?)/i],[MODEL,[VENDOR,FACEBOOK],[TYPE,WEARABLE]],[/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],[VENDOR,[TYPE,EMBEDDED]],[/(aeobc)\b/i],[MODEL,[VENDOR,AMAZON],[TYPE,EMBEDDED]],[/droid .+?; ([^;]+?)(?: bui|\) applew).+? mobile safari/i],[MODEL,[TYPE,MOBILE]],[/droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i],[MODEL,[TYPE,TABLET]],[/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],[[TYPE,TABLET]],[/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],[[TYPE,MOBILE]],[/(android[-\w\. ]{0,9});.+buil/i],[MODEL,[VENDOR,"Generic"]]],engine:[[/windows.+ edge\/([\w\.]+)/i],[VERSION,[NAME,EDGE+"HTML"]],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[VERSION,[NAME,"Blink"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,/ekioh(flow)\/([\w\.]+)/i,/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,/(icab)[\/ ]([23]\.[\d\.]+)/i,/\b(libweb)/i],[NAME,VERSION],[/rv\:([\w\.]{1,9})\b.+(gecko)/i],[VERSION,NAME]],os:[[/microsoft (windows) (vista|xp)/i],[NAME,VERSION],[/(windows) nt 6\.2; (arm)/i,/(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i,/(windows)[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i],[NAME,[VERSION,strMapper,windowsVersionMap]],[/(win(?=3|9|n)|win 9x )([nt\d\.]+)/i],[[NAME,WINDOWS],[VERSION,strMapper,windowsVersionMap]],[/ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i,/ios;fbsv\/([\d\.]+)/i,/cfnetwork\/.+darwin/i],[[VERSION,/_/g,"."],[NAME,"iOS"]],[/(mac os x) ?([\w\. ]*)/i,/(macintosh|mac_powerpc\b)(?!.+haiku)/i],[[NAME,"macOS"],[VERSION,/_/g,"."]],[/droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i],[VERSION,NAME],[/(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i,/(blackberry)\w*\/([\w\.]*)/i,/(tizen|kaios)[\/ ]([\w\.]+)/i,/\((series40);/i],[NAME,VERSION],[/\(bb(10);/i],[VERSION,[NAME,BLACKBERRY]],[/(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i],[VERSION,[NAME,"Symbian"]],[/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i],[VERSION,[NAME,FIREFOX+" OS"]],[/web0s;.+rt(tv)/i,/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i],[VERSION,[NAME,"webOS"]],[/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i],[VERSION,[NAME,"watchOS"]],[/crkey\/([\d\.]+)/i],[VERSION,[NAME,CHROME+"cast"]],[/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i],[[NAME,"Chrome OS"],VERSION],[/panasonic;(viera)/i,/(netrange)mmh/i,/(nettv)\/(\d+\.[\w\.]+)/i,/(nintendo|playstation) (\w+)/i,/(xbox); +xbox ([^\);]+)/i,/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,/(mint)[\/\(\) ]?(\w*)/i,/(mageia|vectorlinux)[; ]/i,/([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,/(hurd|linux) ?([\w\.]*)/i,/(gnu) ?([\w\.]*)/i,/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,/(haiku) (\w+)/i],[NAME,VERSION],[/(sunos) ?([\w\.\d]*)/i],[[NAME,"Solaris"],VERSION],[/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,/(aix) ((\d)(?=\.|\)| )[\w\.])*/i,/\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux|serenityos)/i,/(unix) ?([\w\.]*)/i],[NAME,VERSION]]};var defaultProps=function(){var props={init:{},isIgnore:{},isIgnoreRgx:{},toString:{}};assignFromEntries.call(props.init,[[UA_BROWSER,[NAME,VERSION,MAJOR]],[UA_CPU,[ARCHITECTURE]],[UA_DEVICE,[TYPE,MODEL,VENDOR]],[UA_ENGINE,[NAME,VERSION]],[UA_OS,[NAME,VERSION]]]);assignFromEntries.call(props.isIgnore,[[UA_BROWSER,[VERSION,MAJOR]],[UA_ENGINE,[VERSION]],[UA_OS,[VERSION]]]);assignFromEntries.call(props.isIgnoreRgx,[[UA_BROWSER,/ ?browser$/i],[UA_OS,/ ?os$/i]]);assignFromEntries.call(props.toString,[[UA_BROWSER,[NAME,VERSION]],[UA_CPU,[ARCHITECTURE]],[UA_DEVICE,[VENDOR,MODEL]],[UA_ENGINE,[NAME,VERSION]],[UA_OS,[NAME,VERSION]]]);return props}();var createUAParserData=function(itemType,ua,rgxMap,uaCH){var init_props=defaultProps.init[itemType],is_ignoreProps=defaultProps.isIgnore[itemType]||0,is_ignoreRgx=defaultProps.isIgnoreRgx[itemType]||0,toString_props=defaultProps.toString[itemType]||0;function UAParserData(){assignFromEntries.call(this,init_props)}UAParserData.prototype.withClientHints=function(){if(!NAVIGATOR_UADATA){return new UAParserItem(itemType,ua,rgxMap,uaCH).parseCH().get()}return NAVIGATOR_UADATA.getHighEntropyValues(CH_ALL_VALUES).then(function(res){var JS_UACH=new UAParserDataCH(res,false);return new UAParserItem(itemType,ua,rgxMap,JS_UACH).parseCH().get()})};if(itemType!=UA_RESULT){UAParserData.prototype.is=function(strToCheck){var is=false;for(var i in this){if(this.hasOwnProperty(i)&&!has(is_ignoreProps,i)&&lowerize(is_ignoreRgx?strip(is_ignoreRgx,this[i]):this[i])==lowerize(is_ignoreRgx?strip(is_ignoreRgx,strToCheck):strToCheck)){is=true;if(strToCheck!=UNDEF_TYPE)break}else if(strToCheck==UNDEF_TYPE&&is){is=!is;break}}return is};UAParserData.prototype.toString=function(){var str=EMPTY;for(var i in toString_props){if(typeof this[toString_props[i]]!==UNDEF_TYPE){str+=(str?" ":EMPTY)+this[toString_props[i]]}}return str||UNDEF_TYPE}}if(!NAVIGATOR_UADATA){UAParserData.prototype.then=function(cb){cb(this);return this}}return new UAParserData};function UAParserDataCH(uach,isHTTP_UACH){uach=uach||{};assignFromEntries.call(this,CH_ALL_VALUES);if(isHTTP_UACH){assignFromEntries.call(this,[[BRANDS,itemListToArray(uach[CH_HEADER])],[FULLVERLIST,itemListToArray(uach[CH_HEADER_FULL_VER_LIST])],[BRANDS,itemListToArray(uach[CH_HEADER])],[MOBILE,/\?1/.test(uach[CH_HEADER_MOBILE])],[MODEL,stripQuotes(uach[CH_HEADER_MODEL])],[PLATFORM,stripQuotes(uach[CH_HEADER_PLATFORM])],[PLATFORMVER,stripQuotes(uach[CH_HEADER_PLATFORM_VER])],[ARCHITECTURE,stripQuotes(uach[CH_HEADER_ARCH])],[BITNESS,stripQuotes(uach[CH_HEADER_BITNESS])]])}else{for(var prop in uach){if(this.hasOwnProperty(prop)&&typeof uach[prop]!==UNDEF_TYPE)this[prop]=uach[prop]}}return this}function UAParserItem(itemType,ua,rgxMap,uaCH){assignFromEntries.call(this,[["itemType",itemType],["ua",ua],["uaCH",uaCH],["rgxMap",rgxMap],["data",createUAParserData(itemType,ua,rgxMap,uaCH)]]);this.parse();switch(this.itemType){case UA_BROWSER:if(NAVIGATOR&&NAVIGATOR.userAgent==ua&&NAVIGATOR.brave&&typeof NAVIGATOR.brave.isBrave==FUNC_TYPE){this.set(NAME,"Brave")}this.set(MAJOR,majorize(this.get(VERSION)));break;case UA_DEVICE:if(!this.get(TYPE)&&NAVIGATOR_UADATA&&NAVIGATOR_UADATA[MOBILE]){this.set(TYPE,MOBILE)}if(this.get(MODEL)=="Macintosh"&&NAVIGATOR&&typeof NAVIGATOR.standalone!==UNDEF_TYPE&&NAVIGATOR.maxTouchPoints&&NAVIGATOR.maxTouchPoints>2){this.set(MODEL,"iPad").set(TYPE,TABLET)}break;case UA_OS:if(!this.get(NAME)&&NAVIGATOR_UADATA&&NAVIGATOR_UADATA[PLATFORM]&&NAVIGATOR_UADATA[PLATFORM]!="Unknown"){this.set(NAME,NAVIGATOR_UADATA[PLATFORM])}break;case UA_RESULT:var createUAParserItem=function(itemType){return new UAParserItem(itemType,ua,rgxMap[itemType],uaCH).get()};this.set("ua",ua).set(UA_BROWSER,createUAParserItem(UA_BROWSER)).set(UA_CPU,createUAParserItem(UA_CPU)).set(UA_DEVICE,createUAParserItem(UA_DEVICE)).set(UA_ENGINE,createUAParserItem(UA_ENGINE)).set(UA_OS,createUAParserItem(UA_OS)).get()}return this}UAParserItem.prototype.get=function(prop){if(!prop)return this.data;return this.data.hasOwnProperty(prop)?this.data[prop]:undefined};UAParserItem.prototype.parse=function(){if(this.itemType!=UA_RESULT){rgxMapper.call(this.data,this.ua,this.rgxMap)}return this};UAParserItem.prototype.parseCH=function(){var ua=this.ua,uaCH=this.uaCH,rgxMap=this.rgxMap;switch(this.itemType){case UA_BROWSER:var brands=uaCH[FULLVERLIST]||uaCH[BRANDS];if(brands){for(var i in brands){var brandName=brands[i].brand,brandVersion=brands[i].version;if(!/not.a.brand/i.test(brandName)||/chromi/i.test(this.get(NAME))){this.set(NAME,strip(GOOGLE+" ",brandName)).set(VERSION,brandVersion).set(MAJOR,majorize(brandVersion))}}}break;case UA_CPU:var archName=uaCH[ARCHITECTURE];if(archName){if(archName&&uaCH[BITNESS]=="64")archName+="64";rgxMapper.call(this.data,archName+";",rgxMap)}break;case UA_DEVICE:if(uaCH[MOBILE]){this.set(TYPE,MOBILE)}if(uaCH[MODEL]){this.set(MODEL,uaCH[MODEL])}break;case UA_OS:var osName=uaCH[PLATFORM];if(osName){var osVersion=uaCH[PLATFORMVER];if(osName==WINDOWS)osVersion=parseInt(majorize(osVersion),10)>=13?"11":"10";this.set(NAME,osName).set(VERSION,osVersion)}break;case UA_RESULT:var createUAParserItemWithCH=function(itemType){return new UAParserItem(itemType,ua,rgxMap[itemType],uaCH).parseCH().get()};this.set("ua",ua).set(UA_BROWSER,createUAParserItemWithCH(UA_BROWSER)).set(UA_CPU,createUAParserItemWithCH(UA_CPU)).set(UA_DEVICE,createUAParserItemWithCH(UA_DEVICE)).set(UA_ENGINE,createUAParserItemWithCH(UA_ENGINE)).set(UA_OS,createUAParserItemWithCH(UA_OS))}return this};UAParserItem.prototype.set=function(prop,val){this.data[prop]=val;return this};function UAParser(ua,extensions,headers){if(typeof ua===OBJ_TYPE){if(isExtensions(ua)){if(typeof extensions===OBJ_TYPE){headers=extensions}extensions=ua}else{headers=ua;extensions=undefined}ua=undefined}else if(typeof ua===STR_TYPE&&!isExtensions(extensions)){headers=extensions;extensions=undefined}if(!(this instanceof UAParser)){return new UAParser(ua,extensions,headers).getResult()}var userAgent=ua||(NAVIGATOR&&NAVIGATOR.userAgent?NAVIGATOR.userAgent:headers&&headers[USER_AGENT]?headers[USER_AGENT]:EMPTY),HTTP_UACH=new UAParserDataCH(headers,true),regexMap=extensions?extend(defaultRegexes,extensions):defaultRegexes,createUAParserItemFunc=function(itemType){return function(){return new UAParserItem(itemType,userAgent,itemType==UA_RESULT?regexMap:regexMap[itemType],HTTP_UACH).get()}};assignFromEntries.call(this,[["getBrowser",createUAParserItemFunc(UA_BROWSER)],["getCPU",createUAParserItemFunc(UA_CPU)],["getDevice",createUAParserItemFunc(UA_DEVICE)],["getEngine",createUAParserItemFunc(UA_ENGINE)],["getOS",createUAParserItemFunc(UA_OS)],["getResult",createUAParserItemFunc(UA_RESULT)],["getUA",function(){return userAgent}],["setUA",function(ua){userAgent=typeof ua===STR_TYPE&&ua.length>UA_MAX_LENGTH?trim(ua,UA_MAX_LENGTH):ua;return this}]]).setUA(userAgent);return this}UAParser.VERSION=LIBVERSION;UAParser.BROWSER=enumerize([NAME,VERSION,MAJOR]);UAParser.CPU=enumerize([ARCHITECTURE]);UAParser.DEVICE=enumerize([MODEL,VENDOR,TYPE,CONSOLE,MOBILE,SMARTTV,TABLET,WEARABLE,EMBEDDED]);UAParser.ENGINE=UAParser.OS=enumerize([NAME,VERSION]);if(typeof exports!==UNDEF_TYPE){if(typeof module!==UNDEF_TYPE&&module.exports){exports=module.exports=UAParser}exports.UAParser=UAParser}else{if(typeof define===FUNC_TYPE&&define.amd){define(function(){return UAParser})}else if(typeof window!==UNDEF_TYPE){window.UAParser=UAParser}}var $=typeof window!==UNDEF_TYPE&&(window.jQuery||window.Zepto);if($&&!$.ua){var parser=new UAParser;$.ua=parser.getResult();$.ua.get=function(){return parser.getUA()};$.ua.set=function(ua){parser.setUA(ua);var result=parser.getResult();for(var prop in result){$.ua[prop]=result[prop]}}}})(typeof window==="object"?window:this); |
@@ -1,4 +0,4 @@ | ||
/* UAParser.js v1.0.34 | ||
Copyright © 2012-2021 Faisal Salman <f@faisalman.com> | ||
/* UAParser.js v2.0.0-alpha.1 | ||
Copyright © 2012-2023 Faisal Salman <f@faisalman.com> | ||
MIT License */ | ||
!function(n,l){"use strict";function i(i){for(var e={},o=0;o<i.length;o++)e[i[o].toUpperCase()]=i[o];return e}function r(i,e){return typeof i==d&&-1!==H(e).indexOf(H(i))}function s(i,e){if(typeof i==d)return i=i.replace(/^\s\s*/,""),typeof e==w?i:i.substring(0,350)}function b(i,e){for(var o,a,r,t,n,s=0;s<e.length&&!t;){for(var b=e[s],w=e[s+1],d=o=0;d<b.length&&!t&&b[d];)if(t=b[d++].exec(i))for(a=0;a<w.length;a++)n=t[++o],typeof(r=w[a])==u&&0<r.length?2===r.length?typeof r[1]==c?this[r[0]]=r[1].call(this,n):this[r[0]]=r[1]:3===r.length?typeof r[1]!=c||r[1].exec&&r[1].test?this[r[0]]=n?n.replace(r[1],r[2]):l:this[r[0]]=n?r[1].call(this,n,r[2]):l:4===r.length&&(this[r[0]]=n?r[3].call(this,n.replace(r[1],r[2])):l):this[r]=n||l;s+=2}}function e(i,e){for(var o in e)if(typeof e[o]==u&&0<e[o].length){for(var a=0;a<e[o].length;a++)if(r(e[o][a],i))return"?"===o?l:o}else if(r(e[o],i))return"?"===o?l:o;return i}var c="function",w="undefined",u="object",d="string",m="major",p="model",h="name",f="type",g="vendor",v="version",x="architecture",o="console",k="mobile",y="tablet",a="smarttv",t="wearable",_="embedded",T="Amazon",S="Apple",q="ASUS",z="BlackBerry",N="Browser",A="Chrome",C="Firefox",E="Google",O="Huawei",U="LG",j="Microsoft",P="Motorola",R="Opera",M="Samsung",B="Sharp",V="Sony",D="Xiaomi",I="Zebra",W="Facebook",F="Chromium OS",G="Mac OS",H=function(i){return i.toLowerCase()},L={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"},Z={browser:[[/\b(?:crmo|crios)\/([\w\.]+)/i],[v,[h,"Chrome"]],[/edg(?:e|ios|a)?\/([\w\.]+)/i],[v,[h,"Edge"]],[/(opera mini)\/([-\w\.]+)/i,/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i],[h,v],[/opios[\/ ]+([\w\.]+)/i],[v,[h,R+" Mini"]],[/\bopr\/([\w\.]+)/i],[v,[h,R]],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer)[\/ ]?([\w\.]*)/i,/(avant |iemobile|slim)(?:browser)?[\/ ]?([\w\.]*)/i,/(ba?idubrowser)[\/ ]?([\w\.]+)/i,/(?:ms|\()(ie) ([\w\.]+)/i,/(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|qq|duckduckgo)\/([-\w\.]+)/i,/(weibo)__([\d\.]+)/i],[h,v],[/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i],[v,[h,"UC"+N]],[/microm.+\bqbcore\/([\w\.]+)/i,/\bqbcore\/([\w\.]+).+microm/i],[v,[h,"WeChat(Win) Desktop"]],[/micromessenger\/([\w\.]+)/i],[v,[h,"WeChat"]],[/konqueror\/([\w\.]+)/i],[v,[h,"Konqueror"]],[/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],[v,[h,"IE"]],[/yabrowser\/([\w\.]+)/i],[v,[h,"Yandex"]],[/(avast|avg)\/([\w\.]+)/i],[[h,/(.+)/,"$1 Secure "+N],v],[/\bfocus\/([\w\.]+)/i],[v,[h,C+" Focus"]],[/\bopt\/([\w\.]+)/i],[v,[h,R+" Touch"]],[/coc_coc\w+\/([\w\.]+)/i],[v,[h,"Coc Coc"]],[/dolfin\/([\w\.]+)/i],[v,[h,"Dolphin"]],[/coast\/([\w\.]+)/i],[v,[h,R+" Coast"]],[/miuibrowser\/([\w\.]+)/i],[v,[h,"MIUI "+N]],[/fxios\/([-\w\.]+)/i],[v,[h,C]],[/\bqihu|(qi?ho?o?|360)browser/i],[[h,"360 "+N]],[/(oculus|samsung|sailfish|huawei)browser\/([\w\.]+)/i],[[h,/(.+)/,"$1 "+N],v],[/(comodo_dragon)\/([\w\.]+)/i],[[h,/_/g," "],v],[/(electron)\/([\w\.]+) safari/i,/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,/m?(qqbrowser|baiduboxapp|2345Explorer)[\/ ]?([\w\.]+)/i],[h,v],[/(metasr)[\/ ]?([\w\.]+)/i,/(lbbrowser)/i,/\[(linkedin)app\]/i],[h],[/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],[[h,W],v],[/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,/safari (line)\/([\w\.]+)/i,/\b(line)\/([\w\.]+)\/iab/i,/(chromium|instagram)[\/ ]([-\w\.]+)/i],[h,v],[/\bgsa\/([\w\.]+) .*safari\//i],[v,[h,"GSA"]],[/headlesschrome(?:\/([\w\.]+)| )/i],[v,[h,A+" Headless"]],[/ wv\).+(chrome)\/([\w\.]+)/i],[[h,A+" WebView"],v],[/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],[v,[h,"Android "+N]],[/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],[h,v],[/version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i],[v,[h,"Mobile Safari"]],[/version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i],[v,h],[/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],[h,[v,e,{"1.0":"/8",1.2:"/1",1.3:"/3","2.0":"/412","2.0.2":"/416","2.0.3":"/417","2.0.4":"/419","?":"/"}]],[/(webkit|khtml)\/([\w\.]+)/i],[h,v],[/(navigator|netscape\d?)\/([-\w\.]+)/i],[[h,"Netscape"],v],[/mobile vr; rv:([\w\.]+)\).+firefox/i],[v,[h,C+" Reality"]],[/ekiohf.+(flow)\/([\w\.]+)/i,/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\/ ]?([\w\.\+]+)/i,/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i,/(firefox)\/([\w\.]+)/i,/(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i,/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,/(links) \(([\w\.]+)/i,/panasonic;(viera)/i],[h,v],[/(cobalt)\/([\w\.]+)/i],[h,[v,/master.|lts./,""]]],cpu:[[/(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\)]/i],[[x,"amd64"]],[/(ia32(?=;))/i],[[x,H]],[/((?:i[346]|x)86)[;\)]/i],[[x,"ia32"]],[/\b(aarch64|arm(v?8e?l?|_?64))\b/i],[[x,"arm64"]],[/\b(arm(?:v[67])?ht?n?[fl]p?)\b/i],[[x,"armhf"]],[/windows (ce|mobile); ppc;/i],[[x,"arm"]],[/((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i],[[x,/ower/,"",H]],[/(sun4\w)[;\)]/i],[[x,"sparc"]],[/((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i],[[x,H]]],device:[[/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i],[p,[g,M],[f,y]],[/\b((?:s[cgp]h|gt|sm)-\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,/samsung[- ]([-\w]+)/i,/sec-(sgh\w+)/i],[p,[g,M],[f,k]],[/\((ip(?:hone|od)[\w ]*);/i],[p,[g,S],[f,k]],[/\((ipad);[-\w\),; ]+apple/i,/applecoremedia\/[\w\.]+ \((ipad)/i,/\b(ipad)\d\d?,\d\d?[;\]].+ios/i],[p,[g,S],[f,y]],[/(macintosh);/i],[p,[g,S]],[/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],[p,[g,B],[f,k]],[/\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i],[p,[g,O],[f,y]],[/(?:huawei|honor)([-\w ]+)[;\)]/i,/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i],[p,[g,O],[f,k]],[/\b(poco[\w ]+)(?: bui|\))/i,/\b; (\w+) build\/hm\1/i,/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,/\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i],[[p,/_/g," "],[g,D],[f,k]],[/\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i],[[p,/_/g," "],[g,D],[f,y]],[/; (\w+) bui.+ oppo/i,/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],[p,[g,"OPPO"],[f,k]],[/vivo (\w+)(?: bui|\))/i,/\b(v[12]\d{3}\w?[at])(?: bui|;)/i],[p,[g,"Vivo"],[f,k]],[/\b(rmx[12]\d{3})(?: bui|;|\))/i],[p,[g,"Realme"],[f,k]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,/\bmot(?:orola)?[- ](\w*)/i,/((?:moto[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i],[p,[g,P],[f,k]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i],[p,[g,P],[f,y]],[/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],[p,[g,U],[f,y]],[/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,/\blg[-e;\/ ]+((?!browser|netcast|android tv)\w+)/i,/\blg-?([\d\w]+) bui/i],[p,[g,U],[f,k]],[/(ideatab[-\w ]+)/i,/lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i],[p,[g,"Lenovo"],[f,y]],[/(?:maemo|nokia).*(n900|lumia \d+)/i,/nokia[-_ ]?([-\w\.]*)/i],[[p,/_/g," "],[g,"Nokia"],[f,k]],[/(pixel c)\b/i],[p,[g,E],[f,y]],[/droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i],[p,[g,E],[f,k]],[/droid.+ (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[p,[g,V],[f,k]],[/sony tablet [ps]/i,/\b(?:sony)?sgp\w+(?: bui|\))/i],[[p,"Xperia Tablet"],[g,V],[f,y]],[/ (kb2005|in20[12]5|be20[12][59])\b/i,/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],[p,[g,"OnePlus"],[f,k]],[/(alexa)webm/i,/(kf[a-z]{2}wi)( bui|\))/i,/(kf[a-z]+)( bui|\)).+silk\//i],[p,[g,T],[f,y]],[/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],[[p,/(.+)/g,"Fire Phone $1"],[g,T],[f,k]],[/(playbook);[-\w\),; ]+(rim)/i],[p,g,[f,y]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,/\(bb10; (\w+)/i],[p,[g,z],[f,k]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],[p,[g,q],[f,y]],[/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],[p,[g,q],[f,k]],[/(nexus 9)/i],[p,[g,"HTC"],[f,y]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i],[g,[p,/_/g," "],[f,k]],[/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],[p,[g,"Acer"],[f,y]],[/droid.+; (m[1-5] note) bui/i,/\bmz-([-\w]{2,})/i],[p,[g,"Meizu"],[f,k]],[/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[-_ ]?([-\w]*)/i,/(hp) ([\w ]+\w)/i,/(asus)-?(\w+)/i,/(microsoft); (lumia[\w ]+)/i,/(lenovo)[-_ ]?([-\w]+)/i,/(jolla)/i,/(oppo) ?([\w ]+) bui/i],[g,p,[f,k]],[/(kobo)\s(ereader|touch)/i,/(archos) (gamepad2?)/i,/(hp).+(touchpad(?!.+tablet)|tablet)/i,/(kindle)\/([\w\.]+)/i,/(nook)[\w ]+build\/(\w+)/i,/(dell) (strea[kpr\d ]*[\dko])/i,/(le[- ]+pan)[- ]+(\w{1,9}) bui/i,/(trinity)[- ]*(t\d{3}) bui/i,/(gigaset)[- ]+(q\w{1,9}) bui/i,/(vodafone) ([\w ]+)(?:\)| bui)/i],[g,p,[f,y]],[/(surface duo)/i],[p,[g,j],[f,y]],[/droid [\d\.]+; (fp\du?)(?: b|\))/i],[p,[g,"Fairphone"],[f,k]],[/(u304aa)/i],[p,[g,"AT&T"],[f,k]],[/\bsie-(\w*)/i],[p,[g,"Siemens"],[f,k]],[/\b(rct\w+) b/i],[p,[g,"RCA"],[f,y]],[/\b(venue[\d ]{2,7}) b/i],[p,[g,"Dell"],[f,y]],[/\b(q(?:mv|ta)\w+) b/i],[p,[g,"Verizon"],[f,y]],[/\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i],[p,[g,"Barnes & Noble"],[f,y]],[/\b(tm\d{3}\w+) b/i],[p,[g,"NuVision"],[f,y]],[/\b(k88) b/i],[p,[g,"ZTE"],[f,y]],[/\b(nx\d{3}j) b/i],[p,[g,"ZTE"],[f,k]],[/\b(gen\d{3}) b.+49h/i],[p,[g,"Swiss"],[f,k]],[/\b(zur\d{3}) b/i],[p,[g,"Swiss"],[f,y]],[/\b((zeki)?tb.*\b) b/i],[p,[g,"Zeki"],[f,y]],[/\b([yr]\d{2}) b/i,/\b(dragon[- ]+touch |dt)(\w{5}) b/i],[[g,"Dragon Touch"],p,[f,y]],[/\b(ns-?\w{0,9}) b/i],[p,[g,"Insignia"],[f,y]],[/\b((nxa|next)-?\w{0,9}) b/i],[p,[g,"NextBook"],[f,y]],[/\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i],[[g,"Voice"],p,[f,k]],[/\b(lvtel\-)?(v1[12]) b/i],[[g,"LvTel"],p,[f,k]],[/\b(ph-1) /i],[p,[g,"Essential"],[f,k]],[/\b(v(100md|700na|7011|917g).*\b) b/i],[p,[g,"Envizen"],[f,y]],[/\b(trio[-\w\. ]+) b/i],[p,[g,"MachSpeed"],[f,y]],[/\btu_(1491) b/i],[p,[g,"Rotor"],[f,y]],[/(shield[\w ]+) b/i],[p,[g,"Nvidia"],[f,y]],[/(sprint) (\w+)/i],[g,p,[f,k]],[/(kin\.[onetw]{3})/i],[[p,/\./g," "],[g,j],[f,k]],[/droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],[p,[g,I],[f,y]],[/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],[p,[g,I],[f,k]],[/smart-tv.+(samsung)/i],[g,[f,a]],[/hbbtv.+maple;(\d+)/i],[[p,/^/,"SmartTV"],[g,M],[f,a]],[/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],[[g,U],[f,a]],[/(apple) ?tv/i],[g,[p,S+" TV"],[f,a]],[/crkey/i],[[p,A+"cast"],[g,E],[f,a]],[/droid.+aft(\w)( bui|\))/i],[p,[g,T],[f,a]],[/\(dtv[\);].+(aquos)/i,/(aquos-tv[\w ]+)\)/i],[p,[g,B],[f,a]],[/(bravia[\w ]+)( bui|\))/i],[p,[g,V],[f,a]],[/(mitv-\w{5}) bui/i],[p,[g,D],[f,a]],[/Hbbtv.*(technisat) (.*);/i],[g,p,[f,a]],[/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],[[g,s],[p,s],[f,a]],[/\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i],[[f,a]],[/(ouya)/i,/(nintendo) ([wids3utch]+)/i],[g,p,[f,o]],[/droid.+; (shield) bui/i],[p,[g,"Nvidia"],[f,o]],[/(playstation [345portablevi]+)/i],[p,[g,V],[f,o]],[/\b(xbox(?: one)?(?!; xbox))[\); ]/i],[p,[g,j],[f,o]],[/((pebble))app/i],[g,p,[f,t]],[/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],[p,[g,S],[f,t]],[/droid.+; (glass) \d/i],[p,[g,E],[f,t]],[/droid.+; (wt63?0{2,3})\)/i],[p,[g,I],[f,t]],[/(quest( 2| pro)?)/i],[p,[g,W],[f,t]],[/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],[g,[f,_]],[/droid .+?; ([^;]+?)(?: bui|\) applew).+? mobile safari/i],[p,[f,k]],[/droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i],[p,[f,y]],[/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],[[f,y]],[/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],[[f,k]],[/(android[-\w\. ]{0,9});.+buil/i],[p,[g,"Generic"]]],engine:[[/windows.+ edge\/([\w\.]+)/i],[v,[h,"EdgeHTML"]],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[v,[h,"Blink"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,/ekioh(flow)\/([\w\.]+)/i,/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,/(icab)[\/ ]([23]\.[\d\.]+)/i],[h,v],[/rv\:([\w\.]{1,9})\b.+(gecko)/i],[v,h]],os:[[/microsoft (windows) (vista|xp)/i],[h,v],[/(windows) nt 6\.2; (arm)/i,/(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i,/(windows)[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i],[h,[v,e,L]],[/(win(?=3|9|n)|win 9x )([nt\d\.]+)/i],[[h,"Windows"],[v,e,L]],[/ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i,/cfnetwork\/.+darwin/i],[[v,/_/g,"."],[h,"iOS"]],[/(mac os x) ?([\w\. ]*)/i,/(macintosh|mac_powerpc\b)(?!.+haiku)/i],[[h,G],[v,/_/g,"."]],[/droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i],[v,h],[/(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i,/(blackberry)\w*\/([\w\.]*)/i,/(tizen|kaios)[\/ ]([\w\.]+)/i,/\((series40);/i],[h,v],[/\(bb(10);/i],[v,[h,z]],[/(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i],[v,[h,"Symbian"]],[/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i],[v,[h,C+" OS"]],[/web0s;.+rt(tv)/i,/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i],[v,[h,"webOS"]],[/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i],[v,[h,"watchOS"]],[/crkey\/([\d\.]+)/i],[v,[h,A+"cast"]],[/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i],[[h,F],v],[/panasonic;(viera)/i,/(netrange)mmh/i,/(nettv)\/(\d+\.[\w\.]+)/i,/(nintendo|playstation) ([wids345portablevuch]+)/i,/(xbox); +xbox ([^\);]+)/i,/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,/(mint)[\/\(\) ]?(\w*)/i,/(mageia|vectorlinux)[; ]/i,/([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,/(hurd|linux) ?([\w\.]*)/i,/(gnu) ?([\w\.]*)/i,/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,/(haiku) (\w+)/i],[h,v],[/(sunos) ?([\w\.\d]*)/i],[[h,"Solaris"],v],[/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,/(aix) ((\d)(?=\.|\)| )[\w\.])*/i,/\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux)/i,/(unix) ?([\w\.]*)/i],[h,v]]},$=function(i,e){if(typeof i==u&&(e=i,i=l),!(this instanceof $))return new $(i,e).getResult();var o=typeof n!=w&&n.navigator?n.navigator:l,a=i||(o&&o.userAgent?o.userAgent:""),r=o&&o.userAgentData?o.userAgentData:l,t=e?function(i,e){var o,a={};for(o in i)e[o]&&e[o].length%2==0?a[o]=e[o].concat(i[o]):a[o]=i[o];return a}(Z,e):Z;return this.getBrowser=function(){var i,e={};return e[h]=l,e[v]=l,b.call(e,a,t.browser),e[m]=typeof(i=e[v])==d?i.replace(/[^\d\.]/g,"").split(".")[0]:l,o&&o.brave&&typeof o.brave.isBrave==c&&(e[h]="Brave"),e},this.getCPU=function(){var i={};return i[x]=l,b.call(i,a,t.cpu),i},this.getDevice=function(){var i={};return i[g]=l,i[p]=l,i[f]=l,b.call(i,a,t.device),!i[f]&&r&&r.mobile&&(i[f]=k),"Macintosh"==i[p]&&o&&typeof o.standalone!=w&&o.maxTouchPoints&&2<o.maxTouchPoints&&(i[p]="iPad",i[f]=y),i},this.getEngine=function(){var i={};return i[h]=l,i[v]=l,b.call(i,a,t.engine),i},this.getOS=function(){var i={};return i[h]=l,i[v]=l,b.call(i,a,t.os),!i[h]&&r&&"Unknown"!=r.platform&&(i[h]=r.platform.replace(/chrome os/i,F).replace(/macos/i,G)),i},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 a},this.setUA=function(i){return a=typeof i==d&&350<i.length?s(i,350):i,this},this.setUA(a),this};$.VERSION="1.0.34",$.BROWSER=i([h,v,m]),$.CPU=i([x]),$.DEVICE=i([p,g,f,o,k,a,y,t,_]),$.ENGINE=$.OS=i([h,v]),typeof exports!=w?(typeof module!=w&&module.exports&&(exports=module.exports=$),exports.UAParser=$):typeof define==c&&define.amd?define(function(){return $}):typeof n!=w&&(n.UAParser=$);var X,K=typeof n!=w&&(n.jQuery||n.Zepto);K&&!K.ua&&(X=new $,K.ua=X.getResult(),K.ua.get=function(){return X.getUA()},K.ua.set=function(i){X.setUA(i);var e,o=X.getResult();for(e in o)K.ua[e]=o[e]})}("object"==typeof window?window:this); | ||
!function(i,u){"use strict";function e(i){for(var e={},t=0;t<i.length;t++)e[i[t].toUpperCase()]=i[t];return e}function b(i,e){if(!(typeof i===p&&0<i.length))return typeof i===s&&-1!==gi(e).indexOf(gi(i));for(var t in i)if(gi(i[t])==gi(e))return 1}function w(i,e){if(i&&e)for(var t,o,r,a,s,n=0;n<e.length&&!a;){for(var w=e[n],b=e[n+1],l=t=0;l<w.length&&!a&&w[l];)if(a=w[l++].exec(i))for(o=0;o<b.length;o++)s=a[++t],typeof(r=b[o])===p&&0<r.length?2===r.length?typeof r[1]==c?this[r[0]]=r[1].call(this,s):this[r[0]]=r[1]:3===r.length?typeof r[1]!==c||r[1].exec&&r[1].test?this[r[0]]=s?s.replace(r[1],r[2]):u:this[r[0]]=s?r[1].call(this,s,r[2]):u:4===r.length&&(this[r[0]]=s?r[3].call(this,s.replace(r[1],r[2])):u):this[r]=s||u;n+=2}}function t(i,e){for(var t in e)if(typeof e[t]===p&&0<e[t].length){for(var o=0;o<e[t].length;o++)if(b(e[t][o],i))return"?"===t?u:t}else if(b(e[t],i))return"?"===t?u:t;return i}var l="",c="function",d="undefined",p="object",s="string",h="major",f="model",m="name",g="type",o="vendor",v="version",x="architecture",r="console",k="mobile",a="tablet",n="smarttv",y="wearable",_="embedded",T="user-agent",S=350,q="brands",C="fullVersionList",N="platform",z="platformVersion",A="bitness",O="sec-ch-ua",P=O+"-full-version-list",R=O+"-arch",U=O+"-bitness",E=O+"-mobile",H=O+"-model",I=O+"-platform",M=I+"-version",j=["brands","fullVersionList",k,f,"platform","platformVersion",x,"bitness"],V="browser",B="cpu",F="device",$="engine",D="os",L="result",W="Amazon",G="Apple",X="ASUS",Z="BlackBerry",K="Google",Q="Huawei",Y="LG",J="Microsoft",ii="Motorola",ei="Samsung",ti="Sony",oi="Xiaomi",ri="Zebra",ai="Mobile ",si=" Browser",ni="Chrome",wi="Firefox",bi="Opera",li="Facebook",ui="Windows",ci=typeof i!==d&&i.navigator?i.navigator:u,di=ci&&ci.userAgentData?ci.userAgentData:u,pi=function(i){for(var e in i){e=i[e];typeof e==p&&2==e.length?this[e[0]]=e[1]:this[e]=u}return this},hi=function(i,e){var t,o={};for(t in i)o[t]=e[t]&&e[t].length%2==0?e[t].concat(i[t]):i[t];return o},fi=function(i){for(var e in i)return/^(browser|cpu|device|engine|os)$/.test(e)},mi=function(i){if(!i)return u;for(var e=[],t=xi(/\\?\"/g,i).split(", "),o=0;o<t.length;o++){var r=t[o].split(";v=");e[o]={brand:r[0],version:r[1]}}return e},gi=function(i){return typeof i===s?i.toLowerCase():i},vi=function(i){return typeof i===s?xi(/[^\d\.]/g,i).split(".")[0]:u},xi=function(i,e){return e.replace(i,l)},ki=function(i){return typeof i===s?xi(/\"/g,i):i},yi=function(i,e){if(typeof i===s)return i=xi(/^\s\s*/,i),typeof e===d?i:i.substring(0,S)},_i={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"},Ti={browser:[[/\b(?:crmo|crios)\/([\w\.]+)/i],[v,[m,ai+"Chrome"]],[/edg(?:e|ios|a)?\/([\w\.]+)/i],[v,[m,"Edge"]],[/(opera mini)\/([-\w\.]+)/i,/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i],[m,v],[/opios[\/ ]+([\w\.]+)/i],[v,[m,bi+" Mini"]],[/\bopr\/([\w\.]+)/i],[v,[m,bi]],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer)[\/ ]?([\w\.]*)/i,/(avant |iemobile|slim)(?:browser)?[\/ ]?([\w\.]*)/i,/(ba?idubrowser)[\/ ]?([\w\.]+)/i,/(?:ms|\()(ie) ([\w\.]+)/i,/(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|qq|duckduckgo)\/([-\w\.]+)/i,/(heytap|ovi)browser\/([\d\.]+)/i,/(weibo)__([\d\.]+)/i],[m,v],[/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i],[v,[m,"UCBrowser"]],[/microm.+\bqbcore\/([\w\.]+)/i,/\bqbcore\/([\w\.]+).+microm/i],[v,[m,"WeChat(Win) Desktop"]],[/micromessenger\/([\w\.]+)/i],[v,[m,"WeChat"]],[/konqueror\/([\w\.]+)/i],[v,[m,"Konqueror"]],[/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],[v,[m,"IE"]],[/ya(?:search)?browser\/([\w\.]+)/i],[v,[m,"Yandex"]],[/(avast|avg)\/([\w\.]+)/i],[[m,/(.+)/,"$1 Secure"+si],v],[/\bfocus\/([\w\.]+)/i],[v,[m,wi+" Focus"]],[/\bopt\/([\w\.]+)/i],[v,[m,bi+" Touch"]],[/coc_coc\w+\/([\w\.]+)/i],[v,[m,"Coc Coc"]],[/dolfin\/([\w\.]+)/i],[v,[m,"Dolphin"]],[/coast\/([\w\.]+)/i],[v,[m,bi+" Coast"]],[/miuibrowser\/([\w\.]+)/i],[v,[m,"MIUI"+si]],[/fxios\/([\w\.-]+)/i],[v,[m,ai+"Firefox"]],[/\bqihu|(qi?ho?o?|360)browser/i],[[m,"360"+si]],[/(oculus|samsung|sailfish|huawei)browser\/([\w\.]+)/i],[[m,/(.+)/,"$1"+si],v],[/(comodo_dragon)\/([\w\.]+)/i],[[m,/_/g," "],v],[/(electron)\/([\w\.]+) safari/i,/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,/m?(qqbrowser|baiduboxapp|2345Explorer)[\/ ]?([\w\.]+)/i],[m,v],[/(metasr)[\/ ]?([\w\.]+)/i,/(lbbrowser)/i,/\[(linkedin)app\]/i],[m],[/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],[[m,li],v],[/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,/safari (line)\/([\w\.]+)/i,/\b(line)\/([\w\.]+)\/iab/i,/(chromium|instagram)[\/ ]([-\w\.]+)/i],[m,v],[/\bgsa\/([\w\.]+) .*safari\//i],[v,[m,"GSA"]],[/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i],[v,[m,"TikTok"]],[/headlesschrome(?:\/([\w\.]+)| )/i],[v,[m,ni+" Headless"]],[/ wv\).+(chrome)\/([\w\.]+)/i],[[m,ni+" WebView"],v],[/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],[v,[m,"Android"+si]],[/chrome\/([\w\.]+) mobile/i],[v,[m,ai+"Chrome"]],[/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],[m,v],[/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i],[v,[m,ai+"Safari"]],[/iphone .*mobile(?:\/\w+ | ?)safari/i],[[m,ai+"Safari"]],[/version\/([\w\.\,]+) .*(safari)/i],[v,m],[/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],[m,[v,t,{"1.0":"/8",1.2:"/1",1.3:"/3","2.0":"/412","2.0.2":"/416","2.0.3":"/417","2.0.4":"/419","?":"/"}]],[/(webkit|khtml)\/([\w\.]+)/i],[m,v],[/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i],[[m,ai+"Firefox"],v],[/(navigator|netscape\d?)\/([-\w\.]+)/i],[[m,"Netscape"],v],[/mobile vr; rv:([\w\.]+)\).+firefox/i],[v,[m,wi+" Reality"]],[/ekiohf.+(flow)\/([\w\.]+)/i,/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\/ ]?([\w\.\+]+)/i,/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i,/(firefox)\/([\w\.]+)/i,/(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i,/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,/(links) \(([\w\.]+)/i,/panasonic;(viera)/i],[m,v],[/(cobalt)\/([\w\.]+)/i],[m,[v,/[^\d\.]+./,l]]],cpu:[[/\b(?:(amd|x|x86[-_]?|wow|win)64)\b/i],[[x,"amd64"]],[/(ia32(?=;))/i,/((?:i[346]|x)86)[;\)]/i],[[x,"ia32"]],[/\b(aarch64|arm(v?8e?l?|_?64))\b/i],[[x,"arm64"]],[/\b(arm(?:v[67])?ht?n?[fl]p?)\b/i],[[x,"armhf"]],[/windows (ce|mobile); ppc;/i],[[x,"arm"]],[/((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i],[[x,/ower/,l,gi]],[/(sun4\w)[;\)]/i],[[x,"sparc"]],[/((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i],[[x,gi]]],device:[[/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i],[f,[o,ei],[g,a]],[/\b((?:s[cgp]h|gt|sm)-\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,/samsung[- ]([-\w]+)/i,/sec-(sgh\w+)/i],[f,[o,ei],[g,k]],[/(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i],[f,[o,G],[g,k]],[/\((ipad);[-\w\),; ]+apple/i,/applecoremedia\/[\w\.]+ \((ipad)/i,/\b(ipad)\d\d?,\d\d?[;\]].+ios/i],[f,[o,G],[g,a]],[/(macintosh);/i],[f,[o,G]],[/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],[f,[o,"Sharp"],[g,k]],[/\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i],[f,[o,Q],[g,a]],[/(?:huawei|honor)([-\w ]+)[;\)]/i,/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i],[f,[o,Q],[g,k]],[/\b(poco[\w ]+)(?: bui|\))/i,/\b; (\w+) build\/hm\1/i,/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,/\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i],[[f,/_/g," "],[o,oi],[g,k]],[/\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i],[[f,/_/g," "],[o,oi],[g,a]],[/; (\w+) bui.+ oppo/i,/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],[f,[o,"OPPO"],[g,k]],[/vivo (\w+)(?: bui|\))/i,/\b(v[12]\d{3}\w?[at])(?: bui|;)/i],[f,[o,"Vivo"],[g,k]],[/\b(rmx[12]\d{3})(?: bui|;|\))/i],[f,[o,"Realme"],[g,k]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,/\bmot(?:orola)?[- ](\w*)/i,/((?:moto[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i],[f,[o,ii],[g,k]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i],[f,[o,ii],[g,a]],[/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],[f,[o,Y],[g,a]],[/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,/\blg[-e;\/ ]+((?!browser|netcast|android tv)\w+)/i,/\blg-?([\d\w]+) bui/i],[f,[o,Y],[g,k]],[/(ideatab[-\w ]+)/i,/lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i],[f,[o,"Lenovo"],[g,a]],[/(?:maemo|nokia).*(n900|lumia \d+)/i,/nokia[-_ ]?([-\w\.]*)/i],[[f,/_/g," "],[o,"Nokia"],[g,k]],[/(pixel c)\b/i],[f,[o,K],[g,a]],[/droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i],[f,[o,K],[g,k]],[/droid.+ (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[f,[o,ti],[g,k]],[/sony tablet [ps]/i,/\b(?:sony)?sgp\w+(?: bui|\))/i],[[f,"Xperia Tablet"],[o,ti],[g,a]],[/ (kb2005|in20[12]5|be20[12][59])\b/i,/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],[f,[o,"OnePlus"],[g,k]],[/(alexa)webm/i,/(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i,/(kf[a-z]+)( bui|\)).+silk\//i],[f,[o,W],[g,a]],[/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],[[f,/(.+)/g,"Fire Phone $1"],[o,W],[g,k]],[/(playbook);[-\w\),; ]+(rim)/i],[f,o,[g,a]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,/\(bb10; (\w+)/i],[f,[o,Z],[g,k]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],[f,[o,X],[g,a]],[/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],[f,[o,X],[g,k]],[/(nexus 9)/i],[f,[o,"HTC"],[g,a]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i],[o,[f,/_/g," "],[g,k]],[/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],[f,[o,"Acer"],[g,a]],[/droid.+; (m[1-5] note) bui/i,/\bmz-([-\w]{2,})/i],[f,[o,"Meizu"],[g,k]],[/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[-_ ]?([-\w]*)/i,/(hp) ([\w ]+\w)/i,/(asus)-?(\w+)/i,/(microsoft); (lumia[\w ]+)/i,/(lenovo)[-_ ]?([-\w]+)/i,/(jolla)/i,/(oppo) ?([\w ]+) bui/i],[o,f,[g,k]],[/(kobo)\s(ereader|touch)/i,/(archos) (gamepad2?)/i,/(hp).+(touchpad(?!.+tablet)|tablet)/i,/(kindle)\/([\w\.]+)/i],[o,f,[g,a]],[/(surface duo)/i],[f,[o,J],[g,a]],[/droid [\d\.]+; (fp\du?)(?: b|\))/i],[f,[o,"Fairphone"],[g,k]],[/(shield[\w ]+) b/i],[f,[o,"Nvidia"],[g,a]],[/(sprint) (\w+)/i],[o,f,[g,k]],[/(kin\.[onetw]{3})/i],[[f,/\./g," "],[o,J],[g,k]],[/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],[f,[o,ri],[g,a]],[/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],[f,[o,ri],[g,k]],[/smart-tv.+(samsung)/i],[o,[g,n]],[/hbbtv.+maple;(\d+)/i],[[f,/^/,"SmartTV"],[o,ei],[g,n]],[/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],[[o,Y],[g,n]],[/(apple) ?tv/i],[o,[f,G+" TV"],[g,n]],[/crkey/i],[[f,ni+"cast"],[o,K],[g,n]],[/droid.+aft(\w)( bui|\))/i],[f,[o,W],[g,n]],[/\(dtv[\);].+(aquos)/i,/(aquos-tv[\w ]+)\)/i],[f,[o,"Sharp"],[g,n]],[/(bravia[\w ]+)( bui|\))/i],[f,[o,ti],[g,n]],[/(mitv-\w{5}) bui/i],[f,[o,oi],[g,n]],[/Hbbtv.*(technisat) (.*);/i],[o,f,[g,n]],[/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],[[o,yi],[f,yi],[g,n]],[/\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i],[[g,n]],[/(ouya)/i,/(nintendo) (\w+)/i],[o,f,[g,r]],[/droid.+; (shield) bui/i],[f,[o,"Nvidia"],[g,r]],[/(playstation \w+)/i],[f,[o,ti],[g,r]],[/\b(xbox(?: one)?(?!; xbox))[\); ]/i],[f,[o,J],[g,r]],[/((pebble))app/i],[o,f,[g,y]],[/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],[f,[o,G],[g,y]],[/droid.+; (glass) \d/i],[f,[o,K],[g,y]],[/droid.+; (wt63?0{2,3})\)/i],[f,[o,ri],[g,y]],[/(quest( 2| pro)?)/i],[f,[o,li],[g,y]],[/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],[o,[g,_]],[/(aeobc)\b/i],[f,[o,W],[g,_]],[/droid .+?; ([^;]+?)(?: bui|\) applew).+? mobile safari/i],[f,[g,k]],[/droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i],[f,[g,a]],[/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],[[g,a]],[/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],[[g,k]],[/(android[-\w\. ]{0,9});.+buil/i],[f,[o,"Generic"]]],engine:[[/windows.+ edge\/([\w\.]+)/i],[v,[m,"EdgeHTML"]],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[v,[m,"Blink"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,/ekioh(flow)\/([\w\.]+)/i,/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,/(icab)[\/ ]([23]\.[\d\.]+)/i,/\b(libweb)/i],[m,v],[/rv\:([\w\.]{1,9})\b.+(gecko)/i],[v,m]],os:[[/microsoft (windows) (vista|xp)/i],[m,v],[/(windows) nt 6\.2; (arm)/i,/(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i,/(windows)[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i],[m,[v,t,_i]],[/(win(?=3|9|n)|win 9x )([nt\d\.]+)/i],[[m,ui],[v,t,_i]],[/ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i,/ios;fbsv\/([\d\.]+)/i,/cfnetwork\/.+darwin/i],[[v,/_/g,"."],[m,"iOS"]],[/(mac os x) ?([\w\. ]*)/i,/(macintosh|mac_powerpc\b)(?!.+haiku)/i],[[m,"macOS"],[v,/_/g,"."]],[/droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i],[v,m],[/(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i,/(blackberry)\w*\/([\w\.]*)/i,/(tizen|kaios)[\/ ]([\w\.]+)/i,/\((series40);/i],[m,v],[/\(bb(10);/i],[v,[m,Z]],[/(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i],[v,[m,"Symbian"]],[/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i],[v,[m,wi+" OS"]],[/web0s;.+rt(tv)/i,/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i],[v,[m,"webOS"]],[/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i],[v,[m,"watchOS"]],[/crkey\/([\d\.]+)/i],[v,[m,ni+"cast"]],[/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i],[[m,"Chrome OS"],v],[/panasonic;(viera)/i,/(netrange)mmh/i,/(nettv)\/(\d+\.[\w\.]+)/i,/(nintendo|playstation) (\w+)/i,/(xbox); +xbox ([^\);]+)/i,/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,/(mint)[\/\(\) ]?(\w*)/i,/(mageia|vectorlinux)[; ]/i,/([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,/(hurd|linux) ?([\w\.]*)/i,/(gnu) ?([\w\.]*)/i,/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,/(haiku) (\w+)/i],[m,v],[/(sunos) ?([\w\.\d]*)/i],[[m,"Solaris"],v],[/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,/(aix) ((\d)(?=\.|\)| )[\w\.])*/i,/\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux|serenityos)/i,/(unix) ?([\w\.]*)/i],[m,v]]},Si=(ni={init:{},isIgnore:{},isIgnoreRgx:{},toString:{}},pi.call(ni.init,[[V,[m,v,h]],[B,[x]],[F,[g,f,o]],[$,[m,v]],[D,[m,v]]]),pi.call(ni.isIgnore,[[V,[v,h]],[$,[v]],[D,[v]]]),pi.call(ni.isIgnoreRgx,[[V,/ ?browser$/i],[D,/ ?os$/i]]),pi.call(ni.toString,[[V,[m,v]],[B,[x]],[F,[o,f]],[$,[m,v]],[D,[m,v]]]),ni),qi=function(e,t,o,i){var r=Si.init[e],a=Si.isIgnore[e]||0,s=Si.isIgnoreRgx[e]||0,n=Si.toString[e]||0;function w(){pi.call(this,r)}return w.prototype.withClientHints=function(){return di?di.getHighEntropyValues(j).then(function(i){i=new Ci(i,!1);return new Ni(e,t,o,i).parseCH().get()}):new Ni(e,t,o,i).parseCH().get()},e!=L&&(w.prototype.is=function(i){var e,t=!1;for(e in this)if(this.hasOwnProperty(e)&&!b(a,e)&&gi(s?xi(s,this[e]):this[e])==gi(s?xi(s,i):i)){if(t=!0,i!=d)break}else if(i==d&&t){t=!t;break}return t},w.prototype.toString=function(){var i,e=l;for(i in n)typeof this[n[i]]!==d&&(e+=(e?" ":l)+this[n[i]]);return e||d}),di||(w.prototype.then=function(i){return i(this),this}),new w};function Ci(i,e){if(i=i||{},pi.call(this,j),e)pi.call(this,[[q,mi(i[O])],[C,mi(i[P])],[q,mi(i[O])],[k,/\?1/.test(i[E])],[f,ki(i[H])],[N,ki(i[I])],[z,ki(i[M])],[x,ki(i[R])],[A,ki(i[U])]]);else for(var t in i)this.hasOwnProperty(t)&&typeof i[t]!==d&&(this[t]=i[t]);return this}function Ni(i,e,t,o){switch(pi.call(this,[["itemType",i],["ua",e],["uaCH",o],["rgxMap",t],["data",qi(i,e,t,o)]]),this.parse(),this.itemType){case V:ci&&ci.userAgent==e&&ci.brave&&typeof ci.brave.isBrave==c&&this.set(m,"Brave"),this.set(h,vi(this.get(v)));break;case F:!this.get(g)&&di&&di[k]&&this.set(g,k),"Macintosh"==this.get(f)&&ci&&typeof ci.standalone!==d&&ci.maxTouchPoints&&2<ci.maxTouchPoints&&this.set(f,"iPad").set(g,a);break;case D:!this.get(m)&&di&&di[N]&&"Unknown"!=di[N]&&this.set(m,di[N]);break;case L:var r=function(i){return new Ni(i,e,t[i],o).get()};this.set("ua",e).set(V,r(V)).set(B,r(B)).set(F,r(F)).set($,r($)).set(D,r(D)).get()}return this}function zi(i,e,t){if(typeof i===p?(e=fi(i)?(typeof e===p&&(t=e),i):(t=i,u),i=u):typeof i!==s||fi(e)||(t=e,e=u),!(this instanceof zi))return new zi(i,e,t).getResult();var o=i||(ci&&ci.userAgent?ci.userAgent:t&&t[T]?t[T]:l),r=new Ci(t,!0),a=e?hi(Ti,e):Ti,e=function(i){return function(){return new Ni(i,o,i==L?a:a[i],r).get()}};return pi.call(this,[["getBrowser",e(V)],["getCPU",e(B)],["getDevice",e(F)],["getEngine",e($)],["getOS",e(D)],["getResult",e(L)],["getUA",function(){return o}],["setUA",function(i){return o=typeof i===s&&i.length>S?yi(i,S):i,this}]]).setUA(o),this}Ni.prototype.get=function(i){return i?this.data.hasOwnProperty(i)?this.data[i]:u:this.data},Ni.prototype.parse=function(){return this.itemType!=L&&w.call(this.data,this.ua,this.rgxMap),this},Ni.prototype.parseCH=function(){var e=this.ua,t=this.uaCH,o=this.rgxMap;switch(this.itemType){case V:var i=t[C]||t[q];if(i)for(var r in i){var a=i[r].brand,r=i[r].version;/not.a.brand/i.test(a)&&!/chromi/i.test(this.get(m))||this.set(m,xi(K+" ",a)).set(v,r).set(h,vi(r))}break;case B:var s=t[x];s&&(s&&"64"==t[A]&&(s+="64"),w.call(this.data,s+";",o));break;case F:t[k]&&this.set(g,k),t[f]&&this.set(f,t[f]);break;case D:s=t[N];s&&(n=t[z],s==ui&&(n=13<=parseInt(vi(n),10)?"11":"10"),this.set(m,s).set(v,n));break;case L:var n=function(i){return new Ni(i,e,o[i],t).parseCH().get()};this.set("ua",e).set(V,n(V)).set(B,n(B)).set(F,n(F)).set($,n($)).set(D,n(D))}return this},Ni.prototype.set=function(i,e){return this.data[i]=e,this},zi.VERSION="2.0.0-alpha.1",zi.BROWSER=e([m,v,h]),zi.CPU=e([x]),zi.DEVICE=e([f,o,g,r,k,n,a,y,_]),zi.ENGINE=zi.OS=e([m,v]),typeof exports!==d?(typeof module!==d&&module.exports&&(exports=module.exports=zi),exports.UAParser=zi):typeof define===c&&define.amd?define(function(){return zi}):typeof i!==d&&(i.UAParser=zi);var Ai,Oi=typeof i!==d&&(i.jQuery||i.Zepto);Oi&&!Oi.ua&&(Ai=new zi,Oi.ua=Ai.getResult(),Oi.ua.get=function(){return Ai.getUA()},Oi.ua.set=function(i){Ai.setUA(i);var e,t=Ai.getResult();for(e in t)Oi.ua[e]=t[e]})}("object"==typeof window?window:this); |
MIT License | ||
Copyright (c) 2012-2021 Faisal Salman <<f@faisalman.com>> | ||
Copyright (c) 2012-2023 Faisal Salman <<f@faisalman.com>> | ||
@@ -5,0 +5,0 @@ Permission is hereby granted, free of charge, to any person obtaining a copy |
{ | ||
"title": "UAParser.js", | ||
"name": "ua-parser-js", | ||
"version": "1.0.34", | ||
"version": "2.0.0-alpha.1", | ||
"author": "Faisal Salman <f@faisalman.com> (http://faisalman.com)", | ||
@@ -143,3 +143,19 @@ "description": "Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data. Supports browser & node.js environment", | ||
], | ||
"type": "commonjs", | ||
"main": "src/ua-parser.js", | ||
"module": "src/ua-parser.mjs", | ||
"exports": { | ||
".": { | ||
"require": "./src/ua-parser.js", | ||
"import": "./src/ua-parser.mjs" | ||
}, | ||
"./enums": { | ||
"require": "./src/enum/ua-parser-enum.js", | ||
"import": "./src/enum/ua-parser-enum.mjs" | ||
}, | ||
"./extensions": { | ||
"require": "./src/extension/ua-parser-extension.js", | ||
"import": "./src/extension/ua-parser-extension.mjs" | ||
} | ||
}, | ||
"files": [ | ||
@@ -150,5 +166,5 @@ "dist", | ||
"scripts": { | ||
"build": "uglifyjs src/ua-parser.js -o dist/ua-parser.min.js --comments '/^ UA/' && uglifyjs src/ua-parser.js -o dist/ua-parser.pack.js --comments '/^ UA/' --compress --mangle", | ||
"test": "jshint src/ua-parser.js && mocha -R nyan test/test.js", | ||
"test-ci": "jshint src/ua-parser.js && mocha -R spec test/test.js", | ||
"build": "uglifyjs src/ua-parser.js -o dist/ua-parser.min.js --comments '/^ UA/' && uglifyjs src/ua-parser.js -o dist/ua-parser.pack.js --comments '/^ UA/' --compress --mangle && node -e \"const fs=require('fs');fs.writeFileSync('src/ua-parser.mjs','// Generated ESM version of UAParser.js\\n// DO NOT EDIT THIS FILE!\\n// Source: /src/ua-parser.js\\n\\nconst window = undefined;\\n\\n'+fs.readFileSync('src/ua-parser.js','utf-8').replace(/\\(func[\\s\\S]+strict\\';/ig,'').replace(/\\/[\\/\\s]+export[\\s\\S]+/ig,'export {UAParser};'),'utf-8');fs.writeFileSync('src/enum/ua-parser-enum.mjs','// Generated ESM version of UAParser.js enums\\n// DO NOT EDIT THIS FILE!\\n// Source: /src/enum/ua-parser-enum.js\\n\\n'+fs.readFileSync('src/enum/ua-parser-enum.js','utf-8').replace(/module\\.exports =/ig,'export'),'utf-8');fs.writeFileSync('src/extension/ua-parser-extension.mjs','// Generated ESM version of UAParser.js extensions\\n// DO NOT EDIT THIS FILE!\\n// Source: /src/extension/ua-parser-extension.js\\n\\n'+fs.readFileSync('src/extension/ua-parser-extension.js','utf-8').replace(/const UA.+\\)/ig,'import UAParser from \\'ua-parser-js\\'').replace(/module\\.exports =/ig,'export'),'utf-8')\"", | ||
"test": "jshint src/ua-parser.js && mocha -R nyan test", | ||
"test-ci": "jshint src/ua-parser.js && mocha -R spec test", | ||
"verup": "node ./node_modules/verup", | ||
@@ -202,4 +218,8 @@ "version": "node ./node_modules/verup 0" | ||
"url": "https://paypal.me/faisalman" | ||
}, | ||
{ | ||
"type": "github", | ||
"url": "https://github.com/sponsors/faisalman" | ||
} | ||
] | ||
} |
331
readme.md
@@ -15,3 +15,3 @@ <p align="center"> | ||
JavaScript library to detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data with relatively small footprint (~17KB minified, ~6KB gzipped) that can be used either in browser (client-side) or node.js (server-side). | ||
JavaScript library to detect Browser, Engine, OS, CPU, and Device type/model from User-Agent & Client-Hints data that can be used either in browser (client-side) or node.js (server-side). | ||
@@ -30,3 +30,3 @@ * Author : Faisal Salman <<f@faisalman.com>> | ||
<tr> | ||
<td align="center" width="200px" rowspan="3"><a href="https://www.npmjs.com/package/@51degrees/ua-parser-js"><img src="images/51degrees.svg" alt="51degrees" width="75%" height="75%" ></a></td> | ||
<td align="center" width="200px" rowspan="2"><a href="https://www.npmjs.com/package/@51degrees/ua-parser-js"><img src="images/51degrees.svg" alt="51degrees" width="75%" height="75%" ></a></td> | ||
<td align="left" width="400px"><a href="https://www.npmjs.com/package/@51degrees/ua-parser-js">↗ @51degrees/ua-parser-js</a></td> | ||
@@ -39,4 +39,5 @@ </tr> | ||
<tr> | ||
<td> | ||
<p>On 6 March, we’ll be hosting a demonstration of the 51Degrees UAParser. Register your place for the webinar <a href="https://event.webinarjam.com/register/36/6k2gqu5p">↗ here</a>.</p></td> | ||
<td colspan="2"> | ||
<a href="https://opencollective.com/ua-parser-js">↗ Become a sponsor</a> | ||
</td> | ||
</tr> | ||
@@ -48,19 +49,17 @@ </tbody> | ||
# Version 2.0 | ||
What's new & breaking, please read [CHANGELOG](changelog.md) before upgrading. | ||
# Documentation | ||
### UAParser([user-agent][,extensions]) | ||
typeof `user-agent` "string". | ||
### UAParser([user-agent:string][,extensions:object][,headers:object(since@2.0)]) | ||
typeof `extensions` "array". | ||
In the browser environment you dont need to pass the user-agent string to the function, you can just call the funtion and it should automatically get the string from the `window.navigator.userAgent`, but that is not the case in nodejs. The user-agent string must be passed in' nodejs for the function to work. Usually you can find the user agent in: `request.headers["user-agent"]`. | ||
In The Browser environment you dont need to pass the user-agent string to the function, you can just call the funtion and it should automatically get the string from the `window.navigator.userAgent`, but that is not the case in nodejs. The user-agent string must be passed in nodejs for the function to work. | ||
Usually you can find the user agent in: | ||
`request.headers["user-agent"]`. | ||
## Constructor | ||
When you call `UAParser` with the `new` keyword `UAParser` will return a new instance with an empty result object, you have to call one of the available methods to get the information from the user-agent string. | ||
When you call `UAParser` with the `new` keyword, `UAParser` will return a new instance with an empty result object, you have to call one of the available methods to get the information from the user-agent string. | ||
Like so: | ||
* `new UAParser([uastring][,extensions])` | ||
* `new UAParser([user-agent:string][,extensions:object][,headers:object(since@2.0)])` | ||
```js | ||
let parser = new UAParser("user-agent"); // you need to pass the user-agent for nodejs | ||
let parser = new UAParser("your user-agent here"); // you need to pass the user-agent for nodejs | ||
console.log(parser); // {} | ||
@@ -70,8 +69,8 @@ let parserResults = parser.getResult(); | ||
/** { | ||
"ua": "", | ||
"browser": {}, | ||
"engine": {}, | ||
"os": {}, | ||
"device": {}, | ||
"cpu": {} | ||
"ua" : "", | ||
"browser" : {}, | ||
"engine" : {}, | ||
"os" : {}, | ||
"device" : {}, | ||
"cpu" : {} | ||
} */ | ||
@@ -81,3 +80,3 @@ ``` | ||
When you call UAParser without the `new` keyword, it will automatically call `getResult()` function and return the parsed results. | ||
* `UAParser([uastring][,extensions])` | ||
* `UAParser([user-agent:string][,extensions:object][,headers:object(since@2.0)])` | ||
* returns result object `{ ua: '', browser: {}, cpu: {}, device: {}, engine: {}, os: {} }` | ||
@@ -100,3 +99,2 @@ | ||
--- | ||
@@ -114,15 +112,15 @@ | ||
BIDUBrowser, Baidu, Basilisk, Blazer, Bolt, Brave, Bowser, Camino, Chimera, | ||
Chrome Headless, Chrome WebView, Chrome, Chromium, Cobalt, Comodo Dragon, Dillo, | ||
[Mobile] Chrome [Headless/WebView], Chromium, Cobalt, Comodo Dragon, Dillo, | ||
Dolphin, Doris, DuckDuckGo, Edge, Electron, Epiphany, Facebook, Falkon, Fennec, | ||
Firebird, Firefox [Focus/Reality], Flock, Flow, GSA, GoBrowser, Huawei Browser, | ||
ICE Browser, IE, IEMobile, IceApe, IceCat, IceDragon, Iceweasel, Instagram, | ||
Iridium, Iron, Jasmine, Kakao[Story/Talk], K-Meleon, Kindle, Klar, Konqueror, | ||
LBBROWSER, Line, LinkedIn, Links, Lunascape, Lynx, MIUI Browser, Maemo Browser, | ||
Maemo, Maxthon, MetaSr Midori, Minimo, Mobile Safari, Mosaic, Mozilla, NetFront, | ||
Firebird, [Mobile] Firefox [Focus/Reality], Flock, Flow, GSA, GoBrowser, HeyTap, | ||
Huawei Browser, ICE Browser, IE, IEMobile, IceApe, IceCat, IceDragon, Iceweasel, | ||
Instagram, Iridium, Iron, Jasmine, Kakao[Story/Talk], K-Meleon, Kindle, Klar, | ||
Konqueror, LBBROWSER, Line, LinkedIn, Links, Lunascape, Lynx, MIUI Browser, | ||
Maemo Browser, Maemo, Maxthon, MetaSr Midori, Minimo, Mosaic, Mozilla, NetFront, | ||
NetSurf, Netfront, Netscape, NokiaBrowser, Obigo, Oculus Browser, OmniWeb, | ||
Opera Coast, Opera [Mini/Mobi/Tablet], PaleMoon, PhantomJS, Phoenix, Polaris, | ||
Puffin, QQ, QQBrowser, QQBrowserLite, Quark, QupZilla, RockMelt, Safari, | ||
Puffin, QQ, QQBrowser, QQBrowserLite, Quark, QupZilla, RockMelt, [Mobile] Safari, | ||
Sailfish Browser, Samsung Browser, SeaMonkey, Silk, Skyfire, Sleipnir, Slim, | ||
SlimBrowser, Swiftfox, Tesla, Tizen Browser, UCBrowser, UP.Browser, Viera, | ||
Vivaldi, Waterfox, WeChat, Weibo, Yandex, baidu, iCab, w3m, Whale Browser... | ||
SlimBrowser, Swiftfox, Tesla, TikTok, Tizen Browser, UCBrowser, UP.Browser, Viera, | ||
Vivaldi, Waterfox, WeChat, Weibo, Yandex, baidu, iCab, w3m, Whale Browser, ... | ||
@@ -161,4 +159,4 @@ # 'browser.version' determined dynamically | ||
# Possible 'engine.name' | ||
Amaya, Blink, EdgeHTML, Flow, Gecko, Goanna, iCab, KHTML, Links, Lynx, NetFront, | ||
NetSurf, Presto, Tasman, Trident, w3m, WebKit | ||
Amaya, Blink, EdgeHTML, Flow, Gecko, Goanna, iCab, KHTML, LibWeb, Links, Lynx, | ||
NetFront, NetSurf, Presto, Tasman, Trident, w3m, WebKit | ||
@@ -179,4 +177,5 @@ # 'engine.version' determined dynamically | ||
PC-BSD, PCLinuxOS, Plan9, PlayStation, QNX, Raspbian, RedHat, RIM Tablet OS, | ||
RISC OS, Sabayon, Sailfish, Series40, Slackware, Solaris, SUSE, Symbian, Tizen, | ||
Ubuntu, Unix, VectorLinux, Viera, watchOS, WebOS, Windows [Phone/Mobile], Zenwalk, ... | ||
RISC OS, Sabayon, Sailfish, SerenityOS, Series40, Slackware, Solaris, SUSE, Symbian, | ||
Tizen, Ubuntu, Unix, VectorLinux, Viera, watchOS, WebOS, Windows [Phone/Mobile], | ||
Zenwalk, ... | ||
@@ -201,2 +200,194 @@ # 'os.version' determined dynamically | ||
#### * `is():boolean` utility `since@2.0` | ||
```js | ||
// Is just a shorthand comparison to check whether the value of specified item equals one of its properties (in a case-insensitive way) | ||
// so that instead of write it using `==` operator like this: | ||
let ua = UAParser(); | ||
let device = ua.device; | ||
let os = ua.os; | ||
if (device.type == "mobile" && os.name != "iOS") {} | ||
if (device.type == "smarttv" || device.vendor == "Samsung") {} | ||
// we can also write the comparison above into as follow: | ||
if (device.is("mobile") && !os.is("iOS")) {} | ||
if (device.is("SmartTV") || device.is("SaMsUnG")) {} | ||
/* | ||
For device, properties will be checked in this particular order: type, model, vendor | ||
*/ | ||
// Another examples: | ||
let uap = new UAParser('Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 635) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537'); | ||
uap.getBrowser().name; // "IEMobile" | ||
uap.getBrowser().is("IEMobile"); // true | ||
uap.getCPU().is("ARM"); // true | ||
uap.getOS().name; // "Windows Phone" | ||
uap.getOS().is("Windows Phone"); // true | ||
uap.getDevice(); // { vendor: "Nokia", model: "Lumia 635", type: "mobile" } | ||
uap.getResult().device; // { vendor: "Nokia", model: "Lumia 635", type: "mobile" } | ||
let device = uap.getDevice(); | ||
device.is("mobile"); // true | ||
device.is("Lumia 635"); // true | ||
device.is("Nokia"); // true | ||
device.is("iPhone"); // false | ||
uap.getResult().device.is("Nokia"); // true | ||
uap.getResult().device.model; // "Lumia 635" | ||
uap.setUA("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"); | ||
let browser = uap.getBrowser(); | ||
browser.is("IEMobile"); // false | ||
browser.is("Chrome"); // true | ||
uap.getResult().browser.is("Edge"); // false | ||
uap.getResult().os.name // "Mac OS" | ||
uap.getResult().os.is("Mac OS"); // true | ||
uap.getResult().os.version; // "10.6.8" | ||
let engine = uap.getEngine(); | ||
engine.is("Blink"); // true | ||
``` | ||
#### * `toString():string` utility `since@2.0` | ||
```js | ||
// Retrieve full-name values as a string | ||
/* | ||
Values will be concatenated following this pattern: | ||
* browser : name + version | ||
* cpu : architecture | ||
* device : vendor + model | ||
* engine : name + version | ||
* os : name + version | ||
*/ | ||
// Usage examples | ||
let uap = new UAParser('Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 635) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537'); | ||
uap.getDevice(); // { | ||
// vendor: "Nokia", | ||
// model: "Lumia 635", | ||
// type: "mobile" | ||
// } | ||
uap.getDevice().toString(); // "Nokia Lumia 635" | ||
uap.getResult().os.name; // "Windows Phone" | ||
uap.getResult().os.version; // "8.1" | ||
uap.getResult().os.toString(); // "Windows Phone 8.1" | ||
uap.setUA("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"); | ||
uap.getBrowser().name; // "Chrome" | ||
uap.getBrowser().version; // "28.0.1500.95" | ||
uap.getBrowser().major; // "28" | ||
uap.getBrowser().toString(); // "Chrome 28.0.1500.95" | ||
let engine = uap.getEngine(); | ||
engine.name; // "Blink" | ||
engine.version; // "28.0.1500.95" | ||
engine.toString(); // "Blink 28.0.1500.95" | ||
``` | ||
#### * `withClientHints():Promise<object>|Thenable<object>` `since@2.0` | ||
Recently Chrome limits the information exposed through user-agent and introduces a new experimental set of data called "client-hints". In browser-environment, obtaining the client-hints data via JavaScript must be done in an asynchronous way. In `UAParser` you can chain the result object from `get*` method with `withClientHints()` to also read the client-hints data from the browser and return the updated data as a `Promise`. | ||
```js | ||
// client-side example | ||
(async function () { | ||
let ua = new UAParser(); | ||
// get browser data from user-agent only : | ||
let browser = ua.getBrowser(); | ||
console.log('Using User-Agent: ', browser); | ||
// get browser data from client-hints (with user-agent as fallback) : | ||
browser = await ua.getBrowser().withClientHints(); | ||
console.log('Using Client-Hints: ', browser); | ||
// alternatively : | ||
ua.getBrowser().withClientHints().then(function (browser) { | ||
console.log('Using Client-Hints: ', browser); | ||
}); | ||
})(); | ||
``` | ||
Along with `User-Agent` HTTP header, Chrome also sends this client-hints data by default under `Sec-CH-UA-*` HTTP headers in each request. In server-side development, you can capture this extra information by passing the `req.headers` to `UAParser()` (see examples below). When using `withClientHints()` in nodejs environment and browser without client-hints support (basically anything that's not Chromium-based) the updated data will be returned as a `Thenable` (has `then()` method). | ||
```js | ||
// server-side example | ||
// Suppose we got a request having these HTTP headers: | ||
const request = { | ||
headers : { | ||
'user-agent' : 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36', | ||
'sec-ch-ua-mobile' : '?1', | ||
'sec-ch-ua-model' : 'Galaxy S3 Marketing', | ||
'sec-ch-ua-platform' : 'Android' | ||
} | ||
}; | ||
const result1 = UAParser(request.headers); // parse only "user-agent" header | ||
const result2 = UAParser(request.headers).withClientHints(); // update with "sec-ch-ua" headers | ||
console.log(result1.os.name); // "Linux" | ||
console.log(result1.device.type); // undefined | ||
console.log(result1.device.model); // undefined | ||
console.log(result2.os.name); // "Android" | ||
console.log(result2.device.type); // "mobile" | ||
console.log(result2.device.model); // "Galaxy S3 Marketing" | ||
new UAParser(request.headers).getBrowser().withClientHints().then((browser) => { | ||
console.log(browser.toString()); // Chrome 110.0.0.0 | ||
}); | ||
``` | ||
## Extending Regex | ||
If you want to detect something that's not currently provided by UAParser.js (eg: `bots`, specific apps, etc), you can pass a list of regexes to extend internal UAParser.js regexes with your own. | ||
* `UAParser([uastring,] extensions [,headers:object(since@2.0)])` | ||
```js | ||
// Example: | ||
const myOwnListOfBrowsers = [ | ||
[/(mybrowser)\/([\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION, ['type', 'bot']] | ||
]; | ||
const myUA = 'Mozilla/5.0 MyBrowser/1.3'; | ||
let myParser = new UAParser({ browser: myOwnListOfBrowsers }); | ||
console.log(myParser.setUA(myUA).getBrowser()); // {name: "MyBrowser", version: "1.3", major: "1", type : "bot"} | ||
console.log(myParser.getBrowser().is('bot')); // true | ||
// Another example: | ||
const myOwnListOfDevices = [ | ||
[/(mytab) ([\w ]+)/i], [UAParser.DEVICE.VENDOR, UAParser.DEVICE.MODEL, [UAParser.DEVICE.TYPE, UAParser.DEVICE.TABLET]], | ||
[/(myphone)/i], [UAParser.DEVICE.VENDOR, [UAParser.DEVICE.TYPE, UAParser.DEVICE.MOBILE]] | ||
]; | ||
const myUA2 = 'Mozilla/5.0 MyTab 14 Pro Max'; | ||
let myParser2 = new UAParser({ | ||
browser: myOwnListOfBrowsers, | ||
device: myOwnListOfDevices | ||
}); | ||
console.log(myParser2.setUA(myUA2).getDevice()); // {vendor: "MyTab", model: "14 Pro Max", type: "tablet"} | ||
``` | ||
# Usage | ||
@@ -213,4 +404,4 @@ | ||
var parser = new UAParser(); | ||
console.log(parser.getResult()); | ||
var uap = new UAParser(); | ||
console.log(uap.getResult()); | ||
/* | ||
@@ -223,3 +414,3 @@ /// This will print an object structured like this: | ||
version: "", | ||
major: "" //@deprecated | ||
major: "" | ||
}, | ||
@@ -248,6 +439,6 @@ engine: { | ||
var uastring1 = "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(uastring1); | ||
var result = parser.getResult(); | ||
uap.setUA(uastring1); | ||
var result = uap.getResult(); | ||
// You can also use UAParser constructor directly without having to create an instance: | ||
// var result = UAParser(uastring1); | ||
// var ua = UAParser(uastring1); | ||
@@ -263,10 +454,10 @@ console.log(result.browser); // {name: "Chromium", version: "15.0.874.106"} | ||
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"} | ||
console.log(uap.setUA(uastring2).getBrowser().name); // "Konqueror" | ||
console.log(uap.getOS()); // {name: "OpenBSD", version: undefined} | ||
console.log(uap.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" | ||
console.log(uap.setUA(uastring3).getDevice().model); // "PlayBook" | ||
console.log(uap.getOS()) // {name: "RIM Tablet OS", version: "1.0.0"} | ||
console.log(uap.getBrowser().name); // "Safari" | ||
@@ -290,7 +481,20 @@ </script> | ||
var http = require('http'); | ||
var parser = require('ua-parser-js'); | ||
var uap = require('ua-parser-js'); | ||
http.createServer(function (req, res) { | ||
// get user-agent header | ||
var ua = parser(req.headers['user-agent']); | ||
var ua = uap(req.headers['user-agent']); | ||
/* // BEGIN since@2.0 - you can also pass client-hints data to UAParser | ||
// note: only works in secure context (https:// or localhost or file://) | ||
var getHighEntropyValues = 'Sec-CH-UA-Full-Version-List, Sec-CH-UA-Mobile, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version, Sec-CH-UA-Arch, Sec-CH-UA-Bitness'; | ||
res.setHeader('Accept-CH', getHighEntropyValues); | ||
res.setHeader('Critical-CH', getHighEntropyValues); | ||
var ua = uap(req.headers); | ||
// END since@2.0 */ | ||
// write the result as response | ||
@@ -304,2 +508,15 @@ res.end(JSON.stringify(ua, null, ' ')); | ||
## Using ES Modules | ||
```js | ||
import { UAParser } from 'ua-parser-js'; | ||
const { browser, cpu, device } = UAParser('Mozilla/5.0 (X11; U; Linux armv7l; en-GB; rv:1.9.2a1pre) Gecko/20090928 Firefox/3.5 Maemo Browser 1.4.1.22 RX-51 N900'); | ||
console.log(browser.name); // Maemo Browser | ||
console.log(cpu.is('arm')); // true | ||
console.log(device.is('mobile')); // true | ||
console.log(device.model); // N900 | ||
``` | ||
## Using TypeScript | ||
@@ -340,16 +557,2 @@ | ||
## Using Extension | ||
* `UAParser([uastring,] extensions)` | ||
```js | ||
// Example: | ||
var myOwnListOfBrowsers = [ | ||
[/(mybrowser)\/([\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION] | ||
]; | ||
var myParser = new UAParser({ browser: myOwnListOfBrowsers }); | ||
var myUA = 'Mozilla/5.0 MyBrowser/1.3'; | ||
console.log(myParser.setUA(myUA).getBrowser()); // {name: "MyBrowser", version: "1.3"} | ||
``` | ||
# Development | ||
@@ -384,3 +587,3 @@ | ||
Copyright (c) 2012-2021 Faisal Salman <<f@faisalman.com>> | ||
Copyright (c) 2012-2023 Faisal Salman <<f@faisalman.com>> | ||
@@ -387,0 +590,0 @@ Permission is hereby granted, free of charge, to any person obtaining a copy |
///////////////////////////////////////////////////////////////////////////////// | ||
/* UAParser.js v1.0.34 | ||
Copyright © 2012-2021 Faisal Salman <f@faisalman.com> | ||
/* UAParser.js v2.0.0-alpha.1 | ||
Copyright © 2012-2023 Faisal Salman <f@faisalman.com> | ||
MIT License *//* | ||
@@ -20,3 +20,3 @@ Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data. | ||
var LIBVERSION = '1.0.34', | ||
var LIBVERSION = '2.0.0-alpha.1', | ||
EMPTY = '', | ||
@@ -41,27 +41,53 @@ UNKNOWN = '?', | ||
EMBEDDED = 'embedded', | ||
UA_MAX_LENGTH = 350; | ||
var AMAZON = 'Amazon', | ||
APPLE = 'Apple', | ||
ASUS = 'ASUS', | ||
BLACKBERRY = 'BlackBerry', | ||
BROWSER = 'Browser', | ||
CHROME = 'Chrome', | ||
EDGE = 'Edge', | ||
FIREFOX = 'Firefox', | ||
GOOGLE = 'Google', | ||
HUAWEI = 'Huawei', | ||
LG = 'LG', | ||
MICROSOFT = 'Microsoft', | ||
MOTOROLA = 'Motorola', | ||
OPERA = 'Opera', | ||
SAMSUNG = 'Samsung', | ||
SHARP = 'Sharp', | ||
SONY = 'Sony', | ||
VIERA = 'Viera', | ||
XIAOMI = 'Xiaomi', | ||
ZEBRA = 'Zebra', | ||
USER_AGENT = 'user-agent', | ||
UA_MAX_LENGTH = 350, | ||
BRANDS = 'brands', | ||
FULLVERLIST = 'fullVersionList', | ||
PLATFORM = 'platform', | ||
PLATFORMVER = 'platformVersion', | ||
BITNESS = 'bitness', | ||
CH_HEADER = 'sec-ch-ua', | ||
CH_HEADER_FULL_VER_LIST = CH_HEADER + '-full-version-list', | ||
CH_HEADER_ARCH = CH_HEADER + '-arch', | ||
CH_HEADER_BITNESS = CH_HEADER + '-bitness', | ||
CH_HEADER_MOBILE = CH_HEADER + '-mobile', | ||
CH_HEADER_MODEL = CH_HEADER + '-model', | ||
CH_HEADER_PLATFORM = CH_HEADER + '-platform', | ||
CH_HEADER_PLATFORM_VER = CH_HEADER_PLATFORM + '-version', | ||
CH_ALL_VALUES = ['brands', 'fullVersionList', MOBILE, MODEL, 'platform', 'platformVersion', ARCHITECTURE, 'bitness'], | ||
UA_BROWSER = 'browser', | ||
UA_CPU = 'cpu', | ||
UA_DEVICE = 'device', | ||
UA_ENGINE = 'engine', | ||
UA_OS = 'os', | ||
UA_RESULT = 'result', | ||
AMAZON = 'Amazon', | ||
APPLE = 'Apple', | ||
ASUS = 'ASUS', | ||
BLACKBERRY = 'BlackBerry', | ||
GOOGLE = 'Google', | ||
HUAWEI = 'Huawei', | ||
LG = 'LG', | ||
MICROSOFT = 'Microsoft', | ||
MOTOROLA = 'Motorola', | ||
SAMSUNG = 'Samsung', | ||
SHARP = 'Sharp', | ||
SONY = 'Sony', | ||
XIAOMI = 'Xiaomi', | ||
ZEBRA = 'Zebra', | ||
PREFIX_MOBILE = 'Mobile ', | ||
SUFFIX_BROWSER = ' Browser', | ||
CHROME = 'Chrome', | ||
EDGE = 'Edge', | ||
FIREFOX = 'Firefox', | ||
OPERA = 'Opera', | ||
FACEBOOK = 'Facebook', | ||
CHROMIUM_OS = 'Chromium OS', | ||
MAC_OS = 'Mac OS'; | ||
WINDOWS = 'Windows'; | ||
var NAVIGATOR = (typeof window !== UNDEF_TYPE && window.navigator) ? | ||
window.navigator : | ||
undefined, | ||
NAVIGATOR_UADATA = (NAVIGATOR && NAVIGATOR.userAgentData) ? | ||
NAVIGATOR.userAgentData : | ||
undefined; | ||
@@ -72,11 +98,18 @@ /////////// | ||
var extend = function (regexes, extensions) { | ||
var mergedRegexes = {}; | ||
for (var i in regexes) { | ||
if (extensions[i] && extensions[i].length % 2 === 0) { | ||
mergedRegexes[i] = extensions[i].concat(regexes[i]); | ||
var assignFromEntries = function (arr) { | ||
for (var i in arr) { | ||
var propName = arr[i]; | ||
if (typeof propName == OBJ_TYPE && propName.length == 2) { | ||
this[propName[0]] = propName[1]; | ||
} else { | ||
mergedRegexes[i] = regexes[i]; | ||
this[propName] = undefined; | ||
} | ||
} | ||
return this; | ||
}, | ||
extend = function (regexes, extensions) { | ||
var mergedRegexes = {}; | ||
for (var i in regexes) { | ||
mergedRegexes[i] = extensions[i] && extensions[i].length % 2 === 0 ? extensions[i].concat(regexes[i]) : regexes[i]; | ||
} | ||
return mergedRegexes; | ||
@@ -92,13 +125,40 @@ }, | ||
has = function (str1, str2) { | ||
if (typeof str1 === OBJ_TYPE && str1.length > 0) { | ||
for (var i in str1) { | ||
if (lowerize(str1[i]) == lowerize(str2)) return true; | ||
} | ||
return false; | ||
} | ||
return typeof str1 === STR_TYPE ? lowerize(str2).indexOf(lowerize(str1)) !== -1 : false; | ||
}, | ||
isExtensions = function (obj) { | ||
for (var prop in obj) { | ||
return /^(browser|cpu|device|engine|os)$/.test(prop); | ||
} | ||
}, | ||
itemListToArray = function (header) { | ||
if (!header) return undefined; | ||
var arr = []; | ||
var tokens = strip(/\\?\"/g, header).split(', '); | ||
for (var i = 0; i < tokens.length; i++) { | ||
var token = tokens[i].split(';v='); | ||
arr[i] = { brand : token[0], version : token[1] }; | ||
} | ||
return arr; | ||
}, | ||
lowerize = function (str) { | ||
return str.toLowerCase(); | ||
return typeof(str) === STR_TYPE ? str.toLowerCase() : str; | ||
}, | ||
majorize = function (version) { | ||
return typeof(version) === STR_TYPE ? version.replace(/[^\d\.]/g, EMPTY).split('.')[0] : undefined; | ||
return typeof(version) === STR_TYPE ? strip(/[^\d\.]/g, version).split('.')[0] : undefined; | ||
}, | ||
strip = function (pattern, str) { | ||
return str.replace(pattern, EMPTY); | ||
}, | ||
stripQuotes = function (val) { | ||
return typeof val === STR_TYPE ? strip(/\"/g, val) : val; | ||
}, | ||
trim = function (str, len) { | ||
if (typeof(str) === STR_TYPE) { | ||
str = str.replace(/^\s\s*/, EMPTY); | ||
str = strip(/^\s\s*/, str); | ||
return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH); | ||
@@ -114,2 +174,4 @@ } | ||
if(!ua || !arrays) return; | ||
var i = 0, j, k, p, q, matches, match; | ||
@@ -216,8 +278,9 @@ | ||
var regexes = { | ||
var defaultRegexes = { | ||
browser : [[ | ||
// Most common regardless engine | ||
/\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS | ||
], [VERSION, [NAME, 'Chrome']], [ | ||
], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [ | ||
/edg(?:e|ios|a)?\/([\w\.]+)/i // Microsoft Edge | ||
@@ -246,7 +309,8 @@ ], [VERSION, [NAME, 'Edge']], [ | ||
/(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|qq|duckduckgo)\/([-\w\.]+)/i, | ||
// Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ | ||
// Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo | ||
/(heytap|ovi)browser\/([\d\.]+)/i, // HeyTap/Ovi | ||
/(weibo)__([\d\.]+)/i // Weibo | ||
], [NAME, VERSION], [ | ||
/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser | ||
], [VERSION, [NAME, 'UC'+BROWSER]], [ | ||
], [VERSION, [NAME, 'UCBrowser']], [ | ||
/microm.+\bqbcore\/([\w\.]+)/i, // WeChat Desktop for Windows Built-in Browser | ||
@@ -261,6 +325,6 @@ /\bqbcore\/([\w\.]+).+microm/i | ||
], [VERSION, [NAME, 'IE']], [ | ||
/yabrowser\/([\w\.]+)/i // Yandex | ||
/ya(?:search)?browser\/([\w\.]+)/i // Yandex | ||
], [VERSION, [NAME, 'Yandex']], [ | ||
/(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser | ||
], [[NAME, /(.+)/, '$1 Secure '+BROWSER], VERSION], [ | ||
], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [ | ||
/\bfocus\/([\w\.]+)/i // Firefox Focus | ||
@@ -277,9 +341,9 @@ ], [VERSION, [NAME, FIREFOX+' Focus']], [ | ||
/miuibrowser\/([\w\.]+)/i // MIUI Browser | ||
], [VERSION, [NAME, 'MIUI '+BROWSER]], [ | ||
/fxios\/([-\w\.]+)/i // Firefox for iOS | ||
], [VERSION, [NAME, FIREFOX]], [ | ||
], [VERSION, [NAME, 'MIUI' + SUFFIX_BROWSER]], [ | ||
/fxios\/([\w\.-]+)/i // Firefox for iOS | ||
], [VERSION, [NAME, PREFIX_MOBILE + 'Firefox']], [ | ||
/\bqihu|(qi?ho?o?|360)browser/i // 360 | ||
], [[NAME, '360 '+BROWSER]], [ | ||
], [[NAME, '360' + SUFFIX_BROWSER]], [ | ||
/(oculus|samsung|sailfish|huawei)browser\/([\w\.]+)/i | ||
], [[NAME, /(.+)/, '$1 '+BROWSER], VERSION], [ // Oculus/Samsung/Sailfish/Huawei Browser | ||
], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Samsung/Sailfish/Huawei Browser | ||
/(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon | ||
@@ -307,2 +371,4 @@ ], [[NAME, /_/g, ' '], VERSION], [ | ||
], [VERSION, [NAME, 'GSA']], [ | ||
/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i // TikTok | ||
], [VERSION, [NAME, 'TikTok']], [ | ||
@@ -316,10 +382,15 @@ /headlesschrome(?:\/([\w\.]+)| )/i // Chrome Headless | ||
/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i // Android Browser | ||
], [VERSION, [NAME, 'Android '+BROWSER]], [ | ||
], [VERSION, [NAME, 'Android' + SUFFIX_BROWSER]], [ | ||
/chrome\/([\w\.]+) mobile/i // Chrome Mobile | ||
], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [ | ||
/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia | ||
], [NAME, VERSION], [ | ||
/version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i // Mobile Safari | ||
], [VERSION, [NAME, 'Mobile Safari']], [ | ||
/version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i // Safari & Safari Mobile | ||
/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i // Safari Mobile | ||
], [VERSION, [NAME, PREFIX_MOBILE + 'Safari']], [ | ||
/iphone .*mobile(?:\/\w+ | ?)safari/i | ||
], [[NAME, PREFIX_MOBILE + 'Safari']], [ | ||
/version\/([\w\.\,]+) .*(safari)/i // Safari | ||
], [VERSION, NAME], [ | ||
@@ -333,2 +404,4 @@ /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0 | ||
// Gecko based | ||
/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i // Firefox Mobile | ||
], [[NAME, PREFIX_MOBILE + 'Firefox'], VERSION], [ | ||
/(navigator|netscape\d?)\/([-\w\.]+)/i // Netscape | ||
@@ -355,3 +428,3 @@ ], [[NAME, 'Netscape'], VERSION], [ | ||
/(cobalt)\/([\w\.]+)/i // Cobalt | ||
], [NAME, [VERSION, /master.|lts./, ""]] | ||
], [NAME, [VERSION, /[^\d\.]+./, EMPTY]] | ||
], | ||
@@ -361,8 +434,6 @@ | ||
/(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\)]/i // AMD64 (x64) | ||
/\b(?:(amd|x|x86[-_]?|wow|win)64)\b/i // AMD64 (x64) | ||
], [[ARCHITECTURE, 'amd64']], [ | ||
/(ia32(?=;))/i // IA32 (quicktime) | ||
], [[ARCHITECTURE, lowerize]], [ | ||
/(ia32(?=;))/i, // IA32 (quicktime) | ||
/((?:i[346]|x)86)[;\)]/i // IA32 (x86) | ||
@@ -407,3 +478,3 @@ ], [[ARCHITECTURE, 'ia32']], [ | ||
// Apple | ||
/\((ip(?:hone|od)[\w ]*);/i // iPod/iPhone | ||
/(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i // iPod/iPhone | ||
], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [ | ||
@@ -498,3 +569,3 @@ /\((ipad);[-\w\),; ]+apple/i, // iPad | ||
/(alexa)webm/i, | ||
/(kf[a-z]{2}wi)( bui|\))/i, // Kindle Fire without Silk | ||
/(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i, // Kindle Fire without Silk / Echo Show | ||
/(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD | ||
@@ -551,9 +622,3 @@ ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [ | ||
/(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad | ||
/(kindle)\/([\w\.]+)/i, // Kindle | ||
/(nook)[\w ]+build\/(\w+)/i, // Nook | ||
/(dell) (strea[kpr\d ]*[\dko])/i, // Dell Streak | ||
/(le[- ]+pan)[- ]+(\w{1,9}) bui/i, // Le Pan Tablets | ||
/(trinity)[- ]*(t\d{3}) bui/i, // Trinity Tablets | ||
/(gigaset)[- ]+(q\w{1,9}) bui/i, // Gigaset Tablets | ||
/(vodafone) ([\w ]+)(?:\)| bui)/i // Vodafone | ||
/(kindle)\/([\w\.]+)/i // Kindle | ||
], [VENDOR, MODEL, [TYPE, TABLET]], [ | ||
@@ -565,45 +630,2 @@ | ||
], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [ | ||
/(u304aa)/i // AT&T | ||
], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [ | ||
/\bsie-(\w*)/i // Siemens | ||
], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [ | ||
/\b(rct\w+) b/i // RCA Tablets | ||
], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [ | ||
/\b(venue[\d ]{2,7}) b/i // Dell Venue Tablets | ||
], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [ | ||
/\b(q(?:mv|ta)\w+) b/i // Verizon Tablet | ||
], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [ | ||
/\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i // Barnes & Noble Tablet | ||
], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [ | ||
/\b(tm\d{3}\w+) b/i | ||
], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [ | ||
/\b(k88) b/i // ZTE K Series Tablet | ||
], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [ | ||
/\b(nx\d{3}j) b/i // ZTE Nubia | ||
], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [ | ||
/\b(gen\d{3}) b.+49h/i // Swiss GEN Mobile | ||
], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [ | ||
/\b(zur\d{3}) b/i // Swiss ZUR Tablet | ||
], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [ | ||
/\b((zeki)?tb.*\b) b/i // Zeki Tablets | ||
], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [ | ||
/\b([yr]\d{2}) b/i, | ||
/\b(dragon[- ]+touch |dt)(\w{5}) b/i // Dragon Touch Tablet | ||
], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [ | ||
/\b(ns-?\w{0,9}) b/i // Insignia Tablets | ||
], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [ | ||
/\b((nxa|next)-?\w{0,9}) b/i // NextBook Tablets | ||
], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [ | ||
/\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones | ||
], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [ | ||
/\b(lvtel\-)?(v1[12]) b/i // LvTel Phones | ||
], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [ | ||
/\b(ph-1) /i // Essential PH-1 | ||
], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [ | ||
/\b(v(100md|700na|7011|917g).*\b) b/i // Envizen Tablets | ||
], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [ | ||
/\b(trio[-\w\. ]+) b/i // MachSpeed Tablets | ||
], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [ | ||
/\btu_(1491) b/i // Rotor Tablets | ||
], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [ | ||
/(shield[\w ]+) b/i // Nvidia Shield Tablets | ||
@@ -615,3 +637,3 @@ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [ | ||
], [[MODEL, /\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [ | ||
/droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra | ||
/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra | ||
], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [ | ||
@@ -640,3 +662,3 @@ /droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i | ||
], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[ | ||
/(bravia[\w ]+)( bui|\))/i // Sony | ||
/(bravia[\w ]+)( bui|\))/i // Sony | ||
], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [ | ||
@@ -658,7 +680,7 @@ /(mitv-\w{5}) bui/i // Xiaomi | ||
/(ouya)/i, // Ouya | ||
/(nintendo) ([wids3utch]+)/i // Nintendo | ||
/(nintendo) (\w+)/i // Nintendo | ||
], [VENDOR, MODEL, [TYPE, CONSOLE]], [ | ||
/droid.+; (shield) bui/i // Nvidia | ||
], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [ | ||
/(playstation [345portablevi]+)/i // Playstation | ||
/(playstation \w+)/i // Playstation | ||
], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [ | ||
@@ -689,2 +711,4 @@ /\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox | ||
], [VENDOR, [TYPE, EMBEDDED]], [ | ||
/(aeobc)\b/i // Echo Dot | ||
], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [ | ||
@@ -719,3 +743,4 @@ //////////////////// | ||
/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links | ||
/(icab)[\/ ]([23]\.[\d\.]+)/i // iCab | ||
/(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab | ||
/\b(libweb)/i | ||
], [NAME, VERSION], [ | ||
@@ -737,6 +762,7 @@ | ||
/(win(?=3|9|n)|win 9x )([nt\d\.]+)/i | ||
], [[NAME, 'Windows'], [VERSION, strMapper, windowsVersionMap]], [ | ||
], [[NAME, WINDOWS], [VERSION, strMapper, windowsVersionMap]], [ | ||
// iOS/macOS | ||
/ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS | ||
/ios;fbsv\/([\d\.]+)/i, | ||
/cfnetwork\/.+darwin/i | ||
@@ -746,3 +772,3 @@ ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [ | ||
/(macintosh|mac_powerpc\b)(?!.+haiku)/i // Mac OS | ||
], [[NAME, MAC_OS], [VERSION, /_/g, '.']], [ | ||
], [[NAME, 'macOS'], [VERSION, /_/g, '.']], [ | ||
@@ -773,3 +799,3 @@ // Mobile OSes | ||
/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS | ||
], [[NAME, CHROMIUM_OS], VERSION],[ | ||
], [[NAME, "Chrome OS"], VERSION],[ | ||
@@ -782,3 +808,3 @@ // Smart TVs | ||
// Console | ||
/(nintendo|playstation) ([wids345portablevuch]+)/i, // Nintendo/Playstation | ||
/(nintendo|playstation) (\w+)/i, // Nintendo/Playstation | ||
/(xbox); +xbox ([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S) | ||
@@ -801,3 +827,3 @@ | ||
/(aix) ((\d)(?=\.|\)| )[\w\.])*/i, // AIX | ||
/\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux)/i, // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX | ||
/\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX/SerenityOS | ||
/(unix) ?([\w\.]*)/i // UNIX | ||
@@ -809,94 +835,296 @@ ], [NAME, VERSION] | ||
///////////////// | ||
// Factories | ||
//////////////// | ||
var defaultProps = (function () { | ||
var props = { init : {}, isIgnore : {}, isIgnoreRgx : {}, toString : {}}; | ||
assignFromEntries.call(props.init, [ | ||
[UA_BROWSER, [NAME, VERSION, MAJOR]], | ||
[UA_CPU, [ARCHITECTURE]], | ||
[UA_DEVICE, [TYPE, MODEL, VENDOR]], | ||
[UA_ENGINE, [NAME, VERSION]], | ||
[UA_OS, [NAME, VERSION]] | ||
]); | ||
assignFromEntries.call(props.isIgnore, [ | ||
[UA_BROWSER, [VERSION, MAJOR]], | ||
[UA_ENGINE, [VERSION]], | ||
[UA_OS, [VERSION]] | ||
]); | ||
assignFromEntries.call(props.isIgnoreRgx, [ | ||
[UA_BROWSER, / ?browser$/i], | ||
[UA_OS, / ?os$/i] | ||
]); | ||
assignFromEntries.call(props.toString, [ | ||
[UA_BROWSER, [NAME, VERSION]], | ||
[UA_CPU, [ARCHITECTURE]], | ||
[UA_DEVICE, [VENDOR, MODEL]], | ||
[UA_ENGINE, [NAME, VERSION]], | ||
[UA_OS, [NAME, VERSION]] | ||
]); | ||
return props; | ||
})(); | ||
var createUAParserData = function (itemType, ua, rgxMap, uaCH) { | ||
var init_props = defaultProps.init[itemType], | ||
is_ignoreProps = defaultProps.isIgnore[itemType] || 0, | ||
is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0, | ||
toString_props = defaultProps.toString[itemType] || 0; | ||
function UAParserData () { | ||
assignFromEntries.call(this, init_props); | ||
} | ||
UAParserData.prototype.withClientHints = function () { | ||
// nodejs / non-client-hints browsers | ||
if (!NAVIGATOR_UADATA) { | ||
return new UAParserItem(itemType, ua, rgxMap, uaCH).parseCH().get(); | ||
} | ||
// browsers based on chromium 85+ | ||
return NAVIGATOR_UADATA | ||
.getHighEntropyValues(CH_ALL_VALUES) | ||
.then(function (res) { | ||
var JS_UACH = new UAParserDataCH(res, false); | ||
return new UAParserItem(itemType, ua, rgxMap, JS_UACH).parseCH().get(); | ||
}); | ||
}; | ||
if (itemType != UA_RESULT) { | ||
UAParserData.prototype.is = function (strToCheck) { | ||
var is = false; | ||
for (var i in this) { | ||
if (this.hasOwnProperty(i) && !has(is_ignoreProps, i) && lowerize(is_ignoreRgx ? strip(is_ignoreRgx, this[i]) : this[i]) == lowerize(is_ignoreRgx ? strip(is_ignoreRgx, strToCheck) : strToCheck)) { | ||
is = true; | ||
if (strToCheck != UNDEF_TYPE) break; | ||
} else if (strToCheck == UNDEF_TYPE && is) { | ||
is = !is; | ||
break; | ||
} | ||
} | ||
return is; | ||
}; | ||
UAParserData.prototype.toString = function () { | ||
var str = EMPTY; | ||
for (var i in toString_props) { | ||
if (typeof(this[toString_props[i]]) !== UNDEF_TYPE) { | ||
str += (str ? ' ' : EMPTY) + this[toString_props[i]]; | ||
} | ||
} | ||
return str || UNDEF_TYPE; | ||
}; | ||
} | ||
if (!NAVIGATOR_UADATA) { | ||
UAParserData.prototype.then = function (cb) { | ||
cb(this); | ||
return this; | ||
}; | ||
} | ||
return new UAParserData(); | ||
}; | ||
///////////////// | ||
// Constructor | ||
//////////////// | ||
var UAParser = function (ua, extensions) { | ||
function UAParserDataCH (uach, isHTTP_UACH) { | ||
uach = uach || {}; | ||
assignFromEntries.call(this, CH_ALL_VALUES); | ||
if (isHTTP_UACH) { | ||
assignFromEntries.call(this, [ | ||
[BRANDS, itemListToArray(uach[CH_HEADER])], | ||
[FULLVERLIST, itemListToArray(uach[CH_HEADER_FULL_VER_LIST])], | ||
[BRANDS, itemListToArray(uach[CH_HEADER])], | ||
[MOBILE, /\?1/.test(uach[CH_HEADER_MOBILE])], | ||
[MODEL, stripQuotes(uach[CH_HEADER_MODEL])], | ||
[PLATFORM, stripQuotes(uach[CH_HEADER_PLATFORM])], | ||
[PLATFORMVER, stripQuotes(uach[CH_HEADER_PLATFORM_VER])], | ||
[ARCHITECTURE, stripQuotes(uach[CH_HEADER_ARCH])], | ||
[BITNESS, stripQuotes(uach[CH_HEADER_BITNESS])] | ||
]); | ||
} else { | ||
for (var prop in uach) { | ||
if(this.hasOwnProperty(prop) && typeof uach[prop] !== UNDEF_TYPE) this[prop] = uach[prop]; | ||
} | ||
} | ||
return this; | ||
} | ||
function UAParserItem (itemType, ua, rgxMap, uaCH) { | ||
assignFromEntries.call(this, [ | ||
['itemType', itemType], | ||
['ua', ua], | ||
['uaCH', uaCH], | ||
['rgxMap', rgxMap], | ||
['data', createUAParserData(itemType, ua, rgxMap, uaCH)] | ||
]); | ||
this.parse(); | ||
switch(this.itemType) { | ||
case UA_BROWSER: | ||
// Brave-specific detection | ||
if (NAVIGATOR && NAVIGATOR.userAgent == ua && NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == FUNC_TYPE) { | ||
this.set(NAME, 'Brave'); | ||
} | ||
this.set(MAJOR, majorize(this.get(VERSION))); | ||
break; | ||
case UA_DEVICE: | ||
if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) { | ||
this.set(TYPE, MOBILE); | ||
} | ||
// iPadOS-specific detection: identified as Mac, but has some iOS-only properties | ||
if (this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== UNDEF_TYPE && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) { | ||
this.set(MODEL, 'iPad') | ||
.set(TYPE, TABLET); | ||
} | ||
break; | ||
case UA_OS: | ||
if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM] && NAVIGATOR_UADATA[PLATFORM] != 'Unknown') { | ||
this.set(NAME, NAVIGATOR_UADATA[PLATFORM]); | ||
} | ||
break; | ||
case UA_RESULT: | ||
var createUAParserItem = function (itemType) { | ||
return new UAParserItem(itemType, ua, rgxMap[itemType], uaCH).get(); | ||
}; | ||
this.set('ua', ua) | ||
.set(UA_BROWSER, createUAParserItem(UA_BROWSER)) | ||
.set(UA_CPU, createUAParserItem(UA_CPU)) | ||
.set(UA_DEVICE, createUAParserItem(UA_DEVICE)) | ||
.set(UA_ENGINE, createUAParserItem(UA_ENGINE)) | ||
.set(UA_OS, createUAParserItem(UA_OS)) | ||
.get(); | ||
} | ||
return this; | ||
} | ||
UAParserItem.prototype.get = function (prop) { | ||
if (!prop) return this.data; | ||
return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined; | ||
}; | ||
UAParserItem.prototype.parse = function () { | ||
if (this.itemType != UA_RESULT) { | ||
rgxMapper.call(this.data, this.ua, this.rgxMap); | ||
} | ||
return this; | ||
}; | ||
UAParserItem.prototype.parseCH = function () { | ||
var ua = this.ua, | ||
uaCH = this.uaCH, | ||
rgxMap = this.rgxMap; | ||
switch (this.itemType) { | ||
case UA_BROWSER: | ||
var brands = uaCH[FULLVERLIST] || uaCH[BRANDS]; | ||
if (brands) { | ||
for (var i in brands) { | ||
var brandName = brands[i].brand, | ||
brandVersion = brands[i].version; | ||
if (!/not.a.brand/i.test(brandName) || /chromi/i.test(this.get(NAME))) { | ||
this.set(NAME, strip(GOOGLE+' ', brandName)) | ||
.set(VERSION, brandVersion) | ||
.set(MAJOR, majorize(brandVersion)); | ||
} | ||
} | ||
} | ||
break; | ||
case UA_CPU: | ||
var archName = uaCH[ARCHITECTURE]; | ||
if (archName) { | ||
if (archName && uaCH[BITNESS] == '64') archName += '64'; | ||
rgxMapper.call(this.data, archName + ';', rgxMap); | ||
} | ||
break; | ||
case UA_DEVICE: | ||
if (uaCH[MOBILE]) { | ||
this.set(TYPE, MOBILE); | ||
} | ||
if (uaCH[MODEL]) { | ||
this.set(MODEL, uaCH[MODEL]); | ||
} | ||
break; | ||
case UA_OS: | ||
var osName = uaCH[PLATFORM]; | ||
if(osName) { | ||
var osVersion = uaCH[PLATFORMVER]; | ||
if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10'); | ||
this.set(NAME, osName) | ||
.set(VERSION, osVersion); | ||
} | ||
break; | ||
case UA_RESULT: | ||
var createUAParserItemWithCH = function (itemType) { | ||
return new UAParserItem(itemType, ua, rgxMap[itemType], uaCH).parseCH().get(); | ||
}; | ||
this.set('ua', ua) | ||
.set(UA_BROWSER, createUAParserItemWithCH(UA_BROWSER)) | ||
.set(UA_CPU, createUAParserItemWithCH(UA_CPU)) | ||
.set(UA_DEVICE, createUAParserItemWithCH(UA_DEVICE)) | ||
.set(UA_ENGINE, createUAParserItemWithCH(UA_ENGINE)) | ||
.set(UA_OS, createUAParserItemWithCH(UA_OS)); | ||
} | ||
return this; | ||
}; | ||
UAParserItem.prototype.set = function (prop, val) { | ||
this.data[prop] = val; | ||
return this; | ||
}; | ||
function UAParser (ua, extensions, headers) { | ||
if (typeof ua === OBJ_TYPE) { | ||
extensions = ua; | ||
if (isExtensions(ua)) { | ||
if (typeof extensions === OBJ_TYPE) { | ||
headers = extensions; // case UAParser(extensions, headers) | ||
} | ||
extensions = ua; // case UAParser(extensions) | ||
} else { | ||
headers = ua; // case UAParser(headers) | ||
extensions = undefined; | ||
} | ||
ua = undefined; | ||
} else if (typeof ua === STR_TYPE && !isExtensions(extensions)) { | ||
headers = extensions; // case UAParser(ua, headers) | ||
extensions = undefined; | ||
} | ||
if (!(this instanceof UAParser)) { | ||
return new UAParser(ua, extensions).getResult(); | ||
return new UAParser(ua, extensions, headers).getResult(); | ||
} | ||
var _navigator = (typeof window !== UNDEF_TYPE && window.navigator) ? window.navigator : undefined; | ||
var _ua = ua || ((_navigator && _navigator.userAgent) ? _navigator.userAgent : EMPTY); | ||
var _uach = (_navigator && _navigator.userAgentData) ? _navigator.userAgentData : undefined; | ||
var _rgxmap = extensions ? extend(regexes, extensions) : regexes; | ||
var userAgent = ua || | ||
((NAVIGATOR && NAVIGATOR.userAgent) ? | ||
NAVIGATOR.userAgent : | ||
(headers && headers[USER_AGENT] ? | ||
headers[USER_AGENT] : | ||
EMPTY)), | ||
HTTP_UACH = new UAParserDataCH(headers, true), | ||
this.getBrowser = function () { | ||
var _browser = {}; | ||
_browser[NAME] = undefined; | ||
_browser[VERSION] = undefined; | ||
rgxMapper.call(_browser, _ua, _rgxmap.browser); | ||
_browser[MAJOR] = majorize(_browser[VERSION]); | ||
// Brave-specific detection | ||
if (_navigator && _navigator.brave && typeof _navigator.brave.isBrave == FUNC_TYPE) { | ||
_browser[NAME] = 'Brave'; | ||
} | ||
return _browser; | ||
}; | ||
this.getCPU = function () { | ||
var _cpu = {}; | ||
_cpu[ARCHITECTURE] = undefined; | ||
rgxMapper.call(_cpu, _ua, _rgxmap.cpu); | ||
return _cpu; | ||
}; | ||
this.getDevice = function () { | ||
var _device = {}; | ||
_device[VENDOR] = undefined; | ||
_device[MODEL] = undefined; | ||
_device[TYPE] = undefined; | ||
rgxMapper.call(_device, _ua, _rgxmap.device); | ||
if (!_device[TYPE] && _uach && _uach.mobile) { | ||
_device[TYPE] = MOBILE; | ||
} | ||
// iPadOS-specific detection: identified as Mac, but has some iOS-only properties | ||
if (_device[MODEL] == 'Macintosh' && _navigator && typeof _navigator.standalone !== UNDEF_TYPE && _navigator.maxTouchPoints && _navigator.maxTouchPoints > 2) { | ||
_device[MODEL] = 'iPad'; | ||
_device[TYPE] = TABLET; | ||
} | ||
return _device; | ||
}; | ||
this.getEngine = function () { | ||
var _engine = {}; | ||
_engine[NAME] = undefined; | ||
_engine[VERSION] = undefined; | ||
rgxMapper.call(_engine, _ua, _rgxmap.engine); | ||
return _engine; | ||
}; | ||
this.getOS = function () { | ||
var _os = {}; | ||
_os[NAME] = undefined; | ||
_os[VERSION] = undefined; | ||
rgxMapper.call(_os, _ua, _rgxmap.os); | ||
if (!_os[NAME] && _uach && _uach.platform != 'Unknown') { | ||
_os[NAME] = _uach.platform | ||
.replace(/chrome os/i, CHROMIUM_OS) | ||
.replace(/macos/i, MAC_OS); // backward compatibility | ||
} | ||
return _os; | ||
}; | ||
this.getResult = function () { | ||
return { | ||
ua : this.getUA(), | ||
browser : this.getBrowser(), | ||
engine : this.getEngine(), | ||
os : this.getOS(), | ||
device : this.getDevice(), | ||
cpu : this.getCPU() | ||
regexMap = extensions ? | ||
extend(defaultRegexes, extensions) : | ||
defaultRegexes, | ||
createUAParserItemFunc = function (itemType) { | ||
return function () { | ||
return new UAParserItem(itemType, userAgent, itemType == UA_RESULT ? regexMap : regexMap[itemType], HTTP_UACH).get(); | ||
}; | ||
}; | ||
}; | ||
this.getUA = function () { | ||
return _ua; | ||
}; | ||
this.setUA = function (ua) { | ||
_ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? trim(ua, UA_MAX_LENGTH) : ua; | ||
return this; | ||
}; | ||
this.setUA(_ua); | ||
// public methods | ||
assignFromEntries.call(this, [ | ||
['getBrowser', createUAParserItemFunc(UA_BROWSER)], | ||
['getCPU', createUAParserItemFunc(UA_CPU)], | ||
['getDevice', createUAParserItemFunc(UA_DEVICE)], | ||
['getEngine', createUAParserItemFunc(UA_ENGINE)], | ||
['getOS', createUAParserItemFunc(UA_OS)], | ||
['getResult', createUAParserItemFunc(UA_RESULT)], | ||
['getUA', function () { return userAgent; }], | ||
['setUA', function (ua) { | ||
userAgent = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? trim(ua, UA_MAX_LENGTH) : ua; | ||
return this; | ||
}] | ||
]).setUA(userAgent); | ||
return this; | ||
}; | ||
} | ||
@@ -903,0 +1131,0 @@ UAParser.VERSION = LIBVERSION; |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
204811
12
2392
588
1
1