diff --git a/.gitignore b/.gitignore index 58b805fe..0682a384 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ .DS_Store -node_modules/ \ No newline at end of file +node_modules/ +package-lock.json +*.tgz +*.log diff --git a/.npmignore b/.npmignore new file mode 100644 index 00000000..07ba3f9c --- /dev/null +++ b/.npmignore @@ -0,0 +1,8 @@ +node_modules/ +test_resources/ +tests/ +tmp/ +*.bak +*.tgz +*.log +.* diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..43c97e71 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/.travis.yml b/.travis.yml index 6486e92b..b7017f1c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,13 @@ sudo: false language: node_js node_js: - - 0.12 - - 4.0 + - 8 + - 10 + - node script: - "npm test" - + notifications: irc: "chat.freenode.net#ua-parser" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 30bcf3b6..5fbfb416 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -10,9 +10,10 @@ Contributing to the project, especially `regexes.yaml`, is both welcomed and enc * `tests/test_device.yaml` * `tests/test_os.yaml` * `tests/test_ua.yaml` -5. Push your branch to GitHub and submit a pull request -6. Monitor the pull request to make sure the Travis build succeeds. If it fails simply make the necessary changes to your branch and push it. Travis will re-test the changes. +5. Check that your regex is not vulnerable to [ReDoS](https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS) using the test in `tests/regexes.js` +6. Push your branch to GitHub and submit a pull request +7. Monitor the pull request to make sure the Travis build succeeds. If it fails simply make the necessary changes to your branch and push it. Travis will re-test the changes. That's it. If you don't feel comfortable forking the project or modifying the YAML you can also [submit an issue](https://github.com/ua-parser/uap-core/issues) that includes the appropriate user agent string and the expected results of parsing. -Thanks! \ No newline at end of file +Thanks! diff --git a/README.md b/README.md index ff6e0f14..00cce4cc 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -uap-core [![Build Status](https://secure.travis-ci.org/ua-parser/uap-core.png?branch=master)](https://travis-ci.org/ua-parser/uap-core) +uap-core [![Build Status](https://secure.travis-ci.org/ua-parser/uap-core.svg?branch=master)](https://travis-ci.org/ua-parser/uap-core) [![Backers on Open Collective](https://opencollective.com/ua-parser/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/ua-parser/sponsors/badge.svg)](#sponsors) ======== This repository contains the core of [BrowserScope][2]'s original [user agent string parser][3]: data collected over the years by [Steve Souders][4] and numerous other contributors, extracted into a separate [YAML file][5] so as to be reusable _as is_ by implementations in any programming language. @@ -8,6 +8,7 @@ This repo itself does _not_ contain a parser: only the necessary data to build o Maintainers ----------- +* [Com Menthol](https://github.com/commenthol) * [Lindsey Simon](https://github.com/elsigh) ([@elsigh](https://twitter.com/elsigh)) * [Tobie Langel](https://github.com/tobie) ([@tobie](https://twitter.com/tobie)) @@ -22,6 +23,28 @@ Contributing Changes to regexes.yaml Please read the [contributors' guide](CONTRIBUTING.md) +## Credits +### Contributors + +This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)]. + + + +### Backers + +Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/ua-parser#backer)] + + + + +### Sponsors + +Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/ua-parser#sponsor)] + + + + + License ------- diff --git a/package.json b/package.json index afc4ccf4..28f706f5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "uap-core", "description": "The regex file necessary to build language ports of Browserscope's user agent parser.", - "version": "0.5.0", + "version": "0.6.8", "maintainers": [ { "name": "Tobie Langel", @@ -25,11 +25,12 @@ } ], "devDependencies": { - "yamlparser": ">=0.0.2", "mocha": "*", - "uap-ref-impl": "*" + "safe-regex": "^2.0.1", + "uap-ref-impl": "git+https://github.com/ua-parser/uap-ref-impl#master", + "yamlparser": ">=0.0.2" }, "scripts": { - "test": "mocha -u tdd -R min ./tests/test.js" + "test": "mocha --opts ./tests/mocha.opts ./tests" } } diff --git a/regexes.yaml b/regexes.yaml index ccd01420..6d5b653a 100644 --- a/regexes.yaml +++ b/regexes.yaml @@ -1,14 +1,60 @@ user_agent_parsers: #### SPECIAL CASES TOP #### + # CFNetwork Podcast catcher Applications + - regex: '(ESPN)[%20| ]+Radio/(\d+)\.(\d+)\.(\d+) CFNetwork' + - regex: '(Antenna)/(\d+) CFNetwork' + family_replacement: 'AntennaPod' + - regex: '(TopPodcasts)Pro/(\d+) CFNetwork' + - regex: '(MusicDownloader)Lite/(\d+)\.(\d+)\.(\d+) CFNetwork' + - regex: '^(.*)-iPad\/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork' + - regex: '^(.*)-iPhone/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork' + - regex: '^(.*)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork' + + # Podcast catchers + - regex: '(espn\.go)' + family_replacement: 'ESPN' + - regex: '(espnradio\.com)' + family_replacement: 'ESPN' + - regex: 'ESPN APP$' + family_replacement: 'ESPN' + - regex: '(audioboom\.com)' + family_replacement: 'AudioBoom' + - regex: ' (Rivo) RHYTHM' + # @note: iOS / OSX Applications - - regex: '(CFNetwork)(?:/(\d+)\.(\d+)\.?(\d+)?)?' + - regex: '(CFNetwork)(?:/(\d+)\.(\d+)(?:\.(\d+)|)|)' family_replacement: 'CFNetwork' # Pingdom - - regex: '(Pingdom.com_bot_version_)(\d+)\.(\d+)' + - regex: '(Pingdom\.com_bot_version_)(\d+)\.(\d+)' + family_replacement: 'PingdomBot' + # 'Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PingdomTMS/0.8.5 Safari/534.34' + - regex: '(PingdomTMS)/(\d+)\.(\d+)\.(\d+)' family_replacement: 'PingdomBot' + # PTST / WebPageTest.org crawlers + - regex: ' (PTST)/(\d+)(?:\.(\d+)|)$' + family_replacement: 'WebPageTest.org bot' + + # Datanyze.com spider + - regex: 'X11; (Datanyze); Linux' + + # New Relic Pinger + - regex: '(NewRelicPinger)/(\d+)\.(\d+)' + family_replacement: 'NewRelicPingerBot' + + # Tableau + - regex: '(Tableau)/(\d+)\.(\d+)' + family_replacement: 'Tableau' + + # Salesforce + - regex: '(Salesforce)(?:.)\/(\d+)\.(\d?)' + + #StatusCake + - regex: '(\(StatusCake\))' + family_replacement: 'StatusCakeBot' + # Facebook - regex: '(facebookexternalhit)/(\d+)\.(\d+)' family_replacement: 'FacebookBot' @@ -17,62 +63,124 @@ user_agent_parsers: - regex: 'Google.*/\+/web/snippet' family_replacement: 'GooglePlusBot' + # Gmail + - regex: 'via ggpht\.com GoogleImageProxy' + family_replacement: 'GmailImageProxy' + + # Yahoo + - regex: 'YahooMailProxy; https://help\.yahoo\.com/kb/yahoo-mail-proxy-SLN28749\.html' + family_replacement: 'YahooMailProxy' + + # Twitter + - regex: '(Twitterbot)/(\d+)\.(\d+)' + family_replacement: 'TwitterBot' + # Bots Pattern '/name-0.0' - - regex: '/((?:Ant-)?Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \-](\d+)(?:\.(\d+)(?:\.(\d+))?)?' + - regex: '/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \-](\d+)(?:\.(\d+)|)(?:\.(\d+)|)' # Bots Pattern 'name/0.0' - - regex: '(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)(?:\.(\d+))?)?' + - regex: '\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)' # MSIECrawler - - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d?)?;.* MSIECrawler' + - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.* MSIECrawler' family_replacement: 'MSIECrawler' + # DAVdroid + - regex: '(DAVdroid)/(\d+)\.(\d+)(?:\.(\d+)|)' + # Downloader ... - - regex: '(Google-HTTP-Java-Client|Apache-HttpClient|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP)(?:[ /](\d+)(?:\.(\d+)(?:\.(\d+))?)?)?' + - regex: '(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)' + + # Pinterestbot + - regex: '(Pinterest(?:bot|))/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)[;\s(]+\+https://www.pinterest.com/bot.html' + family_replacement: 'Pinterestbot' # Bots - - regex: '(1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]+-Agent|AdsBot-Google(?:-[a-z]+)?|altavista|AppEngine-Google|archive.*?\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]+)*|bingbot|BingPreview|blitzbot|BlogBridge|BoardReader(?: [A-Za-z]+)*|boitho.com-dc|BotSeer|\b\w*favicon\w*\b|\bYeti(?:-[a-z]+)?|Catchpoint bot|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher)?|Feed Seeker Bot|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]+-)?Googlebot(?:-[a-zA-Z]+)?|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile)?|IconSurf|IlTrovatore(?:-Setaccio)?|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]+Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masidani_bot|Mediapartners-Google|Microsoft .*? Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media *)?|msrbot|netresearch|Netvibes|NewsGator[^/]*|^NING|Nutch[^/]*|Nymesis|ObjectsSearch|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PlantyNet_WebRobot|Pompos|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|Simpy|SimplePie|SEOstats|SimpleRSS|Slurp|snappy|Speedy Spider|Squrl Java|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|TwitterBot|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]+|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s)? Link Sleuth|Xerka [A-z]+Bot|yacy(?:bot)?|Yahoo[a-z]*Seeker|Yahoo! Slurp|Yandex\w+|YodaoBot(?:-[A-z]+)?|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?' + - regex: '(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\/\$BotVersion|123metaspider-Bot|1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\b\w{0,30}favicon\w{0,30}\b|\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|Tiny Tiny RSS|TwitterBot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)' + + # AWS S3 Clients + # must come before "Bots General matcher" to catch "boto"/"boto3" before "bot" + - regex: '\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?))|s3fs)/(\d+)\.(\d+)(?:\.(\d+)|)' + + # Facebook + # Must come before "Bots General matcher" to catch OrangeBotswana + # Facebook Messenger must go before Facebook + - regex: '\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)' + family_replacement: 'Facebook Messenger' + # Facebook + - regex: '\[FB.*;(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)' + family_replacement: 'Facebook' + # Sometimes Facebook does not specify a version (FBAV) + - regex: '\[FB.*;' + family_replacement: 'Facebook' # Bots General matcher 'name/0.0' - - regex: '(?:\/[A-Za-z0-9\.]+)? *([A-Za-z0-9 \-_\!\[\]:]*(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]*))/(\d+)(?:\.(\d+)(?:\.(\d+))?)?' - # Bots General matcher 'name 0.0' - - regex: '(?:\/[A-Za-z0-9\.]+)? *([A-Za-z0-9 _\!\[\]:]*(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]*)) (\d+)(?:\.(\d+)(?:\.(\d+))?)?' - # Bots containing spider|scrape|bot(but not CUBOT)|Crawl - - regex: '((?:[A-z0-9]+|[A-z\-]+ ?)?(?: the )?(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[A-Za-z0-9-]*(?:[^C][^Uu])[Bb]ot|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]*)(?:(?:[ /]| v)(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?' + - regex: '(?:\/[A-Za-z0-9\.]+|) {0,5}([A-Za-z0-9 \-_\!\[\]:]{0,50}(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]{0,50}))[/ ](\d+)(?:\.(\d+)(?:\.(\d+)|)|)' + # Bots containing bot(but not CUBOT) + - regex: '((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\b(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)' + # Bots containing spider|scrape|Crawl + - regex: '((?:[A-z0-9]{1,50}|[A-z\-]{1,50} ?|)(?: the |)(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]{0,50})(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)' # HbbTV standard defines what features the browser should understand. # but it's like targeting "HTML5 browsers", effective browser support depends on the model # See os_parsers if you want to target a specific TV - regex: '(HbbTV)/(\d+)\.(\d+)\.(\d+) \(' - # must go before Firefox to catch Chimera/SeaMonkey/Camino - - regex: '(Chimera|SeaMonkey|Camino)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*)?' + # must go before Firefox to catch Chimera/SeaMonkey/Camino/Waterfox + - regex: '(Chimera|SeaMonkey|Camino|Waterfox)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*|)' + + # must be before Firefox / Gecko to catch SailfishBrowser properly + - regex: '(SailfishBrowser)/(\d+)\.(\d+)(?:\.(\d+)|)' + family_replacement: 'Sailfish Browser' + + # Social Networks (non-Facebook) + # Pinterest + - regex: '\[(Pinterest)/[^\]]+\]' + - regex: '(Pinterest)(?: for Android(?: Tablet|)|)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)' + # Instagram app + - regex: 'Mozilla.*Mobile.*(Instagram).(\d+)\.(\d+)\.(\d+)' + # Flipboard app + - regex: 'Mozilla.*Mobile.*(Flipboard).(\d+)\.(\d+)\.(\d+)' + # Flipboard-briefing app + - regex: 'Mozilla.*Mobile.*(Flipboard-Briefing).(\d+)\.(\d+)\.(\d+)' + # Onefootball app + - regex: 'Mozilla.*Mobile.*(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)' + # Snapchat + - regex: '(Snapchat)\/(\d+)\.(\d+)\.(\d+).(\d+)' + + # Basilisk + - regex: '(Firefox)/(\d+)\.(\d+) Basilisk/(\d+)' + family_replacement: 'Basilisk' + + # Pale Moon + - regex: '(PaleMoon)/(\d+)\.(\d+)(?:\.(\d+)|)' + family_replacement: 'Pale Moon' # Firefox - - regex: '(Pale[Mm]oon)/(\d+)\.(\d+)\.?(\d+)?' - family_replacement: 'Pale Moon (Firefox Variant)' - regex: '(Fennec)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*)' family_replacement: 'Firefox Mobile' - regex: '(Fennec)/(\d+)\.(\d+)(pre)' family_replacement: 'Firefox Mobile' - regex: '(Fennec)/(\d+)\.(\d+)' family_replacement: 'Firefox Mobile' - - regex: 'Mobile.*(Firefox)/(\d+)\.(\d+)' + - regex: '(?:Mobile|Tablet);.*(Firefox)/(\d+)\.(\d+)' family_replacement: 'Firefox Mobile' - - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre)?)' + - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre|))' family_replacement: 'Firefox ($1)' - regex: '(Firefox)/(\d+)\.(\d+)(a\d+[a-z]*)' family_replacement: 'Firefox Alpha' - regex: '(Firefox)/(\d+)\.(\d+)(b\d+[a-z]*)' family_replacement: 'Firefox Beta' - - regex: '(Firefox)-(?:\d+\.\d+)?/(\d+)\.(\d+)(a\d+[a-z]*)' + - regex: '(Firefox)-(?:\d+\.\d+|)/(\d+)\.(\d+)(a\d+[a-z]*)' family_replacement: 'Firefox Alpha' - - regex: '(Firefox)-(?:\d+\.\d+)?/(\d+)\.(\d+)(b\d+[a-z]*)' + - regex: '(Firefox)-(?:\d+\.\d+|)/(\d+)\.(\d+)(b\d+[a-z]*)' family_replacement: 'Firefox Beta' - - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*)?' + - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*|)' family_replacement: 'Firefox ($1)' - regex: '(Firefox).*Tablet browser (\d+)\.(\d+)\.(\d+)' family_replacement: 'MicroB' - - regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*)?' + - regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*|)' + - regex: '(FxiOS)/(\d+)\.(\d+)(\.(\d+)|)(\.(\d+)|)' + family_replacement: 'Firefox iOS' # e.g.: Flock/2.0b2 - regex: '(Flock)/(\d+)\.(\d+)(b\d+?)' @@ -87,15 +195,21 @@ user_agent_parsers: - regex: '(Navigator)/(\d+)\.(\d+)([ab]\d+)' family_replacement: 'Netscape' - - regex: '(Netscape6)/(\d+)\.(\d+)\.?([ab]?\d+)?' + - regex: '(Netscape6)/(\d+)\.(\d+)\.?([ab]?\d+|)' family_replacement: 'Netscape' - regex: '(MyIBrow)/(\d+)\.(\d+)' family_replacement: 'My Internet Browser' + # UC Browser + # we need check it before opera. In other case case UC Browser detected look like Opera Mini + - regex: '(UC? ?Browser|UCWEB|U3)[ /]?(\d+)\.(\d+)\.(\d+)' + family_replacement: 'UC Browser' + # Opera will stop at 9.80 and hide the real version in the Version string. # see: http://dev.opera.com/articles/view/opera-ua-string-changes/ - - regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+))?' + - regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+)|)' + - regex: '(Opera Mini)(?:/att|)/?(\d+|)(?:\.(\d+)|)(?:\.(\d+)|)' - regex: '(Opera)/.+Opera Mobi.+Version/(\d+)\.(\d+)' family_replacement: 'Opera Mobile' - regex: '(Opera)/(\d+)\.(\d+).+Opera Mobi' @@ -104,8 +218,7 @@ user_agent_parsers: family_replacement: 'Opera Mobile' - regex: 'Opera Mobi' family_replacement: 'Opera Mobile' - - regex: '(Opera Mini)(?:/att)?/(\d+)\.(\d+)' - - regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+))?' + - regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+)|)' # Opera 14 for Android uses a WebKit render engine. - regex: '(?:Mobile Safari).*(OPR)/(\d+)\.(\d+)\.(\d+)' @@ -123,8 +236,12 @@ user_agent_parsers: - regex: '(OPiOS)/(\d+).(\d+).(\d+)' family_replacement: 'Opera Mini' + # Opera Neon + - regex: 'Chrome/.+( MMS)/(\d+).(\d+).(\d+)' + family_replacement: 'Opera Neon' + # Palm WebOS looks a lot like Safari. - - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+))?' + - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+)|)' family_replacement: 'webOS Browser' # LuaKit has no version info. @@ -137,23 +254,23 @@ user_agent_parsers: # Lightning (for Thunderbird) # http://www.mozilla.org/projects/calendar/lightning/ - - regex: '(Lightning)/(\d+)\.(\d+)\.?((?:[ab]?\d+[a-z]*)|(?:\d*))' + - regex: 'Gecko/\d+ (Lightning)/(\d+)\.(\d+)\.?((?:[ab]?\d+[a-z]*)|(?:\d*))' # Swiftfox - - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+(?:pre)?) \(Swiftfox\)' + - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+(?:pre|)) \(Swiftfox\)' family_replacement: 'Swiftfox' - - regex: '(Firefox)/(\d+)\.(\d+)([ab]\d+[a-z]*)? \(Swiftfox\)' + - regex: '(Firefox)/(\d+)\.(\d+)([ab]\d+[a-z]*|) \(Swiftfox\)' family_replacement: 'Swiftfox' # Rekonq - - regex: '(rekonq)/(\d+)\.(\d+)\.?(\d+)? Safari' + - regex: '(rekonq)/(\d+)\.(\d+)(?:\.(\d+)|) Safari' family_replacement: 'Rekonq' - regex: 'rekonq' family_replacement: 'Rekonq' # Conkeror lowercase/uppercase # http://conkeror.org/ - - regex: '(conkeror|Conkeror)/(\d+)\.(\d+)\.?(\d+)?' + - regex: '(conkeror|Conkeror)/(\d+)\.(\d+)(?:\.(\d+)|)' family_replacement: 'Conkeror' # catches lower case konqueror @@ -167,8 +284,6 @@ user_agent_parsers: - regex: '(Symphony) (\d+).(\d+)' - - regex: '(Minimo)' - - regex: 'PLAYSTATION 3.+WebKit' family_replacement: 'NetFront NX' - regex: 'PLAYSTATION 3' @@ -184,32 +299,76 @@ user_agent_parsers: family_replacement: 'NetFront NX' # Amazon Silk, should go before Safari and Chrome Mobile - - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))?' + - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+)|)' family_replacement: 'Amazon Silk' - # @ref: http://www.puffinbrowser.com - - regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+))?' + - regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+)|)' + + # Edge Mobile + - regex: 'Windows Phone .*(Edge)/(\d+)\.(\d+)' + family_replacement: 'Edge Mobile' + + # Samsung Internet (based on Chrome, but lacking some features) + - regex: '(SamsungBrowser)/(\d+)\.(\d+)' + family_replacement: 'Samsung Internet' + + # Seznam.cz browser (based on WebKit) + - regex: '(SznProhlizec)/(\d+)\.(\d+)(?:\.(\d+)|)' + family_replacement: 'Seznam prohlížeč' + + # Coc Coc browser, based on Chrome (used in Vietnam) + - regex: '(coc_coc_browser)/(\d+)\.(\d+)(?:\.(\d+)|)' + family_replacement: 'Coc Coc' + + # Baidu Browsers (desktop spoofs chrome & IE, explorer is mobile) + - regex: '(baidubrowser)[/\s](\d+)(?:\.(\d+)|)(?:\.(\d+)|)' + family_replacement: 'Baidu Browser' + - regex: '(FlyFlow)/(\d+)\.(\d+)' + family_replacement: 'Baidu Explorer' + + # MxBrowser is Maxthon. Must go before Mobile Chrome for Android + - regex: '(MxBrowser)/(\d+)\.(\d+)(?:\.(\d+)|)' + family_replacement: 'Maxthon' + + # Crosswalk must go before Mobile Chrome for Android + - regex: '(Crosswalk)/(\d+)\.(\d+)\.(\d+)\.(\d+)' + + # LINE https://line.me/en/ + # Must go before Mobile Chrome for Android + - regex: '(Line)/(\d+)\.(\d+)\.(\d+)' + family_replacement: 'LINE' + + # MiuiBrowser should got before Mobile Chrome for Android + - regex: '(MiuiBrowser)/(\d+)\.(\d+)\.(\d+)' + family_replacement: 'MiuiBrowser' + + # Mint Browser should got before Mobile Chrome for Android + - regex: '(Mint Browser)/(\d+)\.(\d+)\.(\d+)' + family_replacement: 'Mint Browser' + + # Google Search App on Android, eg: + - regex: 'Mozilla.+Android.+(GSA)/(\d+)\.(\d+)\.(\d+)' + family_replacement: 'Google' # Chrome Mobile + - regex: 'Version/.+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)' + family_replacement: 'Chrome Mobile WebView' + - regex: '; wv\).+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)' + family_replacement: 'Chrome Mobile WebView' - regex: '(CrMo)/(\d+)\.(\d+)\.(\d+)\.(\d+)' family_replacement: 'Chrome Mobile' - regex: '(CriOS)/(\d+)\.(\d+)\.(\d+)\.(\d+)' family_replacement: 'Chrome Mobile iOS' - - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile' + - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile(?:[ /]|$)' + family_replacement: 'Chrome Mobile' + - regex: ' Mobile .*(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)' family_replacement: 'Chrome Mobile' # Chrome Frame must come before MSIE. - regex: '(chromeframe)/(\d+)\.(\d+)\.(\d+)' family_replacement: 'Chrome Frame' - # UC Browser - - regex: '(UCBrowser)[ /](\d+)\.(\d+)\.(\d+)' - family_replacement: 'UC Browser' - - regex: '(UC Browser)[ /](\d+)\.(\d+)\.(\d+)' - - regex: '(UC Browser|UCBrowser|UCWEB)(\d+)\.(\d+)\.(\d+)' - family_replacement: 'UC Browser' - # Tizen Browser (second case included in browser/major.minor regex) - regex: '(SLP Browser)/(\d+)\.(\d+)' family_replacement: 'Tizen Browser' @@ -218,18 +377,12 @@ user_agent_parsers: - regex: '(SE 2\.X) MetaSr (\d+)\.(\d+)' family_replacement: 'Sogou Explorer' - # Baidu Browsers (desktop spoofs chrome & IE, explorer is mobile) - - regex: '(baidubrowser)[/\s](\d+)' - family_replacement: 'Baidu Browser' - - regex: '(FlyFlow)/(\d+)\.(\d+)' - family_replacement: 'Baidu Explorer' - # QQ Browsers - - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?' + - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)' family_replacement: 'QQ Browser Mini' - - regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?' + - regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)' family_replacement: 'QQ Browser Mobile' - - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+))?)?)?' + - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+)|)|)|)' family_replacement: 'QQ Browser' # Rackspace Monitoring @@ -250,20 +403,48 @@ user_agent_parsers: # AOL Browser (IE-based) - regex: '(AOL) (\d+)\.(\d+); AOLBuild (\d+)' + # Podcast catcher Applications using iTunes + - regex: '(PodCruncher|Downcast)[ /]?(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)' + + # Box Notes https://www.box.com/resources/downloads + # Must be before Electron + - regex: ' (BoxNotes)/(\d+)\.(\d+)\.(\d+)' + + # Whale + - regex: '(Whale)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile(?:[ /]|$)' + family_replacement: 'Whale' + + - regex: '(Whale)/(\d+)\.(\d+)\.(\d+)' + family_replacement: 'Whale' + + # Ghost + # @ref: http://www.ghost.org + - regex: '(Ghost)/(\d+)\.(\d+)\.(\d+)' + #### END SPECIAL CASES TOP #### #### MAIN CASES - this catches > 50% of all browsers #### + + # Slack desktop client (needs to be before Apple Mail, Electron, and Chrome as it gets wrongly detected on Mac OS otherwise) + - regex: '(Slack_SSB)/(\d+)\.(\d+)\.(\d+)' + family_replacement: 'Slack Desktop Client' + + # HipChat provides a version on Mac, but not on Windows. + # Needs to be before Chrome on Windows, and AppleMail on Mac. + - regex: '(HipChat)/?(\d+|)' + family_replacement: 'HipChat Desktop Client' + # Browser/major_version.minor_version.beta_version - - regex: '(AdobeAIR|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Epiphany|Shiira|Sunrise|Flock|Netscape|Lunascape|WebPilot|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\.Browser|Bunjalloo|Google Earth|Raven for Mac|Openwave)/(\d+)\.(\d+)\.(\d+)' + - regex: '\b(MobileIron|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Epiphany|Shiira|Sunrise|Spotify|Flock|Netscape|Lunascape|WebPilot|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\.Browser|Bunjalloo|Google Earth|Raven for Mac|Openwave|MacOutlook|Electron|OktaMobile)/(\d+)\.(\d+)\.(\d+)' # Outlook 2007 - - regex: 'MSOffice 12' + - regex: 'Microsoft Office Outlook 12\.\d+\.\d+|MSOffice 12' family_replacement: 'Outlook' v1_replacement: '2007' # Outlook 2010 - - regex: 'MSOffice 14' + - regex: 'Microsoft Outlook 14\.\d+\.\d+|MSOffice 14' family_replacement: 'Outlook' v1_replacement: '2010' @@ -272,31 +453,72 @@ user_agent_parsers: family_replacement: 'Outlook' v1_replacement: '2013' + # Outlook 2016 + - regex: 'Microsoft Outlook (?:Mail )?16\.\d+\.\d+' + family_replacement: 'Outlook' + v1_replacement: '2016' + + # Word 2014 + - regex: 'Microsoft Office (Word) 2014' + + # Windows Live Mail + - regex: 'Outlook-Express\/7\.0.*' + family_replacement: 'Windows Live Mail' + # Apple Air Mail - - regex: '(Airmail) (\d+)\.(\d+)(?:\.(\d+))?' + - regex: '(Airmail) (\d+)\.(\d+)(?:\.(\d+)|)' # Thunderbird - - regex: '(Thunderbird)/(\d+)\.(\d+)\.(\d+(?:pre)?)' + - regex: '(Thunderbird)/(\d+)\.(\d+)(?:\.(\d+(?:pre|))|)' family_replacement: 'Thunderbird' + # Postbox + - regex: '(Postbox)/(\d+)\.(\d+)\.(\d+)' + family_replacement: 'Postbox' + + # Barca + - regex: '(Barca(?:Pro)?)/(\d+)\.(\d+)(?:\.(\d+)|)' + family_replacement: 'Barca' + + # Lotus Notes + - regex: '(Lotus-Notes)/(\d+)\.(\d+)(?:\.(\d+)|)' + family_replacement: 'Lotus Notes' + # Vivaldi uses "Vivaldi" - regex: '(Vivaldi)/(\d+)\.(\d+)\.(\d+)' # Edge/major_version.minor_version - - regex: '(Edge)/(\d+)\.(\d+)' + # Edge with chromium Edg/major_version.minor_version.patch.minor_patch + - regex: '(Edge?)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)' + family_replacement: 'Edge' + + # Brave Browser https://brave.com/ + - regex: '(brave)/(\d+)\.(\d+)\.(\d+) Chrome' + family_replacement: 'Brave' - # Chrome/Chromium/major_version.minor_version.beta_version - - regex: '(Chromium|Chrome)/(\d+)\.(\d+)\.(\d+)' + # Iron Browser ~since version 50 + - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]* Iron[^/]' + family_replacement: 'Iron' # Dolphin Browser # @ref: http://www.dolphin.com - - regex: '\b(Dolphin)(?: |HDCN/|/INT\-)(\d+)\.(\d+)\.?(\d+)?' + - regex: '\b(Dolphin)(?: |HDCN/|/INT\-)(\d+)\.(\d+)(?:\.(\d+)|)' + + # Headless Chrome + # https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md + - regex: '(HeadlessChrome)(?:/(\d+)\.(\d+)\.(\d+)|)' + + # Evolution Mail CardDav/CalDav integration + - regex: '(Evolution)/(\d+)\.(\d+)\.(\d+\.\d+)' + + # Roundcube Mail CardDav plugin + - regex: '(RCM CardDAV plugin)/(\d+)\.(\d+)\.(\d+(?:-dev|))' # Browser/major_version.minor_version - - regex: '(bingbot|Bolt|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|iTunes|MacAppStore|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser|mDolphin)/(\d+)\.(\d+)\.?(\d+)?' + - regex: '(bingbot|Bolt|AdobeAIR|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|iTunes|MacAppStore|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser|mDolphin|qutebrowser|Otter|QupZilla|MailBar|kmail2|YahooMobileMail|ExchangeWebServices|ExchangeServicesClient|Dragon|Outlook-iOS-Android)/(\d+)\.(\d+)(?:\.(\d+)|)' # Chrome/Chromium/major_version.minor_version - - regex: '(Chromium|Chrome)/(\d+)\.(\d+)' + - regex: '(Chromium|Chrome)/(\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)' ########## # IE Mobile needs to happen before Android to catch cases such as: @@ -310,10 +532,61 @@ user_agent_parsers: - regex: '(IEMobile)[ /](\d+)\.(\d+)' family_replacement: 'IE Mobile' + # Baca Berita App News Reader + - regex: '(BacaBerita App)\/(\d+)\.(\d+)\.(\d+)' + + # Podcast catchers + - regex: '^(bPod|Pocket Casts|Player FM)$' + - regex: '^(AlexaMediaPlayer|VLC)/(\d+)\.(\d+)\.([^.\s]+)' + - regex: '^(AntennaPod|WMPlayer|Zune|Podkicker|Radio|ExoPlayerDemo|Overcast|PocketTunes|NSPlayer|okhttp|DoggCatcher|QuickNews|QuickTime|Peapod|Podcasts|GoldenPod|VLC|Spotify|Miro|MediaGo|Juice|iPodder|gPodder|Banshee)/(\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)' + - regex: '^(Peapod|Liferea)/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)' + - regex: '^(bPod|Player FM) BMID/(\S+)' + - regex: '^(Podcast ?Addict)/v(\d+) ' + - regex: '^(Podcast ?Addict) ' + family_replacement: 'PodcastAddict' + - regex: '(Replay) AV' + - regex: '(VOX) Music Player' + - regex: '(CITA) RSS Aggregator/(\d+)\.(\d+)' + - regex: '(Pocket Casts)$' + - regex: '(Player FM)$' + - regex: '(LG Player|Doppler|FancyMusic|MediaMonkey|Clementine) (\d+)\.(\d+)\.?([^.\s]+|)\.?([^.\s]+|)' + - regex: '(philpodder)/(\d+)\.(\d+)\.?([^.\s]+|)\.?([^.\s]+|)' + - regex: '(Player FM|Pocket Casts|DoggCatcher|Spotify|MediaMonkey|MediaGo|BashPodder)' + - regex: '(QuickTime)\.(\d+)\.(\d+)\.(\d+)' + - regex: '(Kinoma)(\d+)' + - regex: '(Fancy) Cloud Music (\d+)\.(\d+)' + family_replacement: 'FancyMusic' + - regex: 'EspnDownloadManager' + family_replacement: 'ESPN' + - regex: '(ESPN) Radio (\d+)\.(\d+)(?:\.(\d+)|) ?(?:rv:(\d+)|) ' + - regex: '(podracer|jPodder) v ?(\d+)\.(\d+)(?:\.(\d+)|)' + - regex: '(ZDM)/(\d+)\.(\d+)[; ]?' + - regex: '(Zune|BeyondPod) (\d+)(?:\.(\d+)|)[\);]' + - regex: '(WMPlayer)/(\d+)\.(\d+)\.(\d+)\.(\d+)' + - regex: '^(Lavf)' + family_replacement: 'WMPlayer' + - regex: '^(RSSRadio)[ /]?(\d+|)' + - regex: '(RSS_Radio) (\d+)\.(\d+)' + family_replacement: 'RSSRadio' + - regex: '(Podkicker) \S+/(\d+)\.(\d+)\.(\d+)' + family_replacement: 'Podkicker' + - regex: '^(HTC) Streaming Player \S+ / \S+ / \S+ / (\d+)\.(\d+)(?:\.(\d+)|)' + - regex: '^(Stitcher)/iOS' + - regex: '^(Stitcher)/Android' + - regex: '^(VLC) .*version (\d+)\.(\d+)\.(\d+)' + - regex: ' (VLC) for' + - regex: '(vlc)/(\d+)\.(\d+)\.(\d+)' + family_replacement: 'VLC' + - regex: '^(foobar)\S+/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)' + - regex: '^(Clementine)\S+ ([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)' + - regex: '(amarok)/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)' + family_replacement: 'Amarok' + - regex: '(Custom)-Feed Reader' + # Browser major_version.minor_version.beta_version (space instead of slash) - regex: '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\d+)\.(\d+)\.(\d+)' # Browser major_version.minor_version (space instead of slash) - - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris) (\d+)\.(\d+)\.?(\d+)?' + - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\d+)\.(\d+)(?:\.(\d+)|)' # Kindle WebKit - regex: '(Kindle)/(\d+)\.(\d+)' @@ -343,12 +616,26 @@ user_agent_parsers: - regex: '(MSIE) (\d+)\.(\d+).*XBLWP7' family_replacement: 'IE Large Screen' + # Nextcloud desktop sync client + - regex: '(Nextcloud)' + + # Generic mirall client + - regex: '(mirall)/(\d+)\.(\d+)\.(\d+)' + + # Nextcloud/Owncloud android client + - regex: '(ownCloud-android)/(\d+)\.(\d+)\.(\d+)' + family_replacement: 'Owncloud' + + # Skype for Business + - regex: '(OC)/(\d+)\.(\d+)\.(\d+)\.(\d+) \(Skype for Business\)' + family_replacement: 'Skype' + #### END MAIN CASES #### #### SPECIAL CASES #### - regex: '(Obigo)InternetBrowser' - regex: '(Obigo)\-Browser' - - regex: '(Obigo|OBIGO)[^\d]*(\d+)(?:.(\d+))?' + - regex: '(Obigo|OBIGO)[^\d]*(\d+)(?:.(\d+)|)' family_replacement: 'Obigo' - regex: '(MAXTHON|Maxthon) (\d+)\.(\d+)' @@ -367,26 +654,33 @@ user_agent_parsers: - regex: '(Embider)/(\d+)\.(\d+)' family_replacement: 'Polaris' - - regex: '(BonEcho)/(\d+)\.(\d+)\.?([ab]?\d+)?' + - regex: '(BonEcho)/(\d+)\.(\d+)\.?([ab]?\d+|)' family_replacement: 'Bon Echo' # @note: iOS / OSX Applications - - regex: '(iPod).+Version/(\d+)\.(\d+)\.(\d+)' - family_replacement: 'Mobile Safari' - - regex: '(iPod).*Version/(\d+)\.(\d+)' - family_replacement: 'Mobile Safari' - - regex: '(iPhone).*Version/(\d+)\.(\d+)\.(\d+)' - family_replacement: 'Mobile Safari' - - regex: '(iPhone).*Version/(\d+)\.(\d+)' + - regex: '(iPod|iPhone|iPad).+GSA/(\d+)\.(\d+)\.(\d+) Mobile' + family_replacement: 'Google' + - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|).*[ +]Safari' family_replacement: 'Mobile Safari' - - regex: '(iPad).*Version/(\d+)\.(\d+)\.(\d+)' + - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).* AppleNews\/\d+\.\d+\.\d+?' + family_replacement: 'Mobile Safari UI/WKWebView' + - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|)' + family_replacement: 'Mobile Safari UI/WKWebView' + - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).*Mobile.*[ +]Safari' family_replacement: 'Mobile Safari' - - regex: '(iPad).*Version/(\d+)\.(\d+)' - family_replacement: 'Mobile Safari' - - regex: '(iPod|iPhone|iPad);.*CPU.*OS (\d+)_(\d+)(?:_(\d+))?.*Mobile' + - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).*Mobile' + family_replacement: 'Mobile Safari UI/WKWebView' + - regex: '(iPod|iPhone|iPad).* Safari' family_replacement: 'Mobile Safari' - regex: '(iPod|iPhone|iPad)' - family_replacement: 'Mobile Safari' + family_replacement: 'Mobile Safari UI/WKWebView' + - regex: '(Watch)(\d+),(\d+)' + family_replacement: 'Apple $1 App' + + ########################## + # Outlook on iOS >= 2.62.0 + ########################## + - regex: '(Outlook-iOS)/\d+\.\d+\.prod\.iphone \((\d+)\.(\d+)\.(\d+)\)' - regex: '(AvantGo) (\d+).(\d+)' @@ -427,11 +721,9 @@ user_agent_parsers: - regex: '(Nokia)[EN]?(\d+)' # BlackBerry devices - - regex: '(BB10);' - family_replacement: 'BlackBerry WebKit' - regex: '(PlayBook).+RIM Tablet OS (\d+)\.(\d+)\.(\d+)' family_replacement: 'BlackBerry WebKit' - - regex: '(Black[bB]erry).+Version/(\d+)\.(\d+)\.(\d+)' + - regex: '(Black[bB]erry|BB10).+Version/(\d+)\.(\d+)\.(\d+)' family_replacement: 'BlackBerry WebKit' - regex: '(Black[bB]erry)\s?(\d+)' family_replacement: 'BlackBerry' @@ -451,18 +743,18 @@ user_agent_parsers: - regex: '(QtWeb) Internet Browser/(\d+)\.(\d+)' - #- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+))?.*Safari/' + #- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/' # family_replacement: 'iPad' # Phantomjs, should go before Safari - regex: '(PhantomJS)/(\d+)\.(\d+)\.(\d+)' # WebKit Nightly - - regex: '(AppleWebKit)/(\d+)\.?(\d+)?\+ .* Safari' + - regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .* Safari' family_replacement: 'WebKit Nightly' # Safari - - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+))?.*Safari/' + - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/' family_replacement: 'Safari' # Safari didn't provide "Version/d.d.d" prior to 3.0 - regex: '(Safari)/\d+' @@ -480,23 +772,36 @@ user_agent_parsers: - regex: '(Phantom)/V(\d+)\.(\d+)' family_replacement: 'Phantom Browser' - - regex: 'Trident(.*)rv.(\d+)\.(\d+)' + - regex: '(Trident)/(7|8)\.(0)' family_replacement: 'IE' + v1_replacement: '11' + + - regex: '(Trident)/(6)\.(0)' + family_replacement: 'IE' + v1_replacement: '10' + + - regex: '(Trident)/(5)\.(0)' + family_replacement: 'IE' + v1_replacement: '9' + + - regex: '(Trident)/(4)\.(0)' + family_replacement: 'IE' + v1_replacement: '8' # Espial - - regex: '(Espial)/(\d+)(?:\.(\d+))?(?:\.(\d+))?' + - regex: '(Espial)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)' # Apple Mail # apple mail - not directly detectable, have it after Safari stuff - regex: '(AppleWebKit)/(\d+)\.(\d+)\.(\d+)' - family_replacement: 'AppleMail' + family_replacement: 'Apple Mail' # AFTER THE EDGE CASES ABOVE! # AFTER IE11 # BEFORE all other IE - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)' - - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*)?' + - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*|)' - regex: '([MS]?IE) (\d+)\.(\d+)' family_replacement: 'IE' @@ -504,7 +809,30 @@ user_agent_parsers: - regex: '(python-requests)/(\d+)\.(\d+)' family_replacement: 'Python Requests' - - regex: '(Java)[/ ]{0,1}\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+)*' + # headless user-agents + - regex: '\b(Windows-Update-Agent|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)' + + - regex: '(Java)[/ ]{0,1}\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)' + + # Cloud Storage Clients + - regex: '^(Cyberduck)/(\d+)\.(\d+)\.(\d+)(?:\.\d+|)' + - regex: '^(S3 Browser) (\d+)-(\d+)-(\d+)(?:\s*http://s3browser\.com|)' + # rclone - rsync for cloud storage - https://rclone.org/ + - regex: '^(rclone)/v(\d+)\.(\d+)' + + # Roku Digital-Video-Players https://www.roku.com/ + - regex: '^(Roku)/DVP-(\d+)\.(\d+)' + + # Kurio App News Reader https://kurio.co.id/ + - regex: '(Kurio)\/(\d+)\.(\d+)\.(\d+)' + family_replacement: 'Kurio App' + + # Box Drive and Box Sync https://www.box.com/resources/downloads + - regex: '^(Box(?: Sync)?)/(\d+)\.(\d+)\.(\d+)' + + # ViaFree streaming app https://www.viafree.{dk|se|no} + - regex: '^(ViaFree|Viafree)-(?:tvOS-)?[A-Z]{2}/(\d+)\.(\d+)\.(\d+)' + family_replacement: 'ViaFree' os_parsers: ########## @@ -551,11 +879,11 @@ os_parsers: # Philips : not found any other way than a manual mapping # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/4.1.3 PHILIPSTV/1.1.1; en) Presto/2.10.250 Version/11.60 # Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.2.1; en) Presto/2.6.33 Version/10.70 - - regex: 'HbbTV/1.1.1 \(; (Philips);.*NETTV/4' + - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/4' os_v1_replacement: '2013' - - regex: 'HbbTV/1.1.1 \(; (Philips);.*NETTV/3' + - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/3' os_v1_replacement: '2012' - - regex: 'HbbTV/1.1.1 \(; (Philips);.*NETTV/2' + - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/2' os_v1_replacement: '2011' # the HbbTV emulator developers use HbbTV/1.1.1 (;;;;;) firetv-firefox-plugin 1.1.20 @@ -575,11 +903,15 @@ os_parsers: - regex: '(Windows Phone) (?:OS[ /])?(\d+)\.(\d+)' + # Again a MS-special one: iPhone.*Outlook-iOS-Android/x.x is erroneously detected as Android + - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|).*Outlook-iOS-Android' + os_replacement: 'iOS' + ########## # Android # can actually detect rooted android os. do we care? ########## - - regex: '(Android)[ \-/](\d+)\.(\d+)(?:[.\-]([a-z0-9]+))?' + - regex: '(Android)[ \-/](\d+)(?:\.(\d+)|)(?:[.\-]([a-z0-9]+)|)' - regex: '(Android) Donut' os_v1_replacement: '1' @@ -601,14 +933,18 @@ os_parsers: os_v1_replacement: '3' # UCWEB - - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+))?;' + - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+)|);' os_replacement: 'Android' - - regex: '^UCWEB.*; (iPad OS|iPh OS) (\d+)_(\d+)(?:_(\d+))?;' + - regex: '^UCWEB.*; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);' os_replacement: 'iOS' - - regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+))?;' + - regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+)|);' os_replacement: 'Windows Phone' # JUC - - regex: '^(JUC).*; ?U; ?(?:Android)?(\d+)\.(\d+)(?:[\.\-]([a-z0-9]+))?' + - regex: '^(JUC).*; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]+)|)' + os_replacement: 'Android' + + # Salesforce + - regex: '(android)\s(?:mobile\/)(\d+)(?:\.(\d+)(?:\.(\d+)|)|)' os_replacement: 'Android' ########## @@ -617,6 +953,14 @@ os_parsers: - regex: '(Silk-Accelerated=[a-z]{4,5})' os_replacement: 'Android' + # Citrix Chrome App on Chrome OS + # Note, this needs to come before the windows parsers as the app doesn't + # properly identify as Chrome OS + # + # ex: Mozilla/5.0 (X11; Windows aarch64 10718.88.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.118 Safari/537.36 CitrixChromeApp + - regex: '(x86_64|aarch64)\ (\d+)\.(\d+)\.(\d+).*Chrome.*(?:CitrixChromeApp)$' + os_replacement: 'Chrome OS' + ########## # Windows # http://en.wikipedia.org/wiki/Windows_NT#Releases @@ -635,66 +979,99 @@ os_parsers: - regex: '(Windows ?Mobile)' os_replacement: 'Windows Mobile' + - regex: '(Windows 10)' + os_replacement: 'Windows' + os_v1_replacement: '10' + - regex: '(Windows (?:NT 5\.2|NT 5\.1))' - os_replacement: 'Windows XP' + os_replacement: 'Windows' + os_v1_replacement: 'XP' - regex: '(Windows NT 6\.1)' - os_replacement: 'Windows 7' + os_replacement: 'Windows' + os_v1_replacement: '7' - regex: '(Windows NT 6\.0)' - os_replacement: 'Windows Vista' + os_replacement: 'Windows' + os_v1_replacement: 'Vista' - regex: '(Win 9x 4\.90)' - os_replacement: 'Windows ME' - - - regex: '(Windows 98|Windows XP|Windows ME|Windows 95|Windows CE|Windows 7|Windows NT 4\.0|Windows Vista|Windows 2000|Windows 3.1)' + os_replacement: 'Windows' + os_v1_replacement: 'ME' - regex: '(Windows NT 6\.2; ARM;)' - os_replacement: 'Windows RT' + os_replacement: 'Windows' + os_v1_replacement: 'RT' + - regex: '(Windows NT 6\.2)' - os_replacement: 'Windows 8' + os_replacement: 'Windows' + os_v1_replacement: '8' - regex: '(Windows NT 6\.3; ARM;)' - os_replacement: 'Windows RT 8.1' + os_replacement: 'Windows' + os_v1_replacement: 'RT 8' + os_v2_replacement: '1' + - regex: '(Windows NT 6\.3)' - os_replacement: 'Windows 8.1' + os_replacement: 'Windows' + os_v1_replacement: '8' + os_v2_replacement: '1' - regex: '(Windows NT 6\.4)' - os_replacement: 'Windows 10' + os_replacement: 'Windows' + os_v1_replacement: '10' + - regex: '(Windows NT 10\.0)' - os_replacement: 'Windows 10' + os_replacement: 'Windows' + os_v1_replacement: '10' - regex: '(Windows NT 5\.0)' - os_replacement: 'Windows 2000' + os_replacement: 'Windows' + os_v1_replacement: '2000' - regex: '(WinNT4.0)' - os_replacement: 'Windows NT 4.0' + os_replacement: 'Windows' + os_v1_replacement: 'NT 4.0' - regex: '(Windows ?CE)' - os_replacement: 'Windows CE' + os_replacement: 'Windows' + os_v1_replacement: 'CE' - - regex: 'Win ?(95|98|3.1|NT|ME|2000)' - os_replacement: 'Windows $1' + - regex: 'Win(?:dows)? ?(95|98|3.1|NT|ME|2000|XP|Vista|7|CE)' + os_replacement: 'Windows' + os_v1_replacement: '$1' - regex: 'Win16' - os_replacement: 'Windows 3.1' + os_replacement: 'Windows' + os_v1_replacement: '3.1' - regex: 'Win32' - os_replacement: 'Windows 95' + os_replacement: 'Windows' + os_v1_replacement: '95' + + # Box apps (Drive, Sync, Notes) on Windows https://www.box.com/resources/downloads + - regex: '^Box.*Windows/([\d.]+);' + os_replacement: 'Windows' + os_v1_replacement: '$1' ########## # Tizen OS from Samsung # spoofs Android so pushing it above ########## - - regex: '(Tizen)/(\d+)\.(\d+)' + - regex: '(Tizen)[/ ](\d+)\.(\d+)' ########## # Mac OS # @ref: http://en.wikipedia.org/wiki/Mac_OS_X#Versions # @ref: http://www.puredarwin.org/curious/versions ########## - - regex: '((?:Mac ?|; )OS X)[\s/](?:(\d+)[_.](\d+)(?:[_.](\d+))?|Mach-O)' + - regex: '((?:Mac[ +]?|; )OS[ +]X)[\s+/](?:(\d+)[_.](\d+)(?:[_.](\d+)|)|Mach-O)' + os_replacement: 'Mac OS X' + - regex: '\w+\s+Mac OS X\s+\w+\s+(\d+).(\d+).(\d+).*' os_replacement: 'Mac OS X' + os_v1_replacement: '$1' + os_v2_replacement: '$2' + os_v3_replacement: '$3' # Leopard - regex: ' (Dar)(win)/(9).(\d+).*\((?:i386|x86_64|Power Macintosh)\)' os_replacement: 'Mac OS X' @@ -732,15 +1109,19 @@ os_parsers: # ios devices spoof (mac os x), so including intel/ppc prefixes - regex: '(?:PPC|Intel) (Mac OS X)' + # Box Drive and Box Sync on Mac OS X use OSX version numbers, not Darwin + - regex: '^Box.*;(Darwin)/(10)\.(1\d)(?:\.(\d+)|)' + os_replacement: 'Mac OS X' + ########## # iOS # http://en.wikipedia.org/wiki/IOS_version_history ########## # keep this above generic iOS, since AppleTV UAs contain 'CPU OS' - - regex: '(Apple\s?TV)(?:/(\d+)\.(\d+))?' + - regex: '(Apple\s?TV)(?:/(\d+)\.(\d+)|)' os_replacement: 'ATV OS X' - - regex: '(CPU OS|iPhone OS|CPU iPhone) +(\d+)[_\.](\d+)(?:[_\.](\d+))?' + - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|)' os_replacement: 'iOS' # remaining cases are mostly only opera uas, so catch opera as to not catch iphone spoofs @@ -787,8 +1168,54 @@ os_parsers: os_replacement: 'Mac OS X' os_v1_replacement: '10' os_v2_replacement: '10' + - regex: '(CF)(Network)/(760)\.(\d)' + os_replacement: 'Mac OS X' + os_v1_replacement: '10' + os_v2_replacement: '11' + - regex: 'CFNetwork/7.* Darwin/15\.4\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '9' + os_v2_replacement: '3' + os_v3_replacement: '1' + - regex: 'CFNetwork/7.* Darwin/15\.5\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '9' + os_v2_replacement: '3' + os_v3_replacement: '2' + - regex: 'CFNetwork/7.* Darwin/15\.6\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '9' + os_v2_replacement: '3' + os_v3_replacement: '5' + - regex: '(CF)(Network)/758\.(\d)' + os_replacement: 'iOS' + os_v1_replacement: '9' + - regex: 'CFNetwork/808\.3 Darwin/16\.3\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '10' + os_v2_replacement: '2' + os_v3_replacement: '1' + - regex: '(CF)(Network)/808\.(\d)' + os_replacement: 'iOS' + os_v1_replacement: '10' ########## + # CFNetwork macOS Apps (must be before CFNetwork iOS Apps + # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history + ########## + - regex: 'CFNetwork/.* Darwin/17\.\d+.*\(x86_64\)' + os_replacement: 'Mac OS X' + os_v1_replacement: '10' + os_v2_replacement: '13' + - regex: 'CFNetwork/.* Darwin/16\.\d+.*\(x86_64\)' + os_replacement: 'Mac OS X' + os_v1_replacement: '10' + os_v2_replacement: '12' + - regex: 'CFNetwork/8.* Darwin/15\.\d+.*\(x86_64\)' + os_replacement: 'Mac OS X' + os_v1_replacement: '10' + os_v2_replacement: '11' + ########## # CFNetwork iOS Apps # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history ########## @@ -811,9 +1238,97 @@ os_parsers: os_replacement: 'iOS' os_v1_replacement: '8' os_v2_replacement: '0' + - regex: 'CFNetwork/7.* Darwin/(15)\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '9' + os_v2_replacement: '0' + - regex: 'CFNetwork/8.* Darwin/16\.5\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '10' + os_v2_replacement: '3' + - regex: 'CFNetwork/8.* Darwin/16\.6\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '10' + os_v2_replacement: '3' + os_v3_replacement: '2' + - regex: 'CFNetwork/8.* Darwin/16\.7\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '10' + os_v2_replacement: '3' + os_v3_replacement: '3' + - regex: 'CFNetwork/8.* Darwin/(16)\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '10' + - regex: 'CFNetwork/8.* Darwin/17\.0\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '11' + os_v2_replacement: '0' + - regex: 'CFNetwork/8.* Darwin/17\.2\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '11' + os_v2_replacement: '1' + - regex: 'CFNetwork/8.* Darwin/17\.3\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '11' + os_v2_replacement: '2' + - regex: 'CFNetwork/8.* Darwin/17\.4\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '11' + os_v2_replacement: '2' + os_v3_replacement: '6' + - regex: 'CFNetwork/8.* Darwin/17\.5\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '11' + os_v2_replacement: '3' + - regex: 'CFNetwork/9.* Darwin/17\.6\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '11' + os_v2_replacement: '4' + - regex: 'CFNetwork/9.* Darwin/17\.7\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '11' + os_v2_replacement: '4' + os_v3_replacement: '1' + - regex: 'CFNetwork/8.* Darwin/(17)\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '11' + - regex: 'CFNetwork/9.* Darwin/18\.0\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '12' + os_v2_replacement: '0' + - regex: 'CFNetwork/9.* Darwin/(18)\.\d+' + os_replacement: 'iOS' + os_v1_replacement: '12' + - regex: 'CFNetwork/.* Darwin/' + os_replacement: 'iOS' + # iOS Apps - - regex: '\b(iOS[ /]|iPhone(?:/| v|[ _]OS[/,]|; | OS : |\d,\d/|\d,\d; )|iPad/)(\d{1,2})[_\.](\d{1,2})(?:[_\.](\d+))?' + - regex: '\b(iOS[ /]|iOS; |iPhone(?:/| v|[ _]OS[/,]|; | OS : |\d,\d/|\d,\d; )|iPad/)(\d{1,2})[_\.](\d{1,2})(?:[_\.](\d+)|)' os_replacement: 'iOS' + - regex: '\((iOS);' + + ########## + # Apple Watch + ########## + - regex: '(watchOS)/(\d+)\.(\d+)(?:\.(\d+)|)' + os_replacement: 'WatchOS' + + ########################## + # Outlook on iOS >= 2.62.0 + ########################## + - regex: 'Outlook-(iOS)/\d+\.\d+\.prod\.iphone' + + ########################## + # iOS devices, the same regex matches mobile safari webviews + ########################## + - regex: '(iPod|iPhone|iPad)' + os_replacement: 'iOS' + + ########## + # Apple TV + ########## + - regex: '(tvOS)[/ ](\d+)\.(\d+)(?:\.(\d+)|)' + os_replacement: 'tvOS' ########## # Chrome OS @@ -821,7 +1336,7 @@ os_parsers: # http://code.google.com/p/chromium-os/issues/detail?id=11573 # http://code.google.com/p/chromium-os/issues/detail?id=13790 ########## - - regex: '(CrOS) [a-z0-9_]+ (\d+)\.(\d+)(?:\.(\d+))?' + - regex: '(CrOS) [a-z0-9_]+ (\d+)\.(\d+)(?:\.(\d+)|)' os_replacement: 'Chrome OS' ########## @@ -829,8 +1344,8 @@ os_parsers: ########## - regex: '([Dd]ebian)' os_replacement: 'Debian' - - regex: '(Linux Mint)(?:/(\d+))?' - - regex: '(Mandriva)(?: Linux)?/(?:[\d.-]+m[a-z]{2}(\d+).(\d))?' + - regex: '(Linux Mint)(?:/(\d+)|)' + - regex: '(Mandriva)(?: Linux|)/(?:[\d.-]+m[a-z]{2}(\d+).(\d)|)' ########## # Symbian + Symbian OS @@ -859,9 +1374,9 @@ os_parsers: ########## - regex: '(BB10);.+Version/(\d+)\.(\d+)\.(\d+)' os_replacement: 'BlackBerry OS' - - regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?' + - regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)' os_replacement: 'BlackBerry OS' - - regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?' + - regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)' os_replacement: 'BlackBerry OS' - regex: '(RIM Tablet OS) (\d+)\.(\d+)\.(\d+)' os_replacement: 'BlackBerry Tablet OS' @@ -873,9 +1388,47 @@ os_parsers: ########## # Firefox OS ########## + - regex: '\((?:Mobile|Tablet);.+Gecko/18.0 Firefox/\d+\.\d+' + os_replacement: 'Firefox OS' + os_v1_replacement: '1' + os_v2_replacement: '0' + os_v3_replacement: '1' + + - regex: '\((?:Mobile|Tablet);.+Gecko/18.1 Firefox/\d+\.\d+' + os_replacement: 'Firefox OS' + os_v1_replacement: '1' + os_v2_replacement: '1' + + - regex: '\((?:Mobile|Tablet);.+Gecko/26.0 Firefox/\d+\.\d+' + os_replacement: 'Firefox OS' + os_v1_replacement: '1' + os_v2_replacement: '2' + + - regex: '\((?:Mobile|Tablet);.+Gecko/28.0 Firefox/\d+\.\d+' + os_replacement: 'Firefox OS' + os_v1_replacement: '1' + os_v2_replacement: '3' + + - regex: '\((?:Mobile|Tablet);.+Gecko/30.0 Firefox/\d+\.\d+' + os_replacement: 'Firefox OS' + os_v1_replacement: '1' + os_v2_replacement: '4' + + - regex: '\((?:Mobile|Tablet);.+Gecko/32.0 Firefox/\d+\.\d+' + os_replacement: 'Firefox OS' + os_v1_replacement: '2' + os_v2_replacement: '0' + + - regex: '\((?:Mobile|Tablet);.+Gecko/34.0 Firefox/\d+\.\d+' + os_replacement: 'Firefox OS' + os_v1_replacement: '2' + os_v2_replacement: '1' + + # Firefox OS Generic - regex: '\((?:Mobile|Tablet);.+Firefox/\d+\.\d+' os_replacement: 'Firefox OS' + ########## # BREW # yes, Brew is lower-cased for Brew MP @@ -890,14 +1443,20 @@ os_parsers: ########## # Google TV ########## - - regex: '(GoogleTV)(?: (\d+)\.(\d+)(?:\.(\d+))?|/[\da-z]+)' + - regex: '(GoogleTV)(?: (\d+)\.(\d+)(?:\.(\d+)|)|/[\da-z]+)' - regex: '(WebTV)/(\d+).(\d+)' + ########## + # Chromecast + ########## + - regex: '(CrKey)(?:[/](\d+)\.(\d+)(?:\.(\d+)|)|)' + os_replacement: 'Chromecast' + ########## # Misc mobile ########## - - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+))?' + - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+)|)' os_replacement: 'webOS' - regex: '(VRE);' @@ -905,22 +1464,32 @@ os_parsers: # Generic patterns # since the majority of os cases are very specific, these go last ########## - - regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)(?:\.(\d+))?)?' + - regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Sailfish|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)' # Gentoo Linux + Kernel Version - - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+))?.*gentoo' + - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).*gentoo' os_replacement: 'Gentoo' # Opera Mini Bada - regex: '\((Bada);' # just os - - regex: '(Windows|Android|WeTab|Maemo)' - - regex: '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Gentoo|Mageia|(?:Free|Open|Net|\b)BSD)' + - regex: '(Windows|Android|WeTab|Maemo|Web0S)' + - regex: '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|(?:Free|Open|Net|\b)BSD)' # Linux + Kernel Version - - regex: '(Linux)(?:[ /](\d+)\.(\d+)(?:\.(\d+))?)?' + - regex: '(Linux)(?:[ /](\d+)\.(\d+)(?:\.(\d+)|)|)' - regex: 'SunOS' os_replacement: 'Solaris' + # Wget/x.x.x (linux-gnu) + - regex: '\(linux-gnu\)' + os_replacement: 'Linux' + - regex: '\(x86_64-redhat-linux-gnu\)' + os_replacement: 'Red Hat' + - regex: '\((freebsd)(\d+)\.(\d+)\)' + os_replacement: 'FreeBSD' + + # Roku Digital-Video-Players https://www.roku.com/ + - regex: '^(Roku)/DVP-(\d+)\.(\d+)' device_parsers: @@ -928,7 +1497,7 @@ device_parsers: # Mobile Spiders # Catch the mobile crawler before checking for iPhones / Androids. ######### - - regex: '(?:(?:iPhone|Windows CE|Android).*(?:(?:Bot|Yeti)-Mobile|YRSpider|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.*iPhone)' + - regex: '(?:(?:iPhone|Windows CE|Windows Phone|Android).*(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.*iPhone)' regex_flag: 'i' device_replacement: 'Spider' brand_replacement: 'Spider' @@ -939,6 +1508,16 @@ device_parsers: brand_replacement: 'Spider' model_replacement: 'Feature Phone' + # PTST / WebPageTest.org crawlers + - regex: ' PTST/\d+(?:\.)?\d+$' + device_replacement: 'Spider' + brand_replacement: 'Spider' + + # Datanyze.com spider + - regex: 'X11; Datanyze; Linux' + device_replacement: 'Spider' + brand_replacement: 'Spider' + ######### # WebBrowser for SmartWatch # @ref: https://play.google.com/store/apps/details?id=se.vaggan.webbrowser&hl=en @@ -955,7 +1534,7 @@ device_parsers: ###################################################################### # Android Application - - regex: 'Android Application[^\-]+ - (Sony) ?(Ericsson)? (.+) \w+ - ' + - regex: 'Android Application[^\-]+ - (Sony) ?(Ericsson|) (.+) \w+ - ' device_replacement: '$1 $2' brand_replacement: '$1$2' model_replacement: '$3' @@ -986,7 +1565,7 @@ device_parsers: # Acer # @ref: http://us.acer.com/ac/en/US/content/group/tablets ######### - - regex: 'Android [34].*; *(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G)?|A701|B1-A71|A1-\d{3}|B1-\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]+) Build' + - regex: 'Android [34].*; *(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G|)|A701|B1-A71|A1-\d{3}|B1-\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]+) Build' device_replacement: '$1' brand_replacement: 'Acer' model_replacement: '$1' @@ -1009,7 +1588,7 @@ device_parsers: # @note: VegaBean and VegaComb (names derived from jellybean, honeycomb) are # custom ROM builds for Vega ######### - - regex: '; *(Advent )?(Vega(?:Bean|Comb)?).* Build' + - regex: '; *(Advent |)(Vega(?:Bean|Comb|)).* Build' device_replacement: '$1$2' brand_replacement: 'Advent' model_replacement: '$2' @@ -1018,7 +1597,7 @@ device_parsers: # Ainol # @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product ######### - - regex: '; *(Ainol )?((?:NOVO|[Nn]ovo)[^;/]+) Build' + - regex: '; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+) Build' device_replacement: '$1$2' brand_replacement: 'Ainol' model_replacement: '$2' @@ -1055,7 +1634,7 @@ device_parsers: device_replacement: 'Alcatel One Touch $2' brand_replacement: 'Alcatel' model_replacement: 'One Touch $2' - - regex: '; *(?:alcatel[ _])?(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+);? Build' + - regex: '; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+);? Build' regex_flag: 'i' device_replacement: 'Alcatel One Touch $1' brand_replacement: 'Alcatel' @@ -1095,7 +1674,7 @@ device_parsers: device_replacement: '$1$2' brand_replacement: 'Allview' model_replacement: '$2' - - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)?(AX1_Shine|AX2_Frenzy) Build' + - regex: '; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy) Build' device_replacement: '$1$2' brand_replacement: 'Allview' model_replacement: '$2' @@ -1155,7 +1734,7 @@ device_parsers: # @ref: http://www.luckystar.com.cn/en/mobiletel.aspx?page=1 # @note: brand owned by luckystar ######### - - regex: '; *(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T)?|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D) Build' + - regex: '; *(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T|)|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D) Build' device_replacement: 'Aoson $1' brand_replacement: 'Aoson' model_replacement: '$1' @@ -1230,7 +1809,7 @@ device_parsers: # Assistant # @ref: http://www.assistant.ua ######### - - regex: '; *(?:ASSISTANT )?(AP)-?([1789]\d{2}[A-Z]{0,2}|80104) Build' + - regex: '; *(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104) Build' device_replacement: 'Assistant $1-$2' brand_replacement: 'Assistant' model_replacement: '$1-$2' @@ -1239,7 +1818,7 @@ device_parsers: # Asus # @ref: http://www.asus.com/uk/Tablets_Mobile/ ######### - - regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013)?|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc) Build' + - regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc) Build' device_replacement: 'Asus $1' brand_replacement: 'Asus' model_replacement: '$1' @@ -1787,7 +2366,7 @@ device_parsers: # Gionee # @ref: http://www.gionee.com/ ######### - - regex: '; *(Gionee)[ _\-]([^;/]+)(?:/[^;/]+)? Build' + - regex: '; *(Gionee)[ _\-]([^;/]+)(?:/[^;/]+|) Build' regex_flag: 'i' device_replacement: '$1 $2' brand_replacement: 'Gionee' @@ -1800,6 +2379,11 @@ device_parsers: device_replacement: 'Gionee $1' brand_replacement: 'Gionee' model_replacement: '$1' + - regex: '\sGIONEE[-\s_](\w*)' + regex_flag: 'i' + device_replacement: 'Gionee $1' + brand_replacement: 'Gionee' + model_replacement: '$1' ######### # GoClever @@ -1822,6 +2406,10 @@ device_parsers: device_replacement: '$1' brand_replacement: 'Google' model_replacement: '$1' + - regex: '; *(Pixel.*) Build' + device_replacement: '$1' + brand_replacement: 'Google' + model_replacement: '$1' ######### # Gigabyte @@ -1942,7 +2530,7 @@ device_parsers: # @ref: http://www.huaweidevice.com # @note: Needs to be before HTC due to Desire HD Build on U8815 ######### - - regex: '; *(HUAWEI |Huawei-)?([UY][^;/]+) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)' + - regex: '; *(HUAWEI |Huawei-|)([UY][^;/]+) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)' device_replacement: '$1$2' brand_replacement: 'Huawei' model_replacement: '$2' @@ -1958,7 +2546,7 @@ device_parsers: device_replacement: '$1$2' brand_replacement: 'Huawei' model_replacement: '$2' - - regex: '; *((?:HUAWEI[ _]?|Huawei[ _])?Ascend[ _])([^;/]+) Build' + - regex: '; *((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]+) Build' device_replacement: '$1$2' brand_replacement: 'Huawei' model_replacement: '$2' @@ -1974,7 +2562,7 @@ device_parsers: device_replacement: '$1' brand_replacement: 'Huawei' model_replacement: '$1' - - regex: '; *([^;]+) Build/Huawei' + - regex: '; *([^;]+) Build/(?:Huawei|HUAWEI)' device_replacement: '$1' brand_replacement: 'Huawei' model_replacement: '$1' @@ -1990,7 +2578,7 @@ device_parsers: device_replacement: 'Huawei Ideos$1' brand_replacement: 'Huawei' model_replacement: 'Ideos$1' - - regex: '; *(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660) Build' + - regex: '; *(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.+?) Build[/ ]' device_replacement: 'Huawei $1' brand_replacement: 'Huawei' model_replacement: '$1' @@ -2002,9 +2590,9 @@ device_parsers: ######### - regex: '; *HTC[ _]([^;]+); Windows Phone' - device_replacement: 'HTC $1 $2' + device_replacement: 'HTC $1' brand_replacement: 'HTC' - model_replacement: '$1 $2' + model_replacement: '$1' # Android HTC with Version Number matcher # ; HTC_0P3Z11/1.12.161.3 Build @@ -2013,33 +2601,33 @@ device_parsers: device_replacement: 'HTC $1' brand_replacement: 'HTC' model_replacement: '$1' - - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+))?(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))' + - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))' device_replacement: 'HTC $1 $2' brand_replacement: 'HTC' model_replacement: '$1 $2' - - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+))?)?(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))' + - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))' device_replacement: 'HTC $1 $2 $3' brand_replacement: 'HTC' model_replacement: '$1 $2 $3' - - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+))?)?)?(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))' + - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))' device_replacement: 'HTC $1 $2 $3 $4' brand_replacement: 'HTC' model_replacement: '$1 $2 $3 $4' # Android HTC without Version Number matcher - - regex: '; *(?:(?:HTC|htc)(?:_blocked)*[ _/])+([^ _/;]+)(?: *Build|[;\)]| - )' + - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: *Build|[;\)]| - )' device_replacement: 'HTC $1' brand_replacement: 'HTC' model_replacement: '$1' - - regex: '; *(?:(?:HTC|htc)(?:_blocked)*[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+))?(?: *Build|[;\)]| - )' + - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+)|)(?: *Build|[;\)]| - )' device_replacement: 'HTC $1 $2' brand_replacement: 'HTC' model_replacement: '$1 $2' - - regex: '; *(?:(?:HTC|htc)(?:_blocked)*[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+))?)?(?: *Build|[;\)]| - )' - device_replacement: 'HTC $1 $2 $3 $4' + - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: *Build|[;\)]| - )' + device_replacement: 'HTC $1 $2 $3' brand_replacement: 'HTC' - model_replacement: '$1 $2 $3 $4' - - regex: '; *(?:(?:HTC|htc)(?:_blocked)*[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+))?)?)?(?: *Build|[;\)]| - )' + model_replacement: '$1 $2 $3' + - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: *Build|[;\)]| - )' device_replacement: 'HTC $1 $2 $3 $4' brand_replacement: 'HTC' model_replacement: '$1 $2 $3 $4' @@ -2050,7 +2638,7 @@ device_parsers: brand_replacement: 'HTC' model_replacement: '$1' # general matcher for anything else - - regex: '(?:[;,] *|^)(?:htccn_chs-)?HTC[ _-]?([^;]+?)(?: *Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)' + - regex: '(?:[;,] *|^)(?:htccn_chs-|)HTC[ _-]?([^;]+?)(?: *Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)' regex_flag: 'i' device_replacement: 'HTC $1' brand_replacement: 'HTC' @@ -2063,9 +2651,9 @@ device_parsers: model_replacement: '$1' - regex: '; *(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.+?)(?:[/;\)]|Build|MIUI|1\.0)' regex_flag: 'i' - device_replacement: 'HTC $1 $2 $3 $4' + device_replacement: 'HTC $1 $2' brand_replacement: 'HTC' - model_replacement: '$1 $2 $3 $4' + model_replacement: '$1 $2' ######### # Hyundai @@ -2089,7 +2677,7 @@ device_parsers: # iBall # @ref: http://www.iball.co.in/Category/Mobiles/22 ######### - - regex: '; *(?:iBall[ _\-])?(Andi)[ _]?(\d[^;/]*) Build' + - regex: '; *(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*) Build' regex_flag: 'i' device_replacement: '$1 $2' brand_replacement: 'iBall' @@ -2104,7 +2692,7 @@ device_parsers: # IconBIT # @ref: http://www.iconbit.com/catalog/tablets/ ######### - - regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+)? Build' + - regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+|) Build' device_replacement: '$1' brand_replacement: 'IconBIT' model_replacement: '$1' @@ -2177,17 +2765,17 @@ device_parsers: # @note: Zync also offers a "Cloud Z5" device ######### # smartphones - - regex: '; *(?:Intex[ _])?(AQUA|Aqua)([ _\.\-])([^;/]+) *(?:Build|;)' + - regex: '; *(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]+) *(?:Build|;)' device_replacement: '$1$2$3' brand_replacement: 'Intex' model_replacement: '$1 $3' # matches "INTEX CLOUD X1" - - regex: '; *(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+))? *(?:Build|;)' + - regex: '; *(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|) *(?:Build|;)' device_replacement: '$1 $2' brand_replacement: 'Intex' model_replacement: '$1 $2' # tablets - - regex: '; *([iI]Buddy)[ _]?(Connect)(?:_|\?_| )?([^;/]*) *(?:Build|;)' + - regex: '; *([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]*) *(?:Build|;)' device_replacement: '$1 $2 $3' brand_replacement: 'Intex' model_replacement: 'iBuddy $2 $3' @@ -2210,7 +2798,7 @@ device_parsers: # i.onik # @ref: http://www.i-onik.de/ ######### - - regex: '; *(TP\d+(?:\.\d+)?\-\d[^;/]+) Build' + - regex: '; *(TP\d+(?:\.\d+|)\-\d[^;/]+) Build' device_replacement: 'ionik $1' brand_replacement: 'ionik' model_replacement: '$1' @@ -2426,7 +3014,7 @@ device_parsers: # Lava # @ref: http://www.lavamobiles.com/ ######### - - regex: '; *(?:LAVA[ _])?IRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)' + - regex: '; *(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)' regex_flag: 'i' device_replacement: 'Iris $1' brand_replacement: 'Lava' @@ -2478,15 +3066,15 @@ device_parsers: device_replacement: 'Lenovo $1 $2' brand_replacement: 'Lenovo' model_replacement: '$1 $2' - - regex: '; *(?:LNV-)?(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])+(.+?)(?:Build|[;/\)])' + - regex: '; *(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.+?)(?:Build|[;/\)])' device_replacement: 'Lenovo $1' brand_replacement: 'Lenovo' model_replacement: '$1' - - regex: '[;,] (?:Vodafone )?(SmartTab) ?(II) ?(\d+) Build/' + - regex: '[;,] (?:Vodafone |)(SmartTab) ?(II) ?(\d+) Build/' device_replacement: 'Lenovo $1 $2 $3' brand_replacement: 'Lenovo' model_replacement: '$1 $2 $3' - - regex: '; *(?:Ideapad )?K1 Build/' + - regex: '; *(?:Ideapad |)K1 Build/' device_replacement: 'Lenovo Ideapad K1' brand_replacement: 'Lenovo' model_replacement: 'Ideapad K1' @@ -2512,11 +3100,11 @@ device_parsers: # LG # @ref: http://www.lg.com/uk/mobile ######### - - regex: '; *(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]+|Nexus [45]|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) *(?:Build|;)' + - regex: '; *(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]+|Nexus 4|Nexus 5X?|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) *(?:Build|;)' device_replacement: '$1' brand_replacement: 'LG' model_replacement: '$1' - - regex: '[;:] *(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+)? *(?:Build|[;\)])' + - regex: '[;:] *(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+|) *(?:Build|[;\)])' device_replacement: '$1' brand_replacement: 'LG' model_replacement: '$1' @@ -2532,6 +3120,10 @@ device_parsers: device_replacement: '$1 $2' brand_replacement: 'LG' model_replacement: '$2' + - regex: '(Web0S); Linux/(SmartTV)' + device_replacement: 'LG $1 $2' + brand_replacement: 'LG' + model_replacement: '$1 $2' ######### # Malata @@ -2595,7 +3187,7 @@ device_parsers: # Medion # @ref: http://www.medion.com/en/ ######### - - regex: '; *(?:MD_)?LIFETAB[ _]([^;/]+) Build' + - regex: '; *(?:MD_|)LIFETAB[ _]([^;/]+) Build' regex_flag: 'i' device_replacement: 'Medion Lifetab $1' brand_replacement: 'Medion' @@ -2673,7 +3265,7 @@ device_parsers: # Modecom # @ref: http://www.modecom.eu/tablets/portal/ ######### - - regex: '; *(MODECOM )?(FreeTab) ?([^;/]+) Build' + - regex: '; *(MODECOM |)(FreeTab) ?([^;/]+) Build' regex_flag: 'i' device_replacement: '$1$2 $3' brand_replacement: 'Modecom' @@ -2731,7 +3323,7 @@ device_parsers: # MSI # @ref: http://www.msi.com/product/windpad/ ######### - - regex: '; *(?:MSI[ _])?(Primo\d+|Enjoy[ _\-][^;/]+) Build' + - regex: '; *(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]+) Build' regex_flag: 'i' device_replacement: '$1' brand_replacement: 'Msi' @@ -2758,7 +3350,7 @@ device_parsers: device_replacement: '$1$2 $3' brand_replacement: 'MyPhone' model_replacement: '$3' - - regex: '; *(A\d+)[ _](Duo)? Build' + - regex: '; *(A\d+)[ _](Duo|) Build' regex_flag: 'i' device_replacement: '$1 $2' brand_replacement: 'MyPhone' @@ -2827,7 +3419,7 @@ device_parsers: device_replacement: '$1$2' brand_replacement: 'Nook' model_replacement: '$2' - - regex: '; *(NOOK )?(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2) Build' + - regex: '; *(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2) Build' device_replacement: '$1$2' brand_replacement: 'Nook' model_replacement: '$2' @@ -2904,6 +3496,19 @@ device_parsers: brand_replacement: 'Odys' model_replacement: '$1' + ######### + # OnePlus + # @ref https://oneplus.net/ + ######### + - regex: '; (ONE [a-zA-Z]\d+) Build/' + device_replacement: 'OnePlus $1' + brand_replacement: 'OnePlus' + model_replacement: '$1' + - regex: '; (ONEPLUS [a-zA-Z]\d+) Build/' + device_replacement: 'OnePlus $1' + brand_replacement: 'OnePlus' + model_replacement: '$1' + ######### # Orion # @ref: http://www.orion.ua/en/products/computer-products/tablet-pcs.html @@ -2949,11 +3554,11 @@ device_parsers: # @href: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA # @models: ADR8995, ADR910L, ADR930VW, C790, CDM8992, CDM8999, IS06, IS11PT, P2000, P2020, P2030, P4100, P5000, P6010, P6020, P6030, P7000, P7040, P8000, P8010, P9020, P9050, P9060, P9070, P9090, PT001, PT002, PT003, TXT8040, TXT8045, VEGA PTL21 ######### - - regex: '; *(SKY[ _])?(IM\-[AT]\d{3}[^;/]+).* Build/' + - regex: '; *(SKY[ _]|)(IM\-[AT]\d{3}[^;/]+).* Build/' device_replacement: 'Pantech $1$2' brand_replacement: 'Pantech' model_replacement: '$1$2' - - regex: '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G)?) Build/' + - regex: '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/' device_replacement: '$1' brand_replacement: 'Pantech' model_replacement: '$1' @@ -3036,7 +3641,7 @@ device_parsers: # Polaroid/ Acho # @ref: http://polaroidstore.com/store/start.asp?category_id=382&category_id2=0&order=title&filter1=&filter2=&filter3=&view=all ######### - - regex: '; *(?:Polaroid[ _])?((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*)(\/[^;/]*)? Build/' + - regex: '; *(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*)(\/[^;/]*|) Build/' device_replacement: '$1' brand_replacement: 'Polaroid' model_replacement: '$1' @@ -3063,7 +3668,7 @@ device_parsers: device_replacement: '$1' brand_replacement: 'Positivo' model_replacement: '$1' - - regex: '; *(?:Positivo )?((?:YPY|Ypy)[^;/]+) Build/' + - regex: '; *(?:Positivo |)((?:YPY|Ypy)[^;/]+) Build/' device_replacement: '$1' brand_replacement: 'Positivo' model_replacement: '$1' @@ -3091,7 +3696,7 @@ device_parsers: # @ref: http://www.prestigio.com/catalogue/MultiPhones # @ref: http://www.prestigio.com/catalogue/MultiPads ######### - - regex: '; *(?:Prestigio )?((?:PAP|PMP)\d[^;/]+) Build/' + - regex: '; *(?:Prestigio |)((?:PAP|PMP)\d[^;/]+) Build/' device_replacement: 'Prestigio $1' brand_replacement: 'Prestigio' model_replacement: '$1' @@ -3109,7 +3714,7 @@ device_parsers: # QMobile # @ref: http://www.qmobile.com.pk/ ######### - - regex: '; *(A2|A5|A8|A900)_?(Classic)? Build' + - regex: '; *(A2|A5|A8|A900)_?(Classic|) Build' device_replacement: '$1 $2' brand_replacement: 'Qmobile' model_replacement: '$1 $2' @@ -3144,6 +3749,19 @@ device_parsers: brand_replacement: 'Quanta' model_replacement: '$1' + ######### + # RCA + # @ref: http://rcamobilephone.com/ + ######### + - regex: '; (RCT\w+) Build/' + device_replacement: '$1' + brand_replacement: 'RCA' + model_replacement: '$1' + - regex: '; RCA (\w+) Build/' + device_replacement: 'RCA $1' + brand_replacement: 'RCA' + model_replacement: '$1' + ######### # Rockchip # @ref: http://www.rock-chips.com/a/cn/product/index.html @@ -3162,11 +3780,11 @@ device_parsers: # Samsung Android Devices # @ref: http://www.samsung.com/us/mobile/cell-phones/all-products ######### - - regex: '; *(SAMSUNG |Samsung )?((?:Galaxy (?:Note II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]*)\/?[^;/]* Build/' + - regex: '; *(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]*)\/?[^;/]* Build/' device_replacement: 'Samsung $1$2' brand_replacement: 'Samsung' model_replacement: '$2' - - regex: '; *(Google )?(Nexus [Ss](?: 4G)?) Build/' + - regex: '; *(Google |)(Nexus [Ss](?: 4G|)) Build/' device_replacement: 'Samsung $1$2' brand_replacement: 'Samsung' model_replacement: '$2' @@ -3174,15 +3792,15 @@ device_parsers: device_replacement: 'Samsung $2' brand_replacement: 'Samsung' model_replacement: '$2' - - regex: '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G)?) Build/' + - regex: '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/' device_replacement: 'Samsung $1' brand_replacement: 'Samsung' model_replacement: '$1' - - regex: '; *(SAMSUNG[ _\-] *)+([^;/]+) Build' + - regex: '; *(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]+) Build' device_replacement: 'Samsung $2' brand_replacement: 'Samsung' model_replacement: '$2' - - regex: '; *(SAMSUNG-)?(GT\-[BINPS]\d{4}[^\/]*)(\/[^ ]*) Build' + - regex: '; *(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]*)(\/[^ ]*) Build' device_replacement: 'Samsung $1$2$3' brand_replacement: 'Samsung' model_replacement: '$2' @@ -3194,11 +3812,15 @@ device_parsers: device_replacement: 'Samsung $1$2' brand_replacement: 'Samsung' model_replacement: '$2' - - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]+)(/?[^ ]*)? Build' + - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build' device_replacement: 'Samsung $1' brand_replacement: 'Samsung' model_replacement: '$1' - - regex: ' ((?:SCH)\-[A-Za-z0-9 ]+)(/?[^ ]*)? Build' + - regex: '; *((?:SC)\-[A-Za-z0-9 ]+)(/?[^ ]*|)\)' + device_replacement: 'Samsung $1' + brand_replacement: 'Samsung' + model_replacement: '$1' + - regex: ' ((?:SCH)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build' device_replacement: 'Samsung $1' brand_replacement: 'Samsung' model_replacement: '$1' @@ -3206,6 +3828,10 @@ device_parsers: device_replacement: 'Samsung $1' brand_replacement: 'Samsung' model_replacement: '$1' + - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9]{5})[\)]' + device_replacement: 'Samsung $1' + brand_replacement: 'Samsung' + model_replacement: '$1' ######### # Sharp @@ -3335,7 +3961,7 @@ device_parsers: device_replacement: '$1$2' brand_replacement: 'SonyEricsson' model_replacement: '$2' - - regex: '; *((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o)?|R800i|U20i) Build' + - regex: '; *((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build' device_replacement: '$1' brand_replacement: 'SonyEricsson' model_replacement: '$1' @@ -3399,7 +4025,7 @@ device_parsers: # Spice # @ref: http://www.spicemobilephones.co.in/ ######### - - regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?)?([Mm][Ii])([ _\-])?(\d{3}[^;/]*) Build/' + - regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*) Build/' device_replacement: '$1$2$3$4' brand_replacement: 'Spice' model_replacement: 'Mi$4' @@ -3538,7 +4164,7 @@ device_parsers: device_replacement: '$1' brand_replacement: 'HTC' model_replacement: 'Dream' - - regex: '\b(T-Mobile ?)?(myTouch)[ _]?([34]G)[ _]?([^\/]*) (?:Mozilla|Build)' + - regex: '\b(T-Mobile ?|)(myTouch)[ _]?([34]G)[ _]?([^\/]*) (?:Mozilla|Build)' device_replacement: '$1$2 $3 $4' brand_replacement: 'HTC' model_replacement: '$2 $3 $4' @@ -3583,7 +4209,7 @@ device_parsers: device_replacement: '$1' brand_replacement: 'Toshiba' model_replacement: 'Folio 100' - - regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a)?|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive) Build/' + - regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive) Build/' device_replacement: 'Toshiba $1' brand_replacement: 'Toshiba' model_replacement: '$1' @@ -3703,7 +4329,7 @@ device_parsers: # Walton # @ref: http://www.waltonbd.com/ ######### - - regex: '; *(?:Walton[ _\-])?(Primo[ _\-][^;/]+) Build' + - regex: '; *(?:Walton[ _\-]|)(Primo[ _\-][^;/]+) Build' regex_flag: 'i' device_replacement: 'Walton $1' brand_replacement: 'Walton' @@ -3713,7 +4339,7 @@ device_parsers: # Wiko # @ref: http://fr.wikomobile.com/collection.php?s=Smartphones ######### - - regex: '; *(?:WIKO[ \-])?(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+) Build/' + - regex: '; *(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+) Build/' regex_flag: 'i' device_replacement: 'Wiko $1' brand_replacement: 'Wiko' @@ -3759,7 +4385,7 @@ device_parsers: # Yarvik Zania # @ref: http://yarvik.com ######### - - regex: '; *(?:Xenta |Luna )?(TAB[234][0-9]{2}|TAB0[78]-\d{3}|TAB0?9-\d{3}|TAB1[03]-\d{3}|SMP\d{2}-\d{3}) Build/' + - regex: '; *(?:Xenta |Luna |)(TAB[234][0-9]{2}|TAB0[78]-\d{3}|TAB0?9-\d{3}|TAB1[03]-\d{3}|SMP\d{2}-\d{3}) Build/' device_replacement: 'Yarvik $1' brand_replacement: 'Yarvik' model_replacement: '$1' @@ -3782,7 +4408,15 @@ device_parsers: # XiaoMi # @ref: http://www.xiaomi.com/event/buyphone ######### - - regex: '; *(MI \d[^;/]*|MI-ONE Plus) Build/' + - regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/' + device_replacement: 'XiaoMi $1' + brand_replacement: 'XiaoMi' + model_replacement: '$1' + - regex: '; *(MIX) (Build|MIUI)/' + device_replacement: 'XiaoMi $1' + brand_replacement: 'XiaoMi' + model_replacement: '$1' + - regex: '; *((MIX) ([^;/]*)) (Build|MIUI)/' device_replacement: 'XiaoMi $1' brand_replacement: 'XiaoMi' model_replacement: '$1' @@ -3948,7 +4582,7 @@ device_parsers: device_replacement: 'Kindle' brand_replacement: 'Amazon' model_replacement: 'Kindle' - - regex: '; ?(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))? Build\b' + - regex: '; ?(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+)|) Build\b' device_replacement: 'Kindle Fire' brand_replacement: 'Amazon' model_replacement: 'Kindle Fire$2' @@ -4000,7 +4634,7 @@ device_parsers: ######### # Alcatel Windows Phones ######### - - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:ALCATEL)[^;]*; *([^;,\)]+)' + - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]*; *([^;,\)]+)' device_replacement: 'Alcatel $1' brand_replacement: 'Alcatel' model_replacement: '$1' @@ -4008,8 +4642,8 @@ device_parsers: ######### # Asus Windows Phones ######### - #~ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?(?:ASUS|Asus)[^;]*; *([^;,\)]+)' - - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?(?:ASUS|Asus)[^;]*; *([^;,\)]+)' + #~ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)' + - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)' device_replacement: 'Asus $1' brand_replacement: 'Asus' model_replacement: '$1' @@ -4017,7 +4651,7 @@ device_parsers: ######### # Dell Windows Phones ######### - - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:DELL|Dell)[^;]*; *([^;,\)]+)' + - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]*; *([^;,\)]+)' device_replacement: 'Dell $1' brand_replacement: 'Dell' model_replacement: '$1' @@ -4025,7 +4659,7 @@ device_parsers: ######### # HTC Windows Phones ######### - - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?(?:HTC|Htc|HTC_blocked[^;]*)[^;]*; *(?:HTC)?([^;,\)]+)' + - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]*)[^;]*; *(?:HTC|)([^;,\)]+)' device_replacement: 'HTC $1' brand_replacement: 'HTC' model_replacement: '$1' @@ -4033,7 +4667,7 @@ device_parsers: ######### # Huawei Windows Phones ######### - - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:HUAWEI)[^;]*; *(?:HUAWEI )?([^;,\)]+)' + - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]*; *(?:HUAWEI |)([^;,\)]+)' device_replacement: 'Huawei $1' brand_replacement: 'Huawei' model_replacement: '$1' @@ -4041,7 +4675,7 @@ device_parsers: ######### # LG Windows Phones ######### - - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:LG|Lg)[^;]*; *(?:LG[ \-])?([^;,\)]+)' + - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]*; *(?:LG[ \-]|)([^;,\)]+)' device_replacement: 'LG $1' brand_replacement: 'LG' model_replacement: '$1' @@ -4049,15 +4683,15 @@ device_parsers: ######### # Noka Windows Phones ######### - - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?)*(\d{3,}[^;\)]*)' + - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\d{3,10}[^;\)]*)' device_replacement: 'Lumia $1' brand_replacement: 'Nokia' model_replacement: 'Lumia $1' - - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:NOKIA|Nokia)[^;]*; *(RM-\d{3,})' + - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(RM-\d{3,})' device_replacement: 'Nokia $1' brand_replacement: 'Nokia' model_replacement: '$1' - - regex: '(?:Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?)?(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?)*([^;\)]+)' + - regex: '(?:Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\)]+)' device_replacement: 'Nokia $1' brand_replacement: 'Nokia' model_replacement: '$1' @@ -4065,7 +4699,7 @@ device_parsers: ######### # Microsoft Windows Phones ######### - - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:Microsoft(?: Corporation)?)[^;]*; *([^;,\)]+)' + - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]*; *([^;,\)]+)' device_replacement: 'Microsoft $1' brand_replacement: 'Microsoft' model_replacement: '$1' @@ -4073,7 +4707,7 @@ device_parsers: ######### # Samsung Windows Phones ######### - - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?(?:SAMSUNG)[^;]*; *(?:SAMSUNG )?([^;,\.\)]+)' + - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]*; *(?:SAMSUNG |)([^;,\.\)]+)' device_replacement: 'Samsung $1' brand_replacement: 'Samsung' model_replacement: '$1' @@ -4081,7 +4715,7 @@ device_parsers: ######### # Toshiba Windows Phones ######### - - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*; *([^;,\)]+)' + - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*; *([^;,\)]+)' device_replacement: 'Toshiba $1' brand_replacement: 'Toshiba' model_replacement: '$1' @@ -4089,7 +4723,7 @@ device_parsers: ######### # Generic Windows Phones ######### - - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?([^;]+); *([^;,\)]+)' + - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]+); *([^;,\)]+)' device_replacement: '$1 $2' brand_replacement: '$1' model_replacement: '$2' @@ -4109,7 +4743,7 @@ device_parsers: ######### # Firefox OS ######### - - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+)(?:/[^;]+)?; rv:[^\)]+\) Gecko/[^\/]+ Firefox/' + - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+)(?:/[^;]+|); rv:[^\)]+\) Gecko/[^\/]+ Firefox/' device_replacement: 'Alcatel $1 $2 $3' brand_replacement: 'Alcatel' model_replacement: 'One Touch $3' @@ -4140,7 +4774,7 @@ device_parsers: brand_replacement: '$1' model_replacement: '$2' # Nokia Symbian - - regex: '\(Symbian(?:/3)?; U; ([^;]+);' + - regex: '\(Symbian(?:/3|); U; ([^;]+);' device_replacement: 'Nokia $1' brand_replacement: 'Nokia' model_replacement: '$1' @@ -4185,7 +4819,7 @@ device_parsers: device_replacement: 'Palm Treo $1' brand_replacement: 'Palm' model_replacement: 'Treo $1' - - regex: 'webOS.*(P160U(?:NA)?)/(\d+).(\d+)' + - regex: 'webOS.*(P160U(?:NA|))/(\d+).(\d+)' device_replacement: 'HP Veer' brand_replacement: 'HP' model_replacement: 'Veer' @@ -4227,10 +4861,10 @@ device_parsers: # cannot determine specific device type from ua string. (3g, 3gs, 4, etc) ########## # @note: on some ua the device can be identified e.g. iPhone5,1 - - regex: '((?:iPhone|iPad|iPod)\d+,\d+)' + - regex: '(iPhone|iPad|iPod)(\d+,\d+)' device_replacement: '$1' brand_replacement: 'Apple' - model_replacement: '$1' + model_replacement: '$1$2' # @note: iPad needs to be before iPhone - regex: '(iPad)(?:;| Simulator;)' device_replacement: '$1' @@ -4244,17 +4878,47 @@ device_parsers: device_replacement: '$1' brand_replacement: 'Apple' model_replacement: '$1' + - regex: '(Watch)(\d+,\d+)' + device_replacement: 'Apple $1' + brand_replacement: 'Apple' + model_replacement: 'Apple $1 $2' + - regex: '(Apple Watch)(?:;| Simulator;)' + device_replacement: '$1' + brand_replacement: 'Apple' + model_replacement: '$1' + - regex: '(HomePod)(?:;| Simulator;)' + device_replacement: '$1' + brand_replacement: 'Apple' + model_replacement: '$1' + - regex: 'iPhone' + device_replacement: 'iPhone' + brand_replacement: 'Apple' + model_replacement: 'iPhone' # @note: desktop applications show device info - regex: 'CFNetwork/.* Darwin/\d.*\(((?:Mac|iMac|PowerMac|PowerBook)[^\d]*)(\d+)(?:,|%2C)(\d+)' device_replacement: '$1$2,$3' brand_replacement: 'Apple' model_replacement: '$1$2,$3' + # @note: newer desktop applications don't show device info + # This is here so as to not have them recorded as iOS-Device + - regex: 'CFNetwork/.* Darwin/\d+\.\d+\.\d+ \(x86_64\)' + device_replacement: 'Mac' + brand_replacement: 'Apple' + model_replacement: 'Mac' # @note: iOS applications do not show device info - regex: 'CFNetwork/.* Darwin/\d' device_replacement: 'iOS-Device' brand_replacement: 'Apple' model_replacement: 'iOS-Device' + ########################## + # Outlook on iOS >= 2.62.0 + ########################## + - regex: 'Outlook-(iOS)/\d+\.\d+\.prod\.iphone' + brand_replacement: 'Apple' + device_replacement: 'iPhone' + model_replacement: 'iPhone' + ########## # Acer ########## @@ -4286,7 +4950,7 @@ device_parsers: device_replacement: 'Asus $1' brand_replacement: 'Asus' model_replacement: '$1' - - regex: '(?:asus.*?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _])?[A-Za-z0-9]+)' + - regex: '(?:asus.*?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)' device_replacement: 'Asus $1' brand_replacement: 'Asus' model_replacement: '$1' @@ -4327,7 +4991,7 @@ device_parsers: ########## # htc ########## - - regex: '\b(?:HTC/|HTC/[a-z0-9]+/)?HTC[ _\-;]? *(.*?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)' + - regex: '\b(?:HTC/|HTC/[a-z0-9]+/|)HTC[ _\-;]? *(.*?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)' device_replacement: 'HTC $1' brand_replacement: 'HTC' model_replacement: '$1' @@ -4384,11 +5048,11 @@ device_parsers: device_replacement: '$1' brand_replacement: '$2' model_replacement: '$3' - - regex: '(HbbTV)/1\.1\.1.*CE-HTML/1\.\d;(Vendor/)*(THOM[^;]*?)[;\s](?:.*SW-Version/.*)*(LF[^;]+);?' + - regex: '(HbbTV)/1\.1\.1.*CE-HTML/1\.\d;(Vendor/|)(THOM[^;]*?)[;\s].{0,30}(LF[^;]+);?' device_replacement: '$1' brand_replacement: 'Thomson' model_replacement: '$4' - - regex: '(HbbTV)(?:/1\.1\.1)?(?: ?\(;;;;;\))?; *CE-HTML(?:/1\.\d)?; *([^ ]+) ([^;]+);' + - regex: '(HbbTV)(?:/1\.1\.1|) ?(?: \(;;;;;\)|); *CE-HTML(?:/1\.\d|); *([^ ]+) ([^;]+);' device_replacement: '$1' brand_replacement: '$2' model_replacement: '$3' @@ -4405,7 +5069,7 @@ device_parsers: ########## # LGE NetCast TV ########## - - regex: 'LGE; (?:Media\/)?([^;]*);[^;]*;[^;]*;?\); "?LG NetCast(\.TV|\.Media|)-\d+' + - regex: 'LGE; (?:Media\/|)([^;]*);[^;]*;[^;]*;?\); "?LG NetCast(\.TV|\.Media|)-\d+' device_replacement: 'NetCast$2' brand_replacement: 'LG' model_replacement: '$1' @@ -4434,7 +5098,7 @@ device_parsers: brand_replacement: '$1' model_replacement: '$2' # other LG phones - - regex: '\b(?:LGE[ \-]LG\-(?:AX)?|LGE |LGE?-LG|LGE?[ \-]|LG[ /\-]|lg[\-])([A-Za-z0-9]+)\b' + - regex: '\b(?:LGE[ \-]LG\-(?:AX|)|LGE |LGE?-LG|LGE?[ \-]|LG[ /\-]|lg[\-])([A-Za-z0-9]+)\b' device_replacement: 'LG $1' brand_replacement: 'LG' model_replacement: '$1' @@ -4514,6 +5178,11 @@ device_parsers: ########## # Samsung ########## + # Samsung Smart-TV + - regex: '(SMART-TV); .* Tizen ' + device_replacement: 'Samsung $1' + brand_replacement: 'Samsung' + model_replacement: '$1' # Samsung Symbian Devices - regex: 'SymbianOS/9\.\d.* Samsung[/\-]([A-Za-z0-9 \-]+)' device_replacement: 'Samsung $1' @@ -4574,7 +5243,7 @@ device_parsers: device_replacement: '$2 $1' brand_replacement: '$2' model_replacement: '$1' - - regex: '(Sony)(?:BDP\/|\/)?([^ /;\)]+)[ /;\)]' + - regex: '(Sony)(?:BDP\/|\/|)([^ /;\)]+)[ /;\)]' device_replacement: '$1 $2' brand_replacement: '$1' model_replacement: '$2' @@ -4604,27 +5273,27 @@ device_parsers: ######### # Android General Device Matching (far from perfect) ######### - - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.+) Build' + - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.+)( Build[/ ]|\))' brand_replacement: 'Generic_Android' model_replacement: '$1' - - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} *; *(.+?) Build' + - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} *; *(.+?)( Build[/ ]|\))' brand_replacement: 'Generic_Android' model_replacement: '$1' - - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? *; *(.+?) Build' + - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? *; *(.+?)( Build[/ ]|\))' brand_replacement: 'Generic_Android' model_replacement: '$1' - - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *[A-Za-z]{0,2}\- *; *(.+?) Build' + - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{0,2}\- *; *(.+?)( Build[/ ]|\))' brand_replacement: 'Generic_Android' model_replacement: '$1' # No build info at all - "Build" follows locale immediately - - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *[a-z]{0,2}[_\-]?[A-Za-z]{0,2};? Build' + - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[a-z]{0,2}[_\-]?[A-Za-z]{0,2};?( Build[/ ]|\))' device_replacement: 'Generic Smartphone' brand_replacement: 'Generic' model_replacement: 'Smartphone' - - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *\-?[A-Za-z]{2}; *(.+?) Build' + - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *\-?[A-Za-z]{2}; *(.+?)( Build[/ ]|\))' brand_replacement: 'Generic_Android' model_replacement: '$1' - - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}(?:;.*)?; *(.+?) Build' + - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|)(?:;.*|); *(.+?)( Build[/ ]|\))' brand_replacement: 'Generic_Android' model_replacement: '$1' @@ -4641,6 +5310,10 @@ device_parsers: - regex: '(WebTV)/\d+.\d+' brand_replacement: 'Generic_Inettv' model_replacement: '$1' + # Roku Digital-Video-Players https://www.roku.com/ + - regex: '^(Roku)/DVP-\d+\.\d+' + brand_replacement: 'Generic_Inettv' + model_replacement: '$1' ########## # Generic Tablet @@ -4667,7 +5340,7 @@ device_parsers: ########## # Spiders (this is hack...) ########## - - regex: '(bot|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.*/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes)' + - regex: '(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.*/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti)' regex_flag: 'i' device_replacement: 'Spider' brand_replacement: 'Spider' diff --git a/test_resources/opera_mini_user_agent_strings.yaml b/test_resources/opera_mini_user_agent_strings.yaml new file mode 100644 index 00000000..adfc3163 --- /dev/null +++ b/test_resources/opera_mini_user_agent_strings.yaml @@ -0,0 +1,1224 @@ +# Additional tests for opera mini detection. +# List of user agent strings and corresponding versions is taken from http://www.useragentstring.com/pages/Opera%20Mini/ +# Some user agent string are from http://www.webapps-online.com/online-tools/user-agent-strings/dv/plugin55599/opera-mini + +test_cases: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (S60; SymbOS; Opera Mobi/23.348; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '9' + minor: '80' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (S60; SymbOS; Opera Mobi/23.334; U; id) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '9' + minor: '80' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (J2ME/23.377; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '9' + minor: '80' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (J2ME/22.478; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '9' + minor: '80' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/9 (Compatible; MSIE:9.0; iPhone; BlackBerry9700; AppleWebKit/24.746; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '9' + minor: + patch: + + - user_agent_string: 'Opera/9.80 (Android; Opera Mini/7.6.35766/35.5706; U; en) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '7' + minor: '6' + patch: '35766' + + - user_agent_string: 'Opera/9.80 (Android; Opera Mini/7.5.33361/31.1350; U; en) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '7' + minor: '5' + patch: '33361' + + - user_agent_string: 'Opera/9.80 (Android; Opera Mini/7.29530/27.1407; U; en) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '7' + minor: '29530' + patch: + + - user_agent_string: 'Opera/9.80 (iPhone; Opera Mini/7.1.32694/27.1407; U; en) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '7' + minor: '1' + patch: '32694' + + - user_agent_string: 'Opera/9.80 (iPad; Opera Mini/7.1.32694/27.1407; U; en) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '7' + minor: '1' + patch: '32694' + + - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/7.1.32444/35.5706; U; en) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '7' + minor: '1' + patch: '32444' + + - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/7.1.32444/35.2883; U; ru) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '7' + minor: '1' + patch: '32444' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/7.1.32052/35.5706; U; id) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '7' + minor: '1' + patch: '32052' + + - user_agent_string: 'Opera/9.80 (iPhone; Opera Mini/7.0.4/28.2555; U; fr) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '7' + minor: '0' + patch: '4' + + - user_agent_string: 'Opera/9.80 (Android; Opera Mini/7.0.29952/28.2075; U; es) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '7' + minor: '0' + patch: '29952' + + - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/6.5.29702/28.2647; U; es) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '6' + minor: '5' + patch: '29702' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/6.5.26955/27.1407; U; en) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '6' + minor: '5' + patch: '26955' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/6.24288/25.729; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '6' + minor: '24288' + patch: + + - user_agent_string: 'Opera/9.80 (BlackBerry; Opera Mini/6.24209/27.1366; U; en) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '6' + minor: '24209' + patch: + + - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/6.24096/25.657; U; id) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '6' + minor: '24096' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/6.24093/26.1305; U; en) Presto/2.8.119 Version/10.54' + family: 'Opera Mini' + major: '6' + minor: '24093' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/6.24093/25.657; U; id) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '6' + minor: '24093' + patch: + + - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/6.1.25759/25.872; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '6' + minor: '1' + patch: '25759' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/6.1.25378/25.677; U; th) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '6' + minor: '1' + patch: '25378' + + - user_agent_string: 'Opera/9.80 (Android; Opera Mini/6.1.25375/25.657; U; es) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '6' + minor: '1' + patch: '25375' + + - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/6.0.24455/28.2766; U; en) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '6' + minor: '0' + patch: '24455' + + - user_agent_string: 'Opera/9.80 (Android;Opera Mini/6.0.24212/24.746 U;en) Presto/2.5.25 Version/10.5454' + family: 'Opera Mini' + major: '6' + minor: '0' + patch: '24212' + + - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/6.0.24095/24.760; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '6' + minor: '0' + patch: '24095' + + - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/6.0.24095/24.741; U; zh) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '6' + minor: '0' + patch: '24095' + + - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/5.1.22784/23.334; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '22784' + + - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/5.1.22784/22.394; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '22784' + + - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/5.1.22784/22.387; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '22784' + + - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/5.1.22783/23.334; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '22783' + + - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/5.1.22783/22.478; U; id) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '22783' + + - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/5.1.22783/22.478; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '22783' + + - user_agent_string: 'Opera/9.80 (Android; Opera Mini/5.1.22460/23.334; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '22460' + + - user_agent_string: 'Opera/9.80 (Android; Opera Mini/5.1.22460/22.478; U; fr) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '22460' + + - user_agent_string: 'Opera/9.80 (Android; Opera Mini/5.1.22460/22.414; U; de) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '22460' + + - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/5.1.22396/22.478; U; id) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '22396' + + - user_agent_string: 'Opera/9.80 (BlackBerry; Opera Mini/5.1.22303/22.387; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '22303' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.22296; BlackBerry9800; U; AppleWebKit/23.370; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '22296' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.22296/22.87; U; fr) Presto/2.5.25' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '22296' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.22296/22.87; U; en) Presto/2.5.25' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '22296' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.22296/22.478; U; fr) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '22296' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.22296/22.387; U; fr) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '22296' + + - user_agent_string: 'Opera/9.50 (J2ME/MIDP; Opera Mini/5.1.21965/20.2513; U; en)' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '21965' + + - user_agent_string: 'Opera/9.80 (Windows Mobile; Opera Mini/5.1.21595/25.657; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '21595' + + - user_agent_string: 'Opera/9.80 (Windows Mobile; Opera Mini/5.1.21594/22.387; U; ru) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '21594' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21415/22.387; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '21415' + + - user_agent_string: 'Opera/10.61 (J2ME/MIDP; Opera Mini/5.1.21219/19.999; en-US; rv:1.9.3a5) WebKit/534.5 Presto/2.6.30' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '21219' + + - user_agent_string: 'Opera/9.80(J2ME/MIDP; Opera Mini/5.1.21214/22.414; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '21214' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21214/22.414; U; ro) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '21214' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21214/22.387; U; id) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '21214' + + - user_agent_string: 'Opera/9.80 (Android; Opera Mini/5.1.21126/19.892; U; de) Presto/2.5.25' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '21126' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21051/27.1573; U; en) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '21051' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21051/23.377; U; id) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '21051' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21051/20.2477; U; en) Presto/2.5.25' + family: 'Opera Mini' + major: '5' + minor: '1' + patch: '21051' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.3521/886; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '3521' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.3521/22.414; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '3521' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.3521/18.684; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '3521' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.22349/37.6584; U; en) Presto/2.12.423 Version/12.16' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '22349' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.20873/19.916; U; en) Presto/2.5.25' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '20873' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.19693Mod.by.Handler/23.390; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '19693' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.19693Mod.by.Handler/18.794; U; id) Presto/2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '19693' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.19693/870; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '19693' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.19683/1278; U; ko) Presto/2.2.0' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '19683' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.18741Mod.by.Handler/22.414; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '18741' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.18741/886; U; id) Presto/2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '18741' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.18741/886; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '18741' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.18741/870; U; fr) Presto/2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '18741' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.18741/870; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '18741' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.18741/18.794; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '18741' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.18635Mod.by.Handler/23.377; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '18635' + + - user_agent_string: 'Opera/9.80 (Windows NT 5.1; U; Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.18635/1030; U; en) Presto/2.4.15; ru) Presto/2.8.99 Version/11.10' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '18635' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.18635/886; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '18635' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.17443/886; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '17443' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.17443/20.2477; U; en) Presto/2.5.25' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '17443' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.17381/886; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '17381' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.16823Mod.by.Handler/22.387; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '16823' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.16823/870; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '16823' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.15650/20.2479; U; en) Presto/2.5.25' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '15650' + + - user_agent_string: 'Opera/9.80 (J2ME/iPhone;Opera Mini/5.0.019802/886; U; ja)Presto/2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '019802' + + - user_agent_string: 'Opera/9.80 (J2ME/iPhone;Opera Mini/5.0.019802/886; U; ja)Presto/ 2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '019802' + + - user_agent_string: 'Opera/9.80 (J2ME/iPhone;Opera Mini/5.0.019802/886; U; ja) Presto/2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '019802' + + - user_agent_string: 'Opera/9.80 (iPhone; Opera Mini/5.0.019802/886; U; ja) Presto/2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '019802' + + - user_agent_string: 'Opera/9.80 (iPhone; Opera Mini/5.0.019802/886; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '019802' + + - user_agent_string: 'Opera/9.80 (iPhone; Opera Mini/5.0.019802/22.414; U; de) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '019802' + + - user_agent_string: 'Opera/9.80 (iPhone; Opera Mini/5.0.019802/18.738; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '019802' + + - user_agent_string: 'Opera/9.80 (iPhone; Opera Mini/5.0.0176/764; U; en) Presto/2.4.154.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '0176' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.0.862 Profile/24.743; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '0' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.0.423 Profile/18.684; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '0' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.0.351 Profile/22.478; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: '0' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0/870; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0(Windows; U; Windows NT 5.1; en-US)/23.390; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Windows; U; Windows NT 6.1; sv-SE) AppleWebKit/23.411; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Windows; U; Windows NT 6.1; rv:2.2) Gecko/24.838; U; id) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/23.411; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/22.478; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.3) Gecko/23.377; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Windows NT 6.1; WOW64) AppleWebKit/23.411; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (SymbianOS/24.838; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Linux; U; Android 2.2; fr-lu; HTC Legend Build/24.838; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Linux; U; Android 2.2; en-sa; HTC_DesireHD_A9191 Build/24.741; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (iPhone; U; xxxx like Mac OS X; en) AppleWebKit/24.838; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (iPhone; U; fr; CPU iPhone OS 4_2_1 like Mac OS X; fr) AppleWebKit/23.405; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/23.411; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/23.377; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (BlackBerry; U; BlackBerry9800; en-GB) AppleWebKit/24.783; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (BlackBerry; U; BlackBerry 9800) AppleWebKit/24.783; U; es) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '5' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.5.33867/35.2883; U; en) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '4' + minor: '5' + patch: '33867' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.4.Vista/19.916; U; en) Presto/2.5.25' + family: 'Opera Mini' + major: '4' + minor: '4' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.4.29476/27.1573; U; id) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '4' + minor: '4' + patch: '29476' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.4.26736/28.2647; U; it) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '4' + minor: '4' + patch: '26736' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.4.0.60 (Windows XP)/886; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '4' + minor: '4' + patch: '0' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.3.24214; iPhone; CPU iPhone OS 4_2_1 like Mac OS X; AppleWebKit/24.783; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '3' + patch: '24214' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.3.24214/27.1407; U; id) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '4' + minor: '3' + patch: '24214' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.3.24214 (Windows; U; Windows NT 6.1) AppleWebKit/24.838; U; id) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '3' + patch: '24214' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.3.13337/25.657; U; ro) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '3' + patch: '13337' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.24721/30.3316; U; en) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '24721' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.23453/28.2647; U; en) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '23453' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.21465/22.478; U; id) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '21465' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.21465/22.387; U; id) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '21465' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.19634/23.333; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '19634' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.18887/22.478; U; id) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '18887' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.16320/29.3594; U; en) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '16320' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.16007Mod.by.Handler/23.390; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '16007' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.15410QUAIN/22.478; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '15410' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.15410Mod.by.Handler/23.334; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '15410' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.15410Mod.by.Handler/23.333; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '15410' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.15410Mod.by.Handler/22.401; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '15410' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.15410Mod.by.Handler/20.2485; U; en) Presto/2.5.25' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '15410' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.15410Mod.by.Handler/18.678; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '15410' + + - user_agent_string: 'Opera/9.60 (J2ME/MIDP;Opera Mini/4.2.15410Mod.by.Handler/503; U; en)Presto/2.2.0' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '15410' + + - user_agent_string: 'Opera/9.50 (J2ME/MIDP; Opera Mini/4.2.15410Mod.by.Handler/20.2590; U; en)' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '15410' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.15410/870; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '15410' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.15410/24.899; U; id) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '15410' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.15410/22.394; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '15410' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.15066/886; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '15066' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14912mod.By.onome/22.401; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '14912' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14912Mod.by.Handler/24.783; U; id) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '14912' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14912Mod.by.Handler/23.377; U; id) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '14912' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14912Mod.By.www.9jamusic.cz.cc/22.387; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '14912' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14912/870; U; id) Presto/2.4.15' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '14912' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14912/35.5706; U; id) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '14912' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14912/24.746; U; id) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '14912' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14912/23.334; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '14912' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14912/23.333; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '14912' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14912/22.394; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '14912' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14885/20.2485; U; zh) Presto/2.5.25' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '14885' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14881Mod.by.Handler/24.743; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '14881' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14881Mod.by.Handler/23.317; U; id) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '14881' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14753/20.2485; U; zh) Presto/2.5.25' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '14753' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14409/20.2485; U; zh) Presto/2.5.25' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '14409' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14320/886; U; id) Presto/2.4.15' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '14320' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14320/22.478; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '14320' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14320/20.2485; U; zh) Presto/2.5.25' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '14320' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13943/20.2485; U; zh) Presto/2.5.25' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '13943' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13918/22.414; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '13918' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13400/20.2485; U; zh) Presto/2.5.25' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '13400' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13337.Mod.by.Handler/870; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '13337' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13337/886; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '13337' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13337/870; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '13337' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13337/19.916; U; en) Presto/2.5.25' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '13337' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13265/870; U; ro) Presto/2.4.15' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '13265' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13221/886; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '13221' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13221/870; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '13221' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13057/870; U; ja) Presto/2.4.15' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: '13057' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2 19.42.55/19.892; U; en) Presto/2.5.25' + family: 'Opera Mini' + major: '4' + minor: '2' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.18061/27.1407; U; en) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '4' + minor: '18061' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.1.15082/870; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '4' + minor: '1' + patch: '15082' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.1.15082/25.677; U; vi) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '1' + patch: '15082' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.1.15082/20.2489; U; en) Presto/2.5.25' + family: 'Opera Mini' + major: '4' + minor: '1' + patch: '15082' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.1.14287/22.387; U; id) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '1' + patch: '14287' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.1.13907/21.529; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '1' + patch: '13907' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.1.13573/20.2485; U; zh) Presto/2.5.25' + family: 'Opera Mini' + major: '4' + minor: '1' + patch: '13573' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.1.12965/19.892; U; en) Presto/2.5.25' + family: 'Opera Mini' + major: '4' + minor: '1' + patch: '12965' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.1.11321/24.871; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '1' + patch: '11321' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0.8462/22.414; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '0' + patch: '8462' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0.8462/19.916; U; en) Presto/2.5.25' + family: 'Opera Mini' + major: '4' + minor: '0' + patch: '8462' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0.10247/19.916; U; en) Presto/2.5.25' + family: 'Opera Mini' + major: '4' + minor: '0' + patch: '10247' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0.10031/22.453; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '0' + patch: '10031' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0/886; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '4' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0/870; U; id) Presto/2.4.15' + family: 'Opera Mini' + major: '4' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0/22.453; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0/22.401; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0/22.394; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.11) Gecko/23.390; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0 (Linux; U;' + family: 'Opera Mini' + major: '4' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/23.411; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0 (compatible; MSIE 5.0; UNIX) Opera 6.12 [en]/24.838; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/24.705; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '4' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.60 (J2ME/MIDP; Opera Mini/4.0/490; U; en) Presto/2.2.0' + family: 'Opera Mini' + major: '4' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/3.1.10423/22.387; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '3' + minor: '1' + patch: '10423' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/1.6.0_13/22.478; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '1' + minor: '6' + patch: '0' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/1.6.0_13/19.916; U; en) Presto/2.5.25' + family: 'Opera Mini' + major: '1' + minor: '6' + patch: '0' + + - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/1.0.30710/29.3594; U; en) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '1' + minor: '0' + patch: '30710' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/1.0/886; U; en) Presto/2.4.15' + family: 'Opera Mini' + major: '1' + minor: '0' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/SymbianOS/22.478; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: + minor: + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/Nokia2730c-1/22.478; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: + minor: + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/Mozilla/23.334; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: + minor: + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/(Windows; U; Windows NT 5.1; en-US) AppleWebKit/23.411; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: + minor: + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini; U; zh) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: + minor: + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini; U; en) Presto/2.8.119 Version/11.1019 Version/11.10.10' + family: 'Opera Mini' + major: + minor: + patch: + diff --git a/test_resources/pgts_browser_list.yaml b/test_resources/pgts_browser_list.yaml index 2aacd017..c0532e0f 100755 --- a/test_resources/pgts_browser_list.yaml +++ b/test_resources/pgts_browser_list.yaml @@ -55,7 +55,7 @@ test_cases: patch: - user_agent_string: 'Alizee iPod 2005 (Beta; Mac OS X)' - family: 'Mobile Safari' + family: 'Mobile Safari UI/WKWebView' major: minor: patch: @@ -1051,70 +1051,70 @@ test_cases: patch: '0' - user_agent_string: 'curl/7.10.2 (powerpc-apple-darwin7.0) libcurl/7.10.2 OpenSSL/0.9.7b zlib/1.1.4' - family: 'Other' - major: - minor: - patch: + family: 'curl' + major: '7' + minor: '10' + patch: '2' - user_agent_string: 'curl/7.10.6 (i386-redhat-linux-gnu) libcurl/7.10.6 OpenSSL/0.9.7a ipv6 zlib/1.1.4' - family: 'Other' - major: - minor: - patch: + family: 'curl' + major: '7' + minor: '10' + patch: '6' - user_agent_string: 'curl/7.10.6 (i386-redhat-linux-gnu) libcurl/7.10.6 OpenSSL/0.9.7a ipv6 zlib/1.2.0.7' - family: 'Other' - major: - minor: - patch: + family: 'curl' + major: '7' + minor: '10' + patch: '6' - user_agent_string: 'curl/7.11.2 (i686-pc-linux-gnu) libcurl/7.10.2 OpenSSL/0.9.6i ipv6 zlib/1.1.4' - family: 'Other' - major: - minor: - patch: + family: 'curl' + major: '7' + minor: '11' + patch: '2' - user_agent_string: 'curl/7.12.0 (i686-pc-linux-gnu) libcurl/7.12.0 OpenSSL/0.9.7e ipv6 zlib/1.2.2' - family: 'Other' - major: - minor: - patch: + family: 'curl' + major: '7' + minor: '12' + patch: '0' - user_agent_string: 'curl/7.7.2 (powerpc-apple-darwin6.0) libcurl 7.7.2 (OpenSSL 0.9.6b)' - family: 'Other' - major: - minor: - patch: + family: 'curl' + major: '7' + minor: '7' + patch: '2' - user_agent_string: 'curl/7.7.3 (i686-pc-linux-gnu) libcurl 7.7.3 (OpenSSL 0.9.6)' - family: 'Other' - major: - minor: - patch: + family: 'curl' + major: '7' + minor: '7' + patch: '3' - user_agent_string: 'curl/7.7.3 (win32) libcurl 7.7.3 (OpenSSL 0.9.6)' - family: 'Other' - major: - minor: - patch: + family: 'curl' + major: '7' + minor: '7' + patch: '3' - user_agent_string: 'curl/7.9.3 (powerpc-ibm-aix4.3.3.0) libcurl 7.9.3 (OpenSSL 0.9.6m)' - family: 'Other' - major: - minor: - patch: + family: 'curl' + major: '7' + minor: '9' + patch: '3' - user_agent_string: 'curl/7.9.5 (i386-redhat-linux-gnu) libcurl 7.9.5 (OpenSSL 0.9.6b) (ipv6 enabled)' - family: 'Other' - major: - minor: - patch: + family: 'curl' + major: '7' + minor: '9' + patch: '5' - user_agent_string: 'curl/7.9.8 (i386-redhat-linux-gnu) libcurl 7.9.8 (OpenSSL 0.9.7a) (ipv6 enabled)' - family: 'Other' - major: - minor: - patch: + family: 'curl' + major: '7' + minor: '9' + patch: '8' - user_agent_string: 'DA 5.0' family: 'Other' @@ -4165,27 +4165,27 @@ test_cases: patch: - user_agent_string: 'libwww-perl/5.79' - family: 'Other' - major: - minor: + family: 'libwww-perl' + major: '5' + minor: '79' patch: - user_agent_string: 'SonyEricssonT306/R101 [Html2Wml/0.4.11 libwww-perl/5.79]' - family: 'Other' - major: - minor: + family: 'libwww-perl' + major: '5' + minor: '79' patch: - user_agent_string: 'testJapanequeDelicious/0.1 libwww-perl/5.803' - family: 'Other' - major: - minor: + family: 'libwww-perl' + major: '5' + minor: '803' patch: - user_agent_string: 'W3C-checklink/4.1 [4.14] libwww-perl/5.803' - family: 'Other' - major: - minor: + family: 'libwww-perl' + major: '5' + minor: '803' patch: - user_agent_string: 'Mozilla/3.0 (compatible; Linkman)' @@ -4711,15 +4711,15 @@ test_cases: patch: - user_agent_string: 'Mozilla/4.0 (compatible; Lotus-Notes/5.0; Windows-NT)' - family: 'Other' - major: - minor: + family: 'Lotus Notes' + major: '5' + minor: '0' patch: - user_agent_string: 'Mozilla/4.0 (compatible; Lotus-Notes/6.0; Windows-NT)' - family: 'Other' - major: - minor: + family: 'Lotus Notes' + major: '6' + minor: '0' patch: - user_agent_string: 'LTH/3.02a (http://www.learntohack.nil)' @@ -39415,9 +39415,9 @@ test_cases: patch: - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 4.0; 3COM U.S. Robotics)' - family: 'Robotics' - major: - minor: + family: 'IE' + major: '6' + minor: '0' patch: - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 4.0; ABN AMRO)' @@ -63409,7 +63409,7 @@ test_cases: patch: - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows XP Professional Bot v.5.)' - family: 'XP Professional Bot' + family: 'Windows XP Professional Bot' major: minor: patch: @@ -74779,15 +74779,15 @@ test_cases: patch: - user_agent_string: 'Wget/1.8.2 modified' - family: 'Other' - major: - minor: - patch: + family: 'Wget' + major: '1' + minor: '8' + patch: '2' - user_agent_string: 'Wget/1.9+cvs-stable (Red Hat modified)' - family: 'Other' - major: - minor: + family: 'Wget' + major: '1' + minor: '9' patch: - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 5.00; Window 98)' @@ -74989,13 +74989,13 @@ test_cases: patch: - user_agent_string: 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412.6.2 (KHTML, like Gecko)' - family: 'AppleMail' + family: 'Apple Mail' major: '412' minor: '6' patch: '2' - user_agent_string: 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; es-es) AppleWebKit/531.22.7 (KHTML, like Gecko)' - family: 'AppleMail' + family: 'Apple Mail' major: '531' minor: '22' patch: '7' diff --git a/test_resources/podcasting_user_agent_strings.yaml b/test_resources/podcasting_user_agent_strings.yaml new file mode 100755 index 00000000..c2d609fa --- /dev/null +++ b/test_resources/podcasting_user_agent_strings.yaml @@ -0,0 +1,732 @@ +test_cases: + + - user_agent_string: 'okhttp/2.7.5' + family: 'okhttp' + major: '2' + minor: '7' + patch: '5' + - user_agent_string: 'Stitcher/iOS' + family: 'Stitcher' + major: + minor: + patch: + - user_agent_string: 'Stitcher/Android' + family: 'Stitcher' + major: + minor: + patch: + - user_agent_string: 'Mozilla/5.0 (Linux; U; en-us; BeyondPod 4)' + family: 'BeyondPod' + major: '4' + minor: + patch: + - user_agent_string: 'NSPlayer/10.0.0.3702 WMFSDK/10.0' + family: 'NSPlayer' + major: '10' + minor: '0' + patch: '0' + patch_minor: '3702' + - user_agent_string: 'NSPlayer/12.00.10011.16384 WMFSDK/12.00.10011.16384' + family: 'NSPlayer' + major: '12' + minor: '00' + patch: '10011' + patch_minor: '16384' + - user_agent_string: 'Pocket Casts' + family: 'Pocket Casts' + major: + minor: + patch: + - user_agent_string: 'Shifty Jelly Pocket Casts, Android v4.3.5' + family: 'Pocket Casts' + major: + minor: + patch: + - user_agent_string: 'Player/LG Player 1.0 for Android 4.4.2 (stagefright alternative), Pocket Casts' + family: 'Pocket Casts' + major: + minor: + patch: + - user_agent_string: 'PocketTunes/5.5.8' + family: 'PocketTunes' + major: '5' + minor: '5' + patch: '8' + - user_agent_string: 'Overcast/2.0 (+http://overcast.fm/; iOS podcast app)' + family: 'Overcast' + major: '2' + minor: '0' + patch: + - user_agent_string: 'Overcast/1.0 Podcast Sync (+http://overcast.fm/)' + family: 'Overcast' + major: '1' + minor: '0' + patch: + - user_agent_string: 'Player FM' + family: 'Player FM' + major: + minor: + patch: + - user_agent_string: 'Player/LG Player 1.0 for Android 4.4.2 (stagefright alternative), Player FM' + family: 'Player FM' + major: + minor: + patch: + - user_agent_string: 'AppleCoreMedia/1.0.0.9A405 (iPad; U; CPU OS 5_0_1 like Mac OS X; zh_cn), Player FM' + family: 'Player FM' + major: + minor: + patch: + - user_agent_string: 'Player FM BMID/E6804C1C77' + family: 'Player FM' + major: 'E6804C1C77' + minor: + patch: + - user_agent_string: 'ExoPlayerDemo/4.11 (Linux;Android 5.1.1) ExoPlayerLib/1.5.2' + family: 'ExoPlayerDemo' + major: '4' + minor: '11' + patch: + - user_agent_string: 'Radio/1.0 (Linux;Android 6.0.1) ExoPlayerLib/1.5.2' + family: 'Radio' + major: '1' + minor: '0' + patch: + - user_agent_string: 'AlexaMediaPlayer/5.3.1-21 (Linux;Android 5.1) ExoPlayerLib/1.3.3 ' + family: 'AlexaMediaPlayer' + major: '5' + minor: '3' + patch: '1-21' + - user_agent_string: 'Podkicker/2.2.4' + family: 'Podkicker' + major: '2' + minor: '2' + patch: '4' + - user_agent_string: 'Podkicker Pro/2.2.2 ' + family: 'Podkicker' + major: '2' + minor: '2' + patch: '2' + - user_agent_string: 'Podkicker Classic/1.2.9' + family: 'Podkicker' + major: '1' + minor: '2' + patch: '9' + - user_agent_string: 'Downcast/2.9.13 (iPhone; iOS 9.2.1; Scale/2.00)' + family: 'Downcast' + major: '2' + minor: '9' + patch: '13' + - user_agent_string: 'iTunes/10.7 Downcast/5608' + family: 'Downcast' + major: '5608' + minor: + patch: + - user_agent_string: 'Downcast/2.9.10 (Mac OS X Version 10.11.3 (Build 15D21))' + family: 'Downcast' + major: '2' + minor: '9' + patch: '10' + - user_agent_string: 'iTunes/10.7 Downcast/2.8.14.1002' + family: 'Downcast' + major: '2' + minor: '8' + patch: '14' + patch_minor: '1002' + - user_agent_string: 'ESPN%20Radio/3.2.113 CFNetwork/485.12.30 Darwin/10.4.0' + family: 'ESPN' + major: '3' + minor: '2' + patch: '113' + - user_agent_string: 'ESPN Radio/3.2.113 CFNetwork/485.12.30 Darwin/10.4.0' + family: 'ESPN' + major: '3' + minor: '2' + patch: '113' + - user_agent_string: 'Stitcher/28420 CFNetwork/548.1.4 Darwin/11.0.0' + family: 'Stitcher' + major: '28420' + minor: + patch: + - user_agent_string: 'Stitcher/3.310746 CFNetwork/459 Darwin/10.0.0d3' + family: 'Stitcher' + major: '3' + minor: '310746' + patch: + - user_agent_string: 'Mark%20Levin%20Show/11 CFNetwork/758.3.15 Darwin/15.4.0' + family: 'Mark%20Levin%20Show' + major: '11' + minor: + patch: + - user_agent_string: 'The%20Dan%20Patrick%20Show/11 CFNetwork/758.2.8 Darwin/15.0.0' + family: 'The%20Dan%20Patrick%20Show' + major: '11' + minor: + patch: + - user_agent_string: 'The Dan Patrick Show/11 CFNetwork/758.2.8 Darwin/15.0.0' + family: 'The Dan Patrick Show' + major: '11' + minor: + patch: + - user_agent_string: '77%20WABC/11 CFNetwork/758.3.15 Darwin/15.4.0' + family: '77%20WABC' + major: '11' + minor: + patch: + - user_agent_string: '77 WABC/11 CFNetwork/758.3.15 Darwin/15.4.0' + family: '77 WABC' + major: '11' + minor: + patch: + - user_agent_string: 'KNBR%20680/11 CFNetwork/758.3.15 Darwin/15.4.0' + family: 'KNBR%20680' + major: '11' + minor: + patch: + - user_agent_string: 'PodcastOne/3.0.6 CFNetwork/758.3.15 Darwin/15.4.0' + family: 'PodcastOne' + major: '3' + minor: '0' + patch: '6' + - user_agent_string: 'PodcastOne/2.0 CFNetwork/758.2.8 Darwin/15.0.0 ' + family: 'PodcastOne' + major: '2' + minor: '0' + patch: + - user_agent_string: 'AudioBoom/226 CFNetwork/758.3.15 Darwin/15.4.0' + family: 'AudioBoom' + major: '226' + minor: + patch: + - user_agent_string: 'https://audioboom.com/boos/' + family: 'AudioBoom' + major: + minor: + patch: + - user_agent_string: 'Sports%20Talk%201050/10 CFNetwork/758.3.15 Darwin/15.4.0' + family: 'Sports%20Talk%201050' + major: '10' + minor: + patch: + - user_agent_string: 'PodCruncher/3.2 CFNetwork/758.2.8 Darwin/15.0.0' + family: 'PodCruncher' + major: '3' + minor: '2' + patch: + - user_agent_string: 'iTunes/10.5.2 (PodCruncher 2.2)' + family: 'PodCruncher' + major: '2' + minor: '2' + patch: + - user_agent_string: 'Zune/4.8' + family: 'Zune' + major: '4' + minor: '8' + patch: + - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; Zune 4.7)' + family: 'Zune' + major: '4' + minor: '7' + patch: + - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2; OverDrive Download Station 1.0; Zune 4.7; .NET4.0C)' + family: 'Zune' + major: '4' + minor: '7' + patch: + - user_agent_string: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; InfoPath.3; MS-RTC LM 8; .NET4.0C; .NET4.0E)' + family: 'Zune' + major: '4' + minor: '0' + patch: + - user_agent_string: 'RSSRadio/8899 (iPhone,iPhone OS,9.3)' + family: 'RSSRadio' + major: '8899' + minor: + patch: + - user_agent_string: 'RSSRadio (Push Notification Scanner;support@dorada.co.uk)' + family: 'RSSRadio' + major: + minor: + patch: + - user_agent_string: 'RSS_Radio 1.5' + family: 'RSSRadio' + major: '1' + minor: '5' + patch: + - user_agent_string: 'RSSRadio/2.68.14049 CFNetwork/672.1.15 Darwin/14.0.0' + family: 'RSSRadio' + major: '2' + minor: '68' + patch: '14049' + - user_agent_string: 'Lavf/56.15.102' + family: 'WMPlayer' + major: + minor: + patch: + - user_agent_string: 'Lavf52.64.2' + family: 'WMPlayer' + major: + minor: + patch: + - user_agent_string: 'Lavf53.32.100/WinampMPEG/2.8' + family: 'WMPlayer' + major: + minor: + patch: + - user_agent_string: 'Lavf52.104.0 WMPlayer/10.0.0.364 guid/3300AD50-2C39-46C0-AE0A-AC7B8159E203' + family: 'WMPlayer' + major: '10' + minor: '0' + patch: '0' + patch_minor: '364' + - user_agent_string: 'WMPlayer/10.0.0.364 guid/3300AD50-2C39-46C0-AE0A-AC7B8159E203' + family: 'WMPlayer' + major: '10' + minor: '0' + patch: '0' + patch_minor: '364' + - user_agent_string: 'AntennaPod/1.5.2.0' + family: 'AntennaPod' + major: '1' + minor: '5' + patch: '2' + patch_minor: '0' + - user_agent_string: 'Antenna/965 CFNetwork/758.2.8 Darwin/15.0.0' + family: 'AntennaPod' + major: '965' + minor: + patch: + - user_agent_string: 'AntennaPod/1.2.1' + family: 'AntennaPod' + major: '1' + minor: '2' + patch: '1' + - user_agent_string: 'HTC Streaming Player htc / 1.0 / cingular_us / 5.0.2' + family: 'HTC' + major: '5' + minor: '0' + patch: '2' + - user_agent_string: 'HTC Streaming Player utstarcom_wwe-generic / 1.0 / htc_kingdom / 2.3.4' + family: 'HTC' + major: '2' + minor: '3' + patch: '4' + - user_agent_string: 'HTC Streaming Player telus_wwe / 1.0 / htc_ruby / 4.0.3' + family: 'HTC' + major: '4' + minor: '0' + patch: '3' + - user_agent_string: 'HTC Streaming Player htc / 1.0 / himauhl_htc_asia_tw / 6.0 ' + family: 'HTC' + major: '6' + minor: '0' + patch: + - user_agent_string: 'ZDM/4.0; Windows Mobile 8.1' + family: 'ZDM' + major: '4' + minor: '0' + patch: + - user_agent_string: 'bPod' + family: 'bPod' + major: + minor: + patch: + - user_agent_string: 'bPod BMID/E679FACD4C' + family: 'bPod' + major: 'E679FACD4C' + minor: + patch: + - user_agent_string: 'PodcastAddict/v2 - Dalvik/2.1.0 (Linux; U; Android 6.0; LG-H811 Build/MRA58K)' + family: 'PodcastAddict' + major: '2' + minor: + patch: + - user_agent_string: 'Podcast Addict - Dalvik/2.1.0 (Linux; U; Android 5.1.1; SM-G920P Build/LMY47X)' + family: 'PodcastAddict' + major: + minor: + patch: + - user_agent_string: 'LG-H345/V10f Player/LG Player 1.0 for Android 5.1.1 (stagefright alternative)' + family: 'LG Player' + major: '1' + minor: '0' + patch: + - user_agent_string: 'Player/LG Player 1.0 for Android 6.0 (stagefright alternative)' + family: 'LG Player' + major: '1' + minor: '0' + patch: + - user_agent_string: 'EspnDownloadManager' + family: 'ESPN' + major: + minor: + patch: + - user_agent_string: 'ESPN Radio 4.7.4 rv:1032 (iPhone; iPhone OS 9.2.1; en_US)' + family: 'ESPN' + major: '4' + minor: '7' + patch: '4' + patch_minor: '1032' + - user_agent_string: 'ESPN Radio 4.5.1 (iPhone; iPhone OS 5.1.1; en_US)' + family: 'ESPN' + major: '4' + minor: '5' + patch: '1' + - user_agent_string: 'ESPN Radio 4.0 (iPhone; iPhone OS 7.1.2; en_AU)' + family: 'ESPN' + major: '4' + minor: '0' + patch: + - user_agent_string: 'http://c.espnradio.com/s:' + family: 'ESPN' + major: + minor: + patch: + - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.4.4; HP Slate 17 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Safari/537.36ESPN APP' + family: 'ESPN' + major: + minor: + patch: + - user_agent_string: 'Mozilla/5.0 (compatible; heritrix/3.2.0 +http://espn.go.com' + family: 'ESPN' + major: + minor: + patch: + - user_agent_string: 'Custom-Feed Reader' + family: 'Custom' + major: + minor: + patch: + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) amarok/2.8.0 Safari/534.34' + family: 'Amarok' + major: '2' + minor: '8' + patch: '0' + - user_agent_string: 'amarok/2.8.0 (Phonon/4.8.0; Phonon-VLC/0.8.0) LibVLC/2.2.1' + family: 'Amarok' + major: '2' + minor: '8' + patch: '0' + - user_agent_string: 'Banshee/2.6.2 (http://banshee-project.org/)' + family: 'Banshee' + major: '2' + minor: '6' + patch: '2' + - user_agent_string: 'gPodder/3.7.0 (+http://gpodder.org/)' + family: 'gPodder' + major: '3' + minor: '7' + patch: '0' + - user_agent_string: 'jPodder v 1.1 RC3' + family: 'jPodder' + major: '1' + minor: '1' + patch: + - user_agent_string: 'iPodder/2.1 +http://ipodder.sf.net/' + family: 'iPodder' + major: '2' + minor: '1' + patch: + - user_agent_string: 'massyn.net philpodder/1.6 (linux)' + family: 'philpodder' + major: '1' + minor: '6' + patch: + - user_agent_string: 'BashPodder' + family: 'BashPodder' + major: + minor: + patch: + - user_agent_string: 'Clementine-qt5 1.2.3' + family: 'Clementine' + major: '1' + minor: '2' + patch: '3' + - user_agent_string: 'Clementine 1.2.3-1457-g4db358a' + family: 'Clementine' + major: '1' + minor: '2' + patch: '3-1457-g4db358a' + - user_agent_string: 'Clementine 1.2.3' + family: 'Clementine' + major: '1' + minor: '2' + patch: '3' + - user_agent_string: 'Clementine 1.2' + family: 'Clementine' + major: '1' + minor: '2' + patch: + - user_agent_string: 'Clementine 1.2.2 Clementine 1.2.2 Clementine 1.2.2' + family: 'Clementine' + major: '1' + minor: '2' + patch: '2' + - user_agent_string: 'foobar2000/1.1.14a' + family: 'foobar' + major: '1' + minor: '1' + patch: '14a' + - user_agent_string: 'foobar2000/1.2.3' + family: 'foobar' + major: '1' + minor: '2' + patch: '3' + - user_agent_string: 'Juice/2.2 (Windows) +http://juicereceiver.sf.net/' + family: 'Juice' + major: '2' + minor: '2' + patch: + - user_agent_string: 'Liferea/0.x.x (Linux; en_US.UTF-8; http://liferea.sf.net/)' + family: 'Liferea' + major: '0' + minor: 'x' + patch: 'x' + - user_agent_string: 'MediaGo' + family: 'MediaGo' + major: + minor: + patch: + - user_agent_string: 'MediaGo/3.0.0.403 (Windows NT 6.3; WOW64) NetworkDownloader/1.6.01.0 PlaybackEngine/2.20.103.05220' + family: 'MediaGo' + major: '3' + minor: '0' + patch: '0' + patch_minor: '403' + - user_agent_string: 'MediaMonkey' + family: 'MediaMonkey' + major: + minor: + patch: + - user_agent_string: 'MediaMonkey 4.1.9.1764' + family: 'MediaMonkey' + major: '4' + minor: '1' + patch: '9' + patch_minor: '1764' + - user_agent_string: 'Miro/6.0 (http://www.getmiro.com/; Windows post2008Server x86) ' + family: 'Miro' + major: '6' + minor: '0' + patch: + - user_agent_string: 'Miro/3.0.3 (http://www.getmiro.com/; Microsoft Windows )' + family: 'Miro' + major: '3' + minor: '0' + patch: '3' + - user_agent_string: 'Fancy Cloud Music 1.4 build 2 (iPhone; iPhone OS 9.2.1; en_US)' + family: 'FancyMusic' + major: '1' + minor: '4' + patch: + - user_agent_string: 'FancyMusic 1.5.0 build 5 (iPod touch; iPhone OS 9.2.1; en_US)' + family: 'FancyMusic' + major: '1' + minor: '5' + patch: '0' + - user_agent_string: 'VOX Music Player' + family: 'VOX' + major: + minor: + patch: + - user_agent_string: 'NetNewsWire/3.3 (Mac OS X; http://netnewswireapp.com/mac/; gzip-happy)' + family: 'NetNewsWire' + major: '3' + minor: '3' + patch: + - user_agent_string: 'NetNewsWire/3.1.7 (Mac OS X; http://www.newsgator.com/Individuals/NetNewsWire/)' + family: 'NetNewsWire' + major: '3' + minor: '1' + patch: '7' + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/601.4.4 (KHTML, like Gecko) NetNewsWire/3.2' + family: 'NetNewsWire' + major: '3' + minor: '2' + patch: + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/600.8.9 (KHTML, like Gecko) NetNewsWire/3.3.2' + family: 'NetNewsWire' + major: '3' + minor: '3' + patch: '2' + - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.0; Rivo RHYTHM RX75 Build/LRX21M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36; | 2016-04-07 14:37:04' + family: 'Rivo' + major: + minor: + patch: + - user_agent_string: 'Spotify' + family: 'Spotify' + major: + minor: + patch: + - user_agent_string: 'Spotify/1.0' + family: 'Spotify' + major: '1' + minor: '0' + patch: + - user_agent_string: 'VLC/2.0.6 LibVLC/2.0.6' + family: 'VLC' + major: '2' + minor: '0' + patch: '6' + - user_agent_string: 'vlc/1.1.0 LibVLC/1.1.0' + family: 'VLC' + major: '1' + minor: '1' + patch: '0' + - user_agent_string: 'VLC/3.0.0-git LibVLC/3.0.0-git BMID/E67AB28521' + family: 'VLC' + major: '3' + minor: '0' + patch: '0-git' + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/9.3 Mobile/11A465 Safari/9537.53 VLC for iOS/2.7.2' + family: 'VLC' + major: + minor: + patch: + - user_agent_string: 'VLC media player - version 1.0.3 Goldeneye - (c) 1996-2009 the VideoLAN team' + family: 'VLC' + major: '1' + minor: '0' + patch: '3' + - user_agent_string: 'VLC/2.2.0-rc1 LibVLC/2.2.0-rc1' + family: 'VLC' + major: '2' + minor: '2' + patch: '0-rc1' + - user_agent_string: 'VLC/2.2.0-pre4 LibVLC/2.2.0-pre4' + family: 'VLC' + major: '2' + minor: '2' + patch: '0-pre4' + - user_agent_string: 'CITA RSS Aggregator/2.7' + family: 'CITA' + major: '2' + minor: '7' + patch: + - user_agent_string: 'Doppler 2.9.5.4' + family: 'Doppler' + major: '2' + minor: '9' + patch: '5' + patch_minor: '4' + - user_agent_string: 'GoldenPod/0.8.4 (GNU/Linux; podcatcher; Using LWP) libwwwperl' + family: 'GoldenPod' + major: '0' + minor: '8' + patch: '4' + - user_agent_string: 'Replay AV' + family: 'Replay' + major: + minor: + patch: + - user_agent_string: 'MusicDownloaderLite/1.0.1 CFNetwork/609.1.4 Darwin/13.0.0' + family: 'MusicDownloader' + major: '1' + minor: '0' + patch: '1' + - user_agent_string: 'MusicDownloader/2.0.3 CFNetwork/548.0.4 Darwin/11.0.0' + family: 'MusicDownloader' + major: '2' + minor: '0' + patch: '3' + - user_agent_string: 'Plugged%20-%20Stream%20Podcasts%2C%20Music%20&%20More%20Free/5.0 CFNetwork/711.5.6 Darwin/14.0.0' + family: 'Plugged%20-%20Stream%20Podcasts%2C%20Music%20&%20More%20Free' + major: '5' + minor: '0' + patch: + - user_agent_string: 'PodWrangler/1.1 CFNetwork/672.1.15 Darwin/14.0.0' + family: 'PodWrangler' + major: '1' + minor: '1' + patch: + - user_agent_string: 'Custom/12 CFNetwork/758.2.8 Darwin/15.0.0' + family: 'Custom' + major: '12' + minor: + patch: + - user_agent_string: 'GoodReader4/100 CFNetwork/758.3.15 Darwin/15.4.0' + family: 'GoodReader4' + major: '100' + minor: + patch: + - user_agent_string: 'Free-Podcasts/132 CFNetwork/758.2.8 Darwin/15.0.0' + family: 'Free-Podcasts' + major: '132' + minor: + patch: + - user_agent_string: 'Free-Podcasts/1.05 CFNetwork/609 Darwin/13.0.0' + family: 'Free-Podcasts' + major: '1' + minor: '05' + patch: + - user_agent_string: 'TopPodcasts/261 CFNetwork/758.0.2 Darwin/15.0.0' + family: 'TopPodcasts' + major: '261' + minor: + patch: + - user_agent_string: 'TopPodcastsPro/201 CFNetwork/758.2.8 Darwin/15.0.0' + family: 'TopPodcasts' + major: '201' + minor: + patch: + - user_agent_string: 'TopPodcasts/2.1.4 CFNetwork/672.1.15 Darwin/14.0.0' + family: 'TopPodcasts' + major: '2' + minor: '1' + patch: '4' + - user_agent_string: 'Podcasts/2.2' + family: 'Podcasts' + major: '2' + minor: '2' + patch: + - user_agent_string: 'Podcasts/1.4.113' + family: 'Podcasts' + major: '1' + minor: '4' + patch: '113' + - user_agent_string: 'Peapod/pre1.0 +http://www.peapodpy.org.uk' + family: 'Peapod' + major: 'pre1' + minor: '0' + patch: + - user_agent_string: 'Peapod/1.0 +http://www.peapodpy.org.uk' + family: 'Peapod' + major: '1' + minor: '0' + patch: + - user_agent_string: 'podracer v1.4.1; GNU/Linux; x86_64' + family: 'podracer' + major: '1' + minor: '4' + patch: '1' + - user_agent_string: 'Kinoma5' + family: 'Kinoma' + major: '5' + minor: + patch: + - user_agent_string: 'QuickTime/7.6' + family: 'QuickTime' + major: '7' + minor: '6' + patch: + - user_agent_string: 'QuickTime.7.6.6' + family: 'QuickTime' + major: '7' + minor: '6' + patch: '6' + - user_agent_string: 'QuickNews/1.25' + family: 'QuickNews' + major: '1' + minor: '25' + patch: + - user_agent_string: 'Mozilla/5.0 (Linux; U; Windows NT 6.1; en-us; dream) DoggCatcher' + family: 'DoggCatcher' + major: + minor: + patch: + - user_agent_string: 'DoggCatcher/1.2' + family: 'DoggCatcher' + major: '1' + minor: '2' + patch: diff --git a/tests/mocha.opts b/tests/mocha.opts new file mode 100644 index 00000000..700bbc48 --- /dev/null +++ b/tests/mocha.opts @@ -0,0 +1,3 @@ +--ui tdd +--reporter min +--check-leaks diff --git a/tests/regexes.js b/tests/regexes.js new file mode 100644 index 00000000..79ab0c71 --- /dev/null +++ b/tests/regexes.js @@ -0,0 +1,36 @@ +'use strict' + +var assert = require('assert') +var path = require('path') +var fs = require('fs') +var yaml = require('yamlparser') +var regexes = readYAML('../regexes.yaml') +var safe = require('safe-regex') +var refImpl = require('uap-ref-impl') + +function readYAML (fileName) { + var file = path.join(__dirname, fileName) + var data = fs.readFileSync(file, 'utf8') + return yaml.eval(data) +} + +suite('regexes', function () { + Object.keys(regexes).forEach(function (parser) { + suite(parser, function () { + regexes[parser].forEach(function(item) { + test(item.regex, function () { + assert.ok(safe(item.regex)) + }) + }) + }) + }) + + test('should not backtrack', function () { + var parse = refImpl(regexes).parse + var ua = Array(3200).fill('a').join('') + var start = Date.now() + parse(ua) + var diff = Date.now() - start + assert.ok(diff < 500, diff) + }) +}) diff --git a/tests/sample.js b/tests/sample.js new file mode 100644 index 00000000..e7f49aed --- /dev/null +++ b/tests/sample.js @@ -0,0 +1,17 @@ +'use strict' + +var path = require('path') +var fs = require('fs') +var yaml = require('yamlparser') +var refImpl = require('uap-ref-impl')(readYAML('../regexes.yaml')) + +function readYAML (fileName) { + var file = path.join(__dirname, fileName) + var data = fs.readFileSync(file, 'utf8') + return yaml.eval(data) +} + +if (require.main === module) { + var user_agent_string = process.argv[2] + console.log(refImpl.parse(user_agent_string)) +} diff --git a/tests/test.js b/tests/test.js index c4a8ee7a..ae23dfe9 100644 --- a/tests/test.js +++ b/tests/test.js @@ -14,7 +14,8 @@ function msg(name, actual, expected) { return "Expected " + name + " to be " + JSON.stringify(expected) + " got " + JSON.stringify(actual) + " instead."; } -['../test_resources/firefox_user_agent_strings.yaml', '../tests/test_ua.yaml', '../test_resources/pgts_browser_list.yaml'].forEach(function(fileName) { +['../test_resources/firefox_user_agent_strings.yaml', '../tests/test_ua.yaml', '../test_resources/pgts_browser_list.yaml', + '../test_resources/opera_mini_user_agent_strings.yaml','../test_resources/podcasting_user_agent_strings.yaml'].forEach(function(fileName) { var fixtures = readYAML(fileName).test_cases; suite(fileName, function() { fixtures.forEach(function(f) { diff --git a/tests/test_device.yaml b/tests/test_device.yaml index 87d5abbe..bc3fdf32 100644 --- a/tests/test_device.yaml +++ b/tests/test_device.yaml @@ -1,5 +1,20 @@ test_cases: + - user_agent_string: 'atc/1.0 watchOS/5.1.3 model/Watch3,4 hwp/t8004 build/16S535 (6; dt:156)' + family: 'Apple Watch' + brand: 'Apple' + model: 'Apple Watch 3,4' + + - user_agent_string: 'atc/1.0 watchOS/5.2 model/Watch4,4 hwp/t8006 build/16T225 (6; dt:193)' + family: 'Apple Watch' + brand: 'Apple' + model: 'Apple Watch 4,4' + + - user_agent_string: '(null)/(null) watchOS/5.1.1 model/Watch3,3 hwp/t8004 build/16R600 (6; dt:155)' + family: 'Apple Watch' + brand: 'Apple' + model: 'Apple Watch 3,3' + - user_agent_string: 'ALCATEL-OT510A/382 ObigoInternetBrowser/Q05A' family: 'Alcatel OT510A' brand: 'Alcatel' @@ -90,6 +105,16 @@ test_cases: brand: 'Apple' model: 'iPhone' + - user_agent_string: 'AppleCoreMedia/1.0.0.16R5303d (Apple Watch; U; CPU OS 5_0 like Mac OS X; en_au)' + family: 'Apple Watch' + brand: 'Apple' + model: 'Apple Watch' + + - user_agent_string: 'AppleCoreMedia/1.0.0.16A303 (HomePod; U; CPU OS 12_0 like Mac OS X; en_us)' + family: 'HomePod' + brand: 'Apple' + model: 'HomePod' + - user_agent_string: 'Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5' family: 'iPod' brand: 'Apple' @@ -100,6 +125,11 @@ test_cases: brand: 'Apple' model: 'iPod' + - user_agent_string: 'Mozilla/5.0 (iPod touch; CPU iPhone OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13F69' + family: 'iPod' + brand: 'Apple' + model: 'iPod' + - user_agent_string: 'Mozilla/4.0 (compatible; Linux 2.6.10) NetFront/3.3 Kindle/1.0 (screen 600x800)' family: 'Kindle' brand: 'Amazon' @@ -200,6 +230,11 @@ test_cases: brand: 'LG' model: 'Nexus 5' + - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36' + family: 'Nexus 5X' + brand: 'LG' + model: 'Nexus 5X' + - user_agent_string: 'Bunjalloo/0.7.6(Nintendo DS;U;en)' family: 'Nintendo DS' brand: 'Nintendo' @@ -351,9 +386,9 @@ test_cases: model: - user_agent_string: 'MQQBrowser/371 Mozilla/5.0 (iPhone 4S; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10A523 Safari/7534.48.3' - family: 'Generic Smartphone' - brand: 'Generic' - model: 'Smartphone' + family: 'iPhone' + brand: 'Apple' + model: 'iPhone' - user_agent_string: 'Opera/9.80 (VRE; Opera Mini/4.2/28.2794; U; en) Presto/2.8.119 Version/11.10' family: 'Generic Feature Phone' @@ -620,6 +655,51 @@ test_cases: brand: 'Spider' model: 'Desktop' + - user_agent_string: 'NL-Crawler' + family: 'Spider' + brand: 'Spider' + model: 'Desktop' + + - user_agent_string: 'Pingdom.com_bot_version_1.4_(http://www.pingdom.com/)' + family: 'Spider' + brand: 'Spider' + model: 'Desktop' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko PTST/1.0' + family: 'Spider' + brand: 'Spider' + model: + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.0 Safari/537.36 PTST/1.0' + family: 'Spider' + brand: 'Spider' + model: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4) Build/MPJ24.139-64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Mobile Safari/537.36 PTST/180521.140508' + family: 'Spider' + brand: 'Spider' + model: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4) Build/MPJ24.139-64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Mobile Safari/537.36 PTST/391' + family: 'Spider' + brand: 'Spider' + model: + + - user_agent_string: 'Mozilla/5.0 (X11; Datanyze; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36' + family: 'Spider' + brand: 'Spider' + model: + + - user_agent_string: 'Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PingdomTMS/0.8.5 Safari/534.34' + family: 'Spider' + brand: 'Spider' + model: 'Desktop' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/98 Safari/537.4 (StatusCake)' + family: 'Spider' + brand: 'Spider' + model: 'Desktop' + - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.0.4; SAMSUNG-SGH-I717 Build/IMM76D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.131 Mobile Safari/537.36' family: 'Samsung SGH-I717' brand: 'Samsung' @@ -3926,172 +4006,172 @@ test_cases: model: 'AppleTV' - user_agent_string: 'Mozilla/5.0 (iPad compatibility; U; CPU iPhone OS 5_1_1 like Mac OS X; HW iPad1,1; de_de) AppleWebKit/525.18.1 (KHTML, like Gecko) (AdMob-iSDK-20100614; iphoneos4.2)' - family: 'iPad1,1' + family: 'iPad' brand: 'Apple' model: 'iPad1,1' - user_agent_string: 'Mozilla/5.0 (iPad2,1; iPad; U; CPU OS 6_1_3 like Mac OS X; de_DE) com.google.GooglePlus/23341 (KHTML, like Gecko) Mobile/K93AP (gzip)' - family: 'iPad2,1' + family: 'iPad' brand: 'Apple' model: 'iPad2,1' - user_agent_string: 'Mozilla/5.0 (iPad compatibility; U; CPU iPhone OS 4_3_3 like Mac OS X; HW iPad2,2; de_de) AppleWebKit/525.18.1 (KHTML, like Gecko) (AdMob-iSDK-20100614; iphoneos4.1)' - family: 'iPad2,2' + family: 'iPad' brand: 'Apple' model: 'iPad2,2' - user_agent_string: 'Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/11A465 [FBAN/FBIOS;FBAV/8.0.0.28.18;FBBV/1665515;FBDV/iPad2,3;FBMD/iPad;FBSN/iPhone OS;FBSV/7.0;FBSS/1; FBCR/Verizon;FBID/tablet;FBLC/de_DE;FBOP/1]' - family: 'iPad2,3' + family: 'iPad' brand: 'Apple' model: 'iPad2,3' - user_agent_string: 'Mozilla/5.0 (iPad2,4; iPad; U; CPU OS 7_0_4 like Mac OS X; de_DE) com.google.GooglePlus/29676 (KHTML, like Gecko) Mobile/K93aAP (gzip)' - family: 'iPad2,4' + family: 'iPad' brand: 'Apple' model: 'iPad2,4' - user_agent_string: 'Mozilla/5.0 (iPad2,5; iPad; U; CPU OS 7_0_4 like Mac OS X; de_DE) com.google.GooglePlus/29676 (KHTML, like Gecko) Mobile/P105AP (gzip)' - family: 'iPad2,5' + family: 'iPad' brand: 'Apple' model: 'iPad2,5' - user_agent_string: 'Mozilla/5.0 (iPad; CPU OS 6_1_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B147 [FBAN/FBIOS;FBAV/6.2;FBBV/228172;FBDV/iPad2,6;FBMD/iPad;FBSN/iPhone OS;FBSV/6.1.2;FBSS/1; FBCR/Carrier;FBID/tablet;FBLC/en_US;FBOP/1]' - family: 'iPad2,6' + family: 'iPad' brand: 'Apple' model: 'iPad2,6' - user_agent_string: 'Mozilla/5.0 (iPad2,7; iOS 7.0.3) FreeWheelAdManager/5.8.3-r10206-201309100316;com.vevo.iphone VEVO/6025' - family: 'iPad2,7' + family: 'iPad' brand: 'Apple' model: 'iPad2,7' - user_agent_string: 'Mozilla/5.0 (iPad3,1; iPad; U; CPU OS 7_0_4 like Mac OS X; de_DE) com.google.GooglePlus/29676 (KHTML, like Gecko) Mobile/J1AP (gzip)' - family: 'iPad3,1' + family: 'iPad' brand: 'Apple' model: 'iPad3,1' - user_agent_string: 'Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B206 [FBAN/FBIOS;FBAV/5.4.2;FBBV/114387;FBDV/iPad3,2;FBMD/iPad;FBSN/iPhone OS;FBSV/5.1.1;FBSS/2; FBCR/Carrier;FBID/tablet;FBLC/en_US]' - family: 'iPad3,2' + family: 'iPad' brand: 'Apple' model: 'iPad3,2' - user_agent_string: 'Mozilla/5.0 (iPad3,4; iPad; U; CPU OS 7_0_4 like Mac OS X; de_DE) com.google.GooglePlus/29676 (KHTML, like Gecko) Mobile/P101AP (gzip)' - family: 'iPad3,4' + family: 'iPad' brand: 'Apple' model: 'iPad3,4' - user_agent_string: 'Mozilla/5.0 (iPad; CPU OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10A8426 [FBAN/FBIOS;FBAV/7.0.0.17.1;FBBV/1325030;FBDV/iPad3,5;FBMD/iPad;FBSN/iPhone OS;FBSV/6.0.1;FBSS/2; FBCR/AT&T;FBID/tablet;FBLC/en_US;FBOP/1]' - family: 'iPad3,5' + family: 'iPad' brand: 'Apple' model: 'iPad3,5' - user_agent_string: 'Mozilla/5.0 (iPad3,6; iPad; U; CPU OS 7_0_4 like Mac OS X; de_DE) com.google.GooglePlus/29676 (KHTML, like Gecko) Mobile/P103AP (gzip)' - family: 'iPad3,6' + family: 'iPad' brand: 'Apple' model: 'iPad3,6' - user_agent_string: 'Mozilla/5.0 (iPad4,1; iPad; U; CPU OS 7_0_6 like Mac OS X; de_DE) com.google.GooglePlus/29676 (KHTML, like Gecko) Mobile/J71AP (gzip)' - family: 'iPad4,1' + family: 'iPad' brand: 'Apple' model: 'iPad4,1' - user_agent_string: 'Mozilla/5.0 (iPad4,2; iPad; U; CPU OS 7_0_4 like Mac OS X; de_DE) com.google.GooglePlus/29676 (KHTML, like Gecko) Mobile/J72AP (gzip)' - family: 'iPad4,2' + family: 'iPad' brand: 'Apple' model: 'iPad4,2' - user_agent_string: 'Mozilla/5.0 (iPad4,4; iPad; U; CPU OS 7_0_4 like Mac OS X; de_DE) com.google.GooglePlus/29676 (KHTML, like Gecko) Mobile/J85AP (gzip)' - family: 'iPad4,4' + family: 'iPad' brand: 'Apple' model: 'iPad4,4' - user_agent_string: 'Mozilla/5.0 (iPad4,5; iOS 7.0.4) FreeWheelAdManager/5.3.0-r9485-201301220720;com.cnn.iphone CNN/4622' - family: 'iPad4,5' + family: 'iPad' brand: 'Apple' model: 'iPad4,5' - user_agent_string: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1 like Mac OS X; HW iPhone1,1; de_de) AppleWebKit/525.18.1 (KHTML, like Gecko) (AdMob-iSDK-20090617)' - family: 'iPhone1,1' + family: 'iPhone' brand: 'Apple' model: 'iPhone1,1' - user_agent_string: 'Mozilla/5.0 (iPhone; U; CPU iPhone 4_2_1 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Mobile/7E18 Grindr/1.8.5 (iPhone1,2/4.2.1)' - family: 'iPhone1,2' + family: 'iPhone' brand: 'Apple' model: 'iPhone1,2' - user_agent_string: 'Mozilla/5.0 (iPhone2,1; iOS 4.3.5) FreeWheelAdManager/4.6.5-r8099-201204100535;com.vevo.iphone VEVO/5661' - family: 'iPhone2,1' + family: 'iPhone' brand: 'Apple' model: 'iPhone2,1' - user_agent_string: 'Mozilla/5.0 (iPhone3,1; iOS 6.1.3) FreeWheelAdManager/5.3.0-r9485-201301220720;com.cnn.iphone CNN/4254' - family: 'iPhone3,1' + family: 'iPhone' brand: 'Apple' model: 'iPhone3,1' - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10A523 [FBAN/FBIOS;FBAV/5.5;FBBV/123337;FBDV/iPhone3,2;FBMD/iPhone;FBSN/iPhone OS;FBSV/6.0.1;FBSS/2; FBCR/o2-de;FBID/phone;FBLC/de_DE;FBOP/0]' - family: 'iPhone3,2' + family: 'iPhone' brand: 'Apple' model: 'iPhone3,2' - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B206 [FBAN/FBIOS;FBAV/5.2.2;FBBV/82131;FBDV/iPhone3,3;FBMD/iPhone;FBSN/iPhone OS;FBSV/5.1.1;FBSS/2; FBCR/Verizon;FBID/phone;FBLC/de_DE]' - family: 'iPhone3,3' + family: 'iPhone' brand: 'Apple' model: 'iPhone3,3' - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0 [FBAN/FBIOS;FBAV/8.0.0.28.18;FBBV/1665515;FBDV/iPhone4,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/7.0.4;FBSS/2; FBCR/Telekom.de;FBID/phone;FBLC/de_DE;FBOP/5]' - family: 'iPhone4,1' + family: 'iPhone' brand: 'Apple' model: 'iPhone4,1' - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10A405 [FBAN/FBIOS;FBAV/6.8;FBBV/745892;FBDV/iPhone5,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/6.0;FBSS/2; FBCR/Carrier;FBID/phone;FBLC/en_US;FBOP/5]' - family: 'iPhone5,1' + family: 'iPhone' brand: 'Apple' model: 'iPhone5,1' - user_agent_string: 'Mozilla/5.0 (iPhone5,2; iOS 7.0.3) FreeWheelAdManager/5.8.3-r10206-201309100316;com.vevo.iphone VEVO/5987' - family: 'iPhone5,2' + family: 'iPhone' brand: 'Apple' model: 'iPhone5,2' - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/11A466 [FBAN/FBIOS;FBAV/6.7.2;FBBV/603804;FBDV/iPhone5,3;FBMD/iPhone;FBSN/iPhone OS;FBSV/7.0;FBSS/2; FBCR/o2-de;FBID/phone;FBLC/es_ES;FBOP/5]' - family: 'iPhone5,3' + family: 'iPhone' brand: 'Apple' model: 'iPhone5,3' - user_agent_string: 'Mozilla/5.0 (iPhone5,4; iPhone; U; CPU OS 7_0_5 like Mac OS X; de_AT) com.google.GooglePlus/29676 (KHTML, like Gecko) Mobile/N49AP (gzip)' - family: 'iPhone5,4' + family: 'iPhone' brand: 'Apple' model: 'iPhone5,4' - user_agent_string: 'Mozilla/5.0 (iPhone6,1; iPhone; U; CPU OS 7_0_4 like Mac OS X; ar_SA) com.google.GooglePlus/29676 (KHTML, like Gecko) Mobile/N51AP (gzip)' - family: 'iPhone6,1' + family: 'iPhone' brand: 'Apple' model: 'iPhone6,1' - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0 [FBAN/FBIOS;FBAV/7.0.0.17.1;FBBV/1325030;FBDV/iPhone6,2;FBMD/iPhone;FBSN/iPhone OS;FBSV/7.0.6;FBSS/2; FBCR/Telekom.de;FBID/phone;FBLC/de_DE;FBOP/5]' - family: 'iPhone6,2' + family: 'iPhone' brand: 'Apple' model: 'iPhone6,2' - user_agent_string: 'Mozilla/5.0 (iPhone; U; CPU iPhone 4_2_1 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Mobile/7E18 Grindr/1.8.5 (iPod2,1/4.2.1)' - family: 'iPod2,1' + family: 'iPod' brand: 'Apple' model: 'iPod2,1' - user_agent_string: 'Mozilla/5.0 (iPhone; U; CPU iPhone 5_1_1 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Mobile/7E18 Grindr/1.8.8 (iPod3,1/5.1.1)' - family: 'iPod3,1' + family: 'iPod' brand: 'Apple' model: 'iPod3,1' - user_agent_string: 'Mozilla/5.0 (iPhone; U; CPU iPhone 6_1_3 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Mobile/7E18 Grindr/1.8.8 (iPod4,1/6.1.3)' - family: 'iPod4,1' + family: 'iPod' brand: 'Apple' model: 'iPod4,1' - user_agent_string: 'Mozilla/5.0 (iPod touch; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/11A4449d [FBAN/FBIOS;FBAV/6.4;FBBV/290891;FBDV/iPod5,1;FBMD/iPod touch;FBSN/iPhone OS;FBSV/7.0;FBSS/2; FBCR/;FBID/phone;FBLC/de_DE;FBOP/1]' - family: 'iPod5,1' + family: 'iPod' brand: 'Apple' model: 'iPod5,1' @@ -11405,6 +11485,56 @@ test_cases: brand: 'Generic_Android' model: 'S300' + - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 2.1-update1; Ar-kw; EQ U8110) AppleWebKit/530.17 (KHTML, Like Gecko) Version/4.0 Mobile Safari/530.17' + family: 'EQ U8110' + brand: 'Generic_Android' + model: 'EQ U8110' + + - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 2.1-update1; Cs-cz; Zt180) AppleWebKit/530.17 (KHTML, Like Gecko) Version/4.0 Mobile Safari/530.17' + family: 'Zt180' + brand: 'Generic_Android' + model: 'Zt180' + + - user_agent_string: 'Mozilla 5.0 (Linux; U; Android 2.2.1; zh-cn; 3GC101) UC AppleWebKit 534.31 (KHTML, like Gecko) Mobile Safari 534.31' + family: '3GC101' + brand: 'Generic_Android' + model: '3GC101' + + - user_agent_string: 'Mozilla 5.0 (Linux; U; Android 2.3.1; zh-cn; Newpad-K97) UC AppleWebKit 534.31 (KHTML, like Gecko) Mobile Safari 534.31' + family: 'Newpad-K97' + brand: 'Generic_Android' + model: 'Newpad-K97' + + - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 4.0.3; -; PP4MT-7) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' + family: 'PP4MT-7' + brand: 'Generic_Android' + model: 'PP4MT-7' + + - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 4.0.3; -; PP4MT-9) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' + family: 'PP4MT-9' + brand: 'Generic_Android' + model: 'PP4MT-9' + + - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 2.2.1; id; AD350) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1 UCBrowser/8.7.0.315 Ponsel' + family: 'AD350' + brand: 'Generic_Android' + model: 'AD350' + + - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 2.2.1; -us; Ally) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' + family: 'Ally' + brand: 'Generic_Android' + model: 'Ally' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 2.3.4; A9100) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 OPR/14.0.1074.57768' + family: 'A9100' + brand: 'Generic_Android' + model: 'A9100' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 2.3.3; S300) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.123 Mobile Safari/537.22 OPR/14.0.1025.53005' + family: 'S300' + brand: 'Generic_Android' + model: 'S300' + - user_agent_string: 'Mozilla/5.0 (DTV) NetFront/3.4 InettvBrowser/2.2 (08001F;DTV03VSFC;0002;0001)' family: 'Inettv' brand: 'Generic_Inettv' @@ -22715,6 +22845,11 @@ test_cases: brand: 'Huawei' model: 'P6' + - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 6P Build/MHC19Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.89 Mobile Safari/537.36' + family: 'Huawei Nexus 6P' + brand: 'Huawei' + model: 'Nexus 6P' + - user_agent_string: 'Huaweisymantecspider (compatible; MSIE 8.0; DSE-support@huaweisymantec.com)' family: 'Huawei symantecspider' brand: 'Huawei' @@ -58000,6 +58135,16 @@ test_cases: brand: 'Samsung' model: 'GT-S8600-ORANGE' + - user_agent_string: 'Mozilla/5.0 (Linux; Android 8.0.0; SM-G9500) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Mobile Safari/537.36' + family: 'Samsung SM-G9500' + brand: 'Samsung' + model: 'SM-G9500' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G9500 Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/9.3 Chrome/67.0.3396.87 Mobile Safari/537.36' + family: 'Samsung SM-G9500' + brand: 'Samsung' + model: 'SM-G9500' + - user_agent_string: 'UCWEB/2.0 (Symbian; U; S60 V5; Pt-BR; SamsungI8910) U2/1.0.0 UCBrowser/8.9.0.277 U2/1.0.0 Mobile' family: 'Samsung I8910' brand: 'Samsung' @@ -77360,6 +77505,41 @@ test_cases: brand: 'XiaoMi' model: 'MI-ONE Plus' + - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 4.4.4; zh-cn; HM 2A Build/KTU84Q) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/42.0.0.0 Mobile Safari/537.36 XiaoMi/MiuiBrowser/2.1.1' + family: 'XiaoMi HM 2A' + brand: 'XiaoMi' + model: 'HM 2A' + + - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 4.4.4; zh-cn; HM NOTE 1LTE Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36 XiaoMi/MiuiBrowser/2.1.1' + family: 'XiaoMi HM NOTE 1LTE' + brand: 'XiaoMi' + model: 'HM NOTE 1LTE' + + - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 5.0.2; zh-cn; MI NOTE Pro Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/42.0.0.0 Mobile Safari/537.36 XiaoMi/MiuiBrowser/2.1.1' + family: 'XiaoMi MI NOTE Pro' + brand: 'XiaoMi' + model: 'MI NOTE Pro' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.0.2; Redmi Note 2 Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36 ssy={Android;ECalendar;V6.1.8;xiaomi;101181501;WIFI}' + family: 'XiaoMi Redmi Note 2' + brand: 'XiaoMi' + model: 'Redmi Note 2' + + - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 8.0.0; zh-cn; MIX Build/OPR1.170623.032) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.128 Mobile Safari/537.36 XiaoMi/MiuiBrowser/10.1.1' + family: 'XiaoMi MIX' + brand: 'XiaoMi' + model: 'MIX' + + - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 9; MIX 2S Build/PKQ1.180729.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.128 Mobile Safari/537.36 XiaoMi/MiuiBrowser/10.7.3' + family: 'XiaoMi MIX 2S' + brand: 'XiaoMi' + model: 'MIX 2S' + + - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 8.0.0; zh-cn; MIX 2 Build/OPR1.170623.027) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.128 Mobile Safari/537.36 XiaoMi/MiuiBrowser/10.1.1' + family: 'XiaoMi MIX 2' + brand: 'XiaoMi' + model: 'MIX 2' + - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.1.1; XOLO A1000 Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' family: 'Xolo A1000' brand: 'Xolo' @@ -79705,6 +79885,16 @@ test_cases: brand: 'Spider' model: 'Desktop' + - user_agent_string: 'Mozilla/5.0 (compatible; Yeti/1.1; +http://naver.me/spd)' + family: 'Spider' + brand: 'Spider' + model: 'Desktop' + + - user_agent_string: 'Mozilla/5.0 (compatible; Daum/4.1; +http://cs.daum.net/faq/15/4118.html?faqId=28966)' + family: 'Spider' + brand: 'Spider' + model: 'Desktop' + - user_agent_string: 'NewsGator FetchLinks extension/0.2.0 (http://graemef.com)' family: 'Spider' brand: 'Spider' @@ -79744,3 +79934,273 @@ test_cases: family: 'Generic Smartphone' brand: 'Generic' model: 'Smartphone' + + - user_agent_string: 'Roku/DVP-6.2 (096.02E06005A)' + family: 'Roku' + brand: 'Generic_Inettv' + model: 'Roku' + + - user_agent_string: 'Roku/DVP-5.0 (025.00E08043A)' + family: 'Roku' + brand: 'Generic_Inettv' + model: 'Roku' + + - user_agent_string: 'Roku/DVP-5.1 (025.01E01195A)' + family: 'Roku' + brand: 'Generic_Inettv' + model: 'Roku' + + - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.2; MI PAD MIUI/KXFCNBF2.0)' + family: 'XiaoMi MI PAD' + brand: 'XiaoMi' + model: 'MI PAD' + + - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.2; MI PAD MIUI/KXFCNBF3.0)' + family: 'XiaoMi MI PAD' + brand: 'XiaoMi' + model: 'MI PAD' + + - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.2; MI PAD MIUI/KXFCNBF5.0)' + family: 'XiaoMi MI PAD' + brand: 'XiaoMi' + model: 'MI PAD' + + - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.4; MI PAD MIUI/4.11.28)' + family: 'XiaoMi MI PAD' + brand: 'XiaoMi' + model: 'MI PAD' + + - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.4; MI PAD MIUI/4.12.19)' + family: 'XiaoMi MI PAD' + brand: 'XiaoMi' + model: 'MI PAD' + + - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.4; MI PAD MIUI/4.8.22)' + family: 'XiaoMi MI PAD' + brand: 'XiaoMi' + model: 'MI PAD' + + - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.4; MI PAD MIUI/5.1.16)' + family: 'XiaoMi MI PAD' + brand: 'XiaoMi' + model: 'MI PAD' + + - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.4; MI PAD MIUI/5.1.23)' + family: 'XiaoMi MI PAD' + brand: 'XiaoMi' + model: 'MI PAD' + + - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.4; MI PAD MIUI/5.1.9)' + family: 'XiaoMi MI PAD' + brand: 'XiaoMi' + model: 'MI PAD' + + - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.4; MI PAD MIUI/5.10.22)' + family: 'XiaoMi MI PAD' + brand: 'XiaoMi' + model: 'MI PAD' + + - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.4; MI PAD MIUI/5.10.8)' + family: 'XiaoMi MI PAD' + brand: 'XiaoMi' + model: 'MI PAD' + + - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.4; MI PAD MIUI/5.11.1)' + family: 'XiaoMi MI PAD' + brand: 'XiaoMi' + model: 'MI PAD' + + - user_agent_string: 'Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.41 (KHTML, like Gecko) Large Screen WebAppManager Safari/537.41' + family: 'LG Web0S SmartTV' + brand: 'LG' + model: 'Web0S SmartTV' + + - user_agent_string: 'Mozilla/5.0+(iPhone;+CPU+iPhone+OS+9_3_1+like+Mac+OS+X)+AppleWebKit/601.1.46+(KHTML,+like+Gecko)+Version/9.0+Mobile/13E238+Safari/601.1' + family: 'iPhone' + brand: 'Apple' + model: 'iPhone' + + - user_agent_string: 'Mozilla/5.0+(iPad;+CPU+OS+9_3_1+like+Mac+OS+X)+AppleWebKit/601.1.46+(KHTML,+like+Gecko)+Version/9.0+Mobile/13E238+Safari/601.1' + family: 'iPad' + brand: 'Apple' + model: 'iPad' + + - user_agent_string: 'Mozilla/5.0 (iPad; CPU OS 10_0_2 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Mobile/14A456 [FBAN/FBIOS;FBAV/68.0.0.49.70;FBBV/41924288;FBRV/0;FBDV/iPad4,1;FBMD/iPad;FBSN/iOS;FBSV/10.0.2;FBSS/2;FBCR/;FBID/tablet;FBLC/en_US;FBOP/5]' + family: 'iPad' + brand: 'Apple' + model: 'iPad4,1' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534+ (KHTML, like Gecko) BingPreview/1.0b' + family: 'Spider' + brand: 'Spider' + model: 'Desktop' + + - user_agent_string: 'Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 530) like Gecko BingPreview/1.0b' + family: 'Spider' + brand: 'Spider' + model: 'Smartphone' + + - user_agent_string: 'Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots)' + family: 'Spider' + brand: 'Spider' + model: 'Desktop' + + - user_agent_string: 'Slack-ImgProxy 1.136 (+https://api.slack.com/robots)' + family: 'Spider' + brand: 'Spider' + model: 'Desktop' + + - user_agent_string: 'Mozilla/5.0 (SMART-TV; Linux; Tizen 2.3) AppleWebkit/538.1 (KHTML, like Gecko) SamsungBrowser/1.0 TV Safari/538.1' + family: 'Samsung SMART-TV' + brand: 'Samsung' + model: 'SMART-TV' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; ATH-AL00 Build/HONORATH-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.124 Mobile Safari/537.36 JsKit/1.0 (Android) SohuNews/5.7.3 BuildCode/113' + family: 'Huawei ATH-AL00' + brand: 'Huawei' + model: 'ATH-AL00' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; ONEPLUS A3010 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.91 Mobile Safari/537.36' + family: 'OnePlus ONEPLUS A3010' + brand: 'OnePlus' + model: 'ONEPLUS A3010' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.1.1; ONE E1003 Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.91 Mobile Safari/537.36' + family: 'OnePlus ONE E1003' + brand: 'OnePlus' + model: 'ONE E1003' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 8.1.0; Pixel Build/OPM1.171019.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36' + family: 'Pixel' + brand: 'Google' + model: 'Pixel' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; Pixel C Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2743.98 Safari/537.36' + family: 'Pixel C' + brand: 'Google' + model: 'Pixel C' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.1.1; Pixel XL Build/NMF26F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.91 Mobile Safari/537.36' + family: 'Pixel XL' + brand: 'Google' + model: 'Pixel XL' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.125 Mobile Safari/537.36' + family: 'Pixel 2' + brand: 'Google' + model: 'Pixel 2' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.0; RCT6773W22B Build/LRX21M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.85' + family: 'RCT6773W22B' + brand: 'RCA' + model: 'RCT6773W22B' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.4.2; RCA G1 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36' + family: 'RCA G1' + brand: 'RCA' + model: 'G1' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.4.2; SC-01F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.105 Mobile Safari/537.36' + family: 'Samsung SC-01F' + brand: 'Samsung' + model: 'SC-01F' + + - user_agent_string: 'WhatsApp/2.17.70 W' + family: 'Spider' + brand: 'Spider' + model: 'Desktop' + + - user_agent_string: 'masscan/1.0 (https://github.com/robertdavidgraham/masscan)' + family: 'Spider' + brand: 'Spider' + model: 'Desktop' + + - user_agent_string: 'MobileSafari/602.1 CFNetwork/808.1.4 Darwin/16.1.0' + family: 'iOS-Device' + brand: 'Apple' + model: 'iOS-Device' + + - user_agent_string: 'Safari/12602.2.14.0.7 CFNetwork/807.1.3 Darwin/16.1.0 (x86_64)' + family: 'Mac' + brand: 'Apple' + model: 'Mac' + + - user_agent_string: 'netbarrierd/572 CFNetwork/673.5 Darwin/13.4.0 (x86_64) (MacBookPro11%2C1)' + family: 'MacBookPro11,1' + brand: 'Apple' + model: 'MacBookPro11,1' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; EVA-AL10 Build/HUAWEIEVA-AL10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36' + family: 'EVA-AL10' + brand: 'Huawei' + model: 'EVA-AL10' + + - user_agent_string: 'Google Web Preview' + family: 'Spider' + brand: 'Spider' + model: 'Desktop' + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko; Google Web Preview) Chrome/27.0 .1453 Safari/537.36.' + family: 'Spider' + brand: 'Spider' + model: 'Desktop' + + - user_agent_string: 'Mozilla/5.0 (compatible; Qwantify/2.4w; +https://www.qwant.com/)/2.4w' + family: 'Spider' + brand: 'Spider' + model: 'Desktop' + + - user_agent_string: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; rv:11; NOKIA; Lumia 920) like Gecko' + family: 'Lumia 920' + brand: 'Nokia' + model: 'Lumia 920' + + - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 5.1; zh-cn; Build/LMY47D ) AppleWebKit/534.30 (KHTML,like Gecko) Version/5.1 Mobile Safari/534.30 GIONEE-GN3003/GN3003 RV/5.0.16 GNBR/5.1.0.cg Id/8D83E4532006ACCE31D712F4F73C8C70' + family: 'Gionee GN3003' + brand: 'Gionee' + model: 'GN3003' + + - user_agent_string: 'Mozilla/5.0 (iPhone## CPU iPhone OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Mobile/14C92' + family: 'iPhone' + brand: 'Apple' + model: 'iPhone' + + - user_agent_string: 'Mozilla/5.0 (Android) ownCloud-android/2.0.0' + family: 'Generic Smartphone' + brand: 'Generic' + model: 'Smartphone' + + - user_agent_string: 'Outlook-iOS/665.29827.prod.iphone (2.63.0)' + family: 'iPhone' + brand: 'Apple' + model: 'iPhone' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; LG-TP260 Build/NRD90U; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/64.0.3282.137 Mobile Safari/537.36 Instagram 33.0.0.11.92 Android (24/7.0; 320dpi; 720x1193; LGE/lge; LG-TP260; lv517; lv517; en_US; 93117667)' + family: 'LG-TP260' + brand: 'LG' + model: 'TP260' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_5 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Mobile/15D60 Instagram 33.0.0.11.96 (iPhone9,3; iOS 11_2_5; en_AU; en-AU; scale=2.00; gamut=wide; 750x1334)' + family: 'iPhone' + brand: 'Apple' + model: 'iPhone9,3' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Mobile/15D100 Flipboard/4.2.2' + family: 'iPhone' + brand: 'Apple' + model: 'iPhone' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-G610F Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/63.0.3239.111 Mobile Safari/537.36 Flipboard/4.1.9/4323,4.1.9.4323' + family: 'Samsung SM-G610F' + brand: 'Samsung' + model: 'SM-G610F' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-G930F Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/64.0.3282.137 Mobile Safari/537.36 Onefootball/Android/9.10.6' + family: 'Samsung SM-G930F' + brand: 'Samsung' + model: 'SM-G930F' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-A520F Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36 Flipboard-Briefing/2.7.28' + family: 'Samsung SM-A520F' + brand: 'Samsung' + model: 'SM-A520F' diff --git a/tests/test_os.yaml b/tests/test_os.yaml index 61f53541..047737e4 100644 --- a/tests/test_os.yaml +++ b/tests/test_os.yaml @@ -1,5 +1,26 @@ test_cases: + - user_agent_string: 'atc/1.0 watchOS/5.1.3 model/Watch3,4 hwp/t8004 build/16S535 (6; dt:156)' + family: 'WatchOS' + major: '5' + minor: '1' + patch: '3' + patch_minor: + + - user_agent_string: 'atc/1.0 watchOS/5.2 model/Watch4,4 hwp/t8006 build/16T225 (6; dt:193)' + family: 'WatchOS' + major: '5' + minor: '2' + patch: + patch_minor: + + - user_agent_string: '(null)/(null) watchOS/5.1.1 model/Watch3,3 hwp/t8004 build/16R600 (6; dt:155)' + family: 'WatchOS' + major: '5' + minor: '1' + patch: '1' + patch_minor: + - user_agent_string: 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.1.0-80) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true' family: 'Android' major: @@ -245,6 +266,13 @@ test_cases: patch: '2' patch_minor: + - user_agent_string: 'Mozilla/5.0 (iPod touch; CPU iPhone OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13F69' + family: 'iOS' + major: '9' + minor: '3' + patch: '2' + patch_minor: + - user_agent_string: 'MQQBrowser/371 Mozilla/5.0 (iPhone 4S; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10A523 Safari/7534.48.3' family: 'iOS' major: '6' @@ -371,6 +399,13 @@ test_cases: patch: patch_minor: + - user_agent_string: 'MacOutlook/16.12.0.180401 (Intelx64 Mac OS X Version 10.12.6 (build 16G29))' + family: 'Mac OS X' + major: '10' + minor: '12' + patch: '6' + patch_minor: + - user_agent_string: 'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13' family: 'MeeGo' major: @@ -413,6 +448,20 @@ test_cases: patch: patch_minor: + - user_agent_string: 'Mozilla/5.0 (X11; Datanyze; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36' + family: 'Linux' + major: + minor: + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko; Google Web Preview) Chrome/27.0 .1453 Safari/537.36.' + family: 'Linux' + major: + minor: + patch: + patch_minor: + - user_agent_string: 'Bunjalloo/0.7.6(Nintendo DS;U;en)' family: 'Other' major: @@ -715,99 +764,120 @@ test_cases: patch_minor: - user_agent_string: 'ICE Browser/5.05 (Java 1.4.0; Windows 2000 5.0 x86)' - family: 'Windows 2000' - major: + family: 'Windows' + major: '2000' minor: patch: patch_minor: - user_agent_string: 'NCSA_Mosaic/2.0 (Windows 3.1)' - family: 'Windows 3.1' - major: + family: 'Windows' + major: '3.1' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like Gecko' - family: 'Windows 10' - major: + family: 'Windows' + major: '10' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0' - family: 'Windows 10' - major: + family: 'Windows' + major: '10' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows NT 6.4; Trident/7.0; rv:11.0) like Gecko' - family: 'Windows 10' - major: + family: 'Windows' + major: '10' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36 Edge/12.0' - family: 'Windows 10' - major: + family: 'Windows' + major: '10' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows NT 6.4; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0' - family: 'Windows 10' - major: + family: 'Windows' + major: '10' minor: patch: patch_minor: - - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko' - family: 'Windows 8.1' - major: + - user_agent_string: 'PAN GlobalProtect/4.1.2-11 (Microsoft Windows 10 Pro , 64-bit)' + family: 'Windows' + major: '10' minor: patch: patch_minor: - - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3; ARM; WOW64; Trident/7.0; rv:11.0) like Gecko' - family: 'Windows RT 8.1' - major: + - user_agent_string: 'PAN GlobalProtect/5.0.0-87 (Microsoft Windows 10 Pro , 64-bit) Mozilla/5.0 (Windows NT 6.2; Win64; x64; Trident/7.0; rv:11.0) like Gecko' + family: 'Windows' + major: '10' minor: patch: patch_minor: + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko' + family: 'Windows' + major: '8' + minor: '1' + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3; ARM; WOW64; Trident/7.0; rv:11.0) like Gecko' + family: 'Windows' + major: 'RT 8' + minor: '1' + patch: + patch_minor: + - user_agent_string: 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.17) Gecko/20110414 Thunderbird/3.1.10 ThunderBrowse/3.3.5' - family: 'Windows 7' - major: + family: 'Windows' + major: '7' + minor: + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1; rv:45.0) Gecko/20100101 Thunderbird/45.0' + family: 'Windows' + major: '7' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.3a1) Gecko/20100208 MozillaDeveloperPreview/3.7a1 (.NET CLR 3.5.30729)' - family: 'Windows 7' - major: + family: 'Windows' + major: '7' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534+ (KHTML, like Gecko) FireWeb/1.0.0.0' - family: 'Windows 7' - major: + family: 'Windows' + major: '7' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows; U; Windows NT 6.1; zh_CN) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0 baidubrowser/1.x Safari/534.7' - family: 'Windows 7' - major: + family: 'Windows' + major: '7' minor: patch: patch_minor: - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; baidubrowser 1.x)' - family: 'Windows 7' - major: + family: 'Windows' + major: '7' minor: patch: patch_minor: @@ -841,85 +911,85 @@ test_cases: patch_minor: - user_agent_string: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)' - family: 'Windows 8' - major: + family: 'Windows' + major: '8' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)' - family: 'Windows RT' - major: + family: 'Windows' + major: 'RT' minor: patch: patch_minor: - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; chromeframe; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)' - family: 'Windows Vista' - major: + family: 'Windows' + major: 'Vista' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.17) Gecko/20110414 Lightning/1.0b3pre Thunderbird/3.1.10' - family: 'Windows XP' - major: + family: 'Windows' + major: 'XP' minor: patch: patch_minor: - user_agent_string: 'Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.5.24 Version/10.53' - family: 'Windows XP' - major: + family: 'Windows' + major: 'XP' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; BOLT/2.101) AppleWebKit/530 (KHTML, like Gecko) Version/4.0 Safari/530.17' - family: 'Windows XP' - major: + family: 'Windows' + major: 'XP' minor: patch: patch_minor: - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; chromeframe; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; Sleipnir 2.8.5)3.0.30729)' - family: 'Windows XP' - major: + family: 'Windows' + major: 'XP' minor: patch: patch_minor: - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6; chromeframe; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)' - family: 'Windows XP' - major: + family: 'Windows' + major: 'XP' minor: patch: patch_minor: - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6; .NET CLR 2.0.50727; .NET CLR 1.1.4322)' - family: 'Windows XP' - major: + family: 'Windows' + major: 'XP' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) RockMelt/0.8.34.841 Chrome/6.0.472.63 Safari/534.3' - family: 'Windows XP' - major: + family: 'Windows' + major: 'XP' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Comodo_Dragon/4.1.1.11 Chrome/4.1.249.1042 Safari/532.5' - family: 'Windows XP' - major: + family: 'Windows' + major: 'XP' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20110407 Firefox/4.0.3 PaleMoon/4.0.3' - family: 'Windows XP' - major: + family: 'Windows' + major: 'XP' minor: patch: patch_minor: @@ -932,8 +1002,8 @@ test_cases: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows; U; Win 9x 4.90; PL; rv:1.7.5) Gecko/20041217' - family: 'Windows ME' - major: + family: 'Windows' + major: 'ME' minor: patch: patch_minor: @@ -973,6 +1043,13 @@ test_cases: patch: patch_minor: + - user_agent_string: 'Mozilla/5.0 (Linux; U; Sailfish 3.0; Mobile; rv:45.0) Gecko/45.0 Firefox/45.0 SailfishBrowser/1.0' + family: 'Sailfish' + major: '3' + minor: '0' + patch: + patch_minor: + # up market model - user_agent_string: 'HbbTV/1.1.1 (;Samsung;SmartTV2013;T-FXPDEUC-1102.2;;) WebKit' family: 'Samsung' @@ -1053,6 +1130,13 @@ test_cases: patch: '4' patch_minor: + - user_agent_string: 'DAVdroid/1.9.2-gplay (2017/11/04; dav4android; okhttp3) Android/7.1.2' + family: 'Android' + major: '7' + minor: '1' + patch: '2' + patch_minor: + - user_agent_string: 'Mozilla/5.0 (SymbianOS 9.4; Series60/5.0 NokiaN97-1/10.0.012; Profile/MIDP-2.1 Configuration/CLDC-1.1; en-us) AppleWebKit/525 (KHTML, like Gecko) WicKed/7.1.12344' family: 'Symbian OS' major: '9' @@ -1628,106 +1712,106 @@ test_cases: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows U; Win NT 5.0; en-US; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2' - family: 'Windows NT' - major: + family: 'Windows' + major: 'NT' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows; N; WinNT; en-US; m14) Netscape6/6.0b1,gzip(gfe),gzip(gfe),gzip(gfe)' - family: 'Windows NT' - major: + family: 'Windows' + major: 'NT' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows; U; Win 9x 4.90; de; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7' - family: 'Windows ME' - major: + family: 'Windows' + major: 'ME' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows; U; Win 9x 4.90; en-CA; rv:0.9.4.1) Gecko/20020314 Netscape6/6.2.2' - family: 'Windows ME' - major: + family: 'Windows' + major: 'ME' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows; U; Win16; en-US; rv:1.7) Safari/85.5' - family: 'Windows 3.1' - major: + family: 'Windows' + major: '3.1' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows; U; Win3.1; en-US; rv:1.0.0) Gecko/20020530' - family: 'Windows 3.1' - major: + family: 'Windows' + major: '3.1' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows; U; Win3.11; en-US; rv:21.56.11.90) Gecko/20500230 Firefox/3.5' - family: 'Windows 3.1' - major: + family: 'Windows' + major: '3.1' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows; U; Win32; rv:1.6),gzip(gfe),gzip(gfe),gzip(gfe)' - family: 'Windows 95' - major: + family: 'Windows' + major: '95' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows; U; Win95; en-GB; rv:1.0.1) Gecko/20020823 Netscape/7.0' - family: 'Windows 95' - major: + family: 'Windows' + major: '95' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows; U; Win95; en-GB; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8' - family: 'Windows 95' - major: + family: 'Windows' + major: '95' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Windows; U; WindowsCE 5.2; en-US; rv:1.9.2a2pre) Gecko/20090904 Fennec/1.0a3' - family: 'Windows CE' - major: + family: 'Windows' + major: 'CE' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (WindowsCE 6.0; rv:2.0.1) Gecko Firefox/5.0.1' - family: 'Windows CE' - major: + family: 'Windows' + major: 'CE' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (WindowsCE 6.0; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 SeaMonkey/2.1.1' - family: 'Windows CE' - major: + family: 'Windows' + major: 'CE' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (WindowsCE 6.0; rv:2.1.1) Gecko/ Firefox/5.0.1' - family: 'Windows CE' - major: + family: 'Windows' + major: 'CE' minor: patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (WindowsCE; rv:4.0) Gecko/20120320 Firefox/4.0' - family: 'Windows CE' - major: + family: 'Windows' + major: 'CE' minor: patch: patch_minor: @@ -2026,6 +2110,41 @@ test_cases: patch: patch_minor: + - user_agent_string: 'App/1.0.0 CFNetwork/894 Darwin/17.4.0' + family: 'iOS' + major: '11' + minor: '2' + patch: '6' + patch_minor: + + - user_agent_string: 'App/1.0.0 CFNetwork/897.15 Darwin/17.5.0' + family: 'iOS' + major: '11' + minor: '3' + patch: + patch_minor: + + - user_agent_string: 'App/1.0.0 CFNetwork/901.1 Darwin/17.6.0' + family: 'iOS' + major: '11' + minor: '4' + patch: + patch_minor: + + - user_agent_string: 'App/1.0.0 CFNetwork/902.2 Darwin/17.7.0' + family: 'iOS' + major: '11' + minor: '4' + patch: '1' + patch_minor: + + - user_agent_string: 'App/1.0.0 CFNetwork/958.1 Darwin/18.0.0' + family: 'iOS' + major: '12' + minor: '0' + patch: + patch_minor: + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU 7_0_6 like Mac OS X; en_GB) AppleWebKit (KHTML, like Gecko) Mobile [OKMagazine/4.0.1 (iOS/7.0.6)] [LiteApps]' family: 'iOS' major: '7' @@ -2123,3 +2242,572 @@ test_cases: minor: patch: patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/18.0 Firefox/26.0' + family: 'Firefox OS' + major: '1' + minor: '0' + patch: '1' + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/18.1 Firefox/26.0' + family: 'Firefox OS' + major: '1' + minor: '1' + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/26.0 Firefox/26.0' + family: 'Firefox OS' + major: '1' + minor: '2' + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/28.0 Firefox/26.0' + family: 'Firefox OS' + major: '1' + minor: '3' + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/30.0 Firefox/26.0' + family: 'Firefox OS' + major: '1' + minor: '4' + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/32.0 Firefox/26.0' + family: 'Firefox OS' + major: '2' + minor: '0' + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/34.0 Firefox/26.0' + family: 'Firefox OS' + major: '2' + minor: '1' + patch: + patch_minor: + + # Test generic Firefox OS matching + - user_agent_string: 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/11.0 Firefox/26.0' + family: 'Firefox OS' + major: + minor: + patch: + patch_minor: + + - user_agent_string: 'TestApp/1.0 CFNetwork/758.0.2 Darwin/15.0.0' + family: 'iOS' + major: '9' + minor: '0' + patch: + patch_minor: + + - user_agent_string: 'TestApp/1.0 CFNetwork/758.3.15 Darwin/15.4.0' + family: 'iOS' + major: '9' + minor: '3' + patch: '1' + patch_minor: + + - user_agent_string: 'TestApp/1.0 CFNetwork/758.4.3 Darwin/15.5.0' + family: 'iOS' + major: '9' + minor: '3' + patch: '2' + patch_minor: + + - user_agent_string: 'TestApp/1.0 CFNetwork/758.5.3 Darwin/15.6.0' + family: 'iOS' + major: '9' + minor: '3' + patch: '5' + patch_minor: + + - user_agent_string: 'TestApp/1.0 CFNetwork/808.0.2 Darwin/16.0.0' + family: 'iOS' + major: '10' + minor: '0' + patch: + patch_minor: + + - user_agent_string: 'TestApp/1.0 CFNetwork/808.1.4 Darwin/16.1.0' + family: 'iOS' + major: '10' + minor: '1' + patch: + patch_minor: + + - user_agent_string: 'TestApp/1.0 CFNetwork/808.2.16 Darwin/16.3.0' + family: 'iOS' + major: '10' + minor: '2' + patch: + patch_minor: + + - user_agent_string: 'App/1.0.0 CFNetwork/808.3 Darwin/16.3.0' + family: 'iOS' + major: '10' + minor: '2' + patch: '1' + patch_minor: + + - user_agent_string: 'TestApp-tvOS/1.0-1' + family: 'tvOS' + major: '1' + minor: '0' + patch: + patch_minor: + + - user_agent_string: 'Roku/DVP-6.2 (096.02E06005A)' + family: 'Roku' + major: '6' + minor: '2' + patch: + patch_minor: + + - user_agent_string: 'Roku/DVP-5.0 (025.00E08043A)' + family: 'Roku' + major: '5' + minor: '0' + patch: + patch_minor: + + - user_agent_string: 'Roku/DVP-5.1 (025.01E01195A)' + family: 'Roku' + major: '5' + minor: '1' + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.41 (KHTML, like Gecko) Large Screen WebAppManager Safari/537.41' + family: 'Web0S' + major: + minor: + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0+(iPhone;+CPU+iPhone+OS+9_3_1+like+Mac+OS+X)+AppleWebKit/601.1.46+(KHTML,+like+Gecko)+Version/9.0+Mobile/13E238+Safari/601.1' + family: 'iOS' + major: '9' + minor: '3' + patch: '1' + patch_minor: + + - user_agent_string: 'Mozilla/5.0+(iPad;+CPU+OS+9_3_1+like+Mac+OS+X)+AppleWebKit/601.1.46+(KHTML,+like+Gecko)+Version/9.0+Mobile/13E238+Safari/601.1' + family: 'iOS' + major: '9' + minor: '3' + patch: '1' + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (SMART-TV; Linux; Tizen 2.3) AppleWebkit/538.1 (KHTML, like Gecko) SamsungBrowser/1.0 TV Safari/538.1' + family: 'Tizen' + major: '2' + minor: '3' + patch: + patch_minor: + + - user_agent_string: 'Deezer/4.8.2 (iOS; 7.1; Mobile; de)' + family: 'iOS' + major: '7' + minor: '1' + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (iOS; U; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) AdobeAIR/19.0' + family: 'iOS' + major: + minor: + patch: + patch_minor: + + - user_agent_string: 'UCWEB/2.0 (iOS; U; iPd OS 7_0_4; zh-CN; iPd5,1) U2/1.0.0 UCBrowser/9.0.1.284 U2/1.0.0 Mobile' + family: 'iOS' + major: '7' + minor: '0' + patch: '4' + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU IPhone OS 8_1_3 Like Mac OS X) AppleWebKit/600.1.4 (KHTML, Like Gecko) CriOS/43.0.2357.61 Mobile/12B466 Safari/600.1.4' + family: 'iOS' + major: '8' + minor: '1' + patch: '3' + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU IPhone OS 9_2_1 Like Mac OS X) AppleWebKit/601.1.46 (KHTML, Like Gecko) Mobile/13D15 [FBAN/FBIOS;FBAV/52.0.0.46.157;FBBV/26424168;FBDV/iPhone6,2;FBMD/iPhone;FBSN/iPhone OS;FBSV/9.2.1;FBSS/2; FBCR/Globe;FBID/phone;FBLC/en_US;FBOP/5]' + family: 'iOS' + major: '9' + minor: '2' + patch: '1' + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.84 Safari/537.36 CrKey/1.22.74257' + family: 'Chromecast' + major: '1' + minor: '22' + patch: '74257' + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_4 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) Outlook-iOS-Android/1.0 Mobile/13G35 Safari/601.1.46")' + family: 'iOS' + major: '9' + minor: '3' + patch: '4' + patch_minor: + + - user_agent_string: 'Zendesk for iPhone 1.2.1 (4395)' + family: 'iOS' + major: + minor: + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0+(Macintosh;+Intel+Mac+OS+X+10_11_6)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/52.0.2743.116+Safari/537.36' + family: 'Mac OS X' + major: '10' + minor: '11' + patch: '6' + patch_minor: + + - user_agent_string: 'Safari/12602.2.14.0.7 CFNetwork/807.1.3 Darwin/16.1.0 (x86_64)' + family: 'Mac OS X' + major: '10' + minor: '12' + patch: + patch_minor: + + - user_agent_string: 'Box Sync/4.0.7848;Darwin/10.13;i386/64bit' + family: 'Mac OS X' + major: '10' + minor: '13' + patch: + patch_minor: + + - user_agent_string: 'Box/1.2.93;Darwin/10.13;i386/64bit' + family: 'Mac OS X' + major: '10' + minor: '13' + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) BoxNotes/1.3.0 Chrome/56.0.2924.87 Electron/1.6.8 Safari/537.36' + family: 'Mac OS X' + major: '10' + minor: '13' + patch: '0' + patch_minor: + + - user_agent_string: 'Box Sync/4.0.7848;Windows/8.1;x86 Family 6 Model 158 Stepping 9, GenuineIntel/32bit' + family: 'Windows' + major: '8.1' + minor: + patch: + patch_minor: + + - user_agent_string: 'Box Sync/4.0.7848;Windows/10;Intel64 Family 6 Model 158 Stepping 9, GenuineIntel/64bit' + family: 'Windows' + major: '10' + minor: + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) BoxNotes/1.3.0 Chrome/56.0.2924.87 Electron/1.6.8 Safari/537.36' + family: 'Windows' + major: '8' + minor: '1' + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) BoxNotes/1.3.0 Chrome/56.0.2924.87 Electron/1.6.8 Safari/537.36' + family: 'Windows' + major: '10' + minor: + patch: + patch_minor: + + - user_agent_string: 'Box/1.2.93;Windows/10;Intel64 Family 6 Model 158 Stepping 9, GenuineIntel/64bit' + family: 'Windows' + major: '10' + minor: + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Windows) mirall/2.3.2 (build 1) (Nextcloud)' + family: 'Windows' + major: + minor: + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Linux) mirall/2.3.2 (Nextcloud)' + family: 'Linux' + major: + minor: + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Android) ownCloud-android/2.0.0' + family: 'Android' + major: + minor: + patch: + patch_minor: + + - user_agent_string: 'MyApp/1.0 CFNetwork/811.4.18 Darwin/16.5.0' + family: 'iOS' + major: '10' + minor: '3' + patch: + patch_minor: + + - user_agent_string: 'MyApp/1.0 CFNetwork/811.5.4 Darwin/16.6.0' + family: 'iOS' + major: '10' + minor: '3' + patch: '2' + patch_minor: + + - user_agent_string: 'MyApp/1.0 CFNetwork/811.5.4 Darwin/16.7.0' + family: 'iOS' + major: '10' + minor: '3' + patch: '3' + patch_minor: + + - user_agent_string: 'MyApp/1.0 CFNetwork/887 Darwin/17.0.0' + family: 'iOS' + major: '11' + minor: '0' + patch: + patch_minor: + + - user_agent_string: 'MyApp/1.0 CFNetwork/889.9 Darwin/17.2.0' + family: 'iOS' + major: '11' + minor: '1' + patch: + patch_minor: + + - user_agent_string: 'MyApp/1.0 CFNetwork/893.10 Darwin/17.3.0' + family: 'iOS' + major: '11' + minor: '2' + patch: + patch_minor: + + + - user_agent_string: 'MyApp/1.0 CFNetwork/893.13.1 Darwin/17.3.0 (x86_64)' + family: 'Mac OS X' + major: '10' + minor: '13' + patch: + patch_minor: + + - user_agent_string: 'Outlook-iOS/665.29827.prod.iphone (2.63.0)' + family: 'iOS' + major: + minor: + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; LG-TP260 Build/NRD90U; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/64.0.3282.137 Mobile Safari/537.36 Instagram 33.0.0.11.92 Android (24/7.0; 320dpi; 720x1193; LGE/lge; LG-TP260; lv517; lv517; en_US; 93117667)' + family: 'Android' + major: '7' + minor: '0' + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_5 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Mobile/15D60 Instagram 33.0.0.11.96 (iPhone9,3; iOS 11_2_5; en_AU; en-AU; scale=2.00; gamut=wide; 750x1334)' + family: 'iOS' + major: '11' + minor: '2' + patch: '5' + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Mobile/15D100 Flipboard/4.2.2' + family: 'iOS' + major: '11' + minor: '2' + patch: '6' + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-G610F Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/63.0.3239.111 Mobile Safari/537.36 Flipboard/4.1.9/4323,4.1.9.4323' + family: 'Android' + major: '7' + minor: '0' + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-G930F Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/64.0.3282.137 Mobile Safari/537.36 Onefootball/Android/9.10.6' + family: 'Android' + major: '7' + minor: '0' + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-A520F Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36 Flipboard-Briefing/2.7.28' + family: 'Android' + major: '7' + minor: '0' + patch: + patch_minor: + + - user_agent_string: 'Wget/1.18 (linux-gnu)' + family: 'Linux' + major: + minor: + patch: + patch_minor: + + - user_agent_string: 'Wget/1.18 (freebsd10.3)' + family: 'FreeBSD' + major: '10' + minor: '3' + patch: + patch_minor: + + - user_agent_string: 'curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2' + family: 'Red Hat' + major: + minor: + patch: + patch_minor: + + - user_agent_string: 'SalesforceMobileSDK/5.3.0 android mobile/8.0.0 (SM-G955F) Salesforce1/15.2 Native uid_c4589f605fad8c7e ftr_ Cordova/6.2.3' + family: 'Android' + major: '8' + minor: '0' + patch: '0' + patch_minor: + + - user_agent_string: 'SalesforceMobileSDK/5.3.0 android mobile/7.0 (SM-G955U) Salesforce1/15.2 Native uid_4ec4068eddf27447 ftr_ Cordova/6.2.3' + family: 'Android' + major: '7' + minor: '0' + patch: + patch_minor: + + - user_agent_string: 'SalesforceMobileSDK/5.3.0 android mobile/9 (SM-G955U) Salesforce1/15.2 Native uid_4ec4068eddf27447 ftr_ Cordova/6.2.3' + family: 'Android' + major: '9' + minor: + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 9; Pixel Build/PPP3.180510.008) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.81 Mobile Safari/537.36' + family: 'Android' + major: '9' + minor: + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (X11; Windows aarch64 10718.88.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.118 Safari/537.36 CitrixChromeApp' + family: 'Chrome OS' + major: '10718' + minor: '88' + patch: '2' + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (X11; Windows x86_64 10718.88.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.118 Safari/537.36 CitrixChromeApp' + family: 'Chrome OS' + major: '10718' + minor: '88' + patch: '2' + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 CitrixChromeApp' + family: 'Windows' + major: '10' + minor: + patch: + patch_minor: + + - user_agent_string: 'ViaFree-DK/3.8.3 (com.MTGx.ViaFree.dk; build:7383; iOS 12.1.0) Alamofire/4.7.0' + family: 'iOS' + major: '12' + minor: '1' + patch: '0' + patch_minor: + + - user_agent_string: 'Viafree-tvOS-DK/3.7.1 (com.MTGx.ViaFree.dk; build:7341; tvOS 12.1.0) Alamofire/4.7.0' + family: 'tvOS' + major: '12' + minor: '1' + patch: '0' + patch_minor: + + - user_agent_string: 'iTunes/12.7.1 (Windows; Microsoft Windows 7 Ultimate Edition Service Pack 1 (Build 7601)) AppleWebKit/7604.3005.2001.1' + family: 'Windows' + major: '7' + minor: + patch: + patch_minor: + + - user_agent_string: 'iTunes/12.1.3 (Windows; Microsoft Windows XP Professional Service Pack 3 (Build 2600)) AppleWebKit/7600.1017.9000.3' + family: 'Windows' + major: 'XP' + minor: + patch: + patch_minor: + + - user_agent_string: 'iTunes/12.1.3 (Windows; Microsoft Windows Vista Business Edition Service Pack 2 (Build 6002)) AppleWebKit/7600.1017.9000.3 ' + family: 'Windows' + major: 'Vista' + minor: + patch: + patch_minor: + + - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 5.01; Windows 98; Linux 3.3.8-3.3) [Netgem; 7.7.01-51; i-Player; netbox; sezmi_totalgem]' + family: 'Windows' + major: '98' + minor: + patch: + patch_minor: + + - user_agent_string: 'Mozilla/2.0 (compatible; MSIE 3.0; Windows 3.1)' + family: 'Windows' + major: '3.1' + minor: + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Windows NT 4.0; rv:52.0) Gecko/20100101 Firefox/52.0' + family: 'Windows' + major: 'NT' + minor: + patch: + patch_minor: + + - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 5.0; Windows ME) Opera 5.11 [de]' + family: 'Windows' + major: 'ME' + minor: + patch: + patch_minor: + + - user_agent_string: 'Microsoft Internet Explorer/1.0 (Windows 95)' + family: 'Windows' + major: '95' + minor: + patch: + patch_minor: + + - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows CE,BrailleNote; IEMobile 7.11)' + family: 'Windows' + major: 'CE' + minor: + patch: + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (Windows 2000; U) Opera 7.0 [en]' + family: 'Windows' + major: '2000' + minor: + patch: + patch_minor: diff --git a/tests/test_ua.yaml b/tests/test_ua.yaml index 5172ba70..b7f01509 100644 --- a/tests/test_ua.yaml +++ b/tests/test_ua.yaml @@ -1,4 +1,16 @@ test_cases: + + - user_agent_string: 'atc/1.0 watchOS/5.1.3 model/Watch3,4 hwp/t8004 build/16S535 (6; dt:156)' + family: 'Apple Watch App' + major: '3' + minor: '4' + patch: + + - user_agent_string: 'atc/1.0 watchOS/5.2 model/Watch4,4 hwp/t8006 build/16T225 (6; dt:193)' + family: 'Apple Watch App' + major: '4' + minor: '4' + patch: - user_agent_string: 'Mozilla/5.0 (Windows; U; en-US) AppleWebKit/531.9 (KHTML, like Gecko) AdobeAIR/2.5.1' family: 'AdobeAIR' @@ -146,9 +158,9 @@ test_cases: - user_agent_string: 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.3+ (KHTML, like Gecko) Version/10.0.9.388 Mobile Safari/537.3+' family: 'BlackBerry WebKit' - major: - minor: - patch: + major: '10' + minor: '0' + patch: '9' - user_agent_string: 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 1.0.0; en-US) AppleWebKit/534.8+ (KHTML, like Gecko) Version/0.0.1 Safari/534.8+' family: 'BlackBerry WebKit' @@ -192,35 +204,65 @@ test_cases: minor: '8' patch: '5' + - user_agent_string: 'Mozilla/5.0 (compatible; Windows NT 6.1; Catchpoint) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36' + family: 'Catchpoint' + major: + minor: + patch: + + - user_agent_string: 'Mozilla/5.0 (compatible; Windows NT 6.1; Catchpoint bot) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36' + family: 'Catchpoint bot' + major: + minor: + patch: + - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; chromeframe/11.0.660.0)' family: 'Chrome Frame' major: '11' minor: '0' patch: '660' + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.1.2; Nexus 5X Build/N2G47W; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36' + family: 'Chrome Mobile WebView' + major: '58' + minor: '0' + patch: '3029' + patch_minor: '83' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.4.4; SHV31 Build/S2280) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36' + family: 'Chrome Mobile WebView' + major: '33' + minor: '0' + patch: '0' + patch_minor: '0' + - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.2; Galaxy Nexus Build/JOP40C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' family: 'Chrome Mobile' major: '18' minor: '0' patch: '1025' + patch_minor: '166' - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.1.1; SPH-L710 Build/JRO03L) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' family: 'Chrome Mobile' major: '18' minor: '0' patch: '1025' + patch_minor: '166' - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 5 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Mobile Safari/537.36' family: 'Chrome Mobile' major: '35' minor: '0' patch: '1916' + patch_minor: '122' - user_agent_string: 'Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.133 Chrome/10.0.648.133 Safari/534.16' family: 'Chromium' major: '10' minor: '0' patch: '648' + patch_minor: '133' - user_agent_string: 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Comodo_Dragon/4.1.1.11 Chrome/4.1.249.1042 Safari/532.5' family: 'Comodo Dragon' @@ -264,6 +306,24 @@ test_cases: minor: patch: + - user_agent_string: 'Firefox/11.0 (via ggpht.com GoogleImageProxy)' + family: 'GmailImageProxy' + major: + minor: + patch: + + - user_agent_string: 'Twitterbot/1.0' + family: 'TwitterBot' + major: '1' + minor: '0' + patch: + + - user_agent_string: 'WhatsApp/2.17.70 W' + family: 'WhatsApp' + major: '2' + minor: '17' + patch: '70' + - user_agent_string: 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.1pre) Gecko/20090717 Ubuntu/9.04 (jaunty) Shiretoko/3.5.1pre' family: 'Firefox (Shiretoko)' major: '3' @@ -462,8 +522,14 @@ test_cases: minor: '0' patch: '2' + - user_agent_string: 'Mozilla/5.0 (iPod touch; CPU iPhone OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13F69' + family: 'Mobile Safari UI/WKWebView' + major: '9' + minor: '3' + patch: '2' + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257' - family: 'Mobile Safari' + family: 'Mobile Safari UI/WKWebView' major: '7' minor: '1' patch: '2' @@ -634,7 +700,7 @@ test_cases: family: 'Opera Mini' major: '5' minor: '1' - patch: + patch: '191' - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/6.24455/25.677; U; fr) Presto/2.5.25 Version/10.54' family: 'Opera Mini' @@ -646,8 +712,32 @@ test_cases: family: 'Opera Mini' major: '7' minor: '0' + patch: '31437' + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (S60; SymbOS; Opera Mobi/23.348; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '9' + minor: '80' + patch: + + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (J2ME/22.478; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '9' + minor: '80' patch: + - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/9 (Compatible; MSIE:9.0; iPhone; BlackBerry9700; AppleWebKit/24.746; U; en) Presto/2.5.25 Version/10.54' + family: 'Opera Mini' + major: '9' + minor: + patch: + + - user_agent_string: 'Opera/9.80 (Android; Opera Mini/7.6.35766/35.5706; U; en) Presto/2.8.119 Version/11.10' + family: 'Opera Mini' + major: '7' + minor: '6' + patch: '35766' + - user_agent_string: 'Opera/9.80 (S60; SymbOS; Opera Mobi/275; U; es-ES) Presto/2.4.13 Version/10.00' family: 'Opera Mobile' major: '10' @@ -678,7 +768,7 @@ test_cases: minor: '53' patch: - - user_agent_string: 'User agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.20 Safari/537.36 OPR/15.0.1147.18 (Edition Next)' + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.20 Safari/537.36 OPR/15.0.1147.18 (Edition Next)' family: 'Opera' major: '15' minor: '0' @@ -727,11 +817,29 @@ test_cases: patch: '2' - user_agent_string: 'Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20110407 Firefox/4.0.3 PaleMoon/4.0.3' - family: 'Pale Moon (Firefox Variant)' + family: 'Pale Moon' major: '4' minor: '0' patch: '3' + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; rv:3.0) Goanna/20170207 PaleMoon/27.1.0' + family: 'Pale Moon' + major: '27' + minor: '1' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; rv:3.0) Gecko/20100101 Goanna/20170207 PaleMoon/27.1.0' + family: 'Pale Moon' + major: '27' + minor: '1' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; rv:45.9) Gecko/20100101 Goanna/3.0 Firefox/45.9 PaleMoon/27.1.0' + family: 'Pale Moon' + major: '27' + minor: '1' + patch: '0' + - user_agent_string: 'Mozilla/5.0 (LG-T500 AppleWebkit/531 Browser/Phantom/V2.0 Widget/LGMW/3.0 MMS/LG-MMS-V1.0/1.2 Java/ASVM/1.1 Profile/MIDP-2.1 Configuration/CLDC-1.1)' family: 'Phantom Browser' major: '2' @@ -744,6 +852,24 @@ test_cases: minor: '4' patch: + - user_agent_string: 'Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PingdomTMS/0.8.5 Safari/534.34' + family: 'PingdomBot' + major: '0' + minor: '8' + patch: '5' + + - user_agent_string: 'NewRelicPinger/1.0 (1025794)' + family: 'NewRelicPingerBot' + major: '1' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/98 Safari/537.4 (StatusCake)' + family: 'StatusCakeBot' + major: + minor: + patch: + - user_agent_string: 'Mozilla/3.0 (Planetweb/2.100 JS SSL US; Dreamcast US)' family: 'Planetweb' major: '2' @@ -823,10 +949,10 @@ test_cases: patch: '5' - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.2.0 Lightning/2.6.4' - family: 'Lightning' - major: '2' - minor: '6' - patch: '4' + family: 'Thunderbird' + major: '24' + minor: '2' + patch: '0' - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.2.0' family: 'Thunderbird' @@ -834,6 +960,60 @@ test_cases: minor: '2' patch: '0' + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1; rv:45.0) Gecko/20100101 Thunderbird/45.0' + family: 'Thunderbird' + major: '45' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:7.0.1) Gecko/20151105 Postbox/4.0.8' + family: 'Postbox' + major: '4' + minor: '0' + patch: '8' + + - user_agent_string: 'Mozilla/4.0 (compatible; Lotus-Notes/6.0; Windows-NT)' + family: 'Lotus Notes' + major: '6' + minor: '0' + patch: + + - user_agent_string: 'YahooMobileMail/1.0 (Android Mail; 1.3.10) (supersonic;HTC;PC36100;2.3.5/GRJ90)' + family: 'YahooMobileMail' + major: '1' + minor: '0' + patch: + + - user_agent_string: 'Barca/2.8.2' + family: 'Barca' + major: '2' + minor: '8' + patch: '2' + + - user_agent_string: 'BarcaPro/1.4.12' + family: 'Barca' + major: '1' + minor: '4' + patch: '12' + + - user_agent_string: 'The Bat! 4.0.0.22' + family: 'The Bat!' + major: '4' + minor: '0' + patch: '0' + + - user_agent_string: 'MailBar/1.3.2 (Mac OS X Version 10.11.1 (Build 15B42))' + family: 'MailBar' + major: '1' + minor: '3' + patch: '2' + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) kmail2/4.14.2 Safari/534.34' + family: 'kmail2' + major: '4' + minor: '14' + patch: '2' + - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; MSOffice 12)' family: 'Outlook' major: '2007' @@ -853,7 +1033,7 @@ test_cases: patch: - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.14 (KHTML, like Gecko)' - family: 'AppleMail' + family: 'Apple Mail' major: '536' minor: '26' patch: '14' @@ -870,6 +1050,42 @@ test_cases: minor: '0' patch: '6' + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.220 Whale/1.3.45.0 Safari/537.36' + family: 'Whale' + major: '1' + minor: '3' + patch: '45' + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.220 Whale/1.3.50.3 Safari/537.36' + family: 'Whale' + major: '1' + minor: '3' + patch: '50' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Whale/0.9.1.679 Mobile/15D100 Safari/604.5.6' + family: 'Whale' + major: '0' + minor: '9' + patch: '1' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Whale/0.9.5.0 Mobile Safari/537.36' + family: 'Whale' + major: '0' + minor: '9' + patch: '5' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.1.2; Nexus 6P Build/WHALE) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.220 Whale/1.3.50.3 Mobile Safari/537.36 sidebar webpanel' + family: 'Whale' + major: '1' + minor: '3' + patch: '50' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.1.2; Nexus 6P Build/WHALE) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.220 Whale/1.3.50.3 Mobile Safari/537.36' + family: 'Whale' + major: '1' + minor: '3' + patch: '50' + - user_agent_string: 'J2ME/UCWEB7.0.3.45/139/7682' family: 'UC Browser' major: '7' @@ -882,6 +1098,18 @@ test_cases: minor: '4' patch: '0' + - user_agent_string: 'UCWEB/3.0 (iPhone; CPU OS_6; en-US)AppleWebKit/534.1 U3/3.0.0 Mobile' + family: 'UC Browser' + major: '3' + minor: '0' + patch: '0' + + - user_agent_string: 'UCWEB/2.0 (Linux; U; Opera Mini/7.1.32052/30.2697; en-US; GT-S5302) U2/1.0.0 UCBrowser/9.3.0.440 Mobile' + family: 'UC Browser' + major: '9' + minor: '3' + patch: '0' + - user_agent_string: 'IUC(U;iOS 5.1.1;Zh-cn;320*480;)/UCWEB7.9.0.94/41/997' family: 'UC Browser' major: '7' @@ -906,6 +1134,12 @@ test_cases: minor: '7' patch: '0' + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/5.7.14488.1025 Safari/537.36' + family: 'UC Browser' + major: '5' + minor: '7' + patch: '14488' + - user_agent_string: 'Alcatel-OH5/1.0 UP.Browser/6.1.0.7.7 (GUI) MMP/1.0' family: 'UP.Browser' major: '6' @@ -1142,14 +1376,14 @@ test_cases: family: 'Opera Mini' major: '4' minor: '2' - patch: + patch: '14812' patch_minor: - user_agent_string: 'SAMSUNG-SGH-A897/A897UCJC1; Mozilla/5.0 (Profile/MIDP-2.0 Configuration/CLDC-1.1; Opera Mini/att/4.2.15304; U; fr-US) Opera 9.50' family: 'Opera Mini' major: '4' minor: '2' - patch: + patch: '15304' patch_minor: - user_agent_string: 'MQQBrowser/39 Mozilla/5.0 (iPhone 4S; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10A523 Safari/7534.48.3' @@ -1286,164 +1520,164 @@ test_cases: patch_minor: - user_agent_string: 'Safari/6533.18.5 CFNetwork/454.9.8 Darwin/10.4.0 (i386) (MacBookPro7,1)' - family: 'CFNetwork' - major: '454' - minor: '9' - patch: '8' + family: 'Safari' + major: '6533' + minor: '18' + patch: '5' patch_minor: - user_agent_string: 'Safari/7536.30.1 CFNetwork/520.5.1 Darwin/11.4.2 (i386) (MacBook3,1)' - family: 'CFNetwork' - major: '520' - minor: '5' + family: 'Safari' + major: '7536' + minor: '30' patch: '1' patch_minor: - user_agent_string: 'Reader Notifier/5 CFNetwork/596.3.3 Darwin/12.3.0 (x86_64) (MacBookPro7,1)' - family: 'CFNetwork' - major: '596' - minor: '3' - patch: '3' + family: 'Reader Notifier' + major: '5' + minor: + patch: patch_minor: - user_agent_string: 'Safari/9537.71 CFNetwork/673.0.2 Darwin/13.0.1 (x86_64) (MacBookPro11,1)' - family: 'CFNetwork' - major: '673' - minor: '0' - patch: '2' + family: 'Safari' + major: '9537' + minor: '71' + patch: patch_minor: - user_agent_string: 'DEPoker-iPad/1.0.2 CFNetwork/548.1.4 Darwin/11.0.0' - family: 'CFNetwork' - major: '548' - minor: '1' - patch: '4' + family: 'DEPoker' + major: '1' + minor: '0' + patch: '2' patch_minor: - user_agent_string: 'JDSports-iPad/1.1 CFNetwork/672.0.8 Darwin/14.0.0' - family: 'CFNetwork' - major: '672' - minor: '0' - patch: '8' + family: 'JDSports' + major: '1' + minor: '1' + patch: patch_minor: - user_agent_string: 'AngryBirdsBlack-iPhone/1.1.0 CFNetwork/548.1.4 Darwin/11.0.0' - family: 'CFNetwork' - major: '548' + family: 'AngryBirdsBlack' + major: '1' minor: '1' - patch: '4' + patch: '0' patch_minor: - user_agent_string: 'Bing for iPad/1.1.2 CFNetwork/485.13.9 Darwin/11.0.0' - family: 'CFNetwork' - major: '485' - minor: '13' - patch: '9' + family: 'Bing for iPad' + major: '1' + minor: '1' + patch: '2' patch_minor: - user_agent_string: 'NightstandPaid-iPad/1.3.1 CFNetwork/548.1.4 Darwin/11.0.0' - family: 'CFNetwork' - major: '548' - minor: '1' - patch: '4' + family: 'NightstandPaid' + major: '1' + minor: '3' + patch: '1' patch_minor: - user_agent_string: 'Glo-De-iPad/1.4.7 CFNetwork/672.0.2 Darwin/14.0.0' - family: 'CFNetwork' - major: '672' - minor: '0' - patch: '2' + family: 'Glo-De' + major: '1' + minor: '4' + patch: '7' patch_minor: - user_agent_string: 'Island for iPhone/1.95 CFNetwork/672.0.2 Darwin/14.0.0' - family: 'CFNetwork' - major: '672' - minor: '0' - patch: '2' + family: 'Island for iPhone' + major: '1' + minor: '95' + patch: patch_minor: - user_agent_string: 'WormsiPhone-iPad/2.3 CFNetwork/548.1.4 Darwin/11.0.0' - family: 'CFNetwork' - major: '548' - minor: '1' - patch: '4' + family: 'WormsiPhone' + major: '2' + minor: '3' + patch: patch_minor: - user_agent_string: 'Rummy LITE iPad/2.3.0 CFNetwork/609.1.4 Darwin/13.0.0' - family: 'CFNetwork' - major: '609' - minor: '1' - patch: '4' + family: 'Rummy LITE iPad' + major: '2' + minor: '3' + patch: '0' patch_minor: - user_agent_string: 'MobileRSSFree-iPad/3.1 CFNetwork/467.12 Darwin/10.3.1' - family: 'CFNetwork' - major: '467' - minor: '12' + family: 'MobileRSSFree' + major: '3' + minor: '1' patch: patch_minor: - user_agent_string: 'MobileRSSFree-iPad/3.1.4 CFNetwork/485.13.9 Darwin/11.0.0' - family: 'CFNetwork' - major: '485' - minor: '13' - patch: '9' + family: 'MobileRSSFree' + major: '3' + minor: '1' + patch: '4' patch_minor: - user_agent_string: 'babbelIndonesian-iPad/4.0.1 CFNetwork/672.0.8 Darwin/14.0.0' - family: 'CFNetwork' - major: '672' + family: 'babbelIndonesian' + major: '4' minor: '0' - patch: '8' + patch: '1' patch_minor: - user_agent_string: 'WeltMobile-iPad/4.2 CFNetwork/609.1.4 Darwin/13.0.0' - family: 'CFNetwork' - major: '609' - minor: '1' - patch: '4' + family: 'WeltMobile' + major: '4' + minor: '2' + patch: patch_minor: - user_agent_string: 'IMPlusFull-iPad/7.9.1 CFNetwork/548.0.4 Darwin/11.0.0' - family: 'CFNetwork' - major: '548' - minor: '0' - patch: '4' + family: 'IMPlusFull' + major: '7' + minor: '9' + patch: '1' patch_minor: - user_agent_string: 'Cooliris/1.3 CFNetwork/342.1 Darwin/9.4.1' - family: 'CFNetwork' - major: '342' - minor: '1' + family: 'Cooliris' + major: '1' + minor: '3' patch: patch_minor: - user_agent_string: 'Poof/1.0 CFNetwork/485.12.7 Darwin/10.4.0' - family: 'CFNetwork' - major: '485' - minor: '12' - patch: '7' + family: 'Poof' + major: '1' + minor: '0' + patch: patch_minor: - user_agent_string: 'Parking Mania Free/1.9.5.0 CFNetwork/548.0.4 Darwin/11.0.0' - family: 'CFNetwork' - major: '548' - minor: '0' - patch: '4' - patch_minor: + family: 'Parking Mania Free' + major: '1' + minor: '9' + patch: '5' + patch_minor: '0' - user_agent_string: 'Planet Boing!/1.4.8 CFNetwork/609.1.4 Darwin/13.0.0' - family: 'CFNetwork' - major: '609' - minor: '1' - patch: '4' + family: 'Planet Boing!' + major: '1' + minor: '4' + patch: '8' patch_minor: - user_agent_string: 'PlayTube/1.7 CFNetwork/672.0.2 Darwin/14.0.0' - family: 'CFNetwork' - major: '672' - minor: '0' - patch: '2' + family: 'PlayTube' + major: '1' + minor: '7' + patch: patch_minor: - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 2.2.1; es-us) AppleWebKit/534.12 (KHTML, like Gecko) Puffin/1.3.2913S Mobile Safari/534.12' @@ -1575,6 +1809,36 @@ test_cases: minor: '0' patch: '1' + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko PTST/1.0' + family: 'WebPageTest.org bot' + major: '1' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.0 Safari/537.36 PTST/1.0' + family: 'WebPageTest.org bot' + major: '1' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4) Build/MPJ24.139-64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Mobile Safari/537.36 PTST/180521.140508' + family: 'WebPageTest.org bot' + major: '180521' + minor: '140508' + patch: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4) Build/MPJ24.139-64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Mobile Safari/537.36 PTST/391' + family: 'WebPageTest.org bot' + major: '391' + minor: + patch: + + - user_agent_string: 'Mozilla/5.0 (X11; Datanyze; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36' + family: 'Datanyze' + major: + minor: + patch: + - user_agent_string: 'CazoodleBot/CazoodleBot-0.1 (CazoodleBot Crawler; http://www.cazoodle.com/cazoodlebot; cazoodlebot@cazoodle.com)' family: 'CazoodleBot' major: '0' @@ -1666,10 +1930,10 @@ test_cases: patch: - user_agent_string: 'Argus/2.8.65 CFNetwork/609 Darwin/13.0.0' - family: 'CFNetwork' - major: - minor: - patch: + family: 'Argus' + major: '2' + minor: '8' + patch: '65' - user_agent_string: 'DoCoMo/2.0 P05A(c100;TB;W24H15) (compatible; BaiduMobaider/1.0; http://www.baidu.jp/spider/)' family: 'BaiduMobaider' @@ -2193,6 +2457,33 @@ test_cases: minor: patch: + - user_agent_string: 'Google Web Preview' + family: 'Other' + major: + minor: + patch: + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36' + family: 'Chrome' + major: '60' + minor: '0' + patch: '3112' + patch_minor: '78' + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112 Safari/537.36' + family: 'Chrome' + major: '60' + minor: '0' + patch: '3112' + patch_minor: + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko; Google Web Preview) Chrome/27.0 .1453 Safari/537.36.' + family: 'Chrome' + major: '27' + minor: '0' + patch: + patch_minor: + - user_agent_string: 'HiddenMarket-1.0-beta (www.hiddenmarket.net/crawler.php)' family: 'HiddenMarket' major: @@ -2476,10 +2767,10 @@ test_cases: patch: - user_agent_string: 'RedCarpet/2.1 CFNetwork/672.0.2 Darwin/14.0.0' - family: 'CFNetwork' - major: '672' - minor: '0' - patch: '2' + family: 'RedCarpet' + major: '2' + minor: '1' + patch: - user_agent_string: 'Riddler (http://riddler.io/about.html)' family: 'Riddler' @@ -3711,6 +4002,42 @@ test_cases: minor: '7' patch: + - user_agent_string: 'Mozilla/5.0 (Linux; U; Sailfish 3.0; Mobile; rv:45.0) Gecko/45.0 Firefox/45.0 SailfishBrowser/1.0' + family: 'Sailfish Browser' + major: '1' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (Linux; U; Sailfish 3.0; Mobile; rv:45.0) Gecko/45.0 Firefox/45.0 SailfishBrowser/1.2.3' + family: 'Sailfish Browser' + major: '1' + minor: '2' + patch: '3' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.0.1; SAMSUNG GT-I9506-ORANGE Build/LRX22C) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/2.1 Chrome/34.0.1847.76 Mobile Safari/537.36' + family: 'Samsung Internet' + major: '2' + minor: '1' + patch: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.0.2; SAMSUNG SM-T800 Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/3.0 Chrome/38.0.2125.102 Safari/537.36' + family: 'Samsung Internet' + major: '3' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.1.1; SAMSUNG SM-G920F Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/3.2 Chrome/38.0.2125.102 Mobile Safari/537.36' + family: 'Samsung Internet' + major: '3' + minor: '2' + patch: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.0.2; SAMSUNG SM-T710 Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/3.5 Chrome/38.0.2125.102 Safari/537.36' + family: 'Samsung Internet' + major: '3' + minor: '5' + patch: + - user_agent_string: 'ScSpider/0.2' family: 'ScSpider' major: '0' @@ -4468,7 +4795,7 @@ test_cases: patch: - user_agent_string: 'FAST-mSEARCH Crawler 0.1 (bergum@fast.no)' - family: 'mSEARCH Crawler' + family: 'FAST-mSEARCH Crawler' major: '0' minor: '1' patch: @@ -5721,6 +6048,12 @@ test_cases: minor: patch: + - user_agent_string: 'NL-Crawler' + family: 'NL-Crawler' + major: + minor: + patch: + - user_agent_string: 'Mozilla/5.0 (compatible; YoudaoBot-rts/1.0; http://www.youdao.com/help/webmaster/spider/; )' family: 'YoudaoBot' major: @@ -6111,3 +6444,1429 @@ test_cases: minor: patch: + - user_agent_string: 'Mozilla/5.0 (Linux; U; en-gb) AppleWebKit/418.9.1 (KHTML, like Gecko) SiteCon/8.10.9' + family: 'SiteCon' + major: '8' + minor: '10' + patch: '9' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) FxiOS/1.0 Mobile/12F69 Safari/600.1.4' + family: 'Firefox iOS' + major: '1' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (iPad; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) FxiOS/1.0 Mobile/12F69 Safari/600.1.4' + family: 'Firefox iOS' + major: '1' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Spotify/1.0.9.133 Safari/537.36' + family: 'Spotify' + major: '1' + minor: '0' + patch: '9' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Spotify/1.0.9.133 Safari/537.36' + family: 'Spotify' + major: '1' + minor: '0' + patch: '9' + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Spotify/1.0.4.90 Safari/537.36' + family: 'Spotify' + major: '1' + minor: '0' + patch: '4' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Spotify/1.0.3.101 Safari/537.36' + family: 'Spotify' + major: '1' + minor: '0' + patch: '3' + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Spotify/1.0.8.59 Safari/537.36' + family: 'Spotify' + major: '1' + minor: '0' + patch: '8' + + - user_agent_string: 'Mozilla/5.0 (Android 5.0; Tablet; rv:41.0) Gecko/41.0 Firefox/41.0' + family: 'Firefox Mobile' + major: '41' + minor: '0' + patch: + + - user_agent_string: '[FBAN/FB4A;FBAV/3.4;FBBV/258875;FBDM/{density=0.75,width=240,height=320};FBLC/tr_TR;FBCR/o2 - de;FBPN/com.facebook.katana;FBDV/LG-E400;FBSV/2.3.6;]' + family: 'Facebook' + major: '3' + minor: '4' + patch: + + - user_agent_string: '[FBAN/FB4A;FBAV/2.3;FBBV/149649;FBDM/{density=1.5,width=480,height=800};FBLC/es_ES;FBCR/;FBPN/com.facebook.katana;FBDV/LG-P920;FBSV/2.2.2;]' + family: 'Facebook' + major: '2' + minor: '3' + patch: + + - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; SCH-R720 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 [FBAN/FB4A;FBAV/1.8.1;FBPN/com.facebook.katana;FBDV/SCH-R720;FBSV/2.3.4;FBDM/{density=1.0,width=320,height=' + family: 'Facebook' + major: '1' + minor: '8' + patch: '1' + + - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; 706_v92_jbla_fhd Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 [FB_IAB/FB4A;FBAV/24.0.0.30.15;]' + family: 'Facebook' + major: '24' + minor: '0' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B329 [FBAN/FBIOS;FBAV/6.5.1;FBBV/377040;FBDV/iPhone4,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/6.1.3;FBSS/2; FBCR/Telekom.de;FBID/phone;FBLC/de_DE;' + family: 'Facebook' + major: '6' + minor: '5' + patch: '1' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B329 [FBAN/FBIOS;FBAV/6.2;FBBV/228172;FBDV/iPhone5,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/6.1.3;FBSS/2; FBCR/o2-de;FBID/phone;FBLC/pt_BR;FBOP/1]' + family: 'Facebook' + major: '6' + minor: '2' + patch: + + - user_agent_string: 'Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9A334 [FBAN/FBIOS;FBAV/6.5.1;FBBV/377040;FBDV/iPad2,1;FBMD/iPad;FBSN/iPhone OS;FBSV/5.0;FBSS/1; FBCR/;FBID/tablet;FBLC/de_DE;FBOP/1]' + family: 'Facebook' + major: '6' + minor: '5' + patch: '1' + + - user_agent_string: 'Mozilla/5.0 (iPad; U; CPU iPhone OS 4_3_2 like Mac OS X; de_DE) AppleWebKit (KHTML, like Gecko) Mobile [FBAN/FBForIPhone;FBAV/4.0.2;FBBV/4020.0;FBDV/iPad1,1;FBMD/iPad;FBSN/iPhone OS;FBSV/4.3.2;FBSS/1; FBCR/;FBID/tablet;FBLC/de_DE;FBSF/1.0]' + family: 'Facebook' + major: '4' + minor: '0' + patch: '2' + + - user_agent_string: 'Mozilla/5.0 (iPad; U; CPU iPhone OS 4_3_5 like Mac OS X; de_DE) AppleWebKit (KHTML, like Gecko) Mobile [FBAN/FBForIPhone;FBAV/4.0.3;FBBV/4030.0;FBDV/iPad2,2;FBMD/iPad;FBSN/iPhone OS;FBSV/4.3.5;FBSS/1; FBCR/Telekom.de;FBID/tablet;FBLC/de_DE;FBS' + family: 'Facebook' + major: '4' + minor: '0' + patch: '3' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B206 [FBAN/FBIOS;FBAV/6.1;FBBV/201075;FBDV/iPhone3,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/5.1.1;FBSS/2; FBCR/Vodafone.de;FBID/phone;FBLC/en_US;FBOP/1]' + family: 'Facebook' + major: '6' + minor: '1' + patch: + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12D508 [FBAN/GroupsForiOS;FBAV/9.0;FBBV/7752968;FBDV/iPhone7,2;FBMD/iPhone;FBSN/iPhone OS;FBSV/8.2;FBSS/2; FBCR/Telekom.de;FBID/phone;FBLC/de_' + family: 'Facebook' + major: '9' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; fr_FR) AppleWebKit (KHTML, like Gecko) Mobile [FBAN/FBForIPhone;FBAV/4.0;FBBV/4000.0;FBDV/iPhone1,2;FBMD/iPhone;FBSN/iPhone OS;FBSV/4.1;FBSS/1; FBCR/Carrier;FBID/phone;FBLC/fr_FR;FBSF/1.' + family: 'Facebook' + major: '4' + minor: '0' + patch: + + - user_agent_string: 'Dalvik/1.2.0 (Linux; U; Android 2.2.2; HTC Desire Build/FRG83G) [FBAN/Orca-Android;FBAV/2.6.1-release;FBLC/de_DE;FBBV/288543;FBCR/o2 - de;FBMF/HTC;FBBD/htc_wwe;FBDV/HTC Desire;FBSV/2.2.2]' + family: 'Facebook' + major: '2' + minor: '6' + patch: '1' + + - user_agent_string: '[FBAN/FB4A;FBAV/3.6;FBBV/330148;FBDM/{density=0.75,width=240,height=320};FBLC/de_DE;FBCR/o2 - de;FBPN/com.facebook.katana;FBDV/GT-S5570;FBSV/2.2.1;FBCA/armeabi:unknown;]' + family: 'Facebook' + major: '3' + minor: '6' + patch: + + - user_agent_string: '[FBAN/PAAA;FBAV/1.7;FBDM/{density=2.0,width=720,height=1280};FBLC/es_ES;FB_FW/2;FBSN/Android;FBCR/FONIC;FBDV/GT-I9300;FBSV/4.1.2;]' + family: 'Facebook' + major: '1' + minor: '7' + patch: + + - user_agent_string: '[FBAN/PAAA;FBAV/1.9;FBDM/{density=2.0,width=720,height=1280};FBLC/de_DE;FB_FW/2;FBSN/Android;FBCR/o2 - de;FBDV/GT-I9300;FBSV/4.3;]' + family: 'Facebook' + major: '1' + minor: '9' + patch: + + - user_agent_string: '[FBAN/FB4A;FBAV/130.0.321;FBBV/149649;FBDM/{density=1.5,width=480,height=800};FBLC/es_ES;FBCR/;FBPN/com.facebook.katana;FBDV/LG-P920;FBSV/2.2.2;]' + family: 'Facebook' + major: '130' + minor: '0' + patch: '321' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77 [FBAN/FBIOS;FBDV/iPhone10,4;FBMD/iPhone;FBSN/iOS;FBSV/11.4.1;FBSS/2;FBCR/A1;FBID/phone;FBLC/de_DE;FBOP/5;FBRV/122166081]' + family: 'Facebook' + major: + minor: + patch: + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_2_1 like Mac OS X) AppleWebKit/602.4.6 (KHTML, like Gecko) Mobile/14D27 [FBAN/MessengerForiOS;FBAV/124.0.0.50.70;FBBV/63293619;FBDV/iPhone7,1;FBMD/iPhone;FBSN/iOS;FBSV/10.2.1;FBSS/3;FBCR/Viettel;FBID/phone;FBLC/vi_VN;FBOP/5;FBRV/0]' + family: 'Facebook Messenger' + major: '124' + minor: '0' + patch: '0' + patch_minor: '50' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; SM-A910F Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36 [FB_IAB/MESSENGER;FBAV/120.0.0.14.84;]' + family: 'Facebook Messenger' + major: '120' + minor: '0' + patch: '0' + patch_minor: '14' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77 [FBAN/FBIOS;FBAV/194.0.0.38.99;FBBV/127868476;FBDV/iPhone7,2;FBMD/iPhone;FBSN/iOS;FBSV/11.4.1;FBSS/2;FBCR/OrangeBotswana;FBID/phone;FBLC/en_GB;FBOP/5;FBRV/128807018]' + family: 'Facebook' + major: '194' + minor: '0' + patch: '0' + patch_minor: '38' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_4 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B350 [Pinterest/iOS]' + family: 'Pinterest' + major: + minor: + patch: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.4.2; A3-A11 Build/KOT49H) AppleWebKit/537.36 (KHTML like Gecko) Version/4.0 Chrome/30.0.0.0 Safari/537.36 [Pinterest/Android]' + family: 'Pinterest' + major: + minor: + patch: + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10A525 [Pinterest/iOS]' + family: 'Pinterest' + major: + minor: + patch: + + - user_agent_string: 'Pinterest for Android Tablet/1.8.4 (SGP321; 4.3)' + family: 'Pinterest' + major: '1' + minor: '8' + patch: '4' + + - user_agent_string: 'Pinterest for Android Tablet/4.3.1 (A7600-H; 4.4.2)' + family: 'Pinterest' + major: '4' + minor: '3' + patch: '1' + + - user_agent_string: 'Pinterest for Android/1.1.1 (endeavoru; 4.1.1)' + family: 'Pinterest' + major: '1' + minor: '1' + patch: '1' + + - user_agent_string: 'Pinterest for Android/3.6.2 (klte; 4.4.2)' + family: 'Pinterest' + major: '3' + minor: '6' + patch: '2' + + - user_agent_string: 'Pinterest/0.1' + family: 'Pinterest' + major: '0' + minor: '1' + patch: + + - user_agent_string: 'Pinterest/0.2 (+http://www.pinterest.com/)' + family: 'Pinterest' + major: '0' + minor: '2' + patch: + + - user_agent_string: 'Pinterest for Android/1.1.12 (endeavoru; 4.1.1)' + family: 'Pinterest' + major: '1' + minor: '1' + patch: '12' + + - user_agent_string: 'Pinterest/3.2 CFNetwork/672.0.8 Darwin/14.0.0' + family: 'Pinterest' + major: '3' + minor: '2' + patch: + + - user_agent_string: 'Pinterest/3.3.3 CFNetwork/609.1.4 Darwin/13.0.0' + family: 'Pinterest' + major: '3' + minor: '3' + patch: '3' + + - user_agent_string: 'Pinterest/3356 CFNetwork/711.0.6 Darwin/14.0.0' + family: 'Pinterest' + major: '3356' + minor: + patch: + + - user_agent_string: 'Pinterest/4.1.3 CFNetwork/672.1.14 Darwin/14.0.0' + family: 'Pinterest' + major: '4' + minor: '1' + patch: '3' + + - user_agent_string: 'Pinterest/0.2 (+https://www.pinterest.com/bot.html)' + family: 'Pinterestbot' + major: '0' + minor: '2' + patch: + + - user_agent_string: 'Mozilla/5.0 (compatible; Pinterestbot/1.0; +https://www.pinterest.com/bot.html)' + family: 'Pinterestbot' + major: '1' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Pinterestbot/1.0; +https://www.pinterest.com/bot.html)' + family: 'Pinterestbot' + major: '1' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) qutebrowser/0.2.1 Safari/538.1' + family: 'qutebrowser' + major: '0' + minor: '2' + patch: '1' + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) pagedraw/0.1.0 Chrome/49.0.2623.75 Electron/0.37.8 Safari/537.36' + family: 'Electron' + major: '0' + minor: '37' + patch: '8' + + - user_agent_string: 'Mozilla/5.0 (iPad; U; CPU OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Mobile' + family: 'Mobile Safari UI/WKWebView' + major: '4' + minor: '3' + patch: '2' + + - user_agent_string: 'Mozilla/5.0 (iPad; U; CPU OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari' + family: 'Mobile Safari' + major: '5' + minor: '0' + patch: '2' + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) QupZilla/1.6.3 Safari/538.1' + family: 'QupZilla' + major: '1' + minor: '6' + patch: '3' + + - user_agent_string: 'Mozilla/5.0 (OS/2 Warp 4.5) AppleWebKit/537.21 (KHTML, like Gecko) QupZilla/1.6.4 Safari/537.21' + family: 'QupZilla' + major: '1' + minor: '6' + patch: '4' + + - user_agent_string: 'Mozilla/5.0 (Unknown; UNIX BSD/SYSV system) AppleWebKit/534.34 (KHTML, like Gecko) QupZilla/1.7.0 Safari/534.34' + family: 'QupZilla' + major: '1' + minor: '7' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.21 (KHTML, like Gecko) QupZilla/1.6.1 Safari/537.21' + family: 'QupZilla' + major: '1' + minor: '6' + patch: '1' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/538.1 (KHTML, like Gecko) Otter/0.9.03 beta 3 Safari/538.1' + family: 'Otter' + major: '0' + minor: '9' + patch: '03' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/538.1 (KHTML, like Gecko) Otter/0.9.04' + family: 'Otter' + major: '0' + minor: '9' + patch: '04' + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.21 (KHTML, like Gecko) Otter/0.9.04-dev' + family: 'Otter' + major: '0' + minor: '9' + patch: '04' + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) Otter/0.3.01-dev Safari/538.1' + family: 'Otter' + major: '0' + minor: '3' + patch: '01' + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) Otter/0.9.03 beta 3 Safari/538.1' + family: 'Otter' + major: '0' + minor: '9' + patch: '03' + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) Otter/0.9.05' + family: 'Otter' + major: '0' + minor: '9' + patch: '05' + + - user_agent_string: 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; NOKIA; Lumia 930) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Mobile Safari/537.36 Edge/12.0' + family: 'Edge Mobile' + major: '12' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) brave/0.7.11 Chrome/47.0.2526.110 Brave/0.36.5 Safari/537.36' + family: 'Brave' + major: '0' + minor: '7' + patch: '11' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) brave/0.7.12 Chrome/47.0.2526.110 Brave/0.36.7 Safari/537.36 ' + family: 'Brave' + major: '0' + minor: '7' + patch: '12' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) brave/0.7.10 Chrome/47.0.2526.110 Brave/0.36.5 Safari/537.36' + family: 'Brave' + major: '0' + minor: '7' + patch: '10' + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome Safari/537.36' + family: 'HeadlessChrome' + major: + minor: + patch: + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3202.89 Safari/537.36' + family: 'HeadlessChrome' + major: '62' + minor: '0' + patch: '3202' + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/59.0.3071.109 HeadlessChrome/59.0.3071.109 Safari/537.36' + family: 'HeadlessChrome' + major: '59' + minor: '0' + patch: '3071' + + - user_agent_string: 'Roku/DVP-6.2 (096.02E06005A)' + family: 'Roku' + major: '6' + minor: '2' + patch: + + - user_agent_string: 'Roku/DVP-5.0 (025.00E08043A)' + family: 'Roku' + major: '5' + minor: '0' + patch: + + - user_agent_string: 'Roku/DVP-5.1 (025.01E01195A)' + family: 'Roku' + major: '5' + minor: '1' + patch: + + - user_agent_string: 'Microsoft Office/12.0 (Windows NT 6.1; Microsoft Office Outlook 12.0.6739; Pro)' + family: 'Outlook' + major: '2007' + minor: + patch: + + - user_agent_string: 'Microsoft Office/14.0 (Windows NT 6.1; Microsoft Outlook 14.0.5128; Pro)' + family: 'Outlook' + major: '2010' + minor: + patch: + + - user_agent_string: 'Microsoft Office/16.0 (Microsoft Outlook Mail 16.0.6525; Pro)' + family: 'Outlook' + major: '2016' + minor: + patch: + + - user_agent_string: 'Microsoft Office/16.0 (Windows NT 10.0; Microsoft Outlook 16.0.6326; Pro)' + family: 'Outlook' + major: '2016' + minor: + patch: + + - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/8.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Microsoft Outlook 16.0.6366; ms-office; MSOffice 16)' + family: 'Outlook' + major: '2016' + minor: + patch: + + - user_agent_string: 'Outlook-Express/7.0 (MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; TmstmpExt)' + family: 'Windows Live Mail' + major: + minor: + patch: + + - user_agent_string: 'Outlook-Express/7.0 (MSIE 7.0; Windows NT 5.1; Trident/4.0; AskTB5.6; TmstmpExt)' + family: 'Windows Live Mail' + major: + minor: + patch: + + - user_agent_string: 'Outlook-Express/7.0 (MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; Media Center PC 6.0; OfficeLiveConnector.1.4; OfficeLivePatch.1.3; InfoPath.3; FDM; TmstmpExt)' + family: 'Windows Live Mail' + major: + minor: + patch: + + - user_agent_string: 'Outlook-Express/7.0 (MSIE 6.0; Windows NT 5.1; SV1; GTB6.3; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; InfoPath.2; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; OfficeLiveConnector.1.3; OfficeLivePatch.0.0; TmstmpExt)' + family: 'Windows Live Mail' + major: + minor: + patch: + + - user_agent_string: 'Outlook-Express/7.0 (MSIE 8; Windows NT 5.1; Trident/4.0; GTB7.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; TmstmpExt)' + family: 'Windows Live Mail' + major: + minor: + patch: + + - user_agent_string: 'Outlook-Express/7.0 (MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1; TmstmpExt)' + family: 'Windows Live Mail' + major: + minor: + patch: + + - user_agent_string: 'Outlook-Express/7.0 (MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; HPDTDF; .NET4.0C; BRI/2; AskTbLOL/5.12.5.17640; TmstmpExt)' + family: 'Windows Live Mail' + major: + minor: + patch: + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.0.1; GT-I9505 Build/LRX22C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 YaBrowser/16.2.1.1239.00 Mobile Safari/537.36' + family: 'Yandex Browser' + major: '16' + minor: '2' + patch: '1' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.4.2; SM-G800F Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 MobileIron/1.6.0 Mobile Safari/537.36' + family: 'MobileIron' + major: '1' + minor: '6' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.4.4; GT-I9195I Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Crosswalk/14.43.343.17 Mobile Safari/537.36' + family: 'Crosswalk' + major: '14' + minor: '43' + patch: '343' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; Z831 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.94 Mobile Crosswalk/11.45.2454.20160425 Mobile Safari/537.36' + family: 'Crosswalk' + major: '11' + minor: '45' + patch: '2454' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Mobile/15A372 Safari Line/7.12.0' + family: 'LINE' + major: '7' + minor: '12' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.1; FTJ152B Build/LMY47D; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/51.0.2704.81 Mobile Safari/537.36 Line/6.4.1' + family: 'LINE' + major: '6' + minor: '4' + patch: '1' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.1.2; GT-S7710 Build/JZO54K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile' + family: 'Chrome Mobile' + major: '18' + minor: '0' + patch: '1025' + patch_minor: '166' + + - user_agent_string: 'Mozilla/5.0 (iPad; U; CPU OS 5_1_1 like Mac OS X; en-us) AppleWebKit/534.46.0 (KHTML, like Gecko) Chrome/19.0.1084.60 Mobile/9B206 Safari/7534.48.3' + family: 'Chrome Mobile' + major: '19' + minor: '0' + patch: '1084' + patch_minor: '60' + + - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 4.4.4; de-de; SM-G850F Build/KTU84P) AppleWebKit/537.16 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.16 Chrome/33.0.0.0' + family: 'Chrome Mobile WebView' + major: '33' + minor: '0' + patch: '0' + patch_minor: '0' + + - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 6.0.1; ru-ru; Redmi 4 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.128 Mobile Safari/537.36 XiaoMi/MiuiBrowser/10.3.6-g' + family: 'MiuiBrowser' + major: '10' + minor: '3' + patch: '6' + + - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 7.1.2; ru-ru; Redmi 4A Build/N2G47H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.128 Mobile Safari/537.36 XiaoMi/Mint Browser/1.3.3' + family: 'Mint Browser' + major: '1' + minor: '3' + patch: '3' + + - user_agent_string: 'Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.41 (KHTML, like Gecko) Large Screen WebAppManager Safari/537.41' + family: 'Safari' + major: + minor: + patch: + + - user_agent_string: 'MacOutlook/15.27.0.161010 (Intelx64 Mac OS X Version 10.11.6 (Build 15G1108))' + family: 'MacOutlook' + major: '15' + minor: '27' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/601.7.8 (KHTML, like Gecko) Slack_SSB/2.0.3' + family: 'Slack Desktop Client' + major: '2' + minor: '0' + patch: '3' + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) AtomShell/2.6.0 Chrome/56.0.2924.87 Electron/1.6.3 Safari/537.36 MacAppStore/16.5.0 Slack_SSB/2.6.0' + family: 'Slack Desktop Client' + major: '2' + minor: '6' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Slack/2.6.0-beta18998559 Chrome/56.0.2924.87 AtomShell/1.6.3 Safari/537.36 Slack_SSB/2.6.0' + family: 'Slack Desktop Client' + major: '2' + minor: '6' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/603.1.30 (KHTML, like Gecko) HipChat/732 (modern)' + family: 'HipChat Desktop Client' + major: '732' + minor: + patch: + + - user_agent_string: 'HipChat Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.7.0 Chrome/49.0.2623.111 Safari/537.36' + family: 'HipChat Desktop Client' + major: + minor: + patch: + + - user_agent_string: 'Microsoft-CryptoAPI/6.1' + family: 'Microsoft-CryptoAPI' + major: '6' + minor: '1' + patch: + + - user_agent_string: 'Microsoft SkyDriveSync 17.3.6517.0809 ship; Windows NT 6.1 Service Pack 1 (7601)' + family: 'Microsoft SkyDriveSync' + major: '17' + minor: '3' + patch: '6517' + + - user_agent_string: 'ExchangeServicesClient/14.02.0051.000' + family: 'ExchangeServicesClient' + major: '14' + minor: '02' + patch: '0051' + + - user_agent_string: 'Mac OS X/10.11.6 (15G1004); ExchangeWebServices/6.0 (243); Mail/9.3 (3124)' + family: 'ExchangeWebServices' + major: '6' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0+(iPhone;+CPU+iPhone+OS+9_3_1+like+Mac+OS+X)+AppleWebKit/601.1.46+(KHTML,+like+Gecko)+Version/9.0+Mobile/13E238+Safari/601.1' + family: 'Mobile Safari' + major: '9' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0+(iPad;+CPU+OS+9_3_1+like+Mac+OS+X)+AppleWebKit/601.1.46+(KHTML,+like+Gecko)+Version/9.0+Mobile/13E238+Safari/601.1' + family: 'Mobile Safari' + major: '9' + minor: '0' + patch: + + - user_agent_string: 'Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots)' + family: 'Slackbot-LinkExpanding' + major: '1' + minor: '0' + patch: + + - user_agent_string: 'Slack-ImgProxy 1.136 (+https://api.slack.com/robots)' + family: 'Slack-ImgProxy' + major: '1' + minor: '136' + patch: + + - user_agent_string: 'okhttp/3.4.2' + family: 'okhttp' + major: '3' + minor: '4' + patch: '2' + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1300.0 Iron/23.0.1300.0 Safari/537.11' + family: 'Iron' + major: '23' + minor: '0' + patch: '1300' + + - user_agent_string: 'Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Iron/9.0.600.2 Chrome/9.0.600.2 Safari/534.13' + family: 'Iron' + major: '9' + minor: '0' + patch: '600' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2750.0 Iron Safari/537.36' + family: 'Iron' + major: '52' + minor: '0' + patch: '2750' + + - user_agent_string: 'Mozilla/5.0 (Android; U; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) AdobeAIR/23.0' + family: 'AdobeAIR' + major: '23' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) AdobeAIR/19.0' + family: 'AdobeAIR' + major: '19' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (iOS; U; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) AdobeAIR/19.0' + family: 'AdobeAIR' + major: '19' + minor: '0' + patch: + + - user_agent_string: 'Kurio/3.0.8 Build 65303(Android Kitkat 4.4.4; Phone)' + family: 'Kurio App' + major: '3' + minor: '0' + patch: '8' + + - user_agent_string: 'BacaBerita App/5.5.0 (Linux; U; Android 4.4.4; en-us) Mobile Safari' + family: 'BacaBerita App' + major: '5' + minor: '5' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) MxBrowser/4.5.2.2000 Chrome/30.0.1551.0 Safari/537.36' + family: 'Maxthon' + major: '4' + minor: '5' + patch: '2' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.5.1000 Chrome/30.0.1599.101 Safari/537.36' + family: 'Maxthon' + major: '4' + minor: '4' + patch: '5' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-G930P Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36 MxBrowser/4.5.10.7000' + family: 'Maxthon' + major: '4' + minor: '5' + patch: '10' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.6 (KHTML, like Gecko) Chrome/18.0.1025.133 Safari/537.6 Midori/0.5' + family: 'Midori' + major: '0' + minor: '5' + patch: + + - user_agent_string: 'Mozilla/5.0 (iPad; U; CPU like Mac OS X; FIT_LANG_REPLACE) AppleWebKit/532+ (KHTML, like Gecko) Version/3.0 Mobile/1A538b Safari/419.3 Midori/0.4' + family: 'Midori' + major: '0' + minor: '4' + patch: + + - user_agent_string: 'curl/7.29.0' + family: 'curl' + major: '7' + minor: '29' + patch: '0' + + - user_agent_string: 'Debian APT-HTTP/1.3 (1.0.1ubuntu2)' + family: 'Debian APT-HTTP' + major: '1' + minor: '3' + patch: + + - user_agent_string: 'jupdate' + family: 'jupdate' + major: + minor: + patch: + + - user_agent_string: 'libcurl-agent/1.0' + family: 'libcurl-agent' + major: '1' + minor: '0' + patch: + + - user_agent_string: 'libwww-perl/6.05' + family: 'libwww-perl' + major: '6' + minor: '05' + patch: + + - user_agent_string: 'Microsoft-CryptoAPI/6.3' + family: 'Microsoft-CryptoAPI' + major: '6' + minor: '3' + patch: + + - user_agent_string: 'OpenBSD ftp' + family: 'OpenBSD ftp' + major: + minor: + patch: + + - user_agent_string: 'SophosAgent/1.0 (type= spa )' + family: 'SophosAgent' + major: '1' + minor: '0' + patch: + + - user_agent_string: 'SophosUpdateManager/1.5.7.50 SDDS/2.0 (u= EO2ANA123G c= 6342da15-f351-4ab7-9656-3f5f2d50885d )' + family: 'SophosUpdateManager' + major: '1' + minor: '5' + patch: '7' + + - user_agent_string: 'Ubuntu APT-HTTP/1.3 (0.7.20.2ubuntu6)' + family: 'Ubuntu APT-HTTP' + major: '1' + minor: '3' + patch: + + - user_agent_string: 'urlgrabber/3.10 yum/3.4.3' + family: 'urlgrabber' + major: '3' + minor: '10' + patch: + + - user_agent_string: 'urlgrabber/3.9.1 yum/3.2.29' + family: 'urlgrabber' + major: '3' + minor: '9' + patch: '1' + + - user_agent_string: 'Wget/1.14 (linux-gnu)' + family: 'Wget' + major: '1' + minor: '14' + patch: + + - user_agent_string: 'Windows-Update-Agent/7.9.9600.17729 Client-Protocol/1.21' + family: 'Windows-Update-Agent' + major: '7' + minor: '9' + patch: '9600' + + - user_agent_string: 'Windows-Update-Agent/7.9.9600.18094 Client-Protocol/1.21' + family: 'Windows-Update-Agent' + major: '7' + minor: '9' + patch: '9600' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.1.1; MI NOTE Pro Build/LMY47V; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/48.0.2564.116 Mobile Safari/537.36 baidubrowser/7.7.13.0 (Baidu; P1 5.1.1)' + family: 'Baidu Browser' + major: '7' + minor: '7' + patch: '13' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Dragon/36.1.1.21 Chrome/36.0.1985.97 Safari/537.36' + family: 'Dragon' + major: '36' + minor: '1' + patch: '1' + + - user_agent_string: 'Mozilla/5.0 (Windows; U; Windows CE 5.1; rv:1.8.1a3) Gecko/20060610 Minimo/0.016' + family: 'Minimo' + major: '0' + minor: '016' + patch: + + - user_agent_string: 'Opera/9.80 (MAUI Runtime; Opera Mini/4.4.39008/37.9178; U; en) Presto/2.12.423 Version/12.16' + family: 'Opera Mini' + major: '4' + minor: '4' + patch: '39008' + + - user_agent_string: 'Mozilla/5.0 (compatible; 008/0.83; http://www.80legs.com/spider.html) Gecko/2008032620' + family: '008' + major: '0' + minor: '83' + patch: + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_4 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) Outlook-iOS-Android/1.0 Mobile/13G35 Safari/601.1.46")' + family: 'Outlook-iOS-Android' + major: '1' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.21 Safari/537.36 MMS/1.0.2459.0' + family: 'Opera Neon' + major: '1' + minor: '0' + patch: '2459' + + - user_agent_string: 'PANTECH-EUROPA-U4000-orange/1.0 Obigo/Q04C MMS/1.2.0 profile/MIDP-2.0 configuration/CLDC-1.1' + family: 'Obigo' + major: '04' + minor: + patch: + + - user_agent_string: 'masscan/1.0 (https://github.com/robertdavidgraham/masscan)' + family: 'masscan' + major: '1' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 SznProhlizec/4.3.0-251281' + family: 'Seznam prohlížeč' + major: '4' + minor: '3' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.1.2; Redmi 4X Build/N2G47H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/64.0.3282.137 Mobile Safari/537.36 SznProhlizec/5.2.1a' + family: 'Seznam prohlížeč' + major: '5' + minor: '2' + patch: '1' + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 SznProhlizec/3.8.4 NWjs/0.19.6' + family: 'Seznam prohlížeč' + major: '3' + minor: '8' + patch: '4' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_2_1 like Mac OS X) AppleWebKit/602.4.6 (KHTML, like Gecko) Mobile/14D27 SznProhlizec/4.4i' + family: 'Seznam prohlížeč' + major: '4' + minor: '4' + patch: + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) coc_coc_browser/42.0 CoRom/36.0.1985.144 Chrome/36.0.1985.144 Safari/537.36' + family: 'Coc Coc' + major: '42' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) coc_coc_browser/49.0 Chrome/43.0.2357.138 Safari/537.36' + family: 'Coc Coc' + major: '49' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) coc_coc_browser/50.0.125 Chrome/44.0.2403.125 Safari/537.36' + family: 'Coc Coc' + major: '50' + minor: '0' + patch: '125' + + - user_agent_string: 'Mozilla/5.0 (compatible; Qwantify/2.4w; +https://www.qwant.com/)/2.4w' + family: 'Qwantify' + major: '2' + minor: '4' + patch: + + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12' + family: 'Edge' + major: '12' + minor: + patch: + + - user_agent_string: 'Bloglovin/1.0 (http://www.bloglovin.com; 1000 subscribers)' + family: 'Bloglovin' + major: '1' + minor: '0' + patch: + + - user_agent_string: 'Feedbin feed-id:1033517 - 1000 subscribers' + family: 'Feedbin' + major: + minor: + patch: + + - user_agent_string: 'Tiny Tiny RSS/16.3 (http://tt-rss.org/)' + family: 'Tiny Tiny RSS' + major: '16' + minor: '3' + patch: + + - user_agent_string: 'Mtps Feed Aggregation System' + family: 'Mtps Feed Aggregation System' + major: + minor: + patch: + + - user_agent_string: 'Stringer' + family: 'Stringer' + major: + minor: + patch: + + - user_agent_string: 'Box Sync/4.0.7848;Darwin/10.13;i386/64bit' + family: 'Box Sync' + major: '4' + minor: '0' + patch: '7848' + + - user_agent_string: 'Box/1.2.93;Darwin/10.13;i386/64bit' + family: 'Box' + major: '1' + minor: '2' + patch: '93' + + - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) BoxNotes/1.3.0 Chrome/56.0.2924.87 Electron/1.6.8 Safari/537.36' + family: 'BoxNotes' + major: '1' + minor: '3' + patch: '0' + + - user_agent_string: 'Box Sync/4.0.7848;Windows/8.1;x86 Family 6 Model 158 Stepping 9, GenuineIntel/32bit' + family: 'Box Sync' + major: '4' + minor: '0' + patch: '7848' + + - user_agent_string: 'Box Sync/4.0.7848;Windows/10;Intel64 Family 6 Model 158 Stepping 9, GenuineIntel/64bit' + family: 'Box Sync' + major: '4' + minor: '0' + patch: '7848' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) BoxNotes/1.3.0 Chrome/56.0.2924.87 Electron/1.6.8 Safari/537.36' + family: 'BoxNotes' + major: '1' + minor: '3' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) BoxNotes/1.3.0 Chrome/56.0.2924.87 Electron/1.6.8 Safari/537.36' + family: 'BoxNotes' + major: '1' + minor: '3' + patch: '0' + + - user_agent_string: 'Box/1.2.93;Windows/10;Intel64 Family 6 Model 158 Stepping 9, GenuineIntel/64bit' + family: 'Box' + major: '1' + minor: '2' + patch: '93' + + - user_agent_string: 'Evolution/3.26.2.1' + family: 'Evolution' + major: '3' + minor: '26' + patch: '2.1' + + - user_agent_string: 'RCM CardDAV plugin/2.0.4' + family: 'RCM CardDAV plugin' + major: '2' + minor: '0' + patch: '4' + + - user_agent_string: 'RCM CardDAV plugin/0.9.2-dev' + family: 'RCM CardDAV plugin' + major: '0' + minor: '9' + patch: '2-dev' + + - user_agent_string: 'DAVdroid/1.9.2-gplay (2017/11/04; dav4android; okhttp3) Android/7.1.2' + family: 'DAVdroid' + major: '1' + minor: '9' + patch: '2' + + - user_agent_string: 'DAVdroid/1.9-ose (2017/10/19; dav4android; okhttp3) Android/7.1.2' + family: 'DAVdroid' + major: '1' + minor: '9' + patch: + + - user_agent_string: 'Mozilla/5.0 (Windows) mirall/2.3.2 (build 1) (Nextcloud)' + family: 'Nextcloud' + major: + minor: + patch: + + - user_agent_string: 'Mozilla/5.0 (Linux) mirall/2.3.2 (Nextcloud)' + family: 'Nextcloud' + major: + minor: + patch: + + - user_agent_string: 'Mozilla/5.0 (Android) ownCloud-android/2.0.0' + family: 'Owncloud' + major: '2' + minor: '0' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) AppleNews/608.0.1 Version/2.0.1' + family: 'Mobile Safari UI/WKWebView' + major: '10' + minor: '0' + patch: '2' + + - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; InfoPath.3)' + family: 'IE' + major: '11' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Trident/6.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729)' + family: 'IE' + major: '10' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.2)' + family: 'IE' + major: '9' + minor: '0' + patch: + + - user_agent_string: 'Tableau/1.0 (1025794)' + family: 'Tableau' + major: '1' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_5 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/11.2.5 Mobile/9B179 Safari/7534.48.3 OktaMobile/5.10.2' + family: 'OktaMobile' + major: '5' + minor: '10' + patch: '2' + + - user_agent_string: 'BUbiNG (+http://law.di.unimi.it/BUbiNG.html)' + family: 'BUbiNG' + major: + minor: + patch: + + - user_agent_string: 'Mozilla/5.0 (compatible; SemrushBot/1.2~bl; +http://www.semrush.com/bot.html)' + family: 'SemrushBot' + major: '1' + minor: '2' + patch: + + - user_agent_string: 'Outlook-iOS/665.29827.prod.iphone (2.63.0)' + family: 'Outlook-iOS' + major: '2' + minor: '63' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; LG-TP260 Build/NRD90U; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/64.0.3282.137 Mobile Safari/537.36 Instagram 33.0.0.11.92 Android (24/7.0; 320dpi; 720x1193; LGE/lge; LG-TP260; lv517; lv517; en_US; 93117667)' + family: 'Instagram' + major: '33' + minor: '0' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_5 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Mobile/15D60 Instagram 33.0.0.11.96 (iPhone9,3; iOS 11_2_5; en_AU; en-AU; scale=2.00; gamut=wide; 750x1334)' + family: 'Instagram' + major: '33' + minor: '0' + patch: '0' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Mobile/15D100 Flipboard/4.2.2' + family: 'Flipboard' + major: '4' + minor: '2' + patch: '2' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-G610F Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/63.0.3239.111 Mobile Safari/537.36 Flipboard/4.1.9/4323,4.1.9.4323' + family: 'Flipboard' + major: '4' + minor: '1' + patch: '9' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-G930F Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/64.0.3282.137 Mobile Safari/537.36 Onefootball/Android/9.10.6' + family: 'Onefootball' + major: '9' + minor: '10' + patch: '6' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-A520F Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36 Flipboard-Briefing/2.7.28' + family: 'Flipboard-Briefing' + major: '2' + minor: '7' + patch: '28' + + + - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/8.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)' + family: 'IE' + major: '11' + minor: '0' + patch: + + - user_agent_string: 'ESPN Radio/3.2.113 CFNetwork/485.12.30 Darwin/10.4.0' + family: 'ESPN' + major: '3' + minor: '2' + patch: '113' + + - user_agent_string: 'ESPN Radio 4.7.4 rv:1032 (iPhone; iPhone OS 9.2.1; en_US)' + family: 'ESPN' + major: '4' + minor: '7' + patch: '4' + patch_minor: '1032' + + - user_agent_string: 'ESPN Radio 4.5.1 (iPhone; iPhone OS 5.1.1; en_US)' + family: 'ESPN' + major: '4' + minor: '5' + patch: '1' + + - user_agent_string: 'ESPN Radio 4.0 (iPhone; iPhone OS 7.1.2; en_AU)' + family: 'ESPN' + major: '4' + minor: '0' + patch: + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.2.2 Waterfox/55.2.2' + family: 'Waterfox' + major: '55' + minor: '2' + patch: '2' + + - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; rv:55.0) Gecko/20100101 Goanna/4.0 Firefox/55.0 Basilisk/20171113' + family: 'Basilisk' + major: '55' + minor: '0' + patch: '20171113' + + - user_agent_string: 'Go-http-client/1.1' + family: 'Go-http-client' + major: '1' + minor: '1' + patch: + + - user_agent_string: 'scalaj-http/1.0' + family: 'scalaj-http' + major: '1' + minor: '0' + patch: + + - user_agent_string: 'reqwest/0.8.1' + family: 'reqwest' + major: '0' + minor: '8' + patch: '1' + + - user_agent_string: 'Boto/2.48.0 Python/2.7.14 Linux/4.2.0-41-generic' + family: 'Boto' + major: '2' + minor: '48' + patch: '0' + + - user_agent_string: 'aws-cli/1.14.9 Python/2.7.12 Linux/4.9.76-3.78.amzn1.x86_64 botocore/1.8.13' + family: 'aws-cli' + major: '1' + minor: '14' + patch: '9' + + - user_agent_string: 'Boto3/1.6.2 Python/3.4.3 Linux/4.4.35-33.55.amzn1.x86_64 Botocore/1.9.2 Resource' + family: 'Boto3' + major: '1' + minor: '6' + patch: '2' + + - user_agent_string: 'ElasticMapReduce/1.0.0 emrfs/s3n {}, aws-sdk-java/1.11.129 Linux/4.4.35-33.55.amzn1.x86_64 OpenJDK_64-Bit_Server_VM/25.141-b16/1.8.0_141 scala/2.11.8' + family: 'aws-sdk-java' + major: '1' + minor: '11' + patch: '129' + + - user_agent_string: 'Hadoop 2.6.0-cdh5.14.0, aws-sdk-java/1.11.134 Linux/4.4.0-1052-aws OpenJDK_64-Bit_Server_VM/25.151-b12/1.8.0_151' + family: 'aws-sdk-java' + major: '1' + minor: '11' + patch: '134' + + - user_agent_string: 'Hadoop 2.8.3-amzn-0, aws-sdk-java/1.11.267 Linux/4.9.77-31.58.amzn1.x86_64 OpenJDK_64-Bit_Server_VM/25.161-b14 java/1.8.0_161 scala/2.11.8' + family: 'aws-sdk-java' + major: '1' + minor: '11' + patch: '267' + + - user_agent_string: 'aws-sdk-java/1.11.226 Mac_OS_X/10.12.6 Java_HotSpot(TM)_64-Bit_Server_VM/25.131-b11 java/1.8.0_131 scala/2.11.11' + family: 'aws-sdk-java' + major: '1' + minor: '11' + patch: '226' + + - user_agent_string: 'aws-sdk-ruby2/2.2.18 ruby/2.1.5 x86_64-linux' + family: 'aws-sdk-ruby2' + major: '2' + minor: '2' + patch: '18' + + - user_agent_string: 'aws-sdk-cpp/1.0.64 Linux/4.4.0-66-generic x86_64' + family: 'aws-sdk-cpp' + major: '1' + minor: '0' + patch: '64' + + - user_agent_string: 'aws-sdk-go/1.4.12 (go1.6; linux; amd64) S3Manager' + family: 'aws-sdk-go' + major: '1' + minor: '4' + patch: '12' + + - user_agent_string: 'aws-sdk-nodejs/2.141.0 win32/v8.4.0' + family: 'aws-sdk-nodejs' + major: '2' + minor: '141' + patch: '0' + + - user_agent_string: 'JetS3t/0.9.0 (Linux/4.4.0-1044-aws; amd64; en; JVM 1.8.0_131)' + family: 'JetS3t' + major: '0' + minor: '9' + patch: '0' + + - user_agent_string: 's3fs/1.80 (commit hash 6be3236; OpenSSL)' + family: 's3fs' + major: '1' + minor: '80' + patch: + + - user_agent_string: 'Cyberduck/6.3.0.27105 (Windows 10/10.0) (x86)' + family: 'Cyberduck' + major: '6' + minor: '3' + patch: '0' + + - user_agent_string: 'S3 Browser 7-4-5 https://s3browser.com' + family: 'S3 Browser' + major: '7' + minor: '4' + patch: '5' + + - user_agent_string: 'rclone/v1.34' + family: 'rclone' + major: '1' + minor: '34' + patch: + + - user_agent_string: 'PycURL/7.43.0 libcurl/7.38.0 OpenSSL/1.0.1t zlib/1.2.8 libidn/1.29 libssh2/1.4.3 librtmp/2.3' + family: 'PycURL' + major: '7' + minor: '43' + patch: '0' + + - user_agent_string: 'Axel 2.4 (Linux)' + family: 'Axel' + major: '2' + minor: '4' + patch: + + - user_agent_string: 'lftp/4.7.7' + family: 'lftp' + major: '4' + minor: '7' + patch: '7' + + - user_agent_string: 'aria2/1.19.0' + family: 'aria2' + major: '1' + minor: '19' + patch: '0' + + - user_agent_string: 'SalesforceMobileSDK/5.3.0 android mobile/7.1.1 (XT1635-02) Salesforce1/15.2 Native uid_bef1747905d064c6 ftr_ Cordova/6.2.3' + family: 'Salesforce' + major: '15' + minor: '2' + patch: + + - user_agent_string: 'YahooMailProxy; https://help.yahoo.com/kb/yahoo-mail-proxy-SLN28749.html' + family: 'YahooMailProxy' + major: + minor: + patch: + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Snapchat/10.38.0.25 (iPhone8,1; iOS 11.2.6; gzip)' + family: 'Snapchat' + major: '10' + minor: '38' + patch: '0' + patch_minor: '25' + + - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0_2 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) GSA/36.0.169645775 Mobile/15A421 Safari/604.1' + family: 'Google' + major: '36' + minor: '0' + patch: '169645775' + + - user_agent_string: 'ViaFree-DK/3.8.3 (com.MTGx.ViaFree.dk; build:7383; iOS 12.1.0) Alamofire/4.7.0' + family: 'ViaFree' + major: '3' + minor: '8' + patch: '3' + + - user_agent_string: 'Viafree-tvOS-DK/3.7.1 (com.MTGx.ViaFree.dk; build:7341; tvOS 12.1.0) Alamofire/4.7.0' + family: 'ViaFree' + major: '3' + minor: '7' + patch: '1' + + - user_agent_string: 'OC/15.0.5071.1000 (Skype for Business)' + family: 'Skype' + major: '15' + minor: '0' + patch: '5071' + patch_minor: '1000' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 8.1.0; TA-1024 Build/OPR1.170623.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.99 Mobile Safari/537.36 GSA/8.65.5.21.arm64' + family: 'Google' + major: '8' + minor: '65' + patch: '5' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 8.0.0; SM-G960F Build/R16NW; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.99 Mobile Safari/537.36 GSA/8.65.5.21.arm64' + family: 'Google' + major: '8' + minor: '65' + patch: '5' + + - user_agent_string: 'Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PQ1A.181205.006; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.99 Mobile Safari/537.36 GSA/8.65.5.21.arm64' + family: 'Google' + major: '8' + minor: '65' + patch: '5' + + - user_agent_string: 'Microsoft Office Word 2014' + family: 'Word' + major: + minor: + patch: + + - user_agent_string: 'Ghost/2.13.1+moya (https://github.com/TryGhost/Ghost)' + family: 'Ghost' + major: '2' + minor: '13' + patch: '1' + + - user_agent_string: 'Ghost/2.10.8 (https://github.com/TryGhost/Ghost)' + family: 'Ghost' + major: '2' + minor: '10' + patch: '8' + + - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3763.0 Safari/537.36 Edg/75.0.131.0' + family: 'Edge' + major: '75' + minor: '0' + patch: '131' + patch_minor: '0'