diff --git a/.coveralls.yml b/.coveralls.yml index 64139da3c..12ac320fb 100644 --- a/.coveralls.yml +++ b/.coveralls.yml @@ -1,4 +1,4 @@ -service_name: travis-ci +service_name: github-actions coverage_clover: - runner.xml diff --git a/.gitattributes b/.gitattributes index 51332b197..d0dfdb46b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,5 +2,5 @@ /.coveralls.yml export-ignore /.gitattributes export-ignore /.gitignore export-ignore -/.travis.yml export-ignore +/.github export-ignore /phpunit.xml export-ignore diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..55eab3be0 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,50 @@ +name: build + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + php-versions: ['7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1', '8.2'] + + steps: + - name: Checkout source + uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-versions }} + ini-values: memory_limit=2048M + + - name: Get composer cache directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + + - name: Cache dependencies + uses: actions/cache@v2 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ matrix.php-versions }}-composer-${{ hashFiles('**/composer.json') }} + restore-keys: ${{ matrix.php-versions }}-composer- + + - name: Install dependencies + run: composer install --prefer-dist + + - name: Check code standards + run: vendor/bin/phpcs --standard=PSR1,PSR2 -n src + + - name: Run useragent string tests + run: php bin/runner.php --show check + + - name: Run unit tests + run: vendor/bin/phpunit --no-coverage tests/unit diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 000000000..15451af0a --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,49 @@ +name: coverage + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + + workflow_dispatch: + +jobs: + coverage: + runs-on: ubuntu-latest + + steps: + - name: Checkout source + uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '7.4' + ini-values: memory_limit=2048M + coverage: pcov + + - name: Get composer cache directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + + - name: Cache dependencies + uses: actions/cache@v2 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: coverage-composer-${{ hashFiles('**/composer.json') }} + restore-keys: coverage-composer- + + - name: Install dependencies + run: composer install --prefer-dist + + - name: Run useragent string tests + run: php bin/runner.php --coverage --show check + + - name: Run unit tests + run: vendor/bin/phpunit --coverage-clover phpunit.xml tests/unit + + - name: Upload coverage results to Coveralls + env: + COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: vendor/bin/php-coveralls -v \ No newline at end of file diff --git a/.gitignore b/.gitignore index eaf5aa6c2..67a980b20 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ node_modules/* humbug* build/* .vscode -.DS_Store +.DS_Store +.phpunit.result.cache \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index ed4b58cca..000000000 --- a/.travis.yml +++ /dev/null @@ -1,41 +0,0 @@ -sudo: false -dist: trusty -language: php - -php: - - 5.4 - - 5.5 - - 5.6 - - 7.0 - - 7.1 - - 7.2 - - 7.3 - - 7.4 - -before_script: - - composer self-update - - composer update --prefer-source - - # Install suggested cache/array-adapter on supported versions of PHP - - composer require --dev cache/array-adapter || true - - # Set memory limit to 2 MB - - echo "memory_limit=2048M" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini - - # Disable X-debug on all but PHP 5.6 - - if [ "$TRAVIS_PHP_VERSION" != "5.6" ]; then phpenv config-rm xdebug.ini; fi - -script: - - vendor/bin/phpcs --standard=PSR1,PSR2 -n src - - # Run tests (all except PHP 5.6) - - if [ "$TRAVIS_PHP_VERSION" != "5.6" ]; then php bin/runner.php --show check; fi - - if [ "$TRAVIS_PHP_VERSION" != "5.6" ]; then vendor/bin/phpunit; fi - - # Run tests with coverage enabled (only PHP 5.6) - - if [ "$TRAVIS_PHP_VERSION" = "5.6" ]; then php bin/runner.php --coverage --show check; fi - - if [ "$TRAVIS_PHP_VERSION" = "5.6" ]; then vendor/bin/phpunit --coverage-clover phpunit.xml; fi - -after_script: - # Upload coverage to Coveralls.io - - if [ "$TRAVIS_PHP_VERSION" = "5.6" ]; then travis_retry php vendor/bin/coveralls -v; fi diff --git a/README.md b/README.md index 43b3e0c65..be328b290 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ This is an extremely complicated and almost completely useless browser sniffing WhichBrowser/Parser-PHP ======================= -The PHP version of WhichBrowser for use on a server. Fully compatible with PHP 5.4 or higher, including PHP 7. +The PHP version of WhichBrowser for use on a server. Fully compatible with PHP 7.0 or higher, including PHP 8. -[![Build Status](https://travis-ci.org/WhichBrowser/Parser-PHP.svg?branch=master)](https://travis-ci.org/WhichBrowser/Parser-PHP) +![Build](https://github.com/WhichBrowser/Parser-PHP/workflows/Build/badge.svg) [![Coverage Status](https://coveralls.io/repos/WhichBrowser/Parser-PHP/badge.svg?branch=master&service=github)](https://coveralls.io/github/WhichBrowser/Parser-PHP?branch=master) [![License](https://poser.pugx.org/whichbrowser/parser/license)](https://packagist.org/packages/whichbrowser/parser) [![Latest Stable Version](https://poser.pugx.org/whichbrowser/parser/v/stable)](https://packagist.org/packages/whichbrowser/parser) @@ -58,7 +58,7 @@ The useragent header looks like Opera 11.10 on Linux, but we know it's Opera Min Requirements ----------------- -WhichBrowser requires with PHP 5.4 or higher and supports PHP 7. WhichBrowser is compatible with the PSR-4 autoloading standard and follows PSR-1 and PSR-2 coding style. +WhichBrowser requires with PHP 7.0 or higher and supports PHP 8. WhichBrowser is compatible with the PSR-4 autoloading standard and follows PSR-1 and PSR-2 coding style. How to install it @@ -154,7 +154,7 @@ Or access parts of these properties directly: $result->browser->name; // Chrome -$result->browser->name . ' ' . $result->browser->version.toString(); +$result->browser->name . ' ' . $result->browser->version->toString(); // Chrome 27 $result->browser->version->value; @@ -264,7 +264,7 @@ Is used to query the `name` and `version` property of the `engine` object. This Is used to query the `name` and `version` property of the `os` object. This function works in exactly the same way as `isBrowser`. `isDetected()` -Is there actually some browser detected, for did we fail to detect anything? +Is there actually some browser detected, or did we fail to detect anything? `toString()` Get a human readable representation of the detected browser, including operating system and device information. diff --git a/bin/runner.php b/bin/runner.php index a7ed648d0..da5353578 100755 --- a/bin/runner.php +++ b/bin/runner.php @@ -4,8 +4,10 @@ use WhichBrowser\Testrunner; use WhichBrowser\Tests; +use SebastianBergmann\CodeCoverage\CodeCoverage; +use SebastianBergmann\CodeCoverage\Report\Clover; -set_error_handler(function ($errno, $errstr, $errfile, $errline, array $errcontext) { +set_error_handler(function ($errno, $errstr, $errfile, $errline) { // error was suppressed with the @-operator if (0 === error_reporting()) { return false; @@ -50,7 +52,7 @@ case 'check': if (in_array('coverage', $options)) { - $coverage = new PHP_CodeCoverage; + $coverage = new CodeCoverage; $coverage->filter()->addDirectoryToWhitelist('src'); $coverage->start('Testrunner'); } @@ -60,7 +62,7 @@ if (in_array('coverage', $options)) { $coverage->stop(); - $writer = new PHP_CodeCoverage_Report_Clover; + $writer = new Clover; $writer->process($coverage, 'runner.xml'); echo "\nCoverage saved as runner.xml\n\n"; diff --git a/composer.json b/composer.json index d92eb52a8..f594ad43e 100644 --- a/composer.json +++ b/composer.json @@ -15,12 +15,12 @@ "require": { "php": ">=5.4.0", - "psr/cache": "^1.0" + "psr/cache": "^1.0 || ^2.0 || ^3.0" }, "autoload": { "psr-4": { - "WhichBrowser\\": [ "src/", "tests/src/" ] + "WhichBrowser\\": [ "src/" ] } }, @@ -29,17 +29,19 @@ }, "require-dev": { - "symfony/yaml": "~2.8 || ~3.4 || ~4.2 || ~5.0", - "phpunit/php-code-coverage": "^2.2 || ^3.0", - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", - "satooshi/php-coveralls": "^1.0", + "symfony/yaml": "~3.4 || ~4.0", + "phpunit/php-code-coverage": "^5.0 || ^7.0", + "phpunit/phpunit": "^6.0 || ^8.0", + "php-coveralls/php-coveralls": "^2.0", "icomefromthenet/reverse-regex" : "0.0.6.3", - "squizlabs/php_codesniffer": "2.5.*" + "squizlabs/php_codesniffer": "^3.5", + "cache/array-adapter": "^1.1" }, "autoload-dev": { "psr-4": { - "WhichBrowserTest\\": "tests/unit" + "WhichBrowserTest\\": "tests/unit", + "WhichBrowser\\": [ "tests/src/" ] }, "files": [ "tests/src/polyfills.php" ] diff --git a/data/applications-bots.php b/data/applications-bots.php index 322e1c506..ed05f1373 100644 --- a/data/applications-bots.php +++ b/data/applications-bots.php @@ -12,13 +12,19 @@ [ 'name' => 'Adaxas', 'id' => 'adaxas', 'regexp' => '/Adaxas Spider/u' ], [ 'name' => 'AddThis.com', 'id' => 'addthis', 'regexp' => '/AddThis.com/u' ], [ 'name' => 'ADmantX', 'id' => 'admantx', 'regexp' => '/ADmantX Platform Semantic Analyzer/u' ], - [ 'name' => 'AhrefsBot', 'id' => 'ahrefsbot', 'regexp' => '/AhrefsBot.Feeds v([0-9.]*)/u' ], - [ 'name' => 'AhrefsBot', 'id' => 'ahrefsbot', 'regexp' => '/AhrefsBot\/([0-9.]*)/u' ], + [ 'name' => 'Adsbot', 'id' => 'adsbot', 'regexp' => '/Adsbot\/([0-9.]*)/u' ], // Not to be mixed up with Google Adsbot + [ 'name' => 'Ahrefs Feeds Bot', 'id' => 'ahrefs', 'regexp' => '/AhrefsBot\.Feeds v([0-9.]*)/u' ], + [ 'name' => 'Ahrefs Site Audit Bot', 'id' => 'ahrefs', 'regexp' => '/AhrefsSiteAudit\/([0-9.]*)/u' ], + [ 'name' => 'Ahrefs News Bot', 'id' => 'ahrefs', 'regexp' => '/AhrefsBot\/([0-9.]*); News/u' ], + [ 'name' => 'Ahrefs SA Bot', 'id' => 'ahrefs', 'regexp' => '/AhrefsBot\/([0-9.]*); SA/u' ], + [ 'name' => 'Ahrefs Bot', 'id' => 'ahrefs', 'regexp' => '/AhrefsBot\/([0-9.]*)/u' ], [ 'name' => 'Alexa', 'id' => 'archiver', 'regexp' => '/ia_archiver/u' ], [ 'name' => 'AltaVista', 'id' => 'altavista', 'regexp' => '/AltaVista Intranet V([0-9.]*)/u' ], [ 'name' => 'Analytics SEO', 'id' => 'curious', 'regexp' => '/Curious George - www.analyticsseo.com\/crawler/u' ], [ 'name' => 'Amazon CloudFront', 'id' => 'cloudfront', 'regexp' => '/Amazon CloudFront/u' ], [ 'name' => 'Amorank Spider', 'id' => 'amorank', 'regexp' => '/AmorankSpider\/([0-9.]*)/u' ], + [ 'name' => 'Apple Bot', 'id' => 'apple', 'regexp' => '/Applebot\/([0-9.]*)/u' ], + [ 'name' => 'Apple News Bot', 'id' => 'apple', 'regexp' => '/AppleNewsBot/u' ], [ 'name' => 'ArchiveBot', 'id' => 'archive', 'regexp' => '/ArchiveTeam ArchiveBot/u' ], [ 'name' => 'Archive.org', 'id' => 'archive', 'regexp' => '/archive.org_bot(?:\/([0-9.]*))?/u' ], [ 'name' => 'Archive.org', 'id' => 'archive', 'regexp' => '/special_archiver(?:\/([0-9.]*))?/u' ], @@ -32,6 +38,7 @@ [ 'name' => 'Baiduspider', 'id' => 'baidu', 'regexp' => '/baiduspider-mobile-gate/u' ], [ 'name' => 'Baiduspider', 'id' => 'baidu', 'regexp' => '/\+http:\/\/www.baidu.com\/search\/spider.html/u' ], [ 'name' => 'Baiduspider', 'id' => 'baidu', 'regexp' => '/BaiduImagespider/u' ], + [ 'name' => 'Barkrowler', 'id' => 'barkrowler', 'regexp' => '/Barkrowler\/([0-9.]*)/u' ], [ 'name' => 'BazQux', 'id' => 'bazqux', 'regexp' => '/BazQux\/([0-9.]*)/u' ], [ 'name' => 'Bing', 'id' => 'bingbot', 'regexp' => '/bingbot\/([0-9.]*)/u' ], [ 'name' => 'Bing', 'id' => 'msnbot', 'regexp' => '/msnbot\/([0-9.]*)/u' ], @@ -42,7 +49,10 @@ [ 'name' => 'Bing', 'id' => 'msnbot', 'regexp' => '/MSNBOT_Mobile/u' ], [ 'name' => 'Bing', 'id' => 'msmobot', 'regexp' => '/MSMOBOT/u' ], [ 'name' => 'Bing Preview', 'id' => 'bing', 'regexp' => '/BingPreview\/([0-9.]*)/u' ], + [ 'name' => 'Blex Bot', 'id' => 'blex', 'regexp' => '/BLEXBot\/([0-9.]*)/u' ], + [ 'name' => 'Blex Test Bot', 'id' => 'blex', 'regexp' => '/BLEXBotTest\/([0-9.]*)/u' ], [ 'name' => 'BlogBridge', 'id' => 'blogbridge', 'regexp' => '/BlogBridge ([0-9.]*)/u' ], + [ 'name' => 'Blogger Bot', 'id' => 'blogger', 'regexp' => '/blogger\.com\)/u' ], [ 'name' => 'Bloglines', 'id' => 'bloglines', 'regexp' => '/Bloglines\/([0-9.]*)/u' ], [ 'name' => 'Bloglovin', 'id' => 'bloglovin', 'regexp' => '/Bloglovin\/([0-9.]*)/u' ], [ 'name' => 'BlogPulse', 'id' => 'blogpulse', 'regexp' => '/BlogPulse \(ISSpider-([0-9.]*)/u' ], @@ -50,21 +60,46 @@ [ 'name' => 'Blogtrottr', 'id' => 'blogtrot', 'regexp' => '/Blogtrottr\/([0-9.]*)/u' ], [ 'name' => 'Blogshares', 'id' => 'blogshares', 'regexp' => '/Blogshares/u' ], [ 'name' => 'BoardReader', 'id' => 'boardreader', 'regexp' => '/BoardReader\/([0-9.]*)/u' ], + [ 'name' => 'British Library', 'id' => 'lddc', 'regexp' => '/uk_lddc_bot\/([0-9.]*)/u' ], [ 'name' => 'Browsershots', 'id' => 'browsershots', 'regexp' => '/Browsershots/u' ], [ 'name' => 'BUbiNG', 'id' => 'bubing', 'regexp' => '/BUbiNG/u' ], + [ 'name' => 'Buck', 'id' => 'buck', 'regexp' => '/Buck\/([0-9.]*)/u' ], + [ 'name' => 'BuiltWith', 'id' => 'builtwith', 'regexp' => '/BuiltWith\/([0-9.]*)/u' ], [ 'name' => 'Butterfly', 'id' => 'butterfly', 'regexp' => '/Butterfly\/([0-9.]*)/u' ], + [ 'name' => 'BuzzSumo', 'id' => 'buzzsumo', 'regexp' => '/buzzsumo\.com/u' ], + [ 'name' => 'Bytespider', 'id' => 'bytespider', 'regexp' => '/Bytespider/u' ], [ 'name' => 'CiteSeerX', 'id' => 'heritrix', 'regexp' => '/heritrix\/([0-9.]*)/u' ], + [ 'name' => 'Clarabot', 'id' => 'clarabot', 'regexp' => '/Clarabot\/([0-9.]*)/u' ], [ 'name' => 'Cliqzbot', 'id' => 'cliqz', 'regexp' => '/Cliqzbot\/([0-9.]*)/u' ], - [ 'name' => 'CloudFare Always Online', 'id' => 'cloudflare', 'regexp' => '/CloudFlare-AlwaysOnline\/([0-9.]*)/u' ], + [ 'name' => 'Cloudflare Always Online', 'id' => 'cloudflare', 'regexp' => '/CloudFlare-AlwaysOnline\/([0-9.]*)/u' ], + [ 'name' => 'Cloudflare AMP', 'id' => 'cloudflare', 'regexp' => '/Cloudflare-AMP\/([0-9.]*)/u' ], + [ 'name' => 'Cloudflare Diagnostics', 'id' => 'cloudflare', 'regexp' => '/Cloudflare Diagnostics/u' ], + [ 'name' => 'Cloudflare Diagnostics', 'id' => 'cloudflare', 'regexp' => '/Cloudflare-Diagnostics/u' ], + [ 'name' => 'Cloudflare SpeedTest', 'id' => 'cloudflare', 'regexp' => '/Cloudflare SpeedTest\/([0-9.]*)/u' ], + [ 'name' => 'Coccocbot Web', 'id' => 'coccoc', 'regexp' => '/coccocbot-web\/([0-9.]*)/u' ], + [ 'name' => 'Coccocbot Image', 'id' => 'coccoc', 'regexp' => '/coccocbot-image\/([0-9.]*)/u' ], [ 'name' => 'Comodo', 'id' => 'comodo', 'regexp' => '/Comodo Spider ([0-9.]*)/u' ], [ 'name' => 'CommaFeed', 'id' => 'commafeed', 'regexp' => '/CommaFeed\/([0-9.]*)/u' ], - [ 'name' => 'CommonCrawl', 'id' => 'cbot', 'regexp' => '/CCBot\/([0-9.]*)/u' ], + [ 'name' => 'Common Crawl Bot', 'id' => 'cbot', 'regexp' => '/CCBot\/([0-9.]*)/u' ], + [ 'name' => 'Common Crawl Research Bot', 'id' => 'cresearch', 'regexp' => '/CCResearchBot\/([0-9.]*)/u' ], [ 'name' => 'Data Hotel Watchdog', 'id' => 'watchdog', 'regexp' => '/Data-Hotel-Watchdog\/([0-9.]*)/u' ], + [ 'name' => 'Datanyze', 'id' => 'datanyze', 'regexp' => '/Datanyze/u' ], [ 'name' => 'DataparkSearch', 'id' => 'datasearch', 'regexp' => '/DataparkSearch\/([0-9.]*)/u' ], + [ 'name' => 'Dataprovider Bot', 'id' => 'dataprovider', 'regexp' => '/Dataprovider/u' ], + [ 'name' => 'Daum', 'id' => 'daum', 'regexp' => '/Daum\/([0-9.]*)/u' ], [ 'name' => 'Daumoa', 'id' => 'daumoa', 'regexp' => '/Daumoa ([0-9.]*)/u' ], [ 'name' => 'Digg', 'id' => 'digg', 'regexp' => '/Digg Deeper\/v([0-9.]*)/u' ], [ 'name' => 'Digg', 'id' => 'digg', 'regexp' => '/Digg\/([0-9.]*)/u' ], + [ 'name' => 'DomainCrawler', 'id' => 'domaincrawl', 'regexp' => '/DomainCrawler\/([0-9.]*)/u' ], + [ 'name' => 'Domain Stats Bot', 'id' => 'domainstats', 'regexp' => '/DomainStatsBot\/([0-9.]*)/u' ], + [ 'name' => 'Discord', 'id' => 'discord', 'regexp' => '/Discordbot\/([0-9.]*)/u' ], [ 'name' => 'Domain Re-Animator', 'id' => 'domain', 'regexp' => '/Domain Re-Animator Bot/u' ], + [ 'name' => 'DMCA', 'id' => 'dmca', 'regexp' => '/DMCA\.com Page Protection Crawling Service/u' ], + [ 'name' => 'DuckDuckGo Bot', 'id' => 'duckduck', 'regexp' => '/DuckDuckBot\/([0-9.]*)/u' ], + [ 'name' => 'DuckDuckGo Https Bot', 'id' => 'duckduck', 'regexp' => '/DuckDuckBot-Https\/([0-9.]*)/u' ], + [ 'name' => 'DuckDuckGo Favicons Bot', 'id' => 'duckduck', 'regexp' => '/DuckDuckGo-Favicons-Bot\/([0-9.]*)/u' ], + [ 'name' => 'Embed PHP Library', 'id' => 'embed', 'regexp' => '/Embed PHP library/iu' ], + [ 'name' => 'Evc-batch', 'id' => 'evc', 'regexp' => '/evc-batch\/([0-9.]*)/u' ], [ 'name' => 'Exabot Thumbnails', 'id' => 'exabot', 'regexp' => '/Exabot-Thumbnails/u' ], [ 'name' => 'ExactSeek', 'id' => 'exactseek', 'regexp' => '/ExactSeek Crawler/u' ], [ 'name' => 'Ezooms Crawler', 'id' => 'ezooms', 'regexp' => '/Ezooms\/([0-9.]*)/u' ], @@ -91,11 +126,13 @@ [ 'name' => 'FeedValidator', 'id' => 'validator', 'regexp' => '/FeedValidator\/([0-9.]*)/u' ], [ 'name' => 'FeedZirra', 'id' => 'feed', 'regexp' => '/feedzirra/u' ], [ 'name' => 'Fever', 'id' => 'fever', 'regexp' => '/Fever\/([0-9.]*)/u' ], + [ 'name' => 'Florienzh', 'id' => 'florienzh', 'regexp' => '/Florienzh\/([0-9.]*)/u' ], [ 'name' => 'Friendica', 'id' => 'friendica', 'regexp' => '/Friendica/u' ], [ 'name' => 'FTRF: Friendly Robot', 'id' => 'robot', 'regexp' => '/FTRF: Friendly robot\/([0-9.]*)/u' ], [ 'name' => 'Genieo Web Filter', 'id' => 'genieo', 'regexp' => '/Genieo\/([0-9.]*)/u' ], [ 'name' => 'GNIP', 'id' => 'fetchor', 'regexp' => '/UnwindFetchor\/([0-9.]*)/u' ], [ 'name' => 'Gocrawl', 'id' => 'google', 'regexp' => '/Googlebot \(gocrawl v([0-9.]*)\)/u' ], + [ 'name' => 'Gofeed', 'id' => 'gofeed', 'regexp' => '/Gofeed\/([0-9.]+)/u' ], [ 'name' => 'GomezAgent', 'id' => 'gomez', 'regexp' => '/GomezAgent ([0-9.]+)/u' ], [ 'name' => 'Goo', 'id' => 'ichiro', 'regexp' => '/ichiro\/mobile goo/u' ], [ 'name' => 'Goo Blog Search', 'id' => 'gooblog', 'regexp' => '/gooblog\/([0-9.]*)/u' ], @@ -110,6 +147,7 @@ [ 'name' => 'Google App Engine', 'id' => 'google', 'regexp' => '/AppEngine-Google/u' ], [ 'name' => 'Google Web Preview', 'id' => 'google', 'regexp' => '/Google Web Preview/u' ], [ 'name' => 'Google Page Speed', 'id' => 'google', 'regexp' => '/Google Page Speed Insights/u' ], + [ 'name' => 'Google Favicon', 'id' => 'google', 'regexp' => '/Google Favicon/u' ], [ 'name' => 'Google FeedBurner', 'id' => 'feed', 'regexp' => '/FeedBurner\/([0-9.]*)/u' ], [ 'name' => 'Google Feedfetcher', 'id' => 'google', 'regexp' => '/Feedfetcher-Google/iu' ], [ 'name' => 'Google Font Analysis', 'id' => 'google', 'regexp' => '/Google-FontAnalysis\/([0-9.]*)/u' ], @@ -122,6 +160,7 @@ [ 'name' => 'Google Wireless Transcoder', 'id' => 'google', 'regexp' => '/Google Wireless Transcoder/u' ], [ 'name' => 'Google Play Newsstand', 'id' => 'google', 'regexp' => '/GoogleProducer/u' ], [ 'name' => 'Google YouTube Sample', 'id' => 'google', 'regexp' => '/Google-YouTubeSample\/([0-9.]*)/u' ], + [ 'name' => 'Gowikibot', 'id' => 'gowiki', 'regexp' => '/Gowikibot\/([0-9.]*)/u' ], [ 'name' => 'Grammarly', 'id' => 'grammarly', 'regexp' => '/Grammarly\/([0-9.]*)/u' ], [ 'name' => 'Grub', 'id' => 'grub', 'regexp' => '/grub-client-([0-9.]*)/u' ], [ 'name' => 'Hatena Antenna', 'id' => 'hatena', 'regexp' => '/Hatena Antenna\/([0-9.]*)/u' ], @@ -129,30 +168,57 @@ [ 'name' => 'Hatena Pagetitle', 'id' => 'hatena', 'regexp' => '/Hatena Pagetitle Agent\/([0-9.]*)/u' ], [ 'name' => 'HeartRails Capture', 'id' => 'capture', 'regexp' => '/HeartRails_Capture\/([0-9.]*)/u' ], [ 'name' => 'Heureka Feed', 'id' => 'heureka', 'regexp' => '/Heurekabot-Feed/u' ], + [ 'name' => 'HootSuite', 'id' => 'hootsuite', 'regexp' => '/Hootsuite-WebFeed\/([0-9\.]*)/u' ], + [ 'name' => 'HootSuite', 'id' => 'hootsuite', 'regexp' => '/HootSuite Image proxy/u' ], [ 'name' => 'htdig', 'id' => 'htdig', 'regexp' => '/htdig\/([0-9.]*)/u' ], [ 'name' => 'HTTPMon', 'id' => 'httpmon', 'regexp' => '/HTTPMon\/([0-9.]*)/u' ], [ 'name' => 'HubPages', 'id' => 'hubpages', 'regexp' => '/HubPages V([0-9.]*)/u' ], + [ 'name' => 'HubSpot Crawler', 'id' => 'hubspot', 'regexp' => '/hubspot\.com/u' ], [ 'name' => 'iAsk Spider', 'id' => 'spider', 'regexp' => '/iaskspider\/([0-9.]*)/u' ], [ 'name' => 'iAsk Spider', 'id' => 'spider', 'regexp' => '/iaskspider2/u' ], [ 'name' => 'Ichiro', 'id' => 'ichiro', 'regexp' => '/ichiro\/([0-9.]*)/u' ], [ 'name' => 'Internet Archive', 'id' => 'archive', 'regexp' => '/InternetArchive\/([0-9.]*)/u' ], + [ 'name' => 'IndeedBot', 'id' => 'indeed', 'regexp' => '/IndeedBot ([0-9.]*)/u' ], + [ 'name' => 'Iodc', 'id' => 'iodc', 'regexp' => '/iodc\.co\.uk/u' ], + [ 'name' => 'Istellabot', 'id' => 'istellabot', 'regexp' => '/istellabot\/t\.([0-9.]*)/u' ], [ 'name' => 'JamesBOT', 'id' => 'crawler', 'regexp' => '/James BOT - WebCrawler/u' ], [ 'name' => 'Jayde', 'id' => 'crawler', 'regexp' => '/Jayde Crawler./u' ], + [ 'name' => 'KakaoTalk Bot', 'id' => 'kakao', 'regexp' => '/kakaotalk-scrap\/([0-9.]*)/u' ], [ 'name' => 'Kouio', 'id' => 'kouio', 'regexp' => '/kouio.com/u' ], [ 'name' => 'Larbin', 'id' => 'larbin', 'regexp' => '/[Ll]arbin[\/_]([0-9.]*)/u' ], + [ 'name' => 'LetsearchBot', 'id' => 'letsearch', 'regexp' => '/LetsearchBot\/([0-9.]*)/u' ], + [ 'name' => 'Line Bot', 'id' => 'line', 'regexp' => '/Linespider\/([0-9.]*)/u' ], [ 'name' => 'Linkedin Bot', 'id' => 'linkedin', 'regexp' => '/LinkedInBot\/([0-9.]*)/u' ], + [ 'name' => 'Linkpad Bot', 'id' => 'linkpad', 'regexp' => '/LinkpadBot\/([0-9.]*)/u' ], [ 'name' => 'Linkdex Bot', 'id' => 'linkdex', 'regexp' => '/linkdexbot-mobile\/([0-9.]*)/u' ], [ 'name' => 'Linkdex Bot', 'id' => 'linkdex', 'regexp' => '/linkdex.com\/v([0-9.]*)/u' ], [ 'name' => 'Livedoor', 'id' => 'livedoor', 'regexp' => '/livedoor/u' ], + [ 'name' => 'LookSeek', 'id' => 'seeker', 'regexp' => '/Seeker v\.([0-9.]*)/u' ], [ 'name' => 'LTX71', 'id' => 'ltx71', 'regexp' => '/ltx71/u' ], [ 'name' => 'Magpie RSS', 'id' => 'magpie', 'regexp' => '/MagpieRSS\/([0-9.]*)/u' ], + [ 'name' => 'Majestic MJ12 Bot', 'id' => 'mj12bot', 'regexp' => '/MJ12bot\/v([0-9.]*)/u' ], + [ 'name' => 'Majestic MJ12 Bot', 'id' => 'mj12bot', 'regexp' => '/mj12bot/u' ], [ 'name' => 'Mapian News Bot', 'id' => 'mapion', 'regexp' => '/mapion-news-bot\/([0-9.]*)/u' ], + [ 'name' => 'Mail.ru Bot', 'id' => 'mail\.ru', 'regexp' => '/Mail\.RU_Bot\/Img\/([0-9.]*)/i' ], + [ 'name' => 'Mail.ru Bot', 'id' => 'mail\.ru', 'regexp' => '/Mail\.RU_Bot\/([0-9.]*)/i' ], + [ 'name' => 'Medium Bot', 'id' => 'medium', 'regexp' => '/Mediumbot-MetaTagFetcher\/([0-9.]*)/u' ], + [ 'name' => 'Medium Bot', 'id' => 'medium', 'regexp' => '/Mediumbot-ProxyFetcher\/([0-9.]*)/u' ], + [ 'name' => 'Mega Index Bot', 'id' => 'megaindex', 'regexp' => '/MegaIndex\.ru\/([0-9.]*)/u' ], [ 'name' => 'Microsoft Social Streams', 'id' => 'socialstreams', 'regexp' => '/Microsoft MSN SocialStreams Bot/u' ], [ 'name' => 'Mixi', 'id' => 'mixi', 'regexp' => '/mixi-check\/([0-9.]*)/u' ], + [ 'name' => 'Minds', 'id' => 'minds', 'regexp' => '/MindsMediaProxy\/([0-9\.]*)/u' ], [ 'name' => 'MnoGoSearch', 'id' => 'mnogo', 'regexp' => '/MnoGoSearch\/([0-9.]*)/u' ], + [ 'name' => 'MojeekBot', 'id' => 'mojeek', 'regexp' => '/MojeekBot\/([0-9.]*)/u' ], [ 'name' => 'Monitor.us', 'id' => 'monitor', 'regexp' => '/monitor.us/u' ], + [ 'name' => 'Moz', 'id' => 'dotbot', 'regexp' => '/DotBot\/([0-9.]*)/i' ], + [ 'name' => 'Moz', 'id' => 'rogerbot', 'regexp' => '/rogerbot\/([0-9.]*)/i' ], [ 'name' => 'Naver Yeti', 'id' => 'yeti', 'regexp' => '/Yeti\/([0-9.]*)/u' ], - [ 'name' => 'Netcraft Survey Bot', 'id' => 'netcraft', 'regexp' => '/Netcraft Web Server Survey/u' ], + [ 'name' => 'MxToolbox', 'id' => 'mxtoolbox', 'regexp' => '/MxToolbox\/([a-zA-Z0-9.]*)/u' ], + [ 'name' => 'Netcraft Survey Agent Bot', 'id' => 'netcraft', 'regexp' => '/NetcraftSurveyAgent\/([0-9.]*)/u' ], + [ 'name' => 'Netcraft Web Server Survey Bot', 'id' => 'netcraft', 'regexp' => '/Netcraft Web Server Survey/u' ], + [ 'name' => 'Netcraft SSL Server Survey Bot', 'id' => 'netcraft', 'regexp' => '/Netcraft SSL Server Survey/u' ], + [ 'name' => 'Netcraft Bot', 'id' => 'netcraft', 'regexp' => '/Netcraft/iu' ], + [ 'name' => 'netEstate NE Crawler', 'id' => 'netestate', 'regexp' => '/netEstate NE Crawler/u' ], [ 'name' => 'Netvibes', 'id' => 'netvibes', 'regexp' => '/Netvibes/u' ], [ 'name' => 'NewsBlur', 'id' => 'newsblur', 'regexp' => '/NewsBlur Favicon Fetcher/u' ], [ 'name' => 'NewsBlur', 'id' => 'newsblur', 'regexp' => '/NewsBlur Feed Fetcher/u' ], @@ -161,17 +227,27 @@ [ 'name' => 'NewsGator', 'id' => 'newsgator', 'regexp' => '/NewsGator\/([0-9.]*)/u' ], [ 'name' => 'NewsGator', 'id' => 'newsgator', 'regexp' => '/NewsGatorOnline\/([0-9.]*)/u' ], [ 'name' => 'NewsGator FetchLinks', 'id' => 'newsgator', 'regexp' => '/NewsGator FetchLinks extension\/([0-9.]*)/u' ], + [ 'name' => 'Nimbostratus', 'id' => 'nimbostratus', 'regexp' => '/Nimbostratus-Bot\/v([0-9.]*)/u' ], + [ 'name' => 'OdklBot', 'id' => 'odklbot', 'regexp' => '/OdklBot\/([0-9.]*)/u' ], [ 'name' => 'OpenWebSpider', 'id' => 'spider', 'regexp' => '/OpenWebSpider v([0-9.]*)/u' ], [ 'name' => 'OrangeBot', 'id' => 'orange', 'regexp' => '/OrangeBot-Collector\/([0-9.]*)/u' ], [ 'name' => 'OrangeBot', 'id' => 'orange', 'regexp' => '/OrangeBot-Mobile/u' ], - [ 'name' => 'PagesInventory ', 'id' => 'pages', 'regexp' => '/PagesInventory/u' ], - [ 'name' => 'Picsearch bot', 'id' => 'psbot', 'regexp' => '/psbot-page/u' ], + [ 'name' => 'PagesInventory', 'id' => 'pages', 'regexp' => '/PagesInventory/u' ], + [ 'name' => 'Petal Bot', 'id' => 'petal', 'regexp' => '/PetalBot/u' ], + [ 'name' => 'Petal Bot', 'id' => 'aspiegel', 'regexp' => '/Aspiegel/u' ], + [ 'name' => 'Picsearch Bot', 'id' => 'psbot', 'regexp' => '/psbot\/([0-9.]*)/u' ], + [ 'name' => 'Picsearch Bot', 'id' => 'psbot', 'regexp' => '/psbot-page/u' ], + [ 'name' => 'Picsearch Bot', 'id' => 'psbot', 'regexp' => '/psbot-image/u' ], [ 'name' => 'Pingdom', 'id' => 'pingdom', 'regexp' => '/Pingdom.com_bot_version_([0-9.]*)/u' ], [ 'name' => 'Pinterest', 'id' => 'pinterest', 'regexp' => '/Pinterest\/([0-9.]+)( \(+|$)/u' ], + [ 'name' => 'Plurk Bot', 'id' => 'plurk', 'regexp' => '/PlurkBot\/([0-9\.]*)/u' ], + [ 'name' => 'Pocket', 'id' => 'pocket', 'regexp' => '/PocketImageCache\/([0-9.]+)/u' ], + [ 'name' => 'Pocket', 'id' => 'pocket', 'regexp' => '/PocketParser\/([0-9.]+)/u' ], [ 'name' => 'PostRank', 'id' => 'postrank', 'regexp' => '/PostRank\/([0-9.]*)/u' ], [ 'name' => 'PowerMapper', 'id' => 'crawler', 'regexp' => '/CrawlerProcess \(http:\/\/www\.PowerMapper\.com\) \/([0-9.]*)/u' ], [ 'name' => 'Radian 6', 'id' => 'feed', 'regexp' => '/R6_FeedFetcher/u' ], [ 'name' => 'Radian 6', 'id' => 'comment', 'regexp' => '/R6_CommentReader/u' ], + [ 'name' => 'Reddit Bot', 'id' => 'reddit', 'regexp' => '/redditbot\/([0-9.]*)/u' ], [ 'name' => 'RssBar', 'id' => 'rssbar', 'regexp' => '/RssBar\/([0-9.]*)/u' ], [ 'name' => 'ROI Hunter', 'id' => 'hunter', 'regexp' => '/ROI Hunter/u' ], [ 'name' => 'QuerySeekerSpider', 'id' => 'spider', 'regexp' => '/QuerySeekerSpider(?:\/([0-9.]*))?/u' ], @@ -179,6 +255,11 @@ [ 'name' => 'SafeSearch Microdata', 'id' => 'safesearch', 'regexp' => '/SafeSearch microdata crawler/u' ], [ 'name' => 'Scrapy', 'id' => 'scrapy', 'regexp' => '/Scrapy\/([0-9.]*)/u' ], [ 'name' => 'ScreenerBot', 'id' => 'crawler', 'regexp' => '/ScreenerBot Crawler Beta ([0-9.]*)/u' ], + [ 'name' => 'Search Atlas Bot', 'id' => 'searchatlas', 'regexp' => '/SearchAtlas/iu' ], + [ 'name' => 'Seekport Crawler', 'id' => 'seekport', 'regexp' => '/Seekport Crawler/u' ], + [ 'name' => 'Semrush', 'id' => 'semrush', 'regexp' => '/SemrushBot\/([0-9.]*)/u' ], + [ 'name' => 'Serp Stat', 'id' => 'serpstat', 'regexp' => '/serpstatbot\/([0-9.]*)/u' ], + [ 'name' => 'SEOkicks Bot', 'id' => 'seokicks', 'regexp' => '/SEOkicks/u' ], [ 'name' => 'Server Density', 'id' => 'monitor', 'regexp' => '/Server Density Service Monitoring/u' ], [ 'name' => 'Seznam bot', 'id' => 'seznam', 'regexp' => '/SeznamBot|SklikBot|Seznam screenshot-generator/u' ], [ 'name' => 'Seznam Email Proxy', 'id' => 'seznam', 'regexp' => '/SeznamEmailProxy/u' ], @@ -187,6 +268,8 @@ [ 'name' => 'SilverReader', 'id' => 'reader', 'regexp' => '/SilverReader\/([0-9.]*)/u' ], [ 'name' => 'SimplePie', 'id' => 'simplepie', 'regexp' => '/SimplePie\/([0-9.]*)/u' ], [ 'name' => 'Site24x7', 'id' => 'site24', 'regexp' => '/Site24x7/u' ], + [ 'name' => 'Skype Url Preview', 'id' => 'skype', 'regexp' => '/SkypeUriPreview Preview\/([0-9.]*)/u' ], + [ 'name' => 'Slackbot Link Checker', 'id' => 'slack', 'regexp' => '/Slackbot-LinkExpanding ([0-9.]*)/u' ], [ 'name' => 'Sogou Web Spider', 'id' => 'sogou', 'regexp' => '/sogou spider/u' ], [ 'name' => 'Sogou Web Spider', 'id' => 'sogou', 'regexp' => '/Sogou pic spider\/([0-9.]*)/u' ], [ 'name' => 'Sogou Web Spider', 'id' => 'sogou', 'regexp' => '/Sogou inst spider\/([0-9.]*)/u' ], @@ -196,21 +279,32 @@ [ 'name' => 'Soso Web Spider', 'id' => 'soso', 'regexp' => '/Sosospider\/([0-9.]*)/u' ], [ 'name' => 'Soso Web Spider', 'id' => 'soso', 'regexp' => '/Sosospider/u' ], [ 'name' => 'Soso Image Spider', 'id' => 'soso', 'regexp' => '/Sosoimagespider/u' ], + [ 'name' => 'SpazioDati', 'id' => 'spaziodati', 'regexp' => '/spaziodati/u' ], [ 'name' => 'SPDYCheck', 'id' => 'spdycheck', 'regexp' => '/SPDYCheck SPDY Protocol Tester/iu' ], [ 'name' => 'Spinn3r', 'id' => 'spinn', 'regexp' => '/Spinn3r ([0-9.]*)/iu' ], [ 'name' => 'Spiderlytics', 'id' => 'spider', 'regexp' => '/Spiderlytics\/([0-9.]*)/iu' ], + [ 'name' => 'Sputnik Favicon Bot', 'id' => 'sputnik', 'regexp' => '/SputnikFaviconBot\/([0-9.]*)/iu' ], + [ 'name' => 'Sputnik Image Bot', 'id' => 'sputnik', 'regexp' => '/SputnikImageBot\/([0-9.]*)/iu' ], + [ 'name' => 'Sputnik Bot', 'id' => 'sputnik', 'regexp' => '/SputnikBot\/([0-9.]*)/iu' ], [ 'name' => 'StatusCake Error Detector', 'id' => 'detector', 'regexp' => '/StatusCake Error Detector/iu' ], [ 'name' => 'Summify', 'id' => 'summify', 'regexp' => '/Summify\/([0-9.]*)/u' ], [ 'name' => 'TelegramBot', 'id' => 'telegram', 'regexp' => '/TelegramBot/u' ], [ 'name' => 'Twisted PageGetter', 'id' => 'twisted', 'regexp' => '/Twisted PageGetter/u' ], [ 'name' => 'Twitterbot', 'id' => 'twitter', 'regexp' => '/Twitterbot\/([0-9.]*)/u' ], [ 'name' => 'Tiny Tiny RSS', 'id' => 'tiny', 'regexp' => '/Tiny Tiny RSS\/([0-9.]*)/u' ], + [ 'name' => 'TinEye Bot', 'id' => 'tineye', 'regexp' => '/TinEye\/([0-9.]*)/u' ], + [ 'name' => 'TinEye Bot', 'id' => 'tineye', 'regexp' => '/TinEye-bot\/([0-9.]*)/u' ], [ 'name' => 'TLSProber', 'id' => 'tlsprober', 'regexp' => '/TLSProber\/([0-9.]*)/u' ], + [ 'name' => 'TrustedSite', 'id' => 'trustedsite', 'regexp' => '/TrustedSite/u' ], [ 'name' => 'Typhoeus', 'id' => 'typhoeus', 'regexp' => '/Typhoeus/u' ], [ 'name' => 'Vagabondo', 'id' => 'vagabondo', 'regexp' => '/Vagabondo\/([0-9.]*)/u' ], + [ 'name' => 'VelenPublicWebCrawler', 'id' => 'velen', 'regexp' => '/VelenPublicWebCrawler\/([0-9.]*)/u' ], + [ 'name' => 'vkShare', 'id' => 'vkshare', 'regexp' => '/vkShare/u' ], + [ 'name' => 'Voat', 'id' => 'voat', 'regexp' => '/Voat\.co OpenGraph Parser/u' ], [ 'name' => 'Voilabot', 'id' => 'voila', 'regexp' => '/Voila[Bb]ot/u' ], [ 'name' => 'VocusBot', 'id' => 'vocus', 'regexp' => '/VocusBot ([0-9.]*)/u' ], [ 'name' => 'Vodafone mCrawler', 'id' => 'mcrawler', 'regexp' => '/Vodafone mCrawler/u' ], + [ 'name' => 'VuhuvBot', 'id' => 'vuhuv', 'regexp' => '/vuhuvBot\/([0-9.]*)/u' ], [ 'name' => 'W3Bot', 'id' => 'w3bot', 'regexp' => '/W3Bot ([0-9.]*)/u' ], [ 'name' => 'W3C CSS Validator', 'id' => 'jigsaw', 'regexp' => '/Jigsaw\/([0-9.]*)/u' ], [ 'name' => 'W3C Internationalization Checker', 'id' => 'w3c', 'regexp' => '/W3C_I18n-Checker\/([0-9.]*)/u' ], @@ -222,6 +316,7 @@ [ 'name' => 'W3C Robot', 'id' => 'w3c', 'regexp' => '/W3CRobot\/([0-9.]*)/u' ], [ 'name' => 'W3C Unified Validator', 'id' => 'w3c', 'regexp' => '/W3C_Unicorn\/([0-9.]*)/u' ], [ 'name' => 'W3C Validator.nu', 'id' => 'validator', 'regexp' => '/Validator.nu\//u' ], + [ 'name' => 'Wappalyzer', 'id' => 'wappalyzer', 'regexp' => '/Wappalyzer/u' ], [ 'name' => 'Wayback Archive', 'id' => 'wayback', 'regexp' => '/waybackarchive.org\/([0-9.]*)/u' ], [ 'name' => 'WebbCrawler', 'id' => 'crawler', 'regexp' => '/WebbCrawler ([0-9.]*)/u' ], [ 'name' => 'WebIndexer', 'id' => 'webindexer', 'regexp' => '/WebIndexer\//u' ], @@ -229,6 +324,7 @@ [ 'name' => 'WordPress.com', 'id' => 'wordpress', 'regexp' => '/WordPress\.com; http/u' ], [ 'name' => 'WordPress Jetpack', 'id' => 'wordpress', 'regexp' => '/Jetpack by WordPress\.com/u' ], [ 'name' => 'WWW Mechanize', 'id' => 'mechanize', 'regexp' => '/WWW-Mechanize\/([0-9.]*)/u' ], + [ 'name' => 'Xenu Link Sleuth', 'id' => 'xenu', 'regexp' => '/Xenu Link Sleuth\/([0-9.]*)/u' ], [ 'name' => 'Xerka WebBot', 'id' => 'xerka', 'regexp' => '/Xerka WebBot v([0-9.]*)/u' ], [ 'name' => 'XML Sitemaps Generator', 'id' => 'sitemap', 'regexp' => '/XML-Sitemaps\/([0-9.]*)/u' ], [ 'name' => 'XMLSitemapGenerator', 'id' => 'sitemap', 'regexp' => '/XmlSitemapGenerator/u' ], @@ -267,6 +363,12 @@ [ 'name' => 'Inktomi Slurp', 'id' => 'slurp', 'regexp' => '/Slurp\/([0-9.]*)/u' ], [ 'name' => 'Inktomi Slurp', 'id' => 'slurp', 'regexp' => '/Slurp\.so\/([0-9.]*)/u' ], + + [ 'name' => 'Yelp Spider', 'id' => 'yelp', 'regexp' => '/yelpspider-([0-9.]*)/u' ], + [ 'name' => 'Yioop Bot', 'id' => 'yioop', 'regexp' => '/YioopBot/u' ], + [ 'name' => 'Yisou Spider', 'id' => 'yisou', 'regexp' => '/YisouSpider\/?([0-9.]*)/u' ], + [ 'name' => 'Zgrab', 'id' => 'zgrab', 'regexp' => '/zgrab\//u' ], + [ 'name' => 'ZmEu', 'id' => 'zmeu', 'regexp' => '/ZmEu/u' ], /* Generic bots */ [ 'name' => 'Apache Httpd', 'id' => 'httpclient', 'regexp' => '/Apache-HttpClient(?:\/([0-9.]*))?/u' ], @@ -275,6 +377,11 @@ [ 'name' => 'Apache Nutch', 'id' => 'nutch', 'regexp' => '/Nutch(?:CVS|Org)\/([0-9.]*)/u' ], [ 'name' => 'Apache Synapse', 'id' => 'synapse', 'regexp' => '/compatible; Synapse/u' ], [ 'name' => 'Borland Delphi', 'id' => 'indy', 'regexp' => '/Indy Library/u' ], + [ 'name' => 'Go Http Client', 'id' => 'go', 'regexp' => '/Go-http-client\/([0-9.]*)/u' ], + [ 'name' => 'Go Http Client', 'id' => 'go', 'regexp' => '/go-httpclient v([0-9.]*)/u' ], + [ 'name' => 'HttpUnit', 'id' => 'httpunit', 'regexp' => '/httpunit\/([0-9.]*)/u' ], + [ 'name' => 'OkHttp', 'id' => 'okhttp', 'regexp' => '/okhttp\/([0-9.]*)/u' ], + [ 'name' => 'Node Fetch', 'id' => 'node', 'regexp' => '/node-fetch\/([0-9.]*)/u' ], [ 'name' => 'Wget', 'id' => 'wget', 'regexp' => '/Wget\/([0-9.]*)/u' ], [ 'name' => 'Curl', 'id' => 'curl', 'regexp' => '/^curl\/([0-9.]*)/u' ], diff --git a/data/applications-browsers.php b/data/applications-browsers.php index 80f42743a..8cd4f149c 100644 --- a/data/applications-browsers.php +++ b/data/applications-browsers.php @@ -15,7 +15,9 @@ [ 'name' => '2345 Explorer', 'id' => '2345', 'regexp' =>'/2345Explorer\/([0-9.]*)/u', 'details' => 3 ], [ 'name' => '2345 Explorer', 'id' => '2345', 'regexp' =>'/2345Explorer v([0-9.]*)/u', 'details' => 3 ], [ 'name' => '2345 Chrome', 'id' => '2345', 'regexp' =>'/2345chrome v([0-9.]*)/u', 'details' => 3 ], + [ 'name' => '37abc Browser', 'id' => '37abc', 'regexp' => '/ 37abc\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => '360 Extreme Explorer', 'id' => 'qihu', 'regexp' =>'/QIHU 360EE/u', 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => '1st Browser', 'id' => '1stbrowser', 'regexp' => '/1stBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => '360 Safe Explorer', 'id' => 'qihu', 'regexp' =>'/QIHU 360SE/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => '7Star', 'id' => '7star', 'regexp' =>'/7Star\/([0-9.]*)/u' ], // see: http://www.qixing123.com [ 'name' => 'ABrowse', 'id' => 'abrowse', 'regexp' =>'/A[Bb]rowse ([0-9.]*)/u' ], // browser for the Syllable OS @@ -23,8 +25,10 @@ [ 'name' => 'Acorn Browse', 'id' => 'acorn', 'regexp' =>'/Acorn Browse ([0-9.]+)/u' ], [ 'name' => 'Acorn Browse', 'id' => 'acorn', 'regexp' =>'/Acorn Phoenix ([0-9.]+)/u' ], [ 'name' => 'Acoo Browser', 'id' => 'acoo', 'regexp' =>'/Acoo Browser/u' ], + [ 'name' => 'Amigo Browser', 'id' => 'amigo', 'regexp' => '/ Amigo\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://amigo.mail.ru/ [ 'name' => 'AOL Desktop', 'id' => 'aol', 'regexp' =>'/AOL ([0-9.]*); AOLBuild/i' ], [ 'name' => 'AOL Browser', 'id' => 'america', 'regexp' =>'/America Online Browser (?:[0-9.]*); rev([0-9.]*);/i' ], + [ 'name' => 'APUS Browser', 'id' => 'apus', 'regexp' => '/APUSBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.apusapps.com/en/browser/ [ 'name' => 'Arachne', 'id' => 'arachne', 'regexp' =>'/xChaos_Arachne\/[0-9]\.([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: www.glennmcc.org [ 'name' => 'Arora', 'id' => 'arora', 'regexp' =>'/[Aa]rora\/([0-9.]*)/u' ], // see: www.arora-browser.org [ 'name' => 'AWeb', 'id' => 'aweb', 'regexp' =>'/Amiga-AWeb(?:\/([0-9.]*))?/u' ], @@ -32,85 +36,180 @@ [ 'name' => 'Avant Browser', 'id' => 'avant', 'regexp' =>'/Avant Browser/u' ], [ 'name' => 'Avant Browser', 'id' => 'avant', 'regexp' =>'/Avant TriCore/u' ], [ 'name' => 'Avast SafeZone', 'id' => 'asw', 'regexp' =>'/ASW\/([0-9.]*)/u', 'details' => 2 ], + [ 'name' => 'AVG Secure Browser', 'id' => 'avg', 'regexp' =>'/ AVG\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.avg.com/secure-browser [ 'name' => 'Aviator', 'id' => 'aviator', 'regexp' =>'/Aviator\/([0-9.]*)/u', 'details' => 1 ], // see: https://github.com/WhiteHatSecurity/Aviator + [ 'name' => 'Avira Scout', 'id' => 'avira', 'regexp' => '/AviraScout\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.avira.com/en/avira-scout [ 'name' => 'Baidu Browser', 'id' => 'flyflow', 'regexp' =>'/FlyFlow\/([0-9.]*)/u', 'details' => 2 ], [ 'name' => 'Baidu Browser', 'id' => 'bdbrowser', 'regexp' =>'/bdbrowser\/([0-9.]*)/i' ], [ 'name' => 'Baidu Browser', 'id' => 'bdbrowser', 'regexp' =>'/bdbrowser_i18n\/([0-9.]*)/i' ], [ 'name' => 'Baidu Spark', 'id' => 'bdspark', 'regexp' =>'/BDSpark\/([0-9.]*)/u', 'details' => 2 ], + [ 'name' => 'Basilisk', 'id' => 'basilisk', 'regexp' => '/ Basilisk\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://basilisk-browser.org/ [ 'name' => 'Beamrise', 'id' => 'beamrise', 'regexp' =>'/Beamrise\/([0-9.]*)/u' ], // see: http://beamrise.com + [ 'name' => 'Beonex', 'id' => 'beonex', 'regexp' =>'/Beonex\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.beonex.com/ [ 'name' => 'Black Wren', 'id' => 'blackwren', 'regexp' =>'/BlackWren\/([0-9.]*)/u', 'details' => 2 ], // see: https://github.com/conmarap/jetbrowser + [ 'name' => 'Black Hawk', 'id' => 'blackhawk', 'regexp' => '/BlackHawk\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://www.netgate.sk/blackhawk/help/welcome-to-blackhawk-web-browser.html + [ 'name' => 'Bolt Browser', 'id' => 'bolt', 'regexp' => '/ Bolt\/([0-9.]*)/i', 'type' => Constants\DeviceType::DESKTOP ], // see: http://www.boltbrowser.com/ + [ 'name' => 'Blackbird', 'id' => 'blackbird', 'regexp' =>'/Blackbird\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://www.blackbirdbrowser.com/ [ 'name' => 'Brave', 'id' => 'brave', 'regexp' =>'/brave\/([0-9.]*)/u' ], + [ 'name' => 'Brisk Bard', 'id' => 'brisk', 'regexp' => '/BriskBard\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.briskbard.com/index.php?lang=en + [ 'name' => 'BrowseX', 'id' => 'browsex', 'regexp' => '/BrowseX \(([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://dev.pdqi.com/fossil/browsex/doc/tip/index.html + [ 'name' => 'Browzar', 'id' => 'browzar', 'regexp' => '/Browzar/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://browzar.com/ [ 'name' => 'Byffox', 'id' => 'byffox', 'regexp' =>'/Byffox\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'Camino', 'id' => 'camino', 'regexp' =>'/Camino\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'Canure', 'id' => 'canure', 'regexp' =>'/Canure\/([0-9.]*)/u', 'details' => 3 ], // see: http://canure.weebly.com/index.html + [ 'name' => 'CCleaner Browser', 'id' => 'ccleaner', 'regexp' => '/CCleaner\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.ccleaner.com/ccleaner/browser + [ 'name' => 'Cent Browser', 'id' => 'cent', 'regexp' => '/ Cent\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.centbrowser.com/ [ 'name' => 'Charon', 'id' => 'charon', 'regexp' =>'/Charon/' ], // see: http://www.vitanuova.com/inferno/man/1/charon.html + [ 'name' => 'Chedot', 'id' => 'chedot', 'regexp' => '/ Chedot\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://landing.chedot.com/ + [ 'name' => 'Cheshire', 'id' => 'cheshire', 'regexp' => '/ Cheshire\/([0-9.A-Z]*)/u', 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Chim Lac', 'id' => 'chimlac', 'regexp' => '/chimlac_browser\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://chimlac.com.vn/ + [ 'name' => 'Chimera', 'id' => 'chimera', 'regexp' => '/ Chimera\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'ChromePlus', 'id' => 'chromeplus', 'regexp' =>'/ChromePlus(?:\/([0-9.]*))?$/u', 'details' => 3, 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Colibri', 'id' => 'colibri', 'regexp' => '/Colibri\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://colibri.opqr.co/ + [ 'name' => 'Columbus', 'id' => 'columbus', 'regexp' =>'/Columbus\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'CometBird', 'id' => 'cometbird', 'regexp' =>'/CometBird\/([0-9.]*)/u' ], // see: http://www.cometbird.com [ 'name' => 'Comodo Dragon', 'id' => 'comodo', 'regexp' =>'/Comodo_Dragon\/([0-9.]*)/u', 'details' => 2 ], [ 'name' => 'Comodo Dragon', 'id' => 'dragon', 'regexp' =>'/Dragon\/([0-9.]*)/u', 'details' => 2 ], [ 'name' => 'Comodo IceDragon', 'id' => 'dragon', 'regexp' =>'/IceDragon\/([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'Conkeror', 'id' => 'conkeror', 'regexp' =>'/[Cc]onkeror\/([0-9.]*)/u' ], + [ 'name' => 'Coc Coc', 'id' => 'coc', 'regexp' => '/coc_coc_browser\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://coccoc.com/en/ [ 'name' => 'CoolNovo', 'id' => 'coolnovo', 'regexp' =>'/(?:CoolNovo|CoolNovoChromePlus)\/([0-9.]*)/u', 'details' => 3, 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Corom Browser', 'id' => 'corom', 'regexp' => '/ CoRom\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://apkpure.com/corom-browser-for-android/com.coccoc.corom + [ 'name' => 'Crazy Browser', 'id' => 'crazy', 'regexp' => '/Crazy Browser ([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Crusta', 'id' => 'crusta', 'regexp' => '/ Crusta\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://github.com/Tarptaeya/Crusta [ 'name' => 'Cunaguaro', 'id' => 'cunaguaro', 'regexp' =>'/Cunaguaro\/([0-9.]*)/u', 'details' => 3, 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Cyberdog', 'id' => 'cyberdog', 'regexp' =>'/Cyberdog\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'Cyberfox', 'id' => 'cyberfox', 'regexp' =>'/Cyberfox\/([0-9.]*)/u', 'details' => 2 ], // see: https://cyberfox.8pecxstudios.com [ 'name' => 'Daedalus', 'id' => 'daedalus', 'regexp' =>'/Daedalus ([0-9.]*)/u', 'details' => 2 ], + [ 'name' => 'Deg-degan', 'id' => 'degan', 'regexp' => '/Degdegan\/([0-9.]*)/u', 'details' => 3, 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Demeter', 'id' => 'demeter', 'regexp' =>'/Demeter\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'DeskBrowse', 'id' => 'deskbrowse', 'regexp' =>'/DeskBrowse\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Diigo Browser', 'id' => 'diigo', 'regexp' => '/DiigoBrowser/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://apps.apple.com/us/app/diigo-annotator-for-safari/id933773981 [ 'name' => 'Dillo', 'id' => 'dillo', 'regexp' =>'/Dillo\/([0-9.]*)/u' ], // see: http://www.dillo.org + [ 'name' => 'DocZilla', 'id' => 'doczilla', 'regexp' =>'/DocZilla\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'Doga Rhodonit', 'id' => 'rhodonit', 'regexp' =>'/DogaRhodonit/u' ], + [ 'name' => 'DPlus Browser', 'id' => 'dplus', 'regexp' =>'/ DPlus ([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Elements Browser', 'id' => 'elements', 'regexp' => '/Elements Browser\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'EudoraWeb', 'id' => 'eudoraweb', 'regexp' =>'/EudoraWeb ([0-9.]*)/u' ], + [ 'name' => 'Falkon', 'id' => 'falkon', 'regexp' => '/ Falkon\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.falkon.org/ + [ 'name' => 'FlameSky', 'id' => 'flamesky', 'regexp' => '/FlameSky\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://github.com/flameskyofficial/flamesky [ 'name' => 'Flock', 'id' => 'flock', 'regexp' =>'/Flock\/([0-9.]*)/u', 'details' => 3, 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Framafox', 'id' => 'framafox', 'regexp' => '/Framafox\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://framakey.org/telecharger/applications-portables-libres#internet + [ 'name' => 'Freeu Browser', 'id' => 'freeu', 'regexp' => '/ Free[Uu]\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://play.google.com/store/apps/details?id=com.freeuvpn.android&hl=en [ 'name' => 'Galeon', 'id' => 'galeon', 'regexp' =>'/Galeon\/([0-9.]*)/u', 'details' => 3 ], + [ 'name' => 'GlobalMojo', 'id' => 'globalmojo', 'regexp' =>'/GlobalMojo\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'GNOME Web', 'id' => 'epiphany', 'regexp' =>'/Epiphany\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'GreenBrowser', 'id' => 'greenbrowser', 'regexp' =>'/GreenBrowser/u', 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Hola Browser', 'id' => 'hola', 'regexp' => '/ Hola\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://play.google.com/store/apps/details?id=org.hola&hl=en + [ 'name' => 'Hydra Browser', 'id' => 'hydra', 'regexp' =>'/Hydra Browser/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'IBrowse', 'id' => 'ibrowse', 'regexp' =>'/IBrowse[\/ ]([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'iCab', 'id' => 'icab', 'regexp' =>'/iCab(?: J)?[\/ ](?:Pre)?([0-9.]*)/u' ], [ 'name' => 'Iceape', 'id' => 'iceape', 'regexp' =>'/Iceape\/([0-9.]*)/u' ], [ 'name' => 'IceCat', 'id' => 'icecat', 'regexp' =>'/IceCat[ \/]([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.gnu.org/software/gnuzilla/ + [ 'name' => 'Icedove', 'id' => 'icedove', 'regexp' => '/ Icedove\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://wiki.debian.org/Icedove [ 'name' => 'Iceweasel', 'id' => 'iceweasel', 'regexp' =>'/Iceweasel\/([0-9.]*)/iu', 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'iRider Browser', 'id' => 'irider', 'regexp' =>'/iRider ([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'Iridium', 'id' => 'iridium', 'regexp' =>'/Iridium\/([0-9.]*)/u', 'details' => 2 ], // see: http://www.srware.net/en/software_srware_iron.php [ 'name' => 'Iron', 'id' => 'iron', 'regexp' =>'/Iron\/([0-9.]*)/u', 'details' => 2 ], // see: http://www.srware.net/en/software_srware_iron.php + [ 'name' => 'Kapiko', 'id' => 'kapiko', 'regexp' => '/ Kapiko\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://sites.google.com/site/kapikoproject/ [ 'name' => 'Kazehakase', 'id' => 'kazehakase', 'regexp' =>'/Kazehakase\/([0-9.]*)/u' ], // see: http://kazehakase.osdn.jp [ 'name' => 'KChrome', 'id' => 'kchrome', 'regexp' =>'/KChrome\/([0-9.]*)/u', 'details' => 3 ], // see: http://www.kchrome.com + [ 'name' => 'Kinza', 'id' => 'kinza', 'regexp' => '/ Kinza\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.kinza.jp/en/ + [ 'name' => 'KKMAN', 'id' => 'kkman', 'regexp' => '/ KKman([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.kkbox.com/kkman/ + [ 'name' => 'Klondike', 'id' => 'klondike', 'regexp' => '/Klondike\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Kylo', 'id' => 'kylo', 'regexp' => '/ Kylo\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://kylo.tv/ [ 'name' => 'K-Meleon', 'id' => 'meleon', 'regexp' =>'/K-Meleon\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://kmeleonbrowser.org + [ 'name' => 'LBrowser', 'id' => 'lbrowser', 'regexp' =>'/LBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'LieBao', 'id' => 'lbbrowser', 'regexp' =>'/LBBROWSER/u' ], // see: http://www.liebao.cn + [ 'name' => 'Light', 'id' => 'light', 'regexp' => '/ Light\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://en.wikipedia.org/wiki/Light_(web_browser) [ 'name' => 'Lobo', 'id' => 'lobo', 'regexp' =>'/Lobo\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://sourceforge.net/projects/xamj/files/Lobo%20Browser/ + [ 'name' => 'Lolifox', 'id' => 'lolifox', 'regexp' => '/lolifox\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://ja.wikipedia.org/wiki/Lolifox + [ 'name' => 'Lovense', 'id' => 'lovense', 'regexp' => '/Lovense\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.lovense.com/cam-model/guides/pc-phone [ 'name' => 'Lunascape', 'id' => 'lunascape', 'regexp' =>'/ Lunascape[\/| ]([0-9.]*)/u', 'details' => 3 ], // see: http://www.lunascape.tv [ 'name' => 'Naenara', 'id' => 'naenara', 'regexp' =>'/NaenaraBrowser\/([0-9.]*)/u', 'details' => 2 ], // Firefox based browser used with Red Star OS + [ 'name' => 'NetCaptor', 'id' => 'netcaptor', 'regexp' =>'/NetCaptor ([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://en.wikipedia.org/wiki/NetCaptor + [ 'name' => 'Madfox', 'id' => 'madfox', 'regexp' =>'/Madfox\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'Maxthon', 'id' => 'mxbrowser', 'regexp' =>'/MxBrowser\/([0-9.]*)/u' ], [ 'name' => 'Maxthon', 'id' => 'mxbrowser', 'regexp' =>'/MxBrowser-iPhone\/([0-9.]*)/u' ], + [ 'name' => 'Min Browser', 'id' => 'min', 'regexp' => '/ min\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://minbrowser.github.io/min/ + [ 'name' => 'Mini Browser', 'id' => 'mini', 'regexp' => '/ MiniBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://dmkho.tripod.com/mb/index.html [ 'name' => 'MixShark', 'id' => 'mixshark', 'regexp' =>'/MixShark\/([0-9.]*)/u' ], // see: http://terbaddo.free.fr/mixshark.php [ 'name' => 'mlbrowser', 'id' => 'mlbrowser', 'regexp' =>'/mlbrowser/u' ], // see: https://github.com/Topguy/mlbrowser + [ 'name' => 'Mypal Browser', 'id' => 'mypal', 'regexp' => '/ Mypal\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://github.com/Feodor2/Mypal + [ 'name' => 'Multi-Browser XP', 'id' => 'multixp', 'regexp' =>'/Multi-Browser ([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'NetPositive', 'id' => 'netpositive', 'regexp' =>'/NetPositive\/([0-9.]*)/u' ], + [ 'name' => 'Nichrome', 'id' => 'nichrome', 'regexp' => '/Nichrome\/self\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'Origyn', 'id' => 'origyn', 'regexp' =>'/Origyn Web Browser/u' ], [ 'name' => 'Odyssey', 'id' => 'owb', 'regexp' =>'/OWB\/([0-9.]*)/u' ], + [ 'name' => 'Open Live Writer', 'id' => 'live', 'regexp' =>'/Open Live Writer ([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://openlivewriter.org/ + [ 'name' => 'Orange Browser', 'id' => 'juzi', 'regexp' =>'/JuziBrowser/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://www.123juzi.com/ [ 'name' => 'Orca', 'id' => 'orca', 'regexp' =>'/Orca\/([0-9.]*)/u' ], [ 'name' => 'Oregano', 'id' => 'oregano', 'regexp' =>'/Oregano ([0-9.]*)/u' ], // see: http://www.xat.nl/en/riscos/sw/oregano/ [ 'name' => 'Otter', 'id' => 'otter', 'regexp' =>'/Otter(?: Browser)?\/([0-9.]*)/u' ], // see: https://otter-browser.org [ 'name' => 'Pale Moon', 'id' => 'palemoon', 'regexp' =>'/Pale[mM]oon\/([0-9.]*)/u' ], // see: https://www.palemoon.org + [ 'name' => 'Patriott Browser', 'id' => 'patriott', 'regexp' =>'/Patriott::Browser\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://madgroup.x10.mx/patriott1.php + [ 'name' => 'Perk', 'id' => 'perk', 'regexp' =>'/ Perk\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://www.perk.com/ + [ 'name' => 'Polarity', 'id' => 'polarity', 'regexp' =>'/Polarity\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Privacy Browser', 'id' => 'privacy', 'regexp' => '/PrivacyBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.stoutner.com/privacy-browser/ [ 'name' => 'Qihoo 360', 'id' => 'qihu', 'regexp' =>'/QIHU THEWORLD/u' ], + [ 'name' => 'Qiyu Browser', 'id' => 'qiyu', 'regexp' => '/Qiyu\/([0-9.]*)/i', 'type' => Constants\DeviceType::DESKTOP ], // see: https://apps.apple.com/cn/app/qi-yu-liu-lan-qi/id959447103 [ 'name' => 'QtWeb', 'id' => 'qtweb', 'regexp' =>'/QtWeb Internet Browser\/([0-9.]*)/u' ], + [ 'name' => 'Quick Look', 'id' => 'quicklook', 'regexp' => '/QuickLook\/([0-9.]*)/u' ], // see: https://en.wikipedia.org/wiki/Quick_Look [ 'name' => 'QupZilla', 'id' => 'qupzilla', 'regexp' =>'/QupZilla\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Qute Browser', 'id' => 'qute', 'regexp' => '/qutebrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://github.com/qutebrowser/qutebrowser [ 'name' => 'rekonq', 'id' => 'rekonq', 'regexp' =>'/rekonq(?:\/([0-9.]*))?/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'Ryouko', 'id' => 'ryouko', 'regexp' =>'/Ryouko\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://github.com/foxhead128/ryouko + [ 'name' => 'Sylera', 'id' => 'sylera', 'regexp' =>'/Sylera\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // Needs to be discovered before SeaMonkey Browser, see: https://ja.wikipedia.org/wiki/Sylera [ 'name' => 'SaaYaa Explorer', 'id' => 'saayaa', 'regexp' =>'/SaaYaa/u', 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'SalamWeb', 'id' => 'salam', 'regexp' => '/SalamWeb\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://salamweb.com/ + [ 'name' => 'SalamWeb', 'id' => 'salam', 'regexp' => '/Salam Browser/u', 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Shiira', 'id' => 'shiira', 'regexp' => '/Shiira/u', 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Sielo Browser', 'id' => 'sielo', 'regexp' => '/ Sielo\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://github.com/SieloBrowser/sielo-legacy + [ 'name' => 'SiteKiosk', 'id' => 'sitekiosk', 'regexp' => '/SiteKiosk ([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.provisio.com/web/us/products/windows-kiosk-software-sitekiosk [ 'name' => 'Sleipnir', 'id' => 'sleipnir', 'regexp' =>'/Sleipnir\/([0-9.]*)/u', 'details' => 3 ], + [ 'name' => 'Slimjet', 'id' => 'slimjet', 'regexp' => '/ Slimjet\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.slimjet.com/ [ 'name' => 'Sogou Explorer', 'id' => 'metasr', 'regexp' =>'/SE 2.X MetaSr/u', 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Sparrow', 'id' => 'sparrow', 'regexp' =>'/Sparrow\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Sputnik', 'id' => 'sputnik', 'regexp' => '/SputnikBrowser\/([0-9.]*)/u' ], // see: https://browser.sputnik.ru/ [ 'name' => 'Stainless', 'id' => 'stainless', 'regexp' =>'/Stainless\/([0-9.]*)/u' ], // see: http://www.stainlessapp.com + [ 'name' => 'Station Browser', 'id' => 'station', 'regexp' => '/ Station\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://getstation.com/ [ 'name' => 'SunChrome', 'id' => 'sunchrome', 'regexp' =>'/SunChrome\/([0-9.]*)/u' ], + [ 'name' => 'Sundance', 'id' => 'sundance', 'regexp' =>'/Sundance\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Sundial', 'id' => 'sundial', 'regexp' =>'/Sundial\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://www.sundialbrowser.com/ [ 'name' => 'Superbird', 'id' => 'superbird', 'regexp' =>'/Super[Bb]ird\/([0-9.]*)/u', 'details' => 2 ], + [ 'name' => 'Swiftweasel', 'id' => 'swiftweasel', 'regexp' =>'/Swiftweasel\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://swiftweasel.tuxfamily.org/ + [ 'name' => 'Swiftfox', 'id' => 'swiftfox', 'regexp' =>'/Swiftfox/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'Swing Browser', 'id' => 'swing', 'regexp' =>'/Swing(?:\(And\))?\/([0-9.]*)/u', 'details' => 3 ], // see: http://swing-browser.com + [ 'name' => 't-online.de', 'id' => 'to-browser', 'regexp' =>'/TO-Browser\/TOB([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.t-online.de/computer/browser/ + [ 'name' => 't-online.de', 'id' => 'to-browser', 'regexp' =>'/TO-Browser/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'Tencent Traveler', 'id' => 'tencent', 'regexp' =>'/TencentTraveler ([0-9.]*)/u', 'details' => 2 ], [ 'name' => 'TenFourFox', 'id' => 'tenfourfox', 'regexp' =>'/TenFourFox\//u' ], [ 'name' => 'The World', 'id' => 'theworld', 'regexp' =>'/TheWorld(?: ([0-9.]*))?/u' ], + [ 'name' => 'Tulip Chain', 'id' => 'tulip', 'regexp' =>'/TulipChain\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://ostermiller.org/tulipchain/ [ 'name' => 'Tungsten Browser', 'id' => 'tungsten', 'regexp' =>'/TungstenBrowser\/([0-9.]*)/u' ], + [ 'name' => 'UltraBrowser', 'id' => 'ultrab', 'regexp' =>'/UltraBrowser ([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://www.ultrabrowser.com/ + [ 'name' => 'Usejump', 'id' => 'usejump', 'regexp' =>'/Usejump\/([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Vimprobable', 'id' => 'vimprobable', 'regexp' =>'/Vimprobable\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'Vivaldi', 'id' => 'vivaldi', 'regexp' =>'/Vivaldi\/([0-9.]*)/u', 'details' => 2 ], + [ 'name' => 'VMware Workspace ONE', 'id' => 'airwatch', 'regexp' => '/Air[Ww]atch Browser v([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Vonkeror', 'id' => 'vonkeror', 'regexp' =>'/Vonkeror\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], [ 'name' => 'Voyager', 'id' => 'voyager', 'regexp' =>'/AmigaVoyager\/([0-9.]*)/u' ], [ 'name' => 'Waterfox', 'id' => 'waterfox', 'regexp' =>'/Waterfox\/([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Whale Browser', 'id' => 'whale', 'regexp' => '/ Whale\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://whale.naver.com/ + [ 'name' => 'WinWAP Browser', 'id' => 'winwap', 'regexp' => '/WinWAP\/([0-9]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.winwap.com/mobile_applications/winwap_browser.php + [ 'name' => 'WinWAP Browser', 'id' => 'winwap', 'regexp' => '/WinWAP-SPBE\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], + [ 'name' => 'Xvast', 'id' => 'xvast', 'regexp' =>'/Xvast\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://www.xvast.com/ [ 'name' => 'Yandex Browser', 'id' => 'yabrowser', 'regexp' =>'/YaBrowser\/([0-9.]*)/u', 'details' => 2 ], + [ 'name' => 'Zvu Browser', 'id' => 'zvu', 'regexp' => '/ Zvu\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://zvu.com/ + [ 'name' => 'ZipZap', 'id' => 'zipzap', 'regexp' =>'/ZipZap ([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://www.zipzaphome.com/ + [ 'name' => 'Zombie.js', 'id' => 'zombie', 'regexp' =>'/Zombie\.js\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://zombie.js.org/ /* Mobile browsers */ [ 'name' => '1Browser', 'id' => '1password', 'regexp' =>'/1Password\/([0-9.]*)/u' ], [ 'name' => '2345 Browser', 'id' => '2345', 'regexp' =>'/Mb2345Browser\/([0-9.]*)/u' ], [ 'name' => '3G Explorer', 'id' => '3g explorer', 'regexp' =>'/3G Explorer\/([0-9.]*)/u', 'details' => 3 ], [ 'name' => '4G Explorer', 'id' => '4g explorer', 'regexp' =>'/4G Explorer\/([0-9.]*)/u', 'details' => 3 ], + [ 'name' => 'Aloha Browser', 'id' => 'aloha', 'regexp' => '/AlohaBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://alohabrowser.com/ [ 'name' => 'Atomic', 'id' => 'atomiclite', 'regexp' =>'/AtomicLite\/([0-9.]*)/u' ], // see: http://atomicwebbrowser.com [ 'name' => 'AU', 'id' => 'au', 'regexp' =>'/(?:^| )AU(?:.Browser)?\/([0-9.]+)/u' ], [ 'name' => 'Awakening', 'id' => 'awakening', 'regexp' =>'/Awakening Browser\/([0-9.]*)/u', 'details' => 2 ], @@ -128,10 +227,14 @@ [ 'name' => 'Digia @Web', 'id' => 'digia', 'regexp' =>'/Digia @Web\/([0-9.]*)/u' ], [ 'name' => 'Doris', 'id' => 'doris', 'regexp' =>'/Doris\/([0-9.]*)/u' ], [ 'name' => 'Dorothy', 'id' => 'doroty', 'regexp' =>'/Dorothy$/u' ], + [ 'name' => 'Ecosia Browser', 'id' => 'ecosia', 'regexp' => '/Ecosia\sandroid@([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://play.google.com/store/apps/details?id=com.ecosia.android + [ 'name' => 'Ecosia Browser', 'id' => 'ecosia', 'regexp' => '/Ecosia\sios@([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://apps.apple.com/us/app/ecosia/id670881887 [ 'name' => 'EMOBILE Browser', 'id' => 'www browser', 'regexp' =>'/WWW Browser\/ver([0-9.]*)/u' ], + [ 'name' => 'Epic Browser', 'id' => 'epic', 'regexp' => '/ Epic\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://en.wikipedia.org/wiki/Epic_(web_browser) [ 'name' => 'EUI Browser', 'id' => 'eui', 'regexp' =>'/EUI Browser\/[^0-9\s]*([0-9.]*)/u', 'details' => 2 ], [ 'name' => 'Go.Web', 'id' => 'go\.web', 'regexp' =>'/Go\.Web\/([0-9.]*)/u' ], // used on early Blackberry, by GoAmerica [ 'name' => 'Helium', 'id' => 'helium', 'regexp' =>'/HeliumMobileBrowser\/([0-9.]*)/u' ], + [ 'name' => 'HeyTap Browser', 'id' => 'heytap', 'regexp' => '/HeyTapBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], [ 'name' => 'Huohou Browser', 'id' => 'huohoubrowser', 'regexp' =>'/HuohouBrowser\/([0-9.]*)/u' ], [ 'name' => 'iCab', 'id' => 'icab', 'regexp' =>'/iCabMobile\/([0-9.]*)/u' ], [ 'name' => 'iLunascape', 'id' => 'lunascape', 'regexp' =>'/iLunascape\/([0-9.]*)/u', 'details' => 3 ], // see: http://www.lunascape.tv @@ -139,21 +242,28 @@ [ 'name' => 'iSurf', 'id' => 'isurf', 'regexp' =>'/iSurf version \/v([0-9.]*)/u', 'details' => 2 ], [ 'name' => 'Jig Browser', 'id' => 'jig browser', 'regexp' =>'/jig browser(?: web| core|9i?)?;? ?([0-9.]+)?/u', 'type' => Constants\DeviceType::MOBILE ], [ 'name' => 'Jumanji', 'id' => 'jumanji', 'regexp' =>'/jumanji/u' ], // see: jumanji browser ubuntu + [ 'name' => 'K.Browser', 'id' => 'tnsbrowser', 'regexp' => '/TNSBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://play.google.com/store/apps/details?id=com.tnsua.browser [ 'name' => 'Kiosk', 'id' => 'kiosk', 'regexp' =>'/Kiosk\/([0-9.]*)/u' ], // see: http://www.kioskbrowser.net + [ 'name' => 'Kiwi Browser', 'id' => 'kiwi', 'regexp' => '/Kiwi Chrome\/([0-9.A-Z]*)/u' ], // see: https://kiwibrowser.com [ 'name' => 'LeBrowser', 'id' => 'lebrowser', 'regexp' =>'/LeBrowser\/([0-9.]*)/u', 'details' => 2 ], [ 'name' => 'LieBaoFast', 'id' => 'liebao', 'regexp' =>'/LieBaoFast\/([0-9.]*)/u' ], // see: http://www.liebao.cn [ 'name' => 'MaCross Mobile', 'id' => 'macross', 'regexp' =>'/MaCross\/([0-9.]*)/u' ], [ 'name' => 'Mammoth', 'id' => 'mammoth', 'regexp' =>'/Mammoth\/([0-9.]*)/u' ], // see: https://itunes.apple.com/cn/app/meng-ma-liu-lan-qi/id403760998?mt=8 [ 'name' => 'mCent Browser', 'id' => 'mcent', 'regexp' =>'/mCent\/([0-9.]*)/u' ], + [ 'name' => 'Mint Browser', 'id' => 'mint', 'regexp' => '/XiaoMi\/Mint Browser\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: http://www.mintbrowser.com/ + [ 'name' => 'Mobicip', 'id' => 'mobicip', 'regexp' => '/ Mobicip\//u', 'type' => Constants\DeviceType::MOBILE ], // see: https://www.mobicip.com/ [ 'name' => 'Motorola Internet Browser', 'id' => 'mib', 'regexp' =>'/MIB\/([0-9.]*)/u' ], [ 'name' => 'Motorola Internet Browser', 'id' => 'mib', 'regexp' =>'/MIB([0-9.]+)\//u' ], [ 'name' => 'Motorola Internet Browser', 'id' => 'cmcs', 'regexp' =>'/Browser\/CMCS([0-9.]*)/u' ], [ 'name' => 'Motorola WebKit', 'id' => 'motorola', 'regexp' =>'/MotorolaWebKit(?:\/([0-9.]*))?/u', 'details' => 3 ], + [ 'name' => 'MultiZilla', 'id' => 'multizilla', 'regexp' => '/MultiZilla\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://sourceforge.net/projects/multizilla/ [ 'name' => 'NetFront Life Browser', 'id' => 'netfrontlife', 'regexp' =>'/NetFrontLifeBrowser\/([0-9.]*)/u' ], [ 'name' => 'OneBrowser', 'id' => 'onebrowser', 'regexp' =>'/OneBrowser\/([0-9.]*)/u' ], + [ 'name' => 'OnePlus Browser', 'id' => 'oneplus', 'regexp' => '/OnePlusBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://www.oneplus.com/ [ 'name' => 'PocketLink', 'id' => 'plink', 'regexp' =>'/PLink ([0-9.]+)/iu', 'details' => 2 ], [ 'name' => 'Polaris', 'id' => 'polaris', 'regexp' =>'/Polaris[\/ ]v?([0-9.]*)/iu', 'details' => 2 ], [ 'name' => 'Polaris', 'id' => 'polaris', 'regexp' =>'/POLARIS([0-9.]+)/u', 'details' => 2 ], + [ 'name' => 'Pure Browser', 'id' => 'pure', 'regexp' =>'/PureBrowser\/([0-9.]*)/u', 'details' => 2 ], [ 'name' => 'Openwave', 'id' => 'openwave', 'regexp' =>'/Open[Ww]ave\/([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::MOBILE ], [ 'name' => 'Openwave', 'id' => 'openwave', 'regexp' =>'/Openwave Mobile Browser ([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::MOBILE ], [ 'name' => 'Openwave', 'id' => 'openwave', 'regexp' =>'/Browser\/OpenWave([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::MOBILE ], @@ -161,15 +271,20 @@ [ 'name' => 'Openwave', 'id' => 'km', 'regexp' =>'/KM\.Browser\/([0-9.]+)/iu', 'details' => 2, 'type' => Constants\DeviceType::MOBILE ], [ 'name' => 'Openwave', 'id' => 'up', 'regexp' =>'/UP\/([0-9.]+)/u', 'details' => 2, 'type' => Constants\DeviceType::MOBILE ], [ 'name' => 'Oppo Browser', 'id' => 'oppo', 'regexp' =>'/OppoBrowser\/([0-9.]+)/iu' ], - [ 'name' => 'Quark Browser', 'id' => 'quark', 'regexp' =>'/Quark\/([0-9.]*)/u', 'details' => 3 ], + [ 'name' => 'Quark Browser', 'id' => 'quark', 'regexp' =>'/Quark\/([0-9.]*)/u', 'details' => 3 ], + [ 'name' => 'Realme Browser', 'id' => 'realme', 'regexp' =>'/RealmeBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], + [ 'name' => 'SEMC Browser', 'id' => 'semc', 'regexp' =>'/SEMC-Browser\/([0-9.]*)/u' ], [ 'name' => 'STNC HitchHiker' , 'id' => 'stnc', 'regexp' =>'/STNC-WTL\/[0-9.]*/u' ], [ 'name' => 'Sogou Mobile', 'id' => 'sogou', 'regexp' =>'/SogouMobileBrowser\/([0-9.]*)/u', 'details' => 2 ], [ 'name' => 'Swing Browser', 'id' => 'swing', 'regexp' =>'/Swing\(And\)\/([0-9.]*)/u', 'details' => 3 ], [ 'name' => 'Symphony', 'id' => 'symphony', 'regexp' =>'/Symphony ([0-9.]+)$/u' ], + [ 'name' => 'Tenta Browser', 'id' => 'tenta', 'regexp' => '/ Tenta\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://play.google.com/store/apps/details?id=com.tenta.android&hl=en [ 'name' => 'TinY', 'id' => 'ucpro', 'regexp' =>'/ucpro\/([0-9.]+)/iu' ], [ 'name' => 'Vivo Browser', 'id' => 'vivo', 'regexp' =>'/VivoBrowser\/([0-9.]+)/iu' ], [ 'name' => 'WebLite', 'id' => 'weblite', 'regexp' =>'/WebLite\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], + [ 'name' => 'WK Browser', 'id' => 'wk', 'regexp' => '/wkbrowser ([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://github.com/keanulee/WKBrowser + [ 'name' => 'Yaani Browser', 'id' => 'yaani', 'regexp' => '/YaaniBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://www.yaani.com.tr/ /* Television browsers */ [ 'name' => 'AltiBrowser', 'id' => 'alti', 'regexp' =>'/AltiBrowser\/([0-9.]*)/i' ], @@ -177,6 +292,7 @@ [ 'name' => 'AwoX', 'id' => 'awox', 'regexp' =>'/AwoX(?:\/([0-9.]*))? Browser/i' ], [ 'name' => 'Isis', 'id' => 'browserserver', 'regexp' =>'/BrowserServer/u' ], [ 'name' => 'Isis', 'id' => 'isis', 'regexp' =>'/ISIS\/([0-9.]*)/u', 'details' => 2 ], + [ 'name' => 'Netbox', 'id' => 'netbox', 'regexp' =>'/Netbox\/([0-9.]*)/u', 'type' => Constants\DeviceType::TELEVISION ], [ 'name' => 'Spyglass', 'id' => 'spyglass', 'regexp' =>'/Spyglass ([0-9.]+); OpenTV/u' ], [ 'name' => 'Oregan Browser', 'id' => 'oregan', 'regexp' =>'/OreganMediaBrowser(?:\/([0-9.]*))?/u', 'details' => 2 ], [ 'name' => 'Viera Browser', 'id' => 'viera', 'regexp' =>'/Viera\/([0-9.]*)/u' ], @@ -187,7 +303,7 @@ [ 'name' => 'Aplix', 'id' => 'aplix', 'regexp' =>'/Aplix_SEGASATURN_browser\/([0-9](?:.[0-9.]+)?)/u' ], // browser for the Sega Saturn [ 'name' => 'Bunjalloo', 'id' => 'bunjalloo', 'regexp' =>'/Bunjalloo\/([0-9.]*)/u' ], // browser for the Nintento DS [ 'name' => 'Nintendo Web Framework', 'id' => 'nwf', 'regexp' =>'/NWF\/([0-9.]*)/u', 'details' => 2 ], // browser for the Sega Dreamcast - [ 'name' => 'Nuanti Meta', 'id' => 'nuanti', 'regexp' =>'/Nuanti(?:Meta)?\/([0-9.]*)/u' ], // browser for the Playstation + [ 'name' => 'Nuanti Meta', 'id' => 'nuanti', 'regexp' =>'/Nuanti(?:Meta)?\/([0-9.]*)/u' ], // browser for the PlayStation /* Other browsers */ [ 'name' => 'Wear Internet Browser','id' => 'wib', 'regexp' =>'/WIB\/([0-9.]*)/u' ], @@ -218,7 +334,7 @@ [ 'name' => 'Snowshoe', 'id' => 'snowshoe', 'regexp' =>'/Snowshoe\/([0-9.]*)/u', 'details' => 2 ], [ 'name' => 'Sputnik', 'id' => 'sputnik', 'regexp' =>'/Sputnik\/([0-9.]*)/iu', 'details' => 3 ], [ 'name' => 'Surf', 'id' => 'surf', 'regexp' =>'/Surf\/([0-9.]*)/u' ], - [ 'name' => 'TaoBrowser', 'id' => 'tao', 'regexp' =>'/TaoBrowser\/([0-9.]*)/u', 'details' => 2 ], + [ 'name' => 'Taobao Browser', 'id' => 'tao', 'regexp' =>'/TaoBrowser\/([0-9.]*)/u', 'details' => 2 ], [ 'name' => 'TaomeeBrowser', 'id' => 'tao', 'regexp' =>'/TaomeeBrowser\/([0-9.]*)/u', 'details' => 2 ], [ 'name' => 'TazWeb', 'id' => 'taz', 'regexp' =>'/TazWeb/u' ], [ 'name' => 'Uzbl', 'id' => 'uzbl', 'regexp' =>'/^Uzbl/u' ], @@ -252,4 +368,4 @@ [ 'name' => 'BrightSign', 'id' => 'brightsign', 'regexp' =>'/BrightSign\/([0-9.]*)/u', 'type' => Constants\DeviceType::SIGNAGE ], [ 'name' => 'Coship MMCP', 'id' => 'coship', 'regexp' =>'/Coship_MMCP_([0-9.]*)/u', 'type' => Constants\DeviceType::SIGNAGE ], ] -]; +]; \ No newline at end of file diff --git a/data/applications-others.php b/data/applications-others.php index a739a636d..5a1626f1d 100644 --- a/data/applications-others.php +++ b/data/applications-others.php @@ -71,11 +71,20 @@ Constants\BrowserType::APP_CHAT => [ [ 'name' => 'Facebook Messenger', 'id' => 'messenger', 'regexp' =>'/FBAN\/MessengerForiOS/u' ], [ 'name' => 'Facebook Messenger', 'id' => 'messenger', 'regexp' =>'/FB_IAB\/MESSENGER/u' ], + [ 'name' => 'KakaoTalk', 'id' => 'kakao', 'regexp' => '/KAKAOTALK ([0-9.]*)/u' ], + [ 'name' => 'KakaoTalk', 'id' => 'kakao', 'regexp' => '/KAKAOTALK/u' ], [ 'name' => 'Kik', 'id' => 'kik', 'regexp' =>'/Kik\/([0-9.]*?)(\.0)?\.[0-9]{3,4}/u' ], + [ 'name' => 'Line', 'id' => 'line', 'regexp' => '/ Line\/([0-9.]*)/u' ], + [ 'name' => 'Slack', 'id' => 'slack', 'regexp' => '/ Slack_SSB\/([0-9.]*)/u' ], + [ 'name' => 'Viber', 'id' => 'viber', 'regexp' => '/ Viber/u' ], + [ 'name' => 'Viber', 'id' => 'viber', 'regexp' => '/Viber\/([0-9.]*)/u' ], [ 'name' => 'WeChat', 'id' => 'messenger', 'regexp' =>'/MicroMessenger\/([0-9.]*)/u' ], + [ 'name' => 'WhatsApp', 'id' => 'whatsapp', 'regexp' =>'/WhatsApp\/([0-9.]*)/u' ], [ 'name' => 'Wire', 'id' => 'wire', 'regexp' =>'/Wire\/([0-9.]*)/u' ], [ 'name' => 'Yahoo Messenger', 'id' => 'yahoo', 'regexp' =>'/YahooMobile\/1.0 \(im; ([0-9.]+)\)/u', 'details' => 3 ], [ 'name' => 'Yammer', 'id' => 'yammer', 'regexp' =>'/Yammer\/([0-9.]*)/u', 'details' => 2 ], + [ 'name' => 'Zalo', 'id' => 'zalo', 'regexp' => '/Zalo-win32-([0-9.]*)/u' ], + [ 'name' => 'Zalo', 'id' => 'zalo', 'regexp' => '/ Zalo\/([0-9.]*)/u' ], ], Constants\BrowserType::APP_SOCIAL => [ @@ -91,6 +100,7 @@ [ 'name' => 'Twitter', 'id' => 'twitter', 'regexp' =>'/TwitterAndroid/u' ], [ 'name' => 'Twitter', 'id' => 'twitter', 'regexp' =>'/Twitter for iPhone/u' ], [ 'name' => 'WordPress', 'id' => 'wp-android', 'regexp' =>'/wp-android\/([0-9.]*)/u' ], + [ 'name' => 'Yelp', 'id' => 'yelp', 'regexp' =>'/YelpApp\/([0-9.]*)/u' ], ], Constants\BrowserType::APP_OFFICE => [ diff --git a/data/browsers-chrome.php b/data/browsers-chrome.php index a8a0dfccf..8e4a185a6 100644 --- a/data/browsers-chrome.php +++ b/data/browsers-chrome.php @@ -84,6 +84,41 @@ '77.0.3865' => 'stable', '78.0.3904' => 'stable', '79.0.3945' => 'stable', + '80.0.3987' => 'stable', + '81.0.4044' => 'stable', + '83.0.4103' => 'stable', + '84.0.4147' => 'stable', + '85.0.4183' => 'stable', + '86.0.4240' => 'stable', + '87.0.4280' => 'stable', + '88.0.4324' => 'stable', + '89.0.4389' => 'stable', + '90.0.4430' => 'stable', + '91.0.4472' => 'stable', + '92.0.4515' => 'stable', + '93.0.4577' => 'stable', + '94.0.4606' => 'stable', + '95.0.4638' => 'stable', + '96.0.4664' => 'stable', + '97.0.4692' => 'stable', + '98.0.4758' => 'stable', + '99.0.4844' => 'stable', + '100.0.4896' => 'stable', + '101.0.4951' => 'stable', + '102.0.5005' => 'stable', + '103.0.5060' => 'stable', + '104.0.5112' => 'stable', + '105.0.5195' => 'stable', + '106.0.5249' => 'stable', + '107.0.5304' => 'stable', + '108.0.5359' => 'stable', + '109.0.5414' => 'stable', + '110.0.5481' => 'stable', + '111.0.5563' => 'stable', + '112.0.5615' => 'stable', + '113.0.5672' => 'stable', + '114.0.5735' => 'stable', + '115.0.5790' => 'stable' ]; Chrome::$MOBILE = [ @@ -142,4 +177,38 @@ '77.0.3865' => 'stable', '78.0.3904' => 'stable', '79.0.3945' => 'stable', + '80.0.3987' => 'stable', + '83.0.4103' => 'stable', + '84.0.4147' => 'stable', + '85.0.4183' => 'stable', + '86.0.4240' => 'stable', + '87.0.4280' => 'stable', + '88.0.4324' => 'stable', + '89.0.4389' => 'stable', + '90.0.4430' => 'stable', + '91.0.4472' => 'stable', + '92.0.4515' => 'stable', + '93.0.4577' => 'stable', + '94.0.4606' => 'stable', + '95.0.4638' => 'stable', + '96.0.4664' => 'stable', + '97.0.4692' => 'stable', + '98.0.4758' => 'stable', + '99.0.4844' => 'stable', + '100.0.4896' => 'stable', + '101.0.4951' => 'stable', + '102.0.5005' => 'stable', + '103.0.5060' => 'stable', + '104.0.5112' => 'stable', + '105.0.5195' => 'stable', + '106.0.5249' => 'stable', + '107.0.5304' => 'stable', + '108.0.5359' => 'stable', + '109.0.5414' => 'stable', + '110.0.5481' => 'stable', + '111.0.5563' => 'stable', + '112.0.5615' => 'stable', + '113.0.5672' => 'stable', + '114.0.5735' => 'stable', + '115.0.5790' => 'stable' ]; diff --git a/data/indices/models-android.php b/data/indices/models-android.php index 2f0d74b46..0b6478c26 100644 --- a/data/indices/models-android.php +++ b/data/indices/models-android.php @@ -15,7 +15,7 @@ 7 => '(Hisense )?(LED[0-9]{2,2}(G|K|L|EC|XT)[0-9]{2,3})!', 8 => '[SX06][0-9]{2,2}HT!!', 9 => '(Huawei )?[MSTX](1|2|7|8|10)\\-[A-Z0-9][0-9]{2,2}!!', - 10 => '(HW-|HUAWEI )?(ATU|DRA|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', + 10 => '(HW-|HUAWEI )?(ATU|DRA|DVC|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', 11 => 'G[0-9]{3,3}!!', 12 => 'Y[0-9]{3,3}!!', 13 => '[0-9AS][0-9]{2,2}HW!!', @@ -44,19 +44,20 @@ 36 => 'G[0-9]{4,4}!!', 37 => 'H[0-9]{4,4}!!', 38 => 'I[0-9]{4,4}!!', - 39 => 'E[0-9]{2,2}[a-z]!!', - 40 => 'L[0-9]{2,2}[a-z]!!', - 41 => '(SNM\\-)?M[0-9]{2,2}[a-z]!!', - 42 => 'S[0-9]{2,2}[a-z]!!', - 43 => '(XOLO )?[ABQX][0-9]{3,4}!!', - 44 => '(ZTE ?)?N[0-9]{3,3}!!', - 45 => '(ZXY-)?(ZTE )?N[0-9]{4,4}!!', - 46 => '(ZTE ?)?U[0-9]{3,3}!!', - 47 => '(ZTE ?)?V[0-9]{3,3}[A-Z]!!', - 48 => '(ZTE ?)?V ?[0-9]{3,3}!!', - 49 => '(ZTE ?)?X[0-9]{3,3}!!', - 50 => '(ZTE )?Z[0-9]!!', - 51 => '[a-z][a-z](?:-[a-z][a-z])?, SmartTabII7!', + 39 => 'J[0-9]{4,4}!!', + 40 => 'E[0-9]{2,2}[a-z]!!', + 41 => 'L[0-9]{2,2}[a-z]!!', + 42 => '(SNM\\-)?M[0-9]{2,2}[a-z]!!', + 43 => 'S[0-9]{2,2}[a-z]!!', + 44 => '(XOLO )?[ABQX][0-9]{3,4}!!', + 45 => '(ZTE ?)?N[0-9]{3,3}!!', + 46 => '(ZXY-)?(ZTE )?N[0-9]{4,4}!!', + 47 => '(ZTE ?)?U[0-9]{3,3}!!', + 48 => '(ZTE ?)?V[0-9]{3,3}[A-Z]!!', + 49 => '(ZTE ?)?V ?[0-9]{3,3}!!', + 50 => '(ZTE ?)?X[0-9]{3,3}!!', + 51 => '(ZTE )?Z[0-9]!!', + 52 => '[a-z][a-z](?:-[a-z][a-z])?, SmartTabII7!', ), '@00' => array ( @@ -126,6 +127,22 @@ 1 => '(Xiaomi )?20!!', 2 => '(Xiaomi |HM)?20!!', ), + '@21' => + array ( + 0 => '21061119DG', + 1 => '2107113SG', + 2 => '21081111RG', + 3 => '21091116AG', + 4 => '(Xiaomi |HM)?21!!', + 5 => '21051182G', + ), + '@22' => + array ( + 0 => '2201117TY', + 1 => '2201122G', + 2 => '2201123G', + 3 => '2201116PG', + ), '@2P' => array ( 0 => '2PQ93', @@ -195,63 +212,70 @@ ), '@50' => array ( - 0 => '5010[DEGSUX]!', - 1 => '5011[A]!', - 2 => '5012[G]!', - 3 => '5015[ADEX]!', - 4 => '5016[AJ]!', - 5 => '5017[B]!', - 6 => '5017[ADEOX]!', - 7 => '5019[D]!', - 8 => '5020[A]!', - 9 => '5022[DEX]!', - 10 => '5023[F]!', - 11 => '5024[D]!', - 12 => '5025[DEGX]!', - 13 => '5027[B]!', - 14 => '5033[ADJOX]!', - 15 => '5034[D]!', - 16 => '5036[D]!', - 17 => '5038[ADEX]!', - 18 => '5039[D]!', - 19 => '5041[C]!', - 20 => '5042[ADEFGTWXY]!', - 21 => '5044[ADGIOSTY]!', - 22 => '5045[ADFGJTXY]!', - 23 => '5046[DGIJUY]!', - 24 => '5047[DIUY]!', - 25 => '5049[EGSWZ]!', - 26 => '5050[ASYX]!', - 27 => '5051[ADJMX]!', - 28 => '5052[DY]!', - 29 => '5053[D]!', - 30 => '5054[ADOSTX]!', - 31 => '5054[NW]!', - 32 => '5056[ADEINUWX]!', - 33 => '5056[O]!', - 34 => '5057[M]!', - 35 => '5058[I]!', - 36 => '5059[ADJTXY]!', - 37 => '5060[D]!', - 38 => '5065[ADJNWX]!', - 39 => '5070[DJX]!', - 40 => '5080[A]!', - 41 => '5080[DFQX]!', - 42 => '5085[CDJNOYX]!', - 43 => '5086[ADY]!', - 44 => '5090[Y]!', - 45 => '5095[BIKY]!', - 46 => '5096[AI]!', - 47 => '5098[OS]!', - 48 => '5099[ADY]!', - 49 => '504Q', - 50 => '504Q+', - 51 => '504QP', - 52 => '501LV', - 53 => '(48|50|55)AX600C!', - 54 => '5080C Pro', - 55 => '50[0-9]SO!!', - 56 => '502ZT', + 0 => '5001[D]!', + 1 => '5002[DH]!', + 2 => '5003[D]!', + 3 => '5009[D]!', + 4 => '5010[DEGSUX]!', + 5 => '5011[A]!', + 6 => '5012[G]!', + 7 => '5015[ADEX]!', + 8 => '5016[AJ]!', + 9 => '5017[B]!', + 10 => '5017[ADEOX]!', + 11 => '5019[D]!', + 12 => '5020[A]!', + 13 => '5022[DEX]!', + 14 => '5023[F]!', + 15 => '5024[DF]!', + 16 => '5025[DEGX]!', + 17 => '5027[B]!', + 18 => '5030[DF]!', + 19 => '5033[ADJOX]!', + 20 => '5034[D]!', + 21 => '5036[D]!', + 22 => '5038[ADEX]!', + 23 => '5039[D]!', + 24 => '5041[C]!', + 25 => '5042[ADEFGTWXY]!', + 26 => '5044[ADGIOSTY]!', + 27 => '5045[ADFGJTXY]!', + 28 => '5046[DGIJUY]!', + 29 => '5047[DIUY]!', + 30 => '5048[UY]!', + 31 => '5049[EGSWZ]!', + 32 => '5050[ASYX]!', + 33 => '5051[ADJMX]!', + 34 => '5052[DY]!', + 35 => '5053[DK]!', + 36 => '5054[ADOSTX]!', + 37 => '5054[NW]!', + 38 => '5056[ADEINUWX]!', + 39 => '5056[O]!', + 40 => '5057[M]!', + 41 => '5058[I]!', + 42 => '5059[ADJTXY]!', + 43 => '5060[D]!', + 44 => '5061[KU]!', + 45 => '5065[ADJNWX]!', + 46 => '5070[DJX]!', + 47 => '5080[A]!', + 48 => '5080[DFQX]!', + 49 => '5085[CDJNOYX]!', + 50 => '5086[ADY]!', + 51 => '5090[Y]!', + 52 => '5095[BIKY]!', + 53 => '5096[AI]!', + 54 => '5098[OS]!', + 55 => '5099[ADY]!', + 56 => '504Q', + 57 => '504Q+', + 58 => '504QP', + 59 => '501LV', + 60 => '(48|50|55)AX600C!', + 61 => '5080C Pro', + 62 => '50[0-9]SO!!', + 63 => '502ZT', ), '@55' => array ( @@ -276,24 +300,26 @@ array ( 0 => '6014[DX]!', 1 => '6016[ADEX]!', - 2 => '6031[X]!', - 3 => '6036[AYX]!', - 4 => '6037[BIKY]!', - 5 => '6039[AHJKSY]!', - 6 => '6042[D]!', - 7 => '6043[AD]!', - 8 => '6044D', - 9 => '6045[BFGIKOXY]!', - 10 => '6050[AFWY]!', - 11 => '6055[ABDHIKPUY]!', - 12 => '6058[D]!', - 13 => '6060[S]!', - 14 => '6062[W]!', - 15 => '6070[KOY]!', - 16 => '602LV', - 17 => '60[0-9]SO!!', - 18 => '602ZT', - 19 => '6034R ORANGE Niva', + 2 => '6025[D]!', + 3 => '6031[X]!', + 4 => '6036[AYX]!', + 5 => '6037[BIKY]!', + 6 => '6039[AHJKSY]!', + 7 => '6042[D]!', + 8 => '6043[AD]!', + 9 => '6044D', + 10 => '6045[BFGIKOXY]!', + 11 => '6050[AFWY]!', + 12 => '6055[ABDHIKPUY]!', + 13 => '6056[D]!', + 14 => '6058[D]!', + 15 => '6060[S]!', + 16 => '6062[W]!', + 17 => '6070[KOY]!', + 18 => '602LV', + 19 => '60[0-9]SO!!', + 20 => '602ZT', + 21 => '6034R ORANGE Niva', ), '@66' => array ( @@ -337,13 +363,17 @@ array ( 0 => '8020[D]!', 1 => '8030[BY]!', - 2 => 8022, - 3 => '801ES', - 4 => '80-1', - 5 => '801a', - 6 => '801s', - 7 => '802w', - 8 => '800P31C', + 2 => 8063, + 3 => 8082, + 4 => '8082 EEA', + 5 => '8094[X]!', + 6 => 8022, + 7 => '801ES', + 8 => '80-1', + 9 => '801a', + 10 => '801s', + 11 => '802w', + 12 => '800P31C', ), '@81' => array ( @@ -393,10 +423,11 @@ 9 => '9022[SX]!', 10 => '9024[OW]!', 11 => '9025[MQ]!', - 12 => '9021[AM]!', - 13 => '909d', - 14 => 9088, - 15 => '9020[A]!', + 12 => '9026[X]!', + 13 => '9021[AM]!', + 14 => '909d', + 15 => 9088, + 16 => '9020[A]!', ), '@93' => array ( @@ -411,9 +442,10 @@ '@A0' => array ( 0 => 'A001', - 1 => 'A0001', - 2 => 'A0002', - 3 => 'A05510', + 1 => 'A007', + 2 => 'A0001', + 3 => 'A0002', + 4 => 'A05510', ), '@A1' => array ( @@ -450,6 +482,7 @@ 30 => 'A11(M5A7)', 31 => 'A11s(M5A7)', 32 => 'A15(E6C2)', + 33 => 'A11 Pro Max', ), '@A2' => array ( @@ -567,20 +600,22 @@ 3 => 'A862W', 4 => 'A80KSC!', 5 => 'A80HF', - 6 => 'A89', - 7 => 'A820t', - 8 => 'A87', - 9 => 'A853', - 10 => 'A853 Milestone', - 11 => 'A878 Duo', - 12 => 'A898 Duo', - 13 => 'A8HD', - 14 => 'A80h双核(A4P9)', - 15 => 'A80 se??(M5MA)', - 16 => 'A80 se四核(M5MC)', - 17 => 'A80HD四核(C4H6)', - 18 => 'A88 mini四核(M1C5)', - 19 => 'A81E', + 6 => 'A80Plus', + 7 => 'A80Pro', + 8 => 'A89', + 9 => 'A820t', + 10 => 'A87', + 11 => 'A853', + 12 => 'A853 Milestone', + 13 => 'A878 Duo', + 14 => 'A898 Duo', + 15 => 'A8HD', + 16 => 'A80h双核(A4P9)', + 17 => 'A80 se??(M5MA)', + 18 => 'A80 se四核(M5MC)', + 19 => 'A80HD四核(C4H6)', + 20 => 'A88 mini四核(M1C5)', + 21 => 'A81E', ), '@A9' => array ( @@ -591,6 +626,7 @@ 4 => 'A90S', 5 => 'A953', 6 => 'A955', + 7 => 'A9 Pro', ), '@AA' => array ( @@ -598,19 +634,22 @@ ), '@AC' => array ( - 0 => 'Acer Chromebook R11', - 1 => 'Acer Chromebook R11 (CB5-132T / C738T)', - 2 => 'Acer Chromebook 15 (CB3-532)', + 0 => 'Acer Chromebook R11!', + 1 => 'Acer Chromebook R13!', + 2 => 'Acer Chromebook 15!', 3 => '(AC|BC|LC|MT|RC|QS|VM|TS|OC)[0-9]{4,4}[A-Z]!!', 4 => 'AC45BHE', 5 => 'AC50BHE', 6 => 'AC50DHE', 7 => 'AC45NE', - 8 => 'ACM3066-8', - 9 => '(Explay|X-tremer|ActiveD|Informer|Surfer)!!', - 10 => 'ACT2000', - 11 => 'ACU Volvo', - 12 => 'Acqua', + 8 => 'Action-X3', + 9 => 'ACM3066-8', + 10 => '(Explay|X-tremer|ActiveD|Informer|Surfer)!!', + 11 => 'AC2001', + 12 => 'AC2003', + 13 => 'ACT2000', + 14 => 'ACU Volvo', + 15 => 'Acqua', ), '@AD' => array ( @@ -691,7 +730,8 @@ 3 => 'AG Go-Tab Access', 4 => 'AG Chrome Go Tab 7.0', 5 => 'AGS-(L09|W09)!', - 6 => '(KATBL|Kogan|Agora)!!', + 6 => 'AGS2-(L09|W09)!', + 7 => '(KATBL|Kogan|Agora)!!', ), '@AI' => array ( @@ -763,8 +803,8 @@ 33 => '(Allview|Alldro)!!', 34 => 'Allwinner A10', 35 => '(Highscreen|Alpha|Bay|Boost|Cosmo|Explosion|Power|Prime|Zera)!!', - 36 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NXT|SNE|TAS|Z100)!!', - 37 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 36 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NOH|NXT|SNE|TAS|Z100)!!', + 37 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', 38 => 'Alfa A93 POP', 39 => 'Alfa L', 40 => 'Ally', @@ -801,7 +841,8 @@ 25 => 'AMD120', 26 => '(Amaze|Hitech)!!', 27 => 'Amaze 4G', - 28 => '(Amazing|Fantastic)!!', + 28 => '(HW-|HUAWEI )?(AMN|ART|AQM|CRO|LUA|CUN|DUB|SCC|SCU|CAM|LDN|LYO|MED|MYA)!!', + 29 => '(Amazing|Fantastic)!!', ), '@AN' => array ( @@ -849,7 +890,7 @@ 41 => 'AN10G2-LZ', 42 => 'AN10BG3-LZ', 43 => 'AN7DG3C', - 44 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 44 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', 45 => '(iBall )?Andi!!', 46 => 'AND1', 47 => 'AND1E', @@ -910,10 +951,11 @@ 11 => 'Aquila 101-1008 3G', 12 => 'Aquila LE 080-0508', 13 => 'Aquila SE 090-0508', - 14 => '(Intex )?Aqua!!', - 15 => 'AQUOS!!', - 16 => 'aqua', - 17 => 'AQT80', + 14 => '(HW-|HUAWEI )?(AMN|ART|AQM|CRO|LUA|CUN|DUB|SCC|SCU|CAM|LDN|LYO|MED|MYA)!!', + 15 => '(Intex )?Aqua!!', + 16 => 'AQUOS!!', + 17 => 'aqua', + 18 => 'AQT80', ), '@AR' => array ( @@ -945,37 +987,54 @@ 25 => 'arrowsM03', 26 => 'ARIES 101', 27 => 'ARIES 785', - 28 => 'ARA YS608', - 29 => 'Arctic450', - 30 => 'Arc', - 31 => 'Arc S', + 28 => '(HW-|HUAWEI )?(AMN|ART|AQM|CRO|LUA|CUN|DUB|SCC|SCU|CAM|LDN|LYO|MED|MYA)!!', + 29 => 'ARA YS608', + 30 => 'Arctic450', + 31 => 'Arc', + 32 => 'Arc S', + 33 => 'Armor 2', + 34 => 'Armor 3W', + 35 => 'Armor 3WT', + 36 => 'Armor 5S', + 37 => 'Armor 6E', + 38 => 'Armor 7', + 39 => 'Armor 7E', + 40 => 'Armor 8', + 41 => 'Armor 9', + 42 => 'Armor 9E', + 43 => 'Armor 10 5G', + 44 => 'Armor 11 5G', + 45 => 'Armor 11T 5G', + 46 => 'Armor X5', + 47 => 'Armor X7', + 48 => 'Armor X7 Pro', + 49 => 'Armor X8', ), '@AS' => array ( - 0 => 'ASUS Chromebook Flip C100PA', - 1 => 'ASUS Chromebook Flip C302', - 2 => 'Astone A108', - 3 => 'aspire1000s', - 4 => 'Aspire!!', - 5 => 'ASK SP[0-9]{3,3}!!', - 6 => 'ASTRI', - 7 => 'asus laptop', - 8 => 'ASUS T20', - 9 => 'ASUS Pad ME370T', - 10 => 'Asus Fonepad ME371MG 8GB', - 11 => 'AST21', - 12 => 'asus google cube', - 13 => 'ASP-4300W', - 14 => 'ASP-4500Z', - 15 => 'ASP-5000H', - 16 => 'Asus A10', - 17 => '(Huawei|Ascend|HW-)!!', - 18 => 'AS740', - 19 => 'AS870 4G', - 20 => 'AS985', - 21 => 'AS650C', - 22 => 'Aster', - 23 => 'Aster T', + 0 => 'ASUS Chromebook Flip!', + 1 => 'Astone A108', + 2 => 'aspire1000s', + 3 => 'Aspire!!', + 4 => 'ASK SP[0-9]{3,3}!!', + 5 => 'ASTRI', + 6 => 'asus laptop', + 7 => 'ASUS T20', + 8 => 'ASUS Pad ME370T', + 9 => 'Asus Fonepad ME371MG 8GB', + 10 => 'AST21', + 11 => 'asus google cube', + 12 => 'ASP-4300W', + 13 => 'ASP-4500Z', + 14 => 'ASP-5000H', + 15 => 'Asus A10', + 16 => '(Huawei|Ascend|HW-)!!', + 17 => 'AS740', + 18 => 'AS870 4G', + 19 => 'AS985', + 20 => 'AS650C', + 21 => 'Aster', + 22 => 'Aster T', ), '@AT' => array ( @@ -995,8 +1054,8 @@ 13 => 'AT1G*', 14 => 'AT7E', 15 => 'ATP515CKIT', - 16 => '(HW-|HUAWEI )?(ATU|DRA|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', - 17 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 16 => '(HW-|HUAWEI )?(ATU|DRA|DVC|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', + 17 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', 18 => 'aTab9.7 IPS', 19 => 'AT735', 20 => 'Atrix 2', @@ -1038,8 +1097,9 @@ array ( 0 => 'Aurora-II', 1 => 'AUX!!', - 2 => '(Aura|iberry|AUXUS)!!', - 3 => 'AURUS III', + 2 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 3 => '(Aura|iberry|AUXUS)!!', + 4 => 'AURUS III', ), '@AV' => array ( @@ -1067,6 +1127,10 @@ 1 => 'B15', 2 => 'B15Q', ), + '@B2' => + array ( + 0 => 'B2021', + ), '@B3' => array ( 0 => 'B3-A10', @@ -1076,7 +1140,12 @@ 4 => 'B3-A32', 5 => 'B3-A40', 6 => 'B3-A40FHD', - 7 => 'B3000', + 7 => 'B3-A50FHD', + 8 => 'B3000', + ), + '@B5' => + array ( + 0 => 'B5532', ), '@B9' => array ( @@ -1093,12 +1162,13 @@ 6 => '(Highscreen|Alpha|Bay|Boost|Cosmo|Explosion|Power|Prime|Zera)!!', 7 => 'BAH-(W09|AL00|L09)!', 8 => 'BAH2-(AL10|L09|W09|W19)!', - 9 => '(HW-|HUAWEI )?BAC-(AL00|L03|L21|L22|TL00)!', - 10 => 'Backflip', - 11 => 'Backflip Me600', - 12 => 'Bambook S1', - 13 => 'BARRY', - 14 => 'BASE!!', + 9 => 'BAH3-(W09)!', + 10 => '(HW-|HUAWEI )?BAC-(AL00|L03|L21|L22|TL00)!', + 11 => 'Backflip', + 12 => 'Backflip Me600', + 13 => 'Bambook S1', + 14 => 'BARRY', + 15 => 'BASE!!', ), '@BB' => array ( @@ -1157,9 +1227,11 @@ 13 => 'BePhone UN030', 14 => 'Best ?sonny!!', 15 => 'BEAN 454', - 16 => 'beetle', - 17 => 'Be Touch 2', - 18 => 'Beeline!!', + 16 => 'BE202[69]!', + 17 => 'BE2013', + 18 => 'beetle', + 19 => 'Be Touch 2', + 20 => 'Beeline!!', ), '@BF' => array ( @@ -1175,7 +1247,7 @@ 3 => 'bg2qa0v4 !', 4 => 'bg2qv4 !', 5 => 'BGO-(DL09|L03)!', - 6 => 'BG2-(U01)!', + 6 => 'BG2-(U01|W09)!', ), '@BH' => array ( @@ -1188,12 +1260,15 @@ 2 => 'Bird!!', 3 => 'BizSmartPhone', 4 => 'BIP-6000', - 5 => 'BIRDY', + 5 => 'BISON', + 6 => 'BISON Pro', + 7 => 'BISON GT', + 8 => 'BIRDY', ), '@BK' => array ( 0 => '(BDS|BHX|BKO)\\-!!', - 1 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 1 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', ), '@BL' => array ( @@ -1202,18 +1277,19 @@ 2 => 'BlueStacks!', 3 => 'BlackBerry Runtime for Android Apps', 4 => 'BLACKBERRY P\'9982', - 5 => '(BLU|DASH|LIFE|NEO|STUDIO|VIVO)!!', - 6 => 'Bluboo S1', - 7 => 'Blaze S180', - 8 => 'BLADE LE 70', - 9 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NXT|SNE|TAS|Z100)!!', - 10 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', - 11 => '(HW-|HUAWEI )?(BLL|CHC|TAG|KII)!!', - 12 => '(BLF-)?lephone!!', - 13 => 'Blackphone 2', - 14 => 'BLOOM', - 15 => 'BLACK', - 16 => '(ZTE )?Blade!!', + 5 => 'BL6000Pro', + 6 => '(BLU|DASH|LIFE|NEO|STUDIO|VIVO)!!', + 7 => 'Bluboo S1', + 8 => 'Blaze S180', + 9 => 'BLADE LE 70', + 10 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NOH|NXT|SNE|TAS|Z100)!!', + 11 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 12 => '(HW-|HUAWEI )?(BLL|CHC|TAG|KII)!!', + 13 => '(BLF-)?lephone!!', + 14 => 'Blackphone 2', + 15 => 'BLOOM', + 16 => 'BLACK', + 17 => '(ZTE )?Blade!!', ), '@BM' => array ( @@ -1233,7 +1309,7 @@ 6 => '(NOOK )?BNTV(800)!', 7 => 'BN Nook HD', 8 => 'BN NookHD+', - 9 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 9 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', ), '@BO' => array ( @@ -1335,11 +1411,30 @@ ), '@BV' => array ( - 0 => 'BV8000Pro', + 0 => 'BV4900Pro', + 1 => 'BV5500Plus', + 2 => 'BV5900', + 3 => 'BV6300Pro', + 4 => 'BV6600', + 5 => 'BV6900', + 6 => 'BV8000Pro', + 7 => 'BV9100', + 8 => 'BV9500', + 9 => 'BV9500Plus', + 10 => 'BV9600E', + 11 => 'BV9600Pro', + 12 => 'BV9800Pro', + 13 => 'BV9900E', + 14 => 'BV9900Pro', + ), + '@C1' => + array ( + 0 => 'C15 Pro', ), '@C2' => array ( - 0 => 'C2', + 0 => 'C21 Pro', + 1 => 'C2', ), '@C5' => array ( @@ -1378,28 +1473,33 @@ array ( 0 => 'Cardhu', 1 => 'CA907AAC0G', - 2 => 'Camangi-Mangrove7', - 3 => 'CAPTIVA!!', - 4 => 'Carpad T5', - 5 => 'Carpad T61 2g', - 6 => 'CAL21', - 7 => 'CA201SP', - 8 => 'CA-201L', - 9 => 'Casper VIA!!', - 10 => 'CAT!!', - 11 => 'Candy TV', - 12 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', - 13 => '(HW-|HUAWEI )?(CRO|LUA|CUN|SCC|SCU|CAM|LDN|LYO|MYA)!!', - 14 => '(HW-|HUAWEI )?CAZ-(AL10|TL10|TL20)!', - 15 => '(HW-|HUAWEI )?CAN-(L01|L11|L12)!', - 16 => 'calgary', - 17 => 'Captivate-I897', - 18 => 'capricorn', + 2 => 'Carbon 1 Mark II', + 3 => 'Camangi-Mangrove7', + 4 => 'CAPTIVA!!', + 5 => 'Carpad T5', + 6 => 'Carpad T61 2g', + 7 => 'CAL21', + 8 => 'CA201SP', + 9 => 'CA-201L', + 10 => 'Casper VIA!!', + 11 => 'CAT!!', + 12 => 'Candy TV', + 13 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 14 => '(HW-|HUAWEI )?(AMN|ART|AQM|CRO|LUA|CUN|DUB|SCC|SCU|CAM|LDN|LYO|MED|MYA)!!', + 15 => '(HW-|HUAWEI )?CAZ-(AL10|TL10|TL20)!', + 16 => '(HW-|HUAWEI )?CAN-(L01|L11|L12)!', + 17 => 'calgary', + 18 => 'Captivate-I897', + 19 => 'capricorn', ), '@CC' => array ( 0 => 'CCE SK352', ), + '@CD' => + array ( + 0 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + ), '@CE' => array ( 0 => 'cedartrail', @@ -1423,7 +1523,7 @@ 11 => 'Cherry w500', 12 => 'CHUWI!!', 13 => 'CHONG!!', - 14 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 14 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', 15 => '(HW-|HUAWEI )?(BLL|CHC|TAG|KII)!!', 16 => 'chagall', 17 => 'chiron', @@ -1458,7 +1558,7 @@ 4 => 'Clanga SE 097-1008', 5 => 'CLP281X', 6 => 'Click', - 7 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 7 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', 8 => '(Intex )?Cloud!!', 9 => 'CLIQ', 10 => 'CLIQ XT', @@ -1492,17 +1592,18 @@ 10 => 'COSHIP F2', 11 => 'COWON!!', 12 => 'COZCO C1 Plus', - 13 => 'Collo DG100', - 14 => 'Collo 2 DG120', - 15 => 'Connect-2G-2.0', - 16 => '(Highscreen|Alpha|Bay|Boost|Cosmo|Explosion|Power|Prime|Zera)!!', - 17 => 'Coquettish Red', - 18 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', - 19 => 'Comet', - 20 => 'Corvair', - 21 => 'COOLPIX S800c', - 22 => 'COOLPIX S810c', - 23 => 'Constellation V', + 13 => 'Core-M5', + 14 => 'Collo DG100', + 15 => 'Collo 2 DG120', + 16 => 'Connect-2G-2.0', + 17 => '(Highscreen|Alpha|Bay|Boost|Cosmo|Explosion|Power|Prime|Zera)!!', + 18 => 'Coquettish Red', + 19 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 20 => 'Comet', + 21 => 'Corvair', + 22 => 'COOLPIX S800c', + 23 => 'COOLPIX S810c', + 24 => 'Constellation V', ), '@CP' => array ( @@ -1531,12 +1632,64 @@ 22 => 'CPH1859', 23 => 'CPH1881', 24 => 'CPH1823', - 25 => 'CPH1969', - 26 => 'CPH1721', - 27 => 'CPH1611', - 28 => 'CPH1879', - 29 => 'CPH1861', - 30 => 'CPH1979', + 25 => 'CPH1831', + 26 => 'CPH1837', + 27 => 'CPH1871', + 28 => 'CPH1875', + 29 => 'CPH1877', + 30 => 'CPH1893', + 31 => 'CPH1903', + 32 => 'CPH1907', + 33 => 'CPH1909', + 34 => 'CPH1911', + 35 => 'CPH1917', + 36 => 'CPH1919', + 37 => 'CPH1920', + 38 => 'CPH1923', + 39 => 'CPH1931', + 40 => 'CPH1933', + 41 => 'CPH1951', + 42 => 'CPH1969', + 43 => 'CPH1989', + 44 => 'CPH2005', + 45 => 'CPH2009', + 46 => 'CPH2021', + 47 => 'CPH2023', + 48 => 'CPH2025', + 49 => 'CPH2043', + 50 => 'CPH2065', + 51 => 'CPH2067', + 52 => 'CPH2069', + 53 => 'CPH2083', + 54 => 'CPH2089', + 55 => 'CPH2091', + 56 => 'CPH2121', + 57 => 'CPH2125', + 58 => 'CPH2127', + 59 => 'CPH2135', + 60 => 'CPH2145', + 61 => 'CPH2161', + 62 => 'CPH2173', + 63 => 'CPH2185', + 64 => 'CPH2195', + 65 => 'CPH2197', + 66 => 'CPH2205', + 67 => 'CPH2207', + 68 => 'CPH2211', + 69 => 'CPH2219', + 70 => 'CPH2247', + 71 => 'CPH2251', + 72 => 'CPH2269', + 73 => 'CPH2271', + 74 => 'CPH2273', + 75 => 'CPH2305', + 76 => 'CPH2307', + 77 => 'CPH2371', + 78 => 'CPH1721', + 79 => 'CPH1611', + 80 => 'CPH1879', + 81 => 'CPH1861', + 82 => 'CPH1979', ), '@CR' => array ( @@ -1544,15 +1697,16 @@ 1 => 'CRESTA.CTP888', 2 => 'Cross!!', 3 => 'Crosscall!!', - 4 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NXT|SNE|TAS|Z100)!!', - 5 => '(HW-|HUAWEI )?(CRO|LUA|CUN|SCC|SCU|CAM|LDN|LYO|MYA)!!', + 4 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NOH|NXT|SNE|TAS|Z100)!!', + 5 => '(HW-|HUAWEI )?(AMN|ART|AQM|CRO|LUA|CUN|DUB|SCC|SCU|CAM|LDN|LYO|MED|MYA)!!', 6 => 'CRONO 22', 7 => 'Crescent', ), '@CS' => array ( - 0 => 'CS-1A13', - 1 => '(CSL[- ])?(Spice[- ]?)?Mi(-| )?[0-9]{3,3}!!', + 0 => 'CS45XA', + 1 => 'CS-1A13', + 2 => '(CSL[- ])?(Spice[- ]?)?Mi(-| )?[0-9]{3,3}!!', ), '@CT' => array ( @@ -1578,7 +1732,7 @@ 0 => 'CUBOT!!', 1 => '(CUBE ?)?(K8|U1|U2|U3|U5|U6|U8|U9)[0-9]?GT!!', 2 => 'CUBE!!', - 3 => '(HW-|HUAWEI )?(CRO|LUA|CUN|SCC|SCU|CAM|LDN|LYO|MYA)!!', + 3 => '(HW-|HUAWEI )?(AMN|ART|AQM|CRO|LUA|CUN|DUB|SCC|SCU|CAM|LDN|LYO|MED|MYA)!!', ), '@CW' => array ( @@ -1617,7 +1771,7 @@ '@D2' => array ( 0 => 'D2-[0-9]{3,3}!!', - 1 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 1 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', ), '@D5' => array ( @@ -1650,7 +1804,7 @@ 1 => '(BLU|DASH|LIFE|NEO|STUDIO|VIVO)!!', 2 => 'Dakele A380', 3 => 'DAKELE MC001', - 4 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 4 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', 5 => 'DATAM803HC', 6 => 'DATAM805HC', 7 => 'DATAM819HD!', @@ -1733,8 +1887,9 @@ 1 => 'DL8006', 2 => 'DLX', 3 => 'DLXU', - 4 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 4 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', 5 => 'dL1', + 6 => 'DLT-H0', ), '@DM' => array ( @@ -1756,6 +1911,8 @@ 2 => 'DNS S!!', 3 => 'DNSS4003', 4 => 'DNS4502M', + 5 => 'DN2101', + 6 => 'DN2103', ), '@DO' => array ( @@ -1766,10 +1923,11 @@ 4 => 'DOOV!!', 5 => 'Doro Liberto!!', 6 => 'Doro 8030', - 7 => 'Doro 824', - 8 => 'Doro PhoneEasy 745', - 9 => 'Dolphin 70e Black', - 10 => 'Docomo HT-03A', + 7 => 'Doro 8040', + 8 => 'Doro 824', + 9 => 'Doro PhoneEasy 745', + 10 => 'Dolphin 70e Black', + 11 => 'Docomo HT-03A', ), '@DP' => array ( @@ -1783,7 +1941,7 @@ 0 => 'Dream', 1 => '(GIO-)?(GiONEE[- ])?Dream D1!', 2 => 'Droid Incredible', - 3 => '(HW-|HUAWEI )?(ATU|DRA|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', + 3 => '(HW-|HUAWEI )?(ATU|DRA|DVC|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', 4 => 'DroniX-0.5', 5 => 'Droid', 6 => 'DROID', @@ -1819,6 +1977,8 @@ '@DS' => array ( 0 => 'Dslide!!', + 1 => 'DSB-0220', + 2 => 'DSB-0230', ), '@DT' => array ( @@ -1827,7 +1987,12 @@ ), '@DU' => array ( - 0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 0 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 1 => '(HW-|HUAWEI )?(AMN|ART|AQM|CRO|LUA|CUN|DUB|SCC|SCU|CAM|LDN|LYO|MED|MYA)!!', + ), + '@DV' => + array ( + 0 => '(HW-|HUAWEI )?(ATU|DRA|DVC|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', ), '@DW' => array ( @@ -1865,8 +2030,11 @@ 0 => 'E1 v360', 1 => 'E170BS', 2 => 'E1031', - 3 => 'e1808 v75!', - 4 => 'e1109 v73!', + 3 => 'E1050X', + 4 => 'E1051X', + 5 => 'E1060X', + 6 => 'e1808 v75!', + 7 => 'e1109 v73!', ), '@E2' => array ( @@ -1920,8 +2088,10 @@ ), '@E9' => array ( - 0 => 'E900', - 1 => 'E912', + 0 => 'E940-2795-00', + 1 => 'E940-2796-00', + 2 => 'E900', + 3 => 'E912', ), '@EA' => array ( @@ -1933,11 +2103,13 @@ array ( 0 => 'EBEN!!', 1 => 'EBEST!!', - 2 => 'EB-4063-X', - 3 => 'EB-A71GJ', - 4 => 'EB-W51GJ', - 5 => 'EB-WX1GJ', - 6 => 'EB-L76G-B', + 2 => 'EB2101', + 3 => 'EB2103', + 4 => 'EB-4063-X', + 5 => 'EB-A71GJ', + 6 => 'EB-W51GJ', + 7 => 'EB-WX1GJ', + 8 => 'EB-L76G-B', ), '@EC' => array ( @@ -1950,7 +2122,7 @@ array ( 0 => '(bq|Aquaris|Edison|Maxwell)!!', 1 => 'edgejr', - 2 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 2 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', 3 => 'edenTAB ET-701', ), '@EE' => @@ -1986,7 +2158,7 @@ 4 => 'ELIFE-E3', 5 => 'Elife E5', 6 => 'ElifeE6', - 7 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 7 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', 8 => 'Elektra L', 9 => 'Elektra XL', 10 => 'Electrify', @@ -2017,7 +2189,7 @@ 0 => 'EMBT3C', 1 => 'EM63', 2 => 'EM01F', - 3 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 3 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', 4 => 'eMAX mini', 5 => 'EMR1879', ), @@ -2075,16 +2247,18 @@ 3 => '(EVAS )?EVERCOSS[- ]A!!', 4 => 'EVERPAD SC-710', 5 => 'Ever!!', - 6 => 'EVO', - 7 => 'Evo HD2', - 8 => 'EVO ?3D!', - 9 => 'EVO 4G', - 10 => 'Evo V 4G', - 11 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NXT|SNE|TAS|Z100)!!', - 12 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', - 13 => '(EV|KM)-[ES][0-9]{3,3}!!', - 14 => 'Event', - 15 => 'EVERY35', + 6 => 'EVOLVEO StrongPhone G7', + 7 => 'EVOLVEO StrongPhone G9', + 8 => 'EVO', + 9 => 'Evo HD2', + 10 => 'EVO ?3D!', + 11 => 'EVO 4G', + 12 => 'Evo V 4G', + 13 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NOH|NXT|SNE|TAS|Z100)!!', + 14 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 15 => '(EV|KM)-[ES][0-9]{3,3}!!', + 16 => 'Event', + 17 => 'EVERY35', ), '@EX' => array ( @@ -2160,9 +2334,10 @@ array ( 0 => 'FIH-FB0', 1 => 'FIH-!!', - 2 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 2 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', 3 => 'Find 5', 4 => 'FIND7', + 5 => 'FINNEY U1', ), '@FJ' => array ( @@ -2199,7 +2374,7 @@ 25 => 'Flylife!!', 26 => 'Fly Flylife Web 7.85 Slim', 27 => 'Flyer', - 28 => '(HW-|HUAWEI )?(ATU|DRA|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', + 28 => '(HW-|HUAWEI )?(ATU|DRA|DVC|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', 29 => 'Flair E1', 30 => 'Flair E2', 31 => 'FlairE3', @@ -2241,11 +2416,13 @@ 0 => 'FP1', 1 => 'FP1U', 2 => 'FP2', + 3 => 'FP3', + 4 => 'FP4', ), '@FR' => array ( 0 => 'Freelander I20', - 1 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 1 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', 2 => '(MODECOM )?FreeTAB!!', ), '@FS' => @@ -2254,6 +2431,7 @@ 1 => 'FS407', 2 => 'FS451', 3 => 'FS514', + 4 => 'FS8032', ), '@FT' => array ( @@ -2326,11 +2504,11 @@ ), '@G6' => array ( - 0 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 0 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', ), '@G7' => array ( - 0 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 0 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', ), '@G9' => array ( @@ -2511,7 +2689,8 @@ 11 => 'GM 6', 12 => 'GM 6 d', 13 => 'GM 8 d', - 14 => 'GM Discovery tab 8', + 14 => 'GM8 go', + 15 => 'GM Discovery tab 8', ), '@GN' => array ( @@ -2620,7 +2799,7 @@ array ( 0 => 'Grouper', 1 => 'GR-TB!!', - 2 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 2 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', 3 => 'greenridge', 4 => 'Graphos A10', 5 => '(ZTE )?(Grand|Mimosa)!!', @@ -2629,8 +2808,17 @@ array ( 0 => 'GS01', 1 => '(Gsmart|Gigabyte|Rio)!!', - 2 => 'GS02', - 3 => 'GS03', + 2 => 'GS110', + 3 => 'GS185', + 4 => 'GS190', + 5 => 'GS195', + 6 => 'GS270', + 7 => 'GS270 plus', + 8 => 'GS280', + 9 => 'GS290', + 10 => 'GS370 Plus', + 11 => 'GS02', + 12 => 'GS03', ), '@GT' => array ( @@ -2670,7 +2858,8 @@ ), '@GX' => array ( - 0 => 'GX1210V TV', + 0 => 'GX290', + 1 => 'GX1210V TV', ), '@H1' => array ( @@ -2682,11 +2871,11 @@ ), '@H3' => array ( - 0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 0 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', ), '@H6' => array ( - 0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 0 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', ), '@H7' => array ( @@ -2713,13 +2902,21 @@ 1 => '(Haier[- ])?H[ETW]- ?[A-Z][0-9]!!', 2 => 'Haier-W700', 3 => 'Haier-SY0880', - 4 => 'Hasee E50 S1', - 5 => 'Hasee H45 T2', - 6 => 'Hasee W50 T2', - 7 => 'Hasee-X50TS', - 8 => 'HannsComb', - 9 => 'Hannspadd', - 10 => 'Hayabusa', + 4 => 'Hammer Blade2 PRO', + 5 => 'Hammer Blade 3', + 6 => 'Hammer Energy', + 7 => 'Hammer Energy 2', + 8 => 'Hammer Energy 18x9', + 9 => 'Hammer Explorer', + 10 => 'Hammer Explorer Pro', + 11 => 'Hasee E50 S1', + 12 => 'Hasee H45 T2', + 13 => 'Hasee W50 T2', + 14 => 'Hasee-X50TS', + 15 => 'HannsComb', + 16 => 'Hannspadd', + 17 => 'Hayabusa', + 18 => 'HARRY', ), '@HB' => array ( @@ -2732,9 +2929,9 @@ 0 => 'HD2', 1 => 'HD2 LEO', 2 => 'HD7 Pro', - 3 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', - 4 => 'HD190[01]!', - 5 => 'HD191[03]!', + 3 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 4 => 'HD190[0135]!', + 5 => 'HD191[0137]!', ), '@HE' => array ( @@ -2770,25 +2967,26 @@ '@HL' => array ( 0 => 'HLV-T!!', - 1 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 1 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', ), '@HM' => array ( - 0 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NXT|SNE|TAS|Z100)!!', + 0 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NOH|NXT|SNE|TAS|Z100)!!', 1 => 'HMP8100 ATV 93', 2 => 'HMP8100 ATV INT', 3 => '(Xiaomi )?(Redmi|RedRice|HM)!!', 4 => '(Xiaomi )?(Redmi|HM)[ \\-]?Note!!', 5 => '(Xiaomi |HM)?20!!', + 6 => '(Xiaomi |HM)?21!!', ), '@HN' => array ( - 0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 0 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', ), '@HO' => array ( 0 => 'HOSIN!!', - 1 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 1 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', 2 => 'Honor3c2G-T', 3 => 'Honor Bee', 4 => 'HOMESYNCT2WIFI', @@ -2801,6 +2999,10 @@ 3 => 'HP-TouchPad', 4 => '(HP )?Touchpad!', ), + '@HR' => + array ( + 0 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + ), '@HS' => array ( 0 => 'HS-[0-9]{1,2}DTB!!', @@ -2845,59 +3047,61 @@ 6 => 'Huawei MediaPad T1 10 4G', 7 => '(Huawei )?[MSTX](1|2|7|8|10)\\-[A-Z0-9][0-9]{2,2}!!', 8 => 'HUAWEI GEM-703L', - 9 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NXT|SNE|TAS|Z100)!!', - 10 => '(HW-|HUAWEI )?(ATU|DRA|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', - 11 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 9 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NOH|NXT|SNE|TAS|Z100)!!', + 10 => '(HW-|HUAWEI )?(ATU|DRA|DVC|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', + 11 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', 12 => '(HW-|HUAWEI )?(BLL|CHC|TAG|KII)!!', - 13 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 13 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', 14 => 'HUAWEI A168-(AL10|DL09|L09|L29)!', - 15 => '(HW-|HUAWEI )?(CRO|LUA|CUN|SCC|SCU|CAM|LDN|LYO|MYA)!!', + 15 => '(HW-|HUAWEI )?(AMN|ART|AQM|CRO|LUA|CUN|DUB|SCC|SCU|CAM|LDN|LYO|MED|MYA)!!', 16 => '(HW-|HUAWEI )?CAZ-(AL10|TL10|TL20)!', 17 => '(HW-|HUAWEI )?CAN-(L01|L11|L12)!', 18 => '(HW-|HUAWEI )?MLA-(L01|L03|L11|L12|L13)!', 19 => '(HW-|HUAWEI )?DIG-(AL00|L01|L03|L21|TL10)!', - 20 => '(HW-|HUAWEI )?BAC-(AL00|L03|L21|L22|TL00)!', - 21 => '(HW-|HUAWEI )?HWI-(AL00|TL00)!', - 22 => '(HW-|HUAWEI )?PAR-(AL00|LX1|LX1M|LX9|TL00)!', - 23 => '(HW-|HUAWEI )?INE-(AL00|LX1|LX1r|LX2||LX2r|TL00)!', - 24 => '(HW-|HUAWEI )?MAR-(AL00|LX1A|LX1M|LX2|LX3A|TL00)!', - 25 => '(HW-|HUAWEI )?MLA-(AL00|AL10)!', - 26 => '(HW-|HUAWEI )?MLA-(TL00|TL10|UL00)!', - 27 => 'Huawei P7 mini', - 28 => 'Huawei P8max', - 29 => '(Huawei|Ascend|HW-)!!', - 30 => 'HUAWEI Honor 3c w', - 31 => 'Huawei S7', - 32 => 'Hudl HT7S3', - 33 => 'Hudl 2', - 34 => 'HUAWEI U8686', - 35 => 'Huawei 858', + 20 => '(HW-|HUAWEI )?PIC-(LX9)!', + 21 => '(HW-|HUAWEI )?BAC-(AL00|L03|L21|L22|TL00)!', + 22 => '(HW-|HUAWEI )?HWI-(AL00|TL00)!', + 23 => '(HW-|HUAWEI )?PAR-(AL00|LX1|LX1M|LX9|TL00)!', + 24 => '(HW-|HUAWEI )?INE-(AL00|LX1|LX1r|LX2||LX2r|TL00)!', + 25 => '(HW-|HUAWEI )?MAR-(AL00|LX1A|LX1M|LX2|LX3A|TL00)!', + 26 => '(HW-|HUAWEI )?MLA-(AL00|AL10)!', + 27 => '(HW-|HUAWEI )?MLA-(TL00|TL10|UL00)!', + 28 => 'Huawei P7 mini', + 29 => 'Huawei P8max', + 30 => '(Huawei|Ascend|HW-)!!', + 31 => 'HUAWEI Honor 3c w', + 32 => 'Huawei S7', + 33 => 'Hudl HT7S3', + 34 => 'Hudl 2', + 35 => 'HUAWEI U8686', + 36 => 'Huawei 858', ), '@HW' => array ( - 0 => '(HW-|HUAWEI )?(ATU|DRA|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', - 1 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 0 => '(HW-|HUAWEI )?(ATU|DRA|DVC|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', + 1 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', 2 => '(HW-|HUAWEI )?(BLL|CHC|TAG|KII)!!', - 3 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', - 4 => '(HW-|HUAWEI )?(CRO|LUA|CUN|SCC|SCU|CAM|LDN|LYO|MYA)!!', + 3 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 4 => '(HW-|HUAWEI )?(AMN|ART|AQM|CRO|LUA|CUN|DUB|SCC|SCU|CAM|LDN|LYO|MED|MYA)!!', 5 => '(HW-|HUAWEI )?CAZ-(AL10|TL10|TL20)!', 6 => '(HW-|HUAWEI )?CAN-(L01|L11|L12)!', 7 => '(HW-|HUAWEI )?MLA-(L01|L03|L11|L12|L13)!', 8 => '(HW-|HUAWEI )?DIG-(AL00|L01|L03|L21|TL10)!', - 9 => '(HW-|HUAWEI )?BAC-(AL00|L03|L21|L22|TL00)!', - 10 => '(HW-|HUAWEI )?HWI-(AL00|TL00)!', - 11 => '(HW-|HUAWEI )?PAR-(AL00|LX1|LX1M|LX9|TL00)!', - 12 => '(HW-|HUAWEI )?INE-(AL00|LX1|LX1r|LX2||LX2r|TL00)!', - 13 => '(HW-|HUAWEI )?MAR-(AL00|LX1A|LX1M|LX2|LX3A|TL00)!', - 14 => '(HW-|HUAWEI )?MLA-(AL00|AL10)!', - 15 => '(HW-|HUAWEI )?MLA-(TL00|TL10|UL00)!', - 16 => '(Huawei|Ascend|HW-)!!', - 17 => 'hwu8812D', - 18 => 'HW-01E', - 19 => 'HW-01K', - 20 => 'HW-03E', - 21 => 'HWT31', - 22 => 'HWV32', + 9 => '(HW-|HUAWEI )?PIC-(LX9)!', + 10 => '(HW-|HUAWEI )?BAC-(AL00|L03|L21|L22|TL00)!', + 11 => '(HW-|HUAWEI )?HWI-(AL00|TL00)!', + 12 => '(HW-|HUAWEI )?PAR-(AL00|LX1|LX1M|LX9|TL00)!', + 13 => '(HW-|HUAWEI )?INE-(AL00|LX1|LX1r|LX2||LX2r|TL00)!', + 14 => '(HW-|HUAWEI )?MAR-(AL00|LX1A|LX1M|LX2|LX3A|TL00)!', + 15 => '(HW-|HUAWEI )?MLA-(AL00|AL10)!', + 16 => '(HW-|HUAWEI )?MLA-(TL00|TL10|UL00)!', + 17 => '(Huawei|Ascend|HW-)!!', + 18 => 'hwu8812D', + 19 => 'HW-01E', + 20 => 'HW-01K', + 21 => 'HW-03E', + 22 => 'HWT31', + 23 => 'HWV32', ), '@HY' => array ( @@ -2919,6 +3123,20 @@ 3 => 'i-Call 504', 4 => '(i-mobile|i-style|IQ)!!', ), + '@I0' => + array ( + 0 => 'I01WDX', + 1 => 'I001DC', + 2 => 'I001DE', + 3 => 'I002D', + 4 => 'I003D', + 5 => 'I003DD', + 6 => 'I004D', + 7 => 'I005D', + 8 => 'I005DA', + 9 => 'I006D', + 10 => 'I01WD', + ), '@I1' => array ( 0 => 'I110', @@ -3036,8 +3254,10 @@ 22 => 'INQ Mayfair (EU)', 23 => '(iNote|itel)!!', 24 => 'Infinity', - 25 => 'Internet TV', - 26 => 'Internet TV Box', + 25 => 'IN201[01357]!', + 26 => 'IN202[0135]!', + 27 => 'Internet TV', + 28 => 'Internet TV Box', ), '@IO' => array ( @@ -3064,21 +3284,22 @@ 0 => 'IS11CA', 1 => 'ISW?[0-9]{2,2}F!!', 2 => 'ISW[0-9]{2,2}HT!!', - 3 => 'ISW11K', - 4 => 'IS11LG', - 5 => 'ISW11M', - 6 => 'IS12M', - 7 => 'IS11N', - 8 => 'IS06', - 9 => 'IS11PT', - 10 => 'IS703C', - 11 => 'IS801C', - 12 => 'ISW11SC', - 13 => 'IS0[0-9]!!', - 14 => 'ISW?1[0-9]SH!!', - 15 => 'IS[0-9]{2,2}S!!', - 16 => 'IS04', - 17 => 'IS11T', + 3 => 'IS530', + 4 => 'ISW11K', + 5 => 'IS11LG', + 6 => 'ISW11M', + 7 => 'IS12M', + 8 => 'IS11N', + 9 => 'IS06', + 10 => 'IS11PT', + 11 => 'IS703C', + 12 => 'IS801C', + 13 => 'ISW11SC', + 14 => 'IS0[0-9]!!', + 15 => 'ISW?1[0-9]SH!!', + 16 => 'IS[0-9]{2,2}S!!', + 17 => 'IS04', + 18 => 'IS11T', ), '@IT' => array ( @@ -3094,6 +3315,7 @@ '@IV' => array ( 0 => 'IVIO!!', + 1 => 'IV2201', ), '@IW' => array ( @@ -3107,8 +3329,9 @@ ), '@JA' => array ( - 0 => 'Jaguar3', - 1 => 'Jaguar7', + 0 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 1 => 'Jaguar3', + 2 => 'Jaguar7', ), '@JC' => array ( @@ -3122,6 +3345,10 @@ 1 => 'JDN2-AL00HN', 2 => 'JDN2-W09HN', ), + '@JE' => + array ( + 0 => 'Jelly2', + ), '@JI' => array ( 0 => '(JIAYU|JY)!!', @@ -3133,11 +3360,15 @@ ), '@JK' => array ( - 0 => '(HW-|HUAWEI )?(ATU|DRA|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', + 0 => '(HW-|HUAWEI )?(ATU|DRA|DVC|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', ), '@JM' => array ( - 0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 0 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + ), + '@JN' => + array ( + 0 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', ), '@JO' => array ( @@ -3147,7 +3378,7 @@ ), '@JS' => array ( - 0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 0 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', ), '@JT' => array ( @@ -3215,6 +3446,10 @@ 2 => 'K30-W', 3 => 'K3 Note', ), + '@K6' => + array ( + 0 => 'K6000 Pro', + ), '@K8' => array ( 0 => '(CUBE ?)?(K8|U1|U2|U3|U5|U6|U8|U9)[0-9]?GT!!', @@ -3235,6 +3470,7 @@ '@KB' => array ( 0 => 'KB901', + 1 => 'KB200[01357]!', ), '@KC' => array ( @@ -3268,16 +3504,19 @@ 15 => 'KFDOWI', 16 => 'KFSUWI', 17 => 'KFMAWI', - 18 => 'KFMUWI', + 18 => 'KFKAWI', + 19 => 'KFMUWI', ), '@KI' => array ( 0 => 'Kindle Fire', - 1 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', - 2 => '(HW-|HUAWEI )?(BLL|CHC|TAG|KII)!!', - 3 => 'KIOTO 793', - 4 => 'KITE', - 5 => '(ZTE )?Kis!!', + 1 => 'KINGKONG 5 Pro', + 2 => 'KINGKONG MINI2', + 3 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 4 => '(HW-|HUAWEI )?(BLL|CHC|TAG|KII)!!', + 5 => 'KIOTO 793', + 6 => 'KITE', + 7 => '(ZTE )?Kis!!', ), '@KM' => array ( @@ -3285,19 +3524,20 @@ ), '@KN' => array ( - 0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 0 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', ), '@KO' => array ( 0 => 'Konka Amber3', 1 => 'KOB-(L09|W09)!', - 2 => '(KATBL|Kogan|Agora)!!', - 3 => 'KOMU!!', - 4 => 'KONKA!!', - 5 => 'koobee-T550', - 6 => 'Koobe!!', - 7 => 'KORIDY H15', - 8 => 'KORIDY H16', + 2 => 'KOB2-(W09)!', + 3 => '(KATBL|Kogan|Agora)!!', + 4 => 'KOMU!!', + 5 => 'KONKA!!', + 6 => 'koobee-T550', + 7 => 'Koobe!!', + 8 => 'KORIDY H15', + 9 => 'KORIDY H16', ), '@KP' => array ( @@ -3306,7 +3546,12 @@ ), '@KS' => array ( - 0 => 'KSP8000', + 0 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 1 => 'KSP8000', + ), + '@KT' => + array ( + 0 => 'KT-101-A', ), '@KU' => array ( @@ -3344,35 +3589,37 @@ '@LA' => array ( 0 => 'LA-!!', - 1 => '(Lanix )?(Ilium|llium)!!', - 2 => 'Lark!!', - 3 => 'LAVA iris 351', - 4 => 'LAVA iRIS 504q', - 5 => 'LAVA A1', - 6 => 'Lava A89', - 7 => 'LAVA R1', - 8 => 'LAVA R1s', - 9 => 'LAVA S12', - 10 => 'LAVA V5', - 11 => 'LAP250U', - 12 => 'LAP255U', - 13 => 'LaVieTab!!', - 14 => 'land', - 15 => 'LA-I Dual core', - 16 => 'LA-M3', - 17 => 'LA1-L', - 18 => 'LA2-E', - 19 => 'LA2-E1', - 20 => 'LA2-L', - 21 => 'LA2-T', - 22 => 'LA2-T1', - 23 => 'LA2-S', - 24 => 'LA2-SN', - 25 => 'LA2-W', - 26 => 'LA2-W1', - 27 => 'LA3-W', - 28 => 'LA3S', - 29 => 'LA5-W', + 1 => 'Land Rover Explore', + 2 => 'Land Rover Explore R', + 3 => '(Lanix )?(Ilium|llium)!!', + 4 => 'Lark!!', + 5 => 'LAVA iris 351', + 6 => 'LAVA iRIS 504q', + 7 => 'LAVA A1', + 8 => 'Lava A89', + 9 => 'LAVA R1', + 10 => 'LAVA R1s', + 11 => 'LAVA S12', + 12 => 'LAVA V5', + 13 => 'LAP250U', + 14 => 'LAP255U', + 15 => 'LaVieTab!!', + 16 => 'land', + 17 => 'LA-I Dual core', + 18 => 'LA-M3', + 19 => 'LA1-L', + 20 => 'LA2-E', + 21 => 'LA2-E1', + 22 => 'LA2-L', + 23 => 'LA2-T', + 24 => 'LA2-T1', + 25 => 'LA2-S', + 26 => 'LA2-SN', + 27 => 'LA2-W', + 28 => 'LA2-W1', + 29 => 'LA3-W', + 30 => 'LA3S', + 31 => 'LA5-W', ), '@LC' => array ( @@ -3384,7 +3631,7 @@ ), '@LD' => array ( - 0 => '(HW-|HUAWEI )?(CRO|LUA|CUN|SCC|SCU|CAM|LDN|LYO|MYA)!!', + 0 => '(HW-|HUAWEI )?(AMN|ART|AQM|CRO|LUA|CUN|DUB|SCC|SCU|CAM|LDN|LYO|MED|MYA)!!', 1 => 'LDK-ICK v1.4', ), '@LE' => @@ -3460,52 +3707,84 @@ 68 => 'Lenovo YT3-X50F', 69 => 'Lenovo YT3-X50L', 70 => 'Lenovo YT3-850F', - 71 => 'Lenovo YT-X703F', - 72 => 'Lenovo YT3-X90F', - 73 => 'Lenovo YT3-X90L', - 74 => '(Lenovo )?(Tab ?)?(2 ?)?[AS](7|8|10)!!', - 75 => 'Lenovo TB-7304F', - 76 => 'Lenovo TB-X103F', - 77 => 'Lenovo TB2-X30F', - 78 => 'Lenovo TB2-X30L', - 79 => 'Lenovo TB3-730X', - 80 => 'Lenovo TB3-710F', - 81 => 'Lenovo TB3-710I', - 82 => 'Lenovo TB-7703X', - 83 => 'Lenovo TB3-850F', - 84 => 'Lenovo TB3-850M', - 85 => 'Lenovo TB3-X70F', - 86 => 'Lenovo TB3-X70L', - 87 => 'Lenovo TB-8504F', - 88 => 'Lenovo TB-8703F', - 89 => 'Lenovo TB-8704F', - 90 => 'Lenovo TB-X304F', - 91 => 'Lenovo TB-X704F', - 92 => 'Lenovo TB-X704L', - 93 => '(Lenovo ?)?(IdeaTab ?)?[KSV][0-9]{4,4}!!', - 94 => 'Lenovo Pad A4', - 95 => 'Lenovo', - 96 => 'lepad 001b', - 97 => 'lepad 001n', - 98 => '(Lenovo |Lephone )?3GC101!', - 99 => '(Lenovo |Lephone )?3GW100!', - 100 => '(Lenovo |Lephone )?3GW101!', - 101 => '(Lenovo )?S1[- ]37AH0!', - 102 => '(Lenovo )?S2[- ]38A(H0|T0)!', - 103 => 'Lenovo!!', - 104 => 'LenovoTV 40S9', - 105 => 'LenovoTV 50S52', - 106 => 'Lenovo Z2', - 107 => '(BLF-)?lephone!!', - 108 => 'Le Pan Mini', - 109 => 'Le Pan TC802A', - 110 => 'Le Pan TC1010', - 111 => 'Le Pan TC1020', - 112 => 'LePanII', - 113 => 'Le Pan S', - 114 => 'LENNY', - 115 => 'LENNY2', - 116 => 'LENNY3', + 71 => 'Lenovo YT-J706F', + 72 => 'Lenovo YT-X703F', + 73 => 'Lenovo YT-X705F', + 74 => 'Lenovo YT3-X90F', + 75 => 'Lenovo YT3-X90L', + 76 => '(Lenovo )?(Tab ?)?(2 ?)?[AS](7|8|10)!!', + 77 => 'Lenovo TB-7304F', + 78 => 'Lenovo TB-7305F', + 79 => 'Lenovo TB-7305X', + 80 => 'Lenovo TB-8304F1', + 81 => 'Lenovo TB-8505FS', + 82 => 'Lenovo TB-8704X', + 83 => 'Lenovo TB-8705F', + 84 => 'Lenovo TB-J606F', + 85 => 'Lenovo TB-J606L', + 86 => 'Lenovo TB-J607Z', + 87 => 'Lenovo TB-J616F', + 88 => 'Lenovo TB-J706F', + 89 => 'Lenovo TB-J716F', + 90 => 'Lenovo TB-X104F', + 91 => 'Lenovo TB-X304L', + 92 => 'Lenovo TB-X306F', + 93 => 'Lenovo TB-X306X', + 94 => 'Lenovo TB-X505F', + 95 => 'Lenovo TB-X605F', + 96 => 'Lenovo TB-X605L', + 97 => 'Lenovo TB-X606F', + 98 => 'Lenovo TB-X606X', + 99 => 'Lenovo TB-X6C6F', + 100 => 'Lenovo TB-X103F', + 101 => 'Lenovo TB2-X30F', + 102 => 'Lenovo TB2-X30L', + 103 => 'Lenovo TB3-730X', + 104 => 'Lenovo TB3-710F', + 105 => 'Lenovo TB3-710I', + 106 => 'Lenovo TB-7703X', + 107 => 'Lenovo TB3-850F', + 108 => 'Lenovo TB3-850M', + 109 => 'Lenovo TB3-X70F', + 110 => 'Lenovo TB3-X70L', + 111 => 'Lenovo TB-8504F', + 112 => 'Lenovo TB-8504X', + 113 => 'Lenovo TB-8505F', + 114 => 'Lenovo TB-8703F', + 115 => 'Lenovo TB-8704F', + 116 => 'Lenovo TB-X304F', + 117 => 'Lenovo TB-X704F', + 118 => 'Lenovo TB-X704L', + 119 => 'Lenovo TB-X705F', + 120 => 'Lenovo TB-X705L', + 121 => '(Lenovo ?)?(IdeaTab ?)?[KSV][0-9]{4,4}!!', + 122 => 'Lenovo Pad A4', + 123 => 'Lenovo', + 124 => 'lepad 001b', + 125 => 'lepad 001n', + 126 => '(Lenovo |Lephone )?3GC101!', + 127 => '(Lenovo |Lephone )?3GW100!', + 128 => '(Lenovo |Lephone )?3GW101!', + 129 => '(Lenovo )?S1[- ]37AH0!', + 130 => '(Lenovo )?S2[- ]38A(H0|T0)!', + 131 => 'Lenovo!!', + 132 => 'LenovoTV 40S9', + 133 => 'LenovoTV 50S52', + 134 => 'Lenovo Z2', + 135 => '(BLF-)?lephone!!', + 136 => 'Le Pan Mini', + 137 => 'Le Pan TC802A', + 138 => 'Le Pan TC1010', + 139 => 'Le Pan TC1020', + 140 => 'LePanII', + 141 => 'Le Pan S', + 142 => 'LE2101', + 143 => 'LE211[0135]!', + 144 => 'LE212[01357]!', + 145 => 'LENNY', + 146 => 'LENNY2', + 147 => 'LENNY3', + 148 => 'Lenny4', ), '@LG' => array ( @@ -3583,7 +3862,7 @@ 0 => 'Liquid!!', 1 => '(BLU|DASH|LIFE|NEO|STUDIO|VIVO)!!', 2 => 'Liberty', - 3 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NXT|SNE|TAS|Z100)!!', + 3 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NOH|NXT|SNE|TAS|Z100)!!', 4 => '(MEDION|(MD )?LIFETAB)!!', 5 => 'Life', 6 => 'Liberty Tab G100', @@ -3596,50 +3875,65 @@ ), '@LL' => array ( - 0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 0 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', 1 => '(Lanix )?(Ilium|llium)!!', ), '@LM' => array ( - 0 => 'LM-G710!', - 1 => 'LM-G715!', - 2 => 'LM-G810!', - 3 => 'LM-G820!', - 4 => 'LM-Q610!', - 5 => 'LM-Q617!', - 6 => 'LM-Q710!', - 7 => 'LM-Q720!', - 8 => 'LM-Q725!', - 9 => 'LM-Q815!', - 10 => 'LM-Q850!', - 11 => 'LM-Q910!', - 12 => 'LM-Q925!', - 13 => 'LM-V350!', - 14 => 'LM-V40[59]!', - 15 => 'LM-V450!', - 16 => 'LM-V500!', - 17 => 'LM-X120!', - 18 => 'LM-X210!', - 19 => 'LM-X212!', - 20 => 'LM-X220!', - 21 => 'LM-X320!', - 22 => 'LM-X410!', - 23 => 'LM-X415!', - 24 => 'LM-X420!', - 25 => 'LM-X510!', - 26 => 'LM-X525!', - 27 => 'LM-X625!', - 28 => 'LM-Y110!', + 0 => 'LM-F100!', + 1 => 'LM-G710!', + 2 => 'LM-G715!', + 3 => 'LM-G810!', + 4 => 'LM-G820!', + 5 => 'LM-G850!', + 6 => 'LM-G900!', + 7 => 'LM-G910!', + 8 => 'LM-K200!', + 9 => 'LM-K410!', + 10 => 'LM-K420!', + 11 => 'LM-K510!', + 12 => 'LM-K520!', + 13 => 'LM-Q610!', + 14 => 'LM-Q617!', + 15 => 'LM-Q630!', + 16 => 'LM-Q710!', + 17 => 'LM-Q720!', + 18 => 'LM-Q725!', + 19 => 'LM-Q815!', + 20 => 'LM-Q850!', + 21 => 'LM-Q910!', + 22 => 'LM-Q925!', + 23 => 'LM-V350!', + 24 => 'LM-V40[59]!', + 25 => 'LM-V450!', + 26 => 'LM-V500!', + 27 => 'LM-V510!', + 28 => 'LM-V600!', + 29 => 'LM-X120!', + 30 => 'LM-X210!', + 31 => 'LM-X212!', + 32 => 'LM-X220!', + 33 => 'LM-X320!', + 34 => 'LM-X410!', + 35 => 'LM-X415!', + 36 => 'LM-X420!', + 37 => 'LM-X430!', + 38 => 'LM-X510!', + 39 => 'LM-X520!', + 40 => 'LM-X525!', + 41 => 'LM-X540!', + 42 => 'LM-X625!', + 43 => 'LM-Y110!', ), '@LO' => array ( 0 => 'LogicPD Zoom2', - 1 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NXT|SNE|TAS|Z100)!!', + 1 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NOH|NXT|SNE|TAS|Z100)!!', 2 => 'Loox', ), '@LR' => array ( - 0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 0 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', ), '@LS' => array ( @@ -3695,7 +3989,7 @@ 1 => 'LUXURY 3', 2 => 'LUXURY 4', 3 => 'LUXURY 5', - 4 => '(HW-|HUAWEI )?(CRO|LUA|CUN|SCC|SCU|CAM|LDN|LYO|MYA)!!', + 4 => '(HW-|HUAWEI )?(AMN|ART|AQM|CRO|LUA|CUN|DUB|SCC|SCU|CAM|LDN|LYO|MED|MYA)!!', 5 => 'Lucky Ultra Sonic U8650', 6 => 'LU2300', 7 => 'Lumia800', @@ -3711,8 +4005,8 @@ ), '@LY' => array ( - 0 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NXT|SNE|TAS|Z100)!!', - 1 => '(HW-|HUAWEI )?(CRO|LUA|CUN|SCC|SCU|CAM|LDN|LYO|MYA)!!', + 0 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NOH|NXT|SNE|TAS|Z100)!!', + 1 => '(HW-|HUAWEI )?(AMN|ART|AQM|CRO|LUA|CUN|DUB|SCC|SCU|CAM|LDN|LYO|MED|MYA)!!', 2 => 'LYF LS-4006', 3 => 'LYF LS-5009', ), @@ -3745,21 +4039,61 @@ '@M1' => array ( 0 => 'M19', - 1 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 1 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', 2 => 'M1050S', 3 => 'M1', 4 => 'm1 metal', 5 => 'm1 note', 6 => 'M1001', 7 => 'M12', + 8 => 'M1908C3JGG', ), '@M2' => array ( - 0 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NXT|SNE|TAS|Z100)!!', + 0 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NOH|NXT|SNE|TAS|Z100)!!', 1 => 'M210', 2 => 'm2 note', 3 => 'm2', 4 => 'M2mini', + 5 => 'M2002J9G', + 6 => 'M2003J15SC', + 7 => 'M2004J19C', + 8 => 'M2004J7BC', + 9 => 'M2006C3LG', + 10 => 'M2006C3LVG', + 11 => 'M2006C3MG', + 12 => 'M2006C3MII', + 13 => 'M2006C3MNG', + 14 => 'M2007J17G', + 15 => 'M2007J1SC', + 16 => 'M2007J20CG', + 17 => 'M2007J22G', + 18 => 'M2007J3SG', + 19 => 'M2007J3SY', + 20 => 'M2010J19CG', + 21 => 'M2010J19SG', + 22 => 'M2010J19SY', + 23 => 'M2011K2C', + 24 => 'M2011K2G', + 25 => 'M2012K11AG', + 26 => 'M2012K11AC', + 27 => 'M2012K10C', + 28 => 'M2012K11G', + 29 => 'M2101K6G', + 30 => 'M2101K6P', + 31 => 'M2101K7AG', + 32 => 'M2101K7BG', + 33 => 'M2101K7BNY', + 34 => 'M2101K9AG', + 35 => 'M2101K9C', + 36 => 'M2101K9G', + 37 => 'M2102J20SG', + 38 => 'M2102J20SI', + 39 => 'M2102K1AC', + 40 => 'M2102K1C', + 41 => 'M2102K1G', + 42 => 'M2103K19G', + 43 => 'M2103K19PG', ), '@M3' => array ( @@ -3785,6 +4119,8 @@ 2 => 'M470BSE', 3 => 'M4', 4 => 'M4(TEL)? SS[0-9]{3,4}!!', + 5 => 'M40 EEA', + 6 => 'M40(N9H3)', ), '@M5' => array ( @@ -3843,20 +4179,21 @@ 2 => 'manta', 3 => '(bq|Aquaris|Edison|Maxwell)!!', 4 => '(DNS )?(Airtab )?(E|ES|M|MA|MC|MF|MW|P|PC|PF)[0-9]{2,4}!!', - 5 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NXT|SNE|TAS|Z100)!!', - 6 => '(HW-|HUAWEI )?MAR-(AL00|LX1A|LX1M|LX2|LX3A|TL00)!', - 7 => 'MAX FIND 5.0', - 8 => 'Malata!!', - 9 => 'Masstel!!', - 10 => 'MASTONE!!', - 11 => 'Maxtron!!', - 12 => 'magi', - 13 => 'MagicBox', - 14 => '(Xiaomi )?(MI )?MAX$!', - 15 => '(Xiaomi )?(MI )?MAX 2$!', - 16 => '(Xiaomi )?(MI )?MAX 3$!', - 17 => 'markf', - 18 => 'markw', + 5 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NOH|NXT|SNE|TAS|Z100)!!', + 6 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 7 => '(HW-|HUAWEI )?MAR-(AL00|LX1A|LX1M|LX2|LX3A|TL00)!', + 8 => 'MAX FIND 5.0', + 9 => 'Malata!!', + 10 => 'Masstel!!', + 11 => 'MASTONE!!', + 12 => 'Maxtron!!', + 13 => 'magi', + 14 => 'MagicBox', + 15 => '(Xiaomi )?(MI )?MAX$!', + 16 => '(Xiaomi )?(MI )?MAX 2$!', + 17 => '(Xiaomi )?(MI )?MAX 3$!', + 18 => 'markf', + 19 => 'markw', ), '@MB' => array ( @@ -3871,9 +4208,10 @@ array ( 0 => 'MC002', 1 => '(DNS )?(Airtab )?(E|ES|M|MA|MC|MF|MW|P|PC|PF)[0-9]{2,4}!!', - 2 => 'MC32N0', - 3 => 'MC40N0', - 4 => 'MC67NA', + 2 => 'MC401 GWL', + 3 => 'MC32N0', + 4 => 'MC40N0', + 5 => 'MC67NA', ), '@MD' => array ( @@ -3898,27 +4236,28 @@ 13 => 'ME581CL', 14 => 'MeMO Pad 7', 15 => 'MediaPad!!', - 16 => 'Mediacom 810C', - 17 => '(MEDION|(MD )?LIFETAB)!!', - 18 => 'MEEG!!', - 19 => 'MEIZU E3', - 20 => 'meizu m1note', - 21 => 'MEIZU M5', - 22 => 'MEIZU M9', - 23 => 'MEIZU MX', - 24 => 'Meizu S6', - 25 => '(MEO )?Smart A!!', - 26 => 'MEU AN!!', - 27 => 'ME[0-9]{3,3}!!', - 28 => 'MEM02', - 29 => 'MegaFon SP-AI', - 30 => 'MegaFon SP-A3', - 31 => 'MegaFon SP-A5', - 32 => 'MegaFon SP-A10', - 33 => 'MegaFon V9', - 34 => 'MegaFon V9+', - 35 => 'MegaFon SIM+', - 36 => 'MegaFon Login 3', + 16 => '(HW-|HUAWEI )?(AMN|ART|AQM|CRO|LUA|CUN|DUB|SCC|SCU|CAM|LDN|LYO|MED|MYA)!!', + 17 => 'Mediacom 810C', + 18 => '(MEDION|(MD )?LIFETAB)!!', + 19 => 'MEEG!!', + 20 => 'MEIZU E3', + 21 => 'meizu m1note', + 22 => 'MEIZU M5', + 23 => 'MEIZU M9', + 24 => 'MEIZU MX', + 25 => 'Meizu S6', + 26 => '(MEO )?Smart A!!', + 27 => 'MEU AN!!', + 28 => 'ME[0-9]{3,3}!!', + 29 => 'MEM02', + 30 => 'MegaFon SP-AI', + 31 => 'MegaFon SP-A3', + 32 => 'MegaFon SP-A5', + 33 => 'MegaFon SP-A10', + 34 => 'MegaFon V9', + 35 => 'MegaFon V9+', + 36 => 'MegaFon SIM+', + 37 => 'MegaFon Login 3', ), '@MF' => array ( @@ -3930,7 +4269,7 @@ '@MH' => array ( 0 => 'MH350', - 1 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NXT|SNE|TAS|Z100)!!', + 1 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NOH|NXT|SNE|TAS|Z100)!!', ), '@MI' => array ( @@ -3974,21 +4313,38 @@ 37 => 'MI 8 SE', 38 => 'MI 8 UD', 39 => 'MI 8 Lite', - 40 => 'MI 9', - 41 => 'Mi 9T Pro', - 42 => 'Mi9 Pro 5G', - 43 => '(Xiaomi|Xiaomi Mi|MI) Note!!', - 44 => '(Xiaomi )?(MI )?MAX$!', - 45 => '(Xiaomi )?(MI )?MAX 2$!', - 46 => '(Xiaomi )?(MI )?MAX 3$!', - 47 => '(Xiaomi )?(MI )?MIX$!', - 48 => '(Xiaomi )?(MI )?MIX 2$!', - 49 => '(Xiaomi )?(MI )?MIX 2S$!', - 50 => 'mido', - 51 => '(Xiaomi|Xiaomi Mi|MI) Pad!!', - 52 => '(Xiaomi|Xiaomi Mi|MI)Box!!', - 53 => '(Xiaomi|Xiaomi Mi|MI)TV!!', - 54 => '(ZTE )?(Grand|Mimosa)!!', + 40 => 'MI 8 Pro', + 41 => 'MI 9', + 42 => 'Mi 9 Lite', + 43 => 'Mi9 Pro 5G', + 44 => 'Mi 9 SE', + 45 => 'Mi 9T', + 46 => 'Mi 9T Pro', + 47 => 'Mi 10', + 48 => 'Mi 10 Pro', + 49 => 'Mi 10 Lite 5G', + 50 => 'Mi 10T Lite', + 51 => 'Mi 11', + 52 => 'Mi 11 Lite 5G', + 53 => 'Mi Note 10', + 54 => 'Mi Note 10 Lite', + 55 => 'Mi Note 10 Pro', + 56 => '(Xiaomi|Xiaomi Mi|MI) Note!!', + 57 => '(Xiaomi )?(MI )?MAX$!', + 58 => '(Xiaomi )?(MI )?MAX 2$!', + 59 => '(Xiaomi )?(MI )?MAX 3$!', + 60 => '(Xiaomi )?(MI )?MIX$!', + 61 => '(Xiaomi )?(MI )?MIX 2$!', + 62 => '(Xiaomi )?(MI )?MIX 2S$!', + 63 => 'MIX 3', + 64 => 'Mi MIX 3', + 65 => 'Mi MIX 3 5G', + 66 => 'MI PLAY', + 67 => 'mido', + 68 => '(Xiaomi|Xiaomi Mi|MI) Pad!!', + 69 => '(Xiaomi|Xiaomi Mi|MI)Box!!', + 70 => '(Xiaomi|Xiaomi Mi|MI)TV!!', + 71 => '(ZTE )?(Grand|Mimosa)!!', ), '@MK' => array ( @@ -4032,79 +4388,126 @@ 14 => 'moii!!', 15 => 'MORAL N01', 16 => 'motorola one', - 17 => 'motorola one action', - 18 => 'motorola one macro', - 19 => 'motorola one power', - 20 => 'motorola one vision', - 21 => 'motorola one zoom', - 22 => 'Moto Droid', - 23 => 'Motorola Pro XT610', - 24 => 'Motorola Milestone MAXX', - 25 => 'Motorola Backflip Me600', - 26 => 'Moto ME860', - 27 => 'Moto C', - 28 => 'Moto C Plus', - 29 => '(Moto)?E2$!', - 30 => '(Moto)?E2\\(4G-LTE\\)$!', - 31 => 'Motorola MotoE2!', - 32 => 'Moto E4', - 33 => 'Moto E (4)', - 34 => 'Moto E (4) Plus', - 35 => 'moto e5 cruise', - 36 => 'moto e5 play', - 37 => '(Moto)?G3$!', - 38 => '(Moto)?G3-TE$!', - 39 => 'Moto G 2015', - 40 => 'Moto G (2015)', - 41 => 'Moto G (2014', - 42 => 'MOTOROLA MOTOG', - 43 => 'Moto G Play', - 44 => 'Moto G Turbo', - 45 => 'Moto G4', - 46 => 'Moto G (4', - 47 => 'Moto G (4)', - 48 => 'Moto G4 Plus', - 49 => 'Moto G 5', - 50 => 'Moto G (5', - 51 => 'Moto G (5)', - 52 => 'Moto G (5) Plus', - 53 => 'Moto G (5S', - 54 => 'Moto G (5S)', - 55 => 'Moto G (5S) Plus', - 56 => 'moto g(6', - 57 => 'moto g(6)', - 58 => 'moto g(6) (XT1925DL)', - 59 => 'moto g(6) forge', - 60 => 'moto g(6) play', - 61 => 'moto g(6) plus', - 62 => 'moto g(7', - 63 => 'moto g(7)', - 64 => 'moto g(7) optimo (XT1952DL)', - 65 => 'moto g(7) play', - 66 => 'moto g(7) plus', - 67 => 'moto g(7) power', - 68 => 'moto g(7) supra', - 69 => 'moto g(8', - 70 => 'Moto Z (2)', - 71 => 'Moto Z2 Play', - 72 => 'Moto X Pro', - 73 => 'moto x4', - 74 => 'Moto Backflip', - 75 => 'MOTOROLA XOOM MZ606', - 76 => 'MOTOROLA RAZR', - 77 => 'MOTWX435KT', - 78 => '(PLOYER-)?MOMO!!', - 79 => 'MOB-5045', - 80 => 'Mobii 7', - 81 => 'MoFing', - 82 => 'mocha', - 83 => 'MO-01J', - 84 => 'MO-01K', - 85 => 'Movistar Express', - 86 => 'Movistar Link', - 87 => 'Movistar Motion', - 88 => 'Movistar Prime', - 89 => 'MOVE', + 17 => 'motorola one 5G ace', + 18 => 'motorola one action', + 19 => 'motorola one fusion+', + 20 => 'motorola one hyper', + 21 => 'motorola one macro', + 22 => 'motorola one power', + 23 => 'motorola one vision', + 24 => 'motorola one zoom', + 25 => 'motorola edge', + 26 => 'motorola edge plus', + 27 => 'motorola edge 20', + 28 => 'motorola edge 20 lite', + 29 => 'motorola edge 20 pro', + 30 => 'motorola edge 30 pro', + 31 => 'Moto Droid', + 32 => 'Motorola Pro XT610', + 33 => 'Motorola Milestone MAXX', + 34 => 'Motorola Backflip Me600', + 35 => 'Moto ME860', + 36 => 'Moto C', + 37 => 'Moto C Plus', + 38 => '(Moto)?E2$!', + 39 => '(Moto)?E2\\(4G-LTE\\)$!', + 40 => 'Motorola MotoE2!', + 41 => 'Moto E4', + 42 => 'Moto E (4)', + 43 => 'Moto E (4) Plus', + 44 => 'moto e5', + 45 => 'moto e5 cruise', + 46 => 'moto e5 play', + 47 => 'moto e5 plus', + 48 => 'moto e(6i)', + 49 => 'moto e6s', + 50 => 'moto e6 play', + 51 => 'moto e(6) plus', + 52 => 'moto e(7)', + 53 => 'moto e(7) plus', + 54 => 'moto e(7) power', + 55 => 'moto e(7i) power', + 56 => 'moto e20', + 57 => 'moto e30', + 58 => 'moto e40', + 59 => '(Moto)?G3$!', + 60 => '(Moto)?G3-TE$!', + 61 => 'Moto G 2015', + 62 => 'Moto G (2015)', + 63 => 'Moto G (2014', + 64 => 'MOTOROLA MOTOG', + 65 => 'Moto G Play', + 66 => 'moto g power', + 67 => 'Moto G Turbo', + 68 => 'moto g 5G', + 69 => 'moto g 5G plus', + 70 => 'moto g pro', + 71 => 'Moto G4', + 72 => 'Moto G (4', + 73 => 'Moto G (4)', + 74 => 'Moto G4 Plus', + 75 => 'Moto G 5', + 76 => 'Moto G (5', + 77 => 'Moto G (5)', + 78 => 'Moto G (5) Plus', + 79 => 'Moto G (5S', + 80 => 'Moto G (5S)', + 81 => 'Moto G (5S) Plus', + 82 => 'Moto G (5S) Plus (XT1805)', + 83 => 'moto g(6', + 84 => 'moto g(6)', + 85 => 'moto g(6) (XT1925DL)', + 86 => 'moto g(6) forge', + 87 => 'moto g(6) play', + 88 => 'moto g(6) plus', + 89 => 'moto g(7', + 90 => 'moto g(7)', + 91 => 'moto g(7) optimo (XT1952DL)', + 92 => 'moto g(7) play', + 93 => 'moto g(7) plus', + 94 => 'moto g(7) power', + 95 => 'moto g(7) supra', + 96 => 'moto g(8', + 97 => 'moto g(8)', + 98 => 'moto g(8) plus', + 99 => 'moto g(8) power', + 100 => 'moto g(8) power lite', + 101 => 'moto g(9) play', + 102 => 'moto g(9) plus', + 103 => 'moto g(9) power', + 104 => 'moto g(10)', + 105 => 'moto g(20)', + 106 => 'moto g(30)', + 107 => 'moto g31(w)', + 108 => 'moto g(50)', + 109 => 'moto g51 5G', + 110 => 'moto g(60)', + 111 => 'moto g(60)s', + 112 => 'moto g(100)', + 113 => 'moto g200 5G', + 114 => 'Moto Z (2)', + 115 => 'Moto Z2 Play', + 116 => 'Moto Z3 Play', + 117 => 'Moto X Pro', + 118 => 'moto x4', + 119 => 'moto z4', + 120 => 'Moto Backflip', + 121 => 'motorola razr 5G', + 122 => 'MOTOROLA XOOM MZ606', + 123 => 'MOTOROLA RAZR', + 124 => 'MOTWX435KT', + 125 => '(PLOYER-)?MOMO!!', + 126 => 'MOB-5045', + 127 => 'Mobii 7', + 128 => 'MoFing', + 129 => 'mocha', + 130 => 'MO-01J', + 131 => 'MO-01K', + 132 => 'Movistar Express', + 133 => 'Movistar Link', + 134 => 'Movistar Motion', + 135 => 'Movistar Prime', + 136 => 'MOVE', ), '@MP' => array ( @@ -4130,7 +4533,7 @@ ), '@MR' => array ( - 0 => '(HW-|HUAWEI )?(ATU|DRA|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', + 0 => '(HW-|HUAWEI )?(ATU|DRA|DVC|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', ), '@MS' => array ( @@ -4188,7 +4591,7 @@ 28 => 'mt8580!', 29 => 'mt8658!', 30 => '(AC|BC|LC|MT|RC|QS|VM|TS|OC)[0-9]{4,4}[A-Z]!!', - 31 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NXT|SNE|TAS|Z100)!!', + 31 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NOH|NXT|SNE|TAS|Z100)!!', 32 => 'MTC Android', 33 => 'MT791', 34 => 'MT70[0-9]{2,2}!!', @@ -4242,7 +4645,7 @@ ), '@MY' => array ( - 0 => '(HW-|HUAWEI )?(CRO|LUA|CUN|SCC|SCU|CAM|LDN|LYO|MYA)!!', + 0 => '(HW-|HUAWEI )?(AMN|ART|AQM|CRO|LUA|CUN|DUB|SCC|SCU|CAM|LDN|LYO|MED|MYA)!!', 1 => 'MyPhone A818g Duo', 2 => 'MyPhone A818 Slim Duo', 3 => 'MyPhone A848 Duo', @@ -4399,7 +4802,7 @@ ), '@NC' => array ( - 0 => '(HW-|HUAWEI )?(ATU|DRA|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', + 0 => '(HW-|HUAWEI )?(ATU|DRA|DVC|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', ), '@NE' => array ( @@ -4436,7 +4839,7 @@ 30 => '(BLU|DASH|LIFE|NEO|STUDIO|VIVO)!!', 31 => 'NexusHD2', 32 => 'Nexus HD2', - 33 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 33 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', 34 => 'Neon7', 35 => 'Neon9', 36 => '(NetTab|NT-)!!', @@ -4486,9 +4889,10 @@ 80 => 'Next9P', 81 => 'Next10P12', 82 => 'NEXT', - 83 => 'New Andromax-i', - 84 => 'Neo V', - 85 => 'NEBULA6.9', + 83 => 'NE2213', + 84 => 'New Andromax-i', + 85 => 'Neo V', + 86 => 'NEBULA6.9', ), '@NG' => array ( @@ -4527,7 +4931,7 @@ ), '@NM' => array ( - 0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 0 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', 1 => '(NMP|MBR|XDK|XDS|XMP)\\-!!', ), '@NO' => @@ -4583,46 +4987,51 @@ 48 => 'Nook HD', 49 => 'Nook HD+', 50 => 'Novapad!!', - 51 => 'Nova!!', - 52 => 'Now', - 53 => 'NO1 S6', - 54 => 'NOAIN!!', - 55 => 'Nokia 1 Plus', - 56 => 'Nokia 1', - 57 => 'Nokia 2.1', - 58 => 'Nokia 2', - 59 => 'Nokia 3.1 Plus', - 60 => 'Nokia 3.1', - 61 => 'Nokia 4.2', - 62 => 'Nokia 5.1 Plus', - 63 => 'Nokia 5.1', - 64 => 'Nokia 6.1 Plus', - 65 => 'Nokia 6.1', - 66 => 'Nokia 6.2', - 67 => 'Nokia 6', - 68 => 'Nokia 7.1', - 69 => 'Nokia 7 Plus', - 70 => 'Nokia 8.1', - 71 => 'Nokia 8 Sirocco', - 72 => 'Nokia 8', - 73 => 'Nokia 9', - 74 => 'Nokia 10.1', - 75 => 'Nokia N9', - 76 => 'Nokia N900', - 77 => 'Nokia X', - 78 => 'Nokia X Dual SIM', - 79 => 'Nokia X+', - 80 => 'Nokia Xplus', - 81 => 'Nokia XL 4G', - 82 => 'Nokia XL', - 83 => 'Nokia XL Dual SIM', - 84 => 'Nokia X2', - 85 => 'NokiaX2DS', - 86 => 'Notion Ink ADAM', - 87 => 'Note III', - 88 => 'Nozomi', - 89 => 'Noble TAB07-485', - 90 => '(QMobile|QTab|Q-Smart|Noir)!!', + 51 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NOH|NXT|SNE|TAS|Z100)!!', + 52 => 'Nova!!', + 53 => 'Now', + 54 => 'NO1 S6', + 55 => 'NOAIN!!', + 56 => 'Nokia 1 Plus', + 57 => 'Nokia 1', + 58 => 'Nokia 2.1', + 59 => 'Nokia 2', + 60 => 'Nokia 3.1 Plus', + 61 => 'Nokia 3.1', + 62 => 'Nokia 4.2', + 63 => 'Nokia 5.1 Plus', + 64 => 'Nokia 5.1', + 65 => 'Nokia 6.1 Plus', + 66 => 'Nokia 6.1', + 67 => 'Nokia 6.2', + 68 => 'Nokia 6', + 69 => 'Nokia 7.1', + 70 => 'Nokia 7 Plus', + 71 => 'Nokia 8.1', + 72 => 'Nokia 8 Sirocco', + 73 => 'Nokia 8', + 74 => 'Nokia 9', + 75 => 'Nokia 10.1', + 76 => 'Nokia N9', + 77 => 'Nokia N900', + 78 => 'Nokia X', + 79 => 'Nokia X Dual SIM', + 80 => 'Nokia X+', + 81 => 'Nokia Xplus', + 82 => 'Nokia XL 4G', + 83 => 'Nokia XL', + 84 => 'Nokia XL Dual SIM', + 85 => 'Nokia X2', + 86 => 'NokiaX2DS', + 87 => 'Notion Ink ADAM', + 88 => 'Note III', + 89 => 'Nozomi', + 90 => 'Note 7P', + 91 => 'Note 8P', + 92 => 'Note 9P', + 93 => 'Note 11P', + 94 => 'Noble TAB07-485', + 95 => '(QMobile|QTab|Q-Smart|Noir)!!', ), '@NP' => array ( @@ -4638,7 +5047,8 @@ ), '@NT' => array ( - 0 => '(NetTab|NT-)!!', + 0 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 1 => '(NetTab|NT-)!!', ), '@NU' => array ( @@ -4656,7 +5066,7 @@ ), '@NX' => array ( - 0 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NXT|SNE|TAS|Z100)!!', + 0 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NOH|NXT|SNE|TAS|Z100)!!', 1 => '(Nexian )?NX-A[0-9]{3,3}!!', 2 => 'NXA8QC116', 3 => 'NX16A8116K', @@ -4871,37 +5281,40 @@ 121 => 'One V', 122 => 'One', 123 => 'One M7', - 124 => 'one m8', - 125 => 'One A0001', - 126 => 'OnePlus One', - 127 => 'OnePlus One A0001', - 128 => 'ONE A2001', - 129 => 'ONE A2003', - 130 => 'ONE A2005', - 131 => 'OnePlus2', - 132 => 'ONE A3000', - 133 => 'ONE A3003', - 134 => 'ONEPLUS A3000', - 135 => 'ONEPLUS A3003', - 136 => 'OnePlus3', - 137 => 'ONEPLUS A3010', - 138 => 'ONEPLUS A5000', - 139 => 'ONEPLUS A5010', - 140 => 'ONEPLUS A6000', - 141 => 'ONEPLUS A6003', - 142 => 'ONEPLUS A6010', - 143 => 'ONEPLUS A6013', - 144 => 'ONE E1000', - 145 => 'ONE E1001', - 146 => 'ONE E1003', - 147 => 'ONE E1005', - 148 => 'ONDA MID', - 149 => 'ONDA A9 Core4', - 150 => 'ONDA VI10', - 151 => 'Onda V812', - 152 => 'ONDA v975m', - 153 => 'ONDA V989', - 154 => 'ONDA V989 Core8', + 124 => 'One Max', + 125 => 'one m8', + 126 => 'One A0001', + 127 => 'OnePlus One', + 128 => 'OnePlus One A0001', + 129 => 'ONE A2001', + 130 => 'ONE A2003', + 131 => 'ONE A2005', + 132 => 'OnePlus2', + 133 => 'ONE A3000', + 134 => 'ONE A3003', + 135 => 'ONEPLUS A3000', + 136 => 'ONEPLUS A3003', + 137 => 'OnePlus3', + 138 => 'ONEPLUS A3010', + 139 => 'ONEPLUS A5000', + 140 => 'ONEPLUS A5010', + 141 => 'ONEPLUS A6000', + 142 => 'ONEPLUS A6003', + 143 => 'ONEPLUS A6010', + 144 => 'ONEPLUS A6013', + 145 => 'OnePlus 7T Pro', + 146 => 'ONE E1000', + 147 => 'ONE E1001', + 148 => 'ONE E1003', + 149 => 'ONE E1005', + 150 => 'oneplus Nord 2 5G', + 151 => 'ONDA MID', + 152 => 'ONDA A9 Core4', + 153 => 'ONDA VI10', + 154 => 'Onda V812', + 155 => 'ONDA v975m', + 156 => 'ONDA V989', + 157 => 'ONDA V989 Core8', ), '@OP' => array ( @@ -5063,10 +5476,11 @@ '@OV' => array ( 0 => '(OV-|Overmax|Vertis)!!', + 1 => 'OV10274G', ), '@OX' => array ( - 0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 0 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', ), '@OY' => array ( @@ -5097,20 +5511,23 @@ 0 => 'P001', 1 => 'P001 2', 2 => 'P002', - 3 => 'P00C', - 4 => 'P00I', - 5 => 'P01M', - 6 => 'P01MA', - 7 => 'P01T', - 8 => 'P01T 1', - 9 => 'P01V', - 10 => 'P01W', - 11 => 'P01Y', - 12 => 'P01Z', - 13 => 'P021', - 14 => 'P022', - 15 => 'P023', - 16 => 'P024', + 3 => 'P00A', + 4 => 'P00C', + 5 => 'P00I', + 6 => 'P01M', + 7 => 'P01MA', + 8 => 'P01T', + 9 => 'P01T 1', + 10 => 'P01V', + 11 => 'P01W', + 12 => 'P01Y', + 13 => 'P01Z', + 14 => 'P021', + 15 => 'P022', + 16 => 'P023', + 17 => 'P024', + 18 => 'P027', + 19 => 'P028', ), '@P1' => array ( @@ -5118,20 +5535,24 @@ 1 => 'P105', 2 => 'P1m', 3 => 'P1ma40', - 4 => 'P1050X', - 5 => 'P10HD??(E6NA)', - 6 => 'P11HD', - 7 => 'P11HD四核(G9X6)', - 8 => 'P11HD??(G9X6)', - 9 => 'P11HD四核(G9X7)', - 10 => 'P19HD(E1K3)', - 11 => 'P19HD(E1K5)', + 4 => 'P1035X', + 5 => 'P1050X', + 6 => 'P1060X', + 7 => 'P1061X', + 8 => 'P10HD??(E6NA)', + 9 => 'P11HD', + 10 => 'P11HD四核(G9X6)', + 11 => 'P11HD??(G9X6)', + 12 => 'P11HD四核(G9X7)', + 13 => 'P19HD(E1K3)', + 14 => 'P19HD(E1K5)', ), '@P2' => array ( 0 => 'P2A700', 1 => 'P2Lite', - 2 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 2 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 3 => 'P20HD EEA', ), '@P3' => array ( @@ -5160,11 +5581,11 @@ 2 => 'P6 Pro', 3 => 'P6 Qmax', 4 => 'P6 Quad', - 5 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 5 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', ), '@P7' => array ( - 0 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 0 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', 1 => 'P700i', 2 => 'P701', 3 => 'P7', @@ -5230,23 +5651,24 @@ ), '@P9' => array ( - 0 => 'P940', - 1 => 'P990', - 2 => 'P90(H3U6)', - 3 => 'P90(H3U7)', - 4 => 'P98(F2K9)', - 5 => 'P98 八核(B9A3)', - 6 => 'P98 3Gk8(A4HY)', - 7 => 'P98 3G??(A4HY)', - 8 => 'P98 3G(M1Q2)', - 9 => 'P98 3G八核(A3HY)', - 10 => 'P98 3G八核(A4HY)', - 11 => 'P98 4G??(A8H6)', - 12 => 'P98 Air?? (C6V8)', - 13 => 'P98Air(C6V8)', - 14 => 'P98HD(A2Q6)', - 15 => 'P98HD+M6', - 16 => 'P98T(K3C4)', + 0 => 'P9 Energy', + 1 => 'P940', + 2 => 'P990', + 3 => 'P90(H3U6)', + 4 => 'P90(H3U7)', + 5 => 'P98(F2K9)', + 6 => 'P98 八核(B9A3)', + 7 => 'P98 3Gk8(A4HY)', + 8 => 'P98 3G??(A4HY)', + 9 => 'P98 3G(M1Q2)', + 10 => 'P98 3G八核(A3HY)', + 11 => 'P98 3G八核(A4HY)', + 12 => 'P98 4G??(A8H6)', + 13 => 'P98 Air?? (C6V8)', + 14 => 'P98Air(C6V8)', + 15 => 'P98HD(A2Q6)', + 16 => 'P98HD+M6', + 17 => 'P98T(K3C4)', ), '@PA' => array ( @@ -5307,7 +5729,7 @@ 1 => '(DNS )?(Airtab )?(E|ES|M|MA|MC|MF|MW|P|PC|PF)[0-9]{2,4}!!', 2 => '(HTC|PCD|USCC)?ADR[0-9]{4,4}!!', 3 => 'PC36100!', - 4 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 4 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', 5 => 'PC-TE307N1W', 6 => 'PC-TE508BAW', 7 => 'PC-TS508FAM', @@ -5325,7 +5747,7 @@ ), '@PE' => array ( - 0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 0 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', 1 => 'PEDI', 2 => 'Penta!!', 3 => 'Pentagram!!', @@ -5423,35 +5845,42 @@ 8 => 'Pixel 3a', 9 => 'Pixel 3a XL', 10 => 'Pixel 4', - 11 => 'Pixel 4 XL', - 12 => '(Axioo[\\- ])?PICO!!', - 13 => 'picoBit-L', - 14 => '(GIO-)?(GiONEE[- ])?Pioneer P1!', - 15 => '(GIO-)?(GiONEE[- ])?Pioneer P2!', - 16 => '(GIO-)?(GiONEE[- ])?Pioneer P3!', - 17 => '(GIO-)?(GiONEE[- ])?Pioneer P4!', - 18 => 'PixelV1', - 19 => 'Pixel V2', - 20 => 'Pixel V2+', - 21 => 'PI2000', - 22 => 'PI2010', - 23 => 'PI2011', - 24 => 'PI3100', - 25 => 'PI3100-93', - 26 => 'PI3100Z3 93', - 27 => 'PI3105', - 28 => 'PI3106', - 29 => 'PI3110', - 30 => 'PI3205G', - 31 => 'PI3210G', - 32 => 'PI3900', - 33 => 'PI3900-93', - 34 => 'PI3910', - 35 => 'PI4010G', - 36 => 'PI7000', - 37 => 'PI7100 93', - 38 => '(PNR-)?Pioneer!!', - 39 => 'PIRANHA!!', + 11 => 'Pixel 4a', + 12 => 'Pixel 4a (5G)', + 13 => 'Pixel 4 XL', + 14 => 'Pixel 5', + 15 => 'Pixel 5a', + 16 => 'Pixel 6', + 17 => 'Pixel 6 Pro', + 18 => '(Axioo[\\- ])?PICO!!', + 19 => 'picoBit-L', + 20 => '(GIO-)?(GiONEE[- ])?Pioneer P1!', + 21 => '(GIO-)?(GiONEE[- ])?Pioneer P2!', + 22 => '(GIO-)?(GiONEE[- ])?Pioneer P3!', + 23 => '(GIO-)?(GiONEE[- ])?Pioneer P4!', + 24 => '(HW-|HUAWEI )?PIC-(LX9)!', + 25 => 'PixelV1', + 26 => 'Pixel V2', + 27 => 'Pixel V2+', + 28 => 'PI2000', + 29 => 'PI2010', + 30 => 'PI2011', + 31 => 'PI3100', + 32 => 'PI3100-93', + 33 => 'PI3100Z3 93', + 34 => 'PI3105', + 35 => 'PI3106', + 36 => 'PI3110', + 37 => 'PI3205G', + 38 => 'PI3210G', + 39 => 'PI3900', + 40 => 'PI3900-93', + 41 => 'PI3910', + 42 => 'PI4010G', + 43 => 'PI7000', + 44 => 'PI7100 93', + 45 => '(PNR-)?Pioneer!!', + 46 => 'PIRANHA!!', ), '@PJ' => array ( @@ -5462,7 +5891,7 @@ array ( 0 => 'PLE-701L', 1 => 'PLE-703L', - 2 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 2 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', 3 => 'Planet II v2', 4 => 'PLANET', 5 => 'Playboy PB-S3', @@ -5495,7 +5924,7 @@ '@PO' => array ( 0 => '(Highscreen|Alpha|Bay|Boost|Cosmo|Explosion|Power|Prime|Zera)!!', - 1 => '(HW-|HUAWEI )?(ATU|DRA|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', + 1 => '(HW-|HUAWEI )?(ATU|DRA|DVC|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', 2 => 'PocketBook A7', 3 => 'PocketBook A10', 4 => 'PocketBook A10 3G', @@ -5578,18 +6007,25 @@ 81 => 'Positivo S550', 82 => 'Positivo X400', 83 => 'Positivo X800', - 84 => 'POCOPHONE F1', + 84 => 'Power Armor 13', + 85 => 'POCOPHONE F1', + 86 => 'POCO F1', + 87 => 'POCO F2 Pro', + 88 => 'POCO X2', + 89 => 'POCO X3 NFC', + 90 => 'POCO X3 Pro', ), '@PP' => array ( - 0 => 'PP4MT-7', - 1 => 'PP4MT-9', + 0 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 1 => 'PP4MT-7', + 2 => 'PP4MT-9', ), '@PR' => array ( 0 => 'Project Tango Tablet Development Kit', 1 => '(Highscreen|Alpha|Bay|Boost|Cosmo|Explosion|Power|Prime|Zera)!!', - 2 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 2 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', 3 => 'Pro 10 dual core', 4 => 'Prada 3.0', 5 => 'PRO 5', @@ -6017,6 +6453,13 @@ 8 => '(Xiaomi )?(Redmi|HM)[ \\-]?Note!!', 9 => 'REVVLPLUS C3701A', ), + '@RG' => + array ( + 0 => 'RG650', + 1 => 'RG655', + 2 => 'RG725', + 3 => 'RG850', + ), '@RH' => array ( 0 => '(?:RIVO )?RHYTHM RX ?([0-9]+)!', @@ -6028,7 +6471,7 @@ 2 => 'Rikomagic MK802III', 3 => 'Rikomagic MK802IIIS', 4 => '(Gsmart|Gigabyte|Rio)!!', - 5 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 5 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', 6 => 'Rise', 7 => '(Ritmix )?RM[DP]-?[0-9]{3,3}!!', 8 => 'RIDGE', @@ -6075,10 +6518,37 @@ 2 => 'RM-1061', 3 => '(Ritmix )?RM[DP]-?[0-9]{3,3}!!', 4 => 'RMD-[0-9]{2,3}G!!', + 5 => 'RMX1911', + 6 => 'RMX1931', + 7 => 'RMX1971', + 8 => 'RMX1993', + 9 => 'RMX2001', + 10 => 'RMX2002', + 11 => 'RMX2020', + 12 => 'RMX2030', + 13 => 'RMX2063', + 14 => 'RMX2075', + 15 => 'RMX2086', + 16 => 'RMX2111', + 17 => 'RMX2144', + 18 => 'RMX2155', + 19 => 'RMX2170', + 20 => 'RMX2185', + 21 => 'RMX2202', + 22 => 'RMX3081', + 23 => 'RMX3085', + 24 => 'RMX3201', + 25 => 'RMX3241', + 26 => 'RMX3242', + 27 => 'RMX3263', + 28 => 'RMX3301', + 29 => 'RMX3311', + 30 => 'RMX3363', + 31 => 'RMX3370', ), '@RN' => array ( - 0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 0 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', ), '@RO' => array ( @@ -6130,15 +6600,18 @@ array ( 0 => 's3c6410', 1 => 'S30', - 2 => 'S308', - 3 => 'S3', + 2 => 'S31', + 3 => 'S308', + 4 => 'S3', ), '@S4' => array ( 0 => 'S40', - 1 => 'S4503Q', - 2 => 'S4505M', - 3 => 'S4', + 1 => 'S41', + 2 => 'S42', + 3 => 'S4503Q', + 4 => 'S4505M', + 5 => 'S4', ), '@S5' => array ( @@ -6146,29 +6619,41 @@ 1 => 'S5-F', 2 => 'S50', 3 => 'S50c', - 4 => 'S5', - 5 => 'S5 Mini!', - 6 => 'S51SE', + 4 => 'S52', + 5 => 'S58Pro', + 6 => 'S5 Pro', + 7 => 'S5', + 8 => 'S5 Mini!', + 9 => 'S51SE', ), '@S6' => array ( - 0 => 'S658t', - 1 => 'S6 Edge+!', + 0 => 'S61', + 1 => 'S62 Pro', + 2 => 'S68Pro', + 3 => 'S658t', + 4 => 'S6 Edge+!', ), '@S7' => array ( - 0 => 'S710d', - 1 => 'S710D', - 2 => 'S720i', - 3 => 'S7', - 4 => 's732', + 0 => 'S70Lite', + 1 => 'S710d', + 2 => 'S710D', + 3 => 'S720i', + 4 => 'S7', + 5 => 's732', ), '@S8' => array ( - 0 => 'S8600', - 1 => 'S88 DISCOVERY', - 2 => 'S850', - 3 => 'S880', + 0 => 'S88Pro', + 1 => 'S8600', + 2 => 'S88 DISCOVERY', + 3 => 'S850', + 4 => 'S880', + ), + '@S9' => + array ( + 0 => 'S96Pro', ), '@SA' => array ( @@ -6202,9 +6687,9 @@ '@SC' => array ( 0 => 'SCM-(AL09|W09)!', - 1 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', - 2 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', - 3 => '(HW-|HUAWEI )?(CRO|LUA|CUN|SCC|SCU|CAM|LDN|LYO|MYA)!!', + 1 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 2 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 3 => '(HW-|HUAWEI )?(AMN|ART|AQM|CRO|LUA|CUN|DUB|SCC|SCU|CAM|LDN|LYO|MED|MYA)!!', 4 => 'SCH-[iI][0-9]{3,3}!!', 5 => 'SCH-L710!', 6 => 'SCH-M828!', @@ -6266,23 +6751,31 @@ 9 => 'SHIELD Tablet X1', 10 => 'SHIELD Tablet II', 11 => 'Shine', - 12 => 'SH940C-LN', - 13 => 'SH940C-LN TV', - 14 => 'SH960C-LN', - 15 => 'Sholes', - 16 => 'SHV-E[0-9]{3,3}!!', - 17 => 'SHW-M[0-9]{3,3}!!', - 18 => 'SH01D', - 19 => 'SH-M01', - 20 => 'SH-M02', - 21 => 'SH-M02-EVA20', - 22 => 'SH-M03', - 23 => 'SH-M07', - 24 => 'SH-RM02', - 25 => 'SH-[01][0-9][A-Z]!!', - 26 => '(SHP-)?(SHARP )?SH[0-9]{2,3}!!', - 27 => 'SH[FLTV][0-9]{2,2}!!', - 28 => 'SHARP-ADS1', + 12 => 'SHT-W09', + 13 => 'SH940C-LN', + 14 => 'SH940C-LN TV', + 15 => 'SH960C-LN', + 16 => 'Sholes', + 17 => 'SHV-E[0-9]{3,3}!!', + 18 => 'SHW-M[0-9]{3,3}!!', + 19 => 'SH01D', + 20 => 'SH-A01', + 21 => 'SH-C02', + 22 => 'SH-D01', + 23 => 'SH-M01', + 24 => 'SH-M02', + 25 => 'SH-M02-EVA20', + 26 => 'SH-M03', + 27 => 'SH-M05', + 28 => 'SH-M07', + 29 => 'SH-RM02', + 30 => 'SH-Z01', + 31 => 'SH-[01][0-9][A-Z]!!', + 32 => '(SHP-)?(SHARP )?SH[0-9]{2,3}!!', + 33 => 'SH[FLTV][0-9]{2,2}!!', + 34 => 'SHARP-ADS1', + 35 => 'SHIFT6m', + 36 => 'SHARK PRS-H0', ), '@SI' => array ( @@ -6299,14 +6792,15 @@ 3 => 'Skyworth!!', 4 => 'SK17(a|i|iv|i-o)!', 5 => 'SK-Mtek GT7305', - 6 => '(ZTE )?Skate!!', + 6 => 'SKR-H0', + 7 => '(ZTE )?Skate!!', ), '@SL' => array ( 0 => 'Slider SL101', 1 => 'SL930', 2 => '(HP|Slate)!!', - 3 => '(HW-|HUAWEI )?(ATU|DRA|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', + 3 => '(HW-|HUAWEI )?(ATU|DRA|DVC|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', 4 => 'Slidepad!!', 5 => 'SLIDE', ), @@ -6345,24 +6839,30 @@ 30 => 'SM-P[0-9]{3,3}!!', 31 => 'SM-S[0-9]{3,3}!!', 32 => 'SM-T[0-9]{3,3}!!', - 33 => 'SM-V700', - 34 => 'SM-W[0-9]{4,4}!!', - 35 => 'Smartphone Android by SFR STARADDICT II', - 36 => '(Smartfren|Andromax)!!', - 37 => 'Smartfren Tab 7', - 38 => 'SM919', - 39 => 'SM701', - 40 => 'SM801', - 41 => 'SmartQ!!', - 42 => 'SMART Sprint', - 43 => 'SMART Start', - 44 => 'SMART Surf2 4G', - 45 => 'SmartTab!!', + 33 => 'SM-X200', + 34 => 'SM-X205', + 35 => 'SM-X700', + 36 => 'SM-X800', + 37 => 'SM-X900', + 38 => 'SM-X906!', + 39 => 'SM-V700', + 40 => 'SM-W[0-9]{4,4}!!', + 41 => 'Smartphone Android by SFR STARADDICT II', + 42 => '(Smartfren|Andromax)!!', + 43 => 'Smartfren Tab 7', + 44 => 'SM919', + 45 => 'SM701', + 46 => 'SM801', + 47 => 'SmartQ!!', + 48 => 'SMART Sprint', + 49 => 'SMART Start', + 50 => 'SMART Surf2 4G', + 51 => 'SmartTab!!', ), '@SN' => array ( 0 => 'SN[0-9]!!', - 1 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NXT|SNE|TAS|Z100)!!', + 1 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NOH|NXT|SNE|TAS|Z100)!!', 2 => 'Snexian!!', 3 => '(SNM\\-)?LT[0-9]{2,2}[a-z]?!!', 4 => '(SNM\\-)?M[0-9]{2,2}[a-z]!!', @@ -6379,7 +6879,7 @@ 7 => 'Softwinerf900', 8 => 'SoftwinerEvbV13', 9 => 'soho', - 10 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 10 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', 11 => 'SONIC', 12 => 'Sonim!!', 13 => 'SO-0[0-9][A-Z]!!', @@ -6445,8 +6945,8 @@ 12 => 'ST7001', 13 => 'ST8000', 14 => 'ST9001', - 15 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', - 16 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 15 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 16 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', 17 => 'ST10', 18 => 'ST940I-UP', 19 => 'STM[0-9]{3,3}H!!', @@ -6510,12 +7010,14 @@ 1 => 'Surfing Tab C 3G', 2 => '(E-Boda|Eruption|Essential|Supreme|Storm|Revo)!!', 3 => '(Explay|X-tremer|ActiveD|Informer|Surfer)!!', - 4 => 'surnia', - 5 => 'SUGAR ([A-Z][0-9]?(?: Pro)?)!', - 6 => 'SUPRA (M[0-9]{2,3}[A-Z]{0,2})!', - 7 => 'SUBLIM', - 8 => 'SUNSET', - 9 => 'SUNSET2', + 4 => 'Surface Duo', + 5 => 'Surface Duo 2', + 6 => 'surnia', + 7 => 'SUGAR ([A-Z][0-9]?(?: Pro)?)!', + 8 => 'SUPRA (M[0-9]{2,3}[A-Z]{0,2})!', + 9 => 'SUBLIM', + 10 => 'SUNSET', + 11 => 'SUNSET2', ), '@SV' => array ( @@ -6526,8 +7028,9 @@ array ( 0 => 'Swift', 1 => 'Swift Plus', - 2 => 'Swift 2 Plus', - 3 => 'Swift 2 X', + 2 => 'Swift 2', + 3 => 'Swift 2 Plus', + 4 => 'Swift 2 X', ), '@SX' => array ( @@ -6606,7 +7109,8 @@ ), '@T2' => array ( - 0 => 'T20', + 0 => 'T20-Plus', + 1 => 'T20', ), '@T3' => array ( @@ -6618,12 +7122,16 @@ '@T6' => array ( 0 => 'T6', + 1 => 'T671H', ), '@T7' => array ( 0 => '(OPPO-?)?T703!', - 1 => 'T720 SE', - 2 => 'T760 from moage.com', + 1 => 'T774H', + 2 => 'T775H', + 3 => 'T790Y', + 4 => 'T720 SE', + 5 => 'T760 from moage.com', ), '@T8' => array ( @@ -6648,8 +7156,8 @@ 5 => 'Tablet-P27', 6 => 'TA10CA3', 7 => '(tablet )?fnac!!', - 8 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NXT|SNE|TAS|Z100)!!', - 9 => '(HW-|HUAWEI )?(ATU|DRA|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', + 8 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NOH|NXT|SNE|TAS|Z100)!!', + 9 => '(HW-|HUAWEI )?(ATU|DRA|DVC|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', 10 => '(HW-|HUAWEI )?(BLL|CHC|TAG|KII)!!', 11 => 'TA-FONE!!', 12 => 'TAB1011', @@ -6759,6 +7267,7 @@ 15 => 'TC70', 16 => 'TC75', 17 => 'TCL!!', + 18 => 'TC26', ), '@TD' => array ( @@ -6790,16 +7299,19 @@ 18 => 'Telpad Quad S', 19 => 'Telpad QS', 20 => 'Tensent S9000', - 21 => 'teXet X-alpha', - 22 => 'Texet TM-4083', - 23 => 'teXet X-start', - 24 => 'teXet iX-mini', - 25 => 'teXet X-navi', - 26 => 'TEXET TM-4677', - 27 => 'teXet X-medium plus', - 28 => 'teXet X-maxi qHD', - 29 => 'TeamDRH ICS for GTablet', - 30 => 'Telenor!!', + 21 => 'Teracube 2e', + 22 => 'teXet X-alpha', + 23 => 'Texet TM-4083', + 24 => 'teXet X-start', + 25 => 'teXet iX-mini', + 26 => 'teXet X-navi', + 27 => 'TEXET TM-4677', + 28 => 'teXet X-medium plus', + 29 => 'teXet X-maxi qHD', + 30 => 'TeamDRH ICS for GTablet', + 31 => 'TERRA PAD 1004', + 32 => 'TERRA PAD 1005', + 33 => 'Telenor!!', ), '@TF' => array ( @@ -6830,12 +7342,14 @@ array ( 0 => 'Tilapia', 1 => 'Titan TV S320', - 2 => '(HW-|HUAWEI )?(ATU|DRA|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', - 3 => '(Karbonn|Titanium)!!', - 4 => 'TI320-DU', - 5 => 'TI320-DU TV', - 6 => 'TizzBird!!', - 7 => 'tiffany', + 2 => 'TIQ-1049', + 3 => '(HW-|HUAWEI )?(ATU|DRA|DVC|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', + 4 => '(Karbonn|Titanium)!!', + 5 => 'TI320-DU', + 6 => 'TI320-DU TV', + 7 => 'TizzBird!!', + 8 => 'Titan pocket', + 9 => 'tiffany', ), '@TL' => array ( @@ -6897,7 +7411,7 @@ ), '@TN' => array ( - 0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 0 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', ), '@TO' => array ( @@ -6950,19 +7464,21 @@ 12 => '(Transformer )?(Pad )?TF700(T|K)!', 13 => 'Transformer (Pad )?Infinity!', 14 => 'TR720F', - 15 => 'TR10CS1', - 16 => 'TripNiCE Pyramid', - 17 => '(HW-|HUAWEI )?(ATU|DRA|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', - 18 => 'TR10RS1', - 19 => '(KAZAM|Thunder|Tornado|Trooper)!!', - 20 => 'Triumph', - 21 => 'TRACER OXYGEN GS1', - 22 => 'Trevi PHABLET 4C', - 23 => 'Trevi PHABLET 5 S', - 24 => 'TREQ!!', - 25 => 'Trevi REVERSE 5.5Q', - 26 => 'Trevi PHABLET 6 S', - 27 => 'TRUE BEYOND 3G', + 15 => 'TREKKER-X3', + 16 => 'Trekker-X4', + 17 => 'TR10CS1', + 18 => 'TripNiCE Pyramid', + 19 => '(HW-|HUAWEI )?(ATU|DRA|DVC|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!', + 20 => 'TR10RS1', + 21 => '(KAZAM|Thunder|Tornado|Trooper)!!', + 22 => 'Triumph', + 23 => 'TRACER OXYGEN GS1', + 24 => 'Trevi PHABLET 4C', + 25 => 'Trevi PHABLET 5 S', + 26 => 'TREQ!!', + 27 => 'Trevi REVERSE 5.5Q', + 28 => 'Trevi PHABLET 6 S', + 29 => 'TRUE BEYOND 3G', ), '@TS' => array ( @@ -6996,6 +7512,12 @@ 2 => 'TX85', 3 => 'TX18', ), + '@U ' => + array ( + 0 => 'U FEEL LITE', + 1 => 'U FEEL PRIME', + 2 => 'U PULSE LITE', + ), '@U1' => array ( 0 => '(CUBE ?)?(K8|U1|U2|U3|U5|U6|U8|U9)[0-9]?GT!!', @@ -7064,11 +7586,12 @@ 11 => 'Ultimate10', 12 => 'Ultimate10-Android4.0', 13 => 'Ultimate 10', - 14 => 'Ulefone Be Touch2', - 15 => 'ultrafone!!', - 16 => 'Ultym 5', - 17 => 'Ultym 5L', - 18 => 'Ultym 5.2', + 14 => 'Ulefone Armor 5', + 15 => 'Ulefone Be Touch2', + 16 => 'ultrafone!!', + 17 => 'Ultym 5', + 18 => 'Ultym 5L', + 19 => 'Ultym 5.2', ), '@UM' => array ( @@ -7134,6 +7657,7 @@ 16 => '(GIO-)?(GiONEE[- ])?V188!', 17 => 'V1', 18 => 'V1277', + 19 => 'V1916A', ), '@V2' => array ( @@ -7144,6 +7668,12 @@ 4 => 'V2 Viper S', 5 => 'V2 Viper X', 6 => 'V2 Viper X plus', + 7 => 'V2023', + 8 => 'V2028', + 9 => 'V2041', + 10 => 'V2056A', + 11 => 'V2109', + 12 => 'V2141A', ), '@V3' => array ( @@ -7245,6 +7775,7 @@ 16 => 'Venus_V3 5040', 17 => 'Venus V3 5570', 18 => 'Venus V3 5580', + 19 => 'Venus Z20', ), '@VF' => array ( @@ -7302,7 +7833,7 @@ 20 => 'Vibo-A688', 21 => 'VitMod ExtraLite 1.6.5.fullodex for HTC HD7 Pro', 22 => 'Vivid 4G', - 23 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 23 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', 24 => 'Vibe K5 Plus', 25 => 'VIBE X2 (X2)', 26 => 'VIBE X3', @@ -7343,18 +7874,22 @@ 61 => 'ViewSonic VB733', 62 => 'VINUS!!', 63 => '(BBG-|VIV-)?vivo!!', - 64 => 'Viettel i5', - 65 => 'Viettel I8', - 66 => 'VIETTEL V8404!', - 67 => 'Viettel V8410', - 68 => 'VIETTEL V8411', - 69 => 'Viettel V8502', - 70 => 'VIETTEL V8506', - 71 => 'VIETTEL V8509', + 64 => 'View', + 65 => 'View XL', + 66 => 'View2 Go', + 67 => 'View2 Plus', + 68 => 'Viettel i5', + 69 => 'Viettel I8', + 70 => 'VIETTEL V8404!', + 71 => 'Viettel V8410', + 72 => 'VIETTEL V8411', + 73 => 'Viettel V8502', + 74 => 'VIETTEL V8506', + 75 => 'VIETTEL V8509', ), '@VK' => array ( - 0 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 0 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', 1 => 'VK410', 2 => 'VK700', 3 => 'VK810 4G', @@ -7372,7 +7907,7 @@ ), '@VN' => array ( - 0 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 0 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', ), '@VO' => array ( @@ -7381,7 +7916,7 @@ 2 => 'Volantisg', 3 => 'VOYAGER DG300', 4 => 'VOYAGER2 DG310', - 5 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 5 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', 6 => 'Vox', 7 => 'Vortex', 8 => 'vollo Vi86', @@ -7427,7 +7962,7 @@ ), '@VT' => array ( - 0 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 0 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', 1 => 'VT6078', 2 => 'VT75C', 3 => 'VT77C', @@ -7447,6 +7982,23 @@ 2 => 'VX580W', 3 => 'VX610A', ), + '@W ' => + array ( + 0 => 'W K300', + 1 => 'W K400', + 2 => 'W P200', + 3 => 'W C800', + 4 => 'W C860', + ), + '@W-' => + array ( + 0 => 'W-V600', + 1 => 'W-P311-EEA', + 2 => 'W-V800-EEA', + 3 => 'W-V830-EEA', + 4 => 'W-V730-EEA', + 5 => 'W-V851-EEA', + ), '@W1' => array ( 0 => 'W10', @@ -7522,7 +8074,7 @@ ), '@WA' => array ( - 0 => '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', + 0 => '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!', 1 => 'WA-U420D', 2 => 'WALSUN S1 Pro', 3 => 'WALSUN S2', @@ -7601,12 +8153,13 @@ 7 => 'WIKO-CINK SLIM', 8 => 'Wiko Rainbow', 9 => 'Wiko Stairway', - 10 => 'Wileyfox Spark', - 11 => 'Wileyfox Spark +', - 12 => 'Wileyfox Spark X', - 13 => 'Wileyfox Storm', - 14 => 'Wileyfox Swift', - 15 => 'Wink City S', + 10 => 'WIM Lite', + 11 => 'Wileyfox Spark', + 12 => 'Wileyfox Spark +', + 13 => 'Wileyfox Spark X', + 14 => 'Wileyfox Storm', + 15 => 'Wileyfox Swift', + 16 => 'Wink City S', ), '@WL' => array ( @@ -7673,16 +8226,27 @@ 15 => 'X00DDB', 16 => 'X00HD', 17 => 'X00GD', - 18 => 'X013D', - 19 => 'X013DA', - 20 => 'X013DB', - 21 => 'X013DC', - 22 => 'X015D', - 23 => 'X014D', - 24 => 'X002', - 25 => 'X003', - 26 => 'X005', - 27 => 'X008', + 18 => 'X00LD', + 19 => 'X00T', + 20 => 'X00TD', + 21 => 'X00TDB', + 22 => 'X00DE', + 23 => 'X00QD', + 24 => 'X00QSA', + 25 => 'X01AD', + 26 => 'X01BDA', + 27 => 'X013D', + 28 => 'X013DA', + 29 => 'X013DB', + 30 => 'X013DC', + 31 => 'X015D', + 32 => 'X00ID', + 33 => 'X014D', + 34 => 'X018D', + 35 => 'X002', + 36 => 'X003', + 37 => 'X005', + 38 => 'X008', ), '@X1' => array ( @@ -7701,19 +8265,22 @@ 12 => 'X1 mini', 13 => 'X1 Selfie', 14 => 'X1010', - 15 => 'X10(a|i|iv|i-o|s)?$!', - 16 => 'X10 ?(Mini ?Pro)$!', - 17 => 'X10 ?(Mini)$!', - 18 => 'X10H(G3C5)', - 19 => 'X10HD 3G(M6K6)', - 20 => 'X16 Plus(D3A5)', - 21 => 'X16 Power(D6F7)', - 22 => 'X16 PRO(D6F8)', - 23 => 'X16HD (K3J3)', - 24 => 'X16HD 3G(M5J4)', - 25 => 'X16HD 3G(M5J5)', - 26 => 'X16HD 3G(M5J5', - 27 => 'X16HD 3G(M5J6)', + 15 => 'X1030X', + 16 => 'X1031X', + 17 => 'X1060X', + 18 => 'X10(a|i|iv|i-o|s)?$!', + 19 => 'X10 ?(Mini ?Pro)$!', + 20 => 'X10 ?(Mini)$!', + 21 => 'X10H(G3C5)', + 22 => 'X10HD 3G(M6K6)', + 23 => 'X16 Plus(D3A5)', + 24 => 'X16 Power(D6F7)', + 25 => 'X16 PRO(D6F8)', + 26 => 'X16HD (K3J3)', + 27 => 'X16HD 3G(M5J4)', + 28 => 'X16HD 3G(M5J5)', + 29 => 'X16HD 3G(M5J5', + 30 => 'X16HD 3G(M5J6)', ), '@X2' => array ( @@ -7747,15 +8314,20 @@ ), '@X5' => array ( - 0 => 'X550', - 1 => 'X515d', - 2 => 'X515e', - 3 => 'X525a', - 4 => 'X527', - 5 => 'X505', - 6 => 'X506', - 7 => 'X506S', - 8 => 'X507Q', + 0 => 'X5 Soul Pro', + 1 => 'X550', + 2 => 'X515d', + 3 => 'X515e', + 4 => 'X525a', + 5 => 'X527', + 6 => 'X505', + 7 => 'X506', + 8 => 'X506S', + 9 => 'X507Q', + ), + '@X6' => + array ( + 0 => 'X67 5G', ), '@X7' => array ( @@ -7928,13 +8500,16 @@ 10 => '(Xiaomi )?(Redmi|RedRice|HM)!!', 11 => '(Xiaomi )?(Redmi|HM)[ \\-]?Note!!', 12 => '(Xiaomi |HM)?20!!', - 13 => 'Xiaomi MDT2!', - 14 => 'Xiaomi MCT1!', - 15 => 'Xiaomi MAT136!', - 16 => 'Xiaomi MBT6A5!', - 17 => '(Xiaomi|Xiaomi Mi|MI) Pad!!', - 18 => '(Xiaomi|Xiaomi Mi|MI)Box!!', - 19 => '(Xiaomi|Xiaomi Mi|MI)TV!!', + 13 => '(Xiaomi |HM)?21!!', + 14 => 'Xiaomi MDT2!', + 15 => 'Xiaomi MCT1!', + 16 => 'Xiaomi MAT136!', + 17 => 'Xiaomi MBT6A5!', + 18 => 'Xiaomi 11 Lite 5G NE', + 19 => 'Xiaomi 11T Pro', + 20 => '(Xiaomi|Xiaomi Mi|MI) Pad!!', + 21 => '(Xiaomi|Xiaomi Mi|MI)Box!!', + 22 => '(Xiaomi|Xiaomi Mi|MI)TV!!', ), '@XL' => array ( @@ -7987,9 +8562,24 @@ array ( 0 => 'Xperia Z Ultra', 1 => 'XPRESS PRO', - 2 => 'Xperia!!', - 3 => '(Symphony|Xplorer)!!', - 4 => 'xPAD-70', + 2 => 'XP8800', + 3 => 'Xperia!!', + 4 => '(Symphony|Xplorer)!!', + 5 => 'xPAD-70', + ), + '@XQ' => + array ( + 0 => 'XQ-AT51', + 1 => 'XQ-AT52', + 2 => 'XQ-BC52', + 3 => 'XQ-BC72', + 4 => 'XQ-AS52', + 5 => 'XQ-BQ52', + 6 => 'XQ-AU52', + 7 => 'XQ-BT52', + 8 => 'XQ-AD51', + 9 => 'XQ-AD52', + 10 => 'XQ-BE52', ), '@XT' => array ( @@ -8043,7 +8633,7 @@ ), '@YA' => array ( - 0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', + 0 => '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!', ), '@YD' => array ( @@ -8221,14 +8811,17 @@ 56 => 'Z01HDA', 57 => 'Z01KD', 58 => 'Z01KDA', - 59 => 'Z01MDA', - 60 => 'Z00YD', + 59 => 'Z01MD', + 60 => 'Z01MDA', + 61 => 'Z01RD', + 62 => 'Z01QD', + 63 => 'Z00YD', ), '@Z1' => array ( 0 => '(BB )?Z10$!', 1 => 'Z1-H39LW', - 2 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NXT|SNE|TAS|Z100)!!', + 2 => '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NOH|NXT|SNE|TAS|Z100)!!', 3 => 'Z1i', ), '@Z2' => @@ -8383,6 +8976,10 @@ array ( 0 => '(Zopo )?ZP ?[0-9]{3,3}!!', ), + '@ZS' => + array ( + 0 => 'ZS671KS', + ), '@ZT' => array ( 0 => 'zt180', @@ -8482,27 +9079,29 @@ 94 => 'ZTE A2017', 95 => 'ZTE A2017G', 96 => 'ZTE A2017U', - 97 => 'ZTE B2015', - 98 => 'ZTE B2016', - 99 => 'ZTE B2017', - 100 => 'ZTE B2017G', - 101 => 'ZTE B2019G', - 102 => 'ZTE C2016', - 103 => 'ZTE C2017', - 104 => 'ZTE STAR', - 105 => 'ZTE Star 1', - 106 => 'ZTE S2004', - 107 => 'ZTE S2005', - 108 => 'ZTE S2007', - 109 => 'ZTE S2010', - 110 => 'ZTE S2014', - 111 => 'ZTE U9180', - 112 => 'ZTE U9370', - 113 => 'ZTE V6500', - 114 => 'ZTE V8110', - 115 => 'ZTE B860A', - 116 => 'ZTE B860AV1', - 117 => 'ZTE W1010', + 97 => 'ZTE A2020G Pro', + 98 => 'ZTE A2022PG', + 99 => 'ZTE B2015', + 100 => 'ZTE B2016', + 101 => 'ZTE B2017', + 102 => 'ZTE B2017G', + 103 => 'ZTE B2019G', + 104 => 'ZTE C2016', + 105 => 'ZTE C2017', + 106 => 'ZTE STAR', + 107 => 'ZTE Star 1', + 108 => 'ZTE S2004', + 109 => 'ZTE S2005', + 110 => 'ZTE S2007', + 111 => 'ZTE S2010', + 112 => 'ZTE S2014', + 113 => 'ZTE U9180', + 114 => 'ZTE U9370', + 115 => 'ZTE V6500', + 116 => 'ZTE V8110', + 117 => 'ZTE B860A', + 118 => 'ZTE B860AV1', + 119 => 'ZTE W1010', ), '@ZU' => array ( diff --git a/data/models-android.php b/data/models-android.php index d78ae7ee9..e249207da 100644 --- a/data/models-android.php +++ b/data/models-android.php @@ -271,7 +271,13 @@ 'Pixel 3a' => [ 'Google', 'Pixel 3a' ], 'Pixel 3a XL' => [ 'Google', 'Pixel 3a XL' ], 'Pixel 4' => [ 'Google', 'Pixel 4' ], + 'Pixel 4a' => [ 'Google', 'Pixel 4a' ], + 'Pixel 4a (5G)' => [ 'Google', 'Pixel 4a 5G' ], 'Pixel 4 XL' => [ 'Google', 'Pixel 4 XL' ], + 'Pixel 5' => [ 'Google', 'Pixel 5' ], + 'Pixel 5a' => [ 'Google', 'Pixel 5a' ], + 'Pixel 6' => [ 'Google', 'Pixel 6' ], + 'Pixel 6 Pro' => [ 'Google', 'Pixel 6 Pro' ], /* Google Edition */ 'HTC One' => [ 'HTC', 'One (Google Edition)' ], @@ -318,11 +324,10 @@ /* Chromebook */ - 'Acer Chromebook R11' => [ 'Acer', 'Chromebook R11', DeviceType::DESKTOP ], - 'Acer Chromebook R11 (CB5-132T / C738T)' => [ 'Acer', 'Chromebook R11', DeviceType::DESKTOP ], - 'Acer Chromebook 15 (CB3-532)' => [ 'Acer', 'Chromebook 15', DeviceType::DESKTOP ], - 'ASUS Chromebook Flip C100PA' => [ 'Asus', 'Chromebook Flip', DeviceType::DESKTOP ], - 'ASUS Chromebook Flip C302' => [ 'Asus', 'Chromebook Flip', DeviceType::DESKTOP ], + 'Acer Chromebook R11!' => [ 'Acer', 'Chromebook R11', DeviceType::DESKTOP ], + 'Acer Chromebook R13!' => [ 'Acer', 'Chromebook R13', DeviceType::DESKTOP ], + 'Acer Chromebook 15!' => [ 'Acer', 'Chromebook 15', DeviceType::DESKTOP ], + 'ASUS Chromebook Flip!' => [ 'Asus', 'Chromebook Flip', DeviceType::DESKTOP ], 'Google Chromebook Pixel (2015)' => [ 'Google', 'Chromebook Pixel (2015)', DeviceType::DESKTOP ], 'HP Chromebook x360 11 G1 EE' => [ 'Google', 'Chromebook x360 11 G1 EE', DeviceType::DESKTOP ], 'Samsung Chromebook 3' => [ 'Samsung', 'Chromebook 3', DeviceType::DESKTOP ], @@ -573,6 +578,7 @@ 'B3-A32' => [ 'Acer', 'Iconia One 10 B3-A32', DeviceType::TABLET ], 'B3-A40' => [ 'Acer', 'Iconia One 10 B3-A40', DeviceType::TABLET ], 'B3-A40FHD' => [ 'Acer', 'Iconia One 10 B3-A40FHD', DeviceType::TABLET ], + 'B3-A50FHD' => [ 'Acer', 'Iconia One 10 B3-A50FHD', DeviceType::TABLET ], 'One 7 M77GHG' => [ 'Acer', 'Iconia One 7 M77GHG', DeviceType::TABLET ], 'TD070VA1' => [ 'Acer', 'Iconia One 7 TD070VA1', DeviceType::TABLET ], @@ -980,6 +986,10 @@ '4055[JU]!' => [ 'Alcatel', 'One Touch Pixi 5 (4)' ], '4060[A]!' => [ 'Alcatel', 'IDEAL' ], '4060[SW]!' => [ 'Alcatel', 'One Touch Pixi 4 (5)' ], + '5001[D]!' => [ 'Alcatel', '1V (2019)' ], + '5002[DH]!' => [ 'Alcatel', '1B (2020)' ], + '5003[D]!' => [ 'Alcatel', '1C (2019)' ], + '5009[D]!' => [ 'Alcatel', '1C' ], '5010[DEGSUX]!' => [ 'Alcatel', 'One Touch Pixi 4 (5)' ], '5011[A]!' => [ 'Alcatel', 'A3 Plus' ], '5012[G]!' => [ 'Alcatel', 'One Touch Pixi 4 (5.5)' ], @@ -996,9 +1006,10 @@ 'one ?touch 5021!' => [ 'Alcatel', 'One Touch Soleil' ], '5022[DEX]!' => [ 'Alcatel', 'One Touch Pop Star' ], '5023[F]!' => [ 'Alcatel', 'One Touch Pixi 4 Plus Power' ], - '5024[D]!' => [ 'Alcatel', '1S' ], + '5024[DF]!' => [ 'Alcatel', '1S' ], '5025[DEGX]!' => [ 'Alcatel', 'One Touch Pop 3' ], '5027[B]!' => [ 'Alcatel', 'One Touch Dawn' ], + '5030[DF]!' => [ 'Alcatel', '1SE' ], '5033[ADJOX]!' => [ 'Alcatel', '1' ], '5034[D]!' => [ 'Alcatel', '3L' ], 'one ?touch 5035!' => [ 'Alcatel', 'One Touch X\'Pop' ], @@ -1015,12 +1026,13 @@ '5045[ADFGJTXY]!' => [ 'Alcatel', 'One Touch Pixi 4 (5.0)' ], '5046[DGIJUY]!' => [ 'Alcatel', 'A3' ], '5047[DIUY]!' => [ 'Alcatel', 'U5 HD' ], + '5048[UY]!' => [ 'Alcatel', '3X (2019)' ], '5049[EGSWZ]!' => [ 'Alcatel', 'A30 Fierce' ], 'one ?touch 5050!' => [ 'Alcatel', 'One Touch Pop S3' ], '5050[ASYX]!' => [ 'Alcatel', 'One Touch Pop S3' ], '5051[ADJMX]!' => [ 'Alcatel', 'One Touch Pop 4 (5.0)' ], '5052[DY]!' => [ 'Alcatel', '3' ], - '5053[D]!' => [ 'Alcatel', '3 (2019)' ], + '5053[DK]!' => [ 'Alcatel', '3 (2019)' ], '5054[ADOSTX]!' => [ 'Alcatel', 'One Touch Pixi 3 (5.5)' ], '5054[NW]!' => [ 'Alcatel', 'One Touch Fierce XL' ], '5056[ADEINUWX]!' => [ 'Alcatel', 'One Touch Pop 4+' ], @@ -1029,6 +1041,7 @@ '5058[I]!' => [ 'Alcatel', '3X' ], '5059[ADJTXY]!' => [ 'Alcatel', '1X' ], '5060[D]!' => [ 'Alcatel', '5V' ], + '5061[KU]!' => [ 'Alcatel', '3X' ], '5065[ADJNWX]!' => [ 'Alcatel', 'One Touch Pixi 3 (5)' ], '5070[DJX]!' => [ 'Alcatel', 'One Touch Pop Star' ], '5080[A]!' => [ 'Alcatel', 'Shine Lite' ], @@ -1048,6 +1061,7 @@ '6014[DX]!' => [ 'Alcatel', 'One Touch Idol Mini' ], 'one ?touch 6016!' => [ 'Alcatel', 'One Touch Idol 2 Mini' ], '6016[ADEX]!' => [ 'Alcatel', 'One Touch Idol 2 Mini' ], + '6025[D]!' => [ 'Alcatel', '1S (2021)' ], 'one ?touch 6030!' => [ 'Alcatel', 'One Touch Idol' ], '6031[X]!' => [ 'Alcatel', 'One Touch Idol Ultra' ], 'one ?touch 6032!' => [ 'Alcatel', 'One Touch Idol α' ], @@ -1069,6 +1083,7 @@ 'one ?touch 6050!' => [ 'Alcatel', 'One Touch Idol 2S' ], '6050[AFWY]!' => [ 'Alcatel', 'One Touch Idol 2S' ], '6055[ABDHIKPUY]!' => [ 'Alcatel', 'One Touch Idol 4' ], + '6056[D]!' => [ 'Alcatel', '3L' ], '6058[D]!' => [ 'Alcatel', 'One Touch Idol 5' ], '6060[S]!' => [ 'Alcatel', 'One Touch Idol 5s' ], '6062[W]!' => [ 'Alcatel', '7' ], @@ -1104,6 +1119,10 @@ '8020[D]!' => [ 'Alcatel', 'One Touch Hero' ], 'one ?touch 8030!' => [ 'Alcatel', 'One Touch Hero 2' ], '8030[BY]!' => [ 'Alcatel', 'One Touch Hero 2' ], + '8063' => [ 'Alcatel', 'Pixi 4' ], + '8082' => [ 'Alcatel', '1T', DeviceType::TABLET ], + '8082 EEA' => [ 'Alcatel', '1T', DeviceType::TABLET ], + '8094[X]!' => [ 'Alcatel', '3T 10', DeviceType::TABLET ], '9001[DIX]!' => [ 'Alcatel', 'One Touch Pixi 4 (6)' ], '9002[AWX]!' => [ 'Alcatel', 'One Touch Pixi 3 (7)', DeviceType::TABLET ], '9003[AX]!' => [ 'Alcatel', 'One Touch Pixi 4 (7)', DeviceType::TABLET ], @@ -1116,6 +1135,7 @@ '9022[SX]!' => [ 'Alcatel', 'One Touch Pixi 3 (8)', DeviceType::TABLET ], '9024[OW]!' => [ 'Alcatel', 'A30', DeviceType::TABLET ], '9025[MQ]!' => [ 'Alcatel', 'One Touch Pop 4 (7)', DeviceType::TABLET ], + '9026[X]!' => [ 'Alcatel', 'A3 10', DeviceType::TABLET ], 'one ?touch T10!' => [ 'Alcatel', 'One Touch T10', DeviceType::TABLET ], 'one ?touch T20!' => [ 'Alcatel', 'One Touch T20', DeviceType::TABLET ], 'one ?touch T60!' => [ 'Alcatel', 'One Touch T60', DeviceType::TABLET ], @@ -1187,6 +1207,7 @@ 'P8 Energy' => [ 'Allview', 'P8 Energy' ], 'P8 Energy mini' => [ 'Allview', 'P8 Energy Mini' ], 'P8 Energy mini TM' => [ 'Allview', 'P8 Energy Mini' ], + 'P9 Energy' => [ 'Allview', 'P9 Energy' ], 'ALLVIEW TX1 Quasar' => [ 'Allview', 'TX1 Quasar' ], 'V1 Viper' => [ 'Allview', 'V1 Viper' ], 'V1 Viper E' => [ 'Allview', 'V1 Viper E' ], @@ -1242,6 +1263,7 @@ 'X3 Soul PLUS' => [ 'Allview', 'X3 Soul Plus' ], 'X3 Soul PRO' => [ 'Allview', 'X3 Soul Pro' ], 'X3 Soul Style' => [ 'Allview', 'X3 Soul Style' ], + 'X5 Soul Pro' => [ 'Allview', 'X5 Soul Pro' ], '(Allview|Alldro)!!' => [ 'Allview AX1 Shine' => [ 'Allview', 'AX1 Shine', DeviceType::TABLET ], @@ -1322,6 +1344,7 @@ 'KFDOWI' => [ 'Amazon', 'Fire HD 8 (2017)', DeviceType::TABLET, Flag::FIREOS ], // xth generation 8" HD (1280 x 800) 'KFSUWI' => [ 'Amazon', 'Fire HD 10 (2017)', DeviceType::TABLET, Flag::FIREOS ], // 5th generation 10" HD (1280 x 800) 'KFMAWI' => [ 'Amazon', 'Fire HD 8 (2018)', DeviceType::TABLET, Flag::FIREOS ], + 'KFKAWI' => [ 'Amazon', 'Fire HD 8 (2018)', DeviceType::TABLET, Flag::FIREOS ], 'KFMUWI' => [ 'Amazon', 'Fire 7 (2019)', DeviceType::TABLET, Flag::FIREOS ], 'SD4930UR' => [ 'Amazon', 'Fire Phone', DeviceType::MOBILE, Flag::FIREOS ], 'AFTB' => [ 'Amazon', 'Fire TV', DeviceType::TELEVISION, Flag::FIREOS ], @@ -1588,6 +1611,7 @@ 'Archos 70 Oxygen' => [ 'Archos', '70 Oxygen', DeviceType::TABLET ], 'Archos 80 Oxygen' => [ 'Archos', '80 Oxygen', DeviceType::TABLET ], 'Archos 101 Oxygen' => [ 'Archos', '101 Oxygen', DeviceType::TABLET ], + 'Archos 101 Oxygen 4G' => [ 'Archos', '101 Oxygen', DeviceType::TABLET ], 'Archos 101b Oxygen' => [ 'Archos', '101b Oxygen', DeviceType::TABLET ], 'Archos 133 Oxygen' => [ 'Archos', '133 Oxygen', DeviceType::TABLET ], 'Archos 156 Oxygen' => [ 'Archos', '156 Oxygen', DeviceType::TABLET ], @@ -1682,13 +1706,18 @@ 'Archos Access 101 3G V2' => [ 'Archos', 'Access 101', DeviceType::TABLET ], 'Archos Core 50 4G' => [ 'Archos', 'Core 50' ], 'Archos Core 55 4G' => [ 'Archos', 'Core 55' ], + 'Archos Core 57S' => [ 'Archos', 'Core 57S' ], 'Archos Core 70 3G' => [ 'Archos', 'Core 70', DeviceType::TABLET ], 'ARCHOS Core 101 Wifi' => [ 'Archos', 'Core 101', DeviceType::TABLET ], 'Archos Core 101 3G' => [ 'Archos', 'Core 101', DeviceType::TABLET ], + 'Archos Oxygen 63' => [ 'Archos', 'Oxygen 63' ], + 'Archos Saphir 50X' => [ 'Archos', 'Saphir 50X' ], 'Archos Sense 55 DC' => [ 'Archos', 'Sense 55' ], 'Archos Sense 55 S' => [ 'Archos', 'Sense 55' ], ], + 'X67 5G' => [ 'Archos', 'X67 5G' ], + 'Artes D708' => [ 'Artes', 'D708', DeviceType::TABLET ], 'Artes D821' => [ 'Artes', 'D821', DeviceType::TABLET ], 'D9702' => [ 'Artes', 'D9702', DeviceType::TABLET ], @@ -1773,6 +1802,17 @@ 'PadFone X' => [ 'Asus', 'PadFone X', DeviceType::TABLET ], 'PadFone X mini' => [ 'Asus', 'PadFone X mini (PF450CL)', DeviceType::TABLET ], 'ETBW11AA' => [ 'Asus', 'Tough' ], + 'I01WDX' => [ 'Asus', 'ZenFone 8' ], + 'I001DC' => [ 'Asus', 'ROG Phone 2' ], + 'I001DE' => [ 'Asus', 'ROG Phone 2' ], + 'I002D' => [ 'Asus', 'ZenFone 7' ], + 'I003D' => [ 'Asus', 'ROG Phone 3' ], + 'I003DD' => [ 'Asus', 'ROG Phone 3' ], + 'I004D' => [ 'Asus', 'ZenFone 8 Flip' ], + 'I005D' => [ 'Asus', 'ROG Phone 5 Pro' ], + 'I005DA' => [ 'Asus', 'ROG Phone 5 Pro' ], + 'I006D' => [ 'Asus', 'ZenFone 8 Mini' ], + 'I01WD' => [ 'Asus', 'ZenFone 6 (ZS630KL)' ], 'K00C' => [ 'Asus', 'Transformer Pad Infinity', DeviceType::TABLET ], 'K010' => [ 'Asus', 'Transformer Pad TF103', DeviceType::TABLET ], 'K010E' => [ 'Asus', 'Transformer Pad TF103', DeviceType::TABLET ], @@ -1830,6 +1870,7 @@ 'P001' => [ 'Asus', 'ZenPad C 7.0 (Z170MG)', DeviceType::TABLET ], 'P001 2' => [ 'Asus', 'ZenPad C 7.0 (Z170MG)', DeviceType::TABLET ], 'P002' => [ 'Asus', 'ZenPad 7.0 (Z370KL)', DeviceType::TABLET ], + 'P00A' => [ 'Asus', 'ZenPad 8.0 (Z380M)', DeviceType::TABLET ], 'P00C' => [ 'Asus', 'ZenPad 10 (Z300M)', DeviceType::TABLET ], 'P00I' => [ 'Asus', 'ZenPad Z10 (Z500KL)', DeviceType::TABLET ], 'P01M' => [ 'Asus', 'ZenPad S 8.0 (Z580C)', DeviceType::TABLET ], @@ -1844,8 +1885,11 @@ 'P022' => [ 'Asus', 'ZenPad 8.0 (Z380C)', DeviceType::TABLET ], 'P023' => [ 'Asus', 'ZenPad 10 (Z300C)', DeviceType::TABLET ], 'P024' => [ 'Asus', 'ZenPad 8.0 (Z380KL)', DeviceType::TABLET ], + 'P027' => [ 'Asus', 'ZenPad 3S 10 (Z500M)', DeviceType::TABLET ], + 'P028' => [ 'Asus', 'ZenPad 10 (Z301M)', DeviceType::TABLET ], // '' => [ 'Asus', 'ZenPad 10 (Z300CNL)', DeviceType::TABLET ], 'A001' => [ 'Asus', 'ZenFone 3 Ultra (ZU680KL)' ], + 'A007' => [ 'Asus', 'ZenFone Live (ZB501KL)' ], 'X007D' => [ 'Asus', 'ZenFone Go (ZB552KL)' ], 'X008D' => [ 'Asus', 'ZenFone 3 Max (ZC520TL)' ], 'X008DA' => [ 'Asus', 'ZenFone 3 Max (ZC520TL)' ], @@ -1864,6 +1908,15 @@ 'X00DDB' => [ 'Asus', 'ZenFone 3 Max (ZC553KL)' ], 'X00HD' => [ 'Asus', 'ZenFone 4 Max (ZC520KL)' ], 'X00GD' => [ 'Asus', 'ZenFone 3S Max (ZC521TL)' ], + 'X00LD' => [ 'Asus', 'ZenFone 4 Selfie (ZD553KL)' ], + 'X00T' => [ 'Asus', 'ZenFone Max Pro M1 (ZB601KL)' ], + 'X00TD' => [ 'Asus', 'ZenFone Max Pro M1 (ZB601KL)' ], + 'X00TDB' => [ 'Asus', 'ZenFone Max Pro M1 (ZB601KL)' ], + 'X00DE' => [ 'Asus', 'ZenFone Max Pro M1 (ZB601KL)' ], + 'X00QD' => [ 'Asus', 'ZenFone 5 (ZE620KL)' ], + 'X00QSA' => [ 'Asus', 'ZenFone 5 (ZE620KL)' ], + 'X01AD' => [ 'Asus', 'ZenFone Max M2 (ZB633KL)' ], + 'X01BDA' => [ 'Asus', 'ZenFone Max Pro M2 (ZB631KL)' ], 'X013D' => [ 'Asus', 'ZenFone Go (ZB551KL)' ], 'X013DA' => [ 'Asus', 'ZenFone Go (ZB551KL)' ], 'X013DB' => [ 'Asus', 'ZenFone Go (ZB551KL)' ], @@ -1872,7 +1925,9 @@ 'X013DB' => [ 'Asus', 'ZenFone Go TV (ZB551KL)' ], 'X013DC' => [ 'Asus', 'ZenFone Go (ZB551KL)' ], 'ZB551KL' => [ 'Asus', 'ZenFone Go (ZB551KL)' ], + 'X00ID' => [ 'Asus', 'ZenFone 4 Max (ZC554KL)' ], 'X014D' => [ 'Asus', 'ZenFone Go (ZB452KG)' ], + 'X018D' => [ 'Asus', 'ZenFone Max Plus M1 (ZB570TL)' ], 'Z002' => [ 'Asus', 'ZenFone 6 (A601CG)' ], 'Z007' => [ 'Asus', 'ZenFone C (ZC451CG)' ], 'ZenFone 2' => [ 'Asus', 'ZenFone 2 (ZE550ML)' ], @@ -1934,7 +1989,10 @@ 'Z01HDA' => [ 'Asus', 'ZenFone 3 Zoom (ZE553KL)' ], 'Z01KD' => [ 'Asus', 'ZenFone 4 (ZE554KL)' ], 'Z01KDA' => [ 'Asus', 'ZenFone 4 (ZE554KL)' ], + 'Z01MD' => [ 'Asus', 'ZenFone 4 Selfie Pro (ZD552KL)' ], 'Z01MDA' => [ 'Asus', 'ZenFone 4 Selfie Pro (ZD552KL)' ], + 'Z01RD' => [ 'Asus', 'ZenFone 5z (ZS620KL)' ], + 'Z01QD' => [ 'Asus', 'ROG Phone' ], 'ZB500KG' => [ 'Asus', 'ZenFone Go (ZB500KG)' ], 'ZB500KL' => [ 'Asus', 'ZenFone Go (ZB500KL)' ], @@ -1947,6 +2005,7 @@ 'ZE552KL' => [ 'Asus', 'ZenFone 3 (ZE552KL)' ], 'ZE553KL' => [ 'Asus', 'ZenFone 3 Zoom (ZE553KL)' ], 'ZE554KL' => [ 'Asus', 'ZenFone 4 (ZE554KL)' ], + 'ZS671KS' => [ 'Asus', 'ZenFone 7 Pro (ZS671KS)' ], 'Z00YD' => [ 'Asus', 'Live' ], 'X002' => [ 'Asus', 'Pegasus' ], @@ -2240,7 +2299,24 @@ 'BBE100-[0-9]!' => [ 'BlackBerry', '"BBE100"' ], 'BBF100-[0-9]!' => [ 'BlackBerry', 'KEY2' ], + 'A80Plus' => [ 'Blackview', 'A80 Plus' ], + 'A80Pro' => [ 'Blackview', 'A80 Pro' ], + 'BL6000Pro' => [ 'Blackview', 'BL6000 Pro' ], + 'BV4900Pro' => [ 'Blackview', 'BV4900 Pro' ], + 'BV5500Plus' => [ 'Blackview', 'BV5500 Plus' ], + 'BV5900' => [ 'Blackview', 'BV5900' ], + 'BV6300Pro' => [ 'Blackview', 'BV6300 Pro' ], + 'BV6600' => [ 'Blackview', 'BV6600' ], + 'BV6900' => [ 'Blackview', 'BV6900' ], 'BV8000Pro' => [ 'Blackview', 'BV8000 Pro' ], + 'BV9100' => [ 'Blackview', 'BV9100' ], + 'BV9500' => [ 'Blackview', 'BV9500' ], + 'BV9500Plus' => [ 'Blackview', 'BV9500 Plus' ], + 'BV9600E' => [ 'Blackview', 'BV9600E' ], + 'BV9600Pro' => [ 'Blackview', 'BV9600 Pro' ], + 'BV9800Pro' => [ 'Blackview', 'BV9800 Pro' ], + 'BV9900E' => [ 'Blackview', 'BV9900E' ], + 'BV9900Pro' => [ 'Blackview', 'BV9900 Pro' ], 'P2Lite' => [ 'Blackview', 'P2 Lite' ], 'Endeavour!!' => [ @@ -2414,6 +2490,7 @@ 'BLU VIVO SELFIE' => [ 'BLU', 'Vivo Selfie' ], 'VIVO XL' => [ 'BLU', 'Vivo XL' ], 'Vivo XL2' => [ 'BLU', 'Vivo XL2' ], + 'Vivo XI PLUS' => [ 'BLU', 'Vivo XI+' ], ], 'R1 HD' => [ 'BLU', 'R1 HD' ], @@ -2584,6 +2661,7 @@ 'Aquaris U Lite' => [ 'bq', 'Aquaris U Lite' ], 'Aquaris U Plus' => [ 'bq', 'Aquaris U Plus' ], 'Aquaris X' => [ 'bq', 'Aquaris X' ], + 'Aquaris X2' => [ 'bq', 'Aquaris X2' ], 'Aquaris X5' => [ 'bq', 'Aquaris X5' ], 'Aquaris X5 Plus' => [ 'bq', 'Aquaris X5 Plus' ], 'bq Curie' => [ 'bq', 'Curie', DeviceType::TABLET ], @@ -2636,6 +2714,8 @@ 'Bush Mytablet 2' => [ 'Bush', 'MyTablet 2', DeviceType::TABLET ], ], + 'Carbon 1 Mark II' => [ 'Carbon', '1 MK II' ], + 'CT[0-9]{3,4}!!' => [ 'CT700' => [ 'Carrefour', 'Touch Tablet CT700', DeviceType::TABLET ], 'CT701' => [ 'Carrefour', 'Touch Tablet CT701', DeviceType::TABLET ], @@ -2697,9 +2777,15 @@ 'B15' => [ 'CAT', 'B15' ], 'B15Q' => [ 'CAT', 'B15Q' ], 'S30' => [ 'CAT', 'S30' ], + 'S31' => [ 'CAT', 'S31' ], 'S40' => [ 'CAT', 'S40' ], + 'S41' => [ 'CAT', 'S41' ], + 'S42' => [ 'CAT', 'S42' ], 'S50' => [ 'CAT', 'S50' ], 'S50c' => [ 'CAT', 'S50c' ], + 'S52' => [ 'CAT', 'S52' ], + 'S61' => [ 'CAT', 'S61' ], + 'S62 Pro' => [ 'CAT', 'S62 Pro' ], 'CAT!!' => [ 'Cat Comet' => [ 'CAT', 'COMET', DeviceType::TABLET ], @@ -3433,6 +3519,11 @@ 'CROSSCALL WILD' => [ 'Crosscall', 'WILD' ], ], + 'Core-M5' => [ 'Crosscall', 'Core-M5' ], + 'Action-X3' => [ 'Crosscall', 'Action-X3' ], + 'TREKKER-X3' => [ 'Crosscall', 'Trekker-X3' ], + 'Trekker-X4' => [ 'Crosscall', 'Trekker-X4' ], + 'Novapad!!' => [ 'Novapad 70 D124 FC' => [ 'Crypto', 'NovaPad 70 D124', DeviceType::TABLET ], 'Novapad 70 S124 FC' => [ 'Crypto', 'NovaPad 70 S124', DeviceType::TABLET ], @@ -3455,13 +3546,18 @@ 'CUBOT ONE-S' => [ 'Cubot', 'One S' ], 'CUBOT P7' => [ 'Cubot', 'P7' ], 'CUBOT P9' => [ 'Cubot', 'P9' ], + 'CUBOT P20' => [ 'Cubot', 'P20' ], 'CUBOT S108' => [ 'Cubot', 'S108' ], 'CUBOT S222' => [ 'Cubot', 'S222' ], 'CUBOT X6' => [ 'Cubot', 'X6' ], + 'CUBOT X18 Plus' => [ 'Cubot', 'X18 Plus' ], + 'CUBOT POWER' => [ 'Cubot', 'Power' ], ], 'S222' => [ 'Cubot', 'S222' ], 'S308' => [ 'Cubot', 'S308' ], + 'KINGKONG 5 Pro' => [ 'Cubot', 'King Kong 5 Pro' ], + 'KINGKONG MINI2' => [ 'Cubot', 'King Kong Mini 2' ], '(CUBE ?)?(K8|U1|U2|U3|U5|U6|U8|U9)[0-9]?GT!!' => [ 'CUBE K8GT' => [ 'Cube', 'K8GT', DeviceType::TABLET ], @@ -3586,6 +3682,7 @@ ], 'Cydle M7!' => [ 'Cydle', 'M7 MultiPAD', DeviceType::TABLET ], + 'CS45XA' => [ 'Cyrus', 'CS45XA' ], 'EVDO1000' => [ 'Cyrus', 'EVDO 1000' ], 'GloryG1000' => [ 'Cyrus', 'Glory G1000' ], 'TVPAD Slim K3409' => [ 'Cyrus', 'TVPad Slim K3409', DeviceType::TABLET ], @@ -3709,6 +3806,7 @@ 'Dell XCD35' => [ 'Dell', 'XCD35' ], 'XCD35' => [ 'Dell', 'XCD35' ], 'DEM752HCF' => [ 'Denver', 'TAC-7018', DeviceType::TABLET ], + 'TIQ-1049' => [ 'Denver', 'TIQ-1049', DeviceType::TABLET ], '(DENVER-)?TA[CD]-[0-9]{4,5}!!' => [ 'TAC-7028' => [ 'Denver', 'TAC-7028', DeviceType::TABLET ], @@ -3930,6 +4028,11 @@ 'Discovery2-DG500C' => [ 'Doogee', 'Discovery 2 DG500C' ], 'DG750 Iron Bone' => [ 'Doogee', 'Iron Bone DG750' ], 'TURBO DG2014' => [ 'Doogee', 'Turbo DG2014' ], + 'S58Pro' => [ 'Doogee', 'S58 Pro' ], + 'S68Pro' => [ 'Doogee', 'S68 Pro' ], + 'S70Lite' => [ 'Doogee', 'S70 Lite' ], + 'S88Pro' => [ 'Doogee', 'S88 Pro' ], + 'S96Pro' => [ 'Doogee', 'S96 Pro' ], 'DOOV!!' => [ 'DOOV C1' => [ 'DOOV', 'C1' ], @@ -3980,9 +4083,12 @@ ], 'Doro 8030' => [ 'Doro', 'Liberto 822' ], + 'Doro 8040' => [ 'Doro', '8040' ], 'Doro 824' => [ 'Doro', 'Liberto 824' ], '825 T-Mobile' => [ 'Doro', 'Liberto 825' ], 'Doro PhoneEasy 745' => [ 'Doro', 'PhoneEasy 745' ], + 'DSB-0220' => [ 'Doro', '8080' ], + 'DSB-0230' => [ 'Doro', '8050' ], 'M975' => [ 'Double Power', 'M975', DeviceType::TABLET ], 'TD-1010' => [ 'Double Power', 'TD-1010', DeviceType::TABLET ], 'Tablet-P27' => [ 'DracoTek', 'P27 Tablet', DeviceType::TABLET ], @@ -4215,6 +4321,9 @@ 'E8051HD' => [ 'Evertek', 'Everpad E8051HD', DeviceType::TABLET ], ], + 'EVOLVEO StrongPhone G7' => [ 'EVOLVEO', 'StrongPhone G7' ], + 'EVOLVEO StrongPhone G9' => [ 'EVOLVEO', 'StrongPhone G9' ], + 'P10AN' => [ 'Exper', 'Easypad P10AN', DeviceType::TABLET ], '(Explay|X-tremer|ActiveD|Informer|Surfer)!!' => [ @@ -4271,6 +4380,8 @@ 'FP1' => [ 'Fairphone', '1' ], 'FP1U' => [ 'Fairphone', '1' ], 'FP2' => [ 'Fairphone', '2' ], + 'FP3' => [ 'Fairphone', '3' ], + 'FP4' => [ 'Fairphone', '4' ], 'FDT!!' => [ 'FDT C838' => [ 'FDT', 'C838' ], @@ -4715,6 +4826,19 @@ 'Gigaset QV1030' => [ 'Gigaset', 'QV1030', DeviceType::TABLET ], ], + 'GS110' => [ 'Gigaset', 'GS110' ], + 'GS185' => [ 'Gigaset', 'GS185' ], + 'GS190' => [ 'Gigaset', 'GS190' ], + 'GS195' => [ 'Gigaset', 'GS195' ], + 'GS270' => [ 'Gigaset', 'GS270' ], + 'GS270 plus' => [ 'Gigaset', 'GS270 Plus' ], + 'GS280' => [ 'Gigaset', 'GS280' ], + 'GS290' => [ 'Gigaset', 'GS290' ], + 'GS370 Plus' => [ 'Gigaset', 'GS370 Plus' ], + 'E940-2795-00' => [ 'Gigaset', 'GS4' ], + 'E940-2796-00' => [ 'Gigaset', 'GS4' ], + 'GX290' => [ 'Gigaset', 'GX290' ], + '80-1' => [ 'Gigaset', 'Maxwell 10', DeviceType::DECT ], 'SL930' => [ 'Gigaset', 'SL930', DeviceType::DECT ], @@ -4970,6 +5094,14 @@ 'X710d' => [ 'Haipai', 'X710D' ], 'X720D' => [ 'Haipai', 'X720D' ], + 'Hammer Blade2 PRO' => [ 'Hammer', 'Blade 2 Pro' ], + 'Hammer Blade 3' => [ 'Hammer', 'Blade 3' ], + 'Hammer Energy' => [ 'Hammer', 'Energy' ], + 'Hammer Energy 2' => [ 'Hammer', 'Energy 2' ], + 'Hammer Energy 18x9' => [ 'Hammer', 'Energy 18x9' ], + 'Hammer Explorer' => [ 'Hammer', 'Explorer' ], + 'Hammer Explorer Pro' => [ 'Hammer', 'Explorer Pro' ], + 'SN[0-9]!!' => [ 'SN10T1' => [ 'HANNspree', 'HANNSpad SN10T1', DeviceType::TABLET ], 'SN10T2' => [ 'HANNspree', 'HANNSpad SN10T2', DeviceType::TABLET ], @@ -5199,7 +5331,9 @@ 'Hisense HS-E910' => [ 'Hisense', 'E910' ], 'Hisense EG909' => [ 'Hisense', 'EG909' ], 'HS-Hisense F20T' => [ 'Hisense', 'F20T' ], + 'Hisense F24' => [ 'Hisense', 'F24' ], 'Hisense F31' => [ 'Hisense', 'F31' ], + 'Hisense Infinity H12' => [ 'Hisense', 'Infinity H12' ], 'HS-Hisense I632T' => [ 'Hisense', 'I632T' ], 'HS-Hisense I635T' => [ 'Hisense', 'I635T' ], 'HS-Hisense I639T' => [ 'Hisense', 'I639T' ], @@ -5787,6 +5921,7 @@ 'HTC M9(e|pt|px|u|w)!' => [ 'HTC', 'One (M9)' ], 'HTC One M9PLUS' => [ 'HTC', 'One (M9 Plus)' ], 'HTC One M9PLUS Prime Camera Edition' => [ 'HTC', 'One (M9 Plus)' ], + 'HTC One M9 Prime Camera Edition' => [ 'HTC', 'One (M9 Prime)' ], 'HTC M9pw' => [ 'HTC', 'One (M9 Plus)' ], 'HTC 0PK71' => [ 'HTC', 'One (M9 Plus)' ], 'HTC 0PK72' => [ 'HTC', 'One (M9 Plus)' ], @@ -5883,10 +6018,13 @@ 'HTC U-3w' => [ 'HTC', 'U11'], 'HTC U-3u' => [ 'HTC', 'U11'], 'HTC 2PZC100' => [ 'HTC', 'U11'], + 'HTC U11 life' => [ 'HTC', 'U11 Life'], + 'HTC U11 plus' => [ 'HTC', 'U11 Plus'], 'HTC 2Q4D200' => [ 'HTC', 'U11 Plus'], 'HTC 2Q3F2' => [ 'HTC', 'U11 Plus'], 'HTC 2Q3F3' => [ 'HTC', 'U11 Plus'], 'HTC U12+' => [ 'HTC', 'U12+'], + 'HTC U12 life' => [ 'HTC', 'U12 Life'], 'HTC Velocity!' => [ 'HTC', 'Velocity 4G'], 'HTCVelocity 4G' => [ 'HTC', 'Velocity 4G'], 'HTC Vivid' => [ 'HTC', 'Vivid'], @@ -5987,6 +6125,7 @@ 'One V' => [ 'HTC', 'One V' ], 'One' => [ 'HTC', 'One' ], 'One M7' => [ 'HTC', 'One' ], + 'One Max' => [ 'HTC', 'One Max' ], 'EndeavorU' => [ 'HTC', 'One X' ], '2PQ93' => [ 'HTC', 'One (A9)' ], 'm8wl' => [ 'HTC', 'One (M8)' ], @@ -6121,7 +6260,7 @@ 'Huawei MediaPad T1 7.0 3G' => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ], 'Huawei MediaPad T1 8.0 4G' => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ], 'Huawei MediaPad T1 10 4G' => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ], - + 'MediaPad!!' => [ 'MediaPad' => [ 'Huawei', 'MediaPad', DeviceType::TABLET ], 'MediaPad 7 FHD' => [ 'Huawei', 'MediaPad 7', DeviceType::TABLET ], @@ -6191,19 +6330,24 @@ 'BGO-(DL09|L03)!' => [ 'Huawei', 'MediaPad T2', DeviceType::TABLET ], 'KOB-(L09|W09)!' => [ 'Huawei', 'MediaPad T3', DeviceType::TABLET ], 'AGS-(L09|W09)!' => [ 'Huawei', 'MediaPad T3', DeviceType::TABLET ], - 'BG2-(U01)!' => [ 'Huawei', 'MediaPad T3', DeviceType::TABLET ], + 'BG2-(U01|W09)!' => [ 'Huawei', 'MediaPad T3', DeviceType::TABLET ], + 'AGS2-(L09|W09)!' => [ 'Huawei', 'MediaPad T5', DeviceType::TABLET ], + 'KOB2-(W09)!' => [ 'Huawei', 'MediaPad T8', DeviceType::TABLET ], 'BTV-(DL09|W09)!' => [ 'Huawei', 'MediaPad M3', DeviceType::TABLET ], 'CPN-(W09|AL00|L09)!' => [ 'Huawei', 'MediaPad M3 Lite', DeviceType::TABLET ], 'BAH-(W09|AL00|L09)!' => [ 'Huawei', 'MediaPad M3 Lite', DeviceType::TABLET ], + 'SHT-W09' => [ 'Huawei', 'MediaPad M5', DeviceType::TABLET ], 'CMR-(AL09|AL19|W09|W19)!' => [ 'Huawei', 'MediaPad M5', DeviceType::TABLET ], 'BAH2-(AL10|L09|W09|W19)!' => [ 'Huawei', 'MediaPad M5 Lite', DeviceType::TABLET ], 'SCM-(AL09|W09)!' => [ 'Huawei', 'MediaPad M6', DeviceType::TABLET ], + 'BAH3-(W09)!' => [ 'Huawei', 'MatePad 10.4', DeviceType::TABLET ], + 'JDN-W09' => [ 'Huawei', 'Honor Pad 2', DeviceType::TABLET ], 'JDN2-AL00HN' => [ 'Huawei', 'Honor Tab 5', DeviceType::TABLET ], 'JDN2-W09HN' => [ 'Huawei', 'Honor Tab 5', DeviceType::TABLET ], - '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NXT|SNE|TAS|Z100)!!' => [ + '(HUAWEI )?(ALP|BLA|CRR|EVR|HMA|LIO|LON|LYA|MATE|MHA|MT1|MT2|MT7|M200|NOH|NXT|SNE|TAS|Z100)!!' => [ '(HW-|HUAWEI )?MT1-(T00|U06)!' => [ 'Huawei', 'Ascend Mate' ], '(HW-|HUAWEI )?MATE-U06!' => [ 'Huawei', 'Ascend Mate' ], '(HW-|HUAWEI )?MT2-?(C00|L01|L02|L03|L05)!' => [ 'Huawei', 'Ascend Mate 2' ], @@ -6221,24 +6365,26 @@ '(HW-|HUAWEI )?LYA-(AL00|AL00P|AL10|L09|L0C|L29|TL00)!' => [ 'Huawei', 'Mate 20 Pro' ], '(HW-|HUAWEI )?TAS-(AL00)!' => [ 'Huawei', 'Mate 30' ], '(HW-|HUAWEI )?LIO-(AL00|AN00|L29)!' => [ 'Huawei', 'Mate 30 Pro' ], + '(HW-|HUAWEI )?NOH-(NX9)!' => [ 'Huawei', 'Mate 40' ], '(HW-|HUAWEI )?CRR-(L09|CL00|CL20|TL00|UL00|UL20)!' => [ 'Huawei', 'Mate S' ], ], - '(HW-|HUAWEI )?(ATU|DRA|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!' => [ + '(HW-|HUAWEI )?(ATU|DRA|DVC|FLA|JKM|TIT|TAG||MRD|NCE|POT|TRT|SLA)!!' => [ '(HW-|HUAWEI )?TIT-(AL00|CL00|CL10|L01|TL00|U02)!' => [ 'Huawei', 'Enjoy 5' ], '(HW-|HUAWEI )?TAG-(AL00|CL00|L13|TL00)!' => [ 'Huawei', 'Enjoy 5S' ], '(HW-|HUAWEI )?NCE-(AL00|AL10|TL10)!' => [ 'Huawei', 'Enjoy 6' ], '(HW-|HUAWEI )?SLA-(AL00|L02|L03|L22|TL10)!' => [ 'Huawei', 'Enjoy 7' ], '(HW-|HUAWEI )?TRT-(AL00|L21|L53|LX1|LX2|LX3|TL10)!' => [ 'Huawei', 'Enjoy 7 Plus' ], '(HW-|HUAWEI )?FLA-(AL10|AL20|LX1|LX2|LX3|TL10)!' => [ 'Huawei', 'Enjoy 8 Plus' ], - '(HW-|HUAWEI )?DRA-(AL00|L01|L21|LX2)!' => [ 'Huawei', 'Enjoy 8e' ], + '(HW-|HUAWEI )?DRA-(AL00|L01|L21|LX2|LX9)!' => [ 'Huawei', 'Enjoy 8e' ], '(HW-|HUAWEI )?ATU-(AL10|L11|L21|L22|L31|LX3|TL10)!' => [ 'Huawei', 'Enjoy 8e' ], '(HW-|HUAWEI )?POT-(AL00a|LX1|LX1AF|LX1T|LX2J|LX3)!' => [ 'Huawei', 'Enjoy 9S' ], '(HW-|HUAWEI )?MRD-(AL00|LX1|LX1F|LX1N|LX2|LX3)!' => [ 'Huawei', 'Enjoy 9e' ], '(HW-|HUAWEI )?JKM-(AL00|AL00a|AL00b|LX1|LX2|LX3|TL00)!' => [ 'Huawei', 'Enjoy 9 Plus' ], + '(HW-|HUAWEI )?DVC-(AN20)!' => [ 'Huawei', 'Enjoy 20 Pro' ], ], - '(HW-|HUAWEI |HONOR )?(ATH|BLN|BKL|BKK|BND|CHE|CHM|COL|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|JMM|JSN|LRA|KIW|LLD|NEM|NMO|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!' => [ + '(HW-|HUAWEI |HONOR )?(ATH|AUM|BLN|BKL|BKK|BND|CHE|CHM|COL|COR|DUA|DUK|DLI|EDI|FRD|HLK|HN3|H30|H60|HOL|HRY|JAT|JMM|JSN|LRA|KIW|KSA|LLD|NEM|NMO|NTH|NTN|OXF|PE|PCT|PLK|RNE|SCL|TNY|KNT|CAM|STF|HDN|YAL)!!' => [ 'H30 U10' => [ 'Huawei', 'Honor 3C' ], '(HW-|HUAWEI )?HN3-(U00|U01)!' => [ 'Huawei', 'Honor 3' ], '(HW-|HUAWEI |HONOR )?H30[- ](C00|L01|L02|T00|T10|U10)!' => [ 'Huawei', 'Honor 3C' ], @@ -6257,11 +6403,14 @@ '(HW-|HUAWEI )?PE-(CL00|TL00|TL00M|TL10|TL20|UL00)!' => [ 'Huawei', 'Honor 6 Plus' ], '(HW-|HUAWEI |HONOR )?PLK-(L01|AL10|CL00|UL00|TL00|TL01H)!' => [ 'Huawei', 'Honor 7' ], '(HW-|HUAWEI )?ATH-(AL00|CL00|TL00|TL00H|UL00)!' => [ 'Huawei', 'Honor 7i' ], + '(HW-|HUAWEI )?AUM-(L29)!' => [ 'Huawei', 'Honor 7A' ], '(HW-|HUAWEI )?DUA-(L22)!' => [ 'Huawei', 'Honor 7S' ], '(HW-|HUAWEI )?BND-(AL00|AL10|L21|L24|L31|L34|TL10)!' => [ 'Huawei', 'Honor 7X' ], '(HW-|HUAWEI )?DUA-(AL00|TL00)!' => [ 'Huawei', 'Honor 7 Play' ], '(HW-|HUAWEI )?FRD-(AL00|AL10|DL00|L02|L04|L09|L14|L19)!' => [ 'Huawei', 'Honor 8' ], + '(HW-|HUAWEI )?JAT-(L29|L41|LX1|LX3)!' => [ 'Huawei', 'Honor 8A Pro' ], '(HW-|HUAWEI )?BKK-(AL00|AL10|L21|LX2)!' => [ 'Huawei', 'Honor 8C' ], + '(HW-|HUAWEI )?KSA-(LX9)!' => [ 'Huawei', 'Honor 8S' ], '(HW-|HUAWEI )?JSN-(AL00|AL00a|L21|L22|L23|L42|TL00)!' => [ 'Huawei', 'Honor 8X' ], '(HW-|HUAWEI )?ATH-(UL01|UL06)!' => [ 'Huawei', 'Honor ShotX' ], '(HW-|HUAWEI )?KNT-(AL10|AL20|TL10|UL10)!' => [ 'Huawei', 'Honor V8' ], @@ -6271,14 +6420,18 @@ '(HW-|HUAWEI )?RNE-(AL00|L01|L02|L03|L21|L22|L23|L31)!' => [ 'Huawei', 'Honor 9i' ], '(HW-|HUAWEI )?HLK-(AL00|AL10)!' => [ 'Huawei', 'Honor 9X' ], '(HW-|HUAWEI )?COL-(AL00|AL10|L29|TL00|TL10)!' => [ 'Huawei', 'Honor 10' ], + '(HW-|HUAWEI )?HRY-(LX1)!' => [ 'Huawei', 'Honor 10 Lite' ], '(HW-|HUAWEI )?YAL-(AL00|AL10|L21|L41)!' => [ 'Huawei', 'Honor 20' ], '(HW-|HUAWEI )?LRA-(AL00)!' => [ 'Huawei', 'Honor 20 Lite' ], + '(HW-|HUAWEI )?NTH-(NX9)!' => [ 'Huawei', 'Honor 50' ], + '(HW-|HUAWEI )?NTN-(LX1)!' => [ 'Huawei', 'Honor 50 Lite' ], '(HW-|HUAWEI )?DUK-(AL20|L09|TL30)!' => [ 'Huawei', 'Honor V9' ], '(HW-|HUAWEI )?JMM-(AL00|AL10|L22|L22HN|TL00)!' => [ 'Huawei', 'Honor V9 Play' ], '(HW-|HUAWEI )?BKL-(AL00|AL20|L04|L09)!' => [ 'Huawei', 'Honor V10' ], '(HW-|HUAWEI )?PCT-(AL10|L29|TL10)!' => [ 'Huawei', 'Honor V20' ], '(HW-|HUAWEI )?OXF-(AN10)!' => [ 'Huawei', 'Honor V30 Pro' ], '(HW-|HUAWEI )?TNY-(AL00)!' => [ 'Huawei', 'Honor Magic 2' ], + '(HW-|HUAWEI )?COR-(AL10|L29)!' => [ 'Huawei', 'Honor Play' ], '(HW-|HUAWEI )?HDN-(L09|W09)!' => [ 'Huawei', 'Honor WaterPlay', DeviceType::TABLET ], ], @@ -6289,7 +6442,7 @@ '(HW-|HUAWEI )?BLL-(L21|L22|L23)!' => [ 'Huawei', 'GR5 (2017)' ], ], - '(HW-|HUAWEI )?(ALE|ANE|CLT|D2|DAV|ELE|EML|EVA|FIG|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!' => [ + '(HW-|HUAWEI )?(ALE|ANA|ANE|CDY|CLT|D2|DAV|ELE|ELS|EML|EVA|FIG|G6|G7|GRA|JNY|MAR|M100|P2|P6|P7|PPA|PRA|RIO|SC|Sophia|STK|VIE|VKY|VNS|VOG|VTR|WAS)!!' => [ 'HUAWEI D2' => [ 'Huawei', 'Ascend D2' ], '(HW-|HUAWEI )?D2-(0082|2010|5000|6070|6114)!' => [ 'Huawei', 'Ascend D2' ], '(HW-|HUAWEI )?G6-(C00|L11|L22|L33|T00|U00|U10|U34|U251)!' => [ 'Huawei', 'Ascend G6' ], @@ -6314,33 +6467,45 @@ '(HW-|HUAWEI )?WAS-?(AL00|L03T|LX1|LX1A|LX2|LX2J|LX3|TL10)!' => [ 'Huawei', 'P10 Lite' ], '(HW-|HUAWEI )?VKY-?(AL00|L09|L29|TL00)!' => [ 'Huawei', 'P10 Plus' ], '(HW-|HUAWEI )?FIG-?(AL00|AL10|LA1|LX1|LX3|TL00)!' => [ 'Huawei', 'P Smart' ], - '(HW-|HUAWEI )?STK-?(L22|LX1|LX3)!' => [ 'Huawei', 'P Smart Z' ], + '(HW-|HUAWEI )?STK-?(L21|L22|LX1|LX3)!' => [ 'Huawei', 'P Smart Z' ], + '(HW-|HUAWEI )?PPA-?(LX1|LX2)!' => [ 'Huawei', 'P Smart (2021)' ], '(HW-|HUAWEI )?EML-?(AL00|L09|L29|TL00)!' => [ 'Huawei', 'P20' ], '(HW-|HUAWEI )?ANE-?(AL00|L21|LX1|LX2|LX2J|LX3)!' => [ 'Huawei', 'P20 Lite' ], '(HW-|HUAWEI )?CLT-?(AL00|AL01|L04|L09|L29|L39|TL00|TL01)!' => [ 'Huawei', 'P20 Pro' ], '(HW-|HUAWEI )?ELE-?(AL00|L04|L09|L29|TL00)!' => [ 'Huawei', 'P30' ], '(HW-|HUAWEI )?VOG-?(AL00|AL10|L04|L09|L29|TL00)!' => [ 'Huawei', 'P30 Pro' ], + '(HW-|HUAWEI )?MAR-?(LX1B)!' => [ 'Huawei', 'P30 Lite' ], + '(HW-|HUAWEI )?ANA-?(NX9)!' => [ 'Huawei', 'P40' ], + '(HW-|HUAWEI )?JNY-?(LX1)!' => [ 'Huawei', 'P40 Lite' ], + '(HW-|HUAWEI )?CDY-?(NX9A)!' => [ 'Huawei', 'P40 Lite' ], + '(HW-|HUAWEI )?ELS-?(N39|NX9)!' => [ 'Huawei', 'P40 Pro' ], ], 'Rock-(AL00|CL00|L01|L03)!' => [ 'Huawei', 'Ascend G7' ], 'HUAWEI A168-(AL10|DL09|L09|L29)!' => [ 'Huawei', 'P9' ], - '(HW-|HUAWEI )?(CRO|LUA|CUN|SCC|SCU|CAM|LDN|LYO|MYA)!!' => [ + '(HW-|HUAWEI )?(AMN|ART|AQM|CRO|LUA|CUN|DUB|SCC|SCU|CAM|LDN|LYO|MED|MYA)!!' => [ '(HW-|HUAWEI )?CRO-(L02|L03|L22|U00)!' => [ 'Huawei', 'Y3 (2017)' ], '(HW-|HUAWEI )?LUA-(L01|L02|L03|L13|L21|L22|L23|U02|U03|U22|U23)!' => [ 'Huawei', 'Y3 II' ], '(HW-|HUAWEI )?CUN-(AL00|L01|L02|L03|L21|L22|L23|L33|TL00|U29)!' => [ 'Huawei', 'Y5 II' ], '(HW-|HUAWEI )?MYA-(AL10|L02|L03|L11|L13|L22|L23|L41|TL10)!' => [ 'Huawei', 'Y5 (2017)' ], + '(HW-|HUAWEI )?AMN-(LX2|LX9)!' => [ 'Huawei', 'Y5 (2019)' ], '(HW-|HUAWEI )?SCC-(U21)!' => [ 'Huawei', 'Y6' ], '(HW-|HUAWEI )?SCU-(U31)!' => [ 'Huawei', 'Y6C' ], '(HW-|HUAWEI )?CAM-(L01|L03|L11|L21|L23|L32|AL00|CL00|TL00|UL00)!' => [ 'Huawei', 'Y6 II' ], '(HW-|HUAWEI )?LYO-(L01|L02|L21)!' => [ 'Huawei', 'Y6 II Compact' ], + '(HW-|HUAWEI )?MED-(LX9N)!' => [ 'Huawei', 'Y6p' ], '(HW-|HUAWEI )?LDN-(AL00|L01|L21|LX2|LX3|TL00)!' => [ 'Huawei', 'Y7 Prime (2018)' ], + '(HW-|HUAWEI )?DUB-(AL20|LX1|LX3)!' => [ 'Huawei', 'Y7 Prime (2019)' ], + '(HW-|HUAWEI )?ART-(L29)!' => [ 'Huawei', 'Y7p' ], + '(HW-|HUAWEI )?AQM-(LX1)!' => [ 'Huawei', 'Y8p' ], ], '(HW-|HUAWEI )?CAZ-(AL10|TL10|TL20)!' => [ 'Huawei', 'Nova' ], '(HW-|HUAWEI )?CAN-(L01|L11|L12)!' => [ 'Huawei', 'Nova' ], '(HW-|HUAWEI )?MLA-(L01|L03|L11|L12|L13)!' => [ 'Huawei', 'Nova Plus' ], '(HW-|HUAWEI )?DIG-(AL00|L01|L03|L21|TL10)!' => [ 'Huawei', 'Nova Smart' ], + '(HW-|HUAWEI )?PIC-(LX9)!' => [ 'Huawei', 'Nova 2' ], '(HW-|HUAWEI )?BAC-(AL00|L03|L21|L22|TL00)!' => [ 'Huawei', 'Nova 2 Plus' ], '(HW-|HUAWEI )?HWI-(AL00|TL00)!' => [ 'Huawei', 'Nova 2S' ], '(HW-|HUAWEI )?PAR-(AL00|LX1|LX1M|LX9|TL00)!' => [ 'Huawei', 'Nova 3' ], @@ -6772,6 +6937,7 @@ 'Ultra Wave' => [ 'Hyundai', 'Ultra Wave' ], 'A7 HD' => [ 'Hyundai', 'A7 HD', DeviceType::TABLET ], 'MW1031' => [ 'Hyundai', 'MW1031', DeviceType::TABLET ], + 'IS530' => [ 'I.safe', 'IS530.0' ], 'Elektra L' => [ 'i-Joy', 'Elektra L' ], 'Elektra XL' => [ 'i-Joy', 'Elektra XL' ], 'i-Joy i-Call' => [ 'i-Joy', 'i-Call' ], @@ -7135,6 +7301,8 @@ 'Infinix X1000' => [ 'Infinix', 'Joypad 10 X1000', DeviceType::TABLET ], ], + 'S5 Pro' => [ 'Infinix', 'S5 Pro' ], + 'IN[0-9]{3,3}!!' => [ 'IN260' => [ 'InFocus', 'IN260' ], 'IN330' => [ 'InFocus', 'IN330' ], @@ -7500,6 +7668,7 @@ 'IVIO DE38' => [ 'Ivio', 'DE38' ], ], + 'MC401 GWL' => [ 'iWaylink', 'MC401' ], 'iwoo i900' => [ 'iwoo', 'i900' ], '(JIAYU|JY)!!' => [ @@ -8086,6 +8255,9 @@ 'W810' => [ 'K-Touch', 'W810' ], 'W880' => [ 'K-Touch', 'W880' ], + 'Land Rover Explore' => [ 'Land Rover', 'Explore' ], + 'Land Rover Explore R' => [ 'Land Rover', 'Explore R' ], + '(Lanix )?(Ilium|llium)!!' => [ 'ILIUM L400' => [ 'Lanix', 'Ilium L400' ], 'Ilium L820' => [ 'Lanix', 'Ilium L820' ], @@ -8430,7 +8602,9 @@ 'Lenovo YT3-X50F' => [ 'Lenovo', 'Yoga Tablet 3', DeviceType::TABLET ], 'Lenovo YT3-X50L' => [ 'Lenovo', 'Yoga Tablet 3', DeviceType::TABLET ], 'Lenovo YT3-850F' => [ 'Lenovo', 'Yoga Tablet 3', DeviceType::TABLET ], + 'Lenovo YT-J706F' => [ 'Lenovo', 'Yoga Tab 11', DeviceType::TABLET ], 'Lenovo YT-X703F' => [ 'Lenovo', 'Yoga Tablet 3 Plus', DeviceType::TABLET ], + 'Lenovo YT-X705F' => [ 'Lenovo', 'Yoga Smart Tab', DeviceType::TABLET ], 'Lenovo YT3-X90F' => [ 'Lenovo', 'Yoga Tablet 3 Pro', DeviceType::TABLET ], 'Lenovo YT3-X90L' => [ 'Lenovo', 'Yoga Tablet 3 Pro', DeviceType::TABLET ], @@ -8449,6 +8623,28 @@ ], 'Lenovo TB-7304F' => [ 'Lenovo', 'Tab 7 Essential', DeviceType::TABLET ], + 'Lenovo TB-7305F' => [ 'Lenovo', 'Tab M7', DeviceType::TABLET ], + 'Lenovo TB-7305X' => [ 'Lenovo', 'Tab M7', DeviceType::TABLET ], + 'Lenovo TB-8304F1' => [ 'Lenovo', 'Tab 8', DeviceType::TABLET ], + 'Lenovo TB-8505FS' => [ 'Lenovo', 'Smart Tab M8', DeviceType::TABLET ], + 'Lenovo TB-8704X' => [ 'Lenovo', 'Tab 4 8 Plus', DeviceType::TABLET ], + 'Lenovo TB-8705F' => [ 'Lenovo', 'Tab M8', DeviceType::TABLET ], + 'Lenovo TB-J606F' => [ 'Lenovo', 'Tab P11', DeviceType::TABLET ], + 'Lenovo TB-J606L' => [ 'Lenovo', 'Tab P11', DeviceType::TABLET ], + 'Lenovo TB-J607Z' => [ 'Lenovo', 'Tab P11', DeviceType::TABLET ], + 'Lenovo TB-J616F' => [ 'Lenovo', 'Tab P11', DeviceType::TABLET ], + 'Lenovo TB-J706F' => [ 'Lenovo', 'Tab P11 Pro', DeviceType::TABLET ], + 'Lenovo TB-J716F' => [ 'Lenovo', 'XiaoXin Pad Pro 2021', DeviceType::TABLET ], + 'Lenovo TB-X104F' => [ 'Lenovo', 'Tab E10', DeviceType::TABLET ], + 'Lenovo TB-X304L' => [ 'Lenovo', 'Tab 4 10', DeviceType::TABLET ], + 'Lenovo TB-X306F' => [ 'Lenovo', 'Tab M10 HD', DeviceType::TABLET ], + 'Lenovo TB-X306X' => [ 'Lenovo', 'Tab M10 HD', DeviceType::TABLET ], + 'Lenovo TB-X505F' => [ 'Lenovo', 'Tab M10', DeviceType::TABLET ], + 'Lenovo TB-X605F' => [ 'Lenovo', 'Tab M10', DeviceType::TABLET ], + 'Lenovo TB-X605L' => [ 'Lenovo', 'Tab M10', DeviceType::TABLET ], + 'Lenovo TB-X606F' => [ 'Lenovo', 'Tab M11 FHD Plus', DeviceType::TABLET ], + 'Lenovo TB-X606X' => [ 'Lenovo', 'Tab M10 FHD Plus', DeviceType::TABLET ], + 'Lenovo TB-X6C6F' => [ 'Lenovo', 'Tab K10', DeviceType::TABLET ], 'Lenovo TB-X103F' => [ 'Lenovo', 'Tab 10', DeviceType::TABLET ], 'TB-X103F' => [ 'Lenovo', 'Tab 10', DeviceType::TABLET ], 'Lenovo TB2-X30F' => [ 'Lenovo', 'Tab 2 A10', DeviceType::TABLET ], @@ -8462,11 +8658,15 @@ 'Lenovo TB3-X70F' => [ 'Lenovo', 'Tab 3 10 Business', DeviceType::TABLET ], 'Lenovo TB3-X70L' => [ 'Lenovo', 'Tab 3 10 Business', DeviceType::TABLET ], 'Lenovo TB-8504F' => [ 'Lenovo', 'Tab 4 8', DeviceType::TABLET ], + 'Lenovo TB-8504X' => [ 'Lenovo', 'Tab 4 8', DeviceType::TABLET ], + 'Lenovo TB-8505F' => [ 'Lenovo', 'Tab M8 HD', DeviceType::TABLET ], 'Lenovo TB-8703F' => [ 'Lenovo', 'Tab 4 8 Plus', DeviceType::TABLET ], 'Lenovo TB-8704F' => [ 'Lenovo', 'Tab 4 8 Plus', DeviceType::TABLET ], 'Lenovo TB-X304F' => [ 'Lenovo', 'Tab 4 10', DeviceType::TABLET ], 'Lenovo TB-X704F' => [ 'Lenovo', 'Tab 4 10 Plus', DeviceType::TABLET ], 'Lenovo TB-X704L' => [ 'Lenovo', 'Tab 4 10 Plus', DeviceType::TABLET ], + 'Lenovo TB-X705F' => [ 'Lenovo', 'Tab P10', DeviceType::TABLET ], + 'Lenovo TB-X705L' => [ 'Lenovo', 'Tab P10', DeviceType::TABLET ], '(Lenovo ?)?(IdeaTab ?)?[KSV][0-9]{4,4}!!' => [ 'IdeaTab ?K2110A-(F)!' => [ 'Lenovo', 'IdeaTab K2110', DeviceType::TABLET ], @@ -8639,7 +8839,11 @@ 'Lenovo K50-t3s' => [ 'Lenovo', 'K3 Note' ], 'Lenovo K50-T5' => [ 'Lenovo', 'K3 Note' ], 'Lenovo K50t5' => [ 'Lenovo', 'K3 Note' ], + 'Lenovo K520' => [ 'Lenovo', 'S5' ], 'Lenovo K6' => [ 'Lenovo', 'K6' ], + 'Lenovo L38111' => [ 'Lenovo', 'Z6 Youth Edition' ], + 'Lenovo L78071' => [ 'Lenovo', 'Z5S' ], + 'Lenovo L79031' => [ 'Lenovo', 'Legion Pro' ], 'Lenovo N300' => [ 'Lenovo', 'N300', DeviceType::DESKTOP ], 'Lenovo N308' => [ 'Lenovo', 'N308', DeviceType::DESKTOP ], 'Lenovo N908' => [ 'Lenovo', 'N908' ], @@ -9423,12 +9627,22 @@ 'LGM-X800[KLS]!' => [ 'LG', 'Q8' ], ], + 'LM-F100!' => [ 'LG', 'Wing' ], 'LM-G710!' => [ 'LG', 'G7 ThinQ' ], 'LM-G715!' => [ 'LG', 'G7 ThinQ' ], 'LM-G810!' => [ 'LG', 'G8s ThinQ' ], 'LM-G820!' => [ 'LG', 'G8 ThinQ' ], + 'LM-G850!' => [ 'LG', 'G8 ThinQ' ], + 'LM-G900!' => [ 'LG', 'Velvet' ], + 'LM-G910!' => [ 'LG', 'Velvet 4G' ], + 'LM-K200!' => [ 'LG', 'K22' ], + 'LM-K410!' => [ 'LG', 'K41S' ], + 'LM-K420!' => [ 'LG', 'K42' ], + 'LM-K510!' => [ 'LG', 'K51s' ], + 'LM-K520!' => [ 'LG', 'K52' ], 'LM-Q610!' => [ 'LG', 'Q7' ], 'LM-Q617!' => [ 'LG', 'Q7 BTS Edition' ], + 'LM-Q630!' => [ 'LG', 'K61' ], 'LM-Q710!' => [ 'LG', 'Q Stylus+' ], 'LM-Q720!' => [ 'LG', 'Stylo 5' ], 'LM-Q725!' => [ 'LG', 'Q7 Plus' ], @@ -9440,6 +9654,8 @@ 'LM-V40[59]!' => [ 'LG', 'V40 ThinQ' ], 'LM-V450!' => [ 'LG', 'V50 ThinQ' ], 'LM-V500!' => [ 'LG', 'V50 ThinQ' ], + 'LM-V510!' => [ 'LG', 'V50S ThinQ' ], + 'LM-V600!' => [ 'LG', 'V60 ThinQ' ], 'LM-X120!' => [ 'LG', 'K20' ], 'LM-X210!' => [ 'LG', 'Aristo 2' ], 'LM-X212!' => [ 'LG', 'K8' ], @@ -9448,8 +9664,11 @@ 'LM-X410!' => [ 'LG', 'X4' ], 'LM-X415!' => [ 'LG', 'X4+' ], 'LM-X420!' => [ 'LG', 'X4 (2019)' ], + 'LM-X430!' => [ 'LG', 'K40S' ], 'LM-X510!' => [ 'LG', 'X5' ], + 'LM-X520!' => [ 'LG', 'K50' ], 'LM-X525!' => [ 'LG', 'K12 Prime' ], + 'LM-X540!' => [ 'LG', 'K50S' ], 'LM-X625!' => [ 'LG', 'X6 (2019)' ], 'LM-Y110!' => [ 'LG', 'Folder' ], @@ -9925,12 +10144,19 @@ 'LIFETAB E10312' => [ 'Medion', 'Lifetab E10312', DeviceType::TABLET ], 'LIFETAB E10316' => [ 'Medion', 'Lifetab E10316', DeviceType::TABLET ], 'LIFETAB E10320' => [ 'Medion', 'Lifetab E10320', DeviceType::TABLET ], + 'LIFETAB E1041X' => [ 'Medion', 'Lifetab E1041X', DeviceType::TABLET ], + 'LIFETAB E1042X' => [ 'Medion', 'Lifetab E1042X', DeviceType::TABLET ], + 'LIFETAB E1070X' => [ 'Medion', 'Lifetab E1070X', DeviceType::TABLET ], + 'LIFETAB E1071X' => [ 'Medion', 'Lifetab E1071X', DeviceType::TABLET ], + 'LIFETAB E1080X' => [ 'Medion', 'Lifetab E1080X', DeviceType::TABLET ], + 'LIFETAB E1091X' => [ 'Medion', 'Lifetab E1091X', DeviceType::TABLET ], 'LIFETAB P733X' => [ 'Medion', 'Lifetab P733X', DeviceType::TABLET ], 'LIFETAB P831X' => [ 'Medion', 'Lifetab P831X', DeviceType::TABLET ], 'LIFETAB P831X.2' => [ 'Medion', 'Lifetab P831X', DeviceType::TABLET ], 'LIFETAB P891X' => [ 'Medion', 'Lifetab P891X', DeviceType::TABLET ], + 'LIFETAB P970X' => [ 'Medion', 'Lifetab P970X', DeviceType::TABLET ], 'LIFETAB P1034X' => [ 'Medion', 'Lifetab P1034X', DeviceType::TABLET ], - 'P1035X' => [ 'Medion', 'Lifetab P1035X', DeviceType::TABLET ], + 'LIFETAB P1071X' => [ 'Medion', 'Lifetab P1071X', DeviceType::TABLET ], 'LIFETAB S7316' => [ 'Medion', 'Lifetab S7316', DeviceType::TABLET ], 'LIFETAB S732X' => [ 'Medion', 'Lifetab S732X', DeviceType::TABLET ], 'LIFETAB S785X' => [ 'Medion', 'Lifetab S785X', DeviceType::TABLET ], @@ -9941,7 +10167,6 @@ 'LIFETAB S1033X' => [ 'Medion', 'Lifetab S1033X', DeviceType::TABLET ], 'LIFETAB S1034X' => [ 'Medion', 'Lifetab S1034X', DeviceType::TABLET ], 'LIFETAB S1036X' => [ 'Medion', 'Lifetab S1036X', DeviceType::TABLET ], - 'X1030X' => [ 'Medion', 'Lifetab X1030X', DeviceType::TABLET ], 'MEDION LIFE P4012' => [ 'Medion', 'Life P4012' ], 'MEDION P4013' => [ 'Medion', 'Life P4013' ], 'MEDION-P4013' => [ 'Medion', 'Life P4013' ], @@ -9954,7 +10179,17 @@ 'MD LIFETAB P9516' => [ 'Medion', 'Lifetab P9516', DeviceType::TABLET ], ], + 'B5532' => [ 'Medion', 'B5532' ], + 'E1050X' => [ 'Medion', 'Lifetab E1050X', DeviceType::TABLET ], + 'E1051X' => [ 'Medion', 'Lifetab E1051X', DeviceType::TABLET ], + 'E1060X' => [ 'Medion', 'Lifetab E1060X', DeviceType::TABLET ], + 'P1035X' => [ 'Medion', 'Lifetab P1035X', DeviceType::TABLET ], 'P1050X' => [ 'Medion', 'Lifetab P1050X', DeviceType::TABLET ], + 'P1060X' => [ 'Medion', 'Lifetab P1060X', DeviceType::TABLET ], + 'P1061X' => [ 'Medion', 'Lifetab P1061X', DeviceType::TABLET ], + 'X1030X' => [ 'Medion', 'Lifetab X1030X', DeviceType::TABLET ], + 'X1031X' => [ 'Medion', 'Lifetab X1031X', DeviceType::TABLET ], + 'X1060X' => [ 'Medion', 'Lifetab X1060X', DeviceType::TABLET ], 'MEEG!!' => [ 'MEEG 101' => [ 'MEEG', '101' ], @@ -10289,6 +10524,9 @@ 'P300(Funbook)' => [ 'Micromax', 'Funbook P300', DeviceType::TABLET ], 'P701' => [ 'Micromax', 'Canvas Tab P701', DeviceType::TABLET ], + 'Surface Duo' => [ 'Microsoft', 'Surface Duo' ], + 'Surface Duo 2' => [ 'Microsoft', 'Surface Duo 2' ], + 'MLLED!!' => [ 'MLLED M1B' => [ 'MLLED', 'M1B' ], 'MLLED M2+' => [ 'MLLED', 'M2+' ], @@ -10680,17 +10918,27 @@ 'XT17(89)!' => [ 'Motorola', 'Moto Z2 Force' ], 'XT17(90)!' => [ 'Motorola', 'Moto G5S' ], 'XT18(02)!' => [ 'Motorola', 'Moto G5S Plus TV' ], - 'XT18(06)!' => [ 'Motorola', 'Moto G5S Plus' ], + 'XT18(05|06)!' => [ 'Motorola', 'Moto G5S Plus' ], 'XT19(02)!' => [ 'Lenovo', 'K8 Note' ], ], 'motorola one' => [ 'Motorola', 'One' ], + 'motorola one 5G ace' => [ 'Motorola', 'One Ace' ], 'motorola one action' => [ 'Motorola', 'One Action' ], + 'motorola one fusion+' => [ 'Motorola', 'One Fusion+' ], + 'motorola one hyper' => [ 'Motorola', 'One Hyper' ], 'motorola one macro' => [ 'Motorola', 'One Macro' ], 'motorola one power' => [ 'Motorola', 'One Power' ], 'motorola one vision' => [ 'Motorola', 'One Vision' ], 'motorola one zoom' => [ 'Motorola', 'One Zoom' ], + 'motorola edge' => [ 'Motorola', 'Edge' ], + 'motorola edge plus' => [ 'Motorola', 'Edge Plus' ], + 'motorola edge 20' => [ 'Motorola', 'Edge 20' ], + 'motorola edge 20 lite' => [ 'Motorola', 'Edge 20 Lite' ], + 'motorola edge 20 pro' => [ 'Motorola', 'Edge 20 Pro' ], + 'motorola edge 30 pro' => [ 'Motorola', 'Edge 30 Pro' ], + 'Atrix 2' => [ 'Motorola', 'ATRIX 2' ], 'Atrix 2 WeifanZ' => [ 'Motorola', 'ATRIX 2' ], 'Atrix 4G' => [ 'Motorola', 'ATRIX 4G' ], @@ -10748,8 +10996,21 @@ 'Moto E4' => [ 'Motorola', 'Moto E4' ], 'Moto E (4)' => [ 'Motorola', 'Moto E4' ], 'Moto E (4) Plus' => [ 'Motorola', 'Moto E4 Plus' ], + 'moto e5' => [ 'Motorola', 'Moto E5' ], 'moto e5 cruise' => [ 'Motorola', 'Moto E5 Cruise' ], 'moto e5 play' => [ 'Motorola', 'Moto E5 Play' ], + 'moto e5 plus' => [ 'Motorola', 'Moto E5 Plus' ], + 'moto e(6i)' => [ 'Motorola', 'Moto E6i' ], + 'moto e6s' => [ 'Motorola', 'Moto E6s' ], + 'moto e6 play' => [ 'Motorola', 'Moto E6 Play' ], + 'moto e(6) plus' => [ 'Motorola', 'Moto E6 Plus' ], + 'moto e(7)' => [ 'Motorola', 'Moto E7' ], + 'moto e(7) plus' => [ 'Motorola', 'Moto E7 Plus' ], + 'moto e(7) power' => [ 'Motorola', 'Moto E7 Power' ], + 'moto e(7i) power' => [ 'Motorola', 'Moto E7i Power' ], + 'moto e20' => [ 'Motorola', 'Moto E20' ], + 'moto e30' => [ 'Motorola', 'Moto E30' ], + 'moto e40' => [ 'Motorola', 'Moto E40' ], '(Moto)?G3$!' => [ 'Motorola', 'Moto G (2015)' ], '(Moto)?G3-TE$!' => [ 'Motorola', 'Moto G (2015)' ], 'Moto G 2015' => [ 'Motorola', 'Moto G (2015)' ], @@ -10757,7 +11018,11 @@ 'Moto G (2014' => [ 'Motorola', 'Moto G' ], 'MOTOROLA MOTOG' => [ 'Motorola', 'Moto G' ], 'Moto G Play' => [ 'Motorola', 'Moto G Play' ], + 'moto g power' => [ 'Motorola', 'Moto G Power' ], 'Moto G Turbo' => [ 'Motorola', 'Moto G Turbo' ], + 'moto g 5G' => [ 'Motorola', 'Moto G 5G' ], + 'moto g 5G plus' => [ 'Motorola', 'Moto G 5G Plus' ], + 'moto g pro' => [ 'Motorola', 'Moto G Pro' ], 'Moto G4' => [ 'Motorola', 'Moto G4' ], 'Moto G (4' => [ 'Motorola', 'Moto G4' ], 'Moto G (4)' => [ 'Motorola', 'Moto G4' ], @@ -10769,6 +11034,7 @@ 'Moto G (5S' => [ 'Motorola', 'Moto G5S' ], 'Moto G (5S)' => [ 'Motorola', 'Moto G5S' ], 'Moto G (5S) Plus' => [ 'Motorola', 'Moto G5S Plus' ], + 'Moto G (5S) Plus (XT1805)' => [ 'Motorola', 'Moto G5S Plus' ], 'moto g(6' => [ 'Motorola', 'Moto G6' ], 'moto g(6)' => [ 'Motorola', 'Moto G6' ], 'moto g(6) (XT1925DL)' => [ 'Motorola', 'Moto G6' ], @@ -10783,16 +11049,36 @@ 'moto g(7) power' => [ 'Motorola', 'Moto G7 Power' ], 'moto g(7) supra' => [ 'Motorola', 'Moto G7 Supra' ], 'moto g(8' => [ 'Motorola', 'Moto G8' ], + 'moto g(8)' => [ 'Motorola', 'Moto G8' ], + 'moto g(8) plus' => [ 'Motorola', 'Moto G8 Plus' ], + 'moto g(8) power' => [ 'Motorola', 'Moto G8 Power' ], + 'moto g(8) power lite' => [ 'Motorola', 'Moto G8 Power Lite' ], + 'moto g(9) play' => [ 'Motorola', 'Moto G9 Play' ], + 'moto g(9) plus' => [ 'Motorola', 'Moto G9 Plus' ], + 'moto g(9) power' => [ 'Motorola', 'Moto G9 Power' ], + 'moto g(10)' => [ 'Motorola', 'Moto G10' ], + 'moto g(20)' => [ 'Motorola', 'Moto G20' ], + 'moto g(30)' => [ 'Motorola', 'Moto G30' ], + 'moto g31(w)' => [ 'Motorola', 'Moto G31w' ], + 'moto g(50)' => [ 'Motorola', 'Moto G50' ], + 'moto g51 5G' => [ 'Motorola', 'Moto G51' ], + 'moto g(60)' => [ 'Motorola', 'Moto G60' ], + 'moto g(60)s' => [ 'Motorola', 'Moto G60s' ], + 'moto g(100)' => [ 'Motorola', 'Moto G100' ], + 'moto g200 5G' => [ 'Motorola', 'Moto G200' ], 'Moto Z (2)' => [ 'Motorola', 'Moto Z2' ], 'Moto Z2 Play' => [ 'Motorola', 'Moto Z2 Play' ], + 'Moto Z3 Play' => [ 'Motorola', 'Moto Z3 Play' ], 'Moto X Pro' => [ 'Motorola', 'Moto X Pro' ], 'moto x4' => [ 'Motorola', 'Moto X4' ], + 'moto z4' => [ 'Motorola', 'Moto Z4' ], 'roiX' => [ 'Motorola', 'Droid X' ], 'Moto Backflip' => [ 'Motorola', 'BACKFLIP' ], 'RAZR' => [ 'Motorola', 'RAZR' ], 'RAZR HD' => [ 'Motorola', 'RAZR HD' ], 'RAZR M' => [ 'Motorola', 'RAZR M' ], 'RAZR MAXX' => [ 'Motorola', 'RAZR MAXX' ], + 'motorola razr 5G' => [ 'Motorola', 'RAZR 5G' ], 'Triumph' => [ 'Motorola', 'TRIUMPH' ], 'Opus One' => [ 'Motorola', 'i1' ], 'Photon' => [ 'Motorola', 'PHOTON' ], @@ -11215,6 +11501,7 @@ 'Nokia 10.1' => [ 'Nokia', '10.1' ], 'Nokia N9' => [ 'Nokia', 'N9' ], 'Nokia N900' => [ 'Nokia', 'N900' ], + 'T20-Plus' => [ 'Nokia', 'T20 Plus' ], 'Nokia X' => [ 'Nokia', 'X', DeviceType::MOBILE, Flag::NOKIAX ], 'Nokia X Dual SIM' => [ 'Nokia', 'X', DeviceType::MOBILE, Flag::NOKIAX ], 'RM-980' => [ 'Nokia', 'X', DeviceType::MOBILE, Flag::NOKIAX ], @@ -11347,14 +11634,32 @@ 'ONEPLUS A6003' => [ 'OnePlus', '6' ], 'ONEPLUS A6010' => [ 'OnePlus', '6T' ], 'ONEPLUS A6013' => [ 'OnePlus', '6T' ], - 'HD190[01]!' => [ 'OnePlus', '7T' ], - 'HD191[03]!' => [ 'OnePlus', '7T Pro' ], + 'HD190[0135]!' => [ 'OnePlus', '7T' ], + 'HD191[0137]!' => [ 'OnePlus', '7T Pro' ], + 'OnePlus 7T Pro' => [ 'OnePlus', '7T Pro' ], 'GM190[0135]!' => [ 'OnePlus', '7' ], 'GM191[01357]!' => [ 'OnePlus', '7 Pro' ], + 'IN201[01357]!' => [ 'OnePlus', '8' ], + 'IN202[0135]!' => [ 'OnePlus', '8 Pro' ], + 'KB200[01357]!' => [ 'OnePlus', '8T' ], + 'LE2101' => [ 'OnePlus', '9T' ], + 'LE211[0135]!' => [ 'OnePlus', '9' ], + 'LE212[01357]!' => [ 'OnePlus', '9 Pro' ], + 'NE2213' => [ 'OnePlus', '10 Pro' ], 'ONE E1000' => [ 'OnePlus', 'X' ], 'ONE E1001' => [ 'OnePlus', 'X' ], 'ONE E1003' => [ 'OnePlus', 'X' ], 'ONE E1005' => [ 'OnePlus', 'X' ], + 'AC2001' => [ 'OnePlus', 'Nord' ], + 'AC2003' => [ 'OnePlus', 'Nord' ], + 'DN2101' => [ 'OnePlus', 'Nord 2' ], + 'DN2103' => [ 'OnePlus', 'Nord 2' ], + 'oneplus Nord 2 5G' => [ 'OnePlus', 'Nord 2' ], + 'EB2101' => [ 'OnePlus', 'Nord CE' ], + 'EB2103' => [ 'OnePlus', 'Nord CE' ], + 'IV2201' => [ 'OnePlus', 'Nord CE 2' ], + 'BE202[69]!' => [ 'OnePlus', 'Nord N10' ], + 'BE2013' => [ 'OnePlus', 'Nord N100' ], 'ONDA MID' => [ 'Onda', 'MID', DeviceType::TABLET ], 'ONDA A9 Core4' => [ 'Onda', 'A9 Quad Core', DeviceType::TABLET ], 'ONDA VI10' => [ 'Onda', 'VI10', DeviceType::TABLET ], @@ -11463,7 +11768,59 @@ 'CPH1859' => [ 'Oppo', 'F7 Youth' ], 'CPH1881' => [ 'Oppo', 'F9' ], 'CPH1823' => [ 'Oppo', 'F9 Pro' ], + 'CPH1831' => [ 'Oppo', 'R15 Pro' ], + 'CPH1837' => [ 'Oppo', 'A3' ], + 'CPH1871' => [ 'Oppo', 'Find X' ], + 'CPH1875' => [ 'Oppo', 'Find X' ], + 'CPH1877' => [ 'Oppo', 'RX17 Pro' ], + 'CPH1893' => [ 'Oppo', 'RX17 Neo' ], + 'CPH1903' => [ 'Oppo', 'A7' ], + 'CPH1907' => [ 'Oppo', 'Reno 2' ], + 'CPH1909' => [ 'Oppo', 'A5s' ], + 'CPH1911' => [ 'Oppo', 'F11' ], + 'CPH1917' => [ 'Oppo', 'Reno' ], + 'CPH1919' => [ 'Oppo', 'Reno 10x Zoom' ], + 'CPH1920' => [ 'Oppo', 'A5s' ], + 'CPH1923' => [ 'Oppo', 'A1k' ], + 'CPH1931' => [ 'Oppo', 'A5 (2020)' ], + 'CPH1933' => [ 'Oppo', 'A5 (2020)' ], + 'CPH1951' => [ 'Oppo', 'Reno 2Z' ], 'CPH1969' => [ 'Oppo', 'F11 Pro' ], + 'CPH1989' => [ 'Oppo', 'Reno 2 F' ], + 'CPH2005' => [ 'Oppo', 'Find X2 Lite' ], + 'CPH2009' => [ 'Oppo', 'Find X2 Neo' ], + 'CPH2021' => [ 'Oppo', 'A91' ], + 'CPH2023' => [ 'Oppo', 'Find X2' ], + 'CPH2025' => [ 'Oppo', 'Find X2 Pro' ], + 'CPH2043' => [ 'Oppo', 'Reno 3' ], + 'CPH2065' => [ 'Oppo', 'Reno 4Z' ], + 'CPH2067' => [ 'Oppo', 'A72' ], + 'CPH2069' => [ 'Oppo', 'A52' ], + 'CPH2083' => [ 'Oppo', 'A12' ], + 'CPH2089' => [ 'Oppo', 'Reno 4 Pro' ], + 'CPH2091' => [ 'Oppo', 'Reno 4' ], + 'CPH2121' => [ 'Oppo', 'A93' ], + 'CPH2125' => [ 'Oppo', 'Reno 4 Lite' ], + 'CPH2127' => [ 'Oppo', 'A53' ], + 'CPH2135' => [ 'Oppo', 'A53s' ], + 'CPH2145' => [ 'Oppo', 'Find X3 Lite' ], + 'CPH2161' => [ 'Oppo', 'A73' ], + 'CPH2173' => [ 'Oppo', 'Find X3 Pro' ], + 'CPH2185' => [ 'Oppo', 'A15' ], + 'CPH2195' => [ 'Oppo', 'A54' ], + 'CPH2197' => [ 'Oppo', 'A74' ], + 'CPH2205' => [ 'Oppo', 'Reno 5 Lite' ], + 'CPH2207' => [ 'Oppo', 'Find X3 Neo' ], + 'CPH2211' => [ 'Oppo', 'A94' ], + 'CPH2219' => [ 'Oppo', 'A74' ], + 'CPH2247' => [ 'Oppo', 'Reno 6 Pro' ], + 'CPH2251' => [ 'Oppo', 'Reno 6' ], + 'CPH2269' => [ 'Oppo', 'A16' ], + 'CPH2271' => [ 'Oppo', 'A16s' ], + 'CPH2273' => [ 'Oppo', 'A54s' ], + 'CPH2305' => [ 'Oppo', 'Find X5 Pro' ], + 'CPH2307' => [ 'Oppo', 'Find X5' ], + 'CPH2371' => [ 'Oppo', 'Reno 7' ], 'Find 5' => [ 'Oppo', 'Find 5' ], 'X903' => [ 'Oppo', 'Find Me X903' ], 'X903S' => [ 'Oppo', 'Find X903S' ], @@ -11687,6 +12044,10 @@ 'Bucare Y330-U05' => [ 'Orinoquia', 'Bucare Y330' ], 'Kavak Y625-U03' => [ 'Orinoquia', 'Kavak Y625' ], + 'C15 Pro' => [ 'Oukitel', 'C15 Pro' ], + 'C21 Pro' => [ 'Oukitel', 'C21 Pro' ], + 'B2021' => [ 'Oukitel', 'B2021' ], + 'K6000 Pro' => [ 'Oukitel', 'K6000 Pro' ], 'K10000 Pro' => [ 'Oukitel', 'K10000 Pro' ], '(OV-|Overmax|Vertis)!!' => [ @@ -11715,6 +12076,7 @@ 'Vertis Famy' => [ 'Overmax', 'Vertis Famy' ], ], + 'OV10274G' => [ 'Overmax', '1027' ], 'Arctic450' => [ 'Oysters', 'Arctic 450' ], 'Oysters Pacific 800' => [ 'Oysters', 'Pacific 800' ], 'Oysters T3 3G' => [ 'Oysters', 'T3' ], @@ -12825,6 +13187,10 @@ ], 'RoverPad 3W T71D' => [ 'RoverPad', '3W T71D', DeviceType::TABLET ], + 'RG650' => [ 'RugGear', 'RG650' ], + 'RG655' => [ 'RugGear', 'RG655' ], + 'RG725' => [ 'RugGear', 'RG725' ], + 'RG850' => [ 'RugGear', 'RG850' ], 'Snexian!!' => [ 'Snexian Mi320' => [ 'S Nexian', 'Chronos Mi320' ], @@ -13255,18 +13621,39 @@ 'SMT-i9100' => [ 'Samsung', 'Galaxy Tab 7.0', DeviceType::TABLET ], 'SM-A[0-9]{3,3}!!' => [ + 'SM-A013!' => [ 'Samsung', 'Galaxy A01 Core' ], + 'SM-A015!' => [ 'Samsung', 'Galaxy A01' ], + 'SM-A022!' => [ 'Samsung', 'Galaxy A02' ], + 'SM-A025!' => [ 'Samsung', 'Galaxy A02s' ], + 'SM-A032!' => [ 'Samsung', 'Galaxy A03 Core' ], + 'SM-A035!' => [ 'Samsung', 'Galaxy A03' ], + 'SM-A037!' => [ 'Samsung', 'Galaxy A03s' ], 'SM-A102!' => [ 'Samsung', 'Galaxy A10e' ], 'SM-A105!' => [ 'Samsung', 'Galaxy A10' ], 'SM-A107!' => [ 'Samsung', 'Galaxy A10s' ], + 'SM-A115!' => [ 'Samsung', 'Galaxy A11' ], + 'SM-A125!' => [ 'Samsung', 'Galaxy A12' ], + 'SM-A127!' => [ 'Samsung', 'Galaxy A12' ], + 'SM-A135!' => [ 'Samsung', 'Galaxy A13' ], 'SM-A202!' => [ 'Samsung', 'Galaxy A20e' ], 'SM-A205!' => [ 'Samsung', 'Galaxy A20' ], + 'SM-A207!' => [ 'Samsung', 'Galaxy A20s' ], + 'SM-A215!' => [ 'Samsung', 'Galaxy A21' ], + 'SM-A217!' => [ 'Samsung', 'Galaxy A21s' ], + 'SM-A225!' => [ 'Samsung', 'Galaxy A22' ], + 'SM-A226!' => [ 'Samsung', 'Galaxy A22 5G' ], 'SM-A260!' => [ 'Samsung', 'Galaxy A2 Core' ], 'SM-A300!' => [ 'Samsung', 'Galaxy A3' ], 'SM-A305!' => [ 'Samsung', 'Galaxy A30' ], 'SM-A307!' => [ 'Samsung', 'Galaxy A30s' ], 'SM-A310!' => [ 'Samsung', 'Galaxy A3 (2016)' ], + 'SM-A315!' => [ 'Samsung', 'Galaxy A31' ], 'SM-A320!' => [ 'Samsung', 'Galaxy A3 (2017)' ], + 'SM-A325!' => [ 'Samsung', 'Galaxy A32' ], + 'SM-A326!' => [ 'Samsung', 'Galaxy A32 5G' ], 'SM-A405!' => [ 'Samsung', 'Galaxy A40' ], + 'SM-A415!' => [ 'Samsung', 'Galaxy A41' ], + 'SM-A426!' => [ 'Samsung', 'Galaxy A42 5G' ], 'SM-A430!' => [ 'Samsung', 'Galaxy A4' ], 'SM-A450!' => [ 'Samsung', 'Galaxy A4 (2017)' ], 'SM-A460!' => [ 'Samsung', 'SM-A460' ], @@ -13274,8 +13661,14 @@ 'SM-A505!' => [ 'Samsung', 'Galaxy A50' ], 'SM-A507!' => [ 'Samsung', 'Galaxy A50s' ], 'SM-A510!' => [ 'Samsung', 'Galaxy A5 (2016)' ], + 'SM-A515!' => [ 'Samsung', 'Galaxy A51' ], + 'SM-A516!' => [ 'Samsung', 'Galaxy A51 5G' ], 'SM-A520!' => [ 'Samsung', 'Galaxy A5 (2017)' ], + 'SM-A525!' => [ 'Samsung', 'Galaxy A52' ], + 'SM-A526!' => [ 'Samsung', 'Galaxy A52 5G' ], + 'SM-A528!' => [ 'Samsung', 'Galaxy A52s 5G' ], 'SM-A530!' => [ 'Samsung', 'Galaxy A8 (2018)' ], + 'SM-A536!' => [ 'Samsung', 'Galaxy A53' ], 'SM-A600!' => [ 'Samsung', 'Galaxy A6 (2018)' ], 'SM-A6050!' => [ 'Samsung', 'Galaxy A9 Star Lite' ], 'SM-A605!' => [ 'Samsung', 'Galaxy A6+ (2018)' ], @@ -13283,7 +13676,10 @@ 'SM-A700!' => [ 'Samsung', 'Galaxy A7' ], 'SM-A705!' => [ 'Samsung', 'Galaxy A70' ], 'SM-A710!' => [ 'Samsung', 'Galaxy A7 (2016)' ], + 'SM-A715!' => [ 'Samsung', 'Galaxy A71' ], + 'SM-A716!' => [ 'Samsung', 'Galaxy A71 5G' ], 'SM-A720!' => [ 'Samsung', 'Galaxy A7 (2017)' ], + 'SM-A725!' => [ 'Samsung', 'Galaxy A72' ], 'SM-A730!' => [ 'Samsung', 'Galaxy A8+ (2018)' ], 'SM-A750!' => [ 'Samsung', 'Galaxy A7 (2018)' ], 'SM-A800!' => [ 'Samsung', 'Galaxy A8' ], @@ -13291,6 +13687,7 @@ 'SM-A810!' => [ 'Samsung', 'Galaxy A8 (2016)' ], 'SM-A850!' => [ 'Samsung', 'Galaxy Alpha' ], 'SM-A900!' => [ 'Samsung', 'Galaxy A9 (2016)' ], + 'SM-A908!' => [ 'Samsung', 'Galaxy A90 5G' ], 'SM-A910!' => [ 'Samsung', 'Galaxy A9 Pro' ], 'SM-A920!' => [ 'Samsung', 'Galaxy A9 (2018)' ], ], @@ -13312,7 +13709,15 @@ ], 'SM-F[0-9]{3,3}!!' => [ + 'SM-F127!' => [ 'Samsung', 'Galaxy F12' ], + 'SM-F700!' => [ 'Samsung', 'Galaxy Z Flip' ], + 'SM-F707!' => [ 'Samsung', 'Galaxy Z Flip 5G' ], + 'SM-F711!' => [ 'Samsung', 'Galaxy Z Flip3 5G' ], 'SM-F900!' => [ 'Samsung', 'Galaxy Fold' ], + 'SM-F907!' => [ 'Samsung', 'Galaxy Fold 5G' ], + 'SM-F910!' => [ 'Samsung', 'Galaxy Z Fold2' ], + 'SM-F916!' => [ 'Samsung', 'Galaxy Z Fold2 5G' ], + 'SM-F926!' => [ 'Samsung', 'Galaxy Z Fold3 5G' ], ], 'SM-G[0-9]{3,3}!!' => [ @@ -13355,11 +13760,13 @@ 'SM-G388!' => [ 'Samsung', 'Galaxy Xcover 3' ], 'SM-G389!' => [ 'Samsung', 'Galaxy Xcover 3 VE' ], 'SM-G390!' => [ 'Samsung', 'Galaxy Xcover 4' ], + 'SM-G398!' => [ 'Samsung', 'Galaxy Xcover 4s' ], 'SM-G420!' => [ 'Samsung', 'SM-G420' ], // Unknown 'SM-G430!' => [ 'Samsung', 'SM-G430' ], // Unknown 'SM-G480!' => [ 'Samsung', 'Galaxy S8' ], 'SM-G485!' => [ 'Samsung', 'Galaxy S8+' ], 'SM-G510!' => [ 'Samsung', 'Galaxy Core Max' ], + 'SM-G525!' => [ 'Samsung', 'Galaxy Xcover 5' ], 'SM-G530!' => [ 'Samsung', 'Galaxy Grand Prime' ], 'SM-G531!' => [ 'Samsung', 'Galaxy Grand Prime VE' ], 'SM-G532!' => [ 'Samsung', 'Galaxy Grand Prime+' ], @@ -13372,10 +13779,13 @@ 'SM-G615!' => [ 'Samsung', 'Galaxy J7 Max' ], 'SM-G620!' => [ 'Samsung', 'Galaxy J7 Prime (2018)' ], 'SM-G710!' => [ 'Samsung', 'Galaxy Grand 2' ], + 'SM-G715!' => [ 'Samsung', 'Galaxy XCover Pro' ], 'SM-G720!' => [ 'Samsung', 'Galaxy Grand 3' ], 'SM-G730!' => [ 'Samsung', 'Galaxy S III Mini' ], 'SM-G750!' => [ 'Samsung', 'Galaxy Mega 2 ' ], - 'SM-G770!' => [ 'Samsung', 'Galaxy On7' ], + 'SM-G770!' => [ 'Samsung', 'Galaxy S10 Lite' ], + 'SM-G780!' => [ 'Samsung', 'Galaxy S20 FE' ], + 'SM-G781!' => [ 'Samsung', 'Galaxy S20 FE' ], 'SM-G800!' => [ 'Samsung', 'Galaxy S5 Mini' ], 'SM-G850!' => [ 'Samsung', 'Galaxy Alpha' ], 'SM-G860!' => [ 'Samsung', 'Galaxy S5 Sport' ], @@ -13385,6 +13795,7 @@ 'SM-G885[FSY]!' => [ 'Samsung', 'Galaxy A8 Star' ], 'SM-G8850!' => [ 'Samsung', 'Galaxy A9 Star' ], 'SM-G887!' => [ 'Samsung', 'Galaxy A9 Pro (2019)' ], + 'SM-G889!' => [ 'Samsung', 'Galaxy Xcover FieldPro' ], 'SM-G890!' => [ 'Samsung', 'Galaxy S6 Active' ], 'SM-G891!' => [ 'Samsung', 'Galaxy S7 Active' ], 'SM-G892!' => [ 'Samsung', 'Galaxy S8 Active' ], @@ -13407,13 +13818,17 @@ 'SM-G965!' => [ 'Samsung', 'Galaxy S9+' ], 'SM-G970!' => [ 'Samsung', 'Galaxy S10e' ], 'SM-G973!' => [ 'Samsung', 'Galaxy S10' ], - 'SM-G975!' => [ 'Samsung', 'Galaxy S10 Plus' ], + 'SM-G975!' => [ 'Samsung', 'Galaxy S10+' ], 'SM-G977!' => [ 'Samsung', 'Galaxy S10 5G' ], - 'SM-G980!' => [ 'Samsung', 'Galaxy S11e' ], - 'SM-G981!' => [ 'Samsung', 'Galaxy S11e' ], - 'SM-G985!' => [ 'Samsung', 'Galaxy S11' ], - 'SM-G986!' => [ 'Samsung', 'Galaxy S11 5G' ], - 'SM-G988!' => [ 'Samsung', 'Galaxy S11 Plus' ], + 'SM-G980!' => [ 'Samsung', 'Galaxy S20' ], + 'SM-G981!' => [ 'Samsung', 'Galaxy S20' ], + 'SM-G985!' => [ 'Samsung', 'Galaxy S20+' ], + 'SM-G986!' => [ 'Samsung', 'Galaxy S20+' ], + 'SM-G988!' => [ 'Samsung', 'Galaxy S20 Ultra' ], + 'SM-G990!' => [ 'Samsung', 'Galaxy S21 FE' ], + 'SM-G991!' => [ 'Samsung', 'Galaxy S21' ], + 'SM-G996!' => [ 'Samsung', 'Galaxy S21+' ], + 'SM-G998!' => [ 'Samsung', 'Galaxy S21 Ultra' ], ], 'SM-I9500' => [ 'Samsung', 'Galaxy S4' ], @@ -13456,14 +13871,25 @@ ], 'SM-M[0-9]{3,4}!!' => [ + 'SM-M015!' => [ 'Samsung', 'Galaxy M01' ], 'SM-M105!' => [ 'Samsung', 'Galaxy M10' ], + 'SM-M115!' => [ 'Samsung', 'Galaxy M11' ], + 'SM-M127!' => [ 'Samsung', 'Galaxy M12' ], 'SM-M205!' => [ 'Samsung', 'Galaxy M20' ], + 'SM-M215!' => [ 'Samsung', 'Galaxy M21' ], + 'SM-M225!' => [ 'Samsung', 'Galaxy M22' ], 'SM-M305!' => [ 'Samsung', 'Galaxy M30' ], + 'SM-M307!' => [ 'Samsung', 'Galaxy M30s' ], + 'SM-M315!' => [ 'Samsung', 'Galaxy M31' ], + 'SM-M317!' => [ 'Samsung', 'Galaxy M31s' ], + 'SM-M515!' => [ 'Samsung', 'Galaxy M51' ], + 'SM-M526!' => [ 'Samsung', 'Galaxy M52' ], ], 'SM-N[0-9]{3,4}!!' => [ 'SM-N750[025789][QV]?!' => [ 'Samsung', 'Galaxy Note 3 Neo' ], 'SM-N750[LS]?!' => [ 'Samsung', 'Galaxy Note 3 Neo' ], + 'SM-N770!' => [ 'Samsung', 'Galaxy Note 10 Lite' ], 'SM-N8000' => [ 'Samsung', 'Galaxy Note 800', DeviceType::TABLET ], 'SM-N900[0256789]?!' => [ 'Samsung', 'Galaxy Note 3' ], 'SM-N900!' => [ 'Samsung', 'Galaxy Note 3' ], @@ -13477,6 +13903,10 @@ 'SM-N960!' => [ 'Samsung', 'Galaxy Note 9' ], 'SM-N970!' => [ 'Samsung', 'Galaxy Note 10' ], 'SM-N975!' => [ 'Samsung', 'Galaxy Note 10+' ], + 'SM-N976!' => [ 'Samsung', 'Galaxy Note 10+ 5G' ], + 'SM-N980!' => [ 'Samsung', 'Galaxy Note 20' ], + 'SM-N981!' => [ 'Samsung', 'Galaxy Note 20 5G' ], + 'SM-N986!' => [ 'Samsung', 'Galaxy Note 20 Ultra 5G' ], ], 'SM-P[0-9]{3,3}!!' => [ @@ -13484,6 +13914,7 @@ 'SM-P55[015]!' => [ 'Samsung', 'Galaxy Tab A Plus 9.7', DeviceType::TABLET ], 'SM-P58[058]!' => [ 'Samsung', 'Galaxy Tab A 10.1 with S Pen (2016)', DeviceType::TABLET ], 'SM-P60[01257]!' => [ 'Samsung', 'Galaxy Note 10.1 (2014)', DeviceType::TABLET ], + 'SM-P61[05]!' => [ 'Samsung', 'Galaxy Tab S6 Lite', DeviceType::TABLET ], 'SM-P90[01257]!' => [ 'Samsung', 'Galaxy Note Pro', DeviceType::TABLET ], ], @@ -13504,10 +13935,13 @@ 'SM-S780L' => [ 'Samsung', 'Galaxy Mega 6.3' ], 'SM-S820L' => [ 'Samsung', 'Galaxy Core Prime' ], 'SM-S890L' => [ 'Samsung', 'Galaxy S4 Mini' ], + 'SM-S901B' => [ 'Samsung', 'Galaxy S22' ], 'SM-S902L' => [ 'Samsung', 'Galaxy S5' ], 'SM-S903VL' => [ 'Samsung', 'Galaxy S5' ], 'SM-S906L' => [ 'Samsung', 'Galaxy S6' ], + 'SM-S906B' => [ 'Samsung', 'Galaxy S22+' ], 'SM-S907VL' => [ 'Samsung', 'Galaxy S6' ], + 'SM-S908B' => [ 'Samsung', 'Galaxy S22 Ultra' ], 'SM-S920L' => [ 'Samsung', 'Galaxy Grand Prime' ], 'SM-S975L' => [ 'Samsung', 'Galaxy S4' ], 'SM-S978L' => [ 'Samsung', 'Galaxy E5' ], @@ -13518,10 +13952,13 @@ 'SM-T11[36]!' => [ 'Samsung', 'Galaxy Tab 3V 7.0', DeviceType::TABLET ], 'SM-T2105' => [ 'Samsung', 'Galaxy Tab 3 Kids', DeviceType::TABLET ], 'SM-T21[01257]!' => [ 'Samsung', 'Galaxy Tab 3 7.0', DeviceType::TABLET ], + 'SM-T22[05]!' => [ 'Samsung', 'Galaxy Tab A7 Lite', DeviceType::TABLET ], 'SM-T2519' => [ 'Samsung', 'Galaxy Tab Q' ], 'SM-T255[68S]!' => [ 'Samsung', 'Galaxy Tab Q' ], 'SM-T23[012579]!' => [ 'Samsung', 'Galaxy Tab 4 7.0', DeviceType::TABLET ], 'SM-T28[057]!' => [ 'Samsung', 'Galaxy Tab A 7.0', DeviceType::TABLET ], + 'SM-T29[05]!' => [ 'Samsung', 'Galaxy Tab A 8.0 (2019)', DeviceType::TABLET ], + 'SM-T30[7]!' => [ 'Samsung', 'Galaxy Tab A 8.4 (2020)', DeviceType::TABLET ], 'SM-T31[0125]!' => [ 'Samsung', 'Galaxy Tab 3 8.0', DeviceType::TABLET ], 'SM-T32[0125]!' => [ 'Samsung', 'Galaxy Tab Pro 8.4', DeviceType::TABLET ], 'SM-T33[01257]!' => [ 'Samsung', 'Galaxy Tab 4 8.0', DeviceType::TABLET ], @@ -13532,6 +13969,7 @@ 'SM-T38[05]!' => [ 'Samsung', 'Galaxy Tab A 8.0 (2017)', DeviceType::TABLET ], 'SM-T387!' => [ 'Samsung', 'Galaxy Tab A 8.0 (2018)', DeviceType::TABLET ], 'SM-T39[05]!' => [ 'Samsung', 'Galaxy Tab Active2 8.0', DeviceType::TABLET ], + 'SM-T50[05]!' => [ 'Samsung', 'Galaxy Tab A7 10.4 (2020)', DeviceType::TABLET ], 'SM-T51[05]!' => [ 'Samsung', 'Galaxy Tab A 10.1 (2019)', DeviceType::TABLET ], 'SM-T520CC' => [ 'Samsung', 'Galaxy Tab Pro 10.1 Chef Collection', DeviceType::TABLET ], 'SM-T52[057]!' => [ 'Samsung', 'Galaxy Tab Pro 10.1', DeviceType::TABLET ], @@ -13539,7 +13977,9 @@ 'SM-T53[023]!' => [ 'Samsung', 'Galaxy Tab 4 10.1', DeviceType::TABLET ], 'SM-T53[6]!' => [ 'Samsung', 'Galaxy Tab 4 10.1 Advanced', DeviceType::TABLET ], 'SM-T53[157]!' => [ 'Samsung', 'Galaxy Tab 4 10.0', DeviceType::TABLET ], + 'SM-T54[05]!' => [ 'Samsung', 'Galaxy Tab Active Pro', DeviceType::TABLET ], 'SM-T55[015]!' => [ 'Samsung', 'Galaxy Tab A 9.7', DeviceType::TABLET ], + 'SM-T57[5]!' => [ 'Samsung', 'Galaxy Tab Active3', DeviceType::TABLET ], 'SM-T58[057]!' => [ 'Samsung', 'Galaxy Tab A 10.1 (2016)', DeviceType::TABLET ], 'SM-T583!' => [ 'Samsung', 'Galaxy Tab Advanced2', DeviceType::TABLET ], 'SM-T56[0127]!' => [ 'Samsung', 'Galaxy Tab E 9.6', DeviceType::TABLET ], @@ -13548,7 +13988,8 @@ 'SM-T70[057]!' => [ 'Samsung', 'Galaxy Tab S 8.4', DeviceType::TABLET ], 'SM-T71[05]!' => [ 'Samsung', 'Galaxy Tab S2 8.0', DeviceType::TABLET ], 'SM-T71[39]!' => [ 'Samsung', 'Galaxy Tab S2 8.0 (2016)', DeviceType::TABLET ], - 'SM-T72[05]!' => [ 'Samsung', 'Galaxy Tab S5e', DeviceType::TABLET ], + 'SM-T72[057]!' => [ 'Samsung', 'Galaxy Tab S5e', DeviceType::TABLET ], + 'SM-T73[36]!' => [ 'Samsung', 'Galaxy Tab S7 12.4 FE (2021)', DeviceType::TABLET ], 'SM-T80[0157]!' => [ 'Samsung', 'Galaxy Tab S 10.5', DeviceType::TABLET ], 'SM-T81[057]!' => [ 'Samsung', 'Galaxy Tab S2 9.7', DeviceType::TABLET ], 'SM-T81[39]!' => [ 'Samsung', 'Galaxy Tab S2 9.7 (2016)', DeviceType::TABLET ], @@ -13556,9 +13997,20 @@ 'SM-T82[057]!' => [ 'Samsung', 'Galaxy Tab S3 9.7', DeviceType::TABLET ], 'SM-T83[057]!' => [ 'Samsung', 'Galaxy Tab S4 10.5', DeviceType::TABLET ], 'SM-T86[057]!' => [ 'Samsung', 'Galaxy Tab S6 10.5', DeviceType::TABLET ], + 'SM-T87[05]!' => [ 'Samsung', 'Galaxy Tab S7 11.0', DeviceType::TABLET ], 'SM-T90[05]!' => [ 'Samsung', 'Galaxy Tab Pro 12.2', DeviceType::TABLET ], + 'SM-T92[7]!' => [ 'Samsung', 'Galaxy View2 (2019)', DeviceType::TABLET ], + 'SM-T97[06]!' => [ 'Samsung', 'Galaxy Tab S7+ 12.4 (2020)', DeviceType::TABLET ], + ], + 'SM-X200' => [ 'Samsung', 'Galaxy Tab A8 10.5', DeviceType::TABLET ], + 'SM-X205' => [ 'Samsung', 'Galaxy Tab A8 10.5', DeviceType::TABLET ], + 'SM-X700' => [ 'Samsung', 'Galaxy Tab S8', DeviceType::TABLET ], + 'SM-X800' => [ 'Samsung', 'Galaxy Tab S8+', DeviceType::TABLET ], + 'SM-X900' => [ 'Samsung', 'Galaxy Tab S8 Ultra', DeviceType::TABLET ], + 'SM-X906!' => [ 'Samsung', 'Galaxy Tab S8 Ultra', DeviceType::TABLET ], + 'SM-V700' => [ 'Samsung', 'Galaxy Gear', DeviceType::WATCH ], 'SM-W[0-9]{4,4}!!' => [ @@ -13852,6 +14304,8 @@ 'EB-L76G-B' => [ 'Sharp', 'EB-L76G-B', DeviceType::TABLET ], 'RW107' => [ 'Sharp', 'RW-T107', DeviceType::TABLET ], + 'FS8032' => [ 'Sharp', 'AQUOS S3 FS8032' ], + 'SBM[0-9]0[0-9]SH!!' => [ 'SBM003SH' => [ 'Sharp', 'GALAPAGOS 003SH', 'carrier' => 'Softbank' ], 'SBM005SH' => [ 'Sharp', 'GALAPAGOS 005SH', 'carrier' => 'Softbank' ], @@ -13896,12 +14350,17 @@ 'DM-01H' => [ 'Sharp', 'DM-01H', 'carrier' => 'Disney Mobile' ], 'DM-01J' => [ 'Sharp', 'DM-01J', 'carrier' => 'Disney Mobile' ], + 'SH-A01' => [ 'Sharp', 'B10 SH-A01' ], + 'SH-C02' => [ 'Sharp', 'AQUOS V SH-C02' ], + 'SH-D01' => [ 'Sharp', 'AQUOS D10 SH-D01' ], 'SH-M01' => [ 'Sharp', 'AQUOS SH-M01' ], 'SH-M02' => [ 'Sharp', 'AQUOS SH-M02' ], 'SH-M02-EVA20' => [ 'Sharp', 'AQUOS SH-M02' ], 'SH-M03' => [ 'Sharp', 'AQUOS mini SH-M03' ], + 'SH-M05' => [ 'Sharp', 'AQUOS sense lite SH-M05' ], 'SH-M07' => [ 'Sharp', 'AQUOS sense plus SH-M07' ], 'SH-RM02' => [ 'Sharp', 'AQUOS SH-RM02' ], + 'SH-Z01' => [ 'Sharp', 'AQUOS C10 SH-Z01' ], 'SH-[01][0-9][A-Z]!!' => [ 'SH-01D' => [ 'Sharp', 'AQUOS PHONE SH-01D', 'carrier' => 'DoCoMo' ], @@ -14033,6 +14492,8 @@ 'LC-((A|S|LX)[0-9]{1,3}[A-Z])!' => [ 'Sharp', 'Aquos $1', DeviceType::TELEVISION ], 'LCD-((S|V|LX|UF)[0-9]{1,3}[A-Z])!' => [ 'Sharp', 'Aquos $1', DeviceType::TELEVISION ], + 'SHIFT6m' => [ 'Shift', 'SHIFT6m' ], + 'X-treme PQ11' => [ 'Sigma Mobile', 'X-treme PQ11' ], 'X-treme PQ15' => [ 'Sigma Mobile', 'X-treme PQ15' ], 'X-tremePQ22' => [ 'Sigma Mobile', 'X-treme PQ22' ], @@ -14046,6 +14507,7 @@ 'SPX-6' => [ 'Simvalley', 'SPX-6' ], 'SPX-12' => [ 'Simvalley', 'SPX-12' ], 'X720' => [ 'Simmtronics', 'XPAD X-720', DeviceType::TABLET ], + 'FINNEY U1' => [ 'Sirin Labs', 'Finney U1' ], 'HYPER X BLADE' => [ 'SKK Mobile', 'Hyper X Blade' ], 'Elite 5.5L+' => [ 'Sky Devices', 'Elite 5.5L+' ], @@ -14171,6 +14633,8 @@ 'sonim/XP7700' => [ 'Sonim', 'XP7700' ], ], + 'XP8800' => [ 'Sonim', 'XP8800' ], + 'OMS1 6' => [ 'Sony Ericsson', 'A8i' ], 'C[0-9]{4,4}!!' => [ @@ -14271,14 +14735,37 @@ 'H83(14|24)!' => [ 'Sony', 'Xperia XZ2 Compact' ], 'H84(16)!' => [ 'Sony', 'Xperia XZ3' ], 'H84(41)!' => [ 'Sony', 'Xperia XZ1 Compact' ], + 'H94(36|93)!' => [ 'Sony', 'Xperia XZ3' ], ], 'I[0-9]{4,4}!!' => [ 'I31(13|23)!' => [ 'Sony', 'Xperia 10' ], 'I32(13|23)!' => [ 'Sony', 'Xperia 10 Plus' ], + 'I33(12)!' => [ 'Sony', 'Xperia L3' ], 'I41(13|93)!' => [ 'Sony', 'Xperia 10' ], 'I42(13|93)!' => [ 'Sony', 'Xperia 10 Plus' ], - ], + 'I43(12|32)!' => [ 'Sony', 'Xperia L3' ], + ], + + 'J[0-9]{4,4}!!' => [ + 'J81(10|70)!' => [ 'Sony', 'Xperia 1' ], + 'J82(10|70)!' => [ 'Sony', 'Xperia 5' ], + 'J91(10)!' => [ 'Sony', 'Xperia 1' ], + 'J92(10|60)!' => [ 'Sony', 'Xperia 5' ], + ], + + 'XQ-AT51' => [ 'Sony', 'Xperia 1 II' ], + 'XQ-AT52' => [ 'Sony', 'Xperia 1 II' ], + 'XQ-BC52' => [ 'Sony', 'Xperia 1 III' ], + 'XQ-BC72' => [ 'Sony', 'Xperia 1 III' ], + 'XQ-AS52' => [ 'Sony', 'Xperia 5 II' ], + 'XQ-BQ52' => [ 'Sony', 'Xperia 5 III' ], + 'XQ-AU52' => [ 'Sony', 'Xperia 10 II' ], + 'XQ-BT52' => [ 'Sony', 'Xperia 10 III' ], + 'XQ-AD51' => [ 'Sony', 'Xperia L4' ], + 'XQ-AD52' => [ 'Sony', 'Xperia L4' ], + 'XQ-BE52' => [ 'Sony', 'Xperia Pro-I' ], + 'E[0-9]{2,2}[a-z]!!' => [ 'E10(a|i|iv)!' => [ 'Sony Ericsson', 'Xperia X10 Mini' ], // Robyn @@ -14979,6 +15466,11 @@ 'Tabra QAV801' => [ 'Tabra', 'QAV801', DeviceType::TABLET ], + 'T671H' => [ 'TCL', '20 SE' ], + 'T774H' => [ 'TCL', '20L' ], + 'T775H' => [ 'TCL', '20L+' ], + 'T790Y' => [ 'TCL', '10' ], + 'TCL!!' => [ 'TCL-309T' => [ 'TCL', '309T' ], 'TCL-550' => [ 'TCL', '550' ], @@ -15177,6 +15669,7 @@ 'TECNO-J7' => [ 'Tecno', 'J7' ], 'TECNO J7' => [ 'Tecno', 'J7' ], 'TECNO-J8' => [ 'Tecno', 'J8' ], + 'TECNO KC6S' => [ 'Tecno', 'Spark 4 Air' ], 'TECNO L3' => [ 'Tecno', 'L3' ], 'TECNO-L5' => [ 'Tecno', 'L5' ], 'TECNO L6' => [ 'Tecno', 'L6' ], @@ -15280,6 +15773,8 @@ 'G18mini(C5B9)' => [ 'Teclast', 'G18 mini', DeviceType::TABLET ], 'G18d 3G四核(D3A2)' => [ 'Teclast', 'G18d', DeviceType::TABLET ], 'G18d mini(FV2C)' => [ 'Teclast', 'G18d mini', DeviceType::TABLET ], + 'M40 EEA' => [ 'Teclast', 'M40', DeviceType::TABLET ], + 'M40(N9H3)' => [ 'Teclast', 'M40', DeviceType::TABLET ], 'P10HD??(E6NA)' => [ 'Teclast', 'P10HD', DeviceType::TABLET ], 'P11HD' => [ 'Teclast', 'P11HD', DeviceType::TABLET ], 'P11HD四核(G9X6)' => [ 'Teclast', 'P11HD', DeviceType::TABLET ], @@ -15287,6 +15782,7 @@ 'P11HD四核(G9X7)' => [ 'Teclast', 'P11HD', DeviceType::TABLET ], 'P19HD(E1K3)' => [ 'Teclast', 'P19HD', DeviceType::TABLET ], 'P19HD(E1K5)' => [ 'Teclast', 'P19HD', DeviceType::TABLET ], + 'P20HD EEA' => [ 'Teclast', 'P20HD', DeviceType::TABLET ], 'P70 3G八核(C2B7)' => [ 'Teclast', 'P70 3G', DeviceType::TABLET ], 'P70h(A5C2)' => [ 'Teclast', 'P70h', DeviceType::TABLET ], 'P72' => [ 'Teclast', 'P72', DeviceType::TABLET ], @@ -15458,6 +15954,7 @@ 'Telpad QS' => [ 'Telpad', 'Quad S', DeviceType::TABLET ], 'T3696' => [ 'Telsda', 'T3696' ], 'Tensent S9000' => [ 'Tensent', 'S9000' ], + 'Teracube 2e' => [ 'Teracube', '2e' ], 'Hudl HT7S3' => [ 'Tesco', 'Hudl', DeviceType::TABLET ], 'Hudl 2' => [ 'Tesco', 'Hudl 2', DeviceType::TABLET ], 'TM-3200R' => [ 'teXet', 'TM-3200R' ], @@ -15805,8 +16302,31 @@ ], 'A6S' => [ 'TWM', 'Amazing A6S' ], + 'Armor 2' => [ 'Ulefone', 'Armor 2' ], + 'Armor 3W' => [ 'Ulefone', 'Armor 3W' ], + 'Armor 3WT' => [ 'Ulefone', 'Armor 3WT' ], + 'Ulefone Armor 5' => [ 'Ulefone', 'Armor 5' ], + 'Armor 5S' => [ 'Ulefone', 'Armor 5S' ], + 'Armor 6E' => [ 'Ulefone', 'Armor 6E' ], + 'Armor 7' => [ 'Ulefone', 'Armor 7' ], + 'Armor 7E' => [ 'Ulefone', 'Armor 7E' ], + 'Armor 8' => [ 'Ulefone', 'Armor 8' ], + 'Armor 9' => [ 'Ulefone', 'Armor 9' ], + 'Armor 9E' => [ 'Ulefone', 'Armor 9E' ], + 'Armor 10 5G' => [ 'Ulefone', 'Armor 10' ], + 'Armor 11 5G' => [ 'Ulefone', 'Armor 11' ], + 'Armor 11T 5G' => [ 'Ulefone', 'Armor 11T' ], + 'Armor X5' => [ 'Ulefone', 'Armor X5' ], + 'Armor X7' => [ 'Ulefone', 'Armor X7' ], + 'Armor X7 Pro' => [ 'Ulefone', 'Armor X7 Pro' ], + 'Armor X8' => [ 'Ulefone', 'Armor X8' ], + 'Power Armor 13' => [ 'Ulefone', 'Power Armor 13' ], 'Be Touch 2' => [ 'Ulefone', 'Be Touch 2' ], 'Ulefone Be Touch2' => [ 'Ulefone', 'Be Touch 2' ], + 'Note 7P' => [ 'Ulefone', 'Note 7P' ], + 'Note 8P' => [ 'Ulefone', 'Note 8P' ], + 'Note 9P' => [ 'Ulefone', 'Note 9P' ], + 'Note 11P' => [ 'Ulefone', 'Note 11P' ], 'TB100' => [ 'Unitech', 'TB100', DeviceType::TABLET ], 'M70014' => [ 'United Star Technology', 'M70014', DeviceType::TABLET ], 'QOOQ' => [ 'Unowhy', 'QOOQ', DeviceType::TABLET ], @@ -15816,6 +16336,7 @@ 'UMI-R1' => [ 'UMI', 'R1' ], 'UMI-R1(TD)' => [ 'UMI', 'R1' ], 'UMI S1' => [ 'UMI', 'S1' ], + 'UMIDIGI X' => [ 'UMI', 'X' ], 'UMI X1' => [ 'UMI', 'X1' ], 'UMI X1S' => [ 'UMI', 'X1s' ], 'UMI X1-PRO' => [ 'UMI', 'X1' ], @@ -15838,9 +16359,17 @@ 'UMI ZERO' => [ 'UMI', 'Zero' ], ], + 'A9 Pro' => [ 'UMI', 'A9 Pro' ], + 'A11 Pro Max' => [ 'UMI', 'A11 Pro Max' ], + 'BISON' => [ 'UMI', 'Bison' ], + 'BISON Pro' => [ 'UMI', 'Bison Pro' ], + 'BISON GT' => [ 'UMI', 'Bison GT' ], 'eMAX mini' => [ 'UMI', 'eMax mini' ], 'Plus E' => [ 'UMI', 'Plus E' ], + 'Jelly2' => [ 'Unihertz', 'Jelly 2' ], + 'Titan pocket' => [ 'Unihertz', 'Titan Pocket' ], 'U1203' => [ 'Uniscope', 'U1203' ], + 'KT-101-A' => [ 'Uniscom', 'KT-101-A', DeviceType::TABLET ], 'Unusual!!' => [ 'UNUSUAL U7X' => [ 'Unusual', 'U7X', DeviceType::TABLET ], @@ -16000,6 +16529,7 @@ 'Venus V3 5580' => [ 'Vestel', 'Venus V3 5580' ], 'VSP250g' => [ 'Vestel', 'Venus V5' ], 'VSP250s' => [ 'Vestel', 'Venus V5' ], + 'Venus Z20' => [ 'Vestel', 'Venus Z20' ], 'VT6078' => [ 'VIA', 'ALTA DS', DeviceType::SIGNAGE ], 'victorys s8' => [ 'Victory\'s', 'S8' ], @@ -16148,6 +16678,7 @@ 'vivo E1t' => [ 'Vivo', 'E1t' ], 'vivo E3' => [ 'Vivo', 'E3' ], 'vivo E5' => [ 'Vivo', 'E5' ], + 'vivo NEX S' => [ 'Vivo', 'NEX S' ], 'vivo S1' => [ 'Vivo', 'S1' ], 'vivo S3' => [ 'Vivo', 'S3' ], 'vivo S3+' => [ 'Vivo', 'S3+' ], @@ -16180,6 +16711,12 @@ 'vivo 1611' => [ 'Vivo', 'V5 Plus' ], 'vivo 1718' => [ 'Vivo', 'V7' ], 'vivo 1716' => [ 'Vivo', 'V7 Plus' ], + 'vivo 1724' => [ 'Vivo', 'Y71' ], + 'vivo 1804' => [ 'Vivo', 'V11 Pro' ], + 'vivo 1805' => [ 'Vivo', 'NEX' ], + 'vivo 1816' => [ 'Vivo', 'Y91' ], + 'vivo 1818' => [ 'Vivo', 'V15 Pro' ], + 'vivo 1902' => [ 'Vivo', 'Y17' ], 'vivo X1' => [ 'Vivo', 'X1' ], 'vivo X1S' => [ 'Vivo', 'X1S' ], 'vivo X1St' => [ 'Vivo', 'X1S' ], @@ -16349,6 +16886,14 @@ 'vivo Y937' => [ 'Vivo', 'Y937' ], ], + 'V1916A' => [ 'Vivo', 'iQOO Pro' ], + 'V2023' => [ 'Vivo', 'V20 SE' ], + 'V2028' => [ 'Vivo', 'Y11s' ], + 'V2041' => [ 'Vivo', 'Y72' ], + 'V2056A' => [ 'Vivo', 'X60 Pro+' ], + 'V2109' => [ 'Vivo', 'Y33s' ], + 'V2141A' => [ 'Vivo', 'iQOO 8 Pro' ], + 'VTAB1008' => [ 'Vizio', 'VTAB1008', DeviceType::TABLET ], 'VTAB3010' => [ 'Vizio', 'VTAB3010', DeviceType::TABLET ], 'VAP430' => [ 'Vizio', 'Co-Star', DeviceType::TELEVISION, Flag::GOOGLETV ], @@ -16610,15 +17155,20 @@ 'FEVER' => [ 'Wiko', 'Fever' ], 'GETAWAY' => [ 'Wiko', 'Getaway' ], 'GOA' => [ 'Wiko', 'Goa' ], + 'HARRY' => [ 'Wiko', 'Harry' ], + 'W-V600' => [ 'Wiko', 'Harry 2' ], 'HIGHWAY' => [ 'Wiko', 'Highway' ], 'HIGHWAY PURE' => [ 'Wiko', 'Highway Pure' ], 'HIGHWAY SIGNS' => [ 'Wiko', 'Highway Signs' ], 'IGGY' => [ 'Wiko', 'Iggy' ], 'JIMMY' => [ 'Wiko', 'Jimmy' ], + 'W K300' => [ 'Wiko', 'Jerry 3' ], 'KITE' => [ 'Wiko', 'Kite' ], 'LENNY' => [ 'Wiko', 'Lenny' ], 'LENNY2' => [ 'Wiko', 'Lenny 2' ], 'LENNY3' => [ 'Wiko', 'Lenny 3' ], + 'Lenny4' => [ 'Wiko', 'Lenny 4' ], + 'W K400' => [ 'Wiko', 'Lenny 5' ], 'OZZY' => [ 'Wiko', 'Ozzy' ], 'PULP' => [ 'Wiko', 'Pulp' ], 'PULP 4G' => [ 'Wiko', 'Pulp' ], @@ -16635,12 +17185,29 @@ 'SUBLIM' => [ 'Wiko', 'Sublim' ], 'SUNSET' => [ 'Wiko', 'Sunset' ], 'SUNSET2' => [ 'Wiko', 'Sunset 2' ], + 'U FEEL LITE' => [ 'Wiko', 'U Feel Lite' ], + 'U FEEL PRIME' => [ 'Wiko', 'U Feel Prime' ], + 'U PULSE LITE' => [ 'Wiko', 'U Pulse Lite' ], + 'View' => [ 'Wiko', 'View' ], + 'View XL' => [ 'Wiko', 'View XL' ], + 'W P200' => [ 'Wiko', 'View Max' ], + 'W C800' => [ 'Wiko', 'View2' ], + 'View2 Go' => [ 'Wiko', 'View2 Go' ], + 'W C860' => [ 'Wiko', 'View2 Pro' ], + 'View2 Plus' => [ 'Wiko', 'View2 Plus' ], + 'W-P311-EEA' => [ 'Wiko', 'View3' ], + 'W-V800-EEA' => [ 'Wiko', 'View3 Lite' ], + 'W-V830-EEA' => [ 'Wiko', 'View4' ], + 'W-V730-EEA' => [ 'Wiko', 'View4 Lite' ], + 'W-V851-EEA' => [ 'Wiko', 'View5' ], 'WAX' => [ 'Wiko', 'Wax' ], + 'WIM Lite' => [ 'Wiko', 'Wim Lite' ], 'Wileyfox Spark' => [ 'Wileyfox', 'Spark' ], 'Wileyfox Spark +' => [ 'Wileyfox', 'Spark +' ], 'Wileyfox Spark X' => [ 'Wileyfox', 'Spark X' ], 'Wileyfox Storm' => [ 'Wileyfox', 'Storm' ], 'Wileyfox Swift' => [ 'Wileyfox', 'Swift' ], + 'Swift 2' => [ 'Wileyfox', 'Swift 2' ], 'Swift 2 Plus' => [ 'Wileyfox', 'Swift 2 Plus' ], 'Swift 2 X' => [ 'Wileyfox', 'Swift 2 X' ], 'N5PRO2jingying' => [ 'Window', 'N5 Pro 2', DeviceType::MEDIA ], @@ -16734,6 +17301,8 @@ 'wm8710-tvbox' => [ 'WonderMedia', 'WM8710', DeviceType::TELEVISION ], 'WM8850-mid' => [ 'WonderMedia', 'WM8850', DeviceType::TABLET ], 'PAD1001' => [ 'Wortmann', 'TERRA MOBILE PAD 1001', DeviceType::TABLET ], + 'TERRA PAD 1004' => [ 'Wortmann', 'TERRA PAD 1004', DeviceType::TABLET ], + 'TERRA PAD 1005' => [ 'Wortmann', 'TERRA PAD 1005', DeviceType::TABLET ], 'Woxter!!' => [ 'Woxter android box 500' => [ 'Woxter', 'Android TV 500', DeviceType::TELEVISION ], @@ -16838,9 +17407,22 @@ 'MI 8 SE' => [ 'Xiaomi', 'Mi 8 SE' ], 'MI 8 UD' => [ 'Xiaomi', 'Mi 8 UD' ], 'MI 8 Lite' => [ 'Xiaomi', 'Mi 8 Lite' ], + 'MI 8 Pro' => [ 'Xiaomi', 'Mi 8 Pro' ], 'MI 9' => [ 'Xiaomi', 'Mi 9' ], - 'Mi 9T Pro' => [ 'Xiaomi', 'Mi 9T Pro' ], + 'Mi 9 Lite' => [ 'Xiaomi', 'Mi 9 Lite' ], 'Mi9 Pro 5G' => [ 'Xiaomi', 'Mi 9 Pro' ], + 'Mi 9 SE' => [ 'Xiaomi', 'Mi 9 SE' ], + 'Mi 9T' => [ 'Xiaomi', 'Mi 9T' ], + 'Mi 9T Pro' => [ 'Xiaomi', 'Mi 9T Pro' ], + 'Mi 10' => [ 'Xiaomi', 'Mi 10' ], + 'Mi 10 Pro' => [ 'Xiaomi', 'Mi 10 Pro' ], + 'Mi 10 Lite 5G' => [ 'Xiaomi', 'Mi 10 Lite' ], + 'Mi 10T Lite' => [ 'Xiaomi', 'Mi 10T Lite' ], + 'Mi 11' => [ 'Xiaomi', 'Mi 11' ], + 'Mi 11 Lite 5G' => [ 'Xiaomi', 'Mi 11 Lite' ], + 'Mi Note 10' => [ 'Xiaomi', 'Mi Note 10' ], + 'Mi Note 10 Lite' => [ 'Xiaomi', 'Mi Note 10 Lite' ], + 'Mi Note 10 Pro' => [ 'Xiaomi', 'Mi Note 10 Pro' ], '(Xiaomi|Xiaomi Mi|MI) Note!!' => [ '(Xiaomi|Xiaomi Mi|MI) Note (LTE|4G)$!' => [ 'Xiaomi', 'Mi Note' ], @@ -16856,6 +17438,11 @@ '(Xiaomi )?(MI )?MIX$!' => [ 'Xiaomi', 'Mi MIX' ], '(Xiaomi )?(MI )?MIX 2$!' => [ 'Xiaomi', 'Mi MIX 2' ], '(Xiaomi )?(MI )?MIX 2S$!' => [ 'Xiaomi', 'Mi MIX 2S' ], + 'MIX 3' => [ 'Xiaomi', 'Mi MIX 3' ], + 'Mi MIX 3' => [ 'Xiaomi', 'Mi MIX 3' ], + 'Mi MIX 3 5G' => [ 'Xiaomi', 'Mi MIX 3' ], + + 'MI PLAY' => [ 'Xiaomi', 'Mi Play' ], '(Xiaomi )?20!!' => [ '(Xiaomi )?20130(61)!' => [ 'Xiaomi', 'Mi 3' ], @@ -16884,15 +17471,23 @@ '(Xiaomi )?(Redmi|HM) ?5$!' => [ 'Xiaomi', 'Redmi 5' ], '(Xiaomi )?(Redmi|HM) ?5 Plus!' => [ 'Xiaomi', 'Redmi 5 Plus' ], '(Xiaomi )?(Redmi|HM) ?5A!' => [ 'Xiaomi', 'Redmi 5A' ], + '(Xiaomi )?(Redmi|HM) ?6$!' => [ 'Xiaomi', 'Redmi 6' ], '(Xiaomi )?(Redmi|HM) ?6A!' => [ 'Xiaomi', 'Redmi 6A' ], '(Xiaomi )?(Redmi|HM) ?6 Pro!' => [ 'Xiaomi', 'Redmi 6 Pro' ], '(Xiaomi )?(Redmi|HM) ?7$!' => [ 'Xiaomi', 'Redmi 7' ], '(Xiaomi )?(Redmi|HM) ?7A!' => [ 'Xiaomi', 'Redmi 7A' ], '(Xiaomi )?(Redmi|HM) ?8$!' => [ 'Xiaomi', 'Redmi 8' ], + '(Xiaomi )?(Redmi|HM) ?8A!' => [ 'Xiaomi', 'Redmi 8A' ], + '(Xiaomi )?(Redmi|HM) ?9C!' => [ 'Xiaomi', 'Redmi 9C' ], + '(Xiaomi )?(Redmi|HM) ?9T!' => [ 'Xiaomi', 'Redmi 9T' ], + '(Xiaomi )?Redmi[ \-]K20$!' => [ 'Xiaomi', 'Redmi K20' ], '(Xiaomi )?Redmi[ \-]K20 Pro!' => [ 'Xiaomi', 'Redmi K20 Pro' ], + '(Xiaomi )?Redmi[ \-]K30 5G!' => [ 'Xiaomi', 'Redmi K30' ], + '(Xiaomi )?Redmi[ \-]K30 Pro!' => [ 'Xiaomi', 'Redmi K30 Pro' ], '(Xiaomi )?Redmi[ \-]S2$!' => [ 'Xiaomi', 'Redmi S2' ], '(Xiaomi )?Redmi[ \-]Y1$!' => [ 'Xiaomi', 'Redmi Y1' ], '(Xiaomi )?Redmi[ \-]Y1 Lite!' => [ 'Xiaomi', 'Redmi Y1 Lite' ], + '(Xiaomi )?Redmi[ \-]Y2$!' => [ 'Xiaomi', 'Redmi Y2' ], '(Xiaomi )?Redmi[ \-]Go$!' => [ 'Xiaomi', 'Redmi Go' ], ], @@ -16906,9 +17501,15 @@ '(Xiaomi )?Redmi[ \-]Note ?5$!' => [ 'Xiaomi', 'Redmi Note 5' ], '(Xiaomi )?Redmi[ \-]Note ?5A!' => [ 'Xiaomi', 'Redmi Note 5A' ], '(Xiaomi )?Redmi[ \-]Note 5 Pro!' => [ 'Xiaomi', 'Redmi Note 5 Pro' ], + '(Xiaomi )?Redmi[ \-]Note 6 Pro!' => [ 'Xiaomi', 'Redmi Note 6 Pro' ], '(Xiaomi )?Redmi[ \-]Note 7$!' => [ 'Xiaomi', 'Redmi Note 7' ], '(Xiaomi )?Redmi[ \-]Note 7 Pro!' => [ 'Xiaomi', 'Redmi Note 7 Pro' ], '(Xiaomi )?Redmi[ \-]Note 8$!' => [ 'Xiaomi', 'Redmi Note 8' ], + '(Xiaomi )?Redmi[ \-]Note 8 Pro!' => [ 'Xiaomi', 'Redmi Note 8 Pro' ], + '(Xiaomi )?Redmi[ \-]Note 8T!' => [ 'Xiaomi', 'Redmi Note 8T' ], + '(Xiaomi )?Redmi[ \-]Note 9$!' => [ 'Xiaomi', 'Redmi Note 9' ], + '(Xiaomi )?Redmi[ \-]Note 9S!' => [ 'Xiaomi', 'Redmi Note 9S' ], + '(Xiaomi )?Redmi[ \-]Note 9 Pro!' => [ 'Xiaomi', 'Redmi Note 9 Pro' ], ], '(Xiaomi |HM)?20!!' => [ @@ -16931,12 +17532,79 @@ '(Xiaomi |HM)?20160(51)!' => [ 'Xiaomi', 'Redmi Note 4' ], ], + '21061119DG' => [ 'Xiaomi', 'Redmi 10' ], + '2201117TY' => [ 'Xiaomi', 'Redmi Note 11' ], + + '2107113SG' => [ 'Xiaomi', 'Mi 11T Pro' ], + '21081111RG' => [ 'Xiaomi', 'Mi 11T' ], + '2201122G' => [ 'Xiaomi', 'Mi 12 Pro' ], + '2201123G' => [ 'Xiaomi', 'Mi 12' ], + + '21091116AG' => [ 'Xiaomi', 'Poco M4 Pro' ], + '2201116PG' => [ 'Xiaomi', 'Poco X4 Pro' ], + + 'M1908C3JGG' => [ 'Xiaomi', 'Redmi Note 8 (2021)' ], + 'M2002J9G' => [ 'Xiaomi', 'Mi 10 Lite' ], + 'M2003J15SC' => [ 'Xiaomi', 'Redmi Note 9' ], + 'M2004J19C' => [ 'Xiaomi', 'Redmi 9' ], + 'M2004J7BC' => [ 'Xiaomi', 'Redmi 10X Pro' ], + 'M2006C3LG' => [ 'Xiaomi', 'Redmi 9A' ], + 'M2006C3LVG' => [ 'Xiaomi', 'Redmi 9AT' ], + 'M2006C3MG' => [ 'Xiaomi', 'Redmi 9C' ], + 'M2006C3MII' => [ 'Xiaomi', 'Redmi 9' ], + 'M2006C3MNG' => [ 'Xiaomi', 'Redmi 9C' ], + 'M2007J17G' => [ 'Xiaomi', 'Mi 10T Lite' ], + 'M2007J1SC' => [ 'Xiaomi', 'Mi 10 Ultra' ], + 'M2007J20CG' => [ 'Xiaomi', 'Poco X3' ], + 'M2007J22G' => [ 'Xiaomi', 'Redmi Note 9T' ], + 'M2007J3SG' => [ 'Xiaomi', 'Mi 10T Pro' ], + 'M2007J3SY' => [ 'Xiaomi', 'Mi 10T' ], + 'M2010J19CG' => [ 'Xiaomi', 'Poco M3' ], + 'M2010J19SG' => [ 'Xiaomi', 'Redmi 9T' ], + 'M2010J19SY' => [ 'Xiaomi', 'Redmi 9T' ], + 'M2011K2C' => [ 'Xiaomi', 'Mi 11' ], + 'M2011K2G' => [ 'Xiaomi', 'Mi 11' ], + 'M2012K11AG' => [ 'Xiaomi', 'Poco F3' ], + 'M2012K11AC' => [ 'Xiaomi', 'Redmi K40' ], + 'M2012K10C' => [ 'Xiaomi', 'Redmi K40 Gaming' ], + 'M2012K11G' => [ 'Xiaomi', 'Mi 11i' ], + 'M2101K6G' => [ 'Xiaomi', 'Redmi Note 10 Pro' ], + 'M2101K6P' => [ 'Xiaomi', 'Redmi Note 10 Pro' ], + 'M2101K7AG' => [ 'Xiaomi', 'Redmi Note 10' ], + 'M2101K7BG' => [ 'Xiaomi', 'Redmi Note 10s' ], + 'M2101K7BNY' => [ 'Xiaomi', 'Redmi Note 10s' ], + 'M2101K9AG' => [ 'Xiaomi', 'Mi 11 Lite' ], + 'M2101K9C' => [ 'Xiaomi', 'Mi 11 Lite' ], + 'M2101K9G' => [ 'Xiaomi', 'Mi 11 Lite' ], + 'M2102J20SG' => [ 'Xiaomi', 'Poco X3 Pro' ], + 'M2102J20SI' => [ 'Xiaomi', 'Poco X3 Pro' ], + 'M2102K1AC' => [ 'Xiaomi', 'Mi 11 Pro' ], + 'M2102K1C' => [ 'Xiaomi', 'Mi 11 Ultra' ], + 'M2102K1G' => [ 'Xiaomi', 'Mi 11 Ultra' ], + 'M2103K19G' => [ 'Xiaomi', 'Redmi Note 10' ], + 'M2103K19PG' => [ 'Xiaomi', 'Poco M3 Pro' ], + + '(Xiaomi |HM)?21!!' => [ + '(Xiaomi |HM)?21091(19)!' => [ 'Xiaomi', 'Mi 11 Lite' ], + ], + 'POCOPHONE F1' => [ 'Xiaomi', 'Pocophone F1' ], + 'POCO F1' => [ 'Xiaomi', 'Pocophone F1' ], + 'POCO F2 Pro' => [ 'Xiaomi', 'Poco F2 Pro' ], + 'POCO X2' => [ 'Xiaomi', 'Poco X2' ], + 'POCO X3 NFC' => [ 'Xiaomi', 'Poco X3' ], + 'POCO X3 Pro' => [ 'Xiaomi', 'Poco X3 Pro' ], + + 'SKR-H0' => [ 'Xiaomi', 'Black Shark' ], + 'DLT-H0' => [ 'Xiaomi', 'Black Shark 2 Pro' ], + 'SHARK PRS-H0' => [ 'Xiaomi', 'Black Shark 4' ], 'Xiaomi MDT2!' => [ 'Xiaomi', 'Mi 5x' ], 'Xiaomi MCT1!' => [ 'Xiaomi', 'Mi 6' ], 'Xiaomi MAT136!' => [ 'Xiaomi', 'Redmi 4X' ], 'Xiaomi MBT6A5!' => [ 'Xiaomi', 'Redmi Note 4X' ], + 'Xiaomi 11 Lite 5G NE' => [ 'Xiaomi', '11 Lite' ], + 'Xiaomi 11T Pro' => [ 'Xiaomi', '11T Pro' ], 'aqua' => [ 'Xiaomi', 'Mi 4s' ], 'capricorn' => [ 'Xiaomi', 'Mi 5s' ], @@ -16968,8 +17636,12 @@ '(Xiaomi|Xiaomi Mi|MI) Pad$!' => [ 'Xiaomi', 'Mi Pad', DeviceType::TABLET ], '(Xiaomi|Xiaomi Mi|MI) Pad 2!' => [ 'Xiaomi', 'Mi Pad 2', DeviceType::TABLET ], '(Xiaomi|Xiaomi Mi|MI) Pad 3!' => [ 'Xiaomi', 'Mi Pad 3', DeviceType::TABLET ], + '(Xiaomi|Xiaomi Mi|MI) Pad 4$!' => [ 'Xiaomi', 'Mi Pad 4', DeviceType::TABLET ], + '(Xiaomi|Xiaomi Mi|MI) Pad 4 Plus!' => [ 'Xiaomi', 'Mi Pad 4 Plus', DeviceType::TABLET ], ], + '21051182G' => [ 'Xiaomi', 'Mi Pad 5', DeviceType::TABLET ], + '(Xiaomi|Xiaomi Mi|MI)Box!!' => [ 'MiBOX iCNTV' => [ 'Xiaomi', 'Mi Box 1', DeviceType::TELEVISION ], '(Xiaomi|Xiaomi Mi|MI)Box1S!' => [ 'Xiaomi', 'Mi Box 1S', DeviceType::TELEVISION ], @@ -17539,6 +18211,9 @@ 'NX569H' => [ 'ZTE', 'Nubia Z17 Mini' ], 'NX513J' => [ 'ZTE', 'Nubia My Prague' ], 'NX601J' => [ 'ZTE', 'Nubia X6' ], + 'NX659J' => [ 'ZTE', 'Nubia Red Magic' ], + 'NX629J' => [ 'ZTE', 'Nubia Red Magic 3' ], + 'NX669J' => [ 'ZTE', 'Nubia Red Magic 6' ], ], 'ZTE K813' => [ 'ZTE', 'K813' ], @@ -18201,6 +18876,8 @@ 'ZTE A2017' => [ 'ZTE', 'Axon 7' ], 'ZTE A2017G' => [ 'ZTE', 'Axon 7' ], 'ZTE A2017U' => [ 'ZTE', 'Axon 7' ], + 'ZTE A2020G Pro' => [ 'ZTE', 'Axon 10 Pro' ], + 'ZTE A2022PG' => [ 'ZTE', 'Axon 30 Ultra' ], 'ZTE B2015' => [ 'ZTE', 'Axon Mini' ], 'ZTE B2016' => [ 'ZTE', 'Axon Mini' ], 'ZTE B2017' => [ 'ZTE', 'Axon Mini' ], @@ -18444,6 +19121,7 @@ 'GM 6' => [ 'General Mobile', 'GM6' ], 'GM 6 d' => [ 'General Mobile', 'GM6' ], 'GM 8 d' => [ 'General Mobile', 'GM8' ], + 'GM8 go' => [ 'General Mobile', 'GM8 Go' ], 'GM Discovery tab 8' => [ 'General Mobile', 'tab 8', DeviceType::TABLET ], 'etab5' => [ 'General Mobile', 'Etab 5', DeviceType::TABLET ], @@ -18847,6 +19525,35 @@ ], 'Z4 mini' => [ 'Q-Mobile', 'Noir Quatro Z4 mini' ], + + 'RMX1911' => [ 'Realme', '5' ], + 'RMX1931' => [ 'Realme', 'X2 Pro' ], + 'RMX1971' => [ 'Realme', '5 Pro' ], + 'RMX1993' => [ 'Realme', 'X2' ], + 'RMX2001' => [ 'Realme', '6' ], + 'RMX2002' => [ 'Realme', '6i' ], + 'RMX2020' => [ 'Realme', 'C3' ], + 'RMX2030' => [ 'Realme', '5i' ], + 'RMX2063' => [ 'Realme', '6 Pro' ], + 'RMX2075' => [ 'Realme', 'X50 Pro' ], + 'RMX2086' => [ 'Realme', 'X3 SuperZoom' ], + 'RMX2111' => [ 'Realme', '7' ], + 'RMX2144' => [ 'Realme', 'X50' ], + 'RMX2155' => [ 'Realme', '7' ], + 'RMX2170' => [ 'Realme', '7 Pro' ], + 'RMX2185' => [ 'Realme', 'C11' ], + 'RMX2202' => [ 'Realme', 'GT' ], + 'RMX3081' => [ 'Realme', '8 Pro' ], + 'RMX3085' => [ 'Realme', '8' ], + 'RMX3201' => [ 'Realme', 'C21' ], + 'RMX3241' => [ 'Realme', '8 5G' ], + 'RMX3242' => [ 'Realme', 'Narzo 30' ], + 'RMX3263' => [ 'Realme', 'C21Y' ], + 'RMX3301' => [ 'Realme', 'GT 2 Pro' ], + 'RMX3311' => [ 'Realme', 'GT 2' ], + 'RMX3363' => [ 'Realme', 'GT Master' ], + 'RMX3370' => [ 'Realme', 'GT Neo2' ], + 'Soshphone 4G' => [ 'SoshPhone', '4G' ], 'AQT80' => [ 'Sprint', 'Slate 8', DeviceType::TABLET ], @@ -19049,4 +19756,6 @@ 'VFD 1300' => [ 'Vodafone', 'Tab N8', DeviceType::TABLET ], 'VFD 1400' => [ 'Vodafone', 'Tab Prime 7', DeviceType::TABLET ], 'VFD1400' => [ 'Vodafone', 'Tab Prime 7', DeviceType::TABLET ], -]; + + 'TC26' => [ 'Zebra', 'TC26', DeviceType::POS ], +]; \ No newline at end of file diff --git a/data/models-ios.php b/data/models-ios.php index e006e8df0..e4c7ebf29 100644 --- a/data/models-ios.php +++ b/data/models-ios.php @@ -57,6 +57,16 @@ 'iPhone12,1' => [ 'Apple', 'iPhone 11', DeviceType::MOBILE ], 'iPhone12,3' => [ 'Apple', 'iPhone 11 Pro', DeviceType::MOBILE ], 'iPhone12,5' => [ 'Apple', 'iPhone 11 Pro Max', DeviceType::MOBILE ], + 'iPhone12,8' => [ 'Apple', 'iPhone SE (2nd gen)', DeviceType::MOBILE ], + 'iPhone13,1' => [ 'Apple', 'iPhone 12 Mini', DeviceType::MOBILE ], + 'iPhone13,2' => [ 'Apple', 'iPhone 12', DeviceType::MOBILE ], + 'iPhone13,3' => [ 'Apple', 'iPhone 12 Pro', DeviceType::MOBILE ], + 'iPhone13,4' => [ 'Apple', 'iPhone 12 Pro Max', DeviceType::MOBILE ], + 'iPhone14,2' => [ 'Apple', 'iPhone 13 Pro', DeviceType::MOBILE ], + 'iPhone14,3' => [ 'Apple', 'iPhone 13 Pro Max', DeviceType::MOBILE ], + 'iPhone14,4' => [ 'Apple', 'iPhone 13 Mini', DeviceType::MOBILE ], + 'iPhone14,5' => [ 'Apple', 'iPhone 13', DeviceType::MOBILE ], + 'iPod1,1' => [ 'Apple', 'iPod touch', DeviceType::MEDIA ], 'iPod2,1' => [ 'Apple', 'iPod touch (2nd gen)', DeviceType::MEDIA ], 'iPod3,1' => [ 'Apple', 'iPod touch (3rd gen)', DeviceType::MEDIA ], @@ -114,8 +124,28 @@ 'iPad8,6' => [ 'Apple', 'iPad Pro (12.9″, 3rd gen)', DeviceType::TABLET ], 'iPad8,7' => [ 'Apple', 'iPad Pro (12.9″, 3rd gen)', DeviceType::TABLET ], 'iPad8,8' => [ 'Apple', 'iPad Pro (12.9″, 3rd gen)', DeviceType::TABLET ], + 'iPad8,9' => [ 'Apple', 'iPad Pro (11.0″, 4th gen)', DeviceType::TABLET ], + 'iPad8,10' => [ 'Apple', 'iPad Pro (11.0″, 4th gen)', DeviceType::TABLET ], + 'iPad8,11' => [ 'Apple', 'iPad Pro (12.9″, 4th gen)', DeviceType::TABLET ], + 'iPad8,12' => [ 'Apple', 'iPad Pro (12.9″, 4th gen)', DeviceType::TABLET ], 'iPad11,1' => [ 'Apple', 'iPad mini (5th gen)', DeviceType::TABLET ], 'iPad11,2' => [ 'Apple', 'iPad mini (5th gen)', DeviceType::TABLET ], 'iPad11,3' => [ 'Apple', 'iPad Air (3rd gen)', DeviceType::TABLET ], 'iPad11,4' => [ 'Apple', 'iPad Air (3rd gen)', DeviceType::TABLET ], + 'iPad11,6' => [ 'Apple', 'iPad (8th gen)', DeviceType::TABLET ], + 'iPad11,7' => [ 'Apple', 'iPad (8th gen)', DeviceType::TABLET ], + 'iPad12,1' => [ 'Apple', 'iPad (9th gen)', DeviceType::TABLET ], + 'iPad12,2' => [ 'Apple', 'iPad (9th gen)', DeviceType::TABLET ], + 'iPad14,1' => [ 'Apple', 'iPad mini (6th gen)', DeviceType::TABLET ], + 'iPad14,2' => [ 'Apple', 'iPad mini (6th gen)', DeviceType::TABLET ], + 'iPad13,1' => [ 'Apple', 'iPad Air (4th gen)', DeviceType::TABLET ], + 'iPad13,2' => [ 'Apple', 'iPad Air (4th gen)', DeviceType::TABLET ], + 'iPad13,4' => [ 'Apple', 'iPad Pro (11.0″, 5th gen)', DeviceType::TABLET ], + 'iPad13,5' => [ 'Apple', 'iPad Pro (11.0″, 5th gen)', DeviceType::TABLET ], + 'iPad13,6' => [ 'Apple', 'iPad Pro (11.0″, 5th gen)', DeviceType::TABLET ], + 'iPad13,7' => [ 'Apple', 'iPad Pro (11.0″, 5th gen)', DeviceType::TABLET ], + 'iPad13,8' => [ 'Apple', 'iPad Pro (12.9″, 5th gen)', DeviceType::TABLET ], + 'iPad13,9' => [ 'Apple', 'iPad Pro (12.9″, 5th gen)', DeviceType::TABLET ], + 'iPad13,10' => [ 'Apple', 'iPad Pro (12.9″, 5th gen)', DeviceType::TABLET ], + 'iPad13,11' => [ 'Apple', 'iPad Pro (12.9″, 5th gen)', DeviceType::TABLET ], ]; diff --git a/data/os-darwin.php b/data/os-darwin.php index f50461154..8fc6fd7d1 100644 --- a/data/os-darwin.php +++ b/data/os-darwin.php @@ -15,6 +15,14 @@ '13' => [ 'value' =>'10.9' ], '14' => [ 'value' =>'10.10' ], '15' => [ 'value' =>'10.11' ], + '16' => [ 'value' =>'10.12' ], + '17' => [ 'value' =>'10.13' ], + '18' => [ 'value' =>'10.14' ], + '19' => [ 'value' =>'10.15' ], + '20' => [ 'value' =>'11' ], + '21' => [ 'value' =>'12' ], + '22' => [ 'value' =>'13' ], + '23' => [ 'value' =>'14' ], ]; Darwin::$IOS = [ @@ -24,4 +32,12 @@ '13' => [ 'value' =>'6' ], '14' => [ 'value' =>'7' ], '15' => [ 'value' =>'9' ], + '16' => [ 'value' =>'10' ], + '17' => [ 'value' =>'11' ], + '18' => [ 'value' =>'12' ], + '19' => [ 'value' =>'13' ], + '20' => [ 'value' =>'14' ], + '21' => [ 'value' =>'15' ], + '22' => [ 'value' =>'16' ], + '23' => [ 'value' =>'17' ], ]; diff --git a/data/regexes/applications-bots.php b/data/regexes/applications-bots.php index 740a281b8..79571d03a 100644 --- a/data/regexes/applications-bots.php +++ b/data/regexes/applications-bots.php @@ -2,4 +2,4 @@ namespace WhichBrowser\Data; -Applications::$BOTS_REGEX = '/(008|360|a6|abound|muncher|adaxas|addthis|admantx|ahrefsbot|archiver|altavista|curious|cloudfront|amorank|archive|jeeves|astra|backlink|baidu|bazqux|bingbot|msnbot|msmobot|bing|blogbridge|bloglines|bloglovin|blogpulse|blogram|blogtrot|blogshares|boardreader|browsershots|bubing|butterfly|heritrix|cliqz|cloudflare|comodo|commafeed|cbot|watchdog|datasearch|daumoa|digg|domain|exabot|exactseek|ezooms|facebook|fast|flamingo|fastladder|feed|wrangler|validator|fever|friendica|robot|genieo|fetchor|google|gomez|ichiro|gooblog|goorss|grammarly|grub|hatena|capture|heureka|htdig|httpmon|hubpages|spider|crawler|kouio|larbin|linkedin|linkdex|livedoor|ltx71|magpie|mapion|socialstreams|mixi|mnogo|monitor|yeti|netcraft|netvibes|newsblur|newsgator|orange|pages|psbot|pingdom|pinterest|postrank|python|comment|rssbar|hunter|quora|safesearch|scrapy|seznam|shopwiki|reader|simplepie|site24|sogou|sophora|soso|spdycheck|spinn|detector|summify|telegram|twisted|twitter|tiny|tlsprober|typhoeus|vagabondo|voila|vocus|mcrawler|w3bot|jigsaw|w3c|wayback|webindexer|wordpress|mechanize|xerka|sitemap|yacy|yandex|yahoo|y\!j|slurp|httpclient|nutch|synapse|indy|wget|curl|package|java|simple|libwww|lwp|urllib|php|pear|zend|ruby)/i'; +Applications::$BOTS_REGEX = '/(008|360|a6|abound|muncher|adaxas|addthis|admantx|adsbot|ahrefs|archiver|altavista|curious|cloudfront|amorank|apple|archive|jeeves|astra|backlink|baidu|barkrowler|bazqux|bingbot|msnbot|msmobot|bing|blex|blogbridge|blogger|bloglines|bloglovin|blogpulse|blogram|blogtrot|blogshares|boardreader|lddc|browsershots|bubing|buck|builtwith|butterfly|buzzsumo|bytespider|heritrix|clarabot|cliqz|cloudflare|coccoc|comodo|commafeed|cbot|cresearch|watchdog|datanyze|datasearch|dataprovider|daum|daumoa|digg|domaincrawl|domainstats|discord|domain|dmca|duckduck|embed|evc|exabot|exactseek|ezooms|facebook|fast|flamingo|fastladder|feed|wrangler|validator|fever|florienzh|friendica|robot|genieo|fetchor|google|gofeed|gomez|ichiro|gooblog|goorss|gowiki|grammarly|grub|hatena|capture|heureka|hootsuite|htdig|httpmon|hubpages|hubspot|spider|indeed|iodc|istellabot|crawler|kakao|kouio|larbin|letsearch|line|linkedin|linkpad|linkdex|livedoor|seeker|ltx71|magpie|mj12bot|mapion|mail\.ru|medium|megaindex|socialstreams|mixi|minds|mnogo|mojeek|monitor|dotbot|rogerbot|yeti|mxtoolbox|netcraft|netestate|netvibes|newsblur|newsgator|nimbostratus|odklbot|orange|pages|petal|aspiegel|psbot|pingdom|pinterest|plurk|pocket|postrank|comment|reddit|rssbar|hunter|quora|safesearch|scrapy|searchatlas|seekport|semrush|serpstat|seokicks|seznam|shopwiki|reader|simplepie|site24|skype|slack|sogou|sophora|soso|spaziodati|spdycheck|spinn|sputnik|detector|summify|telegram|twisted|twitter|tiny|tineye|tlsprober|trustedsite|typhoeus|vagabondo|velen|vkshare|voat|voila|vocus|mcrawler|vuhuv|w3bot|jigsaw|w3c|wappalyzer|wayback|webindexer|wordpress|mechanize|xenu|xerka|sitemap|yacy|yandex|yahoo|y\!j|slurp|yelp|yioop|yisou|zgrab|zmeu|httpclient|nutch|synapse|indy|go|httpunit|okhttp|node|wget|curl|package|java|simple|libwww|lwp|urllib|requests|php|pear|zend|ruby)/i'; diff --git a/data/regexes/applications-browsers.php b/data/regexes/applications-browsers.php index a23752a7a..4f134caee 100644 --- a/data/regexes/applications-browsers.php +++ b/data/regexes/applications-browsers.php @@ -2,4 +2,4 @@ namespace WhichBrowser\Data; -Applications::$BROWSERS_REGEX = '/(115|126|2345|qihu|7star|abrowse|acorn|acoo|aol|america|arachne|arora|aweb|avant|asw|aviator|flyflow|bdbrowser|bdspark|beamrise|blackwren|brave|byffox|camino|canure|charon|chromeplus|cometbird|comodo|dragon|conkeror|coolnovo|cunaguaro|cyberfox|daedalus|dillo|rhodonit|eudoraweb|flock|galeon|epiphany|ibrowse|icab|iceape|icecat|iceweasel|iridium|iron|kazehakase|kchrome|meleon|lbbrowser|lobo|lunascape|naenara|mxbrowser|mixshark|mlbrowser|netpositive|origyn|owb|orca|oregano|otter|palemoon|qtweb|qupzilla|rekonq|ryouko|saayaa|sleipnir|metasr|stainless|sunchrome|superbird|swing|tencent|tenfourfox|theworld|tungsten|vivaldi|voyager|waterfox|yabrowser|1password|3g explorer|4g explorer|atomiclite|au|awakening|baidu|bdmobile|bidu|baiduboxapp|browser|blazer|acheetahi|cornowser|coolmarket|cute|digia|doris|doroty|www browser|eui|go\.web|helium|huohoubrowser|surfboard|isurf|jig browser|jumanji|kiosk|lebrowser|liebao|macross|mammoth|mcent|mib|cmcs|motorola|netfrontlife|onebrowser|plink|polaris|openwave|up|km|oppo|quark|semc|stnc|sogou|symphony|ucpro|vivo|weblite|alti|aplix|awox|browserserver|isis|spyglass|oregan|viera|zetakey|bunjalloo|nwf|nuanti|wib|prince|demobrowser|dooble|dwb|evm|fireweb|hive|intermec|phantom|qt|roccat|raven|rockmelt|scope|slim|smbrowser|snowshoe|sputnik|surf|tao|taz|uzbl|villanova|vimb|wada|wavelink|webrender|webster|wyzo|yelang|yrcweb|linemode|lynx|links|w3m|nimbus|Webwasher|sankore|adapi|brightsign|coship)/i'; +Applications::$BROWSERS_REGEX = '/(115|126|2345|37abc|qihu|1stbrowser|7star|abrowse|acorn|acoo|amigo|aol|america|apus|arachne|arora|aweb|avant|asw|avg|aviator|avira|flyflow|bdbrowser|bdspark|basilisk|beamrise|beonex|blackwren|blackhawk|bolt|blackbird|brave|brisk|browsex|browzar|byffox|camino|canure|ccleaner|cent|charon|chedot|cheshire|chimlac|chimera|chromeplus|colibri|columbus|cometbird|comodo|dragon|conkeror|coc|coolnovo|corom|crazy|crusta|cunaguaro|cyberdog|cyberfox|daedalus|degan|demeter|deskbrowse|diigo|dillo|doczilla|rhodonit|dplus|elements|eudoraweb|falkon|flamesky|flock|framafox|freeu|galeon|globalmojo|epiphany|greenbrowser|hola|hydra|ibrowse|icab|iceape|icecat|icedove|iceweasel|irider|iridium|iron|kapiko|kazehakase|kchrome|kinza|kkman|klondike|kylo|meleon|lbrowser|lbbrowser|light|lobo|lolifox|lovense|lunascape|naenara|netcaptor|madfox|mxbrowser|min|mini|mixshark|mlbrowser|mypal|multixp|netpositive|nichrome|origyn|owb|live|juzi|orca|oregano|otter|palemoon|patriott|perk|polarity|privacy|qiyu|qtweb|quicklook|qupzilla|qute|rekonq|ryouko|sylera|saayaa|salam|shiira|sielo|sitekiosk|sleipnir|slimjet|metasr|sparrow|sputnik|stainless|station|sunchrome|sundance|sundial|superbird|swiftweasel|swiftfox|swing|to-browser|tencent|tenfourfox|theworld|tulip|tungsten|ultrab|usejump|vimprobable|vivaldi|airwatch|vonkeror|voyager|waterfox|whale|winwap|xvast|yabrowser|zvu|zipzap|zombie|1password|3g explorer|4g explorer|aloha|atomiclite|au|awakening|baidu|bdmobile|bidu|baiduboxapp|browser|blazer|acheetahi|cornowser|coolmarket|cute|digia|doris|doroty|ecosia|www browser|epic|eui|go\.web|helium|heytap|huohoubrowser|surfboard|isurf|jig browser|jumanji|tnsbrowser|kiosk|kiwi|lebrowser|liebao|macross|mammoth|mcent|mint|mobicip|mib|cmcs|motorola|multizilla|netfrontlife|onebrowser|oneplus|plink|polaris|pure|openwave|up|km|oppo|quark|realme|semc|stnc|sogou|symphony|tenta|ucpro|vivo|weblite|wk|yaani|alti|aplix|awox|browserserver|isis|netbox|spyglass|oregan|viera|zetakey|bunjalloo|nwf|nuanti|wib|prince|demobrowser|dooble|dwb|evm|fireweb|hive|intermec|phantom|qt|roccat|raven|rockmelt|scope|slim|smbrowser|snowshoe|surf|tao|taz|uzbl|villanova|vimb|wada|wavelink|webrender|webster|wyzo|yelang|yrcweb|linemode|lynx|links|w3m|nimbus|Webwasher|sankore|adapi|brightsign|coship)/i'; diff --git a/data/regexes/applications-others.php b/data/regexes/applications-others.php index 382b3ab4c..483dcade1 100644 --- a/data/regexes/applications-others.php +++ b/data/regexes/applications-others.php @@ -2,4 +2,4 @@ namespace WhichBrowser\Data; -Applications::$OTHERS_REGEX = '/(itunes|qt|bluefish|nightingale|songbird|stagefright|substream|vlc|windows-media|coreplayer|flycast|boxee|kodi|xbmc|lightning|thunderbird|outlook|lotus|postbox|bat|yahoo|daum|flipboard|akregator|blogos|cococ|feed|liferea|news|jetbrains|rss|reeder|reedkit|rome|ziepod|messenger|kik|wire|yammer|fbios|fb4a|googleplus|instagram|pinterest|weibo|tumblr|twitter|wp-android|office|bingweb|hao123|gsa|naver|sogousearch|yandex|atom|golive|brackets|iweb|frontpage|amaya|websphere|download|tansodl|origin|secondlife|valve|raptr|alipay|cooliris|google|leechcraft|expeditor)/i'; +Applications::$OTHERS_REGEX = '/(itunes|qt|bluefish|nightingale|songbird|stagefright|substream|vlc|windows-media|coreplayer|flycast|boxee|kodi|xbmc|lightning|thunderbird|outlook|lotus|postbox|bat|yahoo|daum|flipboard|akregator|blogos|cococ|feed|liferea|news|jetbrains|rss|reeder|reedkit|rome|ziepod|messenger|kakao|kik|line|slack|viber|whatsapp|wire|yammer|zalo|fbios|fb4a|googleplus|instagram|pinterest|weibo|tumblr|twitter|wp-android|yelp|office|bingweb|hao123|gsa|naver|sogousearch|yandex|atom|golive|brackets|iweb|frontpage|amaya|websphere|download|tansodl|origin|secondlife|valve|raptr|alipay|cooliris|google|leechcraft|expeditor)/i'; diff --git a/phpunit.xml b/phpunit.xml index 21914d822..da8f7c52e 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,5 +1,5 @@ @@ -26,7 +25,7 @@ - + diff --git a/src/Analyser/Camouflage.php b/src/Analyser/Camouflage.php index f109ac462..90b14f214 100644 --- a/src/Analyser/Camouflage.php +++ b/src/Analyser/Camouflage.php @@ -11,7 +11,6 @@ trait Camouflage private function &detectCamouflage() { if ($ua = $this->getHeader('User-Agent')) { - $this ->detectCamouflagedAndroidBrowser($ua) ->detectCamouflagedAndroidAsusBrowser($ua) @@ -123,9 +122,8 @@ private function &detectCamouflagedAsChrome($ua) { if ($this->data->isBrowser('Chrome')) { if (preg_match('/(?:Chrome|CrMo|CriOS)\//u', $ua) - && !preg_match('/(?:Chrome|CrMo|CriOS)\/([0-9]{1,2}\.[0-9]\.[0-9]{3,4}\.[0-9]+)/u', $ua) + && !preg_match('/(?:Chrome|CrMo|CriOS)\/([0-9]{1,3}\.[0-9]\.(0\.0|[0-9]{3,4}\.[0-9]+))/u', $ua) ) { - $this->data->features[] = 'wrongVersion'; $this->data->camouflage = true; } @@ -137,7 +135,6 @@ private function &detectCamouflagedAsChrome($ua) private function &detectCamouflagedUCBrowser($ua) { if ($ua == 'Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.2.3.4) Gecko/') { - if (!$this->data->isBrowser('UC Browser')) { $this->data->browser->name = 'UC Browser'; $this->data->browser->version = null; @@ -168,7 +165,6 @@ private function &detectCamouflagedUCBrowser($ua) private function &detectCamouflagedBasedOnEngines() { if (isset($this->data->engine->name) && $this->data->browser->mode != 'proxy') { - /* If it claims not to be Trident, but it is probably Trident running camouflage mode */ if ($this->options->engine & Constants\EngineType::TRIDENT) { $this->data->features[] = 'trident'; @@ -268,7 +264,6 @@ private function &detectCamouflagedBasedOnFeatures() { if (isset($this->data->browser->name) && isset($this->data->os->name)) { if ($this->data->os->name == 'iOS' && $this->data->browser->name != 'Opera Mini' && $this->data->browser->name != 'UC Browser' && isset($this->data->os->version)) { - if ($this->data->os->version->toFloat() < 4.0 && $this->options->features & Constants\Feature::SANDBOX) { $this->data->features[] = 'foundSandbox'; $this->data->camouflage = true; @@ -286,7 +281,6 @@ private function &detectCamouflagedBasedOnFeatures() } if ($this->data->os->name != 'iOS' && $this->data->browser->name == 'Safari' && isset($this->data->browser->version)) { - if ($this->data->browser->version->toFloat() < 4.0 && $this->options->features & Constants\Feature::APPCACHE) { $this->data->features[] = 'foundAppCache'; $this->data->camouflage = true; diff --git a/src/Analyser/Corrections.php b/src/Analyser/Corrections.php index a51bbd57b..c41d37997 100644 --- a/src/Analyser/Corrections.php +++ b/src/Analyser/Corrections.php @@ -41,10 +41,37 @@ private function &applyCorrections() $this->hideFamilyIfEqualToBrowser(); } + if (isset($this->data->browser->name) && isset($this->data->os->name) && isset($this->data->os->version)) { + $this->hideOsVersionIfFixed(); + } + return $this; } + private function hideOsVersionIfFixed() + { + if ($this->data->os->name == 'OS X') { + $name = $this->data->browser->name; + + if (isset($this->data->browser->family)) { + $name = $this->data->browser->family->name; + } + + if ($name == 'Chrome' && $this->data->os->version->value == "10.15.7") { + $this->data->os->version = null; + } + + if ($name == 'Safari' && $this->data->os->version->value == "10.15.7") { + $this->data->os->version = null; + } + + if ($name == 'Firefox' && $this->data->os->version->value == "10.15") { + $this->data->os->version = null; + } + } + } + private function hideFamilyIfEqualToBrowser() { if ($this->data->browser->name == $this->data->browser->family->name) { @@ -116,7 +143,7 @@ private function hideBrowserBasedOnOperatingSystem() private function hideBrowserOnDeviceTypeGaming() { - if (isset($this->data->device->model) && $this->data->device->model == 'Playstation 2' && $this->data->browser->name == 'Internet Explorer') { + if (isset($this->data->device->model) && $this->data->device->model == 'PlayStation 2' && $this->data->browser->name == 'Internet Explorer') { $this->data->browser->reset(); } } diff --git a/src/Analyser/Derive.php b/src/Analyser/Derive.php index acc4b9b89..29345a357 100644 --- a/src/Analyser/Derive.php +++ b/src/Analyser/Derive.php @@ -484,6 +484,22 @@ private function deriveBasedOnOperatingSystem() if ($this->data->os->version->is('10.15')) { $this->data->os->version->nickname = 'Catalina'; } + + if ($this->data->os->version->is('11')) { + $this->data->os->version->nickname = 'Big Sur'; + } + + if ($this->data->os->version->is('12')) { + $this->data->os->version->nickname = 'Monterey'; + } + + if ($this->data->os->version->is('13')) { + $this->data->os->version->nickname = 'Ventura'; + } + + if ($this->data->os->version->is('14')) { + $this->data->os->version->nickname = 'Sonoma'; + } } } } diff --git a/src/Analyser/Header.php b/src/Analyser/Header.php index 0655c624a..35e998b4b 100644 --- a/src/Analyser/Header.php +++ b/src/Analyser/Header.php @@ -139,9 +139,11 @@ private function additionalUserAgent($ua) private function getHeader($h) { + /* Find the header that matches */ foreach ($this->headers as $k => $v) { if (strtolower($h) == strtolower($k)) { - return $v; + /* And return the first 1024 bytes */ + return substr($v, 0, 1024); } } } diff --git a/src/Analyser/Header/Baidu.php b/src/Analyser/Header/Baidu.php index 09607f86a..5daa15d9e 100644 --- a/src/Analyser/Header/Baidu.php +++ b/src/Analyser/Header/Baidu.php @@ -4,6 +4,8 @@ class Baidu { + private $data; + public function __construct($header, &$data) { $this->data =& $data; diff --git a/src/Analyser/Header/BrowserId.php b/src/Analyser/Header/BrowserId.php index 6b57b76c2..9e33223ce 100644 --- a/src/Analyser/Header/BrowserId.php +++ b/src/Analyser/Header/BrowserId.php @@ -9,6 +9,8 @@ class BrowserId { + private $data; + public function __construct($header, &$data) { if ($header == 'XMLHttpRequest') { diff --git a/src/Analyser/Header/OperaMini.php b/src/Analyser/Header/OperaMini.php index d8525bdf6..ab8981cc1 100644 --- a/src/Analyser/Header/OperaMini.php +++ b/src/Analyser/Header/OperaMini.php @@ -7,6 +7,8 @@ class OperaMini { + private $data; + public function __construct($header, &$data) { $this->data =& $data; diff --git a/src/Analyser/Header/Puffin.php b/src/Analyser/Header/Puffin.php index fdd34891b..d2a96d6be 100644 --- a/src/Analyser/Header/Puffin.php +++ b/src/Analyser/Header/Puffin.php @@ -6,6 +6,8 @@ class Puffin { + private $data; + public function __construct($header, &$data) { $this->data =& $data; diff --git a/src/Analyser/Header/UCBrowserNew.php b/src/Analyser/Header/UCBrowserNew.php index d3f20c72c..3ec856364 100644 --- a/src/Analyser/Header/UCBrowserNew.php +++ b/src/Analyser/Header/UCBrowserNew.php @@ -8,6 +8,8 @@ class UCBrowserNew { + private $data; + public function __construct($header, &$data) { $this->data =& $data; diff --git a/src/Analyser/Header/UCBrowserOld.php b/src/Analyser/Header/UCBrowserOld.php index 12caa9a1f..95b71bed7 100644 --- a/src/Analyser/Header/UCBrowserOld.php +++ b/src/Analyser/Header/UCBrowserOld.php @@ -7,6 +7,8 @@ class UCBrowserOld { + private $data; + public function __construct($header, &$data) { $this->data =& $data; diff --git a/src/Analyser/Header/Useragent.php b/src/Analyser/Header/Useragent.php index ebfa20010..d950f98f4 100644 --- a/src/Analyser/Header/Useragent.php +++ b/src/Analyser/Header/Useragent.php @@ -6,6 +6,10 @@ class Useragent { use Useragent\Os, Useragent\Device, Useragent\Browser, Useragent\Application, Useragent\Using, Useragent\Engine, Useragent\Bot; + private $data; + + private $options; + public function __construct($header, &$data, &$options) { $this->data =& $data; diff --git a/src/Analyser/Header/Useragent/Browser.php b/src/Analyser/Header/Useragent/Browser.php index f85d23b7a..9c9ace956 100644 --- a/src/Analyser/Header/Useragent/Browser.php +++ b/src/Analyser/Header/Useragent/Browser.php @@ -132,24 +132,35 @@ private function detectChrome($ua) $this->data->browser->type = Constants\BrowserType::BROWSER; $this->data->browser->stock = false; + $reduced = false; $version = ''; + if (preg_match('/(?:Chrome|CrMo|CriOS)\/([0-9.]*)/u', $ua, $match)) { $version = $match[1]; } if (preg_match('/Browser\/Chrome([0-9.]*)/u', $ua, $match)) { $version = $match[1]; } + + if (preg_match('/Chrome\/([789][0-9]|[1-9][0-9][0-9])\.0\.0\.0 /u', $ua)) { + $reduced = true; + } + $this->data->browser->version = new Version([ 'value' => $version ]); if (isset($this->data->os->name) && $this->data->os->name == 'Android') { - $channel = Data\Chrome::getChannel('mobile', $this->data->browser->version->value); - - if ($channel == 'stable') { + if ($reduced) { $this->data->browser->version->details = 1; - } elseif ($channel == 'beta') { - $this->data->browser->channel = 'Beta'; } else { - $this->data->browser->channel = 'Dev'; + $channel = Data\Chrome::getChannel('mobile', $this->data->browser->version->value); + + if ($channel == 'stable') { + $this->data->browser->version->details = 1; + } elseif ($channel == 'beta') { + $this->data->browser->channel = 'Beta'; + } else { + $this->data->browser->channel = 'Dev'; + } } @@ -185,7 +196,6 @@ private function detectChrome($ua) /* Samsung Chromium based browsers */ if (isset($this->data->device->manufacturer) && $this->data->device->manufacturer == 'Samsung') { - /* Version 1.0 */ if ($version == '18.0.1025.308' && preg_match('/Version\/1.0/u', $ua)) { $this->data->browser->name = "Samsung Internet"; @@ -275,18 +285,22 @@ private function detectChrome($ua) $this->data->device->identified |= Constants\Id::PATTERN; $this->data->device->type = Constants\DeviceType::DESKTOP; } else { - $channel = Data\Chrome::getChannel('desktop', $version); + if ($reduced) { + $this->data->browser->version->details = 1; + } else { + $channel = Data\Chrome::getChannel('desktop', $version); - if ($channel == 'stable') { - if (explode('.', $version)[1] == '0') { - $this->data->browser->version->details = 1; + if ($channel == 'stable') { + if (explode('.', $version)[1] == '0') { + $this->data->browser->version->details = 1; + } else { + $this->data->browser->version->details = 2; + } + } elseif ($channel == 'beta') { + $this->data->browser->channel = 'Beta'; } else { - $this->data->browser->version->details = 2; + $this->data->browser->channel = 'Dev'; } - } elseif ($channel == 'beta') { - $this->data->browser->channel = 'Beta'; - } else { - $this->data->browser->channel = 'Dev'; } } @@ -382,7 +396,7 @@ private function detectExplorer($ua) if (preg_match('/IEMobile/u', $ua) || preg_match('/Windows CE/u', $ua) || preg_match('/Windows Phone/u', $ua) || preg_match('/WP7/u', $ua) || preg_match('/WPDesktop/u', $ua)) { $this->data->browser->name = 'Mobile Internet Explorer'; - if (isset($this->data->device->model) && ($this->data->device->model == 'Xbox 360' || $this->data->device->model == 'Xbox One')) { + if (isset($this->data->device->model) && ($this->data->device->model == 'Xbox 360' || $this->data->device->model == 'Xbox One' || $this->data->device->model == 'Xbox Series X')) { $this->data->browser->name = 'Internet Explorer'; } } @@ -464,6 +478,19 @@ private function detectExplorer($ua) } } + /* Microsoft Open Live Writer */ + + if (preg_match('/Open Live Writer ([0-9.]*)/u', $ua, $match)) { + $this->data->browser->type = Constants\BrowserType::BROWSER; + $this->data->browser->stock = false; + $this->data->browser->name = 'Open Live Writer'; + $this->data->browser->version = new Version([ 'value' => $match[1] ]); + $this->data->browser->channel = null; + + if (preg_match('/MSIE ([0-9.]*)/u', $ua, $match)) { + $this->data->browser->using = new Using([ 'name' => 'Internet Explorer', 'version' => new Version([ 'value' => $match[1] ]) ]); + } + } /* Set the browser family */ @@ -505,7 +532,7 @@ private function detectEdge($ua) private function detectOpera($ua) { - if (!preg_match('/(OPR|OMI|Opera|OPiOS|OPT|Coast|Oupeng)/ui', $ua)) { + if (!preg_match('/(OPR|OMI|Opera|OPiOS|OPT|Coast|Oupeng|OPRGX|MMS)/ui', $ua)) { return; } @@ -666,6 +693,20 @@ private function detectOpera($ua) $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]); $this->data->browser->type = Constants\BrowserType::BROWSER; } + + if (preg_match('/\sMMS\/([0-9.]*)$/u', $ua, $match)) { + $this->data->browser->stock = false; + $this->data->browser->name = 'Opera Neon'; + $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]); + $this->data->browser->type = Constants\BrowserType::BROWSER; + } + + if (preg_match('/OPRGX\/([0-9.]*)$/u', $ua, $match)) { + $this->data->browser->stock = false; + $this->data->browser->name = 'Opera GX'; + $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]); + $this->data->browser->type = Constants\BrowserType::BROWSER; + } } @@ -673,7 +714,7 @@ private function detectOpera($ua) private function detectFirefox($ua) { - if (!preg_match('/(Firefox|GranParadiso|Namoroka|Shiretoko|Minefield|BonEcho|Fennec|Phoenix|Firebird|Minimo|FxiOS|Focus)/ui', $ua)) { + if (!preg_match('/(Firefox|Lorentz|GranParadiso|Namoroka|Shiretoko|Minefield|BonEcho|Fennec|Phoenix|Firebird|Minimo|FxiOS|Focus)/ui', $ua)) { return; } @@ -737,8 +778,7 @@ private function detectFirefox($ua) } } - - if (preg_match('/(GranParadiso|Namoroka|Shiretoko|Minefield|BonEcho)/u', $ua, $match)) { + if (preg_match('/(Lorentz|GranParadiso|Namoroka|Shiretoko|Minefield|BonEcho)/u', $ua, $match)) { $this->data->browser->stock = false; $this->data->browser->name = 'Firefox'; $this->data->browser->channel = str_replace('GranParadiso', 'Gran Paradiso', $match[1]); @@ -1340,7 +1380,7 @@ private function detectNetfront($ua) if (in_array($match[1], [ 'ACCESS/NFPS', 'SUNSOFT/EnjoyMagic' ])) { $this->data->device->setIdentification([ 'manufacturer' => 'Sony', - 'model' => 'Playstation 2', + 'model' => 'PlayStation 2', 'type' => Constants\DeviceType::GAMING, 'subtype' => Constants\DeviceSubType::CONSOLE ]); @@ -1843,7 +1883,7 @@ private function detectOmniWeb($ua) private function detectDesktopBrowsers($ua) { - if (!preg_match('/(WebPositive|WebExplorer|WorldWideweb|Midori|Maxthon|Browse)/ui', $ua)) { + if (!preg_match('/(WebPositive|WebExplorer|WorldWideweb|Midori|Maxthon|Browse|Flow)/ui', $ua)) { return; } @@ -1940,14 +1980,37 @@ private function detectDesktopBrowsers($ua) $this->data->browser->version = new Version([ 'value' => $match[1] ]); $this->data->browser->type = Constants\BrowserType::BROWSER; } + + /* Browse for Flow */ + + if (preg_match('/ Flow\/([0-9.]+)/u', $ua, $match)) { + $this->data->browser->name = 'Flow'; + $this->data->browser->channel = ''; + $this->data->browser->version = new Version([ 'value' => $match[1] ]); + $this->data->browser->type = Constants\BrowserType::BROWSER; + unset($this->data->browser->family); + + if (preg_match('/EkiohFlow\/[0-9\.]+M/u', $ua)) { + $this->data->browser->name = 'Flow Nightly Build'; + $this->data->browser->version = null; + } + } } private function detectMobileBrowsers($ua) { - if (!preg_match('/(Ninesky|Skyfire|Dolphin|QQ|360|QHBrowser|Mercury|iBrowser|Puffin|MiniB|MxNitro|Sogou|Xiino|Palmscape|WebPro|Vision|MiuiBrowser)/ui', $ua)) { + if (!preg_match('/(Huawei|Ninesky|Skyfire|Dolphin|QQ|360|QHBrowser|Mercury|iBrowser|Puffin|MiniB|MxNitro|Sogou|Xiino|Palmscape|WebPro|Vision|MiuiBrowser)/ui', $ua)) { return; } + /* Huawei Browser */ + + if (preg_match('/HuaweiBrowser\/([0-9.]*)/u', $ua, $match)) { + $this->data->browser->name = 'Huawei Browser'; + $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]); + $this->data->browser->type = Constants\BrowserType::BROWSER; + } + /* Xiaomi MIUI Browser */ if (preg_match('/MiuiBrowser\/([0-9.]*)/u', $ua, $match)) { @@ -2399,7 +2462,7 @@ private function detectTelevisionBrowsers($ua) if (preg_match('/SPS/u', $ua, $match)) { $this->data->device->setIdentification([ 'manufacturer' => 'Sony', - 'model' => 'Playstation 2', + 'model' => 'PlayStation 2', 'type' => Constants\DeviceType::GAMING, 'subtype' => Constants\DeviceSubType::CONSOLE ]); @@ -2443,7 +2506,6 @@ private function detectWapBrowsers($ua) if (isset($match[1])) { $this->data->browser->version = new Version([ 'value' => $match[1] ]); } - } if (preg_match('/WAP Browser\/MAUI/ui', $ua, $match)) { diff --git a/src/Analyser/Header/Useragent/Device/Ereader.php b/src/Analyser/Header/Useragent/Device/Ereader.php index 489fc7dbf..f0a157884 100644 --- a/src/Analyser/Header/Useragent/Device/Ereader.php +++ b/src/Analyser/Header/Useragent/Device/Ereader.php @@ -132,7 +132,6 @@ private function detectSonyreader($ua) 'series' => 'Reader', 'type' => Constants\DeviceType::EREADER ]); - } } diff --git a/src/Analyser/Header/Useragent/Device/Gaming.php b/src/Analyser/Header/Useragent/Device/Gaming.php index 9a7b7d489..c363c452f 100644 --- a/src/Analyser/Header/Useragent/Device/Gaming.php +++ b/src/Analyser/Header/Useragent/Device/Gaming.php @@ -19,10 +19,6 @@ private function detectGaming($ua) $this->detectSega($ua); } - - - - /* Nintendo Wii and DS */ private function detectNintendo($ua) @@ -136,7 +132,7 @@ private function detectPlaystation($ua) $this->data->device->setIdentification([ 'manufacturer' => 'Sony', - 'model' => 'Playstation Portable', + 'model' => 'PlayStation Portable', 'type' => Constants\DeviceType::GAMING, 'subtype' => Constants\DeviceSubType::PORTABLE ]); @@ -144,31 +140,31 @@ private function detectPlaystation($ua) /* PlayStation Vita */ - if (preg_match('/PlayStation Vita/iu', $ua)) { + if (preg_match('/PlayStation Vita/ui', $ua)) { $this->data->os->reset(); $this->data->os->identifyVersion('/PlayStation Vita ([0-9.]*)/u', $ua); $this->data->device->setIdentification([ 'manufacturer' => 'Sony', - 'model' => 'Playstation Vita', + 'model' => 'PlayStation Vita', 'type' => Constants\DeviceType::GAMING, 'subtype' => Constants\DeviceSubType::PORTABLE ]); if (preg_match('/VTE\//u', $ua)) { - $this->data->device->model = 'Playstation TV'; + $this->data->device->model = 'PlayStation TV'; $this->data->device->subtype = Constants\DeviceSubType::CONSOLE; } } /* PlayStation 2 */ - if (preg_match('/Playstation2/u', $ua) || preg_match('/\(PS2/u', $ua)) { + if (preg_match('/PlayStation2/ui', $ua) || preg_match('/\(PS2/u', $ua)) { $this->data->os->reset(); $this->data->device->setIdentification([ 'manufacturer' => 'Sony', - 'model' => 'Playstation 2', + 'model' => 'PlayStation 2', 'type' => Constants\DeviceType::GAMING, 'subtype' => Constants\DeviceSubType::CONSOLE ]); @@ -188,7 +184,7 @@ private function detectPlaystation($ua) $this->data->device->setIdentification([ 'manufacturer' => 'Sony', - 'model' => 'Playstation 3', + 'model' => 'PlayStation 3', 'type' => Constants\DeviceType::GAMING, 'subtype' => Constants\DeviceSubType::CONSOLE ]); @@ -202,32 +198,33 @@ private function detectPlaystation($ua) $this->data->device->setIdentification([ 'manufacturer' => 'Sony', - 'model' => 'Playstation 4', + 'model' => 'PlayStation 4', 'type' => Constants\DeviceType::GAMING, 'subtype' => Constants\DeviceSubType::CONSOLE ]); } - } + /* PlayStation 5 */ - /* Microsoft Xbox */ - - private function detectXbox($ua) - { - /* Xbox 360 */ - - if (preg_match('/Xbox\)$/u', $ua, $match)) { + if (preg_match('/PlayStation 5/ui', $ua) || preg_match('/\(PS5/u', $ua)) { $this->data->os->reset(); + $this->data->os->identifyVersion('/PlayStation 5 ([0-9.]*)/u', $ua); + $this->data->device->setIdentification([ - 'manufacturer' => 'Microsoft', - 'model' => 'Xbox 360', + 'manufacturer' => 'Sony', + 'model' => 'PlayStation 5', 'type' => Constants\DeviceType::GAMING, 'subtype' => Constants\DeviceSubType::CONSOLE ]); } + } - /* Xbox One */ + /* Microsoft Xbox */ + + private function detectXbox($ua) + { + /* Xbox One */ if (preg_match('/Xbox One\)/u', $ua, $match)) { if ($this->data->isOs('Windows Phone', '=', '10')) { $this->data->os->name = 'Windows'; @@ -244,6 +241,26 @@ private function detectXbox($ua) 'type' => Constants\DeviceType::GAMING, 'subtype' => Constants\DeviceSubType::CONSOLE ]); + + /* Xbox Series X */ + } elseif (preg_match('/Xbox Series X\)/u', $ua, $match)) { + $this->data->os->reset(); + $this->data->device->setIdentification([ + 'manufacturer' => 'Microsoft', + 'model' => 'Xbox Series X', + 'type' => Constants\DeviceType::GAMING, + 'subtype' => Constants\DeviceSubType::CONSOLE + ]); + + /* Xbox 360 */ + } elseif (preg_match('/Xbox\)$/u', $ua, $match)) { + $this->data->os->reset(); + $this->data->device->setIdentification([ + 'manufacturer' => 'Microsoft', + 'model' => 'Xbox 360', + 'type' => Constants\DeviceType::GAMING, + 'subtype' => Constants\DeviceSubType::CONSOLE + ]); } } diff --git a/src/Analyser/Header/Useragent/Device/Mobile.php b/src/Analyser/Header/Useragent/Device/Mobile.php index 30771f055..65e9ef96f 100644 --- a/src/Analyser/Header/Useragent/Device/Mobile.php +++ b/src/Analyser/Header/Useragent/Device/Mobile.php @@ -78,7 +78,6 @@ private function detectNokia($ua) } if (preg_match('/Nokia[- \/]?([^\/\);]+)/ui', $ua, $match)) { - if ($match[1] == 'Browser') { return; } @@ -1149,7 +1148,7 @@ private function detectGenericMobileLocations($ua) } } - function identifyBasedOnIdentifier() + private function identifyBasedOnIdentifier() { if ($this->data->device->identified & Constants\Id::MATCH_UA) { return; @@ -1182,10 +1181,9 @@ function identifyBasedOnIdentifier() } } - function identifyBasedOnIdUsingOs($id) + private function identifyBasedOnIdUsingOs($id) { switch ($this->data->os->getFamily()) { - case 'Android': $device = Data\DeviceModels::identify('android', $id); if ($device->identified) { @@ -1236,7 +1234,7 @@ function identifyBasedOnIdUsingOs($id) } } - function identifyBasedOnId($id) + private function identifyBasedOnId($id) { if ($this->data->device->type != 'mobile') { return; diff --git a/src/Analyser/Header/Useragent/Device/Television.php b/src/Analyser/Header/Useragent/Device/Television.php index dd1d27b16..f32f4b91e 100644 --- a/src/Analyser/Header/Useragent/Device/Television.php +++ b/src/Analyser/Header/Useragent/Device/Television.php @@ -610,29 +610,96 @@ private function detectSettopboxes($ua) /* Roku */ - if (preg_match('/^Roku\/DVP-(?:[0-9A-Z]+-)?[0-9\.]+ \(([0-9]{2,2})/u', $ua, $match)) { + if (preg_match('/Roku(?:([0-9]+)[A-Z]+)?\/DVP-(?:([0-9]+)[A-Z]+-)?[0-9\.]+/u', $ua, $match)) { $this->data->os->reset(); $this->data->device->manufacturer = 'Roku'; $this->data->device->type = Constants\DeviceType::TELEVISION; - - switch ($match[1]) { - case '02': - $this->data->device->model = '2 XS'; - $this->data->device->generic = false; - break; - case '04': - $this->data->device->model = '3'; - $this->data->device->generic = false; - break; - case '07': - $this->data->device->model = 'LT'; + + $models = [ + '2000' => 'HD', + '2050' => 'XD', + '2100' => 'XDS', + '2400' => 'LT', + '2450' => 'LT', + '2500' => 'HD', + '2700' => 'LT', + '2710' => '1 SE', + '2720' => '2', + '3000' => '2 HD', + '3050' => '2 XD', + '3100' => '2 XS', + '3400' => 'Streaming Stick, MHL', + '3420' => 'Streaming Stick, MHL', + '3500' => 'Streaming Stick, HDMI', + '3600' => 'Streaming Stick', + '3700' => 'Express', + '3710' => 'Express+', + '3800' => 'Streaming Stick', + '3810' => 'Streaming Stick+', + '3900' => 'Express', + '3910' => 'Express+', + '3920' => 'Premiere', + '3921' => 'Premiere+', + '3930' => 'Express', + '3931' => 'Express+', + '4200' => '3', + '4210' => '2', + '4230' => '3', + '4400' => '4', + '4620' => 'Premiere', + '4630' => 'Premiere+', + '4640' => 'Ultra', + '4660' => 'Ultra', + '4661' => 'Ultra', + '4662' => 'Ultra LT', + '4670' => 'Ultra', + '4800' => 'Ultra', + ]; + + if (!empty($match[1]) || !empty($match[2])) { + $model = !empty($match[1]) ? $match[1] : $match[2]; + + if (isset($models[$model])) { + $this->data->device->model = $models[$model]; $this->data->device->generic = false; - break; - case '09': - $this->data->device->model = 'Streaming Stick'; + } + } + + $this->data->device->identified |= Constants\Id::MATCH_UA; + } + + if (preg_match('/Roku\/DVP-[0-9\.]+ \(([0-9A-Z]{2,2})[0-9]+\./u', $ua, $match)) { + $this->data->os->reset(); + + $this->data->device->manufacturer = 'Roku'; + $this->data->device->type = Constants\DeviceType::TELEVISION; + + $models = [ + '02' => '2 XS', + '03' => 'LT', + '04' => '3', + '07' => 'LT', + '09' => 'Streaming Stick', + '29' => 'Ultra', + '30' => [ 'TCL', '4K Roku TV' ], + '51' => 'Express', + 'AE' => 'Express', + ]; + + if (!empty($match[1])) { + $model = $match[1]; + + if (isset($models[$model])) { + if (is_array($models[$model])) { + $this->data->device->manufacturer = $models[$model][0]; + $this->data->device->model = $models[$model][1]; + } else { + $this->data->device->model = $models[$model]; + } + $this->data->device->generic = false; - break; + } } $this->data->device->identified |= Constants\Id::MATCH_UA; @@ -1058,7 +1125,6 @@ private function improveModelsOnDeviceTypeTelevision() if (isset($this->data->device->model) && isset($this->data->device->manufacturer)) { - if ($this->data->device->manufacturer == 'Dune HD') { if (preg_match('/tv([0-9]+[a-z]?)/u', $this->data->device->model, $match)) { $this->data->device->model = 'TV-' . strtoupper($match[1]); diff --git a/src/Analyser/Header/Useragent/Engine.php b/src/Analyser/Header/Useragent/Engine.php index 3837c31a6..f0c97bec4 100644 --- a/src/Analyser/Header/Useragent/Engine.php +++ b/src/Analyser/Header/Useragent/Engine.php @@ -16,6 +16,7 @@ private function &detectEngine($ua) $this->detectPresto($ua); $this->detectTrident($ua); $this->detectEdgeHTMLUseragent($ua); + $this->detectFlow($ua); return $this; } @@ -171,4 +172,14 @@ private function detectEdgeHTMLUseragent($ua) $this->data->engine->version = new Version([ 'value' => $match[1], 'hidden' => true ]); } } + + /* Flow */ + + private function detectFlow($ua) + { + if (preg_match('/EkiohFlow\/([0-9.]*)/u', $ua, $match)) { + $this->data->engine->name = 'EkiohFlow'; + $this->data->engine->version = new Version([ 'value' => $match[1] ]); + } + } } diff --git a/src/Analyser/Header/Useragent/Os.php b/src/Analyser/Header/Useragent/Os.php index 343f9d1ce..2018d1b07 100644 --- a/src/Analyser/Header/Useragent/Os.php +++ b/src/Analyser/Header/Useragent/Os.php @@ -74,6 +74,10 @@ private function detectDarwin($ua) $this->data->os->version = new Version([ 'value' => str_replace('_', '.', $match[1]) ]); } + if (preg_match('/iOS ([0-9.]*);/u', $ua, $match)) { + $this->data->os->version = new Version([ 'value' => $match[1] ]); + } + if (preg_match('/iPhone Simulator;/u', $ua)) { $this->data->device->type = Constants\DeviceType::EMULATOR; } else { @@ -93,19 +97,23 @@ private function detectDarwin($ua) } } } - } /* OS X */ - - elseif (preg_match('/Mac OS X/u', $ua) || preg_match('/;os=Mac/u', $ua)) { + } elseif (preg_match('/Mac OS X/u', $ua) || preg_match('/;os=Mac/u', $ua)) { + /* OS X */ + $this->data->os->name = 'OS X'; - if (preg_match('/Mac OS X (10[0-9\._]*)/u', $ua, $match)) { + if (preg_match('/Mac OS X (1[0-9][0-9\._]*)/u', $ua, $match)) { $this->data->os->version = new Version([ 'value' => str_replace('_', '.', $match[1]), 'details' => 2 ]); } - if (preg_match('/;os=Mac (10[0-9[\.,]*)/u', $ua, $match)) { + if (preg_match('/;os=Mac (1[0-9][0-9[\.,]*)/u', $ua, $match)) { $this->data->os->version = new Version([ 'value' => str_replace(',', '.', $match[1]), 'details' => 2 ]); } + if ($this->data->os->version && $this->data->os->version->is('10.16')) { + $this->data->os->version = new Version([ 'value' => '11.0', 'details' => 2 ]); + } + $this->data->device->type = Constants\DeviceType::DESKTOP; } @@ -113,12 +121,10 @@ private function detectDarwin($ua) if (preg_match('/Darwin(?:\/([0-9]+).[0-9]+)?/u', $ua, $match)) { if (preg_match('/\(X11;/u', $ua)) { - /* Darwin */ $this->data->os->name = 'Darwin'; $this->data->device->type = Constants\DeviceType::DESKTOP; } elseif (preg_match('/\((?:x86_64|i386|Power%20Macintosh)\)/u', $ua)) { - /* OS X */ $this->data->os->name = 'OS X'; $this->data->device->type = Constants\DeviceType::DESKTOP; @@ -137,7 +143,6 @@ private function detectDarwin($ua) } } } else { - /* iOS */ $this->data->os->name = 'iOS'; $this->data->device->type = Constants\DeviceType::MOBILE; @@ -241,8 +246,7 @@ private function detectAndroid($ua) $candidates = []; - if (preg_match('/Build/ui', $ua)) { - + if (preg_match('/Build/ui', $ua) && (!preg_match('/AppleWebKit.*Build/ui', $ua) || preg_match('/Build.*AppleWebKit/ui', $ua))) { /* Normal Android useragent strings */ if (preg_match('/; [a-z][a-zA-Z][-_][a-zA-Z][a-zA-Z] ([^;]*[^;\s])\s+(?:BUILD|Build|build)/u', $ua, $match)) { @@ -256,28 +260,29 @@ private function detectAndroid($ua) if (preg_match('/;\+? ?(?:\*\*)?([^;]*[^;\s]);?\s+(?:BUILD|Build|build)/u', $ua, $match)) { $candidates[] = $match[1]; } - } elseif (preg_match('/Release\//ui', $ua)) { + } elseif (preg_match('/\(Linux; Android [0-9\.]+; ([^\/]+)(; wv)?\) AppleWebKit/u', $ua, $match)) { + /* New style minimal Android useragent string */ + $candidates[] = $match[1]; + } elseif (preg_match('/Release\//ui', $ua)) { /* WAP style useragent strings */ if (preg_match('/^(?U)([^\/]+)(?U)(?:(?:_CMCC_TD|_CMCC|_TD|_TDLTE|_LTE)?\/[^\/]*)? Linux\/[0-9.+]+ Android\/[0-9.]+/u', $this->removeKnownPrefixes($ua), $match)) { $candidates[] = $match[1]; - } else if (preg_match('/^(?U)([^\/]+)(?U)(?:(?:_CMCC_TD|_CMCC|_TD|_TDLTE|_LTE)?\/[^\/]*)? Android(_OS)?\/[0-9.]+/u', $this->removeKnownPrefixes($ua), $match)) { + } elseif (preg_match('/^(?U)([^\/]+)(?U)(?:(?:_CMCC_TD|_CMCC|_TD|_TDLTE|_LTE)?\/[^\/]*)? Android(_OS)?\/[0-9.]+/u', $this->removeKnownPrefixes($ua), $match)) { $candidates[] = $match[1]; - } else if (preg_match('/^(?U)([^\/]+)(?U)(?:(?:_CMCC_TD|_CMCC|_TD|_TDLTE|_LTE)?\/[^\/]*)? Release\/[0-9.]+/u', $this->removeKnownPrefixes($ua), $match)) { + } elseif (preg_match('/^(?U)([^\/]+)(?U)(?:(?:_CMCC_TD|_CMCC|_TD|_TDLTE|_LTE)?\/[^\/]*)? Release\/[0-9.]+/u', $this->removeKnownPrefixes($ua), $match)) { $candidates[] = $match[1]; } } elseif (preg_match('/Mozilla\//ui', $ua)) { - /* Old Android useragent strings */ - if (preg_match('/Linux; (?:U; )?Android [^;]+; (?:[a-zA-Z][a-zA-Z](?:[-_][a-zA-Z][a-zA-Z])?; )?(?:[^;]+; ?)?([^)\/;]+)\)/u', $ua, $match)) { + if (preg_match('/Linux; (?:arm; |arm_64; )?(?:U; )?Android [^;]+; (?:[a-zA-Z][a-zA-Z](?:[-_][a-zA-Z][a-zA-Z])?; )?(?:[^;]+; ?)?([^\/;]+)\) /u', $ua, $match)) { $candidates[] = $match[1]; } elseif (preg_match('/\(([^;]+);U;Android\/[^;]+;[0-9]+\*[0-9]+;CTC\/2.0\)/u', $ua, $match)) { $candidates[] = $match[1]; } } else { - /* Other applications */ if (preg_match('/[34]G Explorer\/[0-9.]+ \(Linux;Android [0-9.]+,([^\)]+)\)/u', $ua, $match)) { @@ -302,9 +307,19 @@ private function detectAndroid($ua) continue; } + /* Ignore "K" or "Unspecified Device" as a device, as it is a dummy value used by Chrome UA reduction */ + + if ($candidates[$c] == 'K' || $candidates[$c] == 'Unspecified Device') { + unset($candidates[$c]); + continue; + } + $candidates[$c] = preg_replace('/^[a-zA-Z][a-zA-Z][-_][a-zA-Z][a-zA-Z]\s+/u', '', $candidates[$c]); $candidates[$c] = preg_replace('/(.*) - [0-9\.]+ - (?:with Google Apps - )?API [0-9]+ - [0-9]+x[0-9]+/', '\\1', $candidates[$c]); $candidates[$c] = preg_replace('/^sprd-/u', '', $candidates[$c]); + $candidates[$c] = preg_replace('/^HarmonyOS; /u', '', $candidates[$c]); + $candidates[$c] = preg_replace('/; GMSCore.*/u', '', $candidates[$c]); + $candidates[$c] = preg_replace('/; HMSCore.*/u', '', $candidates[$c]); } $candidates = array_unique($candidates); @@ -385,6 +400,23 @@ private function detectAndroid($ua) } } + + /* Harmony OS */ + + if (preg_match('/HarmonyOS/u', $ua)) { + $this->data->os->name = 'Harmony OS'; + $this->data->os->version = new Version(); + + + if (preg_match('/; Android ([0-9\.]+);/u', $ua, $match)) { + $this->data->os->family = new Family([ + 'name' => 'Android', + 'version' => new Version([ 'value' => $match[1], 'details' => 3 ]) + ]); + } + } + + /* Aliyun OS */ if (preg_match('/Aliyun/u', $ua) || preg_match('/YunOs/ui', $ua)) { @@ -1504,7 +1536,7 @@ private function detectWebos($ua) { if (preg_match('/(?:web|hpw)OS\/(?:HP webOS )?([0-9.]*)/u', $ua, $match)) { $this->data->os->name = 'webOS'; - $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 2 ]); + $this->data->os->version = new Version([ 'value' => $match[1] ]); $this->data->device->type = preg_match('/Tablet/iu', $ua) ? Constants\DeviceType::TABLET : Constants\DeviceType::MOBILE; $this->data->device->generic = false; } @@ -1860,7 +1892,7 @@ private function detectUnix($ua) if (preg_match('/SunOS 5\.([123456](?:\.[0-9\.]*)?) /u', $ua, $match)) { $this->data->os->version = new Version([ 'value' => '2.' . $match[1] ]); - } else if (preg_match('/SunOS 5\.([0-9\.]*)/u', $ua, $match)) { + } elseif (preg_match('/SunOS 5\.([0-9\.]*)/u', $ua, $match)) { $this->data->os->version = new Version([ 'value' => $match[1] ]); } @@ -2417,7 +2449,6 @@ private function detectRemainingOperatingSystems($ua) $count = count($patterns); for ($b = 0; $b < $count; $b++) { for ($r = 0; $r < count($patterns[$b]['regexp']); $r++) { - if (preg_match($patterns[$b]['regexp'][$r], $ua, $match)) { $this->data->os->name = $patterns[$b]['name']; diff --git a/src/Analyser/Header/Wap.php b/src/Analyser/Header/Wap.php index 727feeeb7..ea5018a12 100644 --- a/src/Analyser/Header/Wap.php +++ b/src/Analyser/Header/Wap.php @@ -7,6 +7,8 @@ class Wap { + private $data; + public function __construct($header, &$data) { $this->data =& $data; diff --git a/src/Data/Applications.php b/src/Data/Applications.php index c4fde6e62..1b57af56c 100644 --- a/src/Data/Applications.php +++ b/src/Data/Applications.php @@ -26,7 +26,6 @@ public static function identifyBrowser($ua) foreach (self::$BROWSERS as $type => $list) { foreach ($list as $i => $item) { - if (preg_match($item['regexp'], $ua, $match)) { return [ 'browser' => [ @@ -57,7 +56,6 @@ public static function identifyOther($ua) foreach (self::$OTHERS as $type => $list) { foreach ($list as $i => $item) { - if (preg_match($item['regexp'], $ua, $match)) { return [ 'browser' => [ @@ -80,6 +78,10 @@ public static function identifyOther($ua) } public static function identifyBot($ua) { + if (is_null($ua)) { + return; + } + require_once __DIR__ . '/../../data/regexes/applications-bots.php'; if (preg_match(self::$BOTS_REGEX, $ua)) { diff --git a/src/Data/DeviceModels.php b/src/Data/DeviceModels.php index fbe026290..2e559eb1c 100644 --- a/src/Data/DeviceModels.php +++ b/src/Data/DeviceModels.php @@ -262,7 +262,7 @@ public static function identifyList(&$index, &$list, $model, $cleanup = true) public static function applyMatches($model, $original, $pattern) { - if (strpos($model, '$') !== false && substr($pattern, -1) == "!") { + if (!is_null($model) && strpos($model, '$') !== false && substr($pattern, -1) == "!") { if (preg_match('/^' . substr($pattern, 0, -1) . '/iu', $original, $matches)) { foreach ($matches as $k => $v) { $model = str_replace('$' . $k, $v, $model); diff --git a/src/Model/Primitive/Base.php b/src/Model/Primitive/Base.php index 352fd7d80..d29dd6829 100644 --- a/src/Model/Primitive/Base.php +++ b/src/Model/Primitive/Base.php @@ -6,6 +6,7 @@ * @internal */ +#[\AllowDynamicProperties] class Base { /** diff --git a/src/Model/Version.php b/src/Model/Version.php index 3c7079d66..101091b8d 100644 --- a/src/Model/Version.php +++ b/src/Model/Version.php @@ -91,7 +91,7 @@ public function is() public function getParts() { - $parts = explode('.', $this->value); + $parts = !is_null($this->value) ? explode('.', $this->value) : []; return (object) [ 'major' => !empty($parts[0]) ? intval($parts[0]) : 0, diff --git a/tests/data/bots/generic.yaml b/tests/data/bots/generic.yaml index fdce84702..70f5ddd54 100644 --- a/tests/data/bots/generic.yaml +++ b/tests/data/bots/generic.yaml @@ -46,10 +46,6 @@ headers: 'User-Agent: AdsBot-Google-Mobile (+http://www.google.com/mobile/adsbot.html) Mozilla (iPhone; U; CPU iPhone OS 3 0 like Mac OS X) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36' result: { browser: { name: 'Google Ads Bot' }, device: { type: bot } } readable: 'Google Ads Bot' -- - headers: 'User-Agent: AhrefsBot.Feeds v0.1; http://ahrefs.com/' - result: { browser: { name: AhrefsBot, version: '0.1' }, device: { type: bot } } - readable: 'AhrefsBot 0.1' - headers: 'User-Agent: AmorankSpider/0.1; +http://amorank.com/webcrawler.html' result: { browser: { name: 'Amorank Spider', version: '0.1' }, device: { type: bot } } @@ -90,10 +86,6 @@ headers: 'User-Agent: Browsershots' result: { browser: { name: Browsershots }, device: { type: bot } } readable: Browsershots -- - headers: 'User-Agent: CCBot/2.0 (http://commoncrawl.org/faq/)' - result: { browser: { name: CommonCrawl, version: '2.0' }, device: { type: bot } } - readable: 'CommonCrawl 2.0' - headers: 'User-Agent: Cliqzbot/0.1 (+http://cliqz.com/company/cliqzbot)' result: { browser: { name: Cliqzbot, version: '0.1' }, device: { type: bot } } @@ -514,3 +506,495 @@ headers: 'User-Agent: Pinterest/0.2 (+http://www.pinterest.com/)' readable: 'Pinterest 0.2' result: { browser: { name: Pinterest, version: '0.2' }, device: { type: bot } } +- + headers: 'User-Agent: Facebookexternalhit/1.1; kakaotalk-scrap/1.0; +https: //devtalk.kakao.com/t/scrap/33984' + readable: 'KakaoTalk Bot 1.0' + result: { browser: { name: 'KakaoTalk Bot', version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; CloudFlare-AlwaysOnline/1.0; +http://www.cloudflare.com/always-online) AppleWebKit/534.34' + readable: 'Cloudflare Always Online 1.0' + result: { browser: { name: 'Cloudflare Always Online', version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.130 Safari/537.36 (compatible; Cloudflare SpeedTest/1.0; +https://blog.cloudflare.com/new-speed-page/)' + readable: 'Cloudflare SpeedTest 1.0' + result: { browser: { name: 'Cloudflare SpeedTest', version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Cloudflare Diagnostics' + readable: 'Cloudflare Diagnostics' + result: { browser: { name: 'Cloudflare Diagnostics' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; Cloudflare-AMP/1.0; +https://amp.cloudflare.com/doc/fetcher.html) AppleWebKit/534.34' + readable: 'Cloudflare AMP 1.0' + result: { browser: { name: 'Cloudflare AMP', version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; DotBot/1.1; http://www.opensiteexplorer.org/dotbot, help@moz.com)' + readable: 'Moz 1.1' + result: { browser: { name: Moz, version: '1.1' }, device: { type: bot } } +- + headers: 'User-Agent: rogerbot/1.0 (http://www.moz.com/dp/rogerbot, rogerbot-crawler@moz.com)' + readable: 'Moz 1.0' + result: { browser: { name: Moz, version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; Nimbostratus-Bot/v1.3.2; http://cloudsystemnetworks.com)' + readable: 'Nimbostratus 1.3.2' + result: { browser: { name: Nimbostratus, version: 1.3.2 }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; SemrushBot/6~bl; +http://www.semrush.com/bot.html)' + readable: 'Semrush 6' + result: { browser: { name: Semrush, version: '6' }, device: { type: bot } } +- + headers: 'User-Agent: Buck/2.2; (+https://app.hypefactors.com/media-monitoring/about.html)' + readable: 'Buck 2.2' + result: { browser: { name: Buck, version: '2.2' }, device: { type: bot } } +- + headers: 'User-Agent: DomainCrawler/3.0 (info@domaincrawler.com; http://www.domaincrawler.com/example.com)' + readable: 'DomainCrawler 3.0' + result: { browser: { name: DomainCrawler, version: '3.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; Linux x86_64; Mail.RU_Bot/Img/2.0; +http://go.mail.ru/help/robots)' + readable: 'Mail.ru Bot 2.0' + result: { browser: { name: 'Mail.ru Bot', version: '2.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 5.0) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; Bytespider; https://zhanzhang.toutiao.com/)' + readable: Bytespider + result: { browser: { name: Bytespider }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 compatible; yelpspider/yelpspider-1.0 (Crawlerbot run by Yelp Inc; yelpbot at yelp dot com)' + readable: 'Yelp Spider 1.0' + result: { browser: { name: 'Yelp Spider', version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots)' + readable: 'Slackbot Link Checker 1.0' + result: { browser: { name: 'Slackbot Link Checker', version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Florienzh/1.0' + readable: 'Florienzh 1.0' + result: { browser: { name: Florienzh, version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; Discordbot/2.0; +https://discordapp.com)' + readable: 'Discord 2.0' + result: { browser: { name: Discord, version: '2.0' }, device: { type: bot } } +- + headers: 'User-Agent: Voat.co OpenGraph Parser' + readable: Voat + result: { browser: { name: Voat }, device: { type: bot } } +- + headers: 'User-Agent: PocketImageCache/1.0' + readable: 'Pocket 1.0' + result: { browser: { name: Pocket, version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: PocketParser/2.0 (+https://getpocket.com/pocketparser_ua)' + readable: 'Pocket 2.0' + result: { browser: { name: Pocket, version: '2.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; Wappalyzer; https://www.wappalyzer.com)' + readable: Wappalyzer + result: { browser: { name: Wappalyzer }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; Wappalyzer)' + readable: Wappalyzer + result: { browser: { name: Wappalyzer }, device: { type: bot } } +- + headers: 'User-Agent: Wappalyzer' + readable: Wappalyzer + result: { browser: { name: Wappalyzer }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BuiltWith/1.0; +http://builtwith.com/biup) Chrome/74.0.3729.131 Safari/537.36' + readable: 'BuiltWith 1.0' + result: { browser: { name: BuiltWith, version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: TrustedSite Crawler' + readable: TrustedSite + result: { browser: { name: TrustedSite }, device: { type: bot } } +- + headers: 'User-Agent: IDG/UK (http://spaziodati.eu/)' + readable: SpazioDati + result: { browser: { name: SpazioDati }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0+(compatible; MxToolbox/Beta7; http://www.mxtoolbox.com/)' + readable: 'MxToolbox 7' + result: { browser: { name: MxToolbox, version: Beta7 }, device: { type: bot } } +- + headers: 'User-Agent: CCBot/2.0 (http://commoncrawl.org/faq/)' + readable: 'Common Crawl Bot 2.0' + result: { browser: { name: 'Common Crawl Bot', version: '2.0' }, device: { type: bot } } +- + headers: 'User-Agent: CCResearchBot/1.0 commoncrawl.org/research//Nutch-1.7-SNAPSHOT' + readable: 'Common Crawl Research Bot 1.0' + result: { browser: { name: 'Common Crawl Research Bot', version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; redditbot/1.0; +http://www.reddit.com/feedback)' + readable: 'Reddit Bot 1.0' + result: { browser: { name: 'Reddit Bot', version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/4.0 (compatible; Netcraft Web Server Survey)' + readable: 'Netcraft Web Server Survey Bot' + result: { browser: { name: 'Netcraft Web Server Survey Bot' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; NetcraftSurveyAgent/1.0; +info@netcraft.com)' + readable: 'Netcraft Survey Agent Bot 1.0' + result: { browser: { name: 'Netcraft Survey Agent Bot', version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: NETCRAFT' + readable: 'Netcraft Bot' + result: { browser: { name: 'Netcraft Bot' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Netcraft SSL Server Survey - contact info@netcraft.com)' + readable: 'Netcraft SSL Server Survey Bot' + result: { browser: { name: 'Netcraft SSL Server Survey Bot' }, device: { type: bot } } +- + headers: 'User-Agent: Netcraft SSL Server Survey - contact info@netcraft.com' + readable: 'Netcraft SSL Server Survey Bot' + result: { browser: { name: 'Netcraft SSL Server Survey Bot' }, device: { type: bot } } +- + headers: 'User-Agent: Netcraft SSL Server Survey' + readable: 'Netcraft SSL Server Survey Bot' + result: { browser: { name: 'Netcraft SSL Server Survey Bot' }, device: { type: bot } } +- + headers: 'User-Agent: Embed PHP library' + readable: 'Embed PHP Library' + result: { browser: { name: 'Embed PHP Library' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; BLEXBot/1.0; +http://webmeup-crawler.com/)' + readable: 'Blex Bot 1.0' + result: { browser: { name: 'Blex Bot', version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; BLEXBotTest/1.0; +http://webmeup.com/crawler.html)' + readable: 'Blex Test Bot 1.0' + result: { browser: { name: 'Blex Test Bot', version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: DomainStatsBot/1.0 (https://domainstats.com/pages/our-bot)' + readable: 'Domain Stats Bot 1.0' + result: { browser: { name: 'Domain Stats Bot', version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; SEOkicks-Robot; +http://www.seokicks.de/robot.html)' + readable: 'SEOkicks Bot' + result: { browser: { name: 'SEOkicks Bot' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; MegaIndex.ru/2.0; +http://megaindex.com/crawler)' + readable: 'Mega Index Bot 2.0' + result: { browser: { name: 'Mega Index Bot', version: '2.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; LinkpadBot/2.3; +http://linkpad.org/robot/)' + readable: 'Linkpad Bot 2.3' + result: { browser: { name: 'Linkpad Bot', version: '2.3' }, device: { type: bot } } +- + headers: 'User-Agent: SearchAtlas.com SEO Crawler' + readable: 'Search Atlas Bot' + result: { browser: { name: 'Search Atlas Bot' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; Dataprovider.com)' + readable: 'Dataprovider Bot' + result: { browser: { name: 'Dataprovider Bot' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; AhrefsBot/7.0; +http://ahrefs.com/robot/)' + readable: 'Ahrefs Bot 7.0' + result: { browser: { name: 'Ahrefs Bot', version: '7.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/)' + readable: 'Ahrefs Bot 6.1' + result: { browser: { name: 'Ahrefs Bot', version: '6.1' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; AhrefsBot/2.0; +http://ahrefs.com/robot/)' + readable: 'Ahrefs Bot 2.0' + result: { browser: { name: 'Ahrefs Bot', version: '2.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; AhrefsBot/7.0; News; +http://ahrefs.com/robot/)' + readable: 'Ahrefs News Bot 7.0' + result: { browser: { name: 'Ahrefs News Bot', version: '7.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; AhrefsBot/5.2; News; +http://ahrefs.com/robot/)' + readable: 'Ahrefs News Bot 5.2' + result: { browser: { name: 'Ahrefs News Bot', version: '5.2' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; AhrefsBot/7.0; SA; +http://ahrefs.com/robot/)' + readable: 'Ahrefs SA Bot 7.0' + result: { browser: { name: 'Ahrefs SA Bot', version: '7.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; AhrefsSiteAudit/6.1; +http://ahrefs.com/robot/)' + readable: 'Ahrefs Site Audit Bot 6.1' + result: { browser: { name: 'Ahrefs Site Audit Bot', version: '6.1' }, device: { type: bot } } +- + headers: 'User-Agent: AhrefsBot.Feeds v0.1; http://ahrefs.com/' + readable: 'Ahrefs Feeds Bot 0.1' + result: { browser: { name: 'Ahrefs Feeds Bot', version: '0.1' }, device: { type: bot } } +- + headers: 'User-Agent: serpstatbot/1.0 (advanced backlink tracking bot; curl/7.58.0; http://serpstatbot.com/; abuse@serpstatbot.com)' + readable: 'Serp Stat 1.0' + result: { browser: { name: 'Serp Stat', version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)' + readable: 'Majestic MJ12 Bot 1.4.8' + result: { browser: { name: 'Majestic MJ12 Bot', version: 1.4.8 }, device: { type: bot } } +- + headers: 'User-Agent: mj12bot' + readable: 'Majestic MJ12 Bot' + result: { browser: { name: 'Majestic MJ12 Bot' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Safari/605.1.15 (Applebot/0.1; +http://www.apple.com/go/applebot)' + readable: 'Apple Bot 0.1' + result: { browser: { name: 'Apple Bot', version: '0.1' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Applebot/0.3; +http://www.apple.com/go/applebot)' + readable: 'Apple Bot 0.3' + result: { browser: { name: 'Apple Bot', version: '0.3' }, device: { type: bot } } +- + headers: 'User-Agent: AppleNewsBot' + readable: 'Apple News Bot' + result: { browser: { name: 'Apple News Bot' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; Gowikibot/1.0; +http://www.gowikibot.com)' + readable: 'Gowikibot 1.0' + result: { browser: { name: Gowikibot, version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36 TinEye/1.0 (via http://www.tineye.com/)' + readable: 'TinEye Bot 1.0' + result: { browser: { name: 'TinEye Bot', version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; TinEye-bot/1.31; +http://www.tineye.com/crawler.html)' + readable: 'TinEye Bot 1.31' + result: { browser: { name: 'TinEye Bot', version: '1.31' }, device: { type: bot } } +- + headers: 'User-Agent: psbot/0.1 (+http://www.picsearch.com/bot.html)' + readable: 'Picsearch Bot 0.1' + result: { browser: { name: 'Picsearch Bot', version: '0.1' }, device: { type: bot } } +- + headers: 'User-Agent: psbot-page (+http://www.picsearch.com/bot.html)' + readable: 'Picsearch Bot' + result: { browser: { name: 'Picsearch Bot' }, device: { type: bot } } +- + headers: 'User-Agent: psbot-image (+http://www.picsearch.com/bot.html)' + readable: 'Picsearch Bot' + result: { browser: { name: 'Picsearch Bot' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:38.0) Gecko/20100101 Firefox/38.0 (IndeedBot 1.1)' + readable: 'IndeedBot 1.1' + result: { browser: { name: IndeedBot, version: '1.1' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; YioopBot; +https://www.yioop.com/bot.php)' + readable: 'Yioop Bot' + result: { browser: { name: 'Yioop Bot' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; DuckDuckBot-Https/1.1; https://duckduckgo.com/duckduckbot)' + readable: 'DuckDuckGo Https Bot 1.1' + result: { browser: { name: 'DuckDuckGo Https Bot', version: '1.1' }, device: { type: bot } } +- + headers: 'User-Agent: DuckDuckBot/1.1; (+http://duckduckgo.com/duckduckbot.html)' + readable: 'DuckDuckGo Bot 1.1' + result: { browser: { name: 'DuckDuckGo Bot', version: '1.1' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; DuckDuckGo-Favicons-Bot/1.0; +http://duckduckgo.com)' + readable: 'DuckDuckGo Favicons Bot 1.0' + result: { browser: { name: 'DuckDuckGo Favicons Bot', version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: node-fetch/1.0 (+https://github.com/bitinn/node-fetch)' + readable: 'Node Fetch 1.0' + result: { browser: { name: 'Node Fetch', version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Go-http-client/1.1' + readable: 'Go Http Client 1.1' + result: { browser: { name: 'Go Http Client', version: '1.1' }, device: { type: bot } } +- + headers: 'User-Agent: go-httpclient v0.5.1' + readable: 'Go Http Client 0.5.1' + result: { browser: { name: 'Go Http Client', version: 0.5.1 }, device: { type: bot } } +- + headers: 'User-Agent: bl.uk_lddc_bot/3.4.0-20200518 (+http://www.bl.uk/aboutus/legaldeposit/websites/websites/faqswebmaster/index.html)' + readable: 'British Library 3.4.0' + result: { browser: { name: 'British Library', version: 3.4.0 }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; SputnikFaviconBot/1.2; +http://corp.sputnik.ru/webmaster)' + readable: 'Sputnik Favicon Bot 1.2' + result: { browser: { name: 'Sputnik Favicon Bot', version: '1.2' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; SputnikBot/2.3; +http://corp.sputnik.ru/webmaster)' + readable: 'Sputnik Bot 2.3' + result: { browser: { name: 'Sputnik Bot', version: '2.3' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; SputnikImageBot/2.3; +http://corp.sputnik.ru/webmaster)' + readable: 'Sputnik Image Bot 2.3' + result: { browser: { name: 'Sputnik Image Bot', version: '2.3' }, device: { type: bot } } +- + headers: 'User-Agent: DMCA.com Page Protection Crawling Service' + readable: DMCA + result: { browser: { name: DMCA }, device: { type: bot } } +- + headers: 'User-Agent: Made by ZmEu @ WhiteHat Team – http://www.whitehat.ro' + readable: ZmEu + result: { browser: { name: ZmEu }, device: { type: bot } } +- + headers: 'User-Agent: netEstate NE Crawler (+http://www.website-datenbank.de/)' + readable: 'netEstate NE Crawler' + result: { browser: { name: 'netEstate NE Crawler' }, device: { type: bot } } +- + headers: 'User-Agent: Gofeed/1.0' + readable: 'Gofeed 1.0' + result: { browser: { name: Gofeed, version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: istellabot/t.1.13' + readable: 'Istellabot 1.13' + result: { browser: { name: Istellabot, version: '1.13' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 YisouSpider/5.0 Safari/537.36' + readable: 'Yisou Spider 5.0' + result: { browser: { name: 'Yisou Spider', version: '5.0' }, device: { type: bot } } +- + headers: 'User-Agent: YisouSpider' + readable: 'Yisou Spider' + result: { browser: { name: 'Yisou Spider' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; LetsearchBot/1.0; +https://letsearch.ru/bots)' + readable: 'LetsearchBot 1.0' + result: { browser: { name: LetsearchBot, version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Seeker v.1 http://LookSeek.com/seeker/' + readable: 'LookSeek 1' + result: { browser: { name: LookSeek, version: '1' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; vuhuvBot/1.0; +http://vuhuv.com/bot.html)' + readable: 'VuhuvBot 1.0' + result: { browser: { name: VuhuvBot, version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; Seekport Crawler; http://seekport.com/)' + readable: 'Seekport Crawler' + result: { browser: { name: 'Seekport Crawler' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; coccocbot-web/1.0; +http://help.coccoc.com/searchengine)' + readable: 'Coccocbot Web 1.0' + result: { browser: { name: 'Coccocbot Web', version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; coccocbot-image/1.0; +http://help.coccoc.com/searchengine)' + readable: 'Coccocbot Image 1.0' + result: { browser: { name: 'Coccocbot Image', version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; Clarabot/1.4; +http://www.clarabot.info/bots)' + readable: 'Clarabot 1.4' + result: { browser: { name: Clarabot, version: '1.4' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; MojeekBot/0.9; +https://www.mojeek.com/bot.html)' + readable: 'MojeekBot 0.9' + result: { browser: { name: MojeekBot, version: '0.9' }, device: { type: bot } } +- + headers: 'User-Agent: Xenu Link Sleuth/1.3.9 beta' + readable: 'Xenu Link Sleuth 1.3.9' + result: { browser: { name: 'Xenu Link Sleuth', version: 1.3.9 }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; Adsbot/3.1)' + readable: 'Adsbot 3.1' + result: { browser: { name: Adsbot, version: '3.1' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; Barkrowler/0.9; +https://babbar.tech/crawler)' + readable: 'Barkrowler 0.9' + result: { browser: { name: Barkrowler, version: '0.9' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; VelenPublicWebCrawler/1.0; +https://velen.io)' + readable: 'VelenPublicWebCrawler 1.0' + result: { browser: { name: VelenPublicWebCrawler, version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; evc-batch/2.0)' + readable: 'Evc-batch 2.0' + result: { browser: { name: Evc-batch, version: '2.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 7.0;) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; AspiegelBot)' + readable: 'Petal Bot' + result: { browser: { name: 'Petal Bot' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 7.0;) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; PetalBot;+https://aspiegel.com/petalbot)' + readable: 'Petal Bot' + result: { browser: { name: 'Petal Bot' }, device: { type: bot } } +- + headers: 'User-Agent: (compatible;PetalBot;+https://aspiegel.com/petalbot)' + readable: 'Petal Bot' + result: { browser: { name: 'Petal Bot' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (iodc; odysseus 24842-138-041020155614-449; +https://iodc.co.uk)' + readable: Iodc + result: { browser: { name: Iodc }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; IODC-Odysseus Survey 46182-100-271115114504-101; +https://iodc.co.uk)' + readable: Iodc + result: { browser: { name: Iodc }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (X11; Datanyze; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36' + readable: Datanyze + result: { browser: { name: Datanyze }, device: { type: bot } } +- + headers: 'User-Agent: okhttp/3.4.1' + readable: 'OkHttp 3.4.1' + result: { browser: { name: OkHttp, version: 3.4.1 }, device: { type: bot } } +- + headers: 'User-Agent: AbtestCenter-okhttp/1.0' + readable: 'OkHttp 1.0' + result: { browser: { name: OkHttp, version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) SkypeUriPreview Preview/0.5' + readable: 'Skype Url Preview 0.5' + result: { browser: { name: 'Skype Url Preview', version: '0.5' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; BuzzSumo; +http://www.buzzsumo.com/bot.html)' + readable: BuzzSumo + result: { browser: { name: BuzzSumo }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; U; Hootsuite-WebFeed/1.0; mailto:abuse@hootsuite.com)' + readable: 'HootSuite 1.0' + result: { browser: { name: HootSuite, version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: HootSuite Image proxy (hosting@hootsuite.com)' + readable: HootSuite + result: { browser: { name: HootSuite }, device: { type: bot } } +- + headers: 'User-Agent: MindsMediaProxy/3.0 (+http://www.minds.com/)' + readable: 'Minds 3.0' + result: { browser: { name: Minds, version: '3.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; PlurkBot/1.0; +https://www.plurk.com/) Firefox/61.0' + readable: 'Plurk Bot 1.0' + result: { browser: { name: 'Plurk Bot', version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; blogger.com)' + readable: 'Blogger Bot' + result: { browser: { name: 'Blogger Bot' }, device: { type: bot } } +- + headers: 'User-Agent: Mediumbot-MetaTagFetcher/0.3 (+https://medium.com/)' + readable: 'Medium Bot 0.3' + result: { browser: { name: 'Medium Bot', version: '0.3' }, device: { type: bot } } +- + headers: 'User-Agent: Mediumbot-ProxyFetcher/0.1 (+https://medium.com/)' + readable: 'Medium Bot 0.1' + result: { browser: { name: 'Medium Bot', version: '0.1' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; HubSpot Crawler; web-crawlers@hubspot.com)' + readable: 'HubSpot Crawler' + result: { browser: { name: 'HubSpot Crawler' }, device: { type: bot } } +- + headers: 'User-Agent: OdklBot/1.0 (share@odnoklassniki.ru)' + readable: 'OdklBot 1.0' + result: { browser: { name: OdklBot, version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; OdklBot/1.0 like Linux; klass@odnoklassniki.ru)' + readable: 'OdklBot 1.0' + result: { browser: { name: OdklBot, version: '1.0' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; Daum/4.1; +http://cs.daum.net/faq/15/4118.html?faqId=28966)' + readable: 'Daum 4.1' + result: { browser: { name: Daum, version: '4.1' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; vkShare; +http://vk.com/dev/Share)' + readable: vkShare + result: { browser: { name: vkShare }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.0 Safari/537.36 (compatible; Linespider/1.1; +https://lin.ee/4dwXkTH)' + readable: 'Line Bot 1.1' + result: { browser: { name: 'Line Bot', version: '1.1' }, device: { type: bot } } +- + headers: 'User-Agent: httpunit/1.5' + readable: 'HttpUnit 1.5' + result: { browser: { name: HttpUnit, version: '1.5' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 Google Favicon' + readable: 'Google Favicon' + result: { browser: { name: 'Google Favicon' }, device: { type: bot } } +- + headers: 'User-Agent: Mozilla/5.0 zgrab/0.x' + readable: Zgrab + result: { browser: { name: Zgrab }, device: { type: bot } } diff --git a/tests/data/desktop/browser-chrome.yaml b/tests/data/desktop/browser-chrome.yaml index 71e1ad1c2..29e56e344 100644 --- a/tests/data/desktop/browser-chrome.yaml +++ b/tests/data/desktop/browser-chrome.yaml @@ -62,3 +62,15 @@ headers: 'User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.11 Safari/534.16' result: { browser: { name: Chrome, version: '10', type: browser }, engine: { name: Webkit, version: '534.16' }, os: { name: Linux }, device: { type: desktop } } readable: 'Chrome 10 on Linux' +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36' + result: { browser: { name: Chrome, version: '87', type: browser }, engine: { name: Blink }, os: { name: 'OS X', alias: macOS, version: { value: '11.0', nickname: 'Big Sur' } }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } + readable: 'Chrome 87 on macOS Big Sur 11.0' +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36' + readable: 'Chrome 100 on macOS' + result: { browser: { name: Chrome, version: '100', type: browser }, engine: { name: Blink }, os: { name: 'OS X', alias: macOS }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36' + readable: 'Chrome 123 on macOS' + result: { browser: { name: Chrome, version: '123', type: browser }, engine: { name: Blink }, os: { name: 'OS X', alias: macOS }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } diff --git a/tests/data/desktop/browser-edge.yaml b/tests/data/desktop/browser-edge.yaml index 159f0b421..f5e489ebb 100644 --- a/tests/data/desktop/browser-edge.yaml +++ b/tests/data/desktop/browser-edge.yaml @@ -38,3 +38,7 @@ headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3782.0 Safari/537.36 Edg/76.0.152.0' readable: 'Edge 76 on macOS Mojave 10.14' result: { browser: { name: Edge, family: { name: Chrome, version: 76 }, version: '76', type: browser }, engine: { name: Blink }, os: { name: 'OS X', alias: macOS, version: { value: '10.14', nickname: Mojave } }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0' + readable: 'Edge 123 on macOS' + result: { browser: { name: Edge, family: { name: Chrome, version: 123 }, version: '123', type: browser }, engine: { name: Blink }, os: { name: 'OS X', alias: macOS }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } diff --git a/tests/data/desktop/browser-firefox.yaml b/tests/data/desktop/browser-firefox.yaml index 1fc8aa8da..b977b7d5d 100644 --- a/tests/data/desktop/browser-firefox.yaml +++ b/tests/data/desktop/browser-firefox.yaml @@ -254,3 +254,7 @@ headers: 'User-Agent: Mozilla/5.0 (X11; U; Darwin i386; en-US; rv:1.9.1.4) Gecko/20100311 Shiretoko/3.5.5' readable: 'Firefox Shiretoko 3.5.5 on Darwin' result: { browser: { name: Firefox, version: 3.5.5, type: browser }, engine: { name: Gecko, version: 1.9.1 }, os: { name: Darwin }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:123.0) Gecko/20100101 Firefox/123.0' + readable: 'Firefox 123.0 on macOS' + result: { browser: { name: Firefox, version: '123.0', type: browser }, engine: { name: Gecko, version: '123.0' }, os: { name: 'OS X', alias: macOS }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } diff --git a/tests/data/desktop/browser-flow.yaml b/tests/data/desktop/browser-flow.yaml new file mode 100644 index 000000000..75bc7a28c --- /dev/null +++ b/tests/data/desktop/browser-flow.yaml @@ -0,0 +1,12 @@ +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) EkiohFlow/5.10.0.32202 Flow/5.10.0 (like Gecko Firefox/62.0 rv:62.0)' + result: { browser: { name: Flow, version: 5.10.0, type: browser }, engine: { name: EkiohFlow, version: 5.10.0.32202 }, os: { name: 'OS X', alias: macOS, version: { value: '10.15', nickname: Catalina } }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } + readable: 'Flow 5.10.0 on macOS Catalina 10.15' +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) EkiohFlow/5.9.4.32015 Flow/5.9.4 (like Gecko Firefox/53.0 rv:53.0)' + result: { browser: { name: Flow, version: 5.9.4, type: browser }, engine: { name: EkiohFlow, version: 5.9.4.32015 }, os: { name: 'OS X', alias: macOS, version: { value: '10.15', nickname: Catalina } }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } + readable: 'Flow 5.9.4 on macOS Catalina 10.15' +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) EkiohFlow/5.9.4.32015M Flow/5.9.4 (like Gecko Firefox/53.0 rv:53.0)' + result: { browser: { name: 'Flow Nightly Build', type: browser }, engine: { name: EkiohFlow, version: 5.9.4.32015 }, os: { name: 'OS X', alias: macOS, version: { value: '10.15', nickname: Catalina } }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } + readable: 'Flow Nightly Build on macOS Catalina 10.15' diff --git a/tests/data/desktop/browser-other.yaml b/tests/data/desktop/browser-other.yaml index 16a324267..7e4167c5b 100644 --- a/tests/data/desktop/browser-other.yaml +++ b/tests/data/desktop/browser-other.yaml @@ -138,6 +138,54 @@ headers: 'User-Agent: Mozilla/4.0 (compatible; Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6; Acoo Browser; .NET CLR 1.1.4322; .NET CLR 2.0.50727); Windows NT 5.1; Trident/4.0; Maxthon; .NET CLR 2.0.50727; .NET CLR 1.1.4322; InfoPath.2)' readable: 'Acoo Browser on Windows XP' result: { browser: { name: 'Acoo Browser', type: browser }, engine: { name: Trident, version: '4.0' }, os: { name: Windows, version: { value: '5.1', alias: XP } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36 AVG/70.1.682.112' + result: { browser: { name: 'AVG Secure Browser', family: { name: Chrome, version: 70 }, version: 70.1.682.112, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'AVG Secure Browser 70.1.682.112 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Windows; U; WinNT; en; rv:1.0.2) Gecko/20030311 Beonex/0.8.2-stable' + result: { browser: { name: Beonex, version: 0.8.2, type: browser }, engine: { name: Gecko, version: 1.0.2 }, os: { name: Windows }, device: { type: desktop } } + readable: 'Beonex 0.8.2 on Windows' +- + headers: 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9) Gecko/2008120120 Blackbird/0.9991' + result: { browser: { name: Blackbird, version: '0.9991', type: browser }, engine: { name: Gecko, version: '1.9' }, os: { name: Windows, version: { value: '5.1', alias: XP } }, device: { type: desktop } } + readable: 'Blackbird 0.9991 on Windows XP' +- + headers: 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; cs-CZ) AppleWebKit/533.3 (KHTML, like Gecko) Columbus/1.2.1.0 Safari/533.3' + result: { browser: { name: Columbus, version: 1.2.1.0, type: browser }, engine: { name: Webkit, version: '533.3' }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'Columbus 1.2.1.0 on Windows 7' +- + headers: 'User-Agent: Cyberdog/2.0 (Macintosh; PPC)' + readable: 'Cyberdog 2.0 on Mac OS' + result: { browser: { name: Cyberdog, version: '2.0', type: browser }, os: { name: 'Mac OS' }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/525.27.1 (KHTML, like Gecko) Demeter/1.0.9 Safari/125' + readable: 'Demeter 1.0.9 on Mac OS X 10.5' + result: { browser: { name: Demeter, version: 1.0.9, type: browser }, engine: { name: Webkit, version: 525.27.1 }, os: { name: 'OS X', alias: 'Mac OS X', version: '10.5' }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X; pl-pl) AppleWebKit/312.8 (KHTML, like Gecko, Safari) DeskBrowse/1.0' + readable: 'DeskBrowse 1.0 on OS X' + result: { browser: { name: DeskBrowse, version: '1.0', type: browser }, engine: { name: Webkit, version: '312.8' }, os: { name: 'OS X' }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } +- + headers: 'User-Agent: Mozilla/4.0 (compatible; DPlus 0.5)' + readable: 'DPlus Browser 0.5' + result: { browser: { name: 'DPlus Browser', version: '0.5', type: browser }, device: { type: desktop } } +- + headers: 'User-Agent: DocZilla/2.7 (Windows; U; Windows NT 5.1; en-US; rv:2.7.0) Gecko/20050706 CiTEC Information' + result: { browser: { name: DocZilla, version: '2.7', type: browser }, engine: { name: Gecko, version: 2.7.0 }, os: { name: Windows, version: { value: '5.1', alias: XP } }, device: { type: desktop } } + readable: 'DocZilla 2.7 on Windows XP' +- + headers: 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091105 Firefox/3.5.5 compat GlobalMojo/1.5.5 GlobalMojoExt/1.5' + result: { browser: { name: GlobalMojo, family: { name: Firefox, version: 3.5.5 }, version: 1.5.5, type: browser }, engine: { name: Gecko, version: 1.9.1 }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'GlobalMojo 1.5.5 on Windows 7' +- + headers: 'User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; GreenBrowser)' + result: { browser: { name: GreenBrowser, type: browser }, os: { name: Windows, version: { value: '5.1', alias: XP } }, device: { type: desktop } } + readable: 'GreenBrowser on Windows XP' +- + headers: 'User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 5.1; SV1; Hydra Browser; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)' + result: { browser: { name: 'Hydra Browser', type: browser }, os: { name: Windows, version: { value: '5.1', alias: XP } }, device: { type: desktop } } + readable: 'Hydra Browser on Windows XP' - headers: 'User-Agent: Mozilla/4.5 (compatible; iCab 2.7.1; Macintosh; I; PPC)' readable: 'iCab 2.7.1 on Mac OS' @@ -158,3 +206,363 @@ headers: 'User-Agent: Mozilla/5.0 (compatible; iCab 3.0.3; Macintosh; U; PPC Mac OS)' readable: 'iCab 3.0.3 on Mac OS' result: { browser: { name: iCab, version: 3.0.3, type: browser }, os: { name: 'Mac OS' }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } +- + headers: 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.10.1 Chrome/61.0.3163.140 Crusta/1.4.3 Safari/537.36' + readable: 'Crusta 1.4.3 on Linux' + result: { browser: { name: Crusta, using: { name: Qt, version: 5.10.1 }, family: { name: Chrome, version: 61 }, version: 1.4.3, type: browser }, engine: { name: Blink }, os: { name: Linux }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36 Kinza/6.1.6' + readable: 'Kinza 6.1.6 on Windows 10' + result: { browser: { name: Kinza, family: { name: Chrome, version: 80 }, version: 6.1.6, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '10.0', alias: '10' } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML like Gecko) 37abc/1.6.5.14 Chrome/44.0.2403.130 Safari/537.36' + result: { browser: { name: '37abc Browser', family: { name: Chrome, version: 44 }, version: 1.6.5.14, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: '37abc Browser 1.6.5.14 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.5.2526.111 Amigo/47.5.2526.111 MRCHROME SOC Safari/537.36' + result: { browser: { name: 'Amigo Browser', family: { name: Chrome, version: 47 }, version: 47.5.2526.111, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'Amigo Browser 47.5.2526.111 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pt) Chrome/37.0.2049.0 (KHTML, like Gecko) Version/4.0 APUSBrowser/1.1.111 Safari/' + result: { browser: { name: 'APUS Browser', family: { name: Chrome, version: 37 }, version: 1.1.111, type: browser }, os: { name: Windows, version: { value: '5.1', alias: XP } }, device: { type: desktop } } + readable: 'APUS Browser 1.1.111 on Windows XP' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36 AviraScout/17.6.3071.2851' + readable: 'Avira Scout 17.6.3071.2851 on Windows 10' + result: { browser: { name: 'Avira Scout', family: { name: Chrome, version: 59 }, version: 17.6.3071.2851, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '10.0', alias: '10' } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.9) Gecko/20100101 Goanna/4.5 Firefox/68.9 Basilisk/20200311' + readable: 'Basilisk 20200311 on Windows 10' + result: { browser: { name: Basilisk, family: { name: Firefox, version: '68.9' }, version: '20200311', type: browser }, engine: { name: Goanna, version: '4.5' }, os: { name: Windows, version: { value: '10.0', alias: '10' } }, device: { type: desktop } } +- + headers: 'User-Agent: 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; Browzar)' + result: { browser: { name: Browzar, type: browser }, engine: { name: Trident, version: '4.0' }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'Browzar on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/47.0.2526.106 Safari/537.36 Cent/1.6.10.21' + readable: 'Cent Browser 1.6.10.21 on Windows 10' + result: { browser: { name: 'Cent Browser', family: { name: Chrome, version: 47 }, version: 1.6.10.21, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '10.0', alias: '10' } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 1stBrowser/45.0.2454.171 Safari/537.36' + result: { browser: { name: '1st Browser', family: { name: Chrome, version: 49 }, version: 45.0.2454.171, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: '1st Browser 45.0.2454.171 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Chedot/9.1.1 Safari/537.36' + readable: 'Chedot 9.1.1 on Windows 10' + result: { browser: { name: Chedot, family: { name: Chrome, version: 76 }, version: 9.1.1, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '10.0', alias: '10' } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; en) AppleWebKit/418.9 (KHTML, like Gecko, Safari) Safari/419.3 Cheshire/1.0.ALPHA' + result: { browser: { name: Cheshire, version: 1.0.ALPHA, type: browser }, engine: { name: Webkit, version: '418.9' }, os: { name: 'OS X', alias: 'Mac OS X', version: '10.4' }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } + readable: 'Cheshire 1.0 on Mac OS X 10.4' +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X PPC Mac OS X 10.4; en-US; rv:1.0.1) Gecko/20030111 Chimera/0.6' + result: { browser: { name: Chimera, version: '0.6', type: browser }, engine: { name: Gecko, version: 1.0.1 }, os: { name: 'OS X', alias: 'Mac OS X', version: '10.4' }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } + readable: 'Chimera 0.6 on Mac OS X 10.4' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) coc_coc_browser/46.0 Chrome/40.0.2214.96 Safari/537.36' + readable: 'Coc Coc 46.0 on Windows 10' + result: { browser: { name: 'Coc Coc', family: { name: Chrome, version: 40 }, version: '46.0', type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '10.0', alias: '10' } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1; Crazy Browser 2.0.1)' + result: { browser: { name: 'Crazy Browser', version: 2.0.1, type: browser }, os: { name: Windows, version: { value: '5.1', alias: XP } }, device: { type: desktop } } + readable: 'Crazy Browser 2.0.1 on Windows XP' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.14.3282.140 Elements Browser/1.1.14 Safari/537.36' + readable: 'Elements Browser 1.1.14 on Windows 10' + result: { browser: { name: 'Elements Browser', family: { name: Chrome, version: 64 }, version: 1.1.14, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '10.0', alias: '10' } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (X11; Linux i686; rv:45.0) Gecko/20100101 Icedove/45.6.0' + result: { browser: { name: Icedove, version: 45.6.0, type: browser }, engine: { name: Gecko, version: '45.0' }, os: { name: Linux }, device: { type: desktop } } + readable: 'Icedove 45.6.0 on Linux' +- + headers: 'User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; KKman3.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)' + readable: 'KKMAN 3.0 on Windows Vista' + result: { browser: { name: KKMAN, version: '3.0', type: browser }, os: { name: Windows, version: { value: '6.0', alias: Vista } }, device: { type: desktop } } +- + headers: 'User-Agent: Klondike/1.50 (WSP Win32) (Google WAP Proxy/1.0)' + readable: 'Klondike 1.50 on Windows' + result: { browser: { name: Klondike, version: '1.50', type: browser }, os: { name: Windows }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0 Light/44.0' + readable: 'Light 44.0 on Windows 10' + result: { browser: { name: Light, family: { name: Firefox, version: '44.0' }, version: '44.0', type: browser }, engine: { name: Gecko, version: '44.0' }, os: { name: Windows, version: { value: '10.0', alias: '10' } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2) Gecko/20070224 lolifox/0.3.2' + readable: 'Lolifox 0.3.2 on Windows XP' + result: { browser: { name: Lolifox, version: 0.3.2, type: browser }, engine: { name: Gecko, version: 1.8.1 }, os: { name: Windows, version: { value: '5.1', alias: XP } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows; U; Windows XP) Gecko MultiZilla/1.6.1.0a' + readable: 'MultiZilla 1.6.1.0 on Windows XP' + result: { browser: { name: MultiZilla, version: 1.6.1.0, type: browser }, engine: { name: Gecko }, os: { name: Windows, version: { value: '5.1', alias: XP } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 Lovense/30.0.9' + result: { browser: { name: Lovense, family: { name: Chrome, version: 75 }, version: 30.0.9, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '10.0', alias: '10' } }, device: { type: desktop } } + readable: 'Lovense 30.0.9 on Windows 10' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36 Nichrome/self/40' + result: { browser: { name: Nichrome, family: { name: Chrome, version: 40 }, version: '40', type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '10.0', alias: '10' } }, device: { type: desktop } } + readable: 'Nichrome 40 on Windows 10' +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/522.11.1 (KHTML, like Gecko) Shiira Safari/125' + readable: 'Shiira on OS X' + result: { browser: { name: Shiira, type: browser }, engine: { name: Webkit, version: 522.11.1 }, os: { name: 'OS X' }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; U; Android 10; en-us; GM1910 Build/QKQ1.190716.003) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.134 Mobile Safari/537.36 OnePlusBrowser/30.5.0.9' + readable: 'OnePlus Browser 30.5.0.9 on an OnePlus 7 Pro running Android 10' + result: { browser: { name: 'OnePlus Browser', family: { name: Chrome, version: 53 }, version: 30.5.0.9, type: browser }, engine: { name: Blink }, os: { name: Android, version: '10' }, device: { type: mobile, subtype: smart, manufacturer: OnePlus, model: '7 Pro' } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) PrivacyBrowser/1.0' + readable: 'Privacy Browser 1.0 on Windows 10' + result: { browser: { name: 'Privacy Browser', version: '1.0', type: browser }, engine: { name: Webkit, version: '537.36' }, os: { name: Windows, version: { value: '10.0', alias: '10' } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/51.0.2704.63 Safari/537.36 Qiyu/1.6.0.0' + result: { browser: { name: 'Qiyu Browser', family: { name: Chrome, version: 51 }, version: 1.6.0.0, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '10.0', alias: '10' } }, device: { type: desktop } } + readable: 'Qiyu Browser 1.6.0.0 on Windows 10' +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/601.6.17 (KHTML, like Gecko) QuickLook/5.0' + readable: 'Quick Look 5.0 on OS X El Capitan 10.11' + result: { browser: { name: 'Quick Look', version: '5.0', type: browser }, engine: { name: Webkit, version: 601.6.17 }, os: { name: 'OS X', version: { value: '10.11', nickname: 'El Capitan' } }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36 Slimjet/19.0.2.0' + result: { browser: { name: Slimjet, family: { name: Chrome, version: 66 }, version: 19.0.2.0, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '10.0', alias: '10' } }, device: { type: desktop } } + readable: 'Slimjet 19.0.2.0 on Windows 10' +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.4.1 Safari/605.1.15 (Airwatch Browser v7.9)' + result: { browser: { name: 'VMware Workspace ONE', version: '7.9', type: browser }, engine: { name: Webkit, version: 605.1.15 }, os: { name: 'OS X', version: { value: '10.11', nickname: 'El Capitan' } }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } + readable: 'VMware Workspace ONE 7.9 on OS X El Capitan 10.11' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Whale/2.7.97.12 Safari/537.36' + readable: 'Whale Browser 2.7.97.12 on Windows 10' + result: { browser: { name: 'Whale Browser', family: { name: Chrome, version: 80 }, version: 2.7.97.12, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '10.0', alias: '10' } }, device: { type: desktop } } +- + headers: 'User-Agent: WinWAP/4.1 (Win32) WinWAP-X/4.1.0.192' + readable: 'WinWAP Browser 4 on Windows' + result: { browser: { name: 'WinWAP Browser', version: '4', type: browser }, os: { name: Windows }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 7.0; SM-G928F Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.98 Mobile Safari/537.36 wkbrowser 4.0.8 421' + readable: 'WK Browser 4.0.8 on a Samsung Galaxy S6 Edge+ running Android 7.0' + result: { browser: { name: 'WK Browser', using: { name: 'Chromium WebView', version: '61' }, version: 4.0.8, type: browser }, engine: { name: Blink }, os: { name: Android, version: '7.0' }, device: { type: mobile, subtype: smart, manufacturer: Samsung, model: 'Galaxy S6 Edge+' } } +- + headers: 'User-Agent: Mozilla/5.0 (Android 8.0.0; SM-G950F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.9 YaaniBrowser/4.2.0.186 (Turkcell-TR) Mobile Safari/537.36' + readable: 'Yaani Browser 4.2.0.186 on a Samsung Galaxy S8 running Android 8.0.0' + result: { browser: { name: 'Yaani Browser', family: { name: Chrome, version: 54 }, version: 4.2.0.186, type: browser }, engine: { name: Blink }, os: { name: Android, version: 8.0.0 }, device: { type: mobile, subtype: smart, manufacturer: Samsung, model: 'Galaxy S8' } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20130204 Zvu/18.0.1' + result: { browser: { name: 'Zvu Browser', version: 18.0.1, type: browser }, engine: { name: Gecko, version: '18.0' }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'Zvu Browser 18.0.1 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Falkon/3.0.0 Chrome/56.0.2924.122 Safari/537.36' + result: { browser: { name: Falkon, family: { name: Chrome, version: 56 }, version: 3.0.0, type: browser }, engine: { name: Blink }, os: { name: Linux }, device: { type: desktop } } + readable: 'Falkon 3.0.0 on Linux' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:25.3) Gecko/20150425 BlackHawk/25.3.1' + result: { browser: { name: 'Black Hawk', version: 25.3.1, type: browser }, engine: { name: Gecko, version: '25.3' }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'Black Hawk 25.3.1 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; BOLT/2.514) AppleWebKit/534.6 (KHTML, like Gecko) Version/5.0 Safari/534.6.3' + result: { browser: { name: 'Bolt Browser', version: '2.514', type: browser }, engine: { name: Webkit, version: '534.6' }, os: { name: Windows, version: { value: '5.1', alias: XP } }, device: { type: desktop } } + readable: 'Bolt Browser 2.514 on Windows XP' +- + headers: 'User-Agent: BriskBard/1.0 (Windows 10) BriskBard/1.0' + readable: 'Brisk Bard 1.0 on Windows' + result: { browser: { name: 'Brisk Bard', version: '1.0', type: browser }, os: { name: Windows }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5 [en] (X11; U; ) - BrowseX (2.0.0 Windows)' + readable: 'BrowseX 2.0.0 on Windows' + result: { browser: { name: BrowseX, version: 2.0.0, type: browser }, os: { name: Windows }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36 CCleaner/75.1.103.145' + result: { browser: { name: 'CCleaner Browser', family: { name: Chrome, version: 75 }, version: 75.1.103.145, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'CCleaner Browser 75.1.103.145 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) chimlac_browser/1.0 Chrome/57.0.2987.110 Safari/537.36' + result: { browser: { name: 'Chim Lac', family: { name: Chrome, version: 57 }, version: '1.0', type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'Chim Lac 1.0 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Colibri/1.5.1 Chrome/61.0.3163.100 Electron/2.0.2 Safari/537.36' + result: { browser: { name: Colibri, using: { name: Electron, version: 2.0.2 }, family: { name: Chrome, version: 61 }, version: 1.5.1, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'Colibri 1.5.1 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Degdegan/72.4.206 Chrome/66.4.3359.206 Safari/537.36' + result: { browser: { name: Deg-degan, family: { name: Chrome, version: 66 }, version: 72.4.206, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'Deg-degan 72.4.206 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2) Gecko/20100411 Lorentz/3.6.3 GTB7.0' + readable: 'Firefox Lorentz 3.6.3 on Mac OS X 10.6' + result: { browser: { name: Firefox, version: 3.6.3, type: browser }, engine: { name: Gecko, version: 1.9.2 }, os: { name: 'OS X', alias: 'Mac OS X', version: '10.6' }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } +- + headers: 'User-Agent: FlameSky/5.0.0.0 Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.2987.110 Safari/537.36' + result: { browser: { name: FlameSky, family: { name: Chrome, version: 64 }, version: 5.0.0.0, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'FlameSky 5.0.0.0 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:43.0) Gecko/20100101 Firefox/43.0 Framafox/43.0.1' + result: { browser: { name: Framafox, family: { name: Firefox, version: '43.0' }, version: 43.0.1, type: browser }, engine: { name: Gecko, version: '43.0' }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'Framafox 43.0.1 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.69 Freeu/61.0.3163.69 MRCHROME SOC Safari/537.36' + result: { browser: { name: 'Freeu Browser', family: { name: Chrome, version: 61 }, version: 61.0.3163.69, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'Freeu Browser 61.0.3163.69 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36 Hola/1.142.604' + result: { browser: { name: 'Hola Browser', family: { name: Chrome, version: 74 }, version: 1.142.604, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'Hola Browser 1.142.604 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0' + result: { browser: { name: Kapiko, family: { name: Firefox, version: '3.0' }, version: '3.0', type: browser }, engine: { name: Gecko, version: '1.9' }, os: { name: Windows, version: { value: '5.1', alias: XP } }, device: { type: desktop } } + readable: 'Kapiko 3.0 on Windows XP' +- + headers: 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20100222 Firefox/3.6 Kylo/0.8.4.74873' + result: { browser: { name: Kylo, family: { name: Firefox, version: '3.6' }, version: 0.8.4.74873, type: browser }, engine: { name: Gecko, version: 1.9.2 }, os: { name: Windows, version: { value: '5.1', alias: XP } }, device: { type: desktop } } + readable: 'Kylo 0.8.4.74873 on Windows XP' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) min/1.2.2 Chrome/49.0.2623.75 Electron/0.37.1 Safari/537.36' + result: { browser: { name: 'Min Browser', using: { name: Electron, version: 0.37.1 }, family: { name: Chrome, version: 49 }, version: 1.2.2, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'Min Browser 1.2.2 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; cs-CZ) AppleWebKit/532.4 (KHTML, like Gecko) MiniBrowser/3.0 Safari/532.4' + result: { browser: { name: 'Mini Browser', version: '3.0', type: browser }, engine: { name: Webkit, version: '532.4' }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'Mini Browser 3.0 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:68.9) Gecko/20100101 Goanna/4.4 Firefox/68.9 Mypal/28.8.4' + result: { browser: { name: 'Mypal Browser', family: { name: Firefox, version: '68.9' }, version: 28.8.4, type: browser }, engine: { name: Goanna, version: '4.4' }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'Mypal Browser 28.8.4 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/538.1 (KHTML, like Gecko) qutebrowser/0.9.1 Safari/538.1' + result: { browser: { name: 'Qute Browser', version: 0.9.1, type: browser }, engine: { name: Webkit, version: '538.1' }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'Qute Browser 0.9.1 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Sielo/1.16.07 Chrome/65.0.3325.151 Safari/537.36' + readable: 'Sielo Browser 1.16.07 on Windows 8' + result: { browser: { name: 'Sielo Browser', family: { name: Chrome, version: 65 }, version: 1.16.07, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '6.2', alias: '8' } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; MSIE 11.0; Windows NT 6.1; SiteKiosk 7.0 Build 248)' + result: { browser: { name: SiteKiosk, version: '7.0', type: browser }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'SiteKiosk 7.0 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 5.1; iRider 2.21.1108; FDM)' + result: { browser: { name: 'iRider Browser', version: 2.21.1108, type: browser }, os: { name: Windows, version: { value: '5.1', alias: XP } }, device: { type: desktop } } + readable: 'iRider Browser 2.21.1108 on Windows XP' +- + headers: 'User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20071115 Firefox/2.0.0.6 LBrowser/2.0.0.6' + result: { browser: { name: LBrowser, family: { name: Firefox, version: 2.0.0.6 }, version: 2.0.0.6, type: browser }, engine: { name: Gecko, version: 1.8.1 }, os: { name: Linux }, device: { type: desktop } } + readable: 'LBrowser 2.0.0.6 on Linux' +- + headers: 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20051001 Firefox/1.0.7 Madfox/0.3.2u3' + result: { browser: { name: Madfox, family: { name: Firefox, version: 1.0.7 }, version: 0.3.2, type: browser }, engine: { name: Gecko, version: 1.7.12 }, os: { name: Windows, version: { value: '5.1', alias: XP } }, device: { type: desktop } } + readable: 'Madfox 0.3.2 on Windows XP' +- + headers: 'User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 5.1; SV1; Multi-Browser 10.1 (www.multibrowser.de); .NET CLR 1.1.4322)' + result: { browser: { name: 'Multi-Browser XP', version: '10.1', type: browser }, os: { name: Windows, version: { value: '5.1', alias: XP } }, device: { type: desktop } } + readable: 'Multi-Browser XP 10.1 on Windows XP' +- + headers: 'User-Agent: Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0; NetCaptor 6.5.0RC1)' + result: { browser: { name: NetCaptor, version: 6.5.0, type: browser }, os: { name: Windows, version: { value: '5.0', alias: '2000' } }, device: { type: desktop } } + readable: 'NetCaptor 6.5.0 on Windows 2000' +- + headers: 'User-Agent: Mozilla/5.0 (compatible; MSIE 11.0; Windows NT 6.1; Open Live Writer 1.0)' + readable: 'Open Live Writer 1.0 on Windows 7' + result: { browser: { name: 'Open Live Writer', using: { name: 'Internet Explorer', version: '11.0' }, version: '1.0', type: browser }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0; JuziBrowser) like Gecko' + result: { browser: { name: 'Orange Browser', type: browser }, engine: { name: Trident, version: '7.0' }, os: { name: Windows, version: { value: '6.3', alias: '8.1' } }, device: { type: desktop } } + readable: 'Orange Browser on Windows 8.1' +- + headers: 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; cs-CZ) AppleWebKit/533.3 (KHTML, like Gecko) Patriott::Browser/1.0.0 Safari/533.3' + result: { browser: { name: 'Patriott Browser', version: 1.0.0, type: browser }, engine: { name: Webkit, version: '533.3' }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'Patriott Browser 1.0.0 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22 Perk/3.6.0.0' + result: { browser: { name: Perk, family: { name: Chrome, version: 25 }, version: 3.6.0.0, type: browser }, engine: { name: Webkit, version: '537.22' }, os: { name: Windows, version: { value: '6.2', alias: '8' } }, device: { type: desktop } } + readable: 'Perk 3.6.0.0 on Windows 8' +- + headers: 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0 PureBrowser/60.9.0' + result: { browser: { name: 'Pure Browser', family: { name: Firefox, version: '60.0' }, version: '60.9', type: browser }, engine: { name: Gecko, version: '60.0' }, os: { name: Linux }, device: { type: desktop } } + readable: 'Pure Browser 60.9 on Linux' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.16817 Safari/537.36 Sparrow/0.1' + readable: 'Sparrow 0.1 on Windows 7' + result: { browser: { name: Sparrow, family: { name: Chrome, version: 64 }, version: '0.1', type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Station/1.57.1 Chrome/76.0.3809.131 Safari/537.36' + readable: 'Station Browser 1.57.1 on Windows 10' + result: { browser: { name: 'Station Browser', family: { name: Chrome, version: 76 }, version: 1.57.1, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '10.0', alias: '10' } }, device: { type: desktop } } +- + headers: 'User-Agent: TulipChain/6.03 (http://ostermiller.org/tulipchain/) Java/1.4.2_05 (http://java.sun.com/) Windows_XP/5.1 RPT-HTTPClient/0.3-3' + readable: 'Tulip Chain 6.03 on Windows' + result: { browser: { name: 'Tulip Chain', version: '6.03', type: browser }, os: { name: Windows }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0 TO-Browser/TOB7.68.0.201_01' + readable: 't-online.de 7.68.0.201 on Windows 10' + result: { browser: { name: t-online.de, family: { name: Firefox, version: '68.0' }, version: 7.68.0.201, type: browser }, engine: { name: Gecko, version: '68.0' }, os: { name: Windows, version: { value: '10.0', alias: '10' } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.12) Gecko/20101026 Villanova/1.9.2.12 Polarity/3.0.0 Firefox/4.0' + readable: 'Polarity 3.0.0 on Windows 7' + result: { browser: { name: Polarity, family: { name: Firefox, version: '4.0' }, version: 3.0.0, type: browser }, engine: { name: Gecko, version: 1.9.2 }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.1.9) Gecko/20071110 Sylera/3.0.20 SeaMonkey/1.1.6' + readable: 'Sylera 3.0.20 on Windows 7' + result: { browser: { name: Sylera, version: 3.0.20, type: browser }, engine: { name: Gecko, version: 1.8.1 }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0(Compatible; Windows; U; en-US;) Sundance/0.9.0.33' + readable: 'Sundance 0.9.0.33 on Windows' + result: { browser: { name: Sundance, version: 0.9.0.33, type: browser }, os: { name: Windows }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.7) Gecko/20070919 Swiftweasel/2.0.0.7' + readable: 'Swiftweasel 2.0.0.7 on Linux' + result: { browser: { name: Swiftweasel, version: 2.0.0.7, type: browser }, engine: { name: Gecko, version: 1.8.1 }, os: { name: Linux }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20110610 Firefox/4.0.1 Sundial/4.0.1_1.0' + readable: 'Sundial 4.0.1 on Windows 7' + result: { browser: { name: Sundial, family: { name: Firefox, version: 4.0.1 }, version: 4.0.1, type: browser }, engine: { name: Gecko, version: 2.0.1 }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20061025 Firefox/2.0 (Swiftfox)' + readable: 'Swiftfox on Linux' + result: { browser: { name: Swiftfox, family: { name: Firefox, version: '2.0' }, type: browser }, engine: { name: Gecko, version: 1.8.1 }, os: { name: Linux }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.21 Safari/537.36 MMS/1.0.2531.0' + result: { browser: { name: 'Opera Neon', family: { name: Chrome, version: 53 }, version: '1.0', type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '10.0', alias: '10' } }, device: { type: desktop } } + readable: 'Opera Neon 1.0 on Windows 10' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36 OPR/60.0.3255.50747 OPRGX/60.0.3255.50747' + result: { browser: { name: 'Opera GX', family: { name: Chrome, version: 73 }, version: '60.0', type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'Opera GX 60.0 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1pre) Gecko/20090629 Vonkeror/1.0' + readable: 'Vonkeror 1.0 on Windows XP' + result: { browser: { name: Vonkeror, version: '1.0', type: browser }, engine: { name: Gecko, version: 1.9.1pre }, os: { name: Windows, version: { value: '5.1', alias: XP } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1; JyxoToolbar1.0; SV1; UltraBrowser 11.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 1.1.4322)' + readable: 'UltraBrowser 11.0 on Windows XP' + result: { browser: { name: UltraBrowser, version: '11.0', type: browser }, os: { name: Windows, version: { value: '5.1', alias: XP } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; cs-CZ) AppleWebKit/532.4 (KHTML, like Gecko) Usejump/0.10.5 Safari/532.4' + readable: 'Usejump 0.10 on Windows 7' + result: { browser: { name: Usejump, version: '0.10', type: browser }, engine: { name: Webkit, version: '532.4' }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } +- + headers: 'User-Agent: Vimprobable/0.9.20.5' + readable: 'Vimprobable 0.9.20.5' + result: { browser: { name: Vimprobable, version: 0.9.20.5, type: browser }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3390.0 Xvast/1.1.0.3 Safari/537.36' + readable: 'Xvast 1.1.0.3 on Windows 8' + result: { browser: { name: Xvast, family: { name: Chrome, version: 67 }, version: 1.1.0.3, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '6.2', alias: '8' } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.571.0 Safari/534.12 ZipZap 3.1' + readable: 'ZipZap 3.1 on Windows 7' + result: { browser: { name: ZipZap, family: { name: Chrome, version: 9 }, version: '3.1', type: browser }, engine: { name: Webkit, version: '534.12' }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 SputnikBrowser/4.1.2810.0 (GOST) Safari/537.36' + readable: 'Sputnik 4.1.2810.0 on Windows 10' + result: { browser: { name: Sputnik, family: { name: Chrome, version: 64 }, version: 4.1.2810.0, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '10.0', alias: '10' } }, device: { type: desktop } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1) SalamWeb/3.0.1.592 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.101 Safari/537.36' + result: { browser: { name: SalamWeb, family: { name: Chrome, version: 75 }, version: 3.0.1.592, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'SalamWeb 3.0.1.592 on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2551.0 (SBRO; Salam Browser) Safari/537.36' + result: { browser: { name: SalamWeb, family: { name: Chrome, version: 51 }, type: browser }, engine: { name: Blink }, os: { name: Windows, version: { value: '6.1', alias: '7' } }, device: { type: desktop } } + readable: 'SalamWeb on Windows 7' +- + headers: 'User-Agent: Mozilla/5.0 Chrome/10.0.613.0 Safari/534.15 Zombie.js/5.0.7' + result: { browser: { name: Zombie.js, family: { name: Chrome, version: 10 }, version: 5.0.7, type: browser }, device: { type: desktop } } + readable: 'Zombie.js 5.0.7' diff --git a/tests/data/desktop/browser-safari.yaml b/tests/data/desktop/browser-safari.yaml index e689ffe7b..1e65fe6b5 100644 --- a/tests/data/desktop/browser-safari.yaml +++ b/tests/data/desktop/browser-safari.yaml @@ -226,3 +226,15 @@ headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15' readable: 'Safari 13.0 on macOS Catalina 10.15' result: { browser: { name: Safari, version: '13.0', type: browser }, engine: { name: Webkit, version: 605.1.15 }, os: { name: 'OS X', alias: macOS, version: { value: '10.15', nickname: Catalina } }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_16) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15' + readable: 'Safari 14.0 on macOS Big Sur 11.0' + result: { browser: { name: Safari, version: '14.0', type: browser }, engine: { name: Webkit, version: 605.1.15 }, os: { name: 'OS X', alias: macOS, version: { value: '11.0', nickname: 'Big Sur' } }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15' + readable: 'Safari 14.0.1 on macOS Catalina 10.15' + result: { browser: { name: Safari, version: 14.0.1, type: browser }, engine: { name: Webkit, version: 605.1.15 }, os: { name: 'OS X', alias: macOS, version: { value: '10.15', nickname: Catalina } }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15' + readable: 'Safari 17.5 on macOS' + result: { browser: { name: Safari, version: '17.5', type: browser }, engine: { name: Webkit, version: 605.1.15 }, os: { name: 'OS X', alias: macOS }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } diff --git a/tests/data/desktop/platform-electron.yaml b/tests/data/desktop/platform-electron.yaml index 661519d84..ce193293e 100644 --- a/tests/data/desktop/platform-electron.yaml +++ b/tests/data/desktop/platform-electron.yaml @@ -14,3 +14,31 @@ headers: 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) AtomShellDefaultApp/0.1.0 Chrome/37.0.2062.102 AtomShell/0.17.2 Safari/537.36' result: { browser: { using: { name: Electron, version: 0.17.2 }, family: { name: Chrome, version: 37 }, type: browser }, engine: { name: Blink }, os: { name: Linux }, device: { type: desktop } } readable: 'Electron 0.17.2 on Linux' +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.40 Electron/11.0.0-beta.20 Safari/537.36' + readable: 'Electron 11.0.0 on macOS Big Sur 11.0' + result: { browser: { using: { name: Electron, version: 11.0.0 }, family: { name: Chrome, version: 87 }, type: browser }, engine: { name: Blink }, os: { name: 'OS X', alias: macOS, version: { value: '11.0', nickname: 'Big Sur' } }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Electron/11.0.3 Safari/537.36' + readable: 'Electron 11.0.3 on macOS Big Sur 11.1' + result: { browser: { using: { name: Electron, version: 11.0.3 }, family: { name: Chrome, version: 87 }, type: browser }, engine: { name: Blink }, os: { name: 'OS X', alias: macOS, version: { value: '11.1', nickname: 'Big Sur' } }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Electron/11.0.3 Safari/537.36' + readable: 'Electron 11.0.3 on macOS Big Sur 11.2' + result: { browser: { using: { name: Electron, version: 11.0.3 }, family: { name: Chrome, version: 87 }, type: browser }, engine: { name: Blink }, os: { name: 'OS X', alias: macOS, version: { value: '11.2', nickname: 'Big Sur' } }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Electron/11.3.0 Safari/537.36' + readable: 'Electron 11.3.0 on macOS Big Sur 11.2' + result: { browser: { using: { name: Electron, version: 11.3.0 }, family: { name: Chrome, version: 87 }, type: browser }, engine: { name: Blink }, os: { name: 'OS X', alias: macOS, version: { value: '11.2', nickname: 'Big Sur' } }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Electron/12.0.5 Safari/537.36' + readable: 'Electron 12.0.5 on macOS Big Sur 11.2' + result: { browser: { using: { name: Electron, version: 12.0.5 }, family: { name: Chrome, version: 89 }, type: browser }, engine: { name: Blink }, os: { name: 'OS X', alias: macOS, version: { value: '11.2', nickname: 'Big Sur' } }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_3_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Electron/12.0.6 Safari/537.36' + readable: 'Electron 12.0.6 on macOS Big Sur 11.3' + result: { browser: { using: { name: Electron, version: 12.0.6 }, family: { name: Chrome, version: 89 }, type: browser }, engine: { name: Blink }, os: { name: 'OS X', alias: macOS, version: { value: '11.3', nickname: 'Big Sur' } }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 12_3_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Electron/12.0.9 Safari/537.36' + readable: 'Electron 12.0.9 on macOS Monterey 12.3' + result: { browser: { using: { name: Electron, version: 12.0.9 }, family: { name: Chrome, version: 89 }, type: browser }, engine: { name: Blink }, os: { name: 'OS X', alias: macOS, version: { value: '12.3', nickname: Monterey } }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } diff --git a/tests/data/gaming/microsoft.yaml b/tests/data/gaming/microsoft.yaml index c24212d60..f1d09452b 100644 --- a/tests/data/gaming/microsoft.yaml +++ b/tests/data/gaming/microsoft.yaml @@ -18,3 +18,7 @@ headers: 'User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Xbox)' result: { browser: { name: 'Internet Explorer', version: '9.0', type: browser }, engine: { name: Trident, version: '5.0' }, device: { type: gaming, subtype: console, manufacturer: Microsoft, model: 'Xbox 360' } } readable: 'Internet Explorer 9.0 on a Microsoft Xbox 360' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox Series X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36 Edge/20.02' + result: { browser: { name: Edge, version: '20', type: browser }, engine: { name: EdgeHTML, version: '20.02' }, device: { type: gaming, subtype: console, manufacturer: Microsoft, model: 'Xbox Series X' } } + readable: 'Edge 20 on a Microsoft Xbox Series X' diff --git a/tests/data/gaming/sony.yaml b/tests/data/gaming/sony.yaml index 34552887d..e2c5cc785 100644 --- a/tests/data/gaming/sony.yaml +++ b/tests/data/gaming/sony.yaml @@ -1,204 +1,212 @@ - headers: 'User-Agent: Mozilla/4.0 (PSP (PlayStation Portable); 2.00)' - result: { engine: { name: NetFront }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'Playstation Portable' } } - readable: 'a Sony Playstation Portable' + result: { engine: { name: NetFront }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'PlayStation Portable' } } + readable: 'a Sony PlayStation Portable' - headers: 'User-Agent: Mozilla/5.0 (PLAYSTATION 3 4.10) AppleWebKit/531.22.8 (KHTML, like Gecko)' - result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '4.10' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 3' } } - readable: 'a Sony Playstation 3 running 4.10' + result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '4.10' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 3' } } + readable: 'a Sony PlayStation 3 running 4.10' - headers: 'User-Agent: Mozilla/5.0 (PLAYSTATION 3 4.11) AppleWebKit/531.22.8 (KHTML, like Gecko)' - result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '4.11' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 3' } } - readable: 'a Sony Playstation 3 running 4.11' + result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '4.11' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 3' } } + readable: 'a Sony PlayStation 3 running 4.11' - headers: 'User-Agent: Mozilla/5.0 (PLAYSTATION 3 4.31) AppleWebKit/531.22.8 (KHTML, like Gecko)' - result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '4.31' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 3' } } - readable: 'a Sony Playstation 3 running 4.31' + result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '4.31' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 3' } } + readable: 'a Sony PlayStation 3 running 4.31' - headers: 'User-Agent: Mozilla/5.0 (PLAYSTATION 3 4.41) AppleWebKit/531.22.8 (KHTML, like Gecko)' - result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '4.41' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 3' } } - readable: 'a Sony Playstation 3 running 4.41' + result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '4.41' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 3' } } + readable: 'a Sony PlayStation 3 running 4.41' - headers: 'User-Agent: Mozilla/5.0 (PLAYSTATION 3 4.50) AppleWebKit/531.22.8 (KHTML, like Gecko)' - result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '4.50' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 3' } } - readable: 'a Sony Playstation 3 running 4.50' + result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '4.50' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 3' } } + readable: 'a Sony PlayStation 3 running 4.50' - headers: 'User-Agent: Mozilla/5.0 (PLAYSTATION 3 4.53) AppleWebKit/531.22.8 (KHTML, like Gecko)' - result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '4.53' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 3' } } - readable: 'a Sony Playstation 3 running 4.53' + result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '4.53' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 3' } } + readable: 'a Sony PlayStation 3 running 4.53' - headers: 'User-Agent: Mozilla/5.0 (PLAYSTATION 3 4.55) AppleWebKit/531.22.8 (KHTML, like Gecko)' - result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '4.55' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 3' } } - readable: 'a Sony Playstation 3 running 4.55' + result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '4.55' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 3' } } + readable: 'a Sony PlayStation 3 running 4.55' - headers: 'User-Agent: Mozilla/5.0 (PLAYSTATION 3; 1.00)' - result: { engine: { name: NetFront }, os: { version: '1.00' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 3' } } - readable: 'a Sony Playstation 3 running 1.00' + result: { engine: { name: NetFront }, os: { version: '1.00' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 3' } } + readable: 'a Sony PlayStation 3 running 1.00' - headers: 'User-Agent: Mozilla/5.0 (PLAYSTATION 3; 2.00)' - result: { engine: { name: NetFront }, os: { version: '2.00' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 3' } } - readable: 'a Sony Playstation 3 running 2.00' + result: { engine: { name: NetFront }, os: { version: '2.00' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 3' } } + readable: 'a Sony PlayStation 3 running 2.00' - headers: 'User-Agent: Mozilla/5.0 (PLAYSTATION 3; 3.55)' - result: { engine: { name: NetFront }, os: { version: '3.55' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 3' } } - readable: 'a Sony Playstation 3 running 3.55' + result: { engine: { name: NetFront }, os: { version: '3.55' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 3' } } + readable: 'a Sony PlayStation 3 running 3.55' - headers: 'User-Agent: Mozilla/5.0 (PlayStation 3) SonyComputerEntertainmentEurope/531.3 (NCell) NuantiMeta/2.0' - result: { browser: { name: 'Nuanti Meta', version: '2.0', type: browser }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 3' } } - readable: 'Nuanti Meta 2.0 on a Sony Playstation 3' + result: { browser: { name: 'Nuanti Meta', version: '2.0', type: browser }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 3' } } + readable: 'Nuanti Meta 2.0 on a Sony PlayStation 3' - headers: 'User-Agent: Mozilla/5.0 (PlayStation 4 1.000) AppleWebKit/536.26 (KHTML, like Gecko)' - result: { engine: { name: Webkit, version: '536.26' }, os: { version: '1.000' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 4' } } - readable: 'a Sony Playstation 4 running 1.000' + result: { engine: { name: Webkit, version: '536.26' }, os: { version: '1.000' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 4' } } + readable: 'a Sony PlayStation 4 running 1.000' - headers: 'User-Agent: Mozilla/5.0 (PlayStation 4 1.51) AppleWebKit/536.26 (KHTML, like Gecko)' - result: { engine: { name: Webkit, version: '536.26' }, os: { version: '1.51' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 4' } } - readable: 'a Sony Playstation 4 running 1.51' + result: { engine: { name: Webkit, version: '536.26' }, os: { version: '1.51' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 4' } } + readable: 'a Sony PlayStation 4 running 1.51' - headers: 'User-Agent: Mozilla/5.0 (PlayStation 4 1.52) AppleWebKit/536.26 (KHTML, like Gecko)' - result: { engine: { name: Webkit, version: '536.26' }, os: { version: '1.52' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 4' } } - readable: 'a Sony Playstation 4 running 1.52' + result: { engine: { name: Webkit, version: '536.26' }, os: { version: '1.52' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 4' } } + readable: 'a Sony PlayStation 4 running 1.52' - headers: 'User-Agent: Mozilla/5.0 (PlayStation 4 1.60) AppleWebKit/536.26 (KHTML, like Gecko)' - result: { engine: { name: Webkit, version: '536.26' }, os: { version: '1.60' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 4' } } - readable: 'a Sony Playstation 4 running 1.60' + result: { engine: { name: Webkit, version: '536.26' }, os: { version: '1.60' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 4' } } + readable: 'a Sony PlayStation 4 running 1.60' - headers: 'User-Agent: Mozilla/5.0 (PlayStation 4 1.61) AppleWebKit/536.26 (KHTML, like Gecko)' - result: { engine: { name: Webkit, version: '536.26' }, os: { version: '1.61' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 4' } } - readable: 'a Sony Playstation 4 running 1.61' + result: { engine: { name: Webkit, version: '536.26' }, os: { version: '1.61' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 4' } } + readable: 'a Sony PlayStation 4 running 1.61' - headers: 'User-Agent: Mozilla/5.0 (PlayStation 4 1.62) AppleWebKit/536.26 (KHTML, like Gecko)' - result: { engine: { name: Webkit, version: '536.26' }, os: { version: '1.62' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 4' } } - readable: 'a Sony Playstation 4 running 1.62' + result: { engine: { name: Webkit, version: '536.26' }, os: { version: '1.62' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 4' } } + readable: 'a Sony PlayStation 4 running 1.62' - headers: 'User-Agent: Mozilla/5.0 (PlayStation 4 1.70) AppleWebKit/536.26 (KHTML, like Gecko)' - result: { engine: { name: Webkit, version: '536.26' }, os: { version: '1.70' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 4' } } - readable: 'a Sony Playstation 4 running 1.70' + result: { engine: { name: Webkit, version: '536.26' }, os: { version: '1.70' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 4' } } + readable: 'a Sony PlayStation 4 running 1.70' - headers: 'User-Agent: Mozilla/5.0 (PlayStation 4 2.00) AppleWebKit/537.73 (KHTML, like Gecko)' - result: { engine: { name: Webkit, version: '537.73' }, os: { version: '2.00' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 4' } } - readable: 'a Sony Playstation 4 running 2.00' + result: { engine: { name: Webkit, version: '537.73' }, os: { version: '2.00' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 4' } } + readable: 'a Sony PlayStation 4 running 2.00' - headers: 'User-Agent: Mozilla/5.0 (PlayStation Vita 1.00) AppleWebKit/531.22.8 (KHTML, like Gecko) Silk/3.2' - result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '1.00' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'Playstation Vita' } } - readable: 'a Sony Playstation Vita running 1.00' + result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '1.00' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'PlayStation Vita' } } + readable: 'a Sony PlayStation Vita running 1.00' - headers: 'User-Agent: Mozilla/5.0 (PlayStation Vita 1.50) AppleWebKit/531.22.8 (KHTML, like Gecko) Silk/3.2' - result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '1.50' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'Playstation Vita' } } - readable: 'a Sony Playstation Vita running 1.50' + result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '1.50' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'PlayStation Vita' } } + readable: 'a Sony PlayStation Vita running 1.50' - headers: 'User-Agent: Mozilla/5.0 (PlayStation Vita 1.51) AppleWebKit/531.22.8 (KHTML, like Gecko) Silk/3.2' - result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '1.51' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'Playstation Vita' } } - readable: 'a Sony Playstation Vita running 1.51' + result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '1.51' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'PlayStation Vita' } } + readable: 'a Sony PlayStation Vita running 1.51' - headers: 'User-Agent: Mozilla/5.0 (PlayStation Vita 1.52) AppleWebKit/531.22.8 (KHTML, like Gecko) Silk/3.2' - result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '1.52' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'Playstation Vita' } } - readable: 'a Sony Playstation Vita running 1.52' + result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '1.52' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'PlayStation Vita' } } + readable: 'a Sony PlayStation Vita running 1.52' - headers: 'User-Agent: Mozilla/5.0 (PlayStation Vita 1.60) AppleWebKit/531.22.8 (KHTML, like Gecko) Silk/3.2' - result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '1.60' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'Playstation Vita' } } - readable: 'a Sony Playstation Vita running 1.60' + result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '1.60' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'PlayStation Vita' } } + readable: 'a Sony PlayStation Vita running 1.60' - headers: 'User-Agent: Mozilla/5.0 (PlayStation Vita 1.61) AppleWebKit/531.22.8 (KHTML, like Gecko) Silk/3.2' - result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '1.61' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'Playstation Vita' } } - readable: 'a Sony Playstation Vita running 1.61' + result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '1.61' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'PlayStation Vita' } } + readable: 'a Sony PlayStation Vita running 1.61' - headers: 'User-Agent: Mozilla/5.0 (PlayStation Vita 1.80) AppleWebKit/531.22.8 (KHTML, like Gecko) Silk/3.2' - result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '1.80' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'Playstation Vita' } } - readable: 'a Sony Playstation Vita running 1.80' + result: { engine: { name: Webkit, version: 531.22.8 }, os: { version: '1.80' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'PlayStation Vita' } } + readable: 'a Sony PlayStation Vita running 1.80' - headers: 'User-Agent: Mozilla/5.0 (PlayStation Vita 2.60) AppleWebKit/536.26 (KHTML, like Gecko) Silk/3.2' - result: { engine: { name: Webkit, version: '536.26' }, os: { version: '2.60' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'Playstation Vita' } } - readable: 'a Sony Playstation Vita running 2.60' + result: { engine: { name: Webkit, version: '536.26' }, os: { version: '2.60' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'PlayStation Vita' } } + readable: 'a Sony PlayStation Vita running 2.60' - headers: 'User-Agent: Mozilla/5.0 (PlayStation Vita 2.61) AppleWebKit/536.26 (KHTML, like Gecko) Silk/3.2' - result: { engine: { name: Webkit, version: '536.26' }, os: { version: '2.61' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'Playstation Vita' } } - readable: 'a Sony Playstation Vita running 2.61' + result: { engine: { name: Webkit, version: '536.26' }, os: { version: '2.61' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'PlayStation Vita' } } + readable: 'a Sony PlayStation Vita running 2.61' - headers: 'User-Agent: Mozilla/5.0 (PlayStation Vita 3.00) AppleWebKit/536.26 (KHTML, like Gecko)' - result: { engine: { name: Webkit, version: '536.26' }, os: { version: '3.00' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'Playstation Vita' } } - readable: 'a Sony Playstation Vita running 3.00' + result: { engine: { name: Webkit, version: '536.26' }, os: { version: '3.00' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'PlayStation Vita' } } + readable: 'a Sony PlayStation Vita running 3.00' - headers: 'User-Agent: Mozilla/5.0 (PlayStation Vita 3.00) AppleWebKit/536.26 (KHTML, like Gecko) Silk/3.2' - result: { engine: { name: Webkit, version: '536.26' }, os: { version: '3.00' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'Playstation Vita' } } - readable: 'a Sony Playstation Vita running 3.00' + result: { engine: { name: Webkit, version: '536.26' }, os: { version: '3.00' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'PlayStation Vita' } } + readable: 'a Sony PlayStation Vita running 3.00' - headers: 'User-Agent: Mozilla/5.0 (PlayStation Vita 3.01) AppleWebKit/536.26 (KHTML, like Gecko) Silk/3.2' - result: { engine: { name: Webkit, version: '536.26' }, os: { version: '3.01' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'Playstation Vita' } } - readable: 'a Sony Playstation Vita running 3.01' + result: { engine: { name: Webkit, version: '536.26' }, os: { version: '3.01' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'PlayStation Vita' } } + readable: 'a Sony PlayStation Vita running 3.01' - headers: 'User-Agent: Mozilla/5.0 (PlayStation Vita 3.01) AppleWebKit/536.26 (KHTML, like Gecko) Silk/3.2 VTE/2.50' - result: { engine: { name: Webkit, version: '536.26' }, os: { version: '3.01' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation TV' } } - readable: 'a Sony Playstation TV running 3.01' + result: { engine: { name: Webkit, version: '536.26' }, os: { version: '3.01' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation TV' } } + readable: 'a Sony PlayStation TV running 3.01' - headers: 'User-Agent: Mozilla/5.0 (PlayStation Vita 3.10) AppleWebKit/536.26 (KHTML, like Gecko) Silk/3.2' - result: { engine: { name: Webkit, version: '536.26' }, os: { version: '3.10' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'Playstation Vita' } } - readable: 'a Sony Playstation Vita running 3.10' + result: { engine: { name: Webkit, version: '536.26' }, os: { version: '3.10' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'PlayStation Vita' } } + readable: 'a Sony PlayStation Vita running 3.10' - headers: 'User-Agent: Mozilla/5.0 (PlayStation Vita 3.10) AppleWebKit/536.26 (KHTML, like Gecko) Silk/3.2 VTE/2.50' - result: { engine: { name: Webkit, version: '536.26' }, os: { version: '3.10' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation TV' } } - readable: 'a Sony Playstation TV running 3.10' + result: { engine: { name: Webkit, version: '536.26' }, os: { version: '3.10' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation TV' } } + readable: 'a Sony PlayStation TV running 3.10' - headers: 'User-Agent: Mozilla/5.0 (PlayStation Vita 3.12) AppleWebKit/536.26 (KHTML, like Gecko) Silk/3.2' - result: { engine: { name: Webkit, version: '536.26' }, os: { version: '3.12' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'Playstation Vita' } } - readable: 'a Sony Playstation Vita running 3.12' + result: { engine: { name: Webkit, version: '536.26' }, os: { version: '3.12' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'PlayStation Vita' } } + readable: 'a Sony PlayStation Vita running 3.12' - headers: 'User-Agent: Mozilla/5.0 (PlayStation Vita 3.20) AppleWebKit/537.73 (KHTML, like Gecko) Silk/3.2' - result: { engine: { name: Webkit, version: '537.73' }, os: { version: '3.20' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'Playstation Vita' } } - readable: 'a Sony Playstation Vita running 3.20' + result: { engine: { name: Webkit, version: '537.73' }, os: { version: '3.20' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'PlayStation Vita' } } + readable: 'a Sony PlayStation Vita running 3.20' - headers: 'User-Agent: Sony Playstation2 (Utility Disc Ver.2.03c/for PS-modem)[jp]' - result: { device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 2' } } - readable: 'a Sony Playstation 2' + result: { device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 2' } } + readable: 'a Sony PlayStation 2' - headers: 'User-Agent: Mozilla/5.0 [ja] (Playstation2; Linux 2.4.20 MIPS; ja-JP; rv:1.8a2) Gecko/20040630' - result: { engine: { name: Gecko, version: 1.8a2 }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 2' } } - readable: 'a Sony Playstation 2' + result: { engine: { name: Gecko, version: 1.8a2 }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 2' } } + readable: 'a Sony PlayStation 2' - - headers: 'User-Agent: Mozilla/5.0 [ja] (compatible; MSIE 6.0; Linux 2.6.11-1.1369_FC4; Playstation2)' - result: { device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 2' } } - readable: 'a Sony Playstation 2' + headers: 'User-Agent: Mozilla/5.0 [ja] (compatible; MSIE 6.0; Linux 2.6.11-1.1369_FC4; PlayStation2)' + result: { device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 2' } } + readable: 'a Sony PlayStation 2' - headers: 'User-Agent: Mozilla/4.0 (PS2; PlayStation BB Navigator 1.0) NetFront/3.0' - result: { browser: { name: NetFront, version: '3.0', type: browser }, engine: { name: NetFront }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 2' } } - readable: 'NetFront 3.0 on a Sony Playstation 2' + result: { browser: { name: NetFront, version: '3.0', type: browser }, engine: { name: NetFront }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 2' } } + readable: 'NetFront 3.0 on a Sony PlayStation 2' - headers: 'User-Agent: Mozilla/5.0 (PS3) AppleWebKit/535.11 (KHTML, like Gecko) NuantiMeta/2.0' - result: { browser: { name: 'Nuanti Meta', version: '2.0', type: browser }, engine: { name: Webkit, version: '535.11' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 3' } } - readable: 'Nuanti Meta 2.0 on a Sony Playstation 3' + result: { browser: { name: 'Nuanti Meta', version: '2.0', type: browser }, engine: { name: Webkit, version: '535.11' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 3' } } + readable: 'Nuanti Meta 2.0 on a Sony PlayStation 3' - headers: 'User-Agent: Mozilla/5.0 (PS3) AppleWebKit/535.1 (KHTML, like Gecko) NuantiMeta/2.0 Chrome/13.0.782.220 Safari/535.1' - result: { browser: { name: 'Nuanti Meta', family: { name: Chrome, version: 13 }, version: '2.0', type: browser }, engine: { name: Webkit, version: '535.1' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 3' } } - readable: 'Nuanti Meta 2.0 on a Sony Playstation 3' + result: { browser: { name: 'Nuanti Meta', family: { name: Chrome, version: 13 }, version: '2.0', type: browser }, engine: { name: Webkit, version: '535.1' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 3' } } + readable: 'Nuanti Meta 2.0 on a Sony PlayStation 3' - headers: 'User-Agent: Mozilla/5.0 (PlayStation 4) AppleWebKit/531.3 (KHTML, like Gecko) SCEE/1.0 Nuanti/2.0' - result: { browser: { name: 'Nuanti Meta', version: '2.0', type: browser }, engine: { name: Webkit, version: '531.3' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 4' } } - readable: 'Nuanti Meta 2.0 on a Sony Playstation 4' + result: { browser: { name: 'Nuanti Meta', version: '2.0', type: browser }, engine: { name: Webkit, version: '531.3' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 4' } } + readable: 'Nuanti Meta 2.0 on a Sony PlayStation 4' - headers: 'User-Agent: Mozilla/5.0 (PlayStation VITA) AppleWebKit/531.3 (KHTML, like Gecko) SCEE/1.0 Nuanti/2.0' - result: { browser: { name: 'Nuanti Meta', version: '2.0', type: browser }, engine: { name: Webkit, version: '531.3' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'Playstation Vita' } } - readable: 'Nuanti Meta 2.0 on a Sony Playstation Vita' + result: { browser: { name: 'Nuanti Meta', version: '2.0', type: browser }, engine: { name: Webkit, version: '531.3' }, device: { type: gaming, subtype: portable, manufacturer: Sony, model: 'PlayStation Vita' } } + readable: 'Nuanti Meta 2.0 on a Sony PlayStation Vita' - headers: 'User-Agent: Mozilla/3.0 (Planetweb/v1.16; SPS JP)' - result: { browser: { name: Planetweb, version: '1.16', type: browser }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 2' } } - readable: 'Planetweb 1.16 on a Sony Playstation 2' + result: { browser: { name: Planetweb, version: '1.16', type: browser }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 2' } } + readable: 'Planetweb 1.16 on a Sony PlayStation 2' - headers: 'User-Agent: Mozilla/3.0 AVE-Front/2.6 (BrowserInfo Screen=624x400x16M; InputMethod=CONTROLER, MOUSE, REMOCON; Page=10M; Category=GAME; Product=ACCESS/NFPS; HTML-Level=3.2; Strage=NO;)' - result: { browser: { name: NetFront, version: '2.6', type: browser }, engine: { name: NetFront }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 2' } } - readable: 'NetFront 2.6 on a Sony Playstation 2' + result: { browser: { name: NetFront, version: '2.6', type: browser }, engine: { name: NetFront }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 2' } } + readable: 'NetFront 2.6 on a Sony PlayStation 2' - headers: 'User-Agent: Mozilla/3.0 AVE-Front/2.6 (BrowserInfo Screen=640x448x16M; InputMethod=CONTROLER, MOUSE, REMOCON; Page=12M; Category=GAME; Product=SUNSOFT/EnjoyMagic; HTML-Level=3.2; Language=ja.SJIS; Storage=NO;)' - result: { browser: { name: NetFront, version: '2.6', type: browser }, engine: { name: NetFront }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 2' } } - readable: 'NetFront 2.6 on a Sony Playstation 2' + result: { browser: { name: NetFront, version: '2.6', type: browser }, engine: { name: NetFront }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 2' } } + readable: 'NetFront 2.6 on a Sony PlayStation 2' - headers: 'User-Agent: Mozilla/5.0 (PS3; Leanback Shell) AppleWebKit/535.22 (KHTML, like Gecko) Chrome/19.0.1048.0 LeanbackShell/01.00.01.73 QA Safari/535.22 Sony PS3/ (PS3, , no, CH)' - readable: 'Chrome Dev 19.0.1048.0 on a Sony Playstation 3' - result: { browser: { name: Chrome, version: 19.0.1048.0, type: browser }, engine: { name: Webkit, version: '535.22' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 3' } } + readable: 'Chrome Dev 19.0.1048.0 on a Sony PlayStation 3' + result: { browser: { name: Chrome, version: 19.0.1048.0, type: browser }, engine: { name: Webkit, version: '535.22' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 3' } } - - headers: 'User-Agent: Mozilla/5.0 (PS4; Leanback Shell) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.70 LeanbackShell/2.3D Gold build cf8a43c-2016329 Safari/537.22 Sony Playstation4/ (PS4,, en, US)' - readable: 'Chrome 25 on a Sony Playstation 4' - result: { browser: { name: Chrome, version: '25', type: browser }, engine: { name: Webkit, version: '537.22' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 4' } } + headers: 'User-Agent: Mozilla/5.0 (PS4; Leanback Shell) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.70 LeanbackShell/2.3D Gold build cf8a43c-2016329 Safari/537.22 Sony PlayStation4/ (PS4,, en, US)' + readable: 'Chrome 25 on a Sony PlayStation 4' + result: { browser: { name: Chrome, version: '25', type: browser }, engine: { name: Webkit, version: '537.22' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 4' } } - headers: 'User-Agent: Mozilla/5.0 (PS3; PPU 4.2.0) AppleWebKit/537.21+ (KHTML, like Gecko) AmazonSpark/0.1.0' - readable: 'a Sony Playstation 3' - result: { engine: { name: Webkit, version: '537.21' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'Playstation 3' } } + readable: 'a Sony PlayStation 3' + result: { engine: { name: Webkit, version: '537.21' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 3' } } +- + headers: 'User-Agent: Mozilla/5.0 (PlayStation 5/SmartTV) AppleWebKit/605.1.15 (KHTML, like Gecko)' + readable: 'a Sony PlayStation 5' + result: { engine: { name: Webkit, version: 605.1.15 }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 5' } } +- + headers: 'User-Agent: Mozilla/5.0 (PlayStation 5 3.03/SmartTV) AppleWebKit/605.1.15 (KHTML, like Gecko)' + readable: 'a Sony PlayStation 5 running 3.03' + result: { engine: { name: Webkit, version: 605.1.15 }, os: { version: '3.03' }, device: { type: gaming, subtype: console, manufacturer: Sony, model: 'PlayStation 5' } } diff --git a/tests/data/mobile/app-chat.yaml b/tests/data/mobile/app-chat.yaml index 7da09916b..f0a970753 100644 --- a/tests/data/mobile/app-chat.yaml +++ b/tests/data/mobile/app-chat.yaml @@ -20,12 +20,12 @@ readable: 'Yahoo Messenger 1.8.4 on an Archos 79XE running Android 4.2.2' - headers: 'User-Agent: WhatsApp/2.11.164 Android/4_2_2 Device/samsung-GT-I9152' - result: { browser: { name: WhatsApp, version: '2.11', type: 'app:chat' }, os: { name: Android, version: 4.2.2 }, device: { type: mobile, subtype: smart, manufacturer: Samsung, model: 'Galaxy Mega 5.8 Plus' } } - readable: 'WhatsApp 2.11 on a Samsung Galaxy Mega 5.8 Plus running Android 4.2.2' + result: { browser: { name: WhatsApp, version: 2.11.164, type: 'app:chat' }, os: { name: Android, version: 4.2.2 }, device: { type: mobile, subtype: smart, manufacturer: Samsung, model: 'Galaxy Mega 5.8 Plus' } } + readable: 'WhatsApp 2.11.164 on a Samsung Galaxy Mega 5.8 Plus running Android 4.2.2' - headers: 'User-Agent: WhatsApp/2.11.139 Android/4.0.4 Device/HTC-HTC_Incredible_S' - result: { browser: { name: WhatsApp, version: '2.11', type: 'app:chat' }, os: { name: Android, version: 4.0.4 }, device: { type: mobile, subtype: smart, manufacturer: HTC, model: 'Incredible S' } } - readable: 'WhatsApp 2.11 on a HTC Incredible S running Android 4.0.4' + result: { browser: { name: WhatsApp, version: 2.11.139, type: 'app:chat' }, os: { name: Android, version: 4.0.4 }, device: { type: mobile, subtype: smart, manufacturer: HTC, model: 'Incredible S' } } + readable: 'WhatsApp 2.11.139 on a HTC Incredible S running Android 4.0.4' - headers: 'User-Agent: WhatsApp+/2.11.83 Android/4.1.2 Device/samsung-GT-S5310' result: { browser: { name: WhatsApp, version: '2.11', type: 'app:chat' }, os: { name: Android, version: 4.1.2 }, device: { type: mobile, subtype: smart, manufacturer: Samsung, model: 'Galaxy Pocket Neo' } } @@ -36,20 +36,20 @@ readable: 'WhatsApp 2.11 on a Motorola DEFY+ running Android 4.0.4' - headers: 'User-Agent: WhatsApp/2.11.107 S60Version/3.1 Device/Nokia-E51-(02.1)' - result: { browser: { name: WhatsApp, version: '2.11', type: 'app:chat' }, os: { name: Series60, family: Symbian, version: '3.1' }, device: { type: mobile, subtype: smart, manufacturer: Nokia, model: E51 } } - readable: 'WhatsApp 2.11 on a Nokia E51 running Series60 3.1' + result: { browser: { name: WhatsApp, version: 2.11.107, type: 'app:chat' }, os: { name: Series60, family: Symbian, version: '3.1' }, device: { type: mobile, subtype: smart, manufacturer: Nokia, model: E51 } } + readable: 'WhatsApp 2.11.107 on a Nokia E51 running Series60 3.1' - headers: 'User-Agent: WhatsApp/2.11.236 S60Version/3.2 Device/Nokia-6650-(02.01)' - result: { browser: { name: WhatsApp, version: '2.11', type: 'app:chat' }, os: { name: Series60, family: Symbian, version: '3.2' }, device: { type: mobile, subtype: smart, manufacturer: Nokia, model: '6650' } } - readable: 'WhatsApp 2.11 on a Nokia 6650 running Series60 3.2' + result: { browser: { name: WhatsApp, version: 2.11.236, type: 'app:chat' }, os: { name: Series60, family: Symbian, version: '3.2' }, device: { type: mobile, subtype: smart, manufacturer: Nokia, model: '6650' } } + readable: 'WhatsApp 2.11.236 on a Nokia 6650 running Series60 3.2' - headers: 'User-Agent: WhatsApp/2.11.356 WP7/7.10.8107 Device/SAMSUNG-GT-I8350-H23.15.0.8' - result: { browser: { name: WhatsApp, version: '2.11', type: 'app:chat' }, os: { name: 'Windows Phone', version: '7.10' }, device: { type: mobile, subtype: smart, manufacturer: Samsung, model: 'Omnia W' } } - readable: 'WhatsApp 2.11 on a Samsung Omnia W running Windows Phone 7.10' + result: { browser: { name: WhatsApp, version: 2.11.356, type: 'app:chat' }, os: { name: 'Windows Phone', version: '7.10' }, device: { type: mobile, subtype: smart, manufacturer: Samsung, model: 'Omnia W' } } + readable: 'WhatsApp 2.11.356 on a Samsung Omnia W running Windows Phone 7.10' - headers: 'User-Agent: WhatsApp/2.11.282 WP7/8.0.10328.0 Device/NOKIA-RM-914_eu_euro2_341-H1.0.0.0' - result: { browser: { name: WhatsApp, version: '2.11', type: 'app:chat' }, os: { name: 'Windows Phone', version: '8.0' }, device: { type: mobile, subtype: smart, manufacturer: Nokia, model: 'Lumia 520' } } - readable: 'WhatsApp 2.11 on a Nokia Lumia 520 running Windows Phone 8.0' + result: { browser: { name: WhatsApp, version: 2.11.282, type: 'app:chat' }, os: { name: 'Windows Phone', version: '8.0' }, device: { type: mobile, subtype: smart, manufacturer: Nokia, model: 'Lumia 520' } } + readable: 'WhatsApp 2.11.282 on a Nokia Lumia 520 running Windows Phone 8.0' - headers: 'User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B440 [FBAN/MessengerForiOS;FBAV/17.0.0.20.11;FBBV/5740516;FBDV/iPhone7,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/8.1.2;FBSS/3; FBCR/TelenorDK;FBID/phone;FBLC/da_DK;FBOP/5]' result: { browser: { name: 'Facebook Messenger', type: 'app:chat' }, engine: { name: Webkit, version: 600.1.4 }, os: { name: iOS, version: 8.1.2 }, device: { type: mobile, subtype: smart, manufacturer: Apple, model: 'iPhone 6 Plus' } } @@ -82,3 +82,39 @@ headers: 'User-Agent: Mozilla/5.0 (Linux; Android 6.0.1; Le X526 Build/IIXOSOP5801910121S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36 Wire/0.564.2.20' readable: 'Wire 0.564.2.20 on a LeEco Le 2 X526 running Android 6.0.1' result: { browser: { name: Wire, family: { name: Chrome, version: 56 }, version: 0.564.2.20, type: 'app:chat' }, engine: { name: Blink }, os: { name: Android, version: 6.0.1 }, device: { type: mobile, subtype: smart, manufacturer: LeEco, model: 'Le 2 X526' } } +- + headers: 'User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B440 Line/9.8.0' + result: { browser: { name: Line, version: 9.8.0, type: 'app:chat' }, engine: { name: Webkit, version: 600.1.4 }, os: { name: iOS, version: 8.1.2 }, device: { type: mobile, subtype: smart, manufacturer: Apple, model: iPhone } } + readable: 'Line 9.8.0 on an Apple iPhone running iOS 8.1.2' +- + headers: 'User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 10_1_1 like Mac OS X) AppleWebKit/602.2.14 (KHTML, like Gecko) Mobile/14B100 KAKAOTALK 5.9.2' + readable: 'KakaoTalk 5.9.2 on an Apple iPhone running iOS 10.1.1' + result: { browser: { name: KakaoTalk, version: 5.9.2, type: 'app:chat' }, engine: { name: Webkit, version: 602.2.14 }, os: { name: iOS, version: 10.1.1 }, device: { type: mobile, subtype: smart, manufacturer: Apple, model: iPhone } } +- + headers: 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) AtomShell/2.3.1 Chrome/52.0.2743.82 Electron/1.3.8 Safari/537.36 Slack_SSB/2.3.1' + readable: 'Slack 2.3.1 on macOS Sierra 10.12' + result: { browser: { name: Slack, using: { name: Electron, version: 2.3.1 }, family: { name: Chrome, version: 52 }, version: 2.3.1, type: 'app:chat' }, engine: { name: Blink }, os: { name: 'OS X', alias: macOS, version: { value: '10.12', nickname: Sierra } }, device: { type: desktop, manufacturer: Apple, model: Macintosh } } +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) WhatsApp/2.2017.6 Chrome/76.0.3809.146 Electron/6.1.9 Safari/537.36' + result: { browser: { name: WhatsApp, using: { name: Electron, version: 6.1.9 }, family: { name: Chrome, version: 76 }, version: 2.2017.6, type: 'app:chat' }, engine: { name: Blink }, os: { name: Windows, version: { value: '10.0', alias: '10' } }, device: { type: desktop } } + readable: 'WhatsApp 2.2017.6 on Windows 10' +- + headers: 'User-Agent: WhatsApp/2.19.360 A' + result: { browser: { name: WhatsApp, version: 2.19.360, type: 'app:chat' } } + readable: 'WhatsApp 2.19.360' +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 4.4.2;LG-F320S) AppleWebKit/537.36 (KHTML, like Gecko) Zalo/1.0 Safari/537.36' + readable: 'Zalo 1.0 on a LG G2 running Android 4.4.2' + result: { browser: { name: Zalo, version: '1.0', type: 'app:chat' }, engine: { name: Webkit, version: '537.36' }, os: { name: Android, version: 4.4.2 }, device: { type: mobile, subtype: smart, manufacturer: LG, model: G2 } } +- + headers: 'User-Agent: Zalo-win32-24v294' + readable: 'Zalo 24' + result: { browser: { name: Zalo, version: '24', type: 'app:chat' } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 6.0.1; Le X526 Build/IIXOSOP5801910121S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36 Viber' + readable: 'Viber on a LeEco Le 2 X526 running Android 6.0.1' + result: { browser: { name: Viber, family: { name: Chrome, version: 56 }, type: 'app:chat' }, engine: { name: Blink }, os: { name: Android, version: 6.0.1 }, device: { type: mobile, subtype: smart, manufacturer: LeEco, model: 'Le 2 X526' } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 9; SM-G950F Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/79.0.3945.79 Mobile Safari/537.36 Viber/12.0.0.4' + readable: 'Viber on a Samsung Galaxy S8 running Android 9' + result: { browser: { name: Viber, using: { name: 'Chromium WebView', version: '79' }, type: 'app:chat' }, engine: { name: Blink }, os: { name: Android, version: '9' }, device: { type: mobile, subtype: smart, manufacturer: Samsung, model: 'Galaxy S8' } } diff --git a/tests/data/mobile/app-social.yaml b/tests/data/mobile/app-social.yaml index a2950c9d3..4cd5a6c3b 100644 --- a/tests/data/mobile/app-social.yaml +++ b/tests/data/mobile/app-social.yaml @@ -86,3 +86,7 @@ headers: 'User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Mobile/15A372 [FBAN/FBIOS;FBAV/147.0.0.46.81;FBBV/76961488;FBDV/iPhone10,4;FBMD/iPhone;FBSN/iOS;FBSV/11.0;FBSS/2;FBCR/KPNNL;FBID/phone;FBLC/nl_NL;FBOP/5;FBRV/' readable: 'Facebook on an Apple iPhone 8 running iOS 11.0' result: { browser: { name: Facebook, type: 'app:social' }, engine: { name: Webkit, version: 604.1.38 }, os: { name: iOS, version: '11.0' }, device: { type: mobile, subtype: smart, manufacturer: Apple, model: 'iPhone 8' } } +- + headers: 'User-Agent: YelpWebView/1.5 Android/6.0.1 YelpApp/9.9.0 (x-screen-scale 1.0;)' + readable: 'Yelp 9.9.0 on Android 6.0.1' + result: { browser: { name: Yelp, version: 9.9.0, type: 'app:social' }, os: { name: Android, version: 6.0.1 }, device: { type: tablet } } diff --git a/tests/data/mobile/browser-chrome.yaml b/tests/data/mobile/browser-chrome.yaml index 5cad89b32..45ae90165 100644 --- a/tests/data/mobile/browser-chrome.yaml +++ b/tests/data/mobile/browser-chrome.yaml @@ -290,3 +290,19 @@ headers: 'User-Agent: m2 note/4.5 Linux/3.10.65 Android/5.1 Release/08.17.2015 Browser/Chrome40.0.2214.114 Profile/MIDP-2.0 Configuration/CLDC-1.1' result: { browser: { name: Chrome, version: '40', type: browser }, os: { name: Android, version: '5.1' }, device: { type: mobile, subtype: smart, manufacturer: Meizu, model: 'M2 Note' } } readable: 'Chrome 40 on a Meizu M2 Note running Android 5.1' +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Mobile Safari/537.36' + readable: 'Chrome 100 on Android 10' + result: { browser: { name: Chrome, version: '100', type: browser }, engine: { name: Blink }, os: { name: Android, version: '10' }, device: { type: mobile, subtype: smart } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.0.0 Mobile Safari/537.36' + readable: 'Chrome 96 on Android 10' + result: { browser: { name: Chrome, version: '96', type: browser }, engine: { name: Blink }, os: { name: Android, version: '10' }, device: { type: mobile, subtype: smart } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.0.0 Mobile Safari/537.36' + readable: 'Chrome 97 on Android 10' + result: { browser: { name: Chrome, version: '97', type: browser }, engine: { name: Blink }, os: { name: Android, version: '10' }, device: { type: mobile, subtype: smart } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 9; Unspecified Device) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.0.0 Mobile Safari/537.36' + readable: 'Chrome 90 on Android 9' + result: { browser: { name: Chrome, version: '90', type: browser }, engine: { name: Blink }, os: { name: Android, version: '9' }, device: { type: mobile, subtype: smart } } diff --git a/tests/data/mobile/browser-other.yaml b/tests/data/mobile/browser-other.yaml index 5570a981f..d2f137616 100644 --- a/tests/data/mobile/browser-other.yaml +++ b/tests/data/mobile/browser-other.yaml @@ -70,3 +70,51 @@ headers: 'User-Agent: Mozilla/5.0 (Linux; U; Android 4.4.4; zh-cn; OPPO R7 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.134 Mobile Safari/537.36 OppoBrowser/4.6.5.3' readable: 'Oppo Browser 4.6.5.3 on an Oppo R7 running Android 4.4.4' result: { browser: { name: 'Oppo Browser', family: { name: Chrome, version: 53 }, version: 4.6.5.3, type: browser }, engine: { name: Blink }, os: { name: Android, version: 4.4.4 }, device: { type: mobile, subtype: smart, manufacturer: Oppo, model: R7 } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 7.0; HUAWEI-M570/001.00 WAP/OBIGO/Q05A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Mobile Safari/537.36 AlohaBrowser/1.2.1.3' + readable: 'Aloha Browser 1.2.1.3 on a Huawei M570 running Android 7.0' + result: { browser: { name: 'Aloha Browser', family: { name: Chrome, version: 63 }, version: 1.2.1.3, type: browser }, engine: { name: Blink }, os: { name: Android, version: '7.0' }, device: { type: mobile, subtype: smart, manufacturer: Huawei, model: M570 } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; U; Android 7.1.1; en-us; CPH1723 Build/N6F26Q) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.134 Mobile Safari/537.36 CoRom/30.0.1599.101' + readable: 'Corom Browser 30.0.1599.101 on an Oppo F5 running Android 7.1.1' + result: { browser: { name: 'Corom Browser', family: { name: Chrome, version: 53 }, version: 30.0.1599.101, type: browser }, engine: { name: Blink }, os: { name: Android, version: 7.1.1 }, device: { type: mobile, subtype: smart, manufacturer: Oppo, model: F5 } } +- + headers: 'User-Agent: Mozilla/5.0 (iPad; CPU OS 11_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E302 Safari/9537.53 DiigoBrowser' + result: { browser: { name: 'Diigo Browser', type: browser }, engine: { name: Webkit, version: 605.1.15 }, os: { name: iOS, version: '11.3' }, device: { type: mobile, subtype: smart, manufacturer: Apple, model: iPad } } + readable: 'Diigo Browser on an Apple iPad running iOS 11.3' +- + headers: 'User-Agent: Mozilla/5.0 (Linux; U; Android 8.1.0; zh-cn; PBAM00 Build/OPM1.171019.026) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.80 Mobile Safari/537.36 HeyTapBrowser/10.7.2.1' + readable: 'HeyTap Browser 10.7.2.1 on an Oppo A5 running Android 8.1.0' + result: { browser: { name: 'HeyTap Browser', family: { name: Chrome, version: 70 }, version: 10.7.2.1, type: browser }, engine: { name: Blink }, os: { name: Android, version: 8.1.0 }, device: { type: mobile, subtype: smart, manufacturer: Oppo, model: A5 } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 5.0.2; Le X507 Build/DHXOSOP5501405251S) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36 Epic/1.0' + readable: 'Epic Browser 1.0 on a LeEco Le 1s X507 running Android 5.0.2' + result: { browser: { name: 'Epic Browser', using: { name: 'Chromium WebView', version: '37' }, version: '1.0', type: browser }, engine: { name: Blink }, os: { name: Android, version: 5.0.2 }, device: { type: mobile, subtype: smart, manufacturer: LeEco, model: 'Le 1s X507' } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; U; Android 9; pl-pl; Redmi 6A Build/PPR1.180610.011) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.128 Mobile Safari/537.36 XiaoMi/Mint Browser/3.3.1' + readable: 'Mint Browser 3.3.1 on a Xiaomi Redmi 6A running Android 9' + result: { browser: { name: 'Mint Browser', family: { name: Chrome, version: 61 }, version: 3.3.1, type: browser }, engine: { name: Blink }, os: { name: Android, version: '9' }, device: { type: mobile, subtype: smart, manufacturer: Xiaomi, model: 'Redmi 6A' } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; U; Android 9; en; SM-A205GN) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Tenta/3.1.6 Build/2162 Safari/537.36' + readable: 'Tenta Browser 3.1.6 on a Samsung Galaxy A20 running Android 9' + result: { browser: { name: 'Tenta Browser', family: { name: Chrome, version: 64 }, version: 3.1.6, type: browser }, engine: { name: Blink }, os: { name: Android, version: '9' }, device: { type: mobile, subtype: smart, manufacturer: Samsung, model: 'Galaxy A20' } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 7.1.1; SM-J510H Build/NMF26X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.204 Mobile Safari/537.36 TNSBrowser/25.01' + readable: 'K.Browser 25.01 on a Samsung Galaxy J5 (2016) running Android 7.1.1' + result: { browser: { name: K.Browser, family: { name: Chrome, version: 64 }, version: '25.01', type: browser }, engine: { name: Blink }, os: { name: Android, version: 7.1.1 }, device: { type: mobile, subtype: smart, manufacturer: Samsung, model: 'Galaxy J5 (2016)' } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; U; Android 9; RMX1941 Build/PPR1.180610.011) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.134 Mobile Safari/537.36 RealmeBrowser/35.5.0.8' + readable: 'Realme Browser 35.5.0.8 on a RMX1941 running Android 9' + result: { browser: { name: 'Realme Browser', family: { name: Chrome, version: 53 }, version: 35.5.0.8, type: browser }, engine: { name: Blink }, os: { name: Android, version: '9' }, device: { type: mobile, subtype: smart, model: RMX1941 } } +- + headers: 'User-Agent: Mozilla/5.0 (iPad; CPU OS 9_3_5 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13G36 (Ecosia ios@4.0.10.813) Safari/604' + result: { browser: { name: 'Ecosia Browser', version: 4.0.10.813, type: browser }, engine: { name: Webkit, version: 601.1.46 }, os: { name: iOS, version: 9.3.5 }, device: { type: mobile, subtype: smart, manufacturer: Apple, model: iPad } } + readable: 'Ecosia Browser 4.0.10.813 on an Apple iPad running iOS 9.3.5' +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 9; FIG-LX3 Build/HUAWEIFIG-L23) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.128 Mobile Safari/537.36 (Ecosia android@69.0.3497.128)' + result: { browser: { name: 'Ecosia Browser', family: { name: Chrome, version: 69 }, version: 69.0.3497.128, type: browser }, engine: { name: Blink }, os: { name: Android, version: '9' }, device: { type: mobile, subtype: smart, manufacturer: Huawei, model: 'P Smart' } } + readable: 'Ecosia Browser 69.0.3497.128 on a Huawei P Smart running Android 9' +- + headers: 'User-Agent: Mozilla/5.0 (iPad; CPU OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Mobile/14G60 Version/10.3 Safari/8536.25 Mobicip/1882608256' + result: { browser: { name: Mobicip, type: browser }, engine: { name: Webkit, version: 603.3.8 }, os: { name: iOS, version: 10.3.3 }, device: { type: mobile, subtype: smart, manufacturer: Apple, model: iPad } } + readable: 'Mobicip on an Apple iPad running iOS 10.3.3' diff --git a/tests/data/mobile/os-android.yaml b/tests/data/mobile/os-android.yaml index 439943a70..e35b78309 100644 --- a/tests/data/mobile/os-android.yaml +++ b/tests/data/mobile/os-android.yaml @@ -334,3 +334,39 @@ headers: 'User-Agent: Mozilla/5.0 (Linux; U; Android 2.2; de; TSB_CLOUD_COMPANION;TOSHIBA_AC_AND_AZ) AppleWebkit/533.1(KHTML, like Gecko) Version/4.0 Safari/533.1' readable: 'Android Browser on a Toshiba Dynabook AZ running Android 2.2' result: { browser: { name: 'Android Browser' }, engine: { name: Webkit, version: '533.1' }, os: { name: Android, version: '2.2' }, device: { type: desktop, manufacturer: Toshiba, model: 'Dynabook AZ' } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; arm_64; Android 6.0.1; NX549J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.127 YaBrowser/20.9.3.85.00 SA/3 Mobile Safari/537.36' + readable: 'Yandex Browser 20.9 on a ZTE Nubia Z11 Mini S running Android 6.0.1' + result: { browser: { name: 'Yandex Browser', family: { name: Chrome, version: 85 }, version: '20.9', type: browser }, engine: { name: Blink }, os: { name: Android, version: 6.0.1 }, device: { type: mobile, subtype: smart, manufacturer: ZTE, model: 'Nubia Z11 Mini S' } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; arm; Android 6.0.1; NX549J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.127 YaBrowser/20.9.3.85.00 SA/3 Mobile Safari/537.36' + readable: 'Yandex Browser 20.9 on a ZTE Nubia Z11 Mini S running Android 6.0.1' + result: { browser: { name: 'Yandex Browser', family: { name: Chrome, version: 85 }, version: '20.9', type: browser }, engine: { name: Blink }, os: { name: Android, version: 6.0.1 }, device: { type: mobile, subtype: smart, manufacturer: ZTE, model: 'Nubia Z11 Mini S' } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; U; Android 9; th; vivo 1915) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Tenta/3.1.6 Build/2162 Safari/537.36' + readable: 'Tenta Browser 3.1.6 on a vivo 1915 running Android 9' + result: { browser: { name: 'Tenta Browser', family: { name: Chrome, version: 64 }, version: 3.1.6, type: browser }, engine: { name: Blink }, os: { name: Android, version: '9' }, device: { type: mobile, subtype: smart, model: 'vivo 1915' } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 11; moto g(60)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.79 Mobile Safari/537.36' + readable: 'Chrome 100 on a Motorola Moto G60 running Android 11' + result: { browser: { name: Chrome, version: '100', type: browser }, engine: { name: Blink }, os: { name: Android, version: '11' }, device: { type: mobile, subtype: smart, manufacturer: Motorola, model: 'Moto G60' } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 11; moto g(60)s) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.79 Mobile Safari/537.36' + readable: 'Chrome 100 on a Motorola Moto G60s running Android 11' + result: { browser: { name: Chrome, version: '100', type: browser }, engine: { name: Blink }, os: { name: Android, version: '11' }, device: { type: mobile, subtype: smart, manufacturer: Motorola, model: 'Moto G60s' } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 11; Pixel 4a (5G)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.79 Mobile Safari/537.36' + readable: 'Chrome 100 on a Google Pixel 4a 5G running Android 11' + result: { browser: { name: Chrome, version: '100', type: browser }, engine: { name: Blink }, os: { name: Android, version: '11' }, device: { type: mobile, subtype: smart, manufacturer: Google, model: 'Pixel 4a 5G' } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 10; moto e(6i) Build/QOHS30.280-7-9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.88 Mobile Safari/537.36' + readable: 'Chrome 99 on a Motorola Moto E6i running Android 10' + result: { browser: { name: Chrome, version: '99', type: browser }, engine: { name: Blink }, os: { name: Android, version: '10' }, device: { type: mobile, subtype: smart, manufacturer: Motorola, model: 'Moto E6i' } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 11; moto g(9) play) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.79 Mobile Safari/537.36' + readable: 'Chrome 100 on a Motorola Moto G9 Play running Android 11' + result: { browser: { name: Chrome, version: '100', type: browser }, engine: { name: Blink }, os: { name: Android, version: '11' }, device: { type: mobile, subtype: smart, manufacturer: Motorola, model: 'Moto G9 Play' } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 10; ELS-NX9; HMSCore 6.4.0.312) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.105 HuaweiBrowser/12.0.1.302 Mobile Safari/537.36' + readable: 'Huawei Browser 12.0 on a Huawei P40 Pro running Android 10' + result: { browser: { name: 'Huawei Browser', family: { name: Chrome, version: 92 }, version: '12.0', type: browser }, engine: { name: Blink }, os: { name: Android, version: '10' }, device: { type: mobile, subtype: smart, manufacturer: Huawei, model: 'P40 Pro' } } diff --git a/tests/data/mobile/os-harmony.yaml b/tests/data/mobile/os-harmony.yaml new file mode 100644 index 000000000..2ab8818b0 --- /dev/null +++ b/tests/data/mobile/os-harmony.yaml @@ -0,0 +1,8 @@ +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 10; HarmonyOS; DVC-AN20; HMSCore 6.4.0.312) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.105 HuaweiBrowser/12.0.1.302 Mobile Safari/537.36' + readable: 'Huawei Browser 12.0 on a Huawei Enjoy 20 Pro running Harmony OS' + result: { browser: { name: 'Huawei Browser', family: { name: Chrome, version: 92 }, version: '12.0', type: browser }, engine: { name: Blink }, os: { name: 'Harmony OS', family: { name: Android, version: '10' } }, device: { type: mobile, subtype: smart, manufacturer: Huawei, model: 'Enjoy 20 Pro' } } +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 10; HarmonyOS; HLK-AL00; HMSCore 6.3.0.327; GMSCore 21.33.14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.105 HuaweiBrowser/12.0.0.303 Mobile Safari/537.36' + readable: 'Huawei Browser 12.0 on a Huawei Honor 9X running Harmony OS' + result: { browser: { name: 'Huawei Browser', family: { name: Chrome, version: 92 }, version: '12.0', type: browser }, engine: { name: Blink }, os: { name: 'Harmony OS', family: { name: Android, version: '10' } }, device: { type: mobile, subtype: smart, manufacturer: Huawei, model: 'Honor 9X' } } diff --git a/tests/data/mobile/os-ios.yaml b/tests/data/mobile/os-ios.yaml index de72bec91..7dec8bdd2 100644 --- a/tests/data/mobile/os-ios.yaml +++ b/tests/data/mobile/os-ios.yaml @@ -466,3 +466,7 @@ headers: 'User-Agent: AtomicLite/7.0.1 CFNetwork/672.1.13 Darwin/14.0.0' result: { browser: { name: Atomic, version: 7.0.1, type: browser }, os: { name: iOS, version: '7.1' }, device: { type: mobile, subtype: smart, manufacturer: Apple } } readable: 'Atomic 7.0.1 on iOS 7.1' +- + headers: 'User-Agent: (iPhone; iOS 13.1.2; Scale/2.00; iPhone9,3)' + readable: 'an Apple iPhone 7 running iOS 13.1.2' + result: { os: { name: iOS, version: 13.1.2 }, device: { type: mobile, subtype: smart, manufacturer: Apple, model: 'iPhone 7' } } diff --git a/tests/data/mobile/os-webos.yaml b/tests/data/mobile/os-webos.yaml index 441298a9b..c92893bdf 100644 --- a/tests/data/mobile/os-webos.yaml +++ b/tests/data/mobile/os-webos.yaml @@ -44,96 +44,96 @@ readable: 'a Palm Pre 2 running webOS 2.2.4' - headers: 'User-Agent: Mozilla/5.0 (Linux; webOS/2.2.0; U; xx) AppleWebKit/534.6 (KHTML, like Gecko) webOSBrowser/221.54 Safari/534.6 Pre/3.0' - result: { engine: { name: Webkit, version: '534.6' }, os: { name: webOS, version: '2.2' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pre 3' } } - readable: 'a Palm Pre 3 running webOS 2.2' + result: { engine: { name: Webkit, version: '534.6' }, os: { name: webOS, version: '2.2.0' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pre 3' } } + readable: 'a Palm Pre 3 running webOS 2.2.0' - headers: 'User-Agent: Mozilla/5.0 (Linux; webOS/2.2.4; U; xx) AppleWebKit/534.6 (KHTML, like Gecko) webOSBrowser/221.56 Safari/534.6 P160UNA/1.0' - result: { engine: { name: Webkit, version: '534.6' }, os: { name: webOS, version: '2.2' }, device: { type: mobile, subtype: smart, manufacturer: HP, model: Veer } } - readable: 'a HP Veer running webOS 2.2' + result: { engine: { name: Webkit, version: '534.6' }, os: { name: webOS, version: '2.2.4' }, device: { type: mobile, subtype: smart, manufacturer: HP, model: Veer } } + readable: 'a HP Veer running webOS 2.2.4' - headers: 'User-Agent: Mozilla/5.0 (Linux; webOS/2.2.4; U; xx) AppleWebKit/534.6 (KHTML, like Gecko) webOSBrowser/221.56 Safari/534.6 Pre/1.2' - result: { engine: { name: Webkit, version: '534.6' }, os: { name: webOS, version: '2.2' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pre 2' } } - readable: 'a Palm Pre 2 running webOS 2.2' + result: { engine: { name: Webkit, version: '534.6' }, os: { name: webOS, version: '2.2.4' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pre 2' } } + readable: 'a Palm Pre 2 running webOS 2.2.4' - headers: 'User-Agent: Mozilla/5.0 (Linux; webOS/2.2.4; U; xx) AppleWebKit/534.6 (KHTML, like Gecko) webOSBrowser/221.56 Safari/534.6 Pre/3.0' - result: { engine: { name: Webkit, version: '534.6' }, os: { name: webOS, version: '2.2' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pre 3' } } - readable: 'a Palm Pre 3 running webOS 2.2' + result: { engine: { name: Webkit, version: '534.6' }, os: { name: webOS, version: '2.2.4' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pre 3' } } + readable: 'a Palm Pre 3 running webOS 2.2.4' - headers: 'User-Agent: Mozilla/5.0 (hp-desktop; Linux; hpwOS/2.0; U; xx) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/234.83 Safari/534.6 Desktop/1.0' result: { browser: { name: 'webOS Browser', type: browser }, engine: { name: Webkit, version: '534.6' }, os: { name: webOS, version: '2.0' }, device: { type: emulator } } readable: 'webOS Browser on an emulator running webOS 2.0' - headers: 'User-Agent: Mozilla/5.0 (iPhone; U; xx)(webOS/2.1.0; U; xx) AppleWebKit/532.2 Version/1.0 Safari/532.2 Pre/1.0 -CET' - result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '2.1' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: Pre } } - readable: 'a Palm Pre running webOS 2.1' + result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '2.1.0' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: Pre } } + readable: 'a Palm Pre running webOS 2.1.0' - headers: 'User-Agent: Mozilla/5.0 (webOS/1.0; U; xx) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Pre/1.0' result: { engine: { name: Webkit, version: 525.27.1 }, os: { name: webOS, version: '1.0' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: Pre } } readable: 'a Palm Pre running webOS 1.0' - headers: 'User-Agent: Mozilla/5.0 (webOS/1.4.0; U; xx) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pre/1.0' - result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '1.4' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: Pre } } - readable: 'a Palm Pre running webOS 1.4' + result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '1.4.0' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: Pre } } + readable: 'a Palm Pre running webOS 1.4.0' - headers: 'User-Agent: Mozilla/5.0 (webOS/1.4.5.1; U; xx) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pixi/1.1' - result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '1.4' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pixi Plus' } } - readable: 'a Palm Pixi Plus running webOS 1.4' + result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '1.4.5.1' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pixi Plus' } } + readable: 'a Palm Pixi Plus running webOS 1.4.5.1' - headers: 'User-Agent: Mozilla/5.0 (webOS/1.4.5.1; U; xx) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pre/1.1' - result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '1.4' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pre Plus' } } - readable: 'a Palm Pre Plus running webOS 1.4' + result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '1.4.5.1' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pre Plus' } } + readable: 'a Palm Pre Plus running webOS 1.4.5.1' - headers: 'User-Agent: Mozilla/5.0 (webOS/1.4.5; U; xx) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pixi/1.0' - result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '1.4' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: Pixi } } - readable: 'a Palm Pixi running webOS 1.4' + result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '1.4.5' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: Pixi } } + readable: 'a Palm Pixi running webOS 1.4.5' - headers: 'User-Agent: Mozilla/5.0 (webOS/1.4.5; U; xx) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pixi/1.1' - result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '1.4' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pixi Plus' } } - readable: 'a Palm Pixi Plus running webOS 1.4' + result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '1.4.5' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pixi Plus' } } + readable: 'a Palm Pixi Plus running webOS 1.4.5' - headers: 'User-Agent: Mozilla/5.0 (webOS/1.4.5; U; xx) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pre/1.0' - result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '1.4' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: Pre } } - readable: 'a Palm Pre running webOS 1.4' + result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '1.4.5' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: Pre } } + readable: 'a Palm Pre running webOS 1.4.5' - headers: 'User-Agent: Mozilla/5.0 (webOS/1.4.5; U; xx) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pre/1.1' - result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '1.4' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pre Plus' } } - readable: 'a Palm Pre Plus running webOS 1.4' + result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '1.4.5' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pre Plus' } } + readable: 'a Palm Pre Plus running webOS 1.4.5' - headers: 'User-Agent: Mozilla/5.0 (webOS/2.0.0; U; xx) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pre/1.2' - result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '2.0' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pre 2' } } - readable: 'a Palm Pre 2 running webOS 2.0' + result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '2.0.0' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pre 2' } } + readable: 'a Palm Pre 2 running webOS 2.0.0' - headers: 'User-Agent: Mozilla/5.0 (webOS/2.1.0; U; xx) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pre/1.0' - result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '2.1' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: Pre } } - readable: 'a Palm Pre running webOS 2.1' + result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '2.1.0' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: Pre } } + readable: 'a Palm Pre running webOS 2.1.0' - headers: 'User-Agent: Mozilla/5.0 (webOS/2.1.0; U; xx) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pre/1.1' - result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '2.1' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pre Plus' } } - readable: 'a Palm Pre Plus running webOS 2.1' + result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '2.1.0' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pre Plus' } } + readable: 'a Palm Pre Plus running webOS 2.1.0' - headers: 'User-Agent: Mozilla/5.0 (webOS/2.1.0; U; xx) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pre/1.2' - result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '2.1' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pre 2' } } - readable: 'a Palm Pre 2 running webOS 2.1' + result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '2.1.0' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pre 2' } } + readable: 'a Palm Pre 2 running webOS 2.1.0' - headers: 'User-Agent: Mozilla/5.0 (webOS/2.1.1; U; xx) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 P160U/1.0' - result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '2.1' }, device: { type: mobile, subtype: smart, manufacturer: HP, model: Veer } } - readable: 'a HP Veer running webOS 2.1' + result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '2.1.1' }, device: { type: mobile, subtype: smart, manufacturer: HP, model: Veer } } + readable: 'a HP Veer running webOS 2.1.1' - headers: 'User-Agent: Mozilla/5.0 (webOS/2.1.2; U; xx) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 P160U/1.0' - result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '2.1' }, device: { type: mobile, subtype: smart, manufacturer: HP, model: Veer } } - readable: 'a HP Veer running webOS 2.1' + result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '2.1.2' }, device: { type: mobile, subtype: smart, manufacturer: HP, model: Veer } } + readable: 'a HP Veer running webOS 2.1.2' - headers: 'User-Agent: Mozilla/5.0 (webOS/2.1.2; U; xx) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 P160UNA/1.0' - result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '2.1' }, device: { type: mobile, subtype: smart, manufacturer: HP, model: Veer } } - readable: 'a HP Veer running webOS 2.1' + result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '2.1.2' }, device: { type: mobile, subtype: smart, manufacturer: HP, model: Veer } } + readable: 'a HP Veer running webOS 2.1.2' - headers: 'User-Agent: Mozilla/5.0 (webOS/HP webOS 2.1.0; U; xx) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pixi/1.1' - result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '2.1' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pixi Plus' } } - readable: 'a Palm Pixi Plus running webOS 2.1' + result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '2.1.0' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pixi Plus' } } + readable: 'a Palm Pixi Plus running webOS 2.1.0' - headers: 'User-Agent: Mozilla/5.0 (webOS/HP webOS 2.1.2; U; xx) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pixi/1.1' - result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '2.1' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pixi Plus' } } - readable: 'a Palm Pixi Plus running webOS 2.1' + result: { engine: { name: Webkit, version: '532.2' }, os: { name: webOS, version: '2.1.2' }, device: { type: mobile, subtype: smart, manufacturer: Palm, model: 'Pixi Plus' } } + readable: 'a Palm Pixi Plus running webOS 2.1.2' - headers: 'User-Agent: Mozilla/5.0 (Linux; U; en-US) AppleWebKit/532.2 Version/1.0 Safari/532.2 Pixi/1.1' readable: 'a Palm Pixi Plus running webOS' diff --git a/tests/data/tablet/os-android.yaml b/tests/data/tablet/os-android.yaml index cc0d5012e..89866124e 100644 --- a/tests/data/tablet/os-android.yaml +++ b/tests/data/tablet/os-android.yaml @@ -6,3 +6,7 @@ headers: 'User-Agent: Mozilla/5.0 (Linux; U; Android 2.2; xx; HP eStation/1.0) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' result: { browser: { name: 'Android Browser' }, engine: { name: Webkit, version: '533.1' }, os: { name: Android, version: '2.2' }, device: { type: printer, manufacturer: HP, model: eStation } } readable: 'Android Browser on a HP eStation running Android 2.2' +- + headers: 'User-Agent: Mozilla/5.0 (Linux; Android 8.1; T8_T106 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Kiwi Chrome/69.0.3440.40 Safari/537.36' + readable: 'Kiwi Browser 69.0.3440.40 on a T8_T106 running Android 4.4.2' + result: { browser: { name: 'Kiwi Browser', family: { name: Chrome, version: 69 }, version: 69.0.3440.40, type: browser }, engine: { name: Blink }, os: { name: Android, version: 4.4.2 }, device: { type: tablet, model: T8_T106 } } diff --git a/tests/data/tablet/os-webos.yaml b/tests/data/tablet/os-webos.yaml index f5b8c6a14..09a1e96de 100644 --- a/tests/data/tablet/os-webos.yaml +++ b/tests/data/tablet/os-webos.yaml @@ -1,11 +1,11 @@ - headers: 'User-Agent: Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.4; U; xx) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/234.68 Safari/534.6 TouchPad/1.0' - result: { browser: { name: 'webOS Browser', type: browser }, engine: { name: Webkit, version: '534.6' }, os: { name: webOS, version: '3.0' }, device: { type: tablet, manufacturer: HP, model: TouchPad } } - readable: 'webOS Browser on a HP TouchPad running webOS 3.0' + result: { browser: { name: 'webOS Browser', type: browser }, engine: { name: Webkit, version: '534.6' }, os: { name: webOS, version: '3.0.4' }, device: { type: tablet, manufacturer: HP, model: TouchPad } } + readable: 'webOS Browser on a HP TouchPad running webOS 3.0.4' - headers: 'User-Agent: Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.5; U; xx) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/234.83 Safari/534.6 TouchPad/1.0' - result: { browser: { name: 'webOS Browser', type: browser }, engine: { name: Webkit, version: '534.6' }, os: { name: webOS, version: '3.0' }, device: { type: tablet, manufacturer: HP, model: TouchPad } } - readable: 'webOS Browser on a HP TouchPad running webOS 3.0' + result: { browser: { name: 'webOS Browser', type: browser }, engine: { name: Webkit, version: '534.6' }, os: { name: webOS, version: '3.0.5' }, device: { type: tablet, manufacturer: HP, model: TouchPad } } + readable: 'webOS Browser on a HP TouchPad running webOS 3.0.5' - headers: 'User-Agent: Mozilla/5.0 (iPad; U; xx) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/234.83 Safari/534.6 011/07' result: { browser: { name: 'webOS Browser', type: browser }, engine: { name: Webkit, version: '534.6' }, os: { name: webOS }, device: { type: tablet, manufacturer: HP, model: TouchPad } } diff --git a/tests/data/television/lg.yaml b/tests/data/television/lg.yaml index 0105f79cd..d772cc848 100644 --- a/tests/data/television/lg.yaml +++ b/tests/data/television/lg.yaml @@ -322,3 +322,27 @@ headers: 'User-Agent: Mozilla/5.0 (Unknown; Linux armv7l) AppleWebKit/537.1+ Hybridcast/1.0(;00E091;webOSTV3_0;2;2;)0' readable: 'a LG webOS TV' result: { engine: { name: Webkit, version: '537.1' }, device: { type: television, manufacturer: LG, series: 'webOS TV' } } +- + headers: 'User-Agent: Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36 WebAppManager' + readable: 'a LG webOS TV' + result: { browser: { family: { name: Chrome, version: 79 }, type: browser }, engine: { name: Blink }, os: { name: webOS }, device: { type: television, manufacturer: LG, series: 'webOS TV' } } +- + headers: 'User-Agent: Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 WebAppManager' + readable: 'a LG webOS TV' + result: { browser: { family: { name: Chrome, version: 68 }, type: browser }, engine: { name: Blink }, os: { name: webOS }, device: { type: television, manufacturer: LG, series: 'webOS TV' } } +- + headers: 'User-Agent: Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.34 Safari/537.36 WebAppManager' + readable: 'a LG webOS TV' + result: { browser: { family: { name: Chrome, version: 53 }, type: browser }, engine: { name: Blink }, os: { name: webOS }, device: { type: television, manufacturer: LG, series: 'webOS TV' } } +- + headers: 'User-Agent: Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.2.1 Chrome/38.0.2125.122 Safari/537.36 WebAppManager' + readable: 'Qt 5.2.1 on a LG webOS TV' + result: { browser: { using: { name: Qt, version: 5.2.1 }, family: { name: Chrome, version: 38 }, type: browser }, engine: { name: Blink }, os: { name: webOS }, device: { type: television, manufacturer: LG, series: 'webOS TV' } } +- + headers: 'User-Agent: Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/538.2 (KHTML, like Gecko) Large Screen WebAppManager Safari/538.2' + readable: 'a LG webOS TV' + result: { engine: { name: Webkit, version: '538.2' }, os: { name: webOS }, device: { type: television, manufacturer: LG, series: 'webOS TV' } } +- + headers: 'User-Agent: Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.41 (KHTML, like Gecko) Large Screen WebAppManager Safari/537.41' + readable: 'a LG webOS TV' + result: { engine: { name: Webkit, version: '537.41' }, os: { name: webOS }, device: { type: television, manufacturer: LG, series: 'webOS TV' } } diff --git a/tests/data/television/other.yaml b/tests/data/television/other.yaml index f56dae8f7..2e0e5054d 100644 --- a/tests/data/television/other.yaml +++ b/tests/data/television/other.yaml @@ -614,3 +614,7 @@ headers: 'User-Agent: HbbTV/1.1.1 (; ST; FLTk3D; 1.0; 1.0;) NetFront/3.5' readable: 'NetFront 3.5 on a television' result: { browser: { name: NetFront, version: '3.5', type: browser }, engine: { name: NetFront }, device: { type: television } } +- + headers: 'User-Agent: Mozilla/5.0 (compatible; Netbox/3.5 R92; Linux 2.2)' + readable: 'Netbox 3.5 on a television' + result: { browser: { name: Netbox, version: '3.5', type: browser }, device: { type: television } } diff --git a/tests/data/television/roku.yaml b/tests/data/television/roku.yaml index f71f4d8bf..8d28c5855 100644 --- a/tests/data/television/roku.yaml +++ b/tests/data/television/roku.yaml @@ -18,3 +18,19 @@ headers: 'User-Agent: Roku/DVP-5.5 (095.05E02025A)' result: { device: { type: television, manufacturer: Roku, model: 'Streaming Stick' } } readable: 'a Roku Streaming Stick' +- + headers: 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36 Roku/DVP-8.10 (468.10E04145A)' + readable: 'a Roku' + result: { browser: { family: { name: Chrome, version: 70 }, type: browser }, engine: { name: Blink }, device: { type: television, manufacturer: Roku } } +- + headers: 'User-Agent: Roku/DVP-9.10 (519.10E04111A)' + readable: 'a Roku Express' + result: { device: { type: television, manufacturer: Roku, model: Express } } +- + headers: 'User-Agent: Roku4640X/DVP-7.70 (297.70E04154A)' + readable: 'a Roku Ultra' + result: { device: { type: television, manufacturer: Roku, model: Ultra } } +- + headers: 'User-Agent: Roku/DVP-9.30 (309.30E04182A)' + readable: 'a TCL 4K Roku TV' + result: { device: { type: television, manufacturer: TCL, model: '4K Roku TV' } } diff --git a/tests/src/Testrunner.php b/tests/src/Testrunner.php index 21c08e7ce..92a61ddc7 100644 --- a/tests/src/Testrunner.php +++ b/tests/src/Testrunner.php @@ -8,7 +8,9 @@ class Testrunner { public static function compare($files, $skipManufacturers = false) { - @unlink('runner.log'); + if (file_exists('runner.log')) { + @unlink('runner.log'); + } $result = true; diff --git a/tests/src/bootstrap.php b/tests/src/bootstrap.php new file mode 100644 index 000000000..b6129af85 --- /dev/null +++ b/tests/src/bootstrap.php @@ -0,0 +1,11 @@ +setIdentification([ 'manufacturer' => 'Sony', - 'model' => 'Playstation 4', + 'model' => 'PlayStation 4', 'type' => Constants\DeviceType::GAMING, 'subtype' => Constants\DeviceSubType::CONSOLE ]); $this->assertEquals([ 'manufacturer' => 'Sony', - 'model' => 'Playstation 4', + 'model' => 'PlayStation 4', 'type' => Constants\DeviceType::GAMING, 'subtype' => Constants\DeviceSubType::CONSOLE ], $device->toArray()); diff --git a/tests/unit/Model/EngineTest.php b/tests/unit/Model/EngineTest.php index b98e3e182..19f58689e 100644 --- a/tests/unit/Model/EngineTest.php +++ b/tests/unit/Model/EngineTest.php @@ -1,7 +1,7 @@