user_agent_parser 2.5.2 → 2.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of user_agent_parser might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2108d04c3b134892dfe8b64a8d922b43cefce3234b97883229c2f94987231fe9
4
- data.tar.gz: 21ae5ddc52e16c080c20dd7c573f0a0daa46602cdb36ad963f7c408a3122c46d
3
+ metadata.gz: 74b02298a0828b22d71e294ab077e484496ebb8fda03dbf41e3d01db8c2de4ea
4
+ data.tar.gz: 005e91640c3294abd45ab9eb31405bf5a5b245606606712da136d959b112b3d3
5
5
  SHA512:
6
- metadata.gz: fa1854eb92882b92b497775861a4c0063ad644d09f6294e0c629f88eb2bd8dd6e1442140076ed787b7d35f46f7f1c0f13a61df178a6db902b75a5184899166f0
7
- data.tar.gz: 58235ccba086edc533135b48e49c8b9750c0582b94a87570c4b02878e0fddad9ae69e79218faa2df43aa78c06b66fec10eeb55e958f276bb09416b70b29b4243
6
+ metadata.gz: adf323d558143989636c1635dd97b0559c455aa339a68ca230212be2c34672cc951234fa6db8d2e5d684ab23fe8b04a1927de872da7194219324ad482f325812
7
+ data.tar.gz: a4fa3dd7b32670821dfb547f217951ba2e6ecc639327e24e19f805c258881ec55bc681834d42e43b09ab789bd9d5614065ae7eba0501cdcaca1133a87d56602d
@@ -2,12 +2,14 @@
2
2
 
3
3
  module UserAgentParser
4
4
  class Device
5
+ DEFAULT_FAMILY = 'Other'
6
+
5
7
  attr_reader :family, :model, :brand
6
8
 
7
9
  alias name family
8
10
 
9
11
  def initialize(family = nil, model = nil, brand = nil)
10
- @family = family || 'Other'
12
+ @family = family || DEFAULT_FAMILY
11
13
  @model = model || @family
12
14
  @brand = brand
13
15
  end
@@ -2,11 +2,13 @@
2
2
 
3
3
  module UserAgentParser
4
4
  class OperatingSystem
5
+ DEFAULT_FAMILY = 'Other'
6
+
5
7
  attr_reader :family, :version
6
8
 
7
9
  alias name family
8
10
 
9
- def initialize(family = 'Other', version = nil)
11
+ def initialize(family = DEFAULT_FAMILY, version = nil)
10
12
  @family = family
11
13
  @version = version
12
14
  end
@@ -2,12 +2,14 @@
2
2
 
3
3
  module UserAgentParser
4
4
  class UserAgent
5
+ DEFAULT_FAMILY = 'Other'
6
+
5
7
  attr_reader :family, :version, :os, :device
6
8
 
7
9
  alias name family
8
10
 
9
11
  def initialize(family = nil, version = nil, os = nil, device = nil)
10
- @family = family || 'Other'
12
+ @family = family || DEFAULT_FAMILY
11
13
  @version = version
12
14
  @os = os
13
15
  @device = device
@@ -2,6 +2,7 @@ user_agent_parsers:
2
2
  #### SPECIAL CASES TOP ####
3
3
 
4
4
  # CFNetwork Podcast catcher Applications
5
+ - regex: '^(Luminary)[Stage]+/(\d+) CFNetwork'
5
6
  - regex: '(ESPN)[%20| ]+Radio/(\d+)\.(\d+)\.(\d+) CFNetwork'
6
7
  - regex: '(Antenna)/(\d+) CFNetwork'
7
8
  family_replacement: 'AntennaPod'
@@ -12,6 +13,7 @@ user_agent_parsers:
12
13
  - regex: '^(.*)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
13
14
 
14
15
  # Podcast catchers
16
+ - regex: '^(Luminary)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
15
17
  - regex: '(espn\.go)'
16
18
  family_replacement: 'ESPN'
17
19
  - regex: '(espnradio\.com)'
@@ -48,6 +50,10 @@ user_agent_parsers:
48
50
  - regex: '(Tableau)/(\d+)\.(\d+)'
49
51
  family_replacement: 'Tableau'
50
52
 
53
+ # Adobe CreativeCloud
54
+ - regex: 'AppleWebKit/\d+\.\d+.* Safari.* (CreativeCloud)/(\d+)\.(\d+).(\d+)'
55
+ family_replacement: 'Adobe CreativeCloud'
56
+
51
57
  # Salesforce
52
58
  - regex: '(Salesforce)(?:.)\/(\d+)\.(\d?)'
53
59
 
@@ -73,12 +79,12 @@ user_agent_parsers:
73
79
 
74
80
  # Twitter
75
81
  - regex: '(Twitterbot)/(\d+)\.(\d+)'
76
- family_replacement: 'TwitterBot'
82
+ family_replacement: 'Twitterbot'
77
83
 
78
- # Bots Pattern '/name-0.0'
84
+ # Bots Pattern 'name/0.0.0'
79
85
  - regex: '/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \-](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
80
- # Bots Pattern 'name/0.0'
81
- - regex: '\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
86
+ # Bots Pattern 'name/0.0.0'
87
+ - regex: '\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|OgScrper|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
82
88
 
83
89
  # MSIECrawler
84
90
  - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.* MSIECrawler'
@@ -88,18 +94,18 @@ user_agent_parsers:
88
94
  - regex: '(DAVdroid)/(\d+)\.(\d+)(?:\.(\d+)|)'
89
95
 
90
96
  # Downloader ...
91
- - regex: '(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
97
+ - regex: '(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest|axios|unirest-(?:java|python|ruby|nodejs|php|net))(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
92
98
 
93
99
  # Pinterestbot
94
100
  - regex: '(Pinterest(?:bot|))/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)[;\s(]+\+https://www.pinterest.com/bot.html'
95
101
  family_replacement: 'Pinterestbot'
96
102
 
97
103
  # Bots
98
- - regex: '(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\/\$BotVersion|123metaspider-Bot|1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\b\w{0,30}favicon\w{0,30}\b|\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|Tiny Tiny RSS|TwitterBot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
104
+ - regex: '(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\/\$BotVersion|123metaspider-Bot|1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\b\w{0,30}favicon\w{0,30}\b|\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|OgScrper|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|Tiny Tiny RSS|Twitterbot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
99
105
 
100
106
  # AWS S3 Clients
101
107
  # must come before "Bots General matcher" to catch "boto"/"boto3" before "bot"
102
- - regex: '\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?))|s3fs)/(\d+)\.(\d+)(?:\.(\d+)|)'
108
+ - regex: '\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?|dotnet-(?:\d{1,2}|core)))|s3fs)/(\d+)\.(\d+)(?:\.(\d+)|)'
103
109
 
104
110
  # Facebook
105
111
  # Must come before "Bots General matcher" to catch OrangeBotswana
@@ -146,6 +152,9 @@ user_agent_parsers:
146
152
  - regex: 'Mozilla.*Mobile.*(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
147
153
  # Snapchat
148
154
  - regex: '(Snapchat)\/(\d+)\.(\d+)\.(\d+)\.(\d+)'
155
+ # Twitter
156
+ - regex: '(Twitter for (?:iPhone|iPad)|TwitterAndroid)(?:\/(\d+)\.(\d+)|)'
157
+ family_replacement: 'Twitter'
149
158
 
150
159
  # Basilisk
151
160
  - regex: '(Firefox)/(\d+)\.(\d+) Basilisk/(\d+)'
@@ -308,6 +317,10 @@ user_agent_parsers:
308
317
  # Edge Mobile
309
318
  - regex: 'Windows Phone .*(Edge)/(\d+)\.(\d+)'
310
319
  family_replacement: 'Edge Mobile'
320
+ - regex: '(EdgA)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
321
+ family_replacement: 'Edge Mobile'
322
+ - regex: '(EdgiOS)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
323
+ family_replacement: 'Edge Mobile'
311
324
 
312
325
  # Samsung Internet (based on Chrome, but lacking some features)
313
326
  - regex: '(SamsungBrowser)/(\d+)\.(\d+)'
@@ -347,9 +360,21 @@ user_agent_parsers:
347
360
  - regex: '(Mint Browser)/(\d+)\.(\d+)\.(\d+)'
348
361
  family_replacement: 'Mint Browser'
349
362
 
363
+ # TopBuzz Android must go before Chrome Mobile WebView
364
+ - regex: '(TopBuzz)/(\d+).(\d+).(\d+)'
365
+ family_replacement: 'TopBuzz'
366
+
350
367
  # Google Search App on Android, eg:
351
368
  - regex: 'Mozilla.+Android.+(GSA)/(\d+)\.(\d+)\.(\d+)'
352
369
  family_replacement: 'Google'
370
+
371
+ # QQ Browsers
372
+ - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
373
+ family_replacement: 'QQ Browser Mini'
374
+ - regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
375
+ family_replacement: 'QQ Browser Mobile'
376
+ - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+)|)|)|)'
377
+ family_replacement: 'QQ Browser'
353
378
 
354
379
  # Chrome Mobile
355
380
  - regex: 'Version/.+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
@@ -377,14 +402,6 @@ user_agent_parsers:
377
402
  - regex: '(SE 2\.X) MetaSr (\d+)\.(\d+)'
378
403
  family_replacement: 'Sogou Explorer'
379
404
 
380
- # QQ Browsers
381
- - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
382
- family_replacement: 'QQ Browser Mini'
383
- - regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
384
- family_replacement: 'QQ Browser Mobile'
385
- - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+)|)|)|)'
386
- family_replacement: 'QQ Browser'
387
-
388
405
  # Rackspace Monitoring
389
406
  - regex: '(Rackspace Monitoring)/(\d+)\.(\d+)'
390
407
  family_replacement: 'RackspaceBot'
@@ -417,6 +434,9 @@ user_agent_parsers:
417
434
  - regex: '(Whale)/(\d+)\.(\d+)\.(\d+)'
418
435
  family_replacement: 'Whale'
419
436
 
437
+ # 1Password
438
+ - regex: '(1Password)/(\d+)\.(\d+)\.(\d+)'
439
+
420
440
  # Ghost
421
441
  # @ref: http://www.ghost.org
422
442
  - regex: '(Ghost)/(\d+)\.(\d+)\.(\d+)'
@@ -454,7 +474,7 @@ user_agent_parsers:
454
474
  v1_replacement: '2013'
455
475
 
456
476
  # Outlook 2016
457
- - regex: 'Microsoft Outlook (?:Mail )?16\.\d+\.\d+'
477
+ - regex: 'Microsoft Outlook (?:Mail )?16\.\d+\.\d+|MSOffice 16'
458
478
  family_replacement: 'Outlook'
459
479
  v1_replacement: '2016'
460
480
 
@@ -484,6 +504,11 @@ user_agent_parsers:
484
504
  - regex: '(Lotus-Notes)/(\d+)\.(\d+)(?:\.(\d+)|)'
485
505
  family_replacement: 'Lotus Notes'
486
506
 
507
+ # Superhuman Mail Client
508
+ # @ref: https://www.superhuman.com
509
+ - regex: 'Superhuman'
510
+ family_replacement: 'Superhuman'
511
+
487
512
  # Vivaldi uses "Vivaldi"
488
513
  - regex: '(Vivaldi)/(\d+)\.(\d+)\.(\d+)'
489
514
 
@@ -657,6 +682,14 @@ user_agent_parsers:
657
682
  - regex: '(BonEcho)/(\d+)\.(\d+)\.?([ab]?\d+|)'
658
683
  family_replacement: 'Bon Echo'
659
684
 
685
+ # topbuzz on IOS
686
+ - regex: '(TopBuzz) com.alex.NewsMaster/(\d+).(\d+).(\d+)'
687
+ family_replacement: 'TopBuzz'
688
+ - regex: '(TopBuzz) com.mobilesrepublic.newsrepublic/(\d+).(\d+).(\d+)'
689
+ family_replacement: 'TopBuzz'
690
+ - regex: '(TopBuzz) com.topbuzz.videoen/(\d+).(\d+).(\d+)'
691
+ family_replacement: 'TopBuzz'
692
+
660
693
  # @note: iOS / OSX Applications
661
694
  - regex: '(iPod|iPhone|iPad).+GSA/(\d+)\.(\d+)\.(\d+) Mobile'
662
695
  family_replacement: 'Google'
@@ -810,13 +843,23 @@ user_agent_parsers:
810
843
  family_replacement: 'Python Requests'
811
844
 
812
845
  # headless user-agents
813
- - regex: '\b(Windows-Update-Agent|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
846
+ - regex: '\b(Windows-Update-Agent|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia|fetch libfetch|akka-http|got)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
847
+
848
+ # Asynchronous HTTP Client/Server for asyncio and Python (https://aiohttp.readthedocs.io/)
849
+ - regex: '(Python/3\.\d{1,3} aiohttp)/(\d+)\.(\d+)\.(\d+)'
850
+ # Asynchronous HTTP Client/Server for asyncio and Python (https://aiohttp.readthedocs.io/)
851
+ - regex: '(Python/3\.\d{1,3} aiohttp)/(\d+)\.(\d+)\.(\d+)'
814
852
 
815
853
  - regex: '(Java)[/ ]{0,1}\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
816
854
 
817
855
  # Cloud Storage Clients
818
856
  - regex: '^(Cyberduck)/(\d+)\.(\d+)\.(\d+)(?:\.\d+|)'
819
857
  - regex: '^(S3 Browser) (\d+)-(\d+)-(\d+)(?:\s*http://s3browser\.com|)'
858
+ - regex: '(S3Gof3r)'
859
+ # IBM COS (Cloud Object Storage) API
860
+ - regex: '\b(ibm-cos-sdk-(?:core|java|js|python))/(\d+)\.(\d+)(?:\.(\d+)|)'
861
+ # rusoto - Rusoto - AWS SDK for Rust - https://github.com/rusoto/rusoto
862
+ - regex: '^(rusoto)/(\d+)\.(\d+)\.(\d+)'
820
863
  # rclone - rsync for cloud storage - https://rclone.org/
821
864
  - regex: '^(rclone)/v(\d+)\.(\d+)'
822
865
 
@@ -932,6 +975,9 @@ os_parsers:
932
975
  - regex: '(Android) Honeycomb'
933
976
  os_v1_replacement: '3'
934
977
 
978
+ # Android 9; Android 10;
979
+ - regex: '(Android) (\d+);'
980
+
935
981
  # UCWEB
936
982
  - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+)|);'
937
983
  os_replacement: 'Android'
@@ -1385,6 +1431,12 @@ os_parsers:
1385
1431
  - regex: '(Black[Bb]erry)'
1386
1432
  os_replacement: 'BlackBerry OS'
1387
1433
 
1434
+ ##########
1435
+ # KaiOS
1436
+ ##########
1437
+ - regex: '(K[Aa][Ii]OS)\/(\d+)\.(\d+)(?:\.(\d+)|)'
1438
+ os_replacement: 'KaiOS'
1439
+
1388
1440
  ##########
1389
1441
  # Firefox OS
1390
1442
  ##########
@@ -1487,6 +1539,8 @@ os_parsers:
1487
1539
  os_replacement: 'Red Hat'
1488
1540
  - regex: '\((freebsd)(\d+)\.(\d+)\)'
1489
1541
  os_replacement: 'FreeBSD'
1542
+ - regex: 'linux'
1543
+ os_replacement: 'Linux'
1490
1544
 
1491
1545
  # Roku Digital-Video-Players https://www.roku.com/
1492
1546
  - regex: '^(Roku)/DVP-(\d+)\.(\d+)'
@@ -1552,11 +1606,11 @@ device_parsers:
1552
1606
  # 3Q
1553
1607
  # @ref: http://www.3q-int.com/
1554
1608
  #########
1555
- - regex: '; *([BLRQ]C\d{4}[A-Z]+) +Build/'
1609
+ - regex: '; *([BLRQ]C\d{4}[A-Z]+?)(?: Build|\) AppleWebKit)'
1556
1610
  device_replacement: '3Q $1'
1557
1611
  brand_replacement: '3Q'
1558
1612
  model_replacement: '$1'
1559
- - regex: '; *(?:3Q_)([^;/]+) +Build'
1613
+ - regex: '; *(?:3Q_)([^;/]+?)(?: Build|\) AppleWebKit)'
1560
1614
  device_replacement: '3Q $1'
1561
1615
  brand_replacement: '3Q'
1562
1616
  model_replacement: '$1'
@@ -1565,19 +1619,19 @@ device_parsers:
1565
1619
  # Acer
1566
1620
  # @ref: http://us.acer.com/ac/en/US/content/group/tablets
1567
1621
  #########
1568
- - regex: 'Android [34].*; *(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G|)|A701|B1-A71|A1-\d{3}|B1-\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]+) Build'
1622
+ - regex: 'Android [34].*; *(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G|)|A701|B1-A71|A1-\d{3}|B1-\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]+?)(?: Build|\) AppleWebKit)'
1569
1623
  device_replacement: '$1'
1570
1624
  brand_replacement: 'Acer'
1571
1625
  model_replacement: '$1'
1572
- - regex: '; *Acer Iconia Tab ([^;/]+) Build'
1626
+ - regex: '; *Acer Iconia Tab ([^;/]+?)(?: Build|\) AppleWebKit)'
1573
1627
  device_replacement: '$1'
1574
1628
  brand_replacement: 'Acer'
1575
1629
  model_replacement: '$1'
1576
- - regex: '; *(Z1[1235]0|E320[^/]*|S500|S510|Liquid[^;/]*|Iconia A\d+) Build'
1630
+ - regex: '; *(Z1[1235]0|E320[^/]*|S500|S510|Liquid[^;/]*|Iconia A\d+)(?: Build|\) AppleWebKit)'
1577
1631
  device_replacement: '$1'
1578
1632
  brand_replacement: 'Acer'
1579
1633
  model_replacement: '$1'
1580
- - regex: '; *(Acer |ACER )([^;/]+) Build'
1634
+ - regex: '; *(Acer |ACER )([^;/]+?)(?: Build|\) AppleWebKit)'
1581
1635
  device_replacement: '$1$2'
1582
1636
  brand_replacement: 'Acer'
1583
1637
  model_replacement: '$2'
@@ -1588,7 +1642,7 @@ device_parsers:
1588
1642
  # @note: VegaBean and VegaComb (names derived from jellybean, honeycomb) are
1589
1643
  # custom ROM builds for Vega
1590
1644
  #########
1591
- - regex: '; *(Advent |)(Vega(?:Bean|Comb|)).* Build'
1645
+ - regex: '; *(Advent |)(Vega(?:Bean|Comb|)).*?(?: Build|\) AppleWebKit)'
1592
1646
  device_replacement: '$1$2'
1593
1647
  brand_replacement: 'Advent'
1594
1648
  model_replacement: '$2'
@@ -1597,7 +1651,7 @@ device_parsers:
1597
1651
  # Ainol
1598
1652
  # @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product
1599
1653
  #########
1600
- - regex: '; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+) Build'
1654
+ - regex: '; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+?)(?: Build|\) AppleWebKit)'
1601
1655
  device_replacement: '$1$2'
1602
1656
  brand_replacement: 'Ainol'
1603
1657
  model_replacement: '$2'
@@ -1611,7 +1665,7 @@ device_parsers:
1611
1665
  device_replacement: '$1'
1612
1666
  brand_replacement: 'Airis'
1613
1667
  model_replacement: '$1'
1614
- - regex: '; *(OnePAD[^;/]+) Build'
1668
+ - regex: '; *(OnePAD[^;/]+?)(?: Build|\) AppleWebKit)'
1615
1669
  regex_flag: 'i'
1616
1670
  device_replacement: '$1'
1617
1671
  brand_replacement: 'Airis'
@@ -1621,7 +1675,7 @@ device_parsers:
1621
1675
  # Airpad
1622
1676
  # @ref: ??
1623
1677
  #########
1624
- - regex: '; *Airpad[ \-]([^;/]+) Build'
1678
+ - regex: '; *Airpad[ \-]([^;/]+?)(?: Build|\) AppleWebKit)'
1625
1679
  device_replacement: 'Airpad $1'
1626
1680
  brand_replacement: 'Airpad'
1627
1681
  model_replacement: '$1'
@@ -1630,29 +1684,29 @@ device_parsers:
1630
1684
  # Alcatel - TCT
1631
1685
  # @ref: http://www.alcatelonetouch.com/global-en/products/smartphones.html
1632
1686
  #########
1633
- - regex: '; *(one ?touch) (EVO7|T10|T20) Build'
1687
+ - regex: '; *(one ?touch) (EVO7|T10|T20)(?: Build|\) AppleWebKit)'
1634
1688
  device_replacement: 'Alcatel One Touch $2'
1635
1689
  brand_replacement: 'Alcatel'
1636
1690
  model_replacement: 'One Touch $2'
1637
- - regex: '; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+);? Build'
1691
+ - regex: '; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+?)(?: Build|\) AppleWebKit)'
1638
1692
  regex_flag: 'i'
1639
1693
  device_replacement: 'Alcatel One Touch $1'
1640
1694
  brand_replacement: 'Alcatel'
1641
1695
  model_replacement: 'One Touch $1'
1642
- - regex: '; *(TCL)[ _]([^;/]+) Build'
1696
+ - regex: '; *(TCL)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
1643
1697
  device_replacement: '$1 $2'
1644
1698
  brand_replacement: '$1'
1645
1699
  model_replacement: '$2'
1646
1700
  # operator specific models
1647
- - regex: '; *(Vodafone Smart II|Optimus_Madrid) Build'
1701
+ - regex: '; *(Vodafone Smart II|Optimus_Madrid)(?: Build|\) AppleWebKit)'
1648
1702
  device_replacement: 'Alcatel $1'
1649
1703
  brand_replacement: 'Alcatel'
1650
1704
  model_replacement: '$1'
1651
- - regex: '; *BASE_Lutea_3 Build'
1705
+ - regex: '; *BASE_Lutea_3(?: Build|\) AppleWebKit)'
1652
1706
  device_replacement: 'Alcatel One Touch 998'
1653
1707
  brand_replacement: 'Alcatel'
1654
1708
  model_replacement: 'One Touch 998'
1655
- - regex: '; *BASE_Varia Build'
1709
+ - regex: '; *BASE_Varia(?: Build|\) AppleWebKit)'
1656
1710
  device_replacement: 'Alcatel One Touch 918D'
1657
1711
  brand_replacement: 'Alcatel'
1658
1712
  model_replacement: 'One Touch 918D'
@@ -1661,7 +1715,7 @@ device_parsers:
1661
1715
  # Allfine
1662
1716
  # @ref: http://www.myallfine.com/Products.asp
1663
1717
  #########
1664
- - regex: '; *((?:FINE|Fine)\d[^;/]+) Build'
1718
+ - regex: '; *((?:FINE|Fine)\d[^;/]+?)(?: Build|\) AppleWebKit)'
1665
1719
  device_replacement: '$1'
1666
1720
  brand_replacement: 'Allfine'
1667
1721
  model_replacement: '$1'
@@ -1670,15 +1724,15 @@ device_parsers:
1670
1724
  # Allview
1671
1725
  # @ref: http://www.allview.ro/produse/droseries/lista-tablete-pc/
1672
1726
  #########
1673
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).*) Build/'
1727
+ - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).*?)(?: Build|\) AppleWebKit)'
1674
1728
  device_replacement: '$1$2'
1675
1729
  brand_replacement: 'Allview'
1676
1730
  model_replacement: '$2'
1677
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy) Build'
1731
+ - regex: '; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\) AppleWebKit)'
1678
1732
  device_replacement: '$1$2'
1679
1733
  brand_replacement: 'Allview'
1680
1734
  model_replacement: '$2'
1681
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)([^;/]*) Build'
1735
+ - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\) AppleWebKit)'
1682
1736
  device_replacement: '$1$2'
1683
1737
  brand_replacement: 'Allview'
1684
1738
  model_replacement: '$2'
@@ -1688,11 +1742,11 @@ device_parsers:
1688
1742
  # @ref: http://www.allwinner.com/
1689
1743
  # @models: A31 (13.3"),A20,A10,
1690
1744
  #########
1691
- - regex: '; *(A13-MID) Build'
1745
+ - regex: '; *(A13-MID)(?: Build|\) AppleWebKit)'
1692
1746
  device_replacement: '$1'
1693
1747
  brand_replacement: 'Allwinner'
1694
1748
  model_replacement: '$1'
1695
- - regex: '; *(Allwinner)[ _\-]?([^;/]+) Build'
1749
+ - regex: '; *(Allwinner)[ _\-]?([^;/]+?)(?: Build|\) AppleWebKit)'
1696
1750
  device_replacement: '$1 $2'
1697
1751
  brand_replacement: 'Allwinner'
1698
1752
  model_replacement: '$1'
@@ -1701,7 +1755,7 @@ device_parsers:
1701
1755
  # Amaway
1702
1756
  # @ref: http://www.amaway.cn/
1703
1757
  #########
1704
- - regex: '; *(A651|A701B?|A702|A703|A705|A706|A707|A711|A712|A713|A717|A722|A785|A801|A802|A803|A901|A902|A1002|A1003|A1006|A1007|A9701|A9703|Q710|Q80) Build'
1758
+ - regex: '; *(A651|A701B?|A702|A703|A705|A706|A707|A711|A712|A713|A717|A722|A785|A801|A802|A803|A901|A902|A1002|A1003|A1006|A1007|A9701|A9703|Q710|Q80)(?: Build|\) AppleWebKit)'
1705
1759
  device_replacement: '$1'
1706
1760
  brand_replacement: 'Amaway'
1707
1761
  model_replacement: '$1'
@@ -1710,11 +1764,11 @@ device_parsers:
1710
1764
  # Amoi
1711
1765
  # @ref: http://www.amoi.com/en/prd/prd_index.jspx
1712
1766
  #########
1713
- - regex: '; *(?:AMOI|Amoi)[ _]([^;/]+) Build'
1767
+ - regex: '; *(?:AMOI|Amoi)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
1714
1768
  device_replacement: 'Amoi $1'
1715
1769
  brand_replacement: 'Amoi'
1716
1770
  model_replacement: '$1'
1717
- - regex: '^(?:AMOI|Amoi)[ _]([^;/]+) Linux'
1771
+ - regex: '^(?:AMOI|Amoi)[ _]([^;/]+?) Linux'
1718
1772
  device_replacement: 'Amoi $1'
1719
1773
  brand_replacement: 'Amoi'
1720
1774
  model_replacement: '$1'
@@ -1723,7 +1777,7 @@ device_parsers:
1723
1777
  # Aoc
1724
1778
  # @ref: http://latin.aoc.com/media_tablet
1725
1779
  #########
1726
- - regex: '; *(MW(?:0[789]|10)[^;/]+) Build'
1780
+ - regex: '; *(MW(?:0[789]|10)[^;/]+?)(?: Build|\) AppleWebKit)'
1727
1781
  device_replacement: '$1'
1728
1782
  brand_replacement: 'Aoc'
1729
1783
  model_replacement: '$1'
@@ -1734,11 +1788,11 @@ device_parsers:
1734
1788
  # @ref: http://www.luckystar.com.cn/en/mobiletel.aspx?page=1
1735
1789
  # @note: brand owned by luckystar
1736
1790
  #########
1737
- - regex: '; *(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T|)|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D) Build'
1791
+ - regex: '; *(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T|)|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D)(?: Build|\) AppleWebKit)'
1738
1792
  device_replacement: 'Aoson $1'
1739
1793
  brand_replacement: 'Aoson'
1740
1794
  model_replacement: '$1'
1741
- - regex: '; *Aoson ([^;/]+) Build'
1795
+ - regex: '; *Aoson ([^;/]+?)(?: Build|\) AppleWebKit)'
1742
1796
  regex_flag: 'i'
1743
1797
  device_replacement: 'Aoson $1'
1744
1798
  brand_replacement: 'Aoson'
@@ -1748,7 +1802,7 @@ device_parsers:
1748
1802
  # Apanda
1749
1803
  # @ref: http://www.apanda.com.cn/
1750
1804
  #########
1751
- - regex: '; *[Aa]panda[ _\-]([^;/]+) Build'
1805
+ - regex: '; *[Aa]panda[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
1752
1806
  device_replacement: 'Apanda $1'
1753
1807
  brand_replacement: 'Apanda'
1754
1808
  model_replacement: '$1'
@@ -1758,7 +1812,7 @@ device_parsers:
1758
1812
  # @ref: http://www.archos.com/de/products/tablets.html
1759
1813
  # @ref: http://www.archos.com/de/products/smartphones/index.html
1760
1814
  #########
1761
- - regex: '; *(?:ARCHOS|Archos) ?(GAMEPAD.*?)(?: Build|[;/\(\)\-])'
1815
+ - regex: '; *(?:ARCHOS|Archos) ?(GAMEPAD.*?)(?: Build|\) AppleWebKit)'
1762
1816
  device_replacement: 'Archos $1'
1763
1817
  brand_replacement: 'Archos'
1764
1818
  model_replacement: '$1'
@@ -1770,11 +1824,11 @@ device_parsers:
1770
1824
  device_replacement: 'Archos $1'
1771
1825
  brand_replacement: 'Archos'
1772
1826
  model_replacement: '$1'
1773
- - regex: '; *(AN(?:7|8|9|10|13)[A-Z0-9]{1,4}) Build'
1827
+ - regex: '; *(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\) AppleWebKit)'
1774
1828
  device_replacement: 'Archos $1'
1775
1829
  brand_replacement: 'Archos'
1776
1830
  model_replacement: '$1'
1777
- - regex: '; *(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9) Build'
1831
+ - regex: '; *(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\) AppleWebKit)'
1778
1832
  device_replacement: 'Archos $1'
1779
1833
  brand_replacement: 'Archos'
1780
1834
  model_replacement: '$1'
@@ -1783,11 +1837,11 @@ device_parsers:
1783
1837
  # A-rival
1784
1838
  # @ref: http://www.a-rival.de/de/
1785
1839
  #########
1786
- - regex: '; *(PAD-FMD[^;/]+) Build'
1840
+ - regex: '; *(PAD-FMD[^;/]+?)(?: Build|\) AppleWebKit)'
1787
1841
  device_replacement: '$1'
1788
1842
  brand_replacement: 'Arival'
1789
1843
  model_replacement: '$1'
1790
- - regex: '; *(BioniQ) ?([^;/]+) Build'
1844
+ - regex: '; *(BioniQ) ?([^;/]+?)(?: Build|\) AppleWebKit)'
1791
1845
  device_replacement: '$1 $2'
1792
1846
  brand_replacement: 'Arival'
1793
1847
  model_replacement: '$1 $2'
@@ -1796,11 +1850,11 @@ device_parsers:
1796
1850
  # Arnova
1797
1851
  # @ref: http://arnovatech.com/
1798
1852
  #########
1799
- - regex: '; *(AN\d[^;/]+|ARCHM\d+) Build'
1853
+ - regex: '; *(AN\d[^;/]+|ARCHM\d+)(?: Build|\) AppleWebKit)'
1800
1854
  device_replacement: 'Arnova $1'
1801
1855
  brand_replacement: 'Arnova'
1802
1856
  model_replacement: '$1'
1803
- - regex: '; *(?:ARNOVA|Arnova) ?([^;/]+) Build'
1857
+ - regex: '; *(?:ARNOVA|Arnova) ?([^;/]+?)(?: Build|\) AppleWebKit)'
1804
1858
  device_replacement: 'Arnova $1'
1805
1859
  brand_replacement: 'Arnova'
1806
1860
  model_replacement: '$1'
@@ -1809,7 +1863,7 @@ device_parsers:
1809
1863
  # Assistant
1810
1864
  # @ref: http://www.assistant.ua
1811
1865
  #########
1812
- - regex: '; *(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104) Build'
1866
+ - regex: '; *(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104)(?: Build|\) AppleWebKit)'
1813
1867
  device_replacement: 'Assistant $1-$2'
1814
1868
  brand_replacement: 'Assistant'
1815
1869
  model_replacement: '$1-$2'
@@ -1818,11 +1872,11 @@ device_parsers:
1818
1872
  # Asus
1819
1873
  # @ref: http://www.asus.com/uk/Tablets_Mobile/
1820
1874
  #########
1821
- - regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc) Build'
1875
+ - regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc)(?: Build|\) AppleWebKit)'
1822
1876
  device_replacement: 'Asus $1'
1823
1877
  brand_replacement: 'Asus'
1824
1878
  model_replacement: '$1'
1825
- - regex: '; *ASUS[ _]*([^;/]+) Build'
1879
+ - regex: '; *ASUS[ _]*([^;/]+?)(?: Build|\) AppleWebKit)'
1826
1880
  device_replacement: 'Asus $1'
1827
1881
  brand_replacement: 'Asus'
1828
1882
  model_replacement: '$1'
@@ -1830,11 +1884,11 @@ device_parsers:
1830
1884
  #########
1831
1885
  # Garmin-Asus
1832
1886
  #########
1833
- - regex: '; *Garmin-Asus ([^;/]+) Build'
1887
+ - regex: '; *Garmin-Asus ([^;/]+?)(?: Build|\) AppleWebKit)'
1834
1888
  device_replacement: 'Garmin-Asus $1'
1835
1889
  brand_replacement: 'Garmin-Asus'
1836
1890
  model_replacement: '$1'
1837
- - regex: '; *(Garminfone) Build'
1891
+ - regex: '; *(Garminfone)(?: Build|\) AppleWebKit)'
1838
1892
  device_replacement: 'Garmin $1'
1839
1893
  brand_replacement: 'Garmin-Asus'
1840
1894
  model_replacement: '$1'
@@ -1843,7 +1897,7 @@ device_parsers:
1843
1897
  # Attab
1844
1898
  # @ref: http://www.theattab.com/
1845
1899
  #########
1846
- - regex: '; (@TAB-[^;/]+) Build'
1900
+ - regex: '; (@TAB-[^;/]+?)(?: Build|\) AppleWebKit)'
1847
1901
  device_replacement: '$1'
1848
1902
  brand_replacement: 'Attab'
1849
1903
  model_replacement: '$1'
@@ -1853,7 +1907,7 @@ device_parsers:
1853
1907
  # @ref: ??
1854
1908
  # @note: Take care with Docomo T-01 Toshiba
1855
1909
  #########
1856
- - regex: '; *(T-(?:07|[^0]\d)[^;/]+) Build'
1910
+ - regex: '; *(T-(?:07|[^0]\d)[^;/]+?)(?: Build|\) AppleWebKit)'
1857
1911
  device_replacement: '$1'
1858
1912
  brand_replacement: 'Audiosonic'
1859
1913
  model_replacement: '$1'
@@ -1862,7 +1916,7 @@ device_parsers:
1862
1916
  # Axioo
1863
1917
  # @ref: http://www.axiooworld.com/ww/index.php
1864
1918
  #########
1865
- - regex: '; *(?:Axioo[ _\-]([^;/]+)|(picopad)[ _\-]([^;/]+)) Build'
1919
+ - regex: '; *(?:Axioo[ _\-]([^;/]+?)|(picopad)[ _\-]([^;/]+?))(?: Build|\) AppleWebKit)'
1866
1920
  regex_flag: 'i'
1867
1921
  device_replacement: 'Axioo $1$2 $3'
1868
1922
  brand_replacement: 'Axioo'
@@ -1872,7 +1926,7 @@ device_parsers:
1872
1926
  # Azend
1873
1927
  # @ref: http://azendcorp.com/index.php/products/portable-electronics
1874
1928
  #########
1875
- - regex: '; *(V(?:100|700|800)[^;/]*) Build'
1929
+ - regex: '; *(V(?:100|700|800)[^;/]*)(?: Build|\) AppleWebKit)'
1876
1930
  device_replacement: '$1'
1877
1931
  brand_replacement: 'Azend'
1878
1932
  model_replacement: '$1'
@@ -1881,7 +1935,7 @@ device_parsers:
1881
1935
  # Bak
1882
1936
  # @ref: http://www.bakinternational.com/produtos.php?cat=80
1883
1937
  #########
1884
- - regex: '; *(IBAK\-[^;/]*) Build'
1938
+ - regex: '; *(IBAK\-[^;/]*)(?: Build|\) AppleWebKit)'
1885
1939
  regex_flag: 'i'
1886
1940
  device_replacement: '$1'
1887
1941
  brand_replacement: 'Bak'
@@ -1892,7 +1946,7 @@ device_parsers:
1892
1946
  # @ref: http://www.bedove.com/product.html
1893
1947
  # @models: HY6501|HY5001|X12|X21|I5
1894
1948
  #########
1895
- - regex: '; *(HY5001|HY6501|X12|X21|I5) Build'
1949
+ - regex: '; *(HY5001|HY6501|X12|X21|I5)(?: Build|\) AppleWebKit)'
1896
1950
  device_replacement: 'Bedove $1'
1897
1951
  brand_replacement: 'Bedove'
1898
1952
  model_replacement: '$1'
@@ -1901,7 +1955,7 @@ device_parsers:
1901
1955
  # Benss
1902
1956
  # @ref: http://www.benss.net/
1903
1957
  #########
1904
- - regex: '; *(JC-[^;/]*) Build'
1958
+ - regex: '; *(JC-[^;/]*)(?: Build|\) AppleWebKit)'
1905
1959
  device_replacement: 'Benss $1'
1906
1960
  brand_replacement: 'Benss'
1907
1961
  model_replacement: '$1'
@@ -1911,7 +1965,7 @@ device_parsers:
1911
1965
  # @ref: http://uk.blackberry.com/
1912
1966
  # @note: Android Apps seams to be used here
1913
1967
  #########
1914
- - regex: '; *(BB) ([^;/]+) Build'
1968
+ - regex: '; *(BB) ([^;/]+?)(?: Build|\) AppleWebKit)'
1915
1969
  device_replacement: '$1 $2'
1916
1970
  brand_replacement: 'Blackberry'
1917
1971
  model_replacement: '$2'
@@ -1920,11 +1974,11 @@ device_parsers:
1920
1974
  # Blackbird
1921
1975
  # @ref: http://iblackbird.co.kr
1922
1976
  #########
1923
- - regex: '; *(BlackBird)[ _](I8.*) Build'
1977
+ - regex: '; *(BlackBird)[ _](I8.*?)(?: Build|\) AppleWebKit)'
1924
1978
  device_replacement: '$1 $2'
1925
1979
  brand_replacement: '$1'
1926
1980
  model_replacement: '$2'
1927
- - regex: '; *(BlackBird)[ _](.*) Build'
1981
+ - regex: '; *(BlackBird)[ _](.*?)(?: Build|\) AppleWebKit)'
1928
1982
  device_replacement: '$1 $2'
1929
1983
  brand_replacement: '$1'
1930
1984
  model_replacement: '$2'
@@ -1934,7 +1988,7 @@ device_parsers:
1934
1988
  # @ref: http://www.blaupunkt.com
1935
1989
  #########
1936
1990
  # Endeavour
1937
- - regex: '; *([0-9]+BP[EM][^;/]*|Endeavour[^;/]+) Build'
1991
+ - regex: '; *([0-9]+BP[EM][^;/]*|Endeavour[^;/]+?)(?: Build|\) AppleWebKit)'
1938
1992
  device_replacement: 'Blaupunkt $1'
1939
1993
  brand_replacement: 'Blaupunkt'
1940
1994
  model_replacement: '$1'
@@ -1943,12 +1997,12 @@ device_parsers:
1943
1997
  # Blu
1944
1998
  # @ref: http://bluproducts.com
1945
1999
  #########
1946
- - regex: '; *((?:BLU|Blu)[ _\-])([^;/]+) Build'
2000
+ - regex: '; *((?:BLU|Blu)[ _\-])([^;/]+?)(?: Build|\) AppleWebKit)'
1947
2001
  device_replacement: '$1$2'
1948
2002
  brand_replacement: 'Blu'
1949
2003
  model_replacement: '$2'
1950
2004
  # BMOBILE = operator branded device
1951
- - regex: '; *(?:BMOBILE )?(Blu|BLU|DASH [^;/]+|VIVO 4\.3|TANK 4\.5) Build'
2005
+ - regex: '; *(?:BMOBILE )?(Blu|BLU|DASH [^;/]+|VIVO 4\.3|TANK 4\.5)(?: Build|\) AppleWebKit)'
1952
2006
  device_replacement: '$1'
1953
2007
  brand_replacement: 'Blu'
1954
2008
  model_replacement: '$1'
@@ -1958,7 +2012,7 @@ device_parsers:
1958
2012
  # @ref: http://www.blusens.com/es/?sg=1&sv=al&roc=1
1959
2013
  #########
1960
2014
  # tablet
1961
- - regex: '; *(TOUCH\d[^;/]+) Build'
2015
+ - regex: '; *(TOUCH\d[^;/]+?)(?: Build|\) AppleWebKit)'
1962
2016
  device_replacement: '$1'
1963
2017
  brand_replacement: 'Blusens'
1964
2018
  model_replacement: '$1'
@@ -1969,7 +2023,7 @@ device_parsers:
1969
2023
  # @note: Might collide with Maxx as AX is used also there.
1970
2024
  #########
1971
2025
  # smartphone
1972
- - regex: '; *(AX5\d+) Build'
2026
+ - regex: '; *(AX5\d+)(?: Build|\) AppleWebKit)'
1973
2027
  device_replacement: '$1'
1974
2028
  brand_replacement: 'Bmobile'
1975
2029
  model_replacement: '$1'
@@ -1978,11 +2032,11 @@ device_parsers:
1978
2032
  # bq
1979
2033
  # @ref: http://bqreaders.com
1980
2034
  #########
1981
- - regex: '; *([Bb]q) ([^;/]+);? Build'
2035
+ - regex: '; *([Bb]q) ([^;/]+?);?(?: Build|\) AppleWebKit)'
1982
2036
  device_replacement: '$1 $2'
1983
2037
  brand_replacement: 'bq'
1984
2038
  model_replacement: '$2'
1985
- - regex: '; *(Maxwell [^;/]+) Build'
2039
+ - regex: '; *(Maxwell [^;/]+?)(?: Build|\) AppleWebKit)'
1986
2040
  device_replacement: '$1'
1987
2041
  brand_replacement: 'bq'
1988
2042
  model_replacement: '$1'
@@ -1991,7 +2045,7 @@ device_parsers:
1991
2045
  # Braun Phototechnik
1992
2046
  # @ref: http://www.braun-phototechnik.de/en/products/list/~pcat.250/Tablet-PC.html
1993
2047
  #########
1994
- - regex: '; *((?:B-Tab|B-TAB) ?\d[^;/]+) Build'
2048
+ - regex: '; *((?:B-Tab|B-TAB) ?\d[^;/]+?)(?: Build|\) AppleWebKit)'
1995
2049
  device_replacement: '$1'
1996
2050
  brand_replacement: 'Braun'
1997
2051
  model_replacement: '$1'
@@ -2000,7 +2054,7 @@ device_parsers:
2000
2054
  # Broncho
2001
2055
  # @ref: http://www.broncho.cn/
2002
2056
  #########
2003
- - regex: '; *(Broncho) ([^;/]+) Build'
2057
+ - regex: '; *(Broncho) ([^;/]+?)(?: Build|\) AppleWebKit)'
2004
2058
  device_replacement: '$1 $2'
2005
2059
  brand_replacement: '$1'
2006
2060
  model_replacement: '$2'
@@ -2009,7 +2063,7 @@ device_parsers:
2009
2063
  # Captiva
2010
2064
  # @ref: http://www.captiva-power.de
2011
2065
  #########
2012
- - regex: '; *CAPTIVA ([^;/]+) Build'
2066
+ - regex: '; *CAPTIVA ([^;/]+?)(?: Build|\) AppleWebKit)'
2013
2067
  device_replacement: 'Captiva $1'
2014
2068
  brand_replacement: 'Captiva'
2015
2069
  model_replacement: '$1'
@@ -2018,7 +2072,7 @@ device_parsers:
2018
2072
  # Casio
2019
2073
  # @ref: http://www.casiogzone.com/
2020
2074
  #########
2021
- - regex: '; *(C771|CAL21|IS11CA) Build'
2075
+ - regex: '; *(C771|CAL21|IS11CA)(?: Build|\) AppleWebKit)'
2022
2076
  device_replacement: '$1'
2023
2077
  brand_replacement: 'Casio'
2024
2078
  model_replacement: '$1'
@@ -2027,15 +2081,15 @@ device_parsers:
2027
2081
  # Cat
2028
2082
  # @ref: http://www.cat-sound.com
2029
2083
  #########
2030
- - regex: '; *(?:Cat|CAT) ([^;/]+) Build'
2084
+ - regex: '; *(?:Cat|CAT) ([^;/]+?)(?: Build|\) AppleWebKit)'
2031
2085
  device_replacement: 'Cat $1'
2032
2086
  brand_replacement: 'Cat'
2033
2087
  model_replacement: '$1'
2034
- - regex: '; *(?:Cat)(Nova.*) Build'
2088
+ - regex: '; *(?:Cat)(Nova.*?)(?: Build|\) AppleWebKit)'
2035
2089
  device_replacement: 'Cat $1'
2036
2090
  brand_replacement: 'Cat'
2037
2091
  model_replacement: '$1'
2038
- - regex: '; *(INM8002KP|ADM8000KP_[AB]) Build'
2092
+ - regex: '; *(INM8002KP|ADM8000KP_[AB])(?: Build|\) AppleWebKit)'
2039
2093
  device_replacement: '$1'
2040
2094
  brand_replacement: 'Cat'
2041
2095
  model_replacement: 'Tablet PHOENIX 8.1J0'
@@ -2053,7 +2107,7 @@ device_parsers:
2053
2107
  device_replacement: '$1'
2054
2108
  brand_replacement: 'Celkon'
2055
2109
  model_replacement: '$1'
2056
- - regex: '; *(CT)-?(\d+) Build'
2110
+ - regex: '; *(CT)-?(\d+)(?: Build|\) AppleWebKit)'
2057
2111
  device_replacement: '$1$2'
2058
2112
  brand_replacement: 'Celkon'
2059
2113
  model_replacement: '$1$2'
@@ -2069,7 +2123,7 @@ device_parsers:
2069
2123
  # @brief: China manufacturer makes tablets for different small brands
2070
2124
  # (eg. http://www.zeepad.net/index.html)
2071
2125
  #########
2072
- - regex: '; *(TPC[0-9]{4,5}) Build'
2126
+ - regex: '; *(TPC[0-9]{4,5})(?: Build|\) AppleWebKit)'
2073
2127
  device_replacement: '$1'
2074
2128
  brand_replacement: 'ChangJia'
2075
2129
  model_replacement: '$1'
@@ -2078,15 +2132,15 @@ device_parsers:
2078
2132
  # Cloudfone
2079
2133
  # @ref: http://www.cloudfonemobile.com/
2080
2134
  #########
2081
- - regex: '; *(Cloudfone)[ _](Excite)([^ ][^;/]+) Build'
2135
+ - regex: '; *(Cloudfone)[ _](Excite)([^ ][^;/]+?)(?: Build|\) AppleWebKit)'
2082
2136
  device_replacement: '$1 $2 $3'
2083
2137
  brand_replacement: 'Cloudfone'
2084
2138
  model_replacement: '$1 $2 $3'
2085
- - regex: '; *(Excite|ICE)[ _](\d+[^;/]+) Build'
2139
+ - regex: '; *(Excite|ICE)[ _](\d+[^;/]+?)(?: Build|\) AppleWebKit)'
2086
2140
  device_replacement: 'Cloudfone $1 $2'
2087
2141
  brand_replacement: 'Cloudfone'
2088
2142
  model_replacement: 'Cloudfone $1 $2'
2089
- - regex: '; *(Cloudfone|CloudPad)[ _]([^;/]+) Build'
2143
+ - regex: '; *(Cloudfone|CloudPad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2090
2144
  device_replacement: '$1 $2'
2091
2145
  brand_replacement: 'Cloudfone'
2092
2146
  model_replacement: '$1 $2'
@@ -2095,7 +2149,7 @@ device_parsers:
2095
2149
  # Cmx
2096
2150
  # @ref: http://cmx.at/de/
2097
2151
  #########
2098
- - regex: '; *((?:Aquila|Clanga|Rapax)[^;/]+) Build'
2152
+ - regex: '; *((?:Aquila|Clanga|Rapax)[^;/]+?)(?: Build|\) AppleWebKit)'
2099
2153
  regex_flag: 'i'
2100
2154
  device_replacement: '$1'
2101
2155
  brand_replacement: 'Cmx'
@@ -2115,7 +2169,7 @@ device_parsers:
2115
2169
  # Coolpad
2116
2170
  # @ref: ??
2117
2171
  #########
2118
- - regex: '; *([^;/]*)Coolpad[ _]([^;/]+) Build'
2172
+ - regex: '; *([^;/]*)Coolpad[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2119
2173
  device_replacement: '$1$2'
2120
2174
  brand_replacement: 'Coolpad'
2121
2175
  model_replacement: '$1$2'
@@ -2124,7 +2178,7 @@ device_parsers:
2124
2178
  # Cube
2125
2179
  # @ref: http://www.cube-tablet.com/buy-products.html
2126
2180
  #########
2127
- - regex: '; *(CUBE[ _])?([KU][0-9]+ ?GT.*|A5300) Build'
2181
+ - regex: '; *(CUBE[ _])?([KU][0-9]+ ?GT.*?|A5300)(?: Build|\) AppleWebKit)'
2128
2182
  regex_flag: 'i'
2129
2183
  device_replacement: '$1$2'
2130
2184
  brand_replacement: 'Cube'
@@ -2134,12 +2188,12 @@ device_parsers:
2134
2188
  # Cubot
2135
2189
  # @ref: http://www.cubotmall.com/
2136
2190
  #########
2137
- - regex: '; *CUBOT ([^;/]+) Build'
2191
+ - regex: '; *CUBOT ([^;/]+?)(?: Build|\) AppleWebKit)'
2138
2192
  regex_flag: 'i'
2139
2193
  device_replacement: '$1'
2140
2194
  brand_replacement: 'Cubot'
2141
2195
  model_replacement: '$1'
2142
- - regex: '; *(BOBBY) Build'
2196
+ - regex: '; *(BOBBY)(?: Build|\) AppleWebKit)'
2143
2197
  regex_flag: 'i'
2144
2198
  device_replacement: '$1'
2145
2199
  brand_replacement: 'Cubot'
@@ -2149,7 +2203,7 @@ device_parsers:
2149
2203
  # Danew
2150
2204
  # @ref: http://www.danew.com/produits-tablette.php
2151
2205
  #########
2152
- - regex: '; *(Dslide [^;/]+) Build'
2206
+ - regex: '; *(Dslide [^;/]+?)(?: Build|\) AppleWebKit)'
2153
2207
  device_replacement: '$1'
2154
2208
  brand_replacement: 'Danew'
2155
2209
  model_replacement: '$1'
@@ -2163,39 +2217,39 @@ device_parsers:
2163
2217
  # @ref: http://www.dell.com/in/p/mobile-xcd28/pd
2164
2218
  # @ref: http://www.dell.com/in/p/mobile-xcd35/pd
2165
2219
  #########
2166
- - regex: '; *(XCD)[ _]?(28|35) Build'
2220
+ - regex: '; *(XCD)[ _]?(28|35)(?: Build|\) AppleWebKit)'
2167
2221
  device_replacement: 'Dell $1$2'
2168
2222
  brand_replacement: 'Dell'
2169
2223
  model_replacement: '$1$2'
2170
- - regex: '; *(001DL) Build'
2224
+ - regex: '; *(001DL)(?: Build|\) AppleWebKit)'
2171
2225
  device_replacement: 'Dell $1'
2172
2226
  brand_replacement: 'Dell'
2173
2227
  model_replacement: 'Streak'
2174
- - regex: '; *(?:Dell|DELL) (Streak) Build'
2228
+ - regex: '; *(?:Dell|DELL) (Streak)(?: Build|\) AppleWebKit)'
2175
2229
  device_replacement: 'Dell $1'
2176
2230
  brand_replacement: 'Dell'
2177
2231
  model_replacement: 'Streak'
2178
- - regex: '; *(101DL|GS01|Streak Pro[^;/]*) Build'
2232
+ - regex: '; *(101DL|GS01|Streak Pro[^;/]*)(?: Build|\) AppleWebKit)'
2179
2233
  device_replacement: 'Dell $1'
2180
2234
  brand_replacement: 'Dell'
2181
2235
  model_replacement: 'Streak Pro'
2182
- - regex: '; *([Ss]treak ?7) Build'
2236
+ - regex: '; *([Ss]treak ?7)(?: Build|\) AppleWebKit)'
2183
2237
  device_replacement: 'Dell $1'
2184
2238
  brand_replacement: 'Dell'
2185
2239
  model_replacement: 'Streak 7'
2186
- - regex: '; *(Mini-3iX) Build'
2240
+ - regex: '; *(Mini-3iX)(?: Build|\) AppleWebKit)'
2187
2241
  device_replacement: 'Dell $1'
2188
2242
  brand_replacement: 'Dell'
2189
2243
  model_replacement: '$1'
2190
- - regex: '; *(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.*|Streak[ _]Pro) Build'
2244
+ - regex: '; *(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.*?|Streak[ _]Pro)(?: Build|\) AppleWebKit)'
2191
2245
  device_replacement: 'Dell $1'
2192
2246
  brand_replacement: 'Dell'
2193
2247
  model_replacement: '$1'
2194
- - regex: '; *Dell[ _]([^;/]+) Build'
2248
+ - regex: '; *Dell[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2195
2249
  device_replacement: 'Dell $1'
2196
2250
  brand_replacement: 'Dell'
2197
2251
  model_replacement: '$1'
2198
- - regex: '; *Dell ([^;/]+) Build'
2252
+ - regex: '; *Dell ([^;/]+?)(?: Build|\) AppleWebKit)'
2199
2253
  device_replacement: 'Dell $1'
2200
2254
  brand_replacement: 'Dell'
2201
2255
  model_replacement: '$1'
@@ -2204,7 +2258,7 @@ device_parsers:
2204
2258
  # Denver
2205
2259
  # @ref: http://www.denver-electronics.com/tablets1/
2206
2260
  #########
2207
- - regex: '; *(TA[CD]-\d+[^;/]*) Build'
2261
+ - regex: '; *(TA[CD]-\d+[^;/]*)(?: Build|\) AppleWebKit)'
2208
2262
  device_replacement: '$1'
2209
2263
  brand_replacement: 'Denver'
2210
2264
  model_replacement: '$1'
@@ -2213,7 +2267,7 @@ device_parsers:
2213
2267
  # Dex
2214
2268
  # @ref: http://dex.ua/
2215
2269
  #########
2216
- - regex: '; *(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?) Build'
2270
+ - regex: '; *(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?)(?: Build|\) AppleWebKit)'
2217
2271
  device_replacement: '$1'
2218
2272
  brand_replacement: 'Dex'
2219
2273
  model_replacement: '$1'
@@ -2222,7 +2276,7 @@ device_parsers:
2222
2276
  # DNS AirTab
2223
2277
  # @ref: http://www.dns-shop.ru/
2224
2278
  #########
2225
- - regex: '; *(AirTab)[ _\-]([^;/]+) Build'
2279
+ - regex: '; *(AirTab)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2226
2280
  device_replacement: '$1 $2'
2227
2281
  brand_replacement: 'DNS'
2228
2282
  model_replacement: '$1 $2'
@@ -2231,43 +2285,43 @@ device_parsers:
2231
2285
  # Docomo (Operator Branded Device)
2232
2286
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
2233
2287
  #########
2234
- - regex: '; *(F\-\d[^;/]+) Build'
2288
+ - regex: '; *(F\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2235
2289
  device_replacement: '$1'
2236
2290
  brand_replacement: 'Fujitsu'
2237
2291
  model_replacement: '$1'
2238
- - regex: '; *(HT-03A) Build'
2292
+ - regex: '; *(HT-03A)(?: Build|\) AppleWebKit)'
2239
2293
  device_replacement: '$1'
2240
2294
  brand_replacement: 'HTC'
2241
2295
  model_replacement: 'Magic'
2242
- - regex: '; *(HT\-\d[^;/]+) Build'
2296
+ - regex: '; *(HT\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2243
2297
  device_replacement: '$1'
2244
2298
  brand_replacement: 'HTC'
2245
2299
  model_replacement: '$1'
2246
- - regex: '; *(L\-\d[^;/]+) Build'
2300
+ - regex: '; *(L\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2247
2301
  device_replacement: '$1'
2248
2302
  brand_replacement: 'LG'
2249
2303
  model_replacement: '$1'
2250
- - regex: '; *(N\-\d[^;/]+) Build'
2304
+ - regex: '; *(N\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2251
2305
  device_replacement: '$1'
2252
2306
  brand_replacement: 'Nec'
2253
2307
  model_replacement: '$1'
2254
- - regex: '; *(P\-\d[^;/]+) Build'
2308
+ - regex: '; *(P\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2255
2309
  device_replacement: '$1'
2256
2310
  brand_replacement: 'Panasonic'
2257
2311
  model_replacement: '$1'
2258
- - regex: '; *(SC\-\d[^;/]+) Build'
2312
+ - regex: '; *(SC\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2259
2313
  device_replacement: '$1'
2260
2314
  brand_replacement: 'Samsung'
2261
2315
  model_replacement: '$1'
2262
- - regex: '; *(SH\-\d[^;/]+) Build'
2316
+ - regex: '; *(SH\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2263
2317
  device_replacement: '$1'
2264
2318
  brand_replacement: 'Sharp'
2265
2319
  model_replacement: '$1'
2266
- - regex: '; *(SO\-\d[^;/]+) Build'
2320
+ - regex: '; *(SO\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2267
2321
  device_replacement: '$1'
2268
2322
  brand_replacement: 'SonyEricsson'
2269
2323
  model_replacement: '$1'
2270
- - regex: '; *(T\-0[12][^;/]+) Build'
2324
+ - regex: '; *(T\-0[12][^;/]+?)(?: Build|\) AppleWebKit)'
2271
2325
  device_replacement: '$1'
2272
2326
  brand_replacement: 'Toshiba'
2273
2327
  model_replacement: '$1'
@@ -2276,7 +2330,7 @@ device_parsers:
2276
2330
  # DOOV
2277
2331
  # @ref: http://www.doov.com.cn/
2278
2332
  #########
2279
- - regex: '; *(DOOV)[ _]([^;/]+) Build'
2333
+ - regex: '; *(DOOV)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2280
2334
  device_replacement: '$1 $2'
2281
2335
  brand_replacement: 'DOOV'
2282
2336
  model_replacement: '$2'
@@ -2285,7 +2339,7 @@ device_parsers:
2285
2339
  # Enot
2286
2340
  # @ref: http://www.enot.ua/
2287
2341
  #########
2288
- - regex: '; *(Enot|ENOT)[ -]?([^;/]+) Build'
2342
+ - regex: '; *(Enot|ENOT)[ -]?([^;/]+?)(?: Build|\) AppleWebKit)'
2289
2343
  device_replacement: '$1 $2'
2290
2344
  brand_replacement: 'Enot'
2291
2345
  model_replacement: '$2'
@@ -2298,7 +2352,7 @@ device_parsers:
2298
2352
  device_replacement: 'CROSS $1'
2299
2353
  brand_replacement: 'Evercoss'
2300
2354
  model_replacement: 'Cross $1'
2301
- - regex: '; *(CROSS|Cross)[ _\-]([^;/]+) Build'
2355
+ - regex: '; *(CROSS|Cross)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2302
2356
  device_replacement: '$1 $2'
2303
2357
  brand_replacement: 'Evercoss'
2304
2358
  model_replacement: 'Cross $2'
@@ -2316,11 +2370,11 @@ device_parsers:
2316
2370
  # Fly
2317
2371
  # @ref: http://www.fly-phone.com/
2318
2372
  #########
2319
- - regex: '; *(IQ.*) Build'
2373
+ - regex: '; *(IQ.*?)(?: Build|\) AppleWebKit)'
2320
2374
  device_replacement: '$1'
2321
2375
  brand_replacement: 'Fly'
2322
2376
  model_replacement: '$1'
2323
- - regex: '; *(Fly|FLY)[ _](IQ[^;]+|F[34]\d+[^;]*);? Build'
2377
+ - regex: '; *(Fly|FLY)[ _](IQ[^;]+?|F[34]\d+[^;]*?);?(?: Build|\) AppleWebKit)'
2324
2378
  device_replacement: '$1 $2'
2325
2379
  brand_replacement: 'Fly'
2326
2380
  model_replacement: '$2'
@@ -2329,7 +2383,7 @@ device_parsers:
2329
2383
  # Fujitsu
2330
2384
  # @ref: http://www.fujitsu.com/global/
2331
2385
  #########
2332
- - regex: '; *(M532|Q572|FJL21) Build/'
2386
+ - regex: '; *(M532|Q572|FJL21)(?: Build|\) AppleWebKit)'
2333
2387
  device_replacement: '$1'
2334
2388
  brand_replacement: 'Fujitsu'
2335
2389
  model_replacement: '$1'
@@ -2338,7 +2392,7 @@ device_parsers:
2338
2392
  # Galapad
2339
2393
  # @ref: http://www.galapad.net/product.html
2340
2394
  #########
2341
- - regex: '; *(G1) Build'
2395
+ - regex: '; *(G1)(?: Build|\) AppleWebKit)'
2342
2396
  device_replacement: '$1'
2343
2397
  brand_replacement: 'Galapad'
2344
2398
  model_replacement: '$1'
@@ -2347,7 +2401,7 @@ device_parsers:
2347
2401
  # Geeksphone
2348
2402
  # @ref: http://www.geeksphone.com/
2349
2403
  #########
2350
- - regex: '; *(Geeksphone) ([^;/]+) Build'
2404
+ - regex: '; *(Geeksphone) ([^;/]+?)(?: Build|\) AppleWebKit)'
2351
2405
  device_replacement: '$1 $2'
2352
2406
  brand_replacement: '$1'
2353
2407
  model_replacement: '$2'
@@ -2357,7 +2411,7 @@ device_parsers:
2357
2411
  # @ref: http://www.gfivemobile.com/en
2358
2412
  #########
2359
2413
  #- regex: '; *(G\'?FIVE) ([^;/]+) Build' # there is a problem with python yaml parser here
2360
- - regex: '; *(G[^F]?FIVE) ([^;/]+) Build'
2414
+ - regex: '; *(G[^F]?FIVE) ([^;/]+?)(?: Build|\) AppleWebKit)'
2361
2415
  device_replacement: '$1 $2'
2362
2416
  brand_replacement: 'Gfive'
2363
2417
  model_replacement: '$2'
@@ -2366,12 +2420,12 @@ device_parsers:
2366
2420
  # Gionee
2367
2421
  # @ref: http://www.gionee.com/
2368
2422
  #########
2369
- - regex: '; *(Gionee)[ _\-]([^;/]+)(?:/[^;/]+|) Build'
2423
+ - regex: '; *(Gionee)[ _\-]([^;/]+?)(?:/[^;/]+|)(?: Build|\) AppleWebKit)'
2370
2424
  regex_flag: 'i'
2371
2425
  device_replacement: '$1 $2'
2372
2426
  brand_replacement: 'Gionee'
2373
2427
  model_replacement: '$2'
2374
- - regex: '; *(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1) Build'
2428
+ - regex: '; *(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\) AppleWebKit)'
2375
2429
  device_replacement: 'Gionee $1'
2376
2430
  brand_replacement: 'Gionee'
2377
2431
  model_replacement: '$1'
@@ -2389,11 +2443,11 @@ device_parsers:
2389
2443
  # GoClever
2390
2444
  # @ref: http://www.goclever.com
2391
2445
  #########
2392
- - regex: '; *((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]*|PLAYTAB) Build'
2446
+ - regex: '; *((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]*|PLAYTAB)(?: Build|\) AppleWebKit)'
2393
2447
  device_replacement: 'GoClever $1'
2394
2448
  brand_replacement: 'GoClever'
2395
2449
  model_replacement: '$1'
2396
- - regex: '; *GOCLEVER ([^;/]+) Build'
2450
+ - regex: '; *GOCLEVER ([^;/]+?)(?: Build|\) AppleWebKit)'
2397
2451
  device_replacement: 'GoClever $1'
2398
2452
  brand_replacement: 'GoClever'
2399
2453
  model_replacement: '$1'
@@ -2402,11 +2456,11 @@ device_parsers:
2402
2456
  # Google
2403
2457
  # @ref: http://www.google.de/glass/start/
2404
2458
  #########
2405
- - regex: '; *(Glass \d+) Build'
2459
+ - regex: '; *(Glass \d+)(?: Build|\) AppleWebKit)'
2406
2460
  device_replacement: '$1'
2407
2461
  brand_replacement: 'Google'
2408
2462
  model_replacement: '$1'
2409
- - regex: '; *(Pixel.*) Build'
2463
+ - regex: '; *(Pixel.*?)(?: Build|\) AppleWebKit)'
2410
2464
  device_replacement: '$1'
2411
2465
  brand_replacement: 'Google'
2412
2466
  model_replacement: '$1'
@@ -2415,7 +2469,7 @@ device_parsers:
2415
2469
  # Gigabyte
2416
2470
  # @ref: http://gsmart.gigabytecm.com/en/
2417
2471
  #########
2418
- - regex: '; *(GSmart)[ -]([^/]+) Build'
2472
+ - regex: '; *(GSmart)[ -]([^/]+)(?: Build|\) AppleWebKit)'
2419
2473
  device_replacement: '$1 $2'
2420
2474
  brand_replacement: 'Gigabyte'
2421
2475
  model_replacement: '$1 $2'
@@ -2424,7 +2478,7 @@ device_parsers:
2424
2478
  # Freescale development boards
2425
2479
  # @ref: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=IMX53QSB
2426
2480
  #########
2427
- - regex: '; *(imx5[13]_[^/]+) Build'
2481
+ - regex: '; *(imx5[13]_[^/]+)(?: Build|\) AppleWebKit)'
2428
2482
  device_replacement: 'Freescale $1'
2429
2483
  brand_replacement: 'Freescale'
2430
2484
  model_replacement: '$1'
@@ -2434,11 +2488,11 @@ device_parsers:
2434
2488
  # @ref: http://www.haier.com/
2435
2489
  # @ref: http://www.haier.com/de/produkte/tablet/
2436
2490
  #########
2437
- - regex: '; *Haier[ _\-]([^/]+) Build'
2491
+ - regex: '; *Haier[ _\-]([^/]+)(?: Build|\) AppleWebKit)'
2438
2492
  device_replacement: 'Haier $1'
2439
2493
  brand_replacement: 'Haier'
2440
2494
  model_replacement: '$1'
2441
- - regex: '; *(PAD1016) Build'
2495
+ - regex: '; *(PAD1016)(?: Build|\) AppleWebKit)'
2442
2496
  device_replacement: 'Haipad $1'
2443
2497
  brand_replacement: 'Haipad'
2444
2498
  model_replacement: '$1'
@@ -2448,7 +2502,7 @@ device_parsers:
2448
2502
  # @ref: http://www.haipad.net/
2449
2503
  # @models: V7P|M7SM7S|M9XM9X|M7XM7X|M9|M8|M7-M|M1002|M7|M701
2450
2504
  #########
2451
- - regex: '; *(M701|M7|M8|M9) Build'
2505
+ - regex: '; *(M701|M7|M8|M9)(?: Build|\) AppleWebKit)'
2452
2506
  device_replacement: 'Haipad $1'
2453
2507
  brand_replacement: 'Haipad'
2454
2508
  model_replacement: '$1'
@@ -2480,7 +2534,7 @@ device_parsers:
2480
2534
  # Hena
2481
2535
  # @ref: http://www.henadigital.com/en/product/index.asp?id=6
2482
2536
  #########
2483
- - regex: '; *(MID-?\d{4}C[EM]) Build'
2537
+ - regex: '; *(MID-?\d{4}C[EM])(?: Build|\) AppleWebKit)'
2484
2538
  device_replacement: 'Hena $1'
2485
2539
  brand_replacement: 'Hena'
2486
2540
  model_replacement: '$1'
@@ -2489,11 +2543,11 @@ device_parsers:
2489
2543
  # Hisense
2490
2544
  # @ref: http://www.hisense.com/
2491
2545
  #########
2492
- - regex: '; *(EG\d{2,}|HS-[^;/]+|MIRA[^;/]+) Build'
2546
+ - regex: '; *(EG\d{2,}|HS-[^;/]+|MIRA[^;/]+?)(?: Build|\) AppleWebKit)'
2493
2547
  device_replacement: 'Hisense $1'
2494
2548
  brand_replacement: 'Hisense'
2495
2549
  model_replacement: '$1'
2496
- - regex: '; *(andromax[^;/]+) Build'
2550
+ - regex: '; *(andromax[^;/]+?)(?: Build|\) AppleWebKit)'
2497
2551
  regex_flag: 'i'
2498
2552
  device_replacement: 'Hisense $1'
2499
2553
  brand_replacement: 'Hisense'
@@ -2503,7 +2557,7 @@ device_parsers:
2503
2557
  # hitech
2504
2558
  # @ref: http://www.hitech-mobiles.com/
2505
2559
  #########
2506
- - regex: '; *(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE) Build'
2560
+ - regex: '; *(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE)(?: Build|\) AppleWebKit)'
2507
2561
  device_replacement: 'AMAZE $1$2'
2508
2562
  brand_replacement: 'hitech'
2509
2563
  model_replacement: 'AMAZE $1$2'
@@ -2512,15 +2566,15 @@ device_parsers:
2512
2566
  # HP
2513
2567
  # @ref: http://www.hp.com/
2514
2568
  #########
2515
- - regex: '; *(PlayBook) Build'
2569
+ - regex: '; *(PlayBook)(?: Build|\) AppleWebKit)'
2516
2570
  device_replacement: 'HP $1'
2517
2571
  brand_replacement: 'HP'
2518
2572
  model_replacement: '$1'
2519
- - regex: '; *HP ([^/]+) Build'
2573
+ - regex: '; *HP ([^/]+)(?: Build|\) AppleWebKit)'
2520
2574
  device_replacement: 'HP $1'
2521
2575
  brand_replacement: 'HP'
2522
2576
  model_replacement: '$1'
2523
- - regex: '; *([^/]+_tenderloin) Build'
2577
+ - regex: '; *([^/]+_tenderloin)(?: Build|\) AppleWebKit)'
2524
2578
  device_replacement: 'HP TouchPad'
2525
2579
  brand_replacement: 'HP'
2526
2580
  model_replacement: 'TouchPad'
@@ -2663,16 +2717,16 @@ device_parsers:
2663
2717
  # Hyundai
2664
2718
  # @ref: http://www.hyundaitechnologies.com
2665
2719
  #########
2666
- - regex: '; *HYUNDAI (T\d[^/]*) Build'
2720
+ - regex: '; *HYUNDAI (T\d[^/]*)(?: Build|\) AppleWebKit)'
2667
2721
  device_replacement: 'Hyundai $1'
2668
2722
  brand_replacement: 'Hyundai'
2669
2723
  model_replacement: '$1'
2670
- - regex: '; *HYUNDAI ([^;/]+) Build'
2724
+ - regex: '; *HYUNDAI ([^;/]+?)(?: Build|\) AppleWebKit)'
2671
2725
  device_replacement: 'Hyundai $1'
2672
2726
  brand_replacement: 'Hyundai'
2673
2727
  model_replacement: '$1'
2674
2728
  # X900? http://www.amazon.com/Hyundai-X900-Retina-Android-Bluetooth/dp/B00AO07H3O
2675
- - regex: '; *(X700|Hold X|MB-6900) Build'
2729
+ - regex: '; *(X700|Hold X|MB-6900)(?: Build|\) AppleWebKit)'
2676
2730
  device_replacement: 'Hyundai $1'
2677
2731
  brand_replacement: 'Hyundai'
2678
2732
  model_replacement: '$1'
@@ -2681,12 +2735,12 @@ device_parsers:
2681
2735
  # iBall
2682
2736
  # @ref: http://www.iball.co.in/Category/Mobiles/22
2683
2737
  #########
2684
- - regex: '; *(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*) Build'
2738
+ - regex: '; *(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*)(?: Build|\) AppleWebKit)'
2685
2739
  regex_flag: 'i'
2686
2740
  device_replacement: '$1 $2'
2687
2741
  brand_replacement: 'iBall'
2688
2742
  model_replacement: '$1 $2'
2689
- - regex: '; *(IBall)(?:[ _]([^;/]+)|) Build'
2743
+ - regex: '; *(IBall)(?:[ _]([^;/]+?)|)(?: Build|\) AppleWebKit)'
2690
2744
  regex_flag: 'i'
2691
2745
  device_replacement: '$1 $2'
2692
2746
  brand_replacement: 'iBall'
@@ -2696,7 +2750,7 @@ device_parsers:
2696
2750
  # IconBIT
2697
2751
  # @ref: http://www.iconbit.com/catalog/tablets/
2698
2752
  #########
2699
- - regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+|) Build'
2753
+ - regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+|)(?: Build|\) AppleWebKit)'
2700
2754
  device_replacement: '$1'
2701
2755
  brand_replacement: 'IconBIT'
2702
2756
  model_replacement: '$1'
@@ -2705,7 +2759,7 @@ device_parsers:
2705
2759
  # IMO
2706
2760
  # @ref: http://www.ponselimo.com/
2707
2761
  #########
2708
- - regex: '; *(IMO)[ _]([^;/]+) Build'
2762
+ - regex: '; *(IMO)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2709
2763
  regex_flag: 'i'
2710
2764
  device_replacement: '$1 $2'
2711
2765
  brand_replacement: 'IMO'
@@ -2715,12 +2769,12 @@ device_parsers:
2715
2769
  # i-mobile
2716
2770
  # @ref: http://www.i-mobilephone.com/
2717
2771
  #########
2718
- - regex: '; *i-?mobile[ _]([^/]+) Build/'
2772
+ - regex: '; *i-?mobile[ _]([^/]+)(?: Build|\) AppleWebKit)'
2719
2773
  regex_flag: 'i'
2720
2774
  device_replacement: 'i-mobile $1'
2721
2775
  brand_replacement: 'imobile'
2722
2776
  model_replacement: '$1'
2723
- - regex: '; *(i-(?:style|note)[^/]*) Build/'
2777
+ - regex: '; *(i-(?:style|note)[^/]*)(?: Build|\) AppleWebKit)'
2724
2778
  regex_flag: 'i'
2725
2779
  device_replacement: 'i-mobile $1'
2726
2780
  brand_replacement: 'imobile'
@@ -2730,7 +2784,7 @@ device_parsers:
2730
2784
  # Impression
2731
2785
  # @ref: http://impression.ua/planshetnye-kompyutery
2732
2786
  #########
2733
- - regex: '; *(ImPAD) ?(\d+(?:.)*) Build'
2787
+ - regex: '; *(ImPAD) ?(\d+(?:.)*?)(?: Build|\) AppleWebKit)'
2734
2788
  device_replacement: '$1 $2'
2735
2789
  brand_replacement: 'Impression'
2736
2790
  model_replacement: '$1 $2'
@@ -2739,7 +2793,7 @@ device_parsers:
2739
2793
  # Infinix
2740
2794
  # @ref: http://www.infinixmobility.com/index.html
2741
2795
  #########
2742
- - regex: '; *(Infinix)[ _]([^;/]+) Build'
2796
+ - regex: '; *(Infinix)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2743
2797
  device_replacement: '$1 $2'
2744
2798
  brand_replacement: 'Infinix'
2745
2799
  model_replacement: '$2'
@@ -2748,7 +2802,7 @@ device_parsers:
2748
2802
  # Informer
2749
2803
  # @ref: ??
2750
2804
  #########
2751
- - regex: '; *(Informer)[ \-]([^;/]+) Build'
2805
+ - regex: '; *(Informer)[ \-]([^;/]+?)(?: Build|\) AppleWebKit)'
2752
2806
  device_replacement: '$1 $2'
2753
2807
  brand_replacement: 'Informer'
2754
2808
  model_replacement: '$2'
@@ -2758,7 +2812,7 @@ device_parsers:
2758
2812
  # @ref: http://www.intenso.de
2759
2813
  # @models: 7":TAB 714,TAB 724;8":TAB 814,TAB 824;10":TAB 1004
2760
2814
  #########
2761
- - regex: '; *(TAB) ?([78][12]4) Build'
2815
+ - regex: '; *(TAB) ?([78][12]4)(?: Build|\) AppleWebKit)'
2762
2816
  device_replacement: 'Intenso $1'
2763
2817
  brand_replacement: 'Intenso'
2764
2818
  model_replacement: '$1 $2'
@@ -2769,7 +2823,7 @@ device_parsers:
2769
2823
  # @note: Zync also offers a "Cloud Z5" device
2770
2824
  #########
2771
2825
  # smartphones
2772
- - regex: '; *(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]+) *(?:Build|;)'
2826
+ - regex: '; *(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]+?) *(?:Build|;)'
2773
2827
  device_replacement: '$1$2$3'
2774
2828
  brand_replacement: 'Intex'
2775
2829
  model_replacement: '$1 $3'
@@ -2783,7 +2837,7 @@ device_parsers:
2783
2837
  device_replacement: '$1 $2 $3'
2784
2838
  brand_replacement: 'Intex'
2785
2839
  model_replacement: 'iBuddy $2 $3'
2786
- - regex: '; *(I-Buddy)[ _]([^;/]+) *(?:Build|;)'
2840
+ - regex: '; *(I-Buddy)[ _]([^;/]+?) *(?:Build|;)'
2787
2841
  device_replacement: '$1 $2'
2788
2842
  brand_replacement: 'Intex'
2789
2843
  model_replacement: 'iBuddy $2'
@@ -2792,7 +2846,7 @@ device_parsers:
2792
2846
  # iOCEAN
2793
2847
  # @ref: http://www.iocean.cc/
2794
2848
  #########
2795
- - regex: '; *(iOCEAN) ([^/]+) Build'
2849
+ - regex: '; *(iOCEAN) ([^/]+)(?: Build|\) AppleWebKit)'
2796
2850
  regex_flag: 'i'
2797
2851
  device_replacement: '$1 $2'
2798
2852
  brand_replacement: 'iOCEAN'
@@ -2802,7 +2856,7 @@ device_parsers:
2802
2856
  # i.onik
2803
2857
  # @ref: http://www.i-onik.de/
2804
2858
  #########
2805
- - regex: '; *(TP\d+(?:\.\d+|)\-\d[^;/]+) Build'
2859
+ - regex: '; *(TP\d+(?:\.\d+|)\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2806
2860
  device_replacement: 'ionik $1'
2807
2861
  brand_replacement: 'ionik'
2808
2862
  model_replacement: '$1'
@@ -2811,7 +2865,7 @@ device_parsers:
2811
2865
  # IRU.ru
2812
2866
  # @ref: http://www.iru.ru/catalog/soho/planetable/
2813
2867
  #########
2814
- - regex: '; *(M702pro) Build'
2868
+ - regex: '; *(M702pro)(?: Build|\) AppleWebKit)'
2815
2869
  device_replacement: '$1'
2816
2870
  brand_replacement: 'Iru'
2817
2871
  model_replacement: '$1'
@@ -2821,11 +2875,11 @@ device_parsers:
2821
2875
  # @ref: http://www.ivio.com/mobile.php
2822
2876
  # @models: DG80,DG20,DE38,DE88,MD70
2823
2877
  #########
2824
- - regex: '; *(DE88Plus|MD70) Build'
2878
+ - regex: '; *(DE88Plus|MD70)(?: Build|\) AppleWebKit)'
2825
2879
  device_replacement: '$1'
2826
2880
  brand_replacement: 'Ivio'
2827
2881
  model_replacement: '$1'
2828
- - regex: '; *IVIO[_\-]([^;/]+) Build'
2882
+ - regex: '; *IVIO[_\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2829
2883
  device_replacement: '$1'
2830
2884
  brand_replacement: 'Ivio'
2831
2885
  model_replacement: '$1'
@@ -2834,7 +2888,7 @@ device_parsers:
2834
2888
  # Jaytech
2835
2889
  # @ref: http://www.jay-tech.de/jaytech/servlet/frontend/
2836
2890
  #########
2837
- - regex: '; *(TPC-\d+|JAY-TECH) Build'
2891
+ - regex: '; *(TPC-\d+|JAY-TECH)(?: Build|\) AppleWebKit)'
2838
2892
  device_replacement: '$1'
2839
2893
  brand_replacement: 'Jaytech'
2840
2894
  model_replacement: '$1'
@@ -2843,7 +2897,7 @@ device_parsers:
2843
2897
  # Jiayu
2844
2898
  # @ref: http://www.ejiayu.com/en/Product.html
2845
2899
  #########
2846
- - regex: '; *(JY-[^;/]+|G[234]S?) Build'
2900
+ - regex: '; *(JY-[^;/]+|G[234]S?)(?: Build|\) AppleWebKit)'
2847
2901
  device_replacement: '$1'
2848
2902
  brand_replacement: 'Jiayu'
2849
2903
  model_replacement: '$1'
@@ -2852,7 +2906,7 @@ device_parsers:
2852
2906
  # JXD
2853
2907
  # @ref: http://www.jxd.hk/
2854
2908
  #########
2855
- - regex: '; *(JXD)[ _\-]([^;/]+) Build'
2909
+ - regex: '; *(JXD)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2856
2910
  device_replacement: '$1 $2'
2857
2911
  brand_replacement: 'JXD'
2858
2912
  model_replacement: '$2'
@@ -2879,84 +2933,84 @@ device_parsers:
2879
2933
  # KDDI (Operator Branded Device)
2880
2934
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
2881
2935
  #########
2882
- - regex: '; *(IS01|IS03|IS05|IS\d{2}SH) Build'
2936
+ - regex: '; *(IS01|IS03|IS05|IS\d{2}SH)(?: Build|\) AppleWebKit)'
2883
2937
  device_replacement: '$1'
2884
2938
  brand_replacement: 'Sharp'
2885
2939
  model_replacement: '$1'
2886
- - regex: '; *(IS04) Build'
2940
+ - regex: '; *(IS04)(?: Build|\) AppleWebKit)'
2887
2941
  device_replacement: '$1'
2888
2942
  brand_replacement: 'Regza'
2889
2943
  model_replacement: '$1'
2890
- - regex: '; *(IS06|IS\d{2}PT) Build'
2944
+ - regex: '; *(IS06|IS\d{2}PT)(?: Build|\) AppleWebKit)'
2891
2945
  device_replacement: '$1'
2892
2946
  brand_replacement: 'Pantech'
2893
2947
  model_replacement: '$1'
2894
- - regex: '; *(IS11S) Build'
2948
+ - regex: '; *(IS11S)(?: Build|\) AppleWebKit)'
2895
2949
  device_replacement: '$1'
2896
2950
  brand_replacement: 'SonyEricsson'
2897
2951
  model_replacement: 'Xperia Acro'
2898
- - regex: '; *(IS11CA) Build'
2952
+ - regex: '; *(IS11CA)(?: Build|\) AppleWebKit)'
2899
2953
  device_replacement: '$1'
2900
2954
  brand_replacement: 'Casio'
2901
2955
  model_replacement: 'GzOne $1'
2902
- - regex: '; *(IS11LG) Build'
2956
+ - regex: '; *(IS11LG)(?: Build|\) AppleWebKit)'
2903
2957
  device_replacement: '$1'
2904
2958
  brand_replacement: 'LG'
2905
2959
  model_replacement: 'Optimus X'
2906
- - regex: '; *(IS11N) Build'
2960
+ - regex: '; *(IS11N)(?: Build|\) AppleWebKit)'
2907
2961
  device_replacement: '$1'
2908
2962
  brand_replacement: 'Medias'
2909
2963
  model_replacement: '$1'
2910
- - regex: '; *(IS11PT) Build'
2964
+ - regex: '; *(IS11PT)(?: Build|\) AppleWebKit)'
2911
2965
  device_replacement: '$1'
2912
2966
  brand_replacement: 'Pantech'
2913
2967
  model_replacement: 'MIRACH'
2914
- - regex: '; *(IS12F) Build'
2968
+ - regex: '; *(IS12F)(?: Build|\) AppleWebKit)'
2915
2969
  device_replacement: '$1'
2916
2970
  brand_replacement: 'Fujitsu'
2917
2971
  model_replacement: 'Arrows ES'
2918
2972
  # @ref: https://ja.wikipedia.org/wiki/IS12M
2919
- - regex: '; *(IS12M) Build'
2973
+ - regex: '; *(IS12M)(?: Build|\) AppleWebKit)'
2920
2974
  device_replacement: '$1'
2921
2975
  brand_replacement: 'Motorola'
2922
2976
  model_replacement: 'XT909'
2923
- - regex: '; *(IS12S) Build'
2977
+ - regex: '; *(IS12S)(?: Build|\) AppleWebKit)'
2924
2978
  device_replacement: '$1'
2925
2979
  brand_replacement: 'SonyEricsson'
2926
2980
  model_replacement: 'Xperia Acro HD'
2927
- - regex: '; *(ISW11F) Build'
2981
+ - regex: '; *(ISW11F)(?: Build|\) AppleWebKit)'
2928
2982
  device_replacement: '$1'
2929
2983
  brand_replacement: 'Fujitsu'
2930
2984
  model_replacement: 'Arrowz Z'
2931
- - regex: '; *(ISW11HT) Build'
2985
+ - regex: '; *(ISW11HT)(?: Build|\) AppleWebKit)'
2932
2986
  device_replacement: '$1'
2933
2987
  brand_replacement: 'HTC'
2934
2988
  model_replacement: 'EVO'
2935
- - regex: '; *(ISW11K) Build'
2989
+ - regex: '; *(ISW11K)(?: Build|\) AppleWebKit)'
2936
2990
  device_replacement: '$1'
2937
2991
  brand_replacement: 'Kyocera'
2938
2992
  model_replacement: 'DIGNO'
2939
- - regex: '; *(ISW11M) Build'
2993
+ - regex: '; *(ISW11M)(?: Build|\) AppleWebKit)'
2940
2994
  device_replacement: '$1'
2941
2995
  brand_replacement: 'Motorola'
2942
2996
  model_replacement: 'Photon'
2943
- - regex: '; *(ISW11SC) Build'
2997
+ - regex: '; *(ISW11SC)(?: Build|\) AppleWebKit)'
2944
2998
  device_replacement: '$1'
2945
2999
  brand_replacement: 'Samsung'
2946
3000
  model_replacement: 'GALAXY S II WiMAX'
2947
- - regex: '; *(ISW12HT) Build'
3001
+ - regex: '; *(ISW12HT)(?: Build|\) AppleWebKit)'
2948
3002
  device_replacement: '$1'
2949
3003
  brand_replacement: 'HTC'
2950
3004
  model_replacement: 'EVO 3D'
2951
- - regex: '; *(ISW13HT) Build'
3005
+ - regex: '; *(ISW13HT)(?: Build|\) AppleWebKit)'
2952
3006
  device_replacement: '$1'
2953
3007
  brand_replacement: 'HTC'
2954
3008
  model_replacement: 'J'
2955
- - regex: '; *(ISW?[0-9]{2}[A-Z]{0,2}) Build'
3009
+ - regex: '; *(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\) AppleWebKit)'
2956
3010
  device_replacement: '$1'
2957
3011
  brand_replacement: 'KDDI'
2958
3012
  model_replacement: '$1'
2959
- - regex: '; *(INFOBAR [^;/]+) Build'
3013
+ - regex: '; *(INFOBAR [^;/]+?)(?: Build|\) AppleWebKit)'
2960
3014
  device_replacement: '$1'
2961
3015
  brand_replacement: 'KDDI'
2962
3016
  model_replacement: '$1'
@@ -2965,7 +3019,7 @@ device_parsers:
2965
3019
  # Kingcom
2966
3020
  # @ref: http://www.e-kingcom.com
2967
3021
  #########
2968
- - regex: '; *(JOYPAD|Joypad)[ _]([^;/]+) Build/'
3022
+ - regex: '; *(JOYPAD|Joypad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2969
3023
  device_replacement: '$1 $2'
2970
3024
  brand_replacement: 'Kingcom'
2971
3025
  model_replacement: '$1 $2'
@@ -2975,7 +3029,7 @@ device_parsers:
2975
3029
  # @ref: https://en.wikipedia.org/wiki/Kobo_Inc.
2976
3030
  # @ref: http://www.kobo.com/devices#tablets
2977
3031
  #########
2978
- - regex: '; *(Vox|VOX|Arc|K080) Build/'
3032
+ - regex: '; *(Vox|VOX|Arc|K080)(?: Build|\) AppleWebKit)'
2979
3033
  regex_flag: 'i'
2980
3034
  device_replacement: '$1'
2981
3035
  brand_replacement: 'Kobo'
@@ -2989,7 +3043,7 @@ device_parsers:
2989
3043
  # K-Touch
2990
3044
  # @ref: ??
2991
3045
  #########
2992
- - regex: '; *(K-Touch)[ _]([^;/]+) Build'
3046
+ - regex: '; *(K-Touch)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2993
3047
  regex_flag: 'i'
2994
3048
  device_replacement: '$1 $2'
2995
3049
  brand_replacement: 'Ktouch'
@@ -2999,7 +3053,7 @@ device_parsers:
2999
3053
  # KT Tech
3000
3054
  # @ref: http://www.kttech.co.kr
3001
3055
  #########
3002
- - regex: '; *((?:EV|KM)-S\d+[A-Z]?) Build'
3056
+ - regex: '; *((?:EV|KM)-S\d+[A-Z]?)(?: Build|\) AppleWebKit)'
3003
3057
  regex_flag: 'i'
3004
3058
  device_replacement: '$1'
3005
3059
  brand_replacement: 'KTtech'
@@ -3009,7 +3063,7 @@ device_parsers:
3009
3063
  # Kyocera
3010
3064
  # @ref: http://www.android.com/devices/?country=all&m=kyocera
3011
3065
  #########
3012
- - regex: '; *(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2}) Build/'
3066
+ - regex: '; *(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2})(?: Build|\) AppleWebKit)'
3013
3067
  device_replacement: '$1'
3014
3068
  brand_replacement: 'Kyocera'
3015
3069
  model_replacement: '$1'
@@ -3032,7 +3086,7 @@ device_parsers:
3032
3086
  # Lemon
3033
3087
  # @ref: http://www.lemonmobiles.com/products.php?type=1
3034
3088
  #########
3035
- - regex: '; *(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]+))_? Build'
3089
+ - regex: '; *(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]+))_?(?: Build|\) AppleWebKit)'
3036
3090
  device_replacement: 'Lemon $1$2'
3037
3091
  brand_replacement: 'Lemon'
3038
3092
  model_replacement: '$1$2'
@@ -3041,11 +3095,11 @@ device_parsers:
3041
3095
  # Lenco
3042
3096
  # @ref: http://www.lenco.com/c/tablets/
3043
3097
  #########
3044
- - regex: '; *(TAB-1012) Build/'
3098
+ - regex: '; *(TAB-1012)(?: Build|\) AppleWebKit)'
3045
3099
  device_replacement: 'Lenco $1'
3046
3100
  brand_replacement: 'Lenco'
3047
3101
  model_replacement: '$1'
3048
- - regex: '; Lenco ([^;/]+) Build/'
3102
+ - regex: '; Lenco ([^;/]+?)(?: Build|\) AppleWebKit)'
3049
3103
  device_replacement: 'Lenco $1'
3050
3104
  brand_replacement: 'Lenco'
3051
3105
  model_replacement: '$1'
@@ -3095,7 +3149,7 @@ device_parsers:
3095
3149
  # Lexibook
3096
3150
  # @ref: http://www.lexibook.com/fr
3097
3151
  #########
3098
- - regex: '; *(MFC\d+)[A-Z]{2}([^;,/]*),? Build'
3152
+ - regex: '; *(MFC\d+)[A-Z]{2}([^;,/]*),?(?: Build|\) AppleWebKit)'
3099
3153
  device_replacement: '$1$2'
3100
3154
  brand_replacement: 'Lexibook'
3101
3155
  model_replacement: '$1$2'
@@ -3133,11 +3187,11 @@ device_parsers:
3133
3187
  # Malata
3134
3188
  # @ref: http://www.malata.com/en/products.aspx?classid=680
3135
3189
  #########
3136
- - regex: '; *((?:SMB|smb)[^;/]+) Build/'
3190
+ - regex: '; *((?:SMB|smb)[^;/]+?)(?: Build|\) AppleWebKit)'
3137
3191
  device_replacement: '$1'
3138
3192
  brand_replacement: 'Malata'
3139
3193
  model_replacement: '$1'
3140
- - regex: '; *(?:Malata|MALATA) ([^;/]+) Build/'
3194
+ - regex: '; *(?:Malata|MALATA) ([^;/]+?)(?: Build|\) AppleWebKit)'
3141
3195
  device_replacement: '$1'
3142
3196
  brand_replacement: 'Malata'
3143
3197
  model_replacement: '$1'
@@ -3146,7 +3200,7 @@ device_parsers:
3146
3200
  # Manta
3147
3201
  # @ref: http://www.manta.com.pl/en
3148
3202
  #########
3149
- - regex: '; *(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9]) Build/'
3203
+ - regex: '; *(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9])(?: Build|\) AppleWebKit)'
3150
3204
  device_replacement: '$1'
3151
3205
  brand_replacement: 'Manta'
3152
3206
  model_replacement: '$1'
@@ -3155,7 +3209,7 @@ device_parsers:
3155
3209
  # Match
3156
3210
  # @ref: http://www.match.net.cn/products.asp
3157
3211
  #########
3158
- - regex: '; *(M1052|M806|M9000|M9100|M9701|MID100|MID120|MID125|MID130|MID135|MID140|MID701|MID710|MID713|MID727|MID728|MID731|MID732|MID733|MID735|MID736|MID737|MID760|MID800|MID810|MID820|MID830|MID833|MID835|MID860|MID900|MID930|MID933|MID960|MID980) Build/'
3212
+ - regex: '; *(M1052|M806|M9000|M9100|M9701|MID100|MID120|MID125|MID130|MID135|MID140|MID701|MID710|MID713|MID727|MID728|MID731|MID732|MID733|MID735|MID736|MID737|MID760|MID800|MID810|MID820|MID830|MID833|MID835|MID860|MID900|MID930|MID933|MID960|MID980)(?: Build|\) AppleWebKit)'
3159
3213
  device_replacement: '$1'
3160
3214
  brand_replacement: 'Match'
3161
3215
  model_replacement: '$1'
@@ -3169,7 +3223,7 @@ device_parsers:
3169
3223
  # Maxx MT150, Maxx MQ601, Maxx M2020, Maxx Sleek MX463neo, Maxx MX525, Maxx MX192-Tune, Maxx Genx Droid 7 AX353,
3170
3224
  # @note: Need more User-Agents!!!
3171
3225
  #########
3172
- - regex: '; *(GenxDroid7|MSD7.*|AX\d.*|Tab 701|Tab 722) Build/'
3226
+ - regex: '; *(GenxDroid7|MSD7.*?|AX\d.*?|Tab 701|Tab 722)(?: Build|\) AppleWebKit)'
3173
3227
  device_replacement: 'Maxx $1'
3174
3228
  brand_replacement: 'Maxx'
3175
3229
  model_replacement: '$1'
@@ -3178,11 +3232,11 @@ device_parsers:
3178
3232
  # Mediacom
3179
3233
  # @ref: http://www.mediacomeurope.it/
3180
3234
  #########
3181
- - regex: '; *(M-PP[^;/]+|PhonePad ?\d{2,}[^;/]+) Build'
3235
+ - regex: '; *(M-PP[^;/]+|PhonePad ?\d{2,}[^;/]+?)(?: Build|\) AppleWebKit)'
3182
3236
  device_replacement: 'Mediacom $1'
3183
3237
  brand_replacement: 'Mediacom'
3184
3238
  model_replacement: '$1'
3185
- - regex: '; *(M-MP[^;/]+|SmartPad ?\d{2,}[^;/]+) Build'
3239
+ - regex: '; *(M-MP[^;/]+|SmartPad ?\d{2,}[^;/]+?)(?: Build|\) AppleWebKit)'
3186
3240
  device_replacement: 'Mediacom $1'
3187
3241
  brand_replacement: 'Mediacom'
3188
3242
  model_replacement: '$1'
@@ -3191,12 +3245,12 @@ device_parsers:
3191
3245
  # Medion
3192
3246
  # @ref: http://www.medion.com/en/
3193
3247
  #########
3194
- - regex: '; *(?:MD_|)LIFETAB[ _]([^;/]+) Build'
3248
+ - regex: '; *(?:MD_|)LIFETAB[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3195
3249
  regex_flag: 'i'
3196
3250
  device_replacement: 'Medion Lifetab $1'
3197
3251
  brand_replacement: 'Medion'
3198
3252
  model_replacement: 'Lifetab $1'
3199
- - regex: '; *MEDION ([^;/]+) Build'
3253
+ - regex: '; *MEDION ([^;/]+?)(?: Build|\) AppleWebKit)'
3200
3254
  device_replacement: 'Medion $1'
3201
3255
  brand_replacement: 'Medion'
3202
3256
  model_replacement: '$1'
@@ -3205,7 +3259,7 @@ device_parsers:
3205
3259
  # Meizu
3206
3260
  # @ref: http://www.meizu.com
3207
3261
  #########
3208
- - regex: '; *(M030|M031|M035|M040|M065|m9) Build'
3262
+ - regex: '; *(M030|M031|M035|M040|M065|m9)(?: Build|\) AppleWebKit)'
3209
3263
  device_replacement: 'Meizu $1'
3210
3264
  brand_replacement: 'Meizu'
3211
3265
  model_replacement: '$1'
@@ -3249,7 +3303,7 @@ device_parsers:
3249
3303
  # Mito
3250
3304
  # @ref: http://new.mitomobile.com/
3251
3305
  #########
3252
- - regex: '; *(MITO)[ _\-]?([^;/]+) Build'
3306
+ - regex: '; *(MITO)[ _\-]?([^;/]+?)(?: Build|\) AppleWebKit)'
3253
3307
  regex_flag: 'i'
3254
3308
  device_replacement: '$1 $2'
3255
3309
  brand_replacement: 'Mito'
@@ -3269,12 +3323,12 @@ device_parsers:
3269
3323
  # Modecom
3270
3324
  # @ref: http://www.modecom.eu/tablets/portal/
3271
3325
  #########
3272
- - regex: '; *(MODECOM |)(FreeTab) ?([^;/]+) Build'
3326
+ - regex: '; *(MODECOM |)(FreeTab) ?([^;/]+?)(?: Build|\) AppleWebKit)'
3273
3327
  regex_flag: 'i'
3274
3328
  device_replacement: '$1$2 $3'
3275
3329
  brand_replacement: 'Modecom'
3276
3330
  model_replacement: '$2 $3'
3277
- - regex: '; *(MODECOM )([^;/]+) Build'
3331
+ - regex: '; *(MODECOM )([^;/]+?)(?: Build|\) AppleWebKit)'
3278
3332
  regex_flag: 'i'
3279
3333
  device_replacement: '$1 $2'
3280
3334
  brand_replacement: 'Modecom'
@@ -3318,7 +3372,7 @@ device_parsers:
3318
3372
  # MpMan
3319
3373
  # @ref: http://www.mpmaneurope.com
3320
3374
  #########
3321
- - regex: '; *((?:MP[DQ]C|MPG\d{1,4}|MP\d{3,4}|MID(?:(?:10[234]|114|43|7[247]|8[24]|7)C|8[01]1))[^;/]*) Build'
3375
+ - regex: '; *((?:MP[DQ]C|MPG\d{1,4}|MP\d{3,4}|MID(?:(?:10[234]|114|43|7[247]|8[24]|7)C|8[01]1))[^;/]*)(?: Build|\) AppleWebKit)'
3322
3376
  device_replacement: '$1'
3323
3377
  brand_replacement: 'Mpman'
3324
3378
  model_replacement: '$1'
@@ -3327,7 +3381,7 @@ device_parsers:
3327
3381
  # MSI
3328
3382
  # @ref: http://www.msi.com/product/windpad/
3329
3383
  #########
3330
- - regex: '; *(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]+) Build'
3384
+ - regex: '; *(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]+?)(?: Build|\) AppleWebKit)'
3331
3385
  regex_flag: 'i'
3332
3386
  device_replacement: '$1'
3333
3387
  brand_replacement: 'Msi'
@@ -3337,7 +3391,7 @@ device_parsers:
3337
3391
  # Multilaser
3338
3392
  # http://www.multilaser.com.br/listagem_produtos.php?cat=5
3339
3393
  #########
3340
- - regex: '; *Multilaser[ _]([^;/]+) Build'
3394
+ - regex: '; *Multilaser[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3341
3395
  device_replacement: '$1'
3342
3396
  brand_replacement: 'Multilaser'
3343
3397
  model_replacement: '$1'
@@ -3346,15 +3400,15 @@ device_parsers:
3346
3400
  # MyPhone
3347
3401
  # @ref: http://myphone.com.ph/
3348
3402
  #########
3349
- - regex: '; *(My)[_]?(Pad)[ _]([^;/]+) Build'
3403
+ - regex: '; *(My)[_]?(Pad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3350
3404
  device_replacement: '$1$2 $3'
3351
3405
  brand_replacement: 'MyPhone'
3352
3406
  model_replacement: '$1$2 $3'
3353
- - regex: '; *(My)\|?(Phone)[ _]([^;/]+) Build'
3407
+ - regex: '; *(My)\|?(Phone)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3354
3408
  device_replacement: '$1$2 $3'
3355
3409
  brand_replacement: 'MyPhone'
3356
3410
  model_replacement: '$3'
3357
- - regex: '; *(A\d+)[ _](Duo|) Build'
3411
+ - regex: '; *(A\d+)[ _](Duo|)(?: Build|\) AppleWebKit)'
3358
3412
  regex_flag: 'i'
3359
3413
  device_replacement: '$1 $2'
3360
3414
  brand_replacement: 'MyPhone'
@@ -3364,7 +3418,7 @@ device_parsers:
3364
3418
  # Mytab
3365
3419
  # @ref: http://www.mytab.eu/en/category/mytab-products/
3366
3420
  #########
3367
- - regex: '; *(myTab[^;/]*) Build'
3421
+ - regex: '; *(myTab[^;/]*)(?: Build|\) AppleWebKit)'
3368
3422
  device_replacement: '$1'
3369
3423
  brand_replacement: 'Mytab'
3370
3424
  model_replacement: '$1'
@@ -3373,7 +3427,7 @@ device_parsers:
3373
3427
  # Nabi
3374
3428
  # @ref: https://www.nabitablet.com
3375
3429
  #########
3376
- - regex: '; *(NABI2?-)([^;/]+) Build/'
3430
+ - regex: '; *(NABI2?-)([^;/]+?)(?: Build|\) AppleWebKit)'
3377
3431
  device_replacement: '$1$2'
3378
3432
  brand_replacement: 'Nabi'
3379
3433
  model_replacement: '$2'
@@ -3382,15 +3436,15 @@ device_parsers:
3382
3436
  # Nec Medias
3383
3437
  # @ref: http://www.n-keitai.com/
3384
3438
  #########
3385
- - regex: '; *(N-\d+[CDE]) Build/'
3439
+ - regex: '; *(N-\d+[CDE])(?: Build|\) AppleWebKit)'
3386
3440
  device_replacement: '$1'
3387
3441
  brand_replacement: 'Nec'
3388
3442
  model_replacement: '$1'
3389
- - regex: '; ?(NEC-)(.*) Build/'
3443
+ - regex: '; ?(NEC-)(.*?)(?: Build|\) AppleWebKit)'
3390
3444
  device_replacement: '$1$2'
3391
3445
  brand_replacement: 'Nec'
3392
3446
  model_replacement: '$2'
3393
- - regex: '; *(LT-NA7) Build/'
3447
+ - regex: '; *(LT-NA7)(?: Build|\) AppleWebKit)'
3394
3448
  device_replacement: '$1'
3395
3449
  brand_replacement: 'Nec'
3396
3450
  model_replacement: 'Lifetouch Note'
@@ -3399,7 +3453,7 @@ device_parsers:
3399
3453
  # Nextbook
3400
3454
  # @ref: http://nextbookusa.com
3401
3455
  #########
3402
- - regex: '; *(NXM\d+[A-z0-9_]*|Next\d[A-z0-9_ \-]*|NEXT\d[A-z0-9_ \-]*|Nextbook [A-z0-9_ ]*|DATAM803HC|M805)(?: Build|[\);])'
3456
+ - regex: '; *(NXM\d+[A-Za-z0-9_]*|Next\d[A-Za-z0-9_ \-]*|NEXT\d[A-Za-z0-9_ \-]*|Nextbook [A-Za-z0-9_ ]*|DATAM803HC|M805)(?: Build|[\);])'
3403
3457
  device_replacement: '$1'
3404
3458
  brand_replacement: 'Nextbook'
3405
3459
  model_replacement: '$1'
@@ -3419,11 +3473,11 @@ device_parsers:
3419
3473
  # @ref:
3420
3474
  # TODO nook browser/1.0
3421
3475
  #########
3422
- - regex: '; *(Nook ?|Barnes & Noble Nook |BN )([^;/]+) Build'
3476
+ - regex: '; *(Nook ?|Barnes & Noble Nook |BN )([^;/]+?)(?: Build|\) AppleWebKit)'
3423
3477
  device_replacement: '$1$2'
3424
3478
  brand_replacement: 'Nook'
3425
3479
  model_replacement: '$2'
3426
- - regex: '; *(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2) Build'
3480
+ - regex: '; *(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\) AppleWebKit)'
3427
3481
  device_replacement: '$1$2'
3428
3482
  brand_replacement: 'Nook'
3429
3483
  model_replacement: '$2'
@@ -3436,7 +3490,7 @@ device_parsers:
3436
3490
  # Olivetti
3437
3491
  # @ref: http://www.olivetti.de/EN/Page/t02/view_html?idp=348
3438
3492
  #########
3439
- - regex: '; *(OP110|OliPad[^;/]+) Build'
3493
+ - regex: '; *(OP110|OliPad[^;/]+?)(?: Build|\) AppleWebKit)'
3440
3494
  device_replacement: 'Olivetti $1'
3441
3495
  brand_replacement: 'Olivetti'
3442
3496
  model_replacement: '$1'
@@ -3447,7 +3501,7 @@ device_parsers:
3447
3501
  # @note: MID tablets might get matched by CobyKyros first
3448
3502
  # @models: (T107|MID(?:700[2-5]|7031|7108|7132|750[02]|8001|8500|9001|971[12])
3449
3503
  #########
3450
- - regex: '; *OMEGA[ _\-](MID[^;/]+) Build'
3504
+ - regex: '; *OMEGA[ _\-](MID[^;/]+?)(?: Build|\) AppleWebKit)'
3451
3505
  device_replacement: 'Omega $1'
3452
3506
  brand_replacement: 'Omega'
3453
3507
  model_replacement: '$1'
@@ -3460,7 +3514,7 @@ device_parsers:
3460
3514
  # OpenPeak
3461
3515
  # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
3462
3516
  #########
3463
- - regex: '; *((?:CIUS|cius)[^;/]*) Build'
3517
+ - regex: '; *((?:CIUS|cius)[^;/]*)(?: Build|\) AppleWebKit)'
3464
3518
  device_replacement: 'Openpeak $1'
3465
3519
  brand_replacement: 'Openpeak'
3466
3520
  model_replacement: '$1'
@@ -3469,11 +3523,11 @@ device_parsers:
3469
3523
  # Oppo
3470
3524
  # @ref: http://en.oppo.com/products/
3471
3525
  #########
3472
- - regex: '; *(Find ?(?:5|7a)|R8[012]\d{1,2}|T703\d{0,1}|U70\d{1,2}T?|X90\d{1,2}) Build'
3526
+ - regex: '; *(Find ?(?:5|7a)|R8[012]\d{1,2}|T703\d{0,1}|U70\d{1,2}T?|X90\d{1,2})(?: Build|\) AppleWebKit)'
3473
3527
  device_replacement: 'Oppo $1'
3474
3528
  brand_replacement: 'Oppo'
3475
3529
  model_replacement: '$1'
3476
- - regex: '; *OPPO ?([^;/]+) Build/'
3530
+ - regex: '; *OPPO ?([^;/]+?)(?: Build|\) AppleWebKit)'
3477
3531
  device_replacement: 'Oppo $1'
3478
3532
  brand_replacement: 'Oppo'
3479
3533
  model_replacement: '$1'
@@ -3482,20 +3536,20 @@ device_parsers:
3482
3536
  # Odys
3483
3537
  # @ref: http://odys.de
3484
3538
  #########
3485
- - regex: '; *(?:Odys\-|ODYS\-|ODYS )([^;/]+) Build'
3539
+ - regex: '; *(?:Odys\-|ODYS\-|ODYS )([^;/]+?)(?: Build|\) AppleWebKit)'
3486
3540
  device_replacement: 'Odys $1'
3487
3541
  brand_replacement: 'Odys'
3488
3542
  model_replacement: '$1'
3489
- - regex: '; *(SELECT) ?(7) Build'
3543
+ - regex: '; *(SELECT) ?(7)(?: Build|\) AppleWebKit)'
3490
3544
  device_replacement: 'Odys $1 $2'
3491
3545
  brand_replacement: 'Odys'
3492
3546
  model_replacement: '$1 $2'
3493
- - regex: '; *(PEDI)_(PLUS)_(W) Build'
3547
+ - regex: '; *(PEDI)_(PLUS)_(W)(?: Build|\) AppleWebKit)'
3494
3548
  device_replacement: 'Odys $1 $2 $3'
3495
3549
  brand_replacement: 'Odys'
3496
3550
  model_replacement: '$1 $2 $3'
3497
3551
  # Weltbild - Tablet PC 4 = Cat Phoenix = Odys Tablet PC 4?
3498
- - regex: '; *(AEON|BRAVIO|FUSION|FUSION2IN1|Genio|EOS10|IEOS[^;/]*|IRON|Loox|LOOX|LOOX Plus|Motion|NOON|NOON_PRO|NEXT|OPOS|PEDI[^;/]*|PRIME[^;/]*|STUDYTAB|TABLO|Tablet-PC-4|UNO_X8|XELIO[^;/]*|Xelio ?\d+ ?[Pp]ro|XENO10|XPRESS PRO) Build'
3552
+ - regex: '; *(AEON|BRAVIO|FUSION|FUSION2IN1|Genio|EOS10|IEOS[^;/]*|IRON|Loox|LOOX|LOOX Plus|Motion|NOON|NOON_PRO|NEXT|OPOS|PEDI[^;/]*|PRIME[^;/]*|STUDYTAB|TABLO|Tablet-PC-4|UNO_X8|XELIO[^;/]*|Xelio ?\d+ ?[Pp]ro|XENO10|XPRESS PRO)(?: Build|\) AppleWebKit)'
3499
3553
  device_replacement: 'Odys $1'
3500
3554
  brand_replacement: 'Odys'
3501
3555
  model_replacement: '$1'
@@ -3504,11 +3558,11 @@ device_parsers:
3504
3558
  # OnePlus
3505
3559
  # @ref https://oneplus.net/
3506
3560
  #########
3507
- - regex: '; (ONE [a-zA-Z]\d+) Build/'
3561
+ - regex: '; (ONE [a-zA-Z]\d+)(?: Build|\) AppleWebKit)'
3508
3562
  device_replacement: 'OnePlus $1'
3509
3563
  brand_replacement: 'OnePlus'
3510
3564
  model_replacement: '$1'
3511
- - regex: '; (ONEPLUS [a-zA-Z]\d+)(?: Build/|)'
3565
+ - regex: '; (ONEPLUS [a-zA-Z]\d+)(?: Build|\) AppleWebKit)'
3512
3566
  device_replacement: 'OnePlus $1'
3513
3567
  brand_replacement: 'OnePlus'
3514
3568
  model_replacement: '$1'
@@ -3517,7 +3571,7 @@ device_parsers:
3517
3571
  # Orion
3518
3572
  # @ref: http://www.orion.ua/en/products/computer-products/tablet-pcs.html
3519
3573
  #########
3520
- - regex: '; *(TP-\d+) Build/'
3574
+ - regex: '; *(TP-\d+)(?: Build|\) AppleWebKit)'
3521
3575
  device_replacement: 'Orion $1'
3522
3576
  brand_replacement: 'Orion'
3523
3577
  model_replacement: '$1'
@@ -3526,7 +3580,7 @@ device_parsers:
3526
3580
  # PackardBell
3527
3581
  # @ref: http://www.packardbell.com/pb/en/AE/content/productgroup/tablets
3528
3582
  #########
3529
- - regex: '; *(G100W?) Build/'
3583
+ - regex: '; *(G100W?)(?: Build|\) AppleWebKit)'
3530
3584
  device_replacement: 'PackardBell $1'
3531
3585
  brand_replacement: 'PackardBell'
3532
3586
  model_replacement: '$1'
@@ -3537,17 +3591,17 @@ device_parsers:
3537
3591
  # @models: T11, T21, T31, P11, P51, Eluga Power, Eluga DL1
3538
3592
  # @models: (tab) Toughpad FZ-A1, Toughpad JT-B1
3539
3593
  #########
3540
- - regex: '; *(Panasonic)[_ ]([^;/]+) Build'
3594
+ - regex: '; *(Panasonic)[_ ]([^;/]+?)(?: Build|\) AppleWebKit)'
3541
3595
  device_replacement: '$1 $2'
3542
3596
  brand_replacement: '$1'
3543
3597
  model_replacement: '$2'
3544
3598
  # Toughpad
3545
- - regex: '; *(FZ-A1B|JT-B1) Build'
3599
+ - regex: '; *(FZ-A1B|JT-B1)(?: Build|\) AppleWebKit)'
3546
3600
  device_replacement: 'Panasonic $1'
3547
3601
  brand_replacement: 'Panasonic'
3548
3602
  model_replacement: '$1'
3549
3603
  # Eluga Power
3550
- - regex: '; *(dL1|DL1) Build'
3604
+ - regex: '; *(dL1|DL1)(?: Build|\) AppleWebKit)'
3551
3605
  device_replacement: 'Panasonic $1'
3552
3606
  brand_replacement: 'Panasonic'
3553
3607
  model_replacement: '$1'
@@ -3575,7 +3629,7 @@ device_parsers:
3575
3629
  # Papayre
3576
3630
  # @ref: http://grammata.es/
3577
3631
  #########
3578
- - regex: '; *(papyre)[ _\-]([^;/]+) Build/'
3632
+ - regex: '; *(papyre)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3579
3633
  regex_flag: 'i'
3580
3634
  device_replacement: '$1 $2'
3581
3635
  brand_replacement: 'Papyre'
@@ -3585,7 +3639,7 @@ device_parsers:
3585
3639
  # Pearl
3586
3640
  # @ref: http://www.pearl.de/c-1540.shtml
3587
3641
  #########
3588
- - regex: '; *(?:Touchlet )?(X10\.[^;/]+) Build/'
3642
+ - regex: '; *(?:Touchlet )?(X10\.[^;/]+?)(?: Build|\) AppleWebKit)'
3589
3643
  device_replacement: 'Pearl $1'
3590
3644
  brand_replacement: 'Pearl'
3591
3645
  model_replacement: '$1'
@@ -3594,15 +3648,15 @@ device_parsers:
3594
3648
  # Phicomm
3595
3649
  # @ref: http://www.phicomm.com.cn/
3596
3650
  #########
3597
- - regex: '; PHICOMM (i800) Build/'
3651
+ - regex: '; PHICOMM (i800)(?: Build|\) AppleWebKit)'
3598
3652
  device_replacement: 'Phicomm $1'
3599
3653
  brand_replacement: 'Phicomm'
3600
3654
  model_replacement: '$1'
3601
- - regex: '; PHICOMM ([^;/]+) Build/'
3655
+ - regex: '; PHICOMM ([^;/]+?)(?: Build|\) AppleWebKit)'
3602
3656
  device_replacement: 'Phicomm $1'
3603
3657
  brand_replacement: 'Phicomm'
3604
3658
  model_replacement: '$1'
3605
- - regex: '; *(FWS\d{3}[^;/]+) Build/'
3659
+ - regex: '; *(FWS\d{3}[^;/]+?)(?: Build|\) AppleWebKit)'
3606
3660
  device_replacement: 'Phicomm $1'
3607
3661
  brand_replacement: 'Phicomm'
3608
3662
  model_replacement: '$1'
@@ -3614,11 +3668,11 @@ device_parsers:
3614
3668
  # @ref: http://www.support.philips.com/support/catalog/products.jsp?_dyncharset=UTF-8&country=&categoryid=ENTERTAINMENT_TABLETS_SU_CN_CARE&userLanguage=en&navCount=0&groupId=&catalogType=&navAction=push&userCountry=cn&title=Entertainment+Tablets&cateId=TABLETS_CA_CN_CARE
3615
3669
  #########
3616
3670
  # @note: this a best guess according to available philips models. Need more User-Agents
3617
- - regex: '; *(D633|D822|D833|T539|T939|V726|W335|W336|W337|W3568|W536|W5510|W626|W632|W6350|W6360|W6500|W732|W736|W737|W7376|W820|W832|W8355|W8500|W8510|W930) Build'
3671
+ - regex: '; *(D633|D822|D833|T539|T939|V726|W335|W336|W337|W3568|W536|W5510|W626|W632|W6350|W6360|W6500|W732|W736|W737|W7376|W820|W832|W8355|W8500|W8510|W930)(?: Build|\) AppleWebKit)'
3618
3672
  device_replacement: '$1'
3619
3673
  brand_replacement: 'Philips'
3620
3674
  model_replacement: '$1'
3621
- - regex: '; *(?:Philips|PHILIPS)[ _]([^;/]+) Build'
3675
+ - regex: '; *(?:Philips|PHILIPS)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3622
3676
  device_replacement: 'Philips $1'
3623
3677
  brand_replacement: 'Philips'
3624
3678
  model_replacement: '$1'
@@ -3627,7 +3681,7 @@ device_parsers:
3627
3681
  # Pipo
3628
3682
  # @ref: http://www.pipo.cn/En/
3629
3683
  #########
3630
- - regex: 'Android 4\..*; *(M[12356789]|U[12368]|S[123])\ ?(pro)? Build'
3684
+ - regex: 'Android 4\..*; *(M[12356789]|U[12368]|S[123])\ ?(pro)?(?: Build|\) AppleWebKit)'
3631
3685
  device_replacement: 'Pipo $1$2'
3632
3686
  brand_replacement: 'Pipo'
3633
3687
  model_replacement: '$1$2'
@@ -3636,7 +3690,7 @@ device_parsers:
3636
3690
  # Ployer
3637
3691
  # @ref: http://en.ployer.cn/
3638
3692
  #########
3639
- - regex: '; *(MOMO[^;/]+) Build'
3693
+ - regex: '; *(MOMO[^;/]+?)(?: Build|\) AppleWebKit)'
3640
3694
  device_replacement: '$1'
3641
3695
  brand_replacement: 'Ployer'
3642
3696
  model_replacement: '$1'
@@ -3645,11 +3699,11 @@ device_parsers:
3645
3699
  # Polaroid/ Acho
3646
3700
  # @ref: http://polaroidstore.com/store/start.asp?category_id=382&category_id2=0&order=title&filter1=&filter2=&filter3=&view=all
3647
3701
  #########
3648
- - regex: '; *(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*)(\/[^;/]*|) Build/'
3702
+ - regex: '; *(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*?)(\/[^;/]*|)(?: Build|\) AppleWebKit)'
3649
3703
  device_replacement: '$1'
3650
3704
  brand_replacement: 'Polaroid'
3651
3705
  model_replacement: '$1'
3652
- - regex: '; *(?:Polaroid )(Tablet) Build/'
3706
+ - regex: '; *(?:Polaroid )(Tablet)(?: Build|\) AppleWebKit)'
3653
3707
  device_replacement: '$1'
3654
3708
  brand_replacement: 'Polaroid'
3655
3709
  model_replacement: '$1'
@@ -3668,11 +3722,11 @@ device_parsers:
3668
3722
  # Positivo
3669
3723
  # @ref: http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/
3670
3724
  #########
3671
- - regex: '; *(TB07STA|TB10STA|TB07FTA|TB10FTA) Build/'
3725
+ - regex: '; *(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\) AppleWebKit)'
3672
3726
  device_replacement: '$1'
3673
3727
  brand_replacement: 'Positivo'
3674
3728
  model_replacement: '$1'
3675
- - regex: '; *(?:Positivo |)((?:YPY|Ypy)[^;/]+) Build/'
3729
+ - regex: '; *(?:Positivo |)((?:YPY|Ypy)[^;/]+?)(?: Build|\) AppleWebKit)'
3676
3730
  device_replacement: '$1'
3677
3731
  brand_replacement: 'Positivo'
3678
3732
  model_replacement: '$1'
@@ -3682,15 +3736,15 @@ device_parsers:
3682
3736
  # @ref: http://www.pointofview-online.com/default2.php
3683
3737
  # @TODO: Smartphone Models MOB-3515, MOB-5045-B missing
3684
3738
  #########
3685
- - regex: '; *(MOB-[^;/]+) Build/'
3739
+ - regex: '; *(MOB-[^;/]+?)(?: Build|\) AppleWebKit)'
3686
3740
  device_replacement: '$1'
3687
3741
  brand_replacement: 'POV'
3688
3742
  model_replacement: '$1'
3689
- - regex: '; *POV[ _\-]([^;/]+) Build/'
3743
+ - regex: '; *POV[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3690
3744
  device_replacement: 'POV $1'
3691
3745
  brand_replacement: 'POV'
3692
3746
  model_replacement: '$1'
3693
- - regex: '; *((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*) Build/'
3747
+ - regex: '; *((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*)(?: Build|\) AppleWebKit)'
3694
3748
  device_replacement: 'POV $1'
3695
3749
  brand_replacement: 'POV'
3696
3750
  model_replacement: '$1'
@@ -3700,7 +3754,7 @@ device_parsers:
3700
3754
  # @ref: http://www.prestigio.com/catalogue/MultiPhones
3701
3755
  # @ref: http://www.prestigio.com/catalogue/MultiPads
3702
3756
  #########
3703
- - regex: '; *(?:Prestigio |)((?:PAP|PMP)\d[^;/]+) Build/'
3757
+ - regex: '; *(?:Prestigio |)((?:PAP|PMP)\d[^;/]+?)(?: Build|\) AppleWebKit)'
3704
3758
  device_replacement: 'Prestigio $1'
3705
3759
  brand_replacement: 'Prestigio'
3706
3760
  model_replacement: '$1'
@@ -3709,7 +3763,7 @@ device_parsers:
3709
3763
  # Proscan
3710
3764
  # @ref: http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr=
3711
3765
  #########
3712
- - regex: '; *(PLT[0-9]{4}.*) Build/'
3766
+ - regex: '; *(PLT[0-9]{4}.*?)(?: Build|\) AppleWebKit)'
3713
3767
  device_replacement: '$1'
3714
3768
  brand_replacement: 'Proscan'
3715
3769
  model_replacement: '$1'
@@ -3718,15 +3772,15 @@ device_parsers:
3718
3772
  # QMobile
3719
3773
  # @ref: http://www.qmobile.com.pk/
3720
3774
  #########
3721
- - regex: '; *(A2|A5|A8|A900)_?(Classic|) Build'
3775
+ - regex: '; *(A2|A5|A8|A900)_?(Classic|)(?: Build|\) AppleWebKit)'
3722
3776
  device_replacement: '$1 $2'
3723
3777
  brand_replacement: 'Qmobile'
3724
3778
  model_replacement: '$1 $2'
3725
- - regex: '; *(Q[Mm]obile)_([^_]+)_([^_]+) Build'
3779
+ - regex: '; *(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\) AppleWebKit)'
3726
3780
  device_replacement: 'Qmobile $2 $3'
3727
3781
  brand_replacement: 'Qmobile'
3728
3782
  model_replacement: '$2 $3'
3729
- - regex: '; *(Q\-?[Mm]obile)[_ ](A[^;/]+) Build'
3783
+ - regex: '; *(Q\-?[Mm]obile)[_ ](A[^;/]+?)(?: Build|\) AppleWebKit)'
3730
3784
  device_replacement: 'Qmobile $2'
3731
3785
  brand_replacement: 'Qmobile'
3732
3786
  model_replacement: '$2'
@@ -3735,11 +3789,11 @@ device_parsers:
3735
3789
  # Qmobilevn
3736
3790
  # @ref: http://qmobile.vn/san-pham.html
3737
3791
  #########
3738
- - regex: '; *(Q\-Smart)[ _]([^;/]+) Build/'
3792
+ - regex: '; *(Q\-Smart)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3739
3793
  device_replacement: '$1 $2'
3740
3794
  brand_replacement: 'Qmobilevn'
3741
3795
  model_replacement: '$2'
3742
- - regex: '; *(Q\-?[Mm]obile)[ _\-](S[^;/]+) Build/'
3796
+ - regex: '; *(Q\-?[Mm]obile)[ _\-](S[^;/]+?)(?: Build|\) AppleWebKit)'
3743
3797
  device_replacement: '$1 $2'
3744
3798
  brand_replacement: 'Qmobilevn'
3745
3799
  model_replacement: '$2'
@@ -3748,7 +3802,7 @@ device_parsers:
3748
3802
  # Quanta
3749
3803
  # @ref: ?
3750
3804
  #########
3751
- - regex: '; *(TA1013) Build'
3805
+ - regex: '; *(TA1013)(?: Build|\) AppleWebKit)'
3752
3806
  device_replacement: '$1'
3753
3807
  brand_replacement: 'Quanta'
3754
3808
  model_replacement: '$1'
@@ -3757,11 +3811,11 @@ device_parsers:
3757
3811
  # RCA
3758
3812
  # @ref: http://rcamobilephone.com/
3759
3813
  #########
3760
- - regex: '; (RCT\w+) Build/'
3814
+ - regex: '; (RCT\w+)(?: Build|\) AppleWebKit)'
3761
3815
  device_replacement: '$1'
3762
3816
  brand_replacement: 'RCA'
3763
3817
  model_replacement: '$1'
3764
- - regex: '; RCA (\w+) Build/'
3818
+ - regex: '; RCA (\w+)(?: Build|\) AppleWebKit)'
3765
3819
  device_replacement: 'RCA $1'
3766
3820
  brand_replacement: 'RCA'
3767
3821
  model_replacement: '$1'
@@ -3771,7 +3825,7 @@ device_parsers:
3771
3825
  # @ref: http://www.rock-chips.com/a/cn/product/index.html
3772
3826
  # @note: manufacturer sells chipsets - I assume that these UAs are dev-boards
3773
3827
  #########
3774
- - regex: '; *(RK\d+),? Build/'
3828
+ - regex: '; *(RK\d+),?(?: Build|\) AppleWebKit)'
3775
3829
  device_replacement: '$1'
3776
3830
  brand_replacement: 'Rockchip'
3777
3831
  model_replacement: '$1'
@@ -3842,11 +3896,11 @@ device_parsers:
3842
3896
  # @ref: http://www.sharp-phone.com/en/index.html
3843
3897
  # @ref: http://www.android.com/devices/?country=all&m=sharp
3844
3898
  #########
3845
- - regex: '; *(SH\-?\d\d[^;/]+|SBM\d[^;/]+) Build'
3899
+ - regex: '; *(SH\-?\d\d[^;/]+|SBM\d[^;/]+?)(?: Build|\) AppleWebKit)'
3846
3900
  device_replacement: '$1'
3847
3901
  brand_replacement: 'Sharp'
3848
3902
  model_replacement: '$1'
3849
- - regex: '; *(SHARP[ -])([^;/]+) Build'
3903
+ - regex: '; *(SHARP[ -])([^;/]+?)(?: Build|\) AppleWebKit)'
3850
3904
  device_replacement: '$1$2'
3851
3905
  brand_replacement: 'Sharp'
3852
3906
  model_replacement: '$2'
@@ -3855,15 +3909,15 @@ device_parsers:
3855
3909
  # Simvalley
3856
3910
  # @ref: http://www.simvalley-mobile.de/
3857
3911
  #########
3858
- - regex: '; *(SPX[_\-]\d[^;/]*) Build/'
3912
+ - regex: '; *(SPX[_\-]\d[^;/]*)(?: Build|\) AppleWebKit)'
3859
3913
  device_replacement: '$1'
3860
3914
  brand_replacement: 'Simvalley'
3861
3915
  model_replacement: '$1'
3862
- - regex: '; *(SX7\-PEARL\.GmbH) Build/'
3916
+ - regex: '; *(SX7\-PEARL\.GmbH)(?: Build|\) AppleWebKit)'
3863
3917
  device_replacement: '$1'
3864
3918
  brand_replacement: 'Simvalley'
3865
3919
  model_replacement: '$1'
3866
- - regex: '; *(SP[T]?\-\d{2}[^;/]*) Build/'
3920
+ - regex: '; *(SP[T]?\-\d{2}[^;/]*)(?: Build|\) AppleWebKit)'
3867
3921
  device_replacement: '$1'
3868
3922
  brand_replacement: 'Simvalley'
3869
3923
  model_replacement: '$1'
@@ -3873,7 +3927,7 @@ device_parsers:
3873
3927
  # @ref: http://www.sk-w.com/phone/phone_list.jsp
3874
3928
  # @ref: http://www.android.com/devices/?country=all&m=sk-telesys
3875
3929
  #########
3876
- - regex: '; *(SK\-.*) Build/'
3930
+ - regex: '; *(SK\-.*?)(?: Build|\) AppleWebKit)'
3877
3931
  device_replacement: '$1'
3878
3932
  brand_replacement: 'SKtelesys'
3879
3933
  model_replacement: '$1'
@@ -3882,11 +3936,11 @@ device_parsers:
3882
3936
  # Skytex
3883
3937
  # @ref: http://skytex.com/android
3884
3938
  #########
3885
- - regex: '; *(?:SKYTEX|SX)-([^;/]+) Build'
3939
+ - regex: '; *(?:SKYTEX|SX)-([^;/]+?)(?: Build|\) AppleWebKit)'
3886
3940
  device_replacement: '$1'
3887
3941
  brand_replacement: 'Skytex'
3888
3942
  model_replacement: '$1'
3889
- - regex: '; *(IMAGINE [^;/]+) Build'
3943
+ - regex: '; *(IMAGINE [^;/]+?)(?: Build|\) AppleWebKit)'
3890
3944
  device_replacement: '$1'
3891
3945
  brand_replacement: 'Skytex'
3892
3946
  model_replacement: '$1'
@@ -3896,7 +3950,7 @@ device_parsers:
3896
3950
  # @ref: http://en.smartdevices.com.cn/Products/
3897
3951
  # @models: Z8, X7, U7H, U7, T30, T20, Ten3, V5-II, T7-3G, SmartQ5, K7, S7, Q8, T19, Ten2, Ten, R10, T7, R7, V5, V7, SmartQ7
3898
3952
  #########
3899
- - regex: '; *(SmartQ) ?([^;/]+) Build/'
3953
+ - regex: '; *(SmartQ) ?([^;/]+?)(?: Build|\) AppleWebKit)'
3900
3954
  device_replacement: '$1 $2'
3901
3955
  brand_replacement: '$1'
3902
3956
  model_replacement: '$2'
@@ -3906,7 +3960,7 @@ device_parsers:
3906
3960
  # @ref: http://www.smartbitt.com/
3907
3961
  # @missing: SBT Useragents
3908
3962
  #########
3909
- - regex: '; *(WF7C|WF10C|SBT[^;/]+) Build'
3963
+ - regex: '; *(WF7C|WF10C|SBT[^;/]+?)(?: Build|\) AppleWebKit)'
3910
3964
  device_replacement: '$1'
3911
3965
  brand_replacement: 'Smartbitt'
3912
3966
  model_replacement: '$1'
@@ -3949,7 +4003,7 @@ device_parsers:
3949
4003
  device_replacement: 'Trekstor $1'
3950
4004
  brand_replacement: 'Trekstor'
3951
4005
  model_replacement: '$1'
3952
- - regex: '; *(ST\d{4}.*) Build/'
4006
+ - regex: '; *(ST\d{4}.*?)(?: Build|\) AppleWebKit)'
3953
4007
  device_replacement: 'Trekstor $1'
3954
4008
  brand_replacement: 'Trekstor'
3955
4009
  model_replacement: '$1'
@@ -3982,31 +4036,31 @@ device_parsers:
3982
4036
  # @ref: http://www.sonymobile.com/global-en/products/phones/
3983
4037
  # @ref: http://www.sony.jp/tablet/
3984
4038
  #########
3985
- - regex: '; Sony (Tablet[^;/]+) Build'
4039
+ - regex: '; Sony (Tablet[^;/]+?)(?: Build|\) AppleWebKit)'
3986
4040
  device_replacement: 'Sony $1'
3987
4041
  brand_replacement: 'Sony'
3988
4042
  model_replacement: '$1'
3989
- - regex: '; Sony ([^;/]+) Build'
4043
+ - regex: '; Sony ([^;/]+?)(?: Build|\) AppleWebKit)'
3990
4044
  device_replacement: 'Sony $1'
3991
4045
  brand_replacement: 'Sony'
3992
4046
  model_replacement: '$1'
3993
- - regex: '; *(Sony)([A-Za-z0-9\-]+) Build'
4047
+ - regex: '; *(Sony)([A-Za-z0-9\-]+)(?: Build|\) AppleWebKit)'
3994
4048
  device_replacement: '$1 $2'
3995
4049
  brand_replacement: '$1'
3996
4050
  model_replacement: '$2'
3997
- - regex: '; *(Xperia [^;/]+) Build'
4051
+ - regex: '; *(Xperia [^;/]+?)(?: Build|\) AppleWebKit)'
3998
4052
  device_replacement: '$1'
3999
4053
  brand_replacement: 'Sony'
4000
4054
  model_replacement: '$1'
4001
- - regex: '; *(C(?:1[0-9]|2[0-9]|53|55|6[0-9])[0-9]{2}|D[25]\d{3}|D6[56]\d{2}) Build'
4055
+ - regex: '; *(C(?:1[0-9]|2[0-9]|53|55|6[0-9])[0-9]{2}|D[25]\d{3}|D6[56]\d{2})(?: Build|\) AppleWebKit)'
4002
4056
  device_replacement: '$1'
4003
4057
  brand_replacement: 'Sony'
4004
4058
  model_replacement: '$1'
4005
- - regex: '; *(SGP\d{3}|SGPT\d{2}) Build'
4059
+ - regex: '; *(SGP\d{3}|SGPT\d{2})(?: Build|\) AppleWebKit)'
4006
4060
  device_replacement: '$1'
4007
4061
  brand_replacement: 'Sony'
4008
4062
  model_replacement: '$1'
4009
- - regex: '; *(NW-Z1000Series) Build'
4063
+ - regex: '; *(NW-Z1000Series)(?: Build|\) AppleWebKit)'
4010
4064
  device_replacement: '$1'
4011
4065
  brand_replacement: 'Sony'
4012
4066
  model_replacement: '$1'
@@ -4029,7 +4083,7 @@ device_parsers:
4029
4083
  # Spice
4030
4084
  # @ref: http://www.spicemobilephones.co.in/
4031
4085
  #########
4032
- - regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*) Build/'
4086
+ - regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*)(?: Build|\) AppleWebKit)'
4033
4087
  device_replacement: '$1$2$3$4'
4034
4088
  brand_replacement: 'Spice'
4035
4089
  model_replacement: 'Mi$4'
@@ -4051,7 +4105,7 @@ device_parsers:
4051
4105
  # Tagi
4052
4106
  # @ref: ??
4053
4107
  #########
4054
- - regex: '; *(TAGI[ ]?)(MID) ?([^;/]+) Build/'
4108
+ - regex: '; *(TAGI[ ]?)(MID) ?([^;/]+?)(?: Build|\) AppleWebKit)'
4055
4109
  device_replacement: '$1$2$3'
4056
4110
  brand_replacement: 'Tagi'
4057
4111
  model_replacement: '$2$3'
@@ -4060,7 +4114,7 @@ device_parsers:
4060
4114
  # Tecmobile
4061
4115
  # @ref: http://www.tecmobile.com/
4062
4116
  #########
4063
- - regex: '; *(Oyster500|Opal 800) Build'
4117
+ - regex: '; *(Oyster500|Opal 800)(?: Build|\) AppleWebKit)'
4064
4118
  device_replacement: 'Tecmobile $1'
4065
4119
  brand_replacement: 'Tecmobile'
4066
4120
  model_replacement: '$1'
@@ -4069,7 +4123,7 @@ device_parsers:
4069
4123
  # Tecno
4070
4124
  # @ref: www.tecno-mobile.com/‎
4071
4125
  #########
4072
- - regex: '; *(TECNO[ _])([^;/]+) Build/'
4126
+ - regex: '; *(TECNO[ _])([^;/]+?)(?: Build|\) AppleWebKit)'
4073
4127
  device_replacement: '$1$2'
4074
4128
  brand_replacement: 'Tecno'
4075
4129
  model_replacement: '$2'
@@ -4089,7 +4143,7 @@ device_parsers:
4089
4143
  # @ref: http://www.telstra.com.au/home-phone/thub-2/
4090
4144
  # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
4091
4145
  #########
4092
- - regex: '; *(T-Hub2) Build/'
4146
+ - regex: '; *(T-Hub2)(?: Build|\) AppleWebKit)'
4093
4147
  device_replacement: '$1'
4094
4148
  brand_replacement: 'Telstra'
4095
4149
  model_replacement: '$1'
@@ -4098,7 +4152,7 @@ device_parsers:
4098
4152
  # Terra
4099
4153
  # @ref: http://www.wortmann.de/
4100
4154
  #########
4101
- - regex: '; *(PAD) ?(100[12]) Build/'
4155
+ - regex: '; *(PAD) ?(100[12])(?: Build|\) AppleWebKit)'
4102
4156
  device_replacement: 'Terra $1$2'
4103
4157
  brand_replacement: 'Terra'
4104
4158
  model_replacement: '$1$2'
@@ -4107,7 +4161,7 @@ device_parsers:
4107
4161
  # Texet
4108
4162
  # @ref: http://www.texet.ru/tablet/
4109
4163
  #########
4110
- - regex: '; *(T[BM]-\d{3}[^;/]+) Build/'
4164
+ - regex: '; *(T[BM]-\d{3}[^;/]+?)(?: Build|\) AppleWebKit)'
4111
4165
  device_replacement: '$1'
4112
4166
  brand_replacement: 'Texet'
4113
4167
  model_replacement: '$1'
@@ -4116,7 +4170,7 @@ device_parsers:
4116
4170
  # Thalia
4117
4171
  # @ref: http://www.thalia.de/shop/tolino-shine-ereader/show/
4118
4172
  #########
4119
- - regex: '; *(tolino [^;/]+) Build'
4173
+ - regex: '; *(tolino [^;/]+?)(?: Build|\) AppleWebKit)'
4120
4174
  device_replacement: '$1'
4121
4175
  brand_replacement: 'Thalia'
4122
4176
  model_replacement: '$1'
@@ -4130,11 +4184,11 @@ device_parsers:
4130
4184
  # @ref: http://en.thl.com.cn/Mobile
4131
4185
  # @ref: http://thlmobilestore.com
4132
4186
  #########
4133
- - regex: '; *(?:CJ[ -])?(ThL|THL)[ -]([^;/]+) Build/'
4187
+ - regex: '; *(?:CJ[ -])?(ThL|THL)[ -]([^;/]+?)(?: Build|\) AppleWebKit)'
4134
4188
  device_replacement: '$1 $2'
4135
4189
  brand_replacement: 'Thl'
4136
4190
  model_replacement: '$2'
4137
- - regex: '; *(T100|T200|T5|W100|W200|W8s) Build/'
4191
+ - regex: '; *(T100|T200|T5|W100|W200|W8s)(?: Build|\) AppleWebKit)'
4138
4192
  device_replacement: '$1'
4139
4193
  brand_replacement: 'Thl'
4140
4194
  model_replacement: '$1'
@@ -4185,7 +4239,7 @@ device_parsers:
4185
4239
  # Tomtec
4186
4240
  # @ref: http://www.tom-tec.eu/pages/tablets.php
4187
4241
  #########
4188
- - regex: ' (ATP[0-9]{4}) Build'
4242
+ - regex: ' (ATP[0-9]{4})(?: Build|\) AppleWebKit)'
4189
4243
  device_replacement: '$1'
4190
4244
  brand_replacement: 'Tomtec'
4191
4245
  model_replacement: '$1'
@@ -4194,7 +4248,7 @@ device_parsers:
4194
4248
  # Tooky
4195
4249
  # @ref: http://www.tookymobile.com/
4196
4250
  #########
4197
- - regex: ' *(TOOKY)[ _\-]([^;/]+) ?(?:Build|;)'
4251
+ - regex: ' *(TOOKY)[ _\-]([^;/]+?) ?(?:Build|;)'
4198
4252
  regex_flag: 'i'
4199
4253
  device_replacement: '$1 $2'
4200
4254
  brand_replacement: 'Tooky'
@@ -4209,11 +4263,11 @@ device_parsers:
4209
4263
  device_replacement: '$1'
4210
4264
  brand_replacement: 'Toshiba'
4211
4265
  model_replacement: 'Folio 100'
4212
- - regex: '; *([Ff]olio ?100) Build/'
4266
+ - regex: '; *([Ff]olio ?100)(?: Build|\) AppleWebKit)'
4213
4267
  device_replacement: '$1'
4214
4268
  brand_replacement: 'Toshiba'
4215
4269
  model_replacement: 'Folio 100'
4216
- - regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive) Build/'
4270
+ - regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive)(?: Build|\) AppleWebKit)'
4217
4271
  device_replacement: 'Toshiba $1'
4218
4272
  brand_replacement: 'Toshiba'
4219
4273
  model_replacement: '$1'
@@ -4222,12 +4276,12 @@ device_parsers:
4222
4276
  # Touchmate
4223
4277
  # @ref: http://touchmatepc.com/new/
4224
4278
  #########
4225
- - regex: '; *(TM-MID\d+[^;/]+|TOUCHMATE|MID-750) Build'
4279
+ - regex: '; *(TM-MID\d+[^;/]+|TOUCHMATE|MID-750)(?: Build|\) AppleWebKit)'
4226
4280
  device_replacement: '$1'
4227
4281
  brand_replacement: 'Touchmate'
4228
4282
  model_replacement: '$1'
4229
4283
  # @todo: needs verification user-agents missing
4230
- - regex: '; *(TM-SM\d+[^;/]+) Build'
4284
+ - regex: '; *(TM-SM\d+[^;/]+?)(?: Build|\) AppleWebKit)'
4231
4285
  device_replacement: '$1'
4232
4286
  brand_replacement: 'Touchmate'
4233
4287
  model_replacement: '$1'
@@ -4236,11 +4290,11 @@ device_parsers:
4236
4290
  # Treq
4237
4291
  # @ref: http://www.treq.co.id/product
4238
4292
  #########
4239
- - regex: '; *(A10 [Bb]asic2?) Build/'
4293
+ - regex: '; *(A10 [Bb]asic2?)(?: Build|\) AppleWebKit)'
4240
4294
  device_replacement: '$1'
4241
4295
  brand_replacement: 'Treq'
4242
4296
  model_replacement: '$1'
4243
- - regex: '; *(TREQ[ _\-])([^;/]+) Build'
4297
+ - regex: '; *(TREQ[ _\-])([^;/]+?)(?: Build|\) AppleWebKit)'
4244
4298
  regex_flag: 'i'
4245
4299
  device_replacement: '$1$2'
4246
4300
  brand_replacement: 'Treq'
@@ -4252,12 +4306,12 @@ device_parsers:
4252
4306
  # @models: A936|A603|X-5|X-3
4253
4307
  #########
4254
4308
  # @todo: guessed markers
4255
- - regex: '; *(X-?5|X-?3) Build/'
4309
+ - regex: '; *(X-?5|X-?3)(?: Build|\) AppleWebKit)'
4256
4310
  device_replacement: '$1'
4257
4311
  brand_replacement: 'Umeox'
4258
4312
  model_replacement: '$1'
4259
4313
  # @todo: guessed markers
4260
- - regex: '; *(A502\+?|A936|A603|X1|X2) Build/'
4314
+ - regex: '; *(A502\+?|A936|A603|X1|X2)(?: Build|\) AppleWebKit)'
4261
4315
  device_replacement: '$1'
4262
4316
  brand_replacement: 'Umeox'
4263
4317
  model_replacement: '$1'
@@ -4266,7 +4320,7 @@ device_parsers:
4266
4320
  # Versus
4267
4321
  # @ref: http://versusuk.com/support.html
4268
4322
  #########
4269
- - regex: '(TOUCH(?:TAB|PAD).+?) Build/'
4323
+ - regex: '(TOUCH(?:TAB|PAD).+?)(?: Build|\) AppleWebKit)'
4270
4324
  regex_flag: 'i'
4271
4325
  device_replacement: 'Versus $1'
4272
4326
  brand_replacement: 'Versus'
@@ -4276,7 +4330,7 @@ device_parsers:
4276
4330
  # Vertu
4277
4331
  # @ref: http://www.vertu.com/
4278
4332
  #########
4279
- - regex: '(VERTU) ([^;/]+) Build/'
4333
+ - regex: '(VERTU) ([^;/]+?)(?: Build|\) AppleWebKit)'
4280
4334
  device_replacement: '$1 $2'
4281
4335
  brand_replacement: 'Vertu'
4282
4336
  model_replacement: '$2'
@@ -4285,11 +4339,11 @@ device_parsers:
4285
4339
  # Videocon
4286
4340
  # @ref: http://www.videoconmobiles.com
4287
4341
  #########
4288
- - regex: '; *(Videocon)[ _\-]([^;/]+) *(?:Build|;)'
4342
+ - regex: '; *(Videocon)[ _\-]([^;/]+?) *(?:Build|;)'
4289
4343
  device_replacement: '$1 $2'
4290
4344
  brand_replacement: 'Videocon'
4291
4345
  model_replacement: '$2'
4292
- - regex: ' (VT\d{2}[A-Za-z]*) Build'
4346
+ - regex: ' (VT\d{2}[A-Za-z]*)(?: Build|\) AppleWebKit)'
4293
4347
  device_replacement: '$1'
4294
4348
  brand_replacement: 'Videocon'
4295
4349
  model_replacement: '$1'
@@ -4298,15 +4352,15 @@ device_parsers:
4298
4352
  # Viewsonic
4299
4353
  # @ref: http://viewsonic.com
4300
4354
  #########
4301
- - regex: '; *((?:ViewPad|ViewPhone|VSD)[^;/]+) Build/'
4355
+ - regex: '; *((?:ViewPad|ViewPhone|VSD)[^;/]+?)(?: Build|\) AppleWebKit)'
4302
4356
  device_replacement: '$1'
4303
4357
  brand_replacement: 'Viewsonic'
4304
4358
  model_replacement: '$1'
4305
- - regex: '; *(ViewSonic-)([^;/]+) Build/'
4359
+ - regex: '; *(ViewSonic-)([^;/]+?)(?: Build|\) AppleWebKit)'
4306
4360
  device_replacement: '$1$2'
4307
4361
  brand_replacement: 'Viewsonic'
4308
4362
  model_replacement: '$2'
4309
- - regex: '; *(GTablet.*) Build/'
4363
+ - regex: '; *(GTablet.*?)(?: Build|\) AppleWebKit)'
4310
4364
  device_replacement: '$1'
4311
4365
  brand_replacement: 'Viewsonic'
4312
4366
  model_replacement: '$1'
@@ -4315,7 +4369,7 @@ device_parsers:
4315
4369
  # vivo
4316
4370
  # @ref: http://vivo.cn/
4317
4371
  #########
4318
- - regex: '; *([Vv]ivo)[ _]([^;/]+) Build'
4372
+ - regex: '; *([Vv]ivo)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4319
4373
  device_replacement: '$1 $2'
4320
4374
  brand_replacement: 'vivo'
4321
4375
  model_replacement: '$2'
@@ -4324,7 +4378,7 @@ device_parsers:
4324
4378
  # Vodafone (Operator Branded Devices)
4325
4379
  # @ref: ??
4326
4380
  #########
4327
- - regex: '(Vodafone) (.*) Build/'
4381
+ - regex: '(Vodafone) (.*?)(?: Build|\) AppleWebKit)'
4328
4382
  device_replacement: '$1 $2'
4329
4383
  brand_replacement: '$1'
4330
4384
  model_replacement: '$2'
@@ -4333,7 +4387,7 @@ device_parsers:
4333
4387
  # Walton
4334
4388
  # @ref: http://www.waltonbd.com/
4335
4389
  #########
4336
- - regex: '; *(?:Walton[ _\-]|)(Primo[ _\-][^;/]+) Build'
4390
+ - regex: '; *(?:Walton[ _\-]|)(Primo[ _\-][^;/]+?)(?: Build|\) AppleWebKit)'
4337
4391
  regex_flag: 'i'
4338
4392
  device_replacement: 'Walton $1'
4339
4393
  brand_replacement: 'Walton'
@@ -4343,7 +4397,7 @@ device_parsers:
4343
4397
  # Wiko
4344
4398
  # @ref: http://fr.wikomobile.com/collection.php?s=Smartphones
4345
4399
  #########
4346
- - regex: '; *(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+) Build/'
4400
+ - regex: '; *(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+?)(?: Build|\) AppleWebKit)'
4347
4401
  regex_flag: 'i'
4348
4402
  device_replacement: 'Wiko $1'
4349
4403
  brand_replacement: 'Wiko'
@@ -4353,7 +4407,7 @@ device_parsers:
4353
4407
  # WellcoM
4354
4408
  # @ref: ??
4355
4409
  #########
4356
- - regex: '; *WellcoM-([^;/]+) Build'
4410
+ - regex: '; *WellcoM-([^;/]+?)(?: Build|\) AppleWebKit)'
4357
4411
  device_replacement: 'Wellcom $1'
4358
4412
  brand_replacement: 'Wellcom'
4359
4413
  model_replacement: '$1'
@@ -4371,7 +4425,7 @@ device_parsers:
4371
4425
  # Wolfgang
4372
4426
  # @ref: http://wolfgangmobile.com/
4373
4427
  #########
4374
- - regex: '; *(AT-AS[^;/]+) Build'
4428
+ - regex: '; *(AT-AS[^;/]+?)(?: Build|\) AppleWebKit)'
4375
4429
  device_replacement: 'Wolfgang $1'
4376
4430
  brand_replacement: 'Wolfgang'
4377
4431
  model_replacement: '$1'
@@ -4380,7 +4434,7 @@ device_parsers:
4380
4434
  # Woxter
4381
4435
  # @ref: http://www.woxter.es/es-es/categories/index
4382
4436
  #########
4383
- - regex: '; *(?:Woxter|Wxt) ([^;/]+) Build'
4437
+ - regex: '; *(?:Woxter|Wxt) ([^;/]+?)(?: Build|\) AppleWebKit)'
4384
4438
  device_replacement: 'Woxter $1'
4385
4439
  brand_replacement: 'Woxter'
4386
4440
  model_replacement: '$1'
@@ -4389,7 +4443,7 @@ device_parsers:
4389
4443
  # Yarvik Zania
4390
4444
  # @ref: http://yarvik.com
4391
4445
  #########
4392
- - regex: '; *(?:Xenta |Luna |)(TAB[234][0-9]{2}|TAB0[78]-\d{3}|TAB0?9-\d{3}|TAB1[03]-\d{3}|SMP\d{2}-\d{3}) Build/'
4446
+ - regex: '; *(?:Xenta |Luna |)(TAB[234][0-9]{2}|TAB0[78]-\d{3}|TAB0?9-\d{3}|TAB1[03]-\d{3}|SMP\d{2}-\d{3})(?: Build|\) AppleWebKit)'
4393
4447
  device_replacement: 'Yarvik $1'
4394
4448
  brand_replacement: 'Yarvik'
4395
4449
  model_replacement: '$1'
@@ -4433,17 +4487,17 @@ device_parsers:
4433
4487
  # Xolo
4434
4488
  # @ref: http://www.xolo.in/
4435
4489
  #########
4436
- - regex: '; *XOLO[ _]([^;/]*tab.*) Build'
4490
+ - regex: '; *XOLO[ _]([^;/]*tab.*)(?: Build|\) AppleWebKit)'
4437
4491
  regex_flag: 'i'
4438
4492
  device_replacement: 'Xolo $1'
4439
4493
  brand_replacement: 'Xolo'
4440
4494
  model_replacement: '$1'
4441
- - regex: '; *XOLO[ _]([^;/]+) Build'
4495
+ - regex: '; *XOLO[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4442
4496
  regex_flag: 'i'
4443
4497
  device_replacement: 'Xolo $1'
4444
4498
  brand_replacement: 'Xolo'
4445
4499
  model_replacement: '$1'
4446
- - regex: '; *(q\d0{2,3}[a-z]?) Build'
4500
+ - regex: '; *(q\d0{2,3}[a-z]?)(?: Build|\) AppleWebKit)'
4447
4501
  regex_flag: 'i'
4448
4502
  device_replacement: 'Xolo $1'
4449
4503
  brand_replacement: 'Xolo'
@@ -4453,7 +4507,7 @@ device_parsers:
4453
4507
  # Xoro
4454
4508
  # @ref: http://www.xoro.de/produkte/
4455
4509
  #########
4456
- - regex: '; *(PAD ?[79]\d+[^;/]*|TelePAD\d+[^;/]) Build'
4510
+ - regex: '; *(PAD ?[79]\d+[^;/]*|TelePAD\d+[^;/])(?: Build|\) AppleWebKit)'
4457
4511
  device_replacement: 'Xoro $1'
4458
4512
  brand_replacement: 'Xoro'
4459
4513
  model_replacement: '$1'
@@ -4462,7 +4516,7 @@ device_parsers:
4462
4516
  # Zopo
4463
4517
  # @ref: http://www.zopomobiles.com/products.html
4464
4518
  #########
4465
- - regex: '; *(?:(?:ZOPO|Zopo)[ _]([^;/]+)|(ZP ?(?:\d{2}[^;/]+|C2))|(C[2379])) Build'
4519
+ - regex: '; *(?:(?:ZOPO|Zopo)[ _]([^;/]+?)|(ZP ?(?:\d{2}[^;/]+|C2))|(C[2379]))(?: Build|\) AppleWebKit)'
4466
4520
  device_replacement: '$1$2$3'
4467
4521
  brand_replacement: 'Zopo'
4468
4522
  model_replacement: '$1$2$3'
@@ -4471,11 +4525,11 @@ device_parsers:
4471
4525
  # ZiiLabs
4472
4526
  # @ref: http://www.ziilabs.com/products/platforms/androidreferencetablets.php
4473
4527
  #########
4474
- - regex: '; *(ZiiLABS) (Zii[^;/]*) Build'
4528
+ - regex: '; *(ZiiLABS) (Zii[^;/]*)(?: Build|\) AppleWebKit)'
4475
4529
  device_replacement: '$1 $2'
4476
4530
  brand_replacement: 'ZiiLabs'
4477
4531
  model_replacement: '$2'
4478
- - regex: '; *(Zii)_([^;/]*) Build'
4532
+ - regex: '; *(Zii)_([^;/]*)(?: Build|\) AppleWebKit)'
4479
4533
  device_replacement: '$1 $2'
4480
4534
  brand_replacement: 'ZiiLabs'
4481
4535
  model_replacement: '$2'
@@ -4484,40 +4538,40 @@ device_parsers:
4484
4538
  # ZTE
4485
4539
  # @ref: http://www.ztedevices.com/
4486
4540
  #########
4487
- - regex: '; *(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]*|Era|Memo[^;]*)|JOE|(?:Kis|KIS)\b[^;]*|Libra|Light [^;]*|N8[056][01]|N850L|N8000|N9[15]\d{2}|N9810|NX501|Optik|(?:Vip )Racer[^;]*|RacerII|RACERII|San Francisco[^;]*|V9[AC]|V55|V881|Z[679][0-9]{2}[A-z]?) Build'
4541
+ - regex: '; *(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]*?|Era|Memo[^;]*?)|JOE|(?:Kis|KIS)\b[^;]*?|Libra|Light [^;]*?|N8[056][01]|N850L|N8000|N9[15]\d{2}|N9810|NX501|Optik|(?:Vip )Racer[^;]*?|RacerII|RACERII|San Francisco[^;]*?|V9[AC]|V55|V881|Z[679][0-9]{2}[A-z]?)(?: Build|\) AppleWebKit)'
4488
4542
  device_replacement: '$1'
4489
4543
  brand_replacement: 'ZTE'
4490
4544
  model_replacement: '$1'
4491
- - regex: '; *([A-Z]\d+)_USA_[^;]* Build'
4545
+ - regex: '; *([A-Z]\d+)_USA_[^;]*(?: Build|\) AppleWebKit)'
4492
4546
  device_replacement: '$1'
4493
4547
  brand_replacement: 'ZTE'
4494
4548
  model_replacement: '$1'
4495
- - regex: '; *(SmartTab\d+)[^;]* Build'
4549
+ - regex: '; *(SmartTab\d+)[^;]*(?: Build|\) AppleWebKit)'
4496
4550
  device_replacement: '$1'
4497
4551
  brand_replacement: 'ZTE'
4498
4552
  model_replacement: '$1'
4499
- - regex: '; *(?:Blade|BLADE|ZTE-BLADE)([^;/]*) Build'
4553
+ - regex: '; *(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\) AppleWebKit)'
4500
4554
  device_replacement: 'ZTE Blade$1'
4501
4555
  brand_replacement: 'ZTE'
4502
4556
  model_replacement: 'Blade$1'
4503
- - regex: '; *(?:Skate|SKATE|ZTE-SKATE)([^;/]*) Build'
4557
+ - regex: '; *(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\) AppleWebKit)'
4504
4558
  device_replacement: 'ZTE Skate$1'
4505
4559
  brand_replacement: 'ZTE'
4506
4560
  model_replacement: 'Skate$1'
4507
- - regex: '; *(Orange |Optimus )(Monte Carlo|San Francisco) Build'
4561
+ - regex: '; *(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\) AppleWebKit)'
4508
4562
  device_replacement: '$1$2'
4509
4563
  brand_replacement: 'ZTE'
4510
4564
  model_replacement: '$1$2'
4511
- - regex: '; *(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]+) Build'
4565
+ - regex: '; *(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]+?)(?: Build|\) AppleWebKit)'
4512
4566
  device_replacement: 'ZTE $1'
4513
4567
  brand_replacement: 'ZTE'
4514
4568
  model_replacement: '$1'
4515
4569
  # operator specific
4516
- - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]*) Build'
4570
+ - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]*?)(?: Build|\) AppleWebKit)'
4517
4571
  device_replacement: '$1 $2'
4518
4572
  brand_replacement: 'ZTE'
4519
4573
  model_replacement: '$1 $2'
4520
- - regex: '; (Avea inTouch 2|soft stone|tmn smart a7|Movistar[ _]Link) Build'
4574
+ - regex: '; (Avea inTouch 2|soft stone|tmn smart a7|Movistar[ _]Link)(?: Build|\) AppleWebKit)'
4521
4575
  regex_flag: 'i'
4522
4576
  device_replacement: '$1'
4523
4577
  brand_replacement: 'ZTE'
@@ -4531,7 +4585,7 @@ device_parsers:
4531
4585
  # Zync
4532
4586
  # @ref: http://www.zync.in/index.php/our-products/tablet-phablets
4533
4587
  ##########
4534
- - regex: '; ?(Cloud[ _]Z5|z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900) Build/'
4588
+ - regex: '; ?(Cloud[ _]Z5|z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900)(?: Build|\) AppleWebKit)'
4535
4589
  device_replacement: '$1'
4536
4590
  brand_replacement: 'Zync'
4537
4591
  model_replacement: '$1'
@@ -4751,7 +4805,7 @@ device_parsers:
4751
4805
  #########
4752
4806
  # Firefox OS
4753
4807
  #########
4754
- - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+)(?:/[^;]+|); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
4808
+ - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+?)(?:/[^;]+|); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
4755
4809
  device_replacement: 'Alcatel $1 $2 $3'
4756
4810
  brand_replacement: 'Alcatel'
4757
4811
  model_replacement: 'One Touch $3'
@@ -4760,11 +4814,27 @@ device_parsers:
4760
4814
  brand_replacement: 'ZTE'
4761
4815
  model_replacement: '$1$2'
4762
4816
 
4817
+ #########
4818
+ # KaiOS
4819
+ #########
4820
+ - regex: '\(Mobile; ALCATEL([A-Za-z0-9\-]+); rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KaiOS/'
4821
+ device_replacement: 'Alcatel $1'
4822
+ brand_replacement: 'Alcatel'
4823
+ model_replacement: '$1'
4824
+ - regex: '\(Mobile; LYF\/([A-Za-z0-9\-]+)\/.+;.+rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KAIOS/'
4825
+ device_replacement: 'LYF $1'
4826
+ brand_replacement: 'LYF'
4827
+ model_replacement: '$1'
4828
+ - regex: '\(Mobile; Nokia_([A-Za-z0-9\-]+)_.+; rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KAIOS/'
4829
+ device_replacement: 'Nokia $1'
4830
+ brand_replacement: 'Nokia'
4831
+ model_replacement: '$1'
4832
+
4763
4833
  ##########
4764
4834
  # NOKIA
4765
4835
  # @note: NokiaN8-00 comes before iphone. Sometimes spoofs iphone
4766
4836
  ##########
4767
- - regex: 'Nokia(N[0-9]+)([A-z_\-][A-z0-9_\-]*)'
4837
+ - regex: 'Nokia(N[0-9]+)([A-Za-z_\-][A-Za-z0-9_\-]*)'
4768
4838
  device_replacement: 'Nokia $1'
4769
4839
  brand_replacement: 'Nokia'
4770
4840
  model_replacement: '$1$2'
@@ -4777,7 +4847,7 @@ device_parsers:
4777
4847
  brand_replacement: 'Nokia'
4778
4848
  model_replacement: 'Lumia $1'
4779
4849
  # UCWEB Browser on Symbian
4780
- - regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]+)\)'
4850
+ - regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]+?)\)'
4781
4851
  device_replacement: '$1 $2'
4782
4852
  brand_replacement: '$1'
4783
4853
  model_replacement: '$2'
@@ -5309,7 +5379,13 @@ device_parsers:
5309
5379
  - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *\-?[A-Za-z]{2}; *(.+?)( Build[/ ]|\))'
5310
5380
  brand_replacement: 'Generic_Android'
5311
5381
  model_replacement: '$1'
5312
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|)(?:;.*|); *(.+?)( Build[/ ]|\))'
5382
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\) AppleWebKit).+? Mobile Safari'
5383
+ brand_replacement: 'Generic_Android'
5384
+ model_replacement: '$1'
5385
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\) AppleWebKit).+? Safari'
5386
+ brand_replacement: 'Generic_Android_Tablet'
5387
+ model_replacement: '$1'
5388
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\))'
5313
5389
  brand_replacement: 'Generic_Android'
5314
5390
  model_replacement: '$1'
5315
5391
 
@@ -5354,9 +5430,9 @@ device_parsers:
5354
5430
  model_replacement: 'Smartphone'
5355
5431
 
5356
5432
  ##########
5357
- # Spiders (this is hack...)
5433
+ # Spiders (this is a hack...)
5358
5434
  ##########
5359
- - regex: '(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.*/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti)'
5435
+ - regex: '(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.*/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti|OgScrper)'
5360
5436
  regex_flag: 'i'
5361
5437
  device_replacement: 'Spider'
5362
5438
  brand_replacement: 'Spider'