Matomo Analytics – Ethical Stats. Powerful Insights. - Version 4.0.3

Version Description

Download this release

Release Info

Developer matomoteam
Plugin Icon 128x128 Matomo Analytics – Ethical Stats. Powerful Insights.
Version 4.0.3
Comparing to
See all releases

Code changes from version 4.0.2 to 4.0.3

Files changed (59) hide show
  1. app/config/global.ini.php +4 -0
  2. app/core/CronArchive.php +73 -6
  3. app/core/CronArchive/QueueConsumer.php +3 -1
  4. app/core/CronArchive/SegmentArchiving.php +13 -3
  5. app/core/DataAccess/Model.php +45 -20
  6. app/core/Db/BatchInsert.php +4 -0
  7. app/core/Plugin/Controller.php +1 -6
  8. app/core/Updates/4.0.0-b1.php +120 -44
  9. app/core/Updates/4.0.0-b3.php +60 -0
  10. app/core/Updates/4.0.0-rc3.php +44 -0
  11. app/core/Updates/4.0.0-rc4.php +68 -0
  12. app/core/Updates/4.0.1-b1.php +56 -0
  13. app/core/Updates/4.0.4-b1.php +64 -0
  14. app/core/Url.php +25 -18
  15. app/core/Version.php +1 -1
  16. app/lang/de.json +3 -3
  17. app/lang/en.json +1 -0
  18. app/lang/zh-tw.json +11 -11
  19. app/plugins/DevicesDetection/functions.php +1 -0
  20. app/plugins/Morpheus/icons/dist/devices/peripheral.png +0 -0
  21. app/plugins/PagePerformance/Tracker/PerformanceDataProcessor.php +7 -7
  22. app/plugins/ScheduledReports/config/tcpdf_config.php +6 -11
  23. app/plugins/TagManager/Dao/TagsDao.php +1 -7
  24. app/plugins/TagManager/Template/BaseTemplate.php +4 -1
  25. app/plugins/TagManager/config/config.php +1 -0
  26. app/plugins/TagManager/config/test.php +2 -1
  27. app/vendor/autoload.php +1 -1
  28. app/vendor/composer/InstalledVersions.php +10 -10
  29. app/vendor/composer/autoload_classmap.php +1 -0
  30. app/vendor/composer/autoload_real.php +7 -7
  31. app/vendor/composer/autoload_static.php +7 -6
  32. app/vendor/composer/installed.json +6 -6
  33. app/vendor/composer/installed.php +10 -10
  34. app/vendor/matomo/device-detector/.yamllint +11 -0
  35. app/vendor/matomo/device-detector/DeviceDetector.php +1 -1
  36. app/vendor/matomo/device-detector/Parser/AbstractParser.php +1 -1
  37. app/vendor/matomo/device-detector/Parser/Client/Browser.php +25 -5
  38. app/vendor/matomo/device-detector/Parser/Device/AbstractDeviceParser.php +28 -2
  39. app/vendor/matomo/device-detector/Parser/OperatingSystem.php +4 -2
  40. app/vendor/matomo/device-detector/README.md +4 -4
  41. app/vendor/matomo/device-detector/regexes/bots.yml +3 -3
  42. app/vendor/matomo/device-detector/regexes/client/browser_engine.yml +3 -3
  43. app/vendor/matomo/device-detector/regexes/client/browsers.yml +122 -17
  44. app/vendor/matomo/device-detector/regexes/client/feed_readers.yml +1 -1
  45. app/vendor/matomo/device-detector/regexes/client/mediaplayers.yml +1 -1
  46. app/vendor/matomo/device-detector/regexes/client/pim.yml +1 -1
  47. app/vendor/matomo/device-detector/regexes/device/cameras.yml +5 -5
  48. app/vendor/matomo/device-detector/regexes/device/consoles.yml +6 -0
  49. app/vendor/matomo/device-detector/regexes/device/mobiles.yml +1449 -823
  50. app/vendor/matomo/device-detector/regexes/device/portable_media_player.yml +1 -1
  51. app/vendor/matomo/device-detector/regexes/device/televisions.yml +1 -1
  52. app/vendor/matomo/device-detector/regexes/oss.yml +75 -78
  53. assets/js/asset_manager_core_js.js +2 -2
  54. classes/WpMatomo.php +9 -1
  55. classes/WpMatomo/Admin/Admin.php +4 -2
  56. classes/WpMatomo/Admin/SystemReport.php +27 -13
  57. classes/WpMatomo/Email.php +2 -1
  58. matomo.php +2 -2
  59. readme.txt +1 -1
app/config/global.ini.php CHANGED
@@ -395,6 +395,10 @@ hash_algorithm = whirlpool
395
  ; it is recommended for security reasons to always use Matomo over https
396
  force_ssl = 0
397
 
 
 
 
 
398
  ; Session garbage collection on (as on some operating systems, i.e. Debian, it may be off by default)
399
  session_gc_probability = 1
400
 
395
  ; it is recommended for security reasons to always use Matomo over https
396
  force_ssl = 0
397
 
398
+ ; If set to 1 Matomo will prefer using SERVER_NAME variable over HTTP_HOST.
399
+ ; This can add an additional layer of security as SERVER_NAME can not be manipulated by sending custom host headers when configure correctly.
400
+ host_validation_use_server_name = 0
401
+
402
  ; Session garbage collection on (as on some operating systems, i.e. Debian, it may be off by default)
403
  session_gc_probability = 1
404
 
app/core/CronArchive.php CHANGED
@@ -485,9 +485,10 @@ class CronArchive
485
 
486
  $this->logArchiveJobFinished($url, $timers[$index], $visitsForPeriod, $archivesBeingQueried[$index]['plugin'], $archivesBeingQueried[$index]['report']);
487
 
488
- // TODO: do in ArchiveWriter
489
  $this->deleteInvalidatedArchives($archivesBeingQueried[$index]);
490
 
 
 
491
  ++$successCount;
492
  }
493
 
@@ -764,11 +765,6 @@ class CronArchive
764
 
765
  public function invalidateArchivedReportsForSitesThatNeedToBeArchivedAgain($idSiteToInvalidate)
766
  {
767
- if ($this->model->isInvalidationsScheduledForSite($idSiteToInvalidate)) {
768
- $this->logger->debug("Invalidations currently exist for idSite $idSiteToInvalidate, skipping invalidating for now...");
769
- return;
770
- }
771
-
772
  if (empty($this->segmentArchiving)) {
773
  // might not be initialised if init is not called
774
  $this->segmentArchiving = new SegmentArchiving($this->processNewSegmentsFrom, $this->dateLastForced);
@@ -938,6 +934,77 @@ class CronArchive
938
  return !empty($idArchive);
939
  }
940
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
941
  private function setInvalidationTime()
942
  {
943
  $cache = Cache::getTransientCache();
485
 
486
  $this->logArchiveJobFinished($url, $timers[$index], $visitsForPeriod, $archivesBeingQueried[$index]['plugin'], $archivesBeingQueried[$index]['report']);
487
 
 
488
  $this->deleteInvalidatedArchives($archivesBeingQueried[$index]);
489
 
490
+ $this->repairInvalidationsIfNeeded($archivesBeingQueried[$index]);
491
+
492
  ++$successCount;
493
  }
494
 
765
 
766
  public function invalidateArchivedReportsForSitesThatNeedToBeArchivedAgain($idSiteToInvalidate)
767
  {
 
 
 
 
 
768
  if (empty($this->segmentArchiving)) {
769
  // might not be initialised if init is not called
770
  $this->segmentArchiving = new SegmentArchiving($this->processNewSegmentsFrom, $this->dateLastForced);
934
  return !empty($idArchive);
935
  }
936
 
937
+ // public for tests
938
+ public function repairInvalidationsIfNeeded($archiveToProcess)
939
+ {
940
+ $table = Common::prefixTable('archive_invalidations');
941
+
942
+ $bind = [
943
+ $archiveToProcess['idsite'],
944
+ $archiveToProcess['name'],
945
+ $archiveToProcess['period'],
946
+ $archiveToProcess['date1'],
947
+ $archiveToProcess['date2'],
948
+ ];
949
+
950
+ $reportClause = '';
951
+ if (!empty($archiveToProcess['report'])) {
952
+ $reportClause = " AND report = ?";
953
+ $bind[] = $archiveToProcess['report'];
954
+ }
955
+
956
+ $sql = "SELECT DISTINCT period FROM `$table`
957
+ WHERE idsite = ? AND name = ? AND period > ? AND ? >= date1 AND date2 >= ? AND status = " . ArchiveInvalidator::INVALIDATION_STATUS_QUEUED . " $reportClause";
958
+
959
+ $higherPeriods = Db::fetchAll($sql, $bind);
960
+ $higherPeriods = array_column($higherPeriods, 'period');
961
+
962
+ $invalidationsToInsert = [];
963
+ foreach (Piwik::$idPeriods as $label => $id) {
964
+ // lower period than the one we're processing or range, don't care
965
+ if ($id <= $archiveToProcess['period'] || $label == 'range') {
966
+ continue;
967
+ }
968
+
969
+ if (in_array($id, $higherPeriods)) { // period exists in table
970
+ continue;
971
+ }
972
+
973
+ // archive is for week that is over two months, we don't need to care about the month
974
+ if ($label == 'month'
975
+ && Date::factory($archiveToProcess['date1'])->toString('m') != Date::factory($archiveToProcess['date2'])->toString('m')
976
+ ) {
977
+ continue;
978
+ }
979
+
980
+ $period = Period\Factory::build($label, $archiveToProcess['date1']);
981
+
982
+ $invalidationToInsert = [
983
+ 'idarchive' => null,
984
+ 'name' => $archiveToProcess['name'],
985
+ 'report' => $archiveToProcess['report'],
986
+ 'idsite' => $archiveToProcess['idsite'],
987
+ 'date1' => $period->getDateStart()->getDatetime(),
988
+ 'date2' => $period->getDateEnd()->getDatetime(),
989
+ 'period' => $id,
990
+ 'ts_invalidated' => $archiveToProcess['ts_invalidated'],
991
+ ];
992
+
993
+ $this->logger->debug("Found dangling invalidation, inserting {invalidationToInsert}", [
994
+ 'invalidationToInsert' => json_encode($invalidationToInsert),
995
+ ]);
996
+
997
+ $invalidationsToInsert[] = $invalidationToInsert;
998
+ }
999
+
1000
+ if (empty($invalidationsToInsert)) {
1001
+ return;
1002
+ }
1003
+
1004
+ $fields = ['idarchive', 'name', 'report', 'idsite', 'date1', 'date2', 'period', 'ts_invalidated'];
1005
+ Db\BatchInsert::tableInsertBatch(Common::prefixTable('archive_invalidations'), $fields, $invalidationsToInsert);
1006
+ }
1007
+
1008
  private function setInvalidationTime()
1009
  {
1010
  $cache = Cache::getTransientCache();
app/core/CronArchive/QueueConsumer.php CHANGED
@@ -14,10 +14,12 @@ use Piwik\ArchiveProcessor\Loader;
14
  use Piwik\ArchiveProcessor\Parameters;
15
  use Piwik\ArchiveProcessor\Rules;
16
  use Piwik\CliMulti\RequestParser;
 
17
  use Piwik\CronArchive;
18
  use Piwik\DataAccess\ArchiveSelector;
19
  use Piwik\DataAccess\Model;
20
  use Piwik\Date;
 
21
  use Piwik\Exception\UnexpectedWebsiteFoundException;
22
  use Piwik\Period;
23
  use Piwik\Period\Factory as PeriodFactory;
@@ -351,7 +353,7 @@ class QueueConsumer
351
  }
352
 
353
  $this->logger->debug("Found invalidation for segment that does not have auto archiving enabled, skipping: {$nextArchive['idinvalidation']}");
354
- $this->invalidationsToExclude[] = $nextArchive['idinvalidation'];
355
 
356
  ++$iterations;
357
  }
14
  use Piwik\ArchiveProcessor\Parameters;
15
  use Piwik\ArchiveProcessor\Rules;
16
  use Piwik\CliMulti\RequestParser;
17
+ use Piwik\Common;
18
  use Piwik\CronArchive;
19
  use Piwik\DataAccess\ArchiveSelector;
20
  use Piwik\DataAccess\Model;
21
  use Piwik\Date;
22
+ use Piwik\Db;
23
  use Piwik\Exception\UnexpectedWebsiteFoundException;
24
  use Piwik\Period;
25
  use Piwik\Period\Factory as PeriodFactory;
353
  }
354
 
355
  $this->logger->debug("Found invalidation for segment that does not have auto archiving enabled, skipping: {$nextArchive['idinvalidation']}");
356
+ $this->model->deleteInvalidations([$nextArchive]);
357
 
358
  ++$iterations;
359
  }
app/core/CronArchive/SegmentArchiving.php CHANGED
@@ -89,7 +89,9 @@ class SegmentArchiving
89
 
90
  $segmentsForSite = $this->getAllSegments();
91
  foreach ($segmentsForSite as $storedSegment) {
92
- if (!$this->isAutoArchivingEnabledFor($storedSegment)) {
 
 
93
  continue;
94
  }
95
 
@@ -121,11 +123,19 @@ class SegmentArchiving
121
  public function findSegmentForHash($hash, $idSite)
122
  {
123
  foreach ($this->getAllSegments() as $segment) {
124
- if (!$this->isAutoArchivingEnabledFor($segment)) {
 
 
 
 
 
 
 
 
 
125
  continue;
126
  }
127
 
128
- $segmentObj = new Segment($segment['definition'], [$idSite]);
129
  if ($segmentObj->getHash() == $hash) {
130
  return $segment;
131
  }
89
 
90
  $segmentsForSite = $this->getAllSegments();
91
  foreach ($segmentsForSite as $storedSegment) {
92
+ if (!$this->isAutoArchivingEnabledFor($storedSegment)
93
+ || !$this->isSegmentForSite($storedSegment, $idSite)
94
+ ) {
95
  continue;
96
  }
97
 
123
  public function findSegmentForHash($hash, $idSite)
124
  {
125
  foreach ($this->getAllSegments() as $segment) {
126
+ if (!$this->isAutoArchivingEnabledFor($segment)
127
+ || !$this->isSegmentForSite($segment, $idSite)
128
+ ) {
129
+ continue;
130
+ }
131
+
132
+ try {
133
+ $segmentObj = new Segment($segment['definition'], [$idSite]);
134
+ } catch (\Exception $ex) {
135
+ $this->logger->debug("Could not process segment {$segment['definition']} for site {$idSite}. Segment should not exist for the site, but does.");
136
  continue;
137
  }
138
 
 
139
  if ($segmentObj->getHash() == $hash) {
140
  return $segment;
141
  }
app/core/DataAccess/Model.php CHANGED
@@ -131,8 +131,9 @@ class Model
131
  FROM `$archiveTable`
132
  WHERE idsite IN (" . implode(',', $idSites) . ")";
133
 
 
134
  if (!empty($allPeriodsToInvalidate)) {
135
- $sql .= " AND (";
136
 
137
  $isFirst = true;
138
  /** @var Period $period */
@@ -140,21 +141,22 @@ class Model
140
  if ($isFirst) {
141
  $isFirst = false;
142
  } else {
143
- $sql .= " OR ";
144
  }
145
 
146
  if ($period->getLabel() == 'range') { // for ranges, we delete all ranges that contain the given date(s)
147
- $sql .= "(period = " . (int)$period->getId()
148
  . " AND date2 >= '" . $period->getDateStart()->getDatetime()
149
  . "' AND date1 <= '" . $period->getDateEnd()->getDatetime() . "')";
150
  } else {
151
- $sql .= "(period = " . (int)$period->getId()
152
  . " AND date1 = '" . $period->getDateStart()->getDatetime() . "'"
153
  . " AND date2 = '" . $period->getDateEnd()->getDatetime() . "')";
154
  }
155
  }
156
- $sql .= ")";
157
  }
 
158
 
159
  if (!empty($name)) {
160
  if (strpos($name, '.') !== false) {
@@ -201,6 +203,8 @@ class Model
201
 
202
  $now = Date::now()->getDatetime();
203
 
 
 
204
  $dummyArchives = [];
205
  foreach ($idSites as $idSite) {
206
  try {
@@ -223,6 +227,12 @@ class Model
223
 
224
  $date1 = $period->getDateStart()->toString();
225
  $date2 = $period->getDateEnd()->toString();
 
 
 
 
 
 
226
  $idArchive = $archivesToCreateInvalidationRowsFor[$idSite][$period->getId()][$date1][$date2] ?? null;
227
 
228
  $dummyArchives[] = [
@@ -238,13 +248,39 @@ class Model
238
  }
239
  }
240
 
241
- $fields = ['idarchive', 'name', 'report', 'idsite', 'date1', 'date2', 'period', 'ts_invalidated'];
242
-
243
- Db\BatchInsert::tableInsertBatch(Common::prefixTable('archive_invalidations'), $fields, $dummyArchives);
 
244
 
245
  return count($idArchives);
246
  }
247
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
248
  /**
249
  * @param string $archiveTable Prefixed table name
250
  * @param int[] $idSites
@@ -713,7 +749,7 @@ class Model
713
  public function getNextInvalidatedArchive($idSite, $archivingStartTime, $idInvalidationsToExclude = null, $useLimit = true)
714
  {
715
  $table = Common::prefixTable('archive_invalidations');
716
- $sql = "SELECT idinvalidation, idarchive, idsite, date1, date2, period, `name`, report
717
  FROM `$table`
718
  WHERE idsite = ? AND status != ? AND ts_invalidated <= ?";
719
  $bind = [
@@ -876,15 +912,4 @@ class Model
876
  $query = Db::query($sql, $bind);
877
  return $query->rowCount();
878
  }
879
-
880
- public function isInvalidationsScheduledForSite($idSite)
881
- {
882
- $table = Common::prefixTable('archive_invalidations');
883
-
884
- $bind = [(int) $idSite];
885
-
886
- $sql = "SELECT idsite FROM `$table` WHERE idsite = ? LIMIT 1";
887
- $value = Db::fetchOne($sql, $bind);
888
- return !empty($value);
889
- }
890
  }
131
  FROM `$archiveTable`
132
  WHERE idsite IN (" . implode(',', $idSites) . ")";
133
 
134
+ $periodCondition = '';
135
  if (!empty($allPeriodsToInvalidate)) {
136
+ $periodCondition .= " AND (";
137
 
138
  $isFirst = true;
139
  /** @var Period $period */
141
  if ($isFirst) {
142
  $isFirst = false;
143
  } else {
144
+ $periodCondition .= " OR ";
145
  }
146
 
147
  if ($period->getLabel() == 'range') { // for ranges, we delete all ranges that contain the given date(s)
148
+ $periodCondition .= "(period = " . (int)$period->getId()
149
  . " AND date2 >= '" . $period->getDateStart()->getDatetime()
150
  . "' AND date1 <= '" . $period->getDateEnd()->getDatetime() . "')";
151
  } else {
152
+ $periodCondition .= "(period = " . (int)$period->getId()
153
  . " AND date1 = '" . $period->getDateStart()->getDatetime() . "'"
154
  . " AND date2 = '" . $period->getDateEnd()->getDatetime() . "')";
155
  }
156
  }
157
+ $periodCondition .= ")";
158
  }
159
+ $sql .= $periodCondition;
160
 
161
  if (!empty($name)) {
162
  if (strpos($name, '.') !== false) {
203
 
204
  $now = Date::now()->getDatetime();
205
 
206
+ $existingInvalidations = $this->getExistingInvalidations($idSites, $periodCondition, $nameCondition);
207
+
208
  $dummyArchives = [];
209
  foreach ($idSites as $idSite) {
210
  try {
227
 
228
  $date1 = $period->getDateStart()->toString();
229
  $date2 = $period->getDateEnd()->toString();
230
+
231
+ $key = $this->makeExistingInvalidationArrayKey($idSite, $date1, $date2, $period->getId(), $doneFlag);
232
+ if (!empty($existingInvalidations[$key])) {
233
+ continue; // avoid adding duplicates where possible
234
+ }
235
+
236
  $idArchive = $archivesToCreateInvalidationRowsFor[$idSite][$period->getId()][$date1][$date2] ?? null;
237
 
238
  $dummyArchives[] = [
248
  }
249
  }
250
 
251
+ if (!empty($dummyArchives)) {
252
+ $fields = ['idarchive', 'name', 'report', 'idsite', 'date1', 'date2', 'period', 'ts_invalidated'];
253
+ Db\BatchInsert::tableInsertBatch(Common::prefixTable('archive_invalidations'), $fields, $dummyArchives);
254
+ }
255
 
256
  return count($idArchives);
257
  }
258
 
259
+ private function getExistingInvalidations($idSites, $periodCondition, $nameCondition)
260
+ {
261
+ $table = Common::prefixTable('archive_invalidations');
262
+
263
+ $idSites = array_map('intval', $idSites);
264
+
265
+ $sql = "SELECT idsite, date1, date2, period, name, COUNT(*) as `count` FROM `$table`
266
+ WHERE idsite IN (" . implode(',', $idSites) . ") AND status = " . ArchiveInvalidator::INVALIDATION_STATUS_QUEUED . "
267
+ $periodCondition AND $nameCondition
268
+ GROUP BY idsite, date1, date2, period, name";
269
+ $rows = Db::fetchAll($sql);
270
+
271
+ $invalidations = [];
272
+ foreach ($rows as $row) {
273
+ $key = $this->makeExistingInvalidationArrayKey($row['idsite'], $row['date1'], $row['date2'], $row['period'], $row['name']);
274
+ $invalidations[$key] = $row['count'];
275
+ }
276
+ return $invalidations;
277
+ }
278
+
279
+ private function makeExistingInvalidationArrayKey($idSite, $date1, $date2, $period, $name)
280
+ {
281
+ return implode('.', [$idSite, $date1, $date2, $period, $name]);
282
+ }
283
+
284
  /**
285
  * @param string $archiveTable Prefixed table name
286
  * @param int[] $idSites
749
  public function getNextInvalidatedArchive($idSite, $archivingStartTime, $idInvalidationsToExclude = null, $useLimit = true)
750
  {
751
  $table = Common::prefixTable('archive_invalidations');
752
+ $sql = "SELECT idinvalidation, idarchive, idsite, date1, date2, period, `name`, report, ts_invalidated
753
  FROM `$table`
754
  WHERE idsite = ? AND status != ? AND ts_invalidated <= ?";
755
  $bind = [
912
  $query = Db::query($sql, $bind);
913
  return $query->rowCount();
914
  }
 
 
 
 
 
 
 
 
 
 
 
915
  }
app/core/Db/BatchInsert.php CHANGED
@@ -35,6 +35,7 @@ class BatchInsert
35
  $ignore = $ignoreWhenDuplicate ? 'IGNORE' : '';
36
 
37
  foreach ($values as $row) {
 
38
  $query = "INSERT $ignore INTO " . $tableName . "
39
  $fieldList
40
  VALUES (" . Common::getSqlStringFieldsArray($row) . ")";
@@ -243,6 +244,9 @@ class BatchInsert
243
  } catch (Exception $e) {
244
  $code = $e->getCode();
245
  $message = $e->getMessage() . ($code ? "[$code]" : '');
 
 
 
246
  $exceptions[] = "\n Try #" . (count($exceptions) + 1) . ': ' . $queryStart . ": " . $message;
247
  }
248
  }
35
  $ignore = $ignoreWhenDuplicate ? 'IGNORE' : '';
36
 
37
  foreach ($values as $row) {
38
+ $row = array_values($row);
39
  $query = "INSERT $ignore INTO " . $tableName . "
40
  $fieldList
41
  VALUES (" . Common::getSqlStringFieldsArray($row) . ")";
244
  } catch (Exception $e) {
245
  $code = $e->getCode();
246
  $message = $e->getMessage() . ($code ? "[$code]" : '');
247
+ if (\Piwik_ShouldPrintBackTraceWithMessage()) {
248
+ $message .= "\n" . $e->getTraceAsString();
249
+ }
250
  $exceptions[] = "\n Try #" . (count($exceptions) + 1) . ': ' . $queryStart . ": " . $message;
251
  }
252
  }
app/core/Plugin/Controller.php CHANGED
@@ -821,12 +821,7 @@ abstract class Controller
821
  // invalid host, so display warning to user
822
  $validHosts = Url::getTrustedHostsFromConfig();
823
  $validHost = $validHosts[0];
824
-
825
- if (!empty($_SERVER['SERVER_NAME'])) {
826
- $invalidHost = Common::sanitizeInputValue(Url::getHostFromServerNameVar());
827
- } else {
828
- $invalidHost = Common::sanitizeInputValue($_SERVER['HTTP_HOST']);
829
- }
830
 
831
  $emailSubject = rawurlencode(Piwik::translate('CoreHome_InjectedHostEmailSubject', $invalidHost));
832
  $emailBody = rawurlencode(Piwik::translate('CoreHome_InjectedHostEmailBody'));
821
  // invalid host, so display warning to user
822
  $validHosts = Url::getTrustedHostsFromConfig();
823
  $validHost = $validHosts[0];
824
+ $invalidHost = Common::sanitizeInputValue(Url::getHost(false));
 
 
 
 
 
825
 
826
  $emailSubject = rawurlencode(Piwik::translate('CoreHome_InjectedHostEmailSubject', $invalidHost));
827
  $emailBody = rawurlencode(Piwik::translate('CoreHome_InjectedHostEmailBody'));
app/core/Updates/4.0.0-b1.php CHANGED
@@ -10,9 +10,11 @@
10
  namespace Piwik\Updates;
11
 
12
  use Piwik\DataAccess\TableMetadata;
13
- use Piwik\Date;
 
14
  use Piwik\DbHelper;
15
  use Piwik\Plugin\Manager;
 
16
  use Piwik\Plugins\CoreHome\Columns\Profilable;
17
  use Piwik\Plugins\CoreHome\Columns\VisitorSecondsSinceFirst;
18
  use Piwik\Plugins\CoreHome\Columns\VisitorSecondsSinceOrder;
@@ -28,6 +30,7 @@ use Piwik\Common;
28
  use Piwik\Config;
29
  use Piwik\Plugins\UserCountry\LocationProvider;
30
  use Piwik\Plugins\VisitorInterest\Columns\VisitorSecondsSinceLast;
 
31
  use Piwik\Updater;
32
  use Piwik\Updates as PiwikUpdates;
33
  use Piwik\Updater\Migration\Factory as MigrationFactory;
@@ -55,35 +58,12 @@ class Updates_4_0_0_b1 extends PiwikUpdates
55
 
56
  $migrations = [];
57
 
58
- /** APP SPECIFIC TOKEN START */
59
- $migrations[] = $this->migration->db->createTable('user_token_auth', array(
60
- 'idusertokenauth' => 'BIGINT UNSIGNED NOT NULL AUTO_INCREMENT',
61
- 'login' => 'VARCHAR(100) NOT NULL',
62
- 'description' => 'VARCHAR('.Model::MAX_LENGTH_TOKEN_DESCRIPTION.') NOT NULL',
63
- 'password' => 'VARCHAR(191) NOT NULL',
64
- 'system_token' => 'TINYINT(1) NOT NULL DEFAULT 0',
65
- 'hash_algo' => 'VARCHAR(30) NOT NULL',
66
- 'last_used' => 'DATETIME NULL',
67
- 'date_created' => ' DATETIME NOT NULL',
68
- 'date_expired' => ' DATETIME NULL',
69
- ), 'idusertokenauth');
70
- $migrations[] = $this->migration->db->addUniqueKey('user_token_auth', 'password', 'uniq_password');
71
-
72
- $migrations[] = $this->migration->db->dropIndex('user', 'uniq_keytoken');
73
-
74
- $userModel = new Model();
75
- foreach ($userModel->getUsers(array()) as $user) {
76
- if (!empty($user['token_auth'])) {
77
- $migrations[] = $this->migration->db->insert('user_token_auth', array(
78
- 'login' => $user['login'],
79
- 'description' => 'Created by Matomo 4 migration',
80
- 'password' => $userModel->hashTokenAuth($user['token_auth']),
81
- 'date_created' => Date::now()->getDatetime()
82
- ));
83
- }
84
- }
85
 
86
- /** APP SPECIFIC TOKEN END */
87
 
88
  // invalidations table
89
  $migrations[] = $this->migration->db->createTable('archive_invalidations', [
@@ -95,7 +75,6 @@ class Updates_4_0_0_b1 extends PiwikUpdates
95
  'date2' => 'DATE NOT NULL',
96
  'period' => 'TINYINT UNSIGNED NOT NULL',
97
  'ts_invalidated' => 'DATETIME NOT NULL',
98
- 'ts_started' => 'DATETIME NULL',
99
  'status' => 'TINYINT(1) UNSIGNED DEFAULT 0',
100
  'report' => 'VARCHAR(255) NULL',
101
  ], ['idinvalidation']);
@@ -103,13 +82,41 @@ class Updates_4_0_0_b1 extends PiwikUpdates
103
  $migrations[] = $this->migration->db->addIndex('archive_invalidations', ['idsite', 'date1', 'period'], 'index_idsite_dates_period_name');
104
 
105
  $migrations[] = $this->migration->db->dropColumn('user', 'alias');
106
- $migrations[] = $this->migration->db->dropColumn('user', 'token_auth');
107
 
108
- // keep piwik_ignore for existing installs
109
- $migrations[] = $this->migration->config->set('Tracker', 'ignore_visits_cookie_name', 'piwik_ignore');
 
 
 
 
110
 
 
 
111
  $migrations[] = $this->migration->db->changeColumn('log_link_visit_action', 'interaction_position', 'pageview_position', 'MEDIUMINT UNSIGNED DEFAULT NULL');
112
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
113
  // Move the site search fields of log_visit out of custom variables into their own fields
114
  $columnsToAdd['log_link_visit_action']['search_cat'] = 'VARCHAR(200) NULL';
115
  $columnsToAdd['log_link_visit_action']['search_count'] = 'INTEGER(10) UNSIGNED NULL';
@@ -152,6 +159,19 @@ class Updates_4_0_0_b1 extends PiwikUpdates
152
  }
153
  }
154
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
  // init seconds_to_... columns
156
  $logVisitColumns = $tableMetadata->getColumns(Common::prefixTable('log_visit'));
157
  $hasDaysColumnInVisit = in_array('visitor_days_since_first', $logVisitColumns);
@@ -172,11 +192,6 @@ class Updates_4_0_0_b1 extends PiwikUpdates
172
  visitor_seconds_since_order = visitor_days_since_order * 86400");
173
  }
174
 
175
- if (Manager::getInstance()->isPluginInstalled('CustomVariables')) {
176
- $visitActionTable = Common::prefixTable('log_link_visit_action');
177
- $migrations[] = $this->migration->db->sql("UPDATE $visitActionTable SET search_cat = if(custom_var_k4 = '_pk_scat', custom_var_v4, search_cat), search_count = if(custom_var_k5 = '_pk_scount', custom_var_v5, search_count) WHERE custom_var_k4 = '_pk_scat' or custom_var_k5 = '_pk_scount'");
178
- }
179
-
180
  // remove old days_to_... columns
181
  $migrations[] = $this->migration->db->dropColumns('log_visit', [
182
  'config_gears',
@@ -196,6 +211,9 @@ class Updates_4_0_0_b1 extends PiwikUpdates
196
  $migrations[] = $this->migration->config->set('mail', 'type', 'Cram-md5');
197
  }
198
 
 
 
 
199
  $migrations[] = $this->migration->plugin->activate('PagePerformance');
200
  if (!Manager::getInstance()->isPluginActivated('CustomDimensions')) {
201
  $migrations[] = $this->migration->plugin->activate('CustomDimensions');
@@ -211,18 +229,76 @@ class Updates_4_0_0_b1 extends PiwikUpdates
211
  $migrations[] = $this->migration->config->set('General', 'datatable_archiving_maximum_rows_subtable_custom_dimensions', $configSubTableLimit);
212
  }
213
 
214
- $migrations[] = $this->migration->db->changeColumnType('session', 'id', 'VARCHAR(191)');
215
- $migrations[] = $this->migration->db->changeColumnType('site_url', 'url', 'VARCHAR(190)');
216
- $migrations[] = $this->migration->db->changeColumnType('option', 'option_name', 'VARCHAR(191)');
217
-
218
- $migrations[] = $this->migration->db->changeColumnType('log_action', 'name', 'VARCHAR(4096)');
219
- $migrations[] = $this->migration->db->changeColumnType('log_conversion', 'url', 'VARCHAR(4096)');
220
  return $migrations;
221
  }
222
 
223
  public function doUpdate(Updater $updater)
224
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
225
  $updater->executeMigrations(__FILE__, $this->getMigrations($updater));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
226
  }
227
 
228
  protected function usesGeoIpLegacyLocationProvider()
10
  namespace Piwik\Updates;
11
 
12
  use Piwik\DataAccess\TableMetadata;
13
+ use Piwik\Updater\Migration\Custom as CustomMigration;
14
+ use Piwik\Db;
15
  use Piwik\DbHelper;
16
  use Piwik\Plugin\Manager;
17
+ use Piwik\Plugins\CoreAdminHome\Commands\MigrateTokenAuths;
18
  use Piwik\Plugins\CoreHome\Columns\Profilable;
19
  use Piwik\Plugins\CoreHome\Columns\VisitorSecondsSinceFirst;
20
  use Piwik\Plugins\CoreHome\Columns\VisitorSecondsSinceOrder;
30
  use Piwik\Config;
31
  use Piwik\Plugins\UserCountry\LocationProvider;
32
  use Piwik\Plugins\VisitorInterest\Columns\VisitorSecondsSinceLast;
33
+ use Piwik\SettingsPiwik;
34
  use Piwik\Updater;
35
  use Piwik\Updates as PiwikUpdates;
36
  use Piwik\Updater\Migration\Factory as MigrationFactory;
58
 
59
  $migrations = [];
60
 
61
+ $domain = Config::getLocalConfigPath() === Config::getDefaultLocalConfigPath() ? '' : Config::getHostname();
62
+ $domainArg = !empty($domain) ? "--matomo-domain=". escapeshellarg($domain) . " " : '';
63
+ $toString = sprintf('./console %score:matomo4-migrate-token-auths', $domainArg);
64
+ $custom = new CustomMigration(array(MigrateTokenAuths::class, 'migrate'), $toString);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
 
66
+ $migrations[] = $custom;
67
 
68
  // invalidations table
69
  $migrations[] = $this->migration->db->createTable('archive_invalidations', [
75
  'date2' => 'DATE NOT NULL',
76
  'period' => 'TINYINT UNSIGNED NOT NULL',
77
  'ts_invalidated' => 'DATETIME NOT NULL',
 
78
  'status' => 'TINYINT(1) UNSIGNED DEFAULT 0',
79
  'report' => 'VARCHAR(255) NULL',
80
  ], ['idinvalidation']);
82
  $migrations[] = $this->migration->db->addIndex('archive_invalidations', ['idsite', 'date1', 'period'], 'index_idsite_dates_period_name');
83
 
84
  $migrations[] = $this->migration->db->dropColumn('user', 'alias');
 
85
 
86
+ // prevent possible duplicates when shorting session id
87
+ $migrations[] = $this->migration->db->sql('DELETE FROM `' . Common::prefixTable('session') . '` WHERE length(id) > 190');
88
+
89
+ $migrations[] = $this->migration->db->changeColumnType('session', 'id', 'VARCHAR(191)');
90
+ $migrations[] = $this->migration->db->changeColumnType('site_url', 'url', 'VARCHAR(190)');
91
+ $migrations[] = $this->migration->db->changeColumnType('option', 'option_name', 'VARCHAR(191)');
92
 
93
+ $migrations[] = $this->migration->db->changeColumnType('log_action', 'name', 'VARCHAR(4096)');
94
+ $migrations[] = $this->migration->db->changeColumnType('log_conversion', 'url', 'VARCHAR(4096)');
95
  $migrations[] = $this->migration->db->changeColumn('log_link_visit_action', 'interaction_position', 'pageview_position', 'MEDIUMINT UNSIGNED DEFAULT NULL');
96
 
97
+ $customTrackerPluginActive = false;
98
+ if (in_array('CustomPiwikJs', Config::getInstance()->Plugins['Plugins'])) {
99
+ $customTrackerPluginActive = true;
100
+ }
101
+
102
+ $migrations[] = $this->migration->plugin->activate('BulkTracking');
103
+ $migrations[] = $this->migration->plugin->deactivate('CustomPiwikJs');
104
+ $migrations[] = $this->migration->plugin->uninstall('CustomPiwikJs');
105
+
106
+ if ($customTrackerPluginActive) {
107
+ $migrations[] = $this->migration->plugin->activate('CustomJsTracker');
108
+ }
109
+
110
+ // Prepare all installed tables for utf8mb4 conversions. e.g. make some indexed fields smaller so they don't exceed the maximum key length
111
+ $allTables = DbHelper::getTablesInstalled();
112
+
113
+ foreach ($allTables as $table) {
114
+ if (preg_match('/archive_/', $table) == 1) {
115
+ $tableNameUnprefixed = Common::unprefixTable($table);
116
+ $migrations[] = $this->migration->db->changeColumnType($tableNameUnprefixed, 'name', 'VARCHAR(190)');
117
+ }
118
+ }
119
+
120
  // Move the site search fields of log_visit out of custom variables into their own fields
121
  $columnsToAdd['log_link_visit_action']['search_cat'] = 'VARCHAR(200) NULL';
122
  $columnsToAdd['log_link_visit_action']['search_count'] = 'INTEGER(10) UNSIGNED NULL';
159
  }
160
  }
161
 
162
+ if (Manager::getInstance()->isPluginInstalled('CustomVariables')) {
163
+ $visitActionTable = Common::prefixTable('log_link_visit_action');
164
+ $migrations[] = $this->migration->db->sql("UPDATE $visitActionTable SET search_cat = if(custom_var_k4 = '_pk_scat', custom_var_v4, search_cat), search_count = if(custom_var_k5 = '_pk_scount', custom_var_v5, search_count) WHERE custom_var_k4 = '_pk_scat' or custom_var_k5 = '_pk_scount'");
165
+ }
166
+
167
+ if ($this->usesGeoIpLegacyLocationProvider()) {
168
+ // activate GeoIp2 plugin for users still using GeoIp2 Legacy (others might have it disabled on purpose)
169
+ $migrations[] = $this->migration->plugin->activate('GeoIp2');
170
+ }
171
+
172
+ // remove old options
173
+ $migrations[] = $this->migration->db->sql('DELETE FROM `' . Common::prefixTable('option') . '` WHERE option_name IN ("geoip.updater_period", "geoip.loc_db_url", "geoip.isp_db_url", "geoip.org_db_url")');
174
+
175
  // init seconds_to_... columns
176
  $logVisitColumns = $tableMetadata->getColumns(Common::prefixTable('log_visit'));
177
  $hasDaysColumnInVisit = in_array('visitor_days_since_first', $logVisitColumns);
192
  visitor_seconds_since_order = visitor_days_since_order * 86400");
193
  }
194
 
 
 
 
 
 
195
  // remove old days_to_... columns
196
  $migrations[] = $this->migration->db->dropColumns('log_visit', [
197
  'config_gears',
211
  $migrations[] = $this->migration->config->set('mail', 'type', 'Cram-md5');
212
  }
213
 
214
+ // keep piwik_ignore for existing installs
215
+ $migrations[] = $this->migration->config->set('Tracker', 'ignore_visits_cookie_name', 'piwik_ignore');
216
+
217
  $migrations[] = $this->migration->plugin->activate('PagePerformance');
218
  if (!Manager::getInstance()->isPluginActivated('CustomDimensions')) {
219
  $migrations[] = $this->migration->plugin->activate('CustomDimensions');
229
  $migrations[] = $this->migration->config->set('General', 'datatable_archiving_maximum_rows_subtable_custom_dimensions', $configSubTableLimit);
230
  }
231
 
 
 
 
 
 
 
232
  return $migrations;
233
  }
234
 
235
  public function doUpdate(Updater $updater)
236
  {
237
+ $salt = SettingsPiwik::getSalt();
238
+ $sessions = Db::fetchAll('SELECT id from ' . Common::prefixTable('session'));
239
+
240
+ foreach ($sessions as $session) {
241
+ if (!empty($session['id']) && Common::mb_strlen($session['id']) != 128) {
242
+ $bind = [ hash('sha512', $session['id'] . $salt), $session['id'] ];
243
+ try {
244
+ Db::query(sprintf('UPDATE %s SET id = ? WHERE id = ?', Common::prefixTable('session')), $bind);
245
+ } catch (\Exception $e) {
246
+ // ignore possible duplicate key errors
247
+ }
248
+ }
249
+ }
250
+
251
  $updater->executeMigrations(__FILE__, $this->getMigrations($updater));
252
+
253
+ if ($this->usesGeoIpLegacyLocationProvider()) {
254
+ // switch to default provider if GeoIp Legacy was still in use
255
+ LocationProvider::setCurrentProvider(LocationProvider\DefaultProvider::ID);
256
+ }
257
+
258
+ // eg the case when not updating from most recent Matomo 3.X and when not using the UI updater
259
+ // afterwards the should receive a notification that the plugins are outdated
260
+ self::ensureCorePluginsThatWereMovedToMarketplaceCanBeUpdated();
261
+ ServerFilesGenerator::createFilesForSecurity();
262
+ }
263
+
264
+ public static function ensureCorePluginsThatWereMovedToMarketplaceCanBeUpdated()
265
+ {
266
+ $plugins = ['Provider', 'CustomVariables'];
267
+ $pluginManager = Manager::getInstance();
268
+ foreach ($plugins as $plugin) {
269
+ if ($pluginManager->isPluginThirdPartyAndBogus($plugin)) {
270
+ $pluginDir = Manager::getPluginDirectory($plugin);
271
+
272
+ if (is_dir($pluginDir) &&
273
+ file_exists($pluginDir . '/' . $plugin . '.php')
274
+ && !file_exists($pluginDir . '/plugin.json')
275
+ && is_writable($pluginDir)) {
276
+ file_put_contents($pluginDir . '/plugin.json', '{
277
+ "name": "'.$plugin.'",
278
+ "description": "'.$plugin.'",
279
+ "version": "3.14.1",
280
+ "theme": false,
281
+ "require": {
282
+ "piwik": ">=3.0.0,<4.0.0-b1"
283
+ },
284
+ "authors": [
285
+ {
286
+ "name": "Matomo",
287
+ "email": "hello@matomo.org",
288
+ "homepage": "https:\/\/matomo.org"
289
+ }
290
+ ],
291
+ "homepage": "https:\/\/matomo.org",
292
+ "license": "GPL v3+",
293
+ "keywords": ["'.$plugin.'"]
294
+ }');
295
+ // otherwise cached information might be used and it won't be loaded otherwise within same request
296
+ $pluginObj = $pluginManager->loadPlugin($plugin);
297
+ $pluginObj->reloadPluginInformation();
298
+ $pluginManager->unloadPlugin($pluginObj); // prevent any events being posted to it somehow
299
+ }
300
+ }
301
+ }
302
  }
303
 
304
  protected function usesGeoIpLegacyLocationProvider()
app/core/Updates/4.0.0-b3.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Updates;
11
+
12
+ use Piwik\Config;
13
+ use Piwik\Updater;
14
+ use Piwik\Updates as PiwikUpdates;
15
+ use Piwik\Updater\Migration\Factory as MigrationFactory;
16
+
17
+ /**
18
+ * Update for version 4.0.0-b3.
19
+ */
20
+ class Updates_4_0_0_b3 extends PiwikUpdates
21
+ {
22
+ /**
23
+ * @var MigrationFactory
24
+ */
25
+ private $migration;
26
+
27
+ public function __construct(MigrationFactory $factory)
28
+ {
29
+ $this->migration = $factory;
30
+ }
31
+
32
+ public function getMigrations(Updater $updater)
33
+ {
34
+ $migrations = [];
35
+
36
+ $config = Config::getInstance();
37
+ $general = $config->General;
38
+ if (empty($general['login_whitelist_apply_to_reporting_api_requests'])) {
39
+ $migrations[] = $this->migration->config->set('General', 'login_allowlist_apply_to_reporting_api_requests', '0');
40
+ }
41
+
42
+ return $migrations;
43
+ }
44
+
45
+ public function doUpdate(Updater $updater)
46
+ {
47
+ $updater->executeMigrations(__FILE__, $this->getMigrations($updater));
48
+
49
+ $config = Config::getInstance();
50
+ $general = $config->General;
51
+ if (!empty($general['login_whitelist_ip'])) {
52
+ // the migration->config->set does not support arrays yet so we do it here.
53
+ $general['login_allowlist_ip'] = $general['login_whitelist_ip'];
54
+ $config->General = $general;
55
+ $config->forceSave();
56
+ }
57
+
58
+ }
59
+
60
+ }
app/core/Updates/4.0.0-rc3.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Updates;
11
+
12
+ use Piwik\Config;
13
+ use Piwik\Updater;
14
+ use Piwik\Updates as PiwikUpdates;
15
+ use Piwik\Updater\Migration\Factory as MigrationFactory;
16
+
17
+ /**
18
+ * Update for version 4.0.0-b3.
19
+ */
20
+ class Updates_4_0_0_rc3 extends PiwikUpdates
21
+ {
22
+ /**
23
+ * @var MigrationFactory
24
+ */
25
+ private $migration;
26
+
27
+ public function __construct(MigrationFactory $factory)
28
+ {
29
+ $this->migration = $factory;
30
+ }
31
+
32
+ public function getMigrations(Updater $updater)
33
+ {
34
+ $migrations = [];
35
+ $migrations[] = $this->migration->db->addColumn('archive_invalidations', 'ts_started', 'DATETIME NULL');
36
+ return $migrations;
37
+ }
38
+
39
+ public function doUpdate(Updater $updater)
40
+ {
41
+ $updater->executeMigrations(__FILE__, $this->getMigrations($updater));
42
+ }
43
+
44
+ }
app/core/Updates/4.0.0-rc4.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Updates;
11
+
12
+ use Piwik\Config;
13
+ use Piwik\Container\StaticContainer;
14
+ use Piwik\DataAccess\ArchiveTableCreator;
15
+ use Piwik\Date;
16
+ use Piwik\DbHelper;
17
+ use Piwik\Plugin\ReleaseChannels;
18
+ use Piwik\Updater;
19
+ use Piwik\Updates as PiwikUpdates;
20
+ use Piwik\Updater\Migration\Factory as MigrationFactory;
21
+
22
+ /**
23
+ * Update for version 4.0.0-rc4.
24
+ */
25
+ class Updates_4_0_0_rc4 extends PiwikUpdates
26
+ {
27
+ /**
28
+ * @var MigrationFactory
29
+ */
30
+ private $migration;
31
+
32
+ public function __construct(MigrationFactory $factory)
33
+ {
34
+ $this->migration = $factory;
35
+ }
36
+
37
+ public function getMigrations(Updater $updater)
38
+ {
39
+ $migrations = [];
40
+
41
+ $migrations[] = $this->migration->plugin->deactivate('ExampleTheme');
42
+
43
+ $channel = StaticContainer::get(ReleaseChannels::class)->getActiveReleaseChannel()->getId();
44
+ $isBeta = stripos($channel, 'beta') !== false;
45
+
46
+ if ($isBeta) {
47
+ $dates = ['2020-01-01', '2020-11-01', '2020-10-01'];
48
+ foreach ($dates as $date) {
49
+ $date = Date::factory($date);
50
+ $numericTable = ArchiveTableCreator::getBlobTable($date);
51
+ $blobTable = ArchiveTableCreator::getNumericTable($date);
52
+
53
+ if (DbHelper::tableExists($blobTable) && DbHelper::tableExists($numericTable)) {
54
+ $migrations[] = $this->migration->db->sql(
55
+ "DELETE FROM `$blobTable` WHERE idarchive NOT IN (SELECT idarchive FROM `$numericTable`)", []);
56
+ }
57
+ }
58
+ }
59
+
60
+ return $migrations;
61
+ }
62
+
63
+ public function doUpdate(Updater $updater)
64
+ {
65
+ $updater->executeMigrations(__FILE__, $this->getMigrations($updater));
66
+ }
67
+
68
+ }
app/core/Updates/4.0.1-b1.php ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Updates;
11
+
12
+ use Piwik\Common;
13
+ use Piwik\Config;
14
+ use Piwik\Container\StaticContainer;
15
+ use Piwik\DataAccess\ArchiveTableCreator;
16
+ use Piwik\Date;
17
+ use Piwik\DbHelper;
18
+ use Piwik\Plugin\ReleaseChannels;
19
+ use Piwik\SettingsPiwik;
20
+ use Piwik\Updater;
21
+ use Piwik\Updates as PiwikUpdates;
22
+ use Piwik\Updater\Migration\Factory as MigrationFactory;
23
+
24
+ class Updates_4_0_1_b1 extends PiwikUpdates
25
+ {
26
+ /**
27
+ * @var MigrationFactory
28
+ */
29
+ private $migration;
30
+
31
+ public function __construct(MigrationFactory $factory)
32
+ {
33
+ $this->migration = $factory;
34
+ }
35
+
36
+ public function getMigrations(Updater $updater)
37
+ {
38
+ $migrations = [];
39
+
40
+ $table = Common::prefixTable('user_token_auth');
41
+ $migrations[] = $this->migration->db->sql('UPDATE ' . $table . ' SET hash_algo = "sha512" where hash_algo is null or hash_algo = "" ');
42
+
43
+ if (SettingsPiwik::isGitDeployment()) {
44
+ return $migrations;
45
+ }
46
+
47
+ $migrations[] = $this->migration->plugin->uninstall('ExampleTheme');
48
+ return $migrations;
49
+ }
50
+
51
+ public function doUpdate(Updater $updater)
52
+ {
53
+ $updater->executeMigrations(__FILE__, $this->getMigrations($updater));
54
+ }
55
+
56
+ }
app/core/Updates/4.0.4-b1.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Updates;
11
+
12
+ use Piwik\SettingsPiwik;
13
+ use Piwik\Updater;
14
+ use Piwik\Updates as PiwikUpdates;
15
+ use Piwik\Updater\Migration\Factory as MigrationFactory;
16
+
17
+ class Updates_4_0_4_b1 extends PiwikUpdates
18
+ {
19
+ /**
20
+ * @var MigrationFactory
21
+ */
22
+ private $migration;
23
+
24
+ public function __construct(MigrationFactory $factory)
25
+ {
26
+ $this->migration = $factory;
27
+ }
28
+
29
+ public function getMigrations(Updater $updater)
30
+ {
31
+ $migrations = [];
32
+
33
+ if (SettingsPiwik::isGitDeployment()) {
34
+ return $migrations;
35
+ }
36
+
37
+ $migrations[] = $this->migration->plugin->deactivate('ExamplePlugin');
38
+ $migrations[] = $this->migration->plugin->deactivate('ExampleLogTables');
39
+ $migrations[] = $this->migration->plugin->deactivate('ExampleUI');
40
+ $migrations[] = $this->migration->plugin->deactivate('ExampleReport');
41
+ $migrations[] = $this->migration->plugin->deactivate('ExampleAPI');
42
+ $migrations[] = $this->migration->plugin->deactivate('ExampleCommand');
43
+ $migrations[] = $this->migration->plugin->deactivate('ExampleSettingsPlugin');
44
+ $migrations[] = $this->migration->plugin->deactivate('ExampleTracker');
45
+ $migrations[] = $this->migration->plugin->deactivate('ExampleVisualization');
46
+
47
+ $migrations[] = $this->migration->plugin->uninstall('ExamplePlugin');
48
+ $migrations[] = $this->migration->plugin->uninstall('ExampleLogTables');
49
+ $migrations[] = $this->migration->plugin->uninstall('ExampleUI');
50
+ $migrations[] = $this->migration->plugin->uninstall('ExampleReport');
51
+ $migrations[] = $this->migration->plugin->uninstall('ExampleAPI');
52
+ $migrations[] = $this->migration->plugin->uninstall('ExampleCommand');
53
+ $migrations[] = $this->migration->plugin->uninstall('ExampleSettingsPlugin');
54
+ $migrations[] = $this->migration->plugin->uninstall('ExampleTracker');
55
+ $migrations[] = $this->migration->plugin->uninstall('ExampleVisualization');
56
+ return $migrations;
57
+ }
58
+
59
+ public function doUpdate(Updater $updater)
60
+ {
61
+ $updater->executeMigrations(__FILE__, $this->getMigrations($updater));
62
+ }
63
+
64
+ }
app/core/Url.php CHANGED
@@ -208,14 +208,10 @@ class Url
208
  }
209
 
210
  if ($host === false) {
211
- $host = self::getHostFromServerNameVar();
212
  if (empty($host)) {
213
- // fallback to old behaviour
214
- $host = @$_SERVER['HTTP_HOST'];
215
- if (empty($host)) {
216
- // if no current host, assume valid
217
- return true;
218
- }
219
  }
220
  }
221
 
@@ -301,18 +297,9 @@ class Url
301
  */
302
  public static function getHost($checkIfTrusted = true)
303
  {
304
- if (strlen($host = self::getHostFromServerNameVar())) {
305
- // if server_name is set we don't want to look at HTTP_HOST
306
 
307
- if (!$checkIfTrusted || self::isValidHost($host)) {
308
- return $host;
309
- }
310
- } elseif (isset($_SERVER['HTTP_HOST'])
311
- && strlen($host = $_SERVER['HTTP_HOST'])
312
- && (!$checkIfTrusted
313
- || self::isValidHost($host))
314
- ) {
315
- // HTTP/1.1 request
316
  return $host;
317
  }
318
 
@@ -324,6 +311,26 @@ class Url
324
  return false;
325
  }
326
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
327
  /**
328
  * Sets the host. Useful for CLI scripts, eg. core:archive command
329
  *
208
  }
209
 
210
  if ($host === false) {
211
+ $host = self::getHostFromServerVariable();
212
  if (empty($host)) {
213
+ // if no current host, assume valid
214
+ return true;
 
 
 
 
215
  }
216
  }
217
 
297
  */
298
  public static function getHost($checkIfTrusted = true)
299
  {
300
+ $host = self::getHostFromServerVariable();
 
301
 
302
+ if (strlen($host) && (!$checkIfTrusted || self::isValidHost($host))) {
 
 
 
 
 
 
 
 
303
  return $host;
304
  }
305
 
311
  return false;
312
  }
313
 
314
+ protected static function getHostFromServerVariable()
315
+ {
316
+ try {
317
+ // this fails when trying to get the hostname before the config was initialized
318
+ // e.g. for loading the domain specific configuration file
319
+ // in such a case we always use HTTP_HOST
320
+ $preferServerName = Config::getInstance()->General['host_validation_use_server_name'];
321
+ } catch (\Exception $e) {
322
+ $preferServerName = false;
323
+ }
324
+
325
+ if ($preferServerName && strlen($host = self::getHostFromServerNameVar())) {
326
+ return $host;
327
+ } elseif (isset($_SERVER['HTTP_HOST']) && strlen($host = $_SERVER['HTTP_HOST'])) {
328
+ return $host;
329
+ }
330
+
331
+ return false;
332
+ }
333
+
334
  /**
335
  * Sets the host. Useful for CLI scripts, eg. core:archive command
336
  *
app/core/Version.php CHANGED
@@ -20,7 +20,7 @@ final class Version
20
  * The current Matomo version.
21
  * @var string
22
  */
23
- const VERSION = '4.0.4-b1';
24
  const MAJOR_VERSION = 4;
25
 
26
  public function isStableVersion($version)
20
  * The current Matomo version.
21
  * @var string
22
  */
23
+ const VERSION = '4.0.5';
24
  const MAJOR_VERSION = 4;
25
 
26
  public function isStableVersion($version)
app/lang/de.json CHANGED
@@ -638,13 +638,13 @@
638
  "ColumnClicks": "Klicks",
639
  "ColumnClicksDocumentation": "Anzahl der Klicks auf diesen Link.",
640
  "ColumnDownloadURL": "Download-URL",
641
- "ColumnDownloadURLs": "URL Downloads",
642
  "ColumnEntryPageTitle": "Titel der Einstiegsseite",
643
  "ColumnEntryPageURL": "URL der Einstiegsseite",
644
- "ColumnEntryPageURLs": "Einstiegsseiten URLs",
645
  "ColumnExitPageTitle": "Titel der Ausstiegsseite",
646
  "ColumnExitPageURL": "URL der Ausstiegsseite",
647
- "ColumnExitPageURLs": "Ausgangsseiten URLS",
648
  "ColumnNoResultKeyword": "Suchbegriff ohne Ergebnisse",
649
  "ColumnPageName": "Seitenname",
650
  "ColumnPagesPerSearch": "Besuchte Ergebnisseiten",
638
  "ColumnClicks": "Klicks",
639
  "ColumnClicksDocumentation": "Anzahl der Klicks auf diesen Link.",
640
  "ColumnDownloadURL": "Download-URL",
641
+ "ColumnDownloadURLs": "Download-URLs",
642
  "ColumnEntryPageTitle": "Titel der Einstiegsseite",
643
  "ColumnEntryPageURL": "URL der Einstiegsseite",
644
+ "ColumnEntryPageURLs": "Einstiegsseiten-URLs",
645
  "ColumnExitPageTitle": "Titel der Ausstiegsseite",
646
  "ColumnExitPageURL": "URL der Ausstiegsseite",
647
+ "ColumnExitPageURLs": "Ausgangsseiten URLs",
648
  "ColumnNoResultKeyword": "Suchbegriff ohne Ergebnisse",
649
  "ColumnPageName": "Seitenname",
650
  "ColumnPagesPerSearch": "Besuchte Ergebnisseiten",
app/lang/en.json CHANGED
@@ -1349,6 +1349,7 @@
1349
  "GenericDevice": "Generic %s",
1350
  "MobileDevice": "Mobile device",
1351
  "Tablet": "Tablet",
 
1352
  "Phablet": "Phablet",
1353
  "TV": "Tv",
1354
  "UserAgent": "User-Agent",
1349
  "GenericDevice": "Generic %s",
1350
  "MobileDevice": "Mobile device",
1351
  "Tablet": "Tablet",
1352
+ "Peripheral": "Peripheral",
1353
  "Phablet": "Phablet",
1354
  "TV": "Tv",
1355
  "UserAgent": "User-Agent",
app/lang/zh-tw.json CHANGED
@@ -191,9 +191,9 @@
191
  "ExceptionLanguageFileNotFound": "找不到語系檔案「%s」。",
192
  "ExceptionMethodNotFound": "方法「%1$s」不存在或不適用於模組「%2$s」。",
193
  "ExceptionMissingFile": "檔案遺失:%s",
194
- "ExceptionUnexpectedFile": "檔案已在你的 Matomo 中找到,但並不在我們預料中。",
195
  "ExceptionUnexpectedFilePleaseDelete": "請刪除這些檔案來防止錯誤。",
196
- "ExceptionUnexpectedDirectory": "資料夾已在你的 Matomo 中找到,但並不在我們預料中。",
197
  "ExceptionUnexpectedDirectoryPleaseDelete": "請刪除這些資料夾來防止錯誤。",
198
  "ExceptionFileToDelete": "要刪除的檔案:%s",
199
  "ExceptionDirectoryToDelete": "要刪除的資料夾:%s",
@@ -622,7 +622,7 @@
622
  "ReportingApiReference": "報表 API 參考資料",
623
  "TopLinkTooltip": "透過簡單的 API 來取得 json、xml 等格式的網頁分析資料。",
624
  "UserAuthentication": "使用者驗證",
625
- "UsingTokenAuth": "如果你想%1$s經由程式碼或工作排程來請求資料。%2$s你需要新增 URL 參數 %3$s 至 API 呼叫網址來進行驗證。",
626
  "Glossary": "詞彙表",
627
  "LearnAboutCommonlyUsedTerms2": "瞭解更多最常使用的術語,讓 Matomo 分析發揮至極。",
628
  "EvolutionMetricName": "%s發展趨勢"
@@ -776,7 +776,7 @@
776
  "HttpTrackingApiDescription": "%1$sHTTP 追蹤 API%2$s 允許你追蹤任何事物。當你在使用尚無 SDK 可用的程式語言時這將會很實用。或是你想要以特別方式來追蹤裝置或應用程式時也很實用。",
777
  "JSTracking_CampaignKwdParam": "活動關鍵字參數",
778
  "JSTracking_CampaignNameParam": "活動名稱參數",
779
- "JSTracking_CodeNoteBeforeClosingHead": "確定這段程式碼放在你網站上的每一個網頁。我們推薦將它貼在 %1$s 結束標籤前。",
780
  "JSTracking_CodeNoteBeforeClosingHeadEmail": "確定這段程式碼放在你的網站上的每一個網頁。我們推薦將它貼在 head 標籤結束前。",
781
  "JSTracking_CustomCampaignQueryParam": "活動名稱及關鍵字使用自訂參數",
782
  "JSTracking_CrossDomain": "用來辨識獨立訪客的訪客 ID 預設被儲存在瀏覽器的第一方 Cookies 中,只能被相同域名的網頁存取。啟用跨域名連結讓你可以追蹤特定訪客的在同次訪問,甚至是在瀏覽不同域名的網頁中的活動及頁面訪問。當使用者點擊了你網站的任一別名網址,將會在網址後方加上 pk_vid 參數傳遞訪客 ID。",
@@ -800,10 +800,10 @@
800
  "JSTracking_VisitorCustomVars": "為此訪客追蹤自訂變數",
801
  "JSTracking_VisitorCustomVarsDesc": "例如變數名稱為「類型」,值為「顧客」。",
802
  "JSTracking_EndNote": "注意:你可以在管理中心的%1$s追蹤程式碼%2$s頁面中產生自訂的追蹤程式碼。",
803
- "JSTrackingIntro1": "你可以透過多種不同的方式追蹤你的網站訪客。推薦使用 JavaScript 的追蹤方式。要使用此方法必,你須先確定你的網站中的每一頁都有一樣的 JavaScript 程式碼,你可以在這裡產生。",
804
  "JSTrackingIntro2": "當你有了網站的 JavaScript 追蹤程式碼,請複製並貼上到所有你想透過 Matomo 追蹤的頁面上。",
805
  "JSTrackingIntro3a": "在大多數的網站、部落格、後台管理系統...等內,你可以使用預置的外掛來幫你做技術性的工作。(查看%1$s用來整合 Matomo 的外掛列表%2$s。)",
806
- "JSTrackingIntro3b": "果沒有看到你想要的外掛,你可以直接編輯你的網站模板,並將 JavaScript 追蹤程式碼增加到 &lt;\/head&gt; 標籤內,通常出現在「header.php」、「header.tpl」等類似的模板檔案中。",
807
  "JSTrackingIntro4": "如果你不想透過 JavaScript 來追蹤訪客,%1$s在下方產生圖片追蹤連結%2$s。",
808
  "JSTrackingIntro5": "如果你不只是想追蹤網頁訪問,可以查看%1$sMatomo Javascript 追蹤說明文件%2$s中的功能列表。可以透過這功能來追蹤目標、自訂變數、電子商務訂單、遺棄的購物車等等。",
809
  "LogoNotWriteableInstruction": "要使用你的自訂標誌取代 Matomo 預設標誌,請給予此資料夾寫入權限:%1$s Matomo 需要寫入權限才能將你的標誌儲存為檔案 %2$s。",
@@ -1137,7 +1137,7 @@
1137
  "PiwikWillBeUpgradedFromVersionXToVersionY": "Matomo 資料庫將從版本 %1$s 升級至新版本 %2$s 。",
1138
  "ReadyToGo": "準備好了嗎?",
1139
  "TheFollowingPluginsWillBeUpgradedX": "以下外掛將被更新:%s 。",
1140
- "TheFollowingDimensionsWillBeUpgradedX": "以下維度將被更新:%s。",
1141
  "ThereIsNewPluginVersionAvailableForUpdate": "有些你使用外掛在市集上已經有新版本:",
1142
  "ThereIsNewVersionAvailableForUpdate": "已有新版的 Matomo 可以更新",
1143
  "TheUpgradeProcessMayFailExecuteCommand": "如果你有較大型的 Matomo 資料庫,在瀏覽器上更新可能需要花費較長的時間。在這個情況下,你可以透過執行以下指令來更新:%s",
@@ -1449,7 +1449,7 @@
1449
  "ProfessionalServicesDedicatedSupport": "每一步都有專任的 Matomo 團隊成員幫助你。",
1450
  "ProfessionalServicesOnboarding": "問卷培訓,並與 Matomo 專員會議。",
1451
  "ProfessionalServicesSupport": "全年無休線上客服",
1452
- "ProfessionalServicesTraining": "獨佔的 Matomo 教學影片",
1453
  "ProfessionalServicesEmailAlerts": "Matomo 安全更新的 Email 通知",
1454
  "ContactUs": "聯絡我們",
1455
  "VisitTheForums": "訪問%1$s論壇%2$s從社區中的 Matomo 使用者中取得協助。",
@@ -1754,7 +1754,7 @@
1754
  "SystemCheckIconvHelp": "你需要設定及重建 PHP,然後啟用 iconv 支援,--with-iconv。",
1755
  "SystemCheckMailHelp": "意見回饋及忘記密碼的訊息若沒有 mail() 將無法寄送。",
1756
  "SystemCheckMbstring": "mbstring",
1757
- "SystemCheckMbstringHelp": "處理多字節的使用者介面或 API 回應資料必須使用 mbstring 擴充功能。並請檢查 php.ini 中的 mbstring.func_overload 已設定值為「0」。",
1758
  "SystemCheckMemoryLimit": "記憶體限制",
1759
  "SystemCheckMemoryLimitHelp": "在一個高流量的網站,資料彙整處理過程可能超過目前所允許使用的記憶體量。<br \/>如果必要,試著變更在你 php.ini 檔案裡的 memory_limit。",
1760
  "SystemCheckNoErrorsOrWarnings": "沒有錯誤或警告",
@@ -1808,7 +1808,7 @@
1808
  "WelcomeToCommunity": "歡迎來到 Matomo 社區!",
1809
  "CannotConnectToDb": "無法連接資料庫",
1810
  "CannotConnectToDbResolvingExplanation": "這可能是暫時性的問題,試試%1$s重新整理頁面%2$s。如果問題持續發生請聯絡你的 Matomo 管理員。",
1811
- "EmailPrivacyNotice": "你的 Email 將只用於向你寄送電子報,為此我們需要分享你的 Email 給第三方供應商。此供應商目前是 Mad Mimi,但是未來有可能變更。我們不會透漏你的 Email 給其他人,或將你的 Email 用於電子報以外的其他用途。你隨時可以退訂。參考我們的%1$s隱私權政策%2$s取得更多資訊。"
1812
  },
1813
  "Intl": {
1814
  "Continent_afr": "非洲",
@@ -3816,7 +3816,7 @@
3816
  "EnterUsernameOrEmail": "輸入使用者名稱或 Email",
3817
  "ExceptionAccessValues": "參數存取必須包含其中一個值:[ %1$s ],目前僅有「%2$s」。",
3818
  "ExceptionMultipleRoleSet": "只能設定一個角色,但是已被設定多個。使用其中之一:%s",
3819
- "ExceptionAnonymousNoCapabilities": "你不能給匿名使用者任何能力。",
3820
  "ExceptionAnonymousAccessNotPossible": "你只能給匿名使用者設定 %1$s 或 %2$s 存取權限。",
3821
  "ExceptionDeleteDoesNotExist": "使用者「%s」不存在,所以無法刪除它。",
3822
  "ExceptionDeleteOnlyUserWithSuperUserAccess": "無法刪除使用者「%s」",
191
  "ExceptionLanguageFileNotFound": "找不到語系檔案「%s」。",
192
  "ExceptionMethodNotFound": "方法「%1$s」不存在或不適用於模組「%2$s」。",
193
  "ExceptionMissingFile": "檔案遺失:%s",
194
+ "ExceptionUnexpectedFile": "已在你的 Matomo 中找到的檔案,但並不在我們預料中。",
195
  "ExceptionUnexpectedFilePleaseDelete": "請刪除這些檔案來防止錯誤。",
196
+ "ExceptionUnexpectedDirectory": "已在你的 Matomo 中找到的資料夾,但並不在我們預料中。",
197
  "ExceptionUnexpectedDirectoryPleaseDelete": "請刪除這些資料夾來防止錯誤。",
198
  "ExceptionFileToDelete": "要刪除的檔案:%s",
199
  "ExceptionDirectoryToDelete": "要刪除的資料夾:%s",
622
  "ReportingApiReference": "報表 API 參考資料",
623
  "TopLinkTooltip": "透過簡單的 API 來取得 json、xml 等格式的網頁分析資料。",
624
  "UserAuthentication": "使用者驗證",
625
+ "UsingTokenAuth": "如果你想%1$s經由程式碼或工作排程來請求資料。%2$s你需要增加 URL 參數 %3$s 至 API 呼叫網址來進行驗證。",
626
  "Glossary": "詞彙表",
627
  "LearnAboutCommonlyUsedTerms2": "瞭解更多最常使用的術語,讓 Matomo 分析發揮至極。",
628
  "EvolutionMetricName": "%s發展趨勢"
776
  "HttpTrackingApiDescription": "%1$sHTTP 追蹤 API%2$s 允許你追蹤任何事物。當你在使用尚無 SDK 可用的程式語言時這將會很實用。或是你想要以特別方式來追蹤裝置或應用程式時也很實用。",
777
  "JSTracking_CampaignKwdParam": "活動關鍵字參數",
778
  "JSTracking_CampaignNameParam": "活動名稱參數",
779
+ "JSTracking_CodeNoteBeforeClosingHead": "確定這段程式碼放在你網站內的每一個網頁中。我們推薦將它貼在 %1$s 結束標籤前。",
780
  "JSTracking_CodeNoteBeforeClosingHeadEmail": "確定這段程式碼放在你的網站上的每一個網頁。我們推薦將它貼在 head 標籤結束前。",
781
  "JSTracking_CustomCampaignQueryParam": "活動名稱及關鍵字使用自訂參數",
782
  "JSTracking_CrossDomain": "用來辨識獨立訪客的訪客 ID 預設被儲存在瀏覽器的第一方 Cookies 中,只能被相同域名的網頁存取。啟用跨域名連結讓你可以追蹤特定訪客的在同次訪問,甚至是在瀏覽不同域名的網頁中的活動及頁面訪問。當使用者點擊了你網站的任一別名網址,將會在網址後方加上 pk_vid 參數傳遞訪客 ID。",
800
  "JSTracking_VisitorCustomVars": "為此訪客追蹤自訂變數",
801
  "JSTracking_VisitorCustomVarsDesc": "例如變數名稱為「類型」,值為「顧客」。",
802
  "JSTracking_EndNote": "注意:你可以在管理中心的%1$s追蹤程式碼%2$s頁面中產生自訂的追蹤程式碼。",
803
+ "JSTrackingIntro1": "你可以透過多種不同的方式追蹤你的網站訪客。推薦使用 JavaScript 的追蹤方式。要使用此方法,你必須先確定你的網站中的每一頁都有一樣的 JavaScript 程式碼,你可以在這裡產生。",
804
  "JSTrackingIntro2": "當你有了網站的 JavaScript 追蹤程式碼,請複製並貼上到所有你想透過 Matomo 追蹤的頁面上。",
805
  "JSTrackingIntro3a": "在大多數的網站、部落格、後台管理系統...等內,你可以使用預置的外掛來幫你做技術性的工作。(查看%1$s用來整合 Matomo 的外掛列表%2$s。)",
806
+ "JSTrackingIntro3b": "如果沒有看到你想要的外掛,你可以直接編輯你的網站模板,並將 JavaScript 追蹤程式碼增加到 &lt;\/head&gt; 標籤內,通常出現在「header.php」、「header.tpl」等類似的模板檔案中。",
807
  "JSTrackingIntro4": "如果你不想透過 JavaScript 來追蹤訪客,%1$s在下方產生圖片追蹤連結%2$s。",
808
  "JSTrackingIntro5": "如果你不只是想追蹤網頁訪問,可以查看%1$sMatomo Javascript 追蹤說明文件%2$s中的功能列表。可以透過這功能來追蹤目標、自訂變數、電子商務訂單、遺棄的購物車等等。",
809
  "LogoNotWriteableInstruction": "要使用你的自訂標誌取代 Matomo 預設標誌,請給予此資料夾寫入權限:%1$s Matomo 需要寫入權限才能將你的標誌儲存為檔案 %2$s。",
1137
  "PiwikWillBeUpgradedFromVersionXToVersionY": "Matomo 資料庫將從版本 %1$s 升級至新版本 %2$s 。",
1138
  "ReadyToGo": "準備好了嗎?",
1139
  "TheFollowingPluginsWillBeUpgradedX": "以下外掛將被更新:%s 。",
1140
+ "TheFollowingDimensionsWillBeUpgradedX": "以下的資料表將被更新:%s。",
1141
  "ThereIsNewPluginVersionAvailableForUpdate": "有些你使用外掛在市集上已經有新版本:",
1142
  "ThereIsNewVersionAvailableForUpdate": "已有新版的 Matomo 可以更新",
1143
  "TheUpgradeProcessMayFailExecuteCommand": "如果你有較大型的 Matomo 資料庫,在瀏覽器上更新可能需要花費較長的時間。在這個情況下,你可以透過執行以下指令來更新:%s",
1449
  "ProfessionalServicesDedicatedSupport": "每一步都有專任的 Matomo 團隊成員幫助你。",
1450
  "ProfessionalServicesOnboarding": "問卷培訓,並與 Matomo 專員會議。",
1451
  "ProfessionalServicesSupport": "全年無休線上客服",
1452
+ "ProfessionalServicesTraining": "可觀看 Matomo 獨家教學影片",
1453
  "ProfessionalServicesEmailAlerts": "Matomo 安全更新的 Email 通知",
1454
  "ContactUs": "聯絡我們",
1455
  "VisitTheForums": "訪問%1$s論壇%2$s從社區中的 Matomo 使用者中取得協助。",
1754
  "SystemCheckIconvHelp": "你需要設定及重建 PHP,然後啟用 iconv 支援,--with-iconv。",
1755
  "SystemCheckMailHelp": "意見回饋及忘記密碼的訊息若沒有 mail() 將無法寄送。",
1756
  "SystemCheckMbstring": "mbstring",
1757
+ "SystemCheckMbstringHelp": "處理多字節的使用者介面或 API 回應資料必須使用 mbstring 擴充功能。並請檢查 php.ini 中的 mbstring.func_overload 已將值設定為「0」。",
1758
  "SystemCheckMemoryLimit": "記憶體限制",
1759
  "SystemCheckMemoryLimitHelp": "在一個高流量的網站,資料彙整處理過程可能超過目前所允許使用的記憶體量。<br \/>如果必要,試著變更在你 php.ini 檔案裡的 memory_limit。",
1760
  "SystemCheckNoErrorsOrWarnings": "沒有錯誤或警告",
1808
  "WelcomeToCommunity": "歡迎來到 Matomo 社區!",
1809
  "CannotConnectToDb": "無法連接資料庫",
1810
  "CannotConnectToDbResolvingExplanation": "這可能是暫時性的問題,試試%1$s重新整理頁面%2$s。如果問題持續發生請聯絡你的 Matomo 管理員。",
1811
+ "EmailPrivacyNotice": "你的 Email 將只用於向你寄送電子報,為此我們需要分享你的 Email 給第三方供應商。此供應商目前是 Mad Mimi,但是未來有可能變更。我們不會透漏你的 Email 給其他人,或將你的 Email 用於電子報以外的其他用途。你隨時可以取消訂閱。參考我們的%1$s隱私權政策%2$s以取得更多資訊。"
1812
  },
1813
  "Intl": {
1814
  "Continent_afr": "非洲",
3816
  "EnterUsernameOrEmail": "輸入使用者名稱或 Email",
3817
  "ExceptionAccessValues": "參數存取必須包含其中一個值:[ %1$s ],目前僅有「%2$s」。",
3818
  "ExceptionMultipleRoleSet": "只能設定一個角色,但是已被設定多個。使用其中之一:%s",
3819
+ "ExceptionAnonymousNoCapabilities": "你不能給匿名使用者任何權限。",
3820
  "ExceptionAnonymousAccessNotPossible": "你只能給匿名使用者設定 %1$s 或 %2$s 存取權限。",
3821
  "ExceptionDeleteDoesNotExist": "使用者「%s」不存在,所以無法刪除它。",
3822
  "ExceptionDeleteOnlyUserWithSuperUserAccess": "無法刪除使用者「%s」",
app/plugins/DevicesDetection/functions.php CHANGED
@@ -178,6 +178,7 @@ function getDeviceTypeLabel($label)
178
  'portable media player' => 'DevicesDetection_PortableMediaPlayer',
179
  'smart speaker' => 'DevicesDetection_SmartSpeaker',
180
  'wearable' => 'DevicesDetection_Wearable',
 
181
  );
182
 
183
  $deviceTypes = DeviceParser::getAvailableDeviceTypes();
178
  'portable media player' => 'DevicesDetection_PortableMediaPlayer',
179
  'smart speaker' => 'DevicesDetection_SmartSpeaker',
180
  'wearable' => 'DevicesDetection_Wearable',
181
+ 'peripheral' => 'DevicesDetection_Peripheral',
182
  );
183
 
184
  $deviceTypes = DeviceParser::getAvailableDeviceTypes();
app/plugins/Morpheus/icons/dist/devices/peripheral.png ADDED
Binary file
app/plugins/PagePerformance/Tracker/PerformanceDataProcessor.php CHANGED
@@ -47,13 +47,6 @@ class PerformanceDataProcessor extends RequestProcessor
47
  return;
48
  }
49
 
50
- $idLinkVa = $this->getPageViewId($idVisit, $pageViewId);
51
-
52
- // ignore requests
53
- if (empty($idLinkVa)) {
54
- return;
55
- }
56
-
57
  /** @var ActionDimension[] $performanceDimensions */
58
  $performanceDimensions = [
59
  new TimeNetwork(),
@@ -77,6 +70,13 @@ class PerformanceDataProcessor extends RequestProcessor
77
  return; // no values to update given with the request
78
  }
79
 
 
 
 
 
 
 
 
80
  Log::info('Updating page performance metrics of page view with id ' . $pageViewId);
81
 
82
  $model = new Model();
47
  return;
48
  }
49
 
 
 
 
 
 
 
 
50
  /** @var ActionDimension[] $performanceDimensions */
51
  $performanceDimensions = [
52
  new TimeNetwork(),
70
  return; // no values to update given with the request
71
  }
72
 
73
+ $idLinkVa = $this->getPageViewId($idVisit, $pageViewId);
74
+
75
+ // ignore requests
76
+ if (empty($idLinkVa)) {
77
+ return;
78
+ }
79
+
80
  Log::info('Updating page performance metrics of page view with id ' . $pageViewId);
81
 
82
  $model = new Model();
app/plugins/ScheduledReports/config/tcpdf_config.php CHANGED
@@ -53,21 +53,16 @@ if (!defined('K_TCPDF_EXTERNAL_CONFIG')) {
53
  if (!defined('K_PATH_URL')) {
54
  // Automatic calculation for the following K_PATH_URL constant
55
  $k_path_url = K_PATH_MAIN; // default value for console mode
56
- if (isset($_SERVER['SERVER_NAME']) AND (!empty($_SERVER['SERVER_NAME']))) {
57
- if (isset($_SERVER['HTTPS']) AND (!empty($_SERVER['HTTPS'])) AND strtolower($_SERVER['HTTPS']) != 'off') {
58
- $k_path_url = 'https://';
59
- } else {
60
- $k_path_url = 'http://';
61
- }
62
- $k_path_url .= \Piwik\Url::getHostFromServerNameVar();
63
- $k_path_url .= str_replace('\\', '/', substr(K_PATH_MAIN, (strlen($_SERVER['DOCUMENT_ROOT']) - 1)));
64
- } elseif (isset($_SERVER['HTTP_HOST']) AND (!empty($_SERVER['HTTP_HOST']))) {
65
- if (isset($_SERVER['HTTPS']) AND (!empty($_SERVER['HTTPS'])) AND strtolower($_SERVER['HTTPS']) != 'off') {
66
  $k_path_url = 'https://';
67
  } else {
68
  $k_path_url = 'http://';
69
  }
70
- $k_path_url .= $_SERVER['HTTP_HOST'];
71
  $k_path_url .= str_replace('\\', '/', substr(K_PATH_MAIN, (strlen($_SERVER['DOCUMENT_ROOT']) - 1)));
72
  }
73
 
53
  if (!defined('K_PATH_URL')) {
54
  // Automatic calculation for the following K_PATH_URL constant
55
  $k_path_url = K_PATH_MAIN; // default value for console mode
56
+
57
+ $host = \Piwik\Url::getHost(false);
58
+
59
+ if ($host) {
60
+ if (isset($_SERVER['HTTPS']) and (!empty($_SERVER['HTTPS'])) and strtolower($_SERVER['HTTPS']) != 'off') {
 
 
 
 
 
61
  $k_path_url = 'https://';
62
  } else {
63
  $k_path_url = 'http://';
64
  }
65
+ $k_path_url .= $host;
66
  $k_path_url .= str_replace('\\', '/', substr(K_PATH_MAIN, (strlen($_SERVER['DOCUMENT_ROOT']) - 1)));
67
  }
68
 
app/plugins/TagManager/Dao/TagsDao.php CHANGED
@@ -200,13 +200,7 @@ class TagsDao extends BaseDao implements TagManagerDao
200
  }
201
 
202
  usort($tags, function ($tagA, $tagB) use ($tags) {
203
- if ($tagA['priority'] === $tagB['priority']) {
204
- // for php5 making sure to have same sort order as on php7
205
- $indexA = array_search($tagA, $tags);
206
- $indexB = array_search($tagB, $tags);
207
- return $indexA - $indexB;
208
- }
209
- return $tagA['priority'] > $tagB['priority'];
210
  });
211
 
212
  return $tags;
200
  }
201
 
202
  usort($tags, function ($tagA, $tagB) use ($tags) {
203
+ return strcasecmp($tagA['priority'], $tagB['priority']);
 
 
 
 
 
 
204
  });
205
 
206
  return $tags;
app/plugins/TagManager/Template/BaseTemplate.php CHANGED
@@ -9,6 +9,7 @@ namespace Piwik\Plugins\TagManager\Template;
9
 
10
  use JShrink\Minifier;
11
  use Piwik\Common;
 
12
  use Piwik\Development;
13
  use Piwik\Piwik;
14
  use Piwik\Plugins\CorePluginsAdmin\SettingsMetadata;
@@ -206,7 +207,9 @@ abstract class BaseTemplate
206
  $file = $base . 'web.js';
207
  $minFile = $base . 'web.min.js';
208
 
209
- if (Development::isEnabled() && $this->hasTemplateFile($file)) {
 
 
210
  // during dev mode we prefer the non-minified version for debugging purposes, but we still use
211
  // the internal minifier to make sure we debug the same as a user would receive
212
  $template = $this->loadTemplateFile($file);
9
 
10
  use JShrink\Minifier;
11
  use Piwik\Common;
12
+ use Piwik\Container\StaticContainer;
13
  use Piwik\Development;
14
  use Piwik\Piwik;
15
  use Piwik\Plugins\CorePluginsAdmin\SettingsMetadata;
207
  $file = $base . 'web.js';
208
  $minFile = $base . 'web.min.js';
209
 
210
+ if (!StaticContainer::get('TagManagerJSMinificationEnabled')) {
211
+ return $this->loadTemplateFile($file); // avoid minification in test mode
212
+ } elseif (Development::isEnabled() && $this->hasTemplateFile($file)) {
213
  // during dev mode we prefer the non-minified version for debugging purposes, but we still use
214
  // the internal minifier to make sure we debug the same as a user would receive
215
  $template = $this->loadTemplateFile($file);
app/plugins/TagManager/config/config.php CHANGED
@@ -14,6 +14,7 @@ return array(
14
  // the prefix for any container file
15
  return 'container_';
16
  },
 
17
  'fileintegrity.ignore' => DI\add(array(
18
  DI\get('fileintegrityIgnoreTagManager')
19
  )),
14
  // the prefix for any container file
15
  return 'container_';
16
  },
17
+ 'TagManagerJSMinificationEnabled' => true,
18
  'fileintegrity.ignore' => DI\add(array(
19
  DI\get('fileintegrityIgnoreTagManager')
20
  )),
app/plugins/TagManager/config/test.php CHANGED
@@ -18,5 +18,6 @@ return array(
18
  $stylesheets[] = 'plugins/TagManager/tests/resources/uitest-override.css';
19
  }
20
  })),
21
- ))
 
22
  );
18
  $stylesheets[] = 'plugins/TagManager/tests/resources/uitest-override.css';
19
  }
20
  })),
21
+ )),
22
+ 'TagManagerJSMinificationEnabled' => false,
23
  );
app/vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInit99d6ebaba5ed92b541ba43a3db60d098::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInite73d303dda4e084c9efc3d2e6d883365::getLoader();
app/vendor/composer/InstalledVersions.php CHANGED
@@ -24,12 +24,12 @@ class InstalledVersions
24
  private static $installed = array (
25
  'root' =>
26
  array (
27
- 'pretty_version' => '4.0.4-b1',
28
- 'version' => '4.0.4.0-beta1',
29
  'aliases' =>
30
  array (
31
  ),
32
- 'reference' => 'de127131c5f6c4a87e8f751ae4f0e98a0546e074',
33
  'name' => 'matomo/matomo',
34
  ),
35
  'versions' =>
@@ -108,12 +108,12 @@ private static $installed = array (
108
  ),
109
  'matomo/device-detector' =>
110
  array (
111
- 'pretty_version' => '4.0.1',
112
- 'version' => '4.0.1.0',
113
  'aliases' =>
114
  array (
115
  ),
116
- 'reference' => '3799f71f4211346158a1e96f3b0bef615c873923',
117
  ),
118
  'matomo/ini' =>
119
  array (
@@ -126,12 +126,12 @@ private static $installed = array (
126
  ),
127
  'matomo/matomo' =>
128
  array (
129
- 'pretty_version' => '4.0.4-b1',
130
- 'version' => '4.0.4.0-beta1',
131
  'aliases' =>
132
  array (
133
  ),
134
- 'reference' => 'de127131c5f6c4a87e8f751ae4f0e98a0546e074',
135
  ),
136
  'matomo/matomo-php-tracker' =>
137
  array (
@@ -297,7 +297,7 @@ private static $installed = array (
297
  array (
298
  'replaced' =>
299
  array (
300
- 0 => '4.0.1',
301
  ),
302
  ),
303
  'piwik/referrer-spam-blacklist' =>
24
  private static $installed = array (
25
  'root' =>
26
  array (
27
+ 'pretty_version' => '4.0.5',
28
+ 'version' => '4.0.5.0',
29
  'aliases' =>
30
  array (
31
  ),
32
+ 'reference' => '5f7eb3e1f655ec2aa0d0360c3f5deb89688a4344',
33
  'name' => 'matomo/matomo',
34
  ),
35
  'versions' =>
108
  ),
109
  'matomo/device-detector' =>
110
  array (
111
+ 'pretty_version' => '4.0.2',
112
+ 'version' => '4.0.2.0',
113
  'aliases' =>
114
  array (
115
  ),
116
+ 'reference' => '20572bbf8607cfc2f91a11fc75e9a3c6592bdc7a',
117
  ),
118
  'matomo/ini' =>
119
  array (
126
  ),
127
  'matomo/matomo' =>
128
  array (
129
+ 'pretty_version' => '4.0.5',
130
+ 'version' => '4.0.5.0',
131
  'aliases' =>
132
  array (
133
  ),
134
+ 'reference' => '5f7eb3e1f655ec2aa0d0360c3f5deb89688a4344',
135
  ),
136
  'matomo/matomo-php-tracker' =>
137
  array (
297
  array (
298
  'replaced' =>
299
  array (
300
+ 0 => '4.0.2',
301
  ),
302
  ),
303
  'piwik/referrer-spam-blacklist' =>
app/vendor/composer/autoload_classmap.php CHANGED
@@ -2302,6 +2302,7 @@ return array(
2302
  'Piwik\\Plugins\\UsersManager\\tests\\Fixtures\\ManyUsers' => $baseDir . '/plugins/UsersManager/tests/Fixtures/ManyUsers.php',
2303
  'Piwik\\Plugins\\UsersManager\\tests\\Integration\\ModelTest' => $baseDir . '/plugins/UsersManager/tests/Integration/ModelTest.php',
2304
  'Piwik\\Plugins\\UsersManager\\tests\\Integration\\UserAccessFilterTest' => $baseDir . '/plugins/UsersManager/tests/Integration/UserAccessFilterTest.php',
 
2305
  'Piwik\\Plugins\\UsersManager\\tests\\Integration\\UsersManagerTest' => $baseDir . '/plugins/UsersManager/tests/Integration/UsersManagerTest.php',
2306
  'Piwik\\Plugins\\UsersManager\\tests\\System\\ApiTest' => $baseDir . '/plugins/UsersManager/tests/System/ApiTest.php',
2307
  'Piwik\\Plugins\\VisitFrequency\\API' => $baseDir . '/plugins/VisitFrequency/API.php',
2302
  'Piwik\\Plugins\\UsersManager\\tests\\Fixtures\\ManyUsers' => $baseDir . '/plugins/UsersManager/tests/Fixtures/ManyUsers.php',
2303
  'Piwik\\Plugins\\UsersManager\\tests\\Integration\\ModelTest' => $baseDir . '/plugins/UsersManager/tests/Integration/ModelTest.php',
2304
  'Piwik\\Plugins\\UsersManager\\tests\\Integration\\UserAccessFilterTest' => $baseDir . '/plugins/UsersManager/tests/Integration/UserAccessFilterTest.php',
2305
+ 'Piwik\\Plugins\\UsersManager\\tests\\Integration\\UserPreferencesTest' => $baseDir . '/plugins/UsersManager/tests/Integration/UserPreferencesTest.php',
2306
  'Piwik\\Plugins\\UsersManager\\tests\\Integration\\UsersManagerTest' => $baseDir . '/plugins/UsersManager/tests/Integration/UsersManagerTest.php',
2307
  'Piwik\\Plugins\\UsersManager\\tests\\System\\ApiTest' => $baseDir . '/plugins/UsersManager/tests/System/ApiTest.php',
2308
  'Piwik\\Plugins\\VisitFrequency\\API' => $baseDir . '/plugins/VisitFrequency/API.php',
app/vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInit99d6ebaba5ed92b541ba43a3db60d098
6
  {
7
  private static $loader;
8
 
@@ -22,9 +22,9 @@ class ComposerAutoloaderInit99d6ebaba5ed92b541ba43a3db60d098
22
  return self::$loader;
23
  }
24
 
25
- spl_autoload_register(array('ComposerAutoloaderInit99d6ebaba5ed92b541ba43a3db60d098', 'loadClassLoader'), true, false);
26
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
27
- spl_autoload_unregister(array('ComposerAutoloaderInit99d6ebaba5ed92b541ba43a3db60d098', 'loadClassLoader'));
28
 
29
  $includePaths = require __DIR__ . '/include_paths.php';
30
  $includePaths[] = get_include_path();
@@ -34,7 +34,7 @@ class ComposerAutoloaderInit99d6ebaba5ed92b541ba43a3db60d098
34
  if ($useStaticLoader) {
35
  require __DIR__ . '/autoload_static.php';
36
 
37
- call_user_func(\Composer\Autoload\ComposerStaticInit99d6ebaba5ed92b541ba43a3db60d098::getInitializer($loader));
38
  } else {
39
  $map = require __DIR__ . '/autoload_namespaces.php';
40
  foreach ($map as $namespace => $path) {
@@ -55,19 +55,19 @@ class ComposerAutoloaderInit99d6ebaba5ed92b541ba43a3db60d098
55
  $loader->register(false);
56
 
57
  if ($useStaticLoader) {
58
- $includeFiles = Composer\Autoload\ComposerStaticInit99d6ebaba5ed92b541ba43a3db60d098::$files;
59
  } else {
60
  $includeFiles = require __DIR__ . '/autoload_files.php';
61
  }
62
  foreach ($includeFiles as $fileIdentifier => $file) {
63
- composerRequire99d6ebaba5ed92b541ba43a3db60d098($fileIdentifier, $file);
64
  }
65
 
66
  return $loader;
67
  }
68
  }
69
 
70
- function composerRequire99d6ebaba5ed92b541ba43a3db60d098($fileIdentifier, $file)
71
  {
72
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
73
  require $file;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInite73d303dda4e084c9efc3d2e6d883365
6
  {
7
  private static $loader;
8
 
22
  return self::$loader;
23
  }
24
 
25
+ spl_autoload_register(array('ComposerAutoloaderInite73d303dda4e084c9efc3d2e6d883365', 'loadClassLoader'), true, false);
26
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
27
+ spl_autoload_unregister(array('ComposerAutoloaderInite73d303dda4e084c9efc3d2e6d883365', 'loadClassLoader'));
28
 
29
  $includePaths = require __DIR__ . '/include_paths.php';
30
  $includePaths[] = get_include_path();
34
  if ($useStaticLoader) {
35
  require __DIR__ . '/autoload_static.php';
36
 
37
+ call_user_func(\Composer\Autoload\ComposerStaticInite73d303dda4e084c9efc3d2e6d883365::getInitializer($loader));
38
  } else {
39
  $map = require __DIR__ . '/autoload_namespaces.php';
40
  foreach ($map as $namespace => $path) {
55
  $loader->register(false);
56
 
57
  if ($useStaticLoader) {
58
+ $includeFiles = Composer\Autoload\ComposerStaticInite73d303dda4e084c9efc3d2e6d883365::$files;
59
  } else {
60
  $includeFiles = require __DIR__ . '/autoload_files.php';
61
  }
62
  foreach ($includeFiles as $fileIdentifier => $file) {
63
+ composerRequiree73d303dda4e084c9efc3d2e6d883365($fileIdentifier, $file);
64
  }
65
 
66
  return $loader;
67
  }
68
  }
69
 
70
+ function composerRequiree73d303dda4e084c9efc3d2e6d883365($fileIdentifier, $file)
71
  {
72
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
73
  require $file;
app/vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInit99d6ebaba5ed92b541ba43a3db60d098
8
  {
9
  public static $files = array (
10
  '04c6c5c2f7095ccf6c481d3e53e1776f' => __DIR__ . '/..' . '/mustangostang/spyc/Spyc.php',
@@ -2549,6 +2549,7 @@ class ComposerStaticInit99d6ebaba5ed92b541ba43a3db60d098
2549
  'Piwik\\Plugins\\UsersManager\\tests\\Fixtures\\ManyUsers' => __DIR__ . '/../..' . '/plugins/UsersManager/tests/Fixtures/ManyUsers.php',
2550
  'Piwik\\Plugins\\UsersManager\\tests\\Integration\\ModelTest' => __DIR__ . '/../..' . '/plugins/UsersManager/tests/Integration/ModelTest.php',
2551
  'Piwik\\Plugins\\UsersManager\\tests\\Integration\\UserAccessFilterTest' => __DIR__ . '/../..' . '/plugins/UsersManager/tests/Integration/UserAccessFilterTest.php',
 
2552
  'Piwik\\Plugins\\UsersManager\\tests\\Integration\\UsersManagerTest' => __DIR__ . '/../..' . '/plugins/UsersManager/tests/Integration/UsersManagerTest.php',
2553
  'Piwik\\Plugins\\UsersManager\\tests\\System\\ApiTest' => __DIR__ . '/../..' . '/plugins/UsersManager/tests/System/ApiTest.php',
2554
  'Piwik\\Plugins\\VisitFrequency\\API' => __DIR__ . '/../..' . '/plugins/VisitFrequency/API.php',
@@ -3190,11 +3191,11 @@ class ComposerStaticInit99d6ebaba5ed92b541ba43a3db60d098
3190
  public static function getInitializer(ClassLoader $loader)
3191
  {
3192
  return \Closure::bind(function () use ($loader) {
3193
- $loader->prefixLengthsPsr4 = ComposerStaticInit99d6ebaba5ed92b541ba43a3db60d098::$prefixLengthsPsr4;
3194
- $loader->prefixDirsPsr4 = ComposerStaticInit99d6ebaba5ed92b541ba43a3db60d098::$prefixDirsPsr4;
3195
- $loader->prefixesPsr0 = ComposerStaticInit99d6ebaba5ed92b541ba43a3db60d098::$prefixesPsr0;
3196
- $loader->fallbackDirsPsr0 = ComposerStaticInit99d6ebaba5ed92b541ba43a3db60d098::$fallbackDirsPsr0;
3197
- $loader->classMap = ComposerStaticInit99d6ebaba5ed92b541ba43a3db60d098::$classMap;
3198
 
3199
  }, null, ClassLoader::class);
3200
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInite73d303dda4e084c9efc3d2e6d883365
8
  {
9
  public static $files = array (
10
  '04c6c5c2f7095ccf6c481d3e53e1776f' => __DIR__ . '/..' . '/mustangostang/spyc/Spyc.php',
2549
  'Piwik\\Plugins\\UsersManager\\tests\\Fixtures\\ManyUsers' => __DIR__ . '/../..' . '/plugins/UsersManager/tests/Fixtures/ManyUsers.php',
2550
  'Piwik\\Plugins\\UsersManager\\tests\\Integration\\ModelTest' => __DIR__ . '/../..' . '/plugins/UsersManager/tests/Integration/ModelTest.php',
2551
  'Piwik\\Plugins\\UsersManager\\tests\\Integration\\UserAccessFilterTest' => __DIR__ . '/../..' . '/plugins/UsersManager/tests/Integration/UserAccessFilterTest.php',
2552
+ 'Piwik\\Plugins\\UsersManager\\tests\\Integration\\UserPreferencesTest' => __DIR__ . '/../..' . '/plugins/UsersManager/tests/Integration/UserPreferencesTest.php',
2553
  'Piwik\\Plugins\\UsersManager\\tests\\Integration\\UsersManagerTest' => __DIR__ . '/../..' . '/plugins/UsersManager/tests/Integration/UsersManagerTest.php',
2554
  'Piwik\\Plugins\\UsersManager\\tests\\System\\ApiTest' => __DIR__ . '/../..' . '/plugins/UsersManager/tests/System/ApiTest.php',
2555
  'Piwik\\Plugins\\VisitFrequency\\API' => __DIR__ . '/../..' . '/plugins/VisitFrequency/API.php',
3191
  public static function getInitializer(ClassLoader $loader)
3192
  {
3193
  return \Closure::bind(function () use ($loader) {
3194
+ $loader->prefixLengthsPsr4 = ComposerStaticInite73d303dda4e084c9efc3d2e6d883365::$prefixLengthsPsr4;
3195
+ $loader->prefixDirsPsr4 = ComposerStaticInite73d303dda4e084c9efc3d2e6d883365::$prefixDirsPsr4;
3196
+ $loader->prefixesPsr0 = ComposerStaticInite73d303dda4e084c9efc3d2e6d883365::$prefixesPsr0;
3197
+ $loader->fallbackDirsPsr0 = ComposerStaticInite73d303dda4e084c9efc3d2e6d883365::$fallbackDirsPsr0;
3198
+ $loader->classMap = ComposerStaticInite73d303dda4e084c9efc3d2e6d883365::$classMap;
3199
 
3200
  }, null, ClassLoader::class);
3201
  }
app/vendor/composer/installed.json CHANGED
@@ -512,17 +512,17 @@
512
  },
513
  {
514
  "name": "matomo/device-detector",
515
- "version": "4.0.1",
516
- "version_normalized": "4.0.1.0",
517
  "source": {
518
  "type": "git",
519
  "url": "https://github.com/matomo-org/device-detector.git",
520
- "reference": "3799f71f4211346158a1e96f3b0bef615c873923"
521
  },
522
  "dist": {
523
  "type": "zip",
524
- "url": "https://api.github.com/repos/matomo-org/device-detector/zipball/3799f71f4211346158a1e96f3b0bef615c873923",
525
- "reference": "3799f71f4211346158a1e96f3b0bef615c873923",
526
  "shasum": ""
527
  },
528
  "require": {
@@ -545,7 +545,7 @@
545
  "doctrine/cache": "Can directly be used for caching purpose",
546
  "ext-yaml": "Necessary for using the Pecl YAML parser"
547
  },
548
- "time": "2020-11-12T17:19:41+00:00",
549
  "type": "library",
550
  "installation-source": "dist",
551
  "autoload": {
512
  },
513
  {
514
  "name": "matomo/device-detector",
515
+ "version": "4.0.2",
516
+ "version_normalized": "4.0.2.0",
517
  "source": {
518
  "type": "git",
519
  "url": "https://github.com/matomo-org/device-detector.git",
520
+ "reference": "20572bbf8607cfc2f91a11fc75e9a3c6592bdc7a"
521
  },
522
  "dist": {
523
  "type": "zip",
524
+ "url": "https://api.github.com/repos/matomo-org/device-detector/zipball/20572bbf8607cfc2f91a11fc75e9a3c6592bdc7a",
525
+ "reference": "20572bbf8607cfc2f91a11fc75e9a3c6592bdc7a",
526
  "shasum": ""
527
  },
528
  "require": {
545
  "doctrine/cache": "Can directly be used for caching purpose",
546
  "ext-yaml": "Necessary for using the Pecl YAML parser"
547
  },
548
+ "time": "2020-12-07T09:40:38+00:00",
549
  "type": "library",
550
  "installation-source": "dist",
551
  "autoload": {
app/vendor/composer/installed.php CHANGED
@@ -1,12 +1,12 @@
1
  <?php return array (
2
  'root' =>
3
  array (
4
- 'pretty_version' => '4.0.4-b1',
5
- 'version' => '4.0.4.0-beta1',
6
  'aliases' =>
7
  array (
8
  ),
9
- 'reference' => 'de127131c5f6c4a87e8f751ae4f0e98a0546e074',
10
  'name' => 'matomo/matomo',
11
  ),
12
  'versions' =>
@@ -85,12 +85,12 @@
85
  ),
86
  'matomo/device-detector' =>
87
  array (
88
- 'pretty_version' => '4.0.1',
89
- 'version' => '4.0.1.0',
90
  'aliases' =>
91
  array (
92
  ),
93
- 'reference' => '3799f71f4211346158a1e96f3b0bef615c873923',
94
  ),
95
  'matomo/ini' =>
96
  array (
@@ -103,12 +103,12 @@
103
  ),
104
  'matomo/matomo' =>
105
  array (
106
- 'pretty_version' => '4.0.4-b1',
107
- 'version' => '4.0.4.0-beta1',
108
  'aliases' =>
109
  array (
110
  ),
111
- 'reference' => 'de127131c5f6c4a87e8f751ae4f0e98a0546e074',
112
  ),
113
  'matomo/matomo-php-tracker' =>
114
  array (
@@ -274,7 +274,7 @@
274
  array (
275
  'replaced' =>
276
  array (
277
- 0 => '4.0.1',
278
  ),
279
  ),
280
  'piwik/referrer-spam-blacklist' =>
1
  <?php return array (
2
  'root' =>
3
  array (
4
+ 'pretty_version' => '4.0.5',
5
+ 'version' => '4.0.5.0',
6
  'aliases' =>
7
  array (
8
  ),
9
+ 'reference' => '5f7eb3e1f655ec2aa0d0360c3f5deb89688a4344',
10
  'name' => 'matomo/matomo',
11
  ),
12
  'versions' =>
85
  ),
86
  'matomo/device-detector' =>
87
  array (
88
+ 'pretty_version' => '4.0.2',
89
+ 'version' => '4.0.2.0',
90
  'aliases' =>
91
  array (
92
  ),
93
+ 'reference' => '20572bbf8607cfc2f91a11fc75e9a3c6592bdc7a',
94
  ),
95
  'matomo/ini' =>
96
  array (
103
  ),
104
  'matomo/matomo' =>
105
  array (
106
+ 'pretty_version' => '4.0.5',
107
+ 'version' => '4.0.5.0',
108
  'aliases' =>
109
  array (
110
  ),
111
+ 'reference' => '5f7eb3e1f655ec2aa0d0360c3f5deb89688a4344',
112
  ),
113
  'matomo/matomo-php-tracker' =>
114
  array (
274
  array (
275
  'replaced' =>
276
  array (
277
+ 0 => '4.0.2',
278
  ),
279
  ),
280
  'piwik/referrer-spam-blacklist' =>
app/vendor/matomo/device-detector/.yamllint ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ extends: relaxed
2
+
3
+ ignore: |
4
+ vendor/**
5
+
6
+ rules:
7
+ line-length: disable
8
+
9
+ trailing-spaces:
10
+ ignore: |
11
+ Tests/**
app/vendor/matomo/device-detector/DeviceDetector.php CHANGED
@@ -62,7 +62,7 @@ class DeviceDetector
62
  /**
63
  * Current version number of DeviceDetector
64
  */
65
- public const VERSION = '4.0.1';
66
 
67
  /**
68
  * Constant used as value for unknown browser / os
62
  /**
63
  * Current version number of DeviceDetector
64
  */
65
+ public const VERSION = '4.0.2';
66
 
67
  /**
68
  * Constant used as value for unknown browser / os
app/vendor/matomo/device-detector/Parser/AbstractParser.php CHANGED
@@ -289,7 +289,7 @@ abstract class AbstractParser
289
  *
290
  * Example:
291
  * $versionString = 'v$2'
292
- * $matches = array('version_1_0_1', '1_0_1')
293
  * return value would be v1.0.1
294
  *
295
  * @param string $versionString
289
  *
290
  * Example:
291
  * $versionString = 'v$2'
292
+ * $matches = ['version_1_0_1', '1_0_1']
293
  * return value would be v1.0.1
294
  *
295
  * @param string $versionString
app/vendor/matomo/device-detector/Parser/Client/Browser.php CHANGED
@@ -69,9 +69,11 @@ class Browser extends AbstractClientParser
69
  'BJ' => 'Bunjalloo',
70
  'BL' => 'B-Line',
71
  'BU' => 'Blue Browser',
 
72
  'BR' => 'Brave',
73
  'BK' => 'BriskBard',
74
  'BX' => 'BrowseX',
 
75
  'CA' => 'Camino',
76
  'CL' => 'CCleaner',
77
  'C0' => 'Centaury',
@@ -95,6 +97,7 @@ class Browser extends AbstractClientParser
95
  'CY' => 'Cyberfox',
96
  'CS' => 'Cheshire',
97
  'CT' => 'Crusta',
 
98
  'CU' => 'Cunaguaro',
99
  'CV' => 'Chrome Webview',
100
  'DB' => 'dbrowser',
@@ -130,6 +133,7 @@ class Browser extends AbstractClientParser
130
  'FN' => 'Fireweb Navigator',
131
  'FU' => 'FreeU',
132
  'GA' => 'Galeon',
 
133
  'GB' => 'Glass Browser',
134
  'GE' => 'Google Earth',
135
  'GO' => 'GOG Galaxy',
@@ -161,6 +165,7 @@ class Browser extends AbstractClientParser
161
  'KP' => 'Kapiko',
162
  'KN' => 'Kinza',
163
  'KW' => 'Kiwi',
 
164
  'KY' => 'Kylo',
165
  'KZ' => 'Kazehakase',
166
  'LB' => 'Cheetah Browser',
@@ -187,8 +192,11 @@ class Browser extends AbstractClientParser
187
  'MN' => 'Minimo',
188
  'MT' => 'Mint Browser',
189
  'MX' => 'Maxthon',
 
190
  'MY' => 'Mypal',
191
  'MR' => 'Monument Browser',
 
 
192
  'NB' => 'Nokia Browser',
193
  'NO' => 'Nokia OSS Browser',
194
  'NV' => 'Nokia Ovi Browser',
@@ -230,8 +238,10 @@ class Browser extends AbstractClientParser
230
  'PW' => 'Palm WebPro',
231
  'PA' => 'Palmscape',
232
  'PX' => 'Phoenix',
 
233
  'PO' => 'Polaris',
234
  'PT' => 'Polarity',
 
235
  'PS' => 'Microsoft Edge',
236
  'Q1' => 'QQ Browser Mini',
237
  'QQ' => 'QQ Browser',
@@ -256,6 +266,9 @@ class Browser extends AbstractClientParser
256
  'SK' => 'Skyfire',
257
  'SS' => 'Seraphic Sraf',
258
  'SL' => 'Sleipnir',
 
 
 
259
  'SN' => 'Snowshoe',
260
  'SO' => 'Sogou Mobile Browser',
261
  'S2' => 'Splash',
@@ -264,6 +277,7 @@ class Browser extends AbstractClientParser
264
  'SP' => 'SuperBird',
265
  'SU' => 'Super Fast Browser',
266
  'S3' => 'surf',
 
267
  'S0' => 'START Internet Browser',
268
  'S4' => 'Steam In-Game Overlay',
269
  'ST' => 'Streamy',
@@ -282,6 +296,7 @@ class Browser extends AbstractClientParser
282
  'UC' => 'UC Browser',
283
  'UM' => 'UC Browser Mini',
284
  'UT' => 'UC Browser Turbo',
 
285
  'UZ' => 'Uzbl',
286
  'VI' => 'Vivaldi',
287
  'VV' => 'vivo Browser',
@@ -298,6 +313,7 @@ class Browser extends AbstractClientParser
298
  'YA' => 'Yandex Browser',
299
  'YL' => 'Yandex Browser Lite',
300
  'YN' => 'Yaani Browser',
 
301
  'XI' => 'Xiino',
302
  'XV' => 'Xvast',
303
  'ZV' => 'Zvu',
@@ -326,14 +342,15 @@ class Browser extends AbstractClientParser
326
  'CL', 'SU', 'EU', 'UB', 'LO', 'VG', 'TV', 'A0', '1B',
327
  'S4', 'EE', 'AE', 'VM', 'O0', 'TG', 'GB', 'SY', 'HH',
328
  'YJ', 'LL', 'TU', 'XV', 'C2', 'QU', 'YN', 'JB', 'MR',
 
329
  ],
330
  'Firefox' => [
331
  'FF', 'FE', 'FM', 'SX', 'FB', 'PX', 'MB', 'EI', 'WF',
332
  'CU', 'TF', 'QM', 'FR', 'I4', 'GZ', 'MO', 'F1', 'BI',
333
  'MN', 'BH', 'TO', 'OS', 'MY', 'FY', 'AX', 'C0', 'LH',
334
- 'S5', 'ZV', 'IW',
335
  ],
336
- 'Internet Explorer' => ['IE', 'IM', 'PS'],
337
  'Konqueror' => ['KO'],
338
  'NetFront' => ['NF'],
339
  'NetSurf' => ['NE'],
@@ -349,9 +366,12 @@ class Browser extends AbstractClientParser
349
  * @var array
350
  */
351
  protected static $mobileOnlyBrowsers = [
352
- '36', 'OC', 'PU', 'SK', 'MF', 'OI', 'OM', 'DD', 'DB', 'ST', 'BL', 'IV', 'FM', 'C1', 'AL', 'SA', 'SB', 'FR',
353
- 'WP', 'HA', 'NX', 'HU', 'VV', 'RE', 'CB', 'MZ', 'UM', 'FK', 'FX', 'WI', 'MN', 'M1', 'AH', 'SU', 'EU', 'EZ',
354
- 'UT', 'DT', 'S0', 'QU', 'YN', 'JB',
 
 
 
355
  ];
356
 
357
  /**
69
  'BJ' => 'Bunjalloo',
70
  'BL' => 'B-Line',
71
  'BU' => 'Blue Browser',
72
+ 'BN' => 'Borealis Navigator',
73
  'BR' => 'Brave',
74
  'BK' => 'BriskBard',
75
  'BX' => 'BrowseX',
76
+ 'BZ' => 'Browzar',
77
  'CA' => 'Camino',
78
  'CL' => 'CCleaner',
79
  'C0' => 'Centaury',
97
  'CY' => 'Cyberfox',
98
  'CS' => 'Cheshire',
99
  'CT' => 'Crusta',
100
+ 'CZ' => 'Crazy Browser',
101
  'CU' => 'Cunaguaro',
102
  'CV' => 'Chrome Webview',
103
  'DB' => 'dbrowser',
133
  'FN' => 'Fireweb Navigator',
134
  'FU' => 'FreeU',
135
  'GA' => 'Galeon',
136
+ 'GH' => 'Ghostery Privacy Browser',
137
  'GB' => 'Glass Browser',
138
  'GE' => 'Google Earth',
139
  'GO' => 'GOG Galaxy',
165
  'KP' => 'Kapiko',
166
  'KN' => 'Kinza',
167
  'KW' => 'Kiwi',
168
+ 'KD' => 'Kode Browser',
169
  'KY' => 'Kylo',
170
  'KZ' => 'Kazehakase',
171
  'LB' => 'Cheetah Browser',
192
  'MN' => 'Minimo',
193
  'MT' => 'Mint Browser',
194
  'MX' => 'Maxthon',
195
+ 'NM' => 'MxNitro',
196
  'MY' => 'Mypal',
197
  'MR' => 'Monument Browser',
198
+ 'MW' => 'MAUI WAP Browser',
199
+ 'NR' => 'NFS Browser',
200
  'NB' => 'Nokia Browser',
201
  'NO' => 'Nokia OSS Browser',
202
  'NV' => 'Nokia Ovi Browser',
238
  'PW' => 'Palm WebPro',
239
  'PA' => 'Palmscape',
240
  'PX' => 'Phoenix',
241
+ 'PB' => 'Phoenix Browser',
242
  'PO' => 'Polaris',
243
  'PT' => 'Polarity',
244
+ 'PI' => 'PrivacyWall',
245
  'PS' => 'Microsoft Edge',
246
  'Q1' => 'QQ Browser Mini',
247
  'QQ' => 'QQ Browser',
266
  'SK' => 'Skyfire',
267
  'SS' => 'Seraphic Sraf',
268
  'SL' => 'Sleipnir',
269
+ 'S6' => 'Slimjet',
270
+ '7S' => '7Star',
271
+ 'LE' => 'Smart Lenovo Browser',
272
  'SN' => 'Snowshoe',
273
  'SO' => 'Sogou Mobile Browser',
274
  'S2' => 'Splash',
277
  'SP' => 'SuperBird',
278
  'SU' => 'Super Fast Browser',
279
  'S3' => 'surf',
280
+ 'SG' => 'Stargon',
281
  'S0' => 'START Internet Browser',
282
  'S4' => 'Steam In-Game Overlay',
283
  'ST' => 'Streamy',
296
  'UC' => 'UC Browser',
297
  'UM' => 'UC Browser Mini',
298
  'UT' => 'UC Browser Turbo',
299
+ 'UR' => 'UR Browser',
300
  'UZ' => 'Uzbl',
301
  'VI' => 'Vivaldi',
302
  'VV' => 'vivo Browser',
313
  'YA' => 'Yandex Browser',
314
  'YL' => 'Yandex Browser Lite',
315
  'YN' => 'Yaani Browser',
316
+ 'YB' => 'Yolo Browser',
317
  'XI' => 'Xiino',
318
  'XV' => 'Xvast',
319
  'ZV' => 'Zvu',
342
  'CL', 'SU', 'EU', 'UB', 'LO', 'VG', 'TV', 'A0', '1B',
343
  'S4', 'EE', 'AE', 'VM', 'O0', 'TG', 'GB', 'SY', 'HH',
344
  'YJ', 'LL', 'TU', 'XV', 'C2', 'QU', 'YN', 'JB', 'MR',
345
+ 'S6', '7S', 'NM', 'PB', 'UR', 'NR', 'SG',
346
  ],
347
  'Firefox' => [
348
  'FF', 'FE', 'FM', 'SX', 'FB', 'PX', 'MB', 'EI', 'WF',
349
  'CU', 'TF', 'QM', 'FR', 'I4', 'GZ', 'MO', 'F1', 'BI',
350
  'MN', 'BH', 'TO', 'OS', 'MY', 'FY', 'AX', 'C0', 'LH',
351
+ 'S5', 'ZV', 'IW', 'PI', 'BN',
352
  ],
353
+ 'Internet Explorer' => ['IE', 'IM', 'PS', 'CZ', 'BZ'],
354
  'Konqueror' => ['KO'],
355
  'NetFront' => ['NF'],
356
  'NetSurf' => ['NE'],
366
  * @var array
367
  */
368
  protected static $mobileOnlyBrowsers = [
369
+ '36', 'OC', 'PU', 'SK', 'MF', 'OI', 'OM', 'DD', 'DB',
370
+ 'ST', 'BL', 'IV', 'FM', 'C1', 'AL', 'SA', 'SB', 'FR',
371
+ 'WP', 'HA', 'NX', 'HU', 'VV', 'RE', 'CB', 'MZ', 'UM',
372
+ 'FK', 'FX', 'WI', 'MN', 'M1', 'AH', 'SU', 'EU', 'EZ',
373
+ 'UT', 'DT', 'S0', 'QU', 'YN', 'JB', 'GH', 'PI', 'SG',
374
+ 'KD',
375
  ];
376
 
377
  /**
app/vendor/matomo/device-detector/Parser/Device/AbstractDeviceParser.php CHANGED
@@ -47,6 +47,7 @@ abstract class AbstractDeviceParser extends AbstractParser
47
  public const DEVICE_TYPE_PHABLET = 10;
48
  public const DEVICE_TYPE_SMART_SPEAKER = 11;
49
  public const DEVICE_TYPE_WEARABLE = 12; // including set watches, headsets
 
50
 
51
  /**
52
  * Detectable device types
@@ -67,6 +68,7 @@ abstract class AbstractDeviceParser extends AbstractParser
67
  'phablet' => self::DEVICE_TYPE_PHABLET,
68
  'smart speaker' => self::DEVICE_TYPE_SMART_SPEAKER,
69
  'wearable' => self::DEVICE_TYPE_WEARABLE,
 
70
  ];
71
 
72
  /**
@@ -89,6 +91,7 @@ abstract class AbstractDeviceParser extends AbstractParser
89
  '00' => 'Accent',
90
  'A9' => 'Advan',
91
  'AD' => 'Advance',
 
92
  'A3' => 'AGM',
93
  'AZ' => 'Ainol',
94
  'AI' => 'Airness',
@@ -179,6 +182,7 @@ abstract class AbstractDeviceParser extends AbstractParser
179
  '1C' => 'Chuwi',
180
  'L8' => 'Clarmin',
181
  'CD' => 'Cloudfone',
 
182
  'C0' => 'Clout',
183
  'CK' => 'Cricket',
184
  'C1' => 'Crosscall',
@@ -191,6 +195,7 @@ abstract class AbstractDeviceParser extends AbstractParser
191
  'CT' => 'Capitel',
192
  'CQ' => 'Compaq',
193
  '3C' => 'Contixo',
 
194
  'CO' => 'Coolpad',
195
  'C5' => 'Condor',
196
  'CW' => 'Cowon',
@@ -254,6 +259,7 @@ abstract class AbstractDeviceParser extends AbstractParser
254
  '3E' => 'Enot',
255
  'ER' => 'Ericy',
256
  'EE' => 'Essential',
 
257
  'EN' => 'Eton',
258
  'E2' => 'Essentielb',
259
  '1E' => 'Etuline',
@@ -261,6 +267,7 @@ abstract class AbstractDeviceParser extends AbstractParser
261
  'EV' => 'Evertek',
262
  'E3' => 'Evolio',
263
  'EO' => 'Evolveo',
 
264
  'EX' => 'Explay',
265
  'E0' => 'EvroMedia',
266
  'E5' => 'Extrem',
@@ -268,6 +275,7 @@ abstract class AbstractDeviceParser extends AbstractParser
268
  'E8' => 'E-tel',
269
  'E9' => 'Evercoss',
270
  'EU' => 'Eurostar',
 
271
  'FA' => 'Fairphone',
272
  'FM' => 'Famoco',
273
  'FE' => 'Fengxiang',
@@ -283,12 +291,14 @@ abstract class AbstractDeviceParser extends AbstractParser
283
  'FN' => 'FNB',
284
  'FU' => 'Fujitsu',
285
  'FD' => 'Fondi',
 
286
  'GT' => 'G-TiDE',
287
  'GM' => 'Garmin-Asus',
288
  'GA' => 'Gateway',
289
  'GD' => 'Gemini',
290
  'GN' => 'General Mobile',
291
  'GE' => 'Geotel',
 
292
  'GH' => 'Ghia',
293
  'GI' => 'Gionee',
294
  'GG' => 'Gigabyte',
@@ -308,12 +318,15 @@ abstract class AbstractDeviceParser extends AbstractParser
308
  'HF' => 'Hafury',
309
  'HA' => 'Haier',
310
  'HS' => 'Hasee',
 
311
  'HE' => 'HannSpree',
312
  'HI' => 'Hisense',
313
  'HL' => 'Hi-Level',
314
  'H2' => 'Highscreen',
 
315
  'H1' => 'Hoffmann',
316
  'HM' => 'Homtom',
 
317
  'HO' => 'Hosin',
318
  'HW' => 'How',
319
  'HV' => 'Hotwav',
@@ -442,6 +455,7 @@ abstract class AbstractDeviceParser extends AbstractParser
442
  'MJ' => 'Majestic',
443
  'MA' => 'Manta Multimedia',
444
  '6X' => 'Maxtron',
 
445
  '5M' => 'Mann',
446
  '2M' => 'Masstel',
447
  'MW' => 'Maxwest',
@@ -495,6 +509,8 @@ abstract class AbstractDeviceParser extends AbstractParser
495
  '6M' => 'Mystery',
496
  '1R' => 'Multilaser',
497
  'N3' => 'Navon',
 
 
498
  'N7' => 'National',
499
  'N5' => 'NOA',
500
  'NE' => 'NEC',
@@ -530,6 +546,7 @@ abstract class AbstractDeviceParser extends AbstractParser
530
  'O3' => 'O+',
531
  'OB' => 'Obi',
532
  'O1' => 'Odys',
 
533
  'OD' => 'Onda',
534
  'ON' => 'OnePlus',
535
  'OX' => 'Onix',
@@ -636,6 +653,7 @@ abstract class AbstractDeviceParser extends AbstractParser
636
  'SG' => 'Sagem',
637
  'SH' => 'Sharp',
638
  '7S' => 'Shift Phones',
 
639
  '3S' => 'Shuttle',
640
  'SI' => 'Siemens',
641
  'SJ' => 'Silent Circle',
@@ -659,12 +677,14 @@ abstract class AbstractDeviceParser extends AbstractParser
659
  'SU' => 'SuperSonic',
660
  'S5' => 'Supra',
661
  'SV' => 'Selevision',
 
662
  'SY' => 'Sanyo',
663
  'SM' => 'Symphony',
664
  '4S' => 'Syrox',
665
  'SR' => 'Smart',
666
  'S7' => 'Smartisan',
667
  'S4' => 'Star',
 
668
  'SB' => 'STF Mobile',
669
  'S8' => 'STK',
670
  'S9' => 'Savio',
@@ -696,6 +716,7 @@ abstract class AbstractDeviceParser extends AbstractParser
696
  'T0' => 'TD Systems',
697
  'TI' => 'TIANYU',
698
  '2T' => 'Tinai',
 
699
  'TG' => 'Telego',
700
  'TL' => 'Telefunken',
701
  '2L' => 'Tele2',
@@ -713,6 +734,7 @@ abstract class AbstractDeviceParser extends AbstractParser
713
  'T8' => 'Touchmate',
714
  'TS' => 'Toshiba',
715
  'TT' => 'TechnoTrend',
 
716
  'T6' => 'TrekStor',
717
  'T3' => 'Trevi',
718
  'TU' => 'Tunisie Telecom',
@@ -734,6 +756,7 @@ abstract class AbstractDeviceParser extends AbstractParser
734
  'UN' => 'Unowhy',
735
  'US' => 'Uniscope',
736
  'UX' => 'Unimax',
 
737
  'UM' => 'UMIDIGI',
738
  'UU' => 'Unonu',
739
  'UK' => 'UTOK',
@@ -756,6 +779,7 @@ abstract class AbstractDeviceParser extends AbstractParser
756
  'VT' => 'Vestel',
757
  'VR' => 'Vernee',
758
  'V4' => 'Verizon',
 
759
  'VL' => 'Verykool',
760
  'V6' => 'VGO TEL',
761
  'VV' => 'Vivo',
@@ -780,6 +804,7 @@ abstract class AbstractDeviceParser extends AbstractParser
780
  'WN' => 'Wink',
781
  'WM' => 'Weimei',
782
  'WE' => 'WellcoM',
 
783
  'WY' => 'Wexler',
784
  'W2' => 'Wigor',
785
  'WI' => 'Wiko',
@@ -808,6 +833,7 @@ abstract class AbstractDeviceParser extends AbstractParser
808
  'YO' => 'Yota',
809
  'YT' => 'Ytone',
810
  'YX' => 'Yxtel',
 
811
  'ZE' => 'Zeemi',
812
  'ZK' => 'Zenek',
813
  'ZF' => 'Zfiner',
@@ -822,9 +848,9 @@ abstract class AbstractDeviceParser extends AbstractParser
822
  'ZQ' => 'ZYQ',
823
  'XS' => 'Xshitou',
824
  'XT' => 'X-TIGI',
 
825
  'XB' => 'NEXBOX',
826
  'X3' => 'X-BO',
827
-
828
  // legacy brands, might be removed in future versions
829
  'WB' => 'Web TV',
830
  'XX' => 'Unknown',
@@ -921,7 +947,7 @@ abstract class AbstractDeviceParser extends AbstractParser
921
  */
922
  public static function getShortCode(string $brand): string
923
  {
924
- return \array_search($brand, self::$deviceBrands) ?: '';
925
  }
926
 
927
  /**
47
  public const DEVICE_TYPE_PHABLET = 10;
48
  public const DEVICE_TYPE_SMART_SPEAKER = 11;
49
  public const DEVICE_TYPE_WEARABLE = 12; // including set watches, headsets
50
+ public const DEVICE_TYPE_PERIPHERAL = 13; // including portable terminal, portable projector
51
 
52
  /**
53
  * Detectable device types
68
  'phablet' => self::DEVICE_TYPE_PHABLET,
69
  'smart speaker' => self::DEVICE_TYPE_SMART_SPEAKER,
70
  'wearable' => self::DEVICE_TYPE_WEARABLE,
71
+ 'peripheral' => self::DEVICE_TYPE_PERIPHERAL,
72
  ];
73
 
74
  /**
91
  '00' => 'Accent',
92
  'A9' => 'Advan',
93
  'AD' => 'Advance',
94
+ '60' => 'Andowl',
95
  'A3' => 'AGM',
96
  'AZ' => 'Ainol',
97
  'AI' => 'Airness',
182
  '1C' => 'Chuwi',
183
  'L8' => 'Clarmin',
184
  'CD' => 'Cloudfone',
185
+ '6C' => 'Cloudpad',
186
  'C0' => 'Clout',
187
  'CK' => 'Cricket',
188
  'C1' => 'Crosscall',
195
  'CT' => 'Capitel',
196
  'CQ' => 'Compaq',
197
  '3C' => 'Contixo',
198
+ '4C' => 'Conquest',
199
  'CO' => 'Coolpad',
200
  'C5' => 'Condor',
201
  'CW' => 'Cowon',
259
  '3E' => 'Enot',
260
  'ER' => 'Ericy',
261
  'EE' => 'Essential',
262
+ '6E' => 'eSTAR',
263
  'EN' => 'Eton',
264
  'E2' => 'Essentielb',
265
  '1E' => 'Etuline',
267
  'EV' => 'Evertek',
268
  'E3' => 'Evolio',
269
  'EO' => 'Evolveo',
270
+ 'EH' => 'EXO',
271
  'EX' => 'Explay',
272
  'E0' => 'EvroMedia',
273
  'E5' => 'Extrem',
275
  'E8' => 'E-tel',
276
  'E9' => 'Evercoss',
277
  'EU' => 'Eurostar',
278
+ 'XE' => 'ExMobile',
279
  'FA' => 'Fairphone',
280
  'FM' => 'Famoco',
281
  'FE' => 'Fengxiang',
291
  'FN' => 'FNB',
292
  'FU' => 'Fujitsu',
293
  'FD' => 'Fondi',
294
+ 'F0' => 'Fonos',
295
  'GT' => 'G-TiDE',
296
  'GM' => 'Garmin-Asus',
297
  'GA' => 'Gateway',
298
  'GD' => 'Gemini',
299
  'GN' => 'General Mobile',
300
  'GE' => 'Geotel',
301
+ 'G2' => 'GEOFOX',
302
  'GH' => 'Ghia',
303
  'GI' => 'Gionee',
304
  'GG' => 'Gigabyte',
318
  'HF' => 'Hafury',
319
  'HA' => 'Haier',
320
  'HS' => 'Hasee',
321
+ 'HK' => 'Hardkernel',
322
  'HE' => 'HannSpree',
323
  'HI' => 'Hisense',
324
  'HL' => 'Hi-Level',
325
  'H2' => 'Highscreen',
326
+ '1H' => 'Hipstreet',
327
  'H1' => 'Hoffmann',
328
  'HM' => 'Homtom',
329
+ 'H0' => 'Hometech',
330
  'HO' => 'Hosin',
331
  'HW' => 'How',
332
  'HV' => 'Hotwav',
455
  'MJ' => 'Majestic',
456
  'MA' => 'Manta Multimedia',
457
  '6X' => 'Maxtron',
458
+ '50' => 'Matrix',
459
  '5M' => 'Mann',
460
  '2M' => 'Masstel',
461
  'MW' => 'Maxwest',
509
  '6M' => 'Mystery',
510
  '1R' => 'Multilaser',
511
  'N3' => 'Navon',
512
+ '6N' => 'Navitech',
513
+ '7N' => 'NorthTech',
514
  'N7' => 'National',
515
  'N5' => 'NOA',
516
  'NE' => 'NEC',
546
  'O3' => 'O+',
547
  'OB' => 'Obi',
548
  'O1' => 'Odys',
549
+ 'OA' => 'Okapia',
550
  'OD' => 'Onda',
551
  'ON' => 'OnePlus',
552
  'OX' => 'Onix',
653
  'SG' => 'Sagem',
654
  'SH' => 'Sharp',
655
  '7S' => 'Shift Phones',
656
+ 'RS' => 'Shtrikh-M',
657
  '3S' => 'Shuttle',
658
  'SI' => 'Siemens',
659
  'SJ' => 'Silent Circle',
677
  'SU' => 'SuperSonic',
678
  'S5' => 'Supra',
679
  'SV' => 'Selevision',
680
+ '9G' => 'Selenga',
681
  'SY' => 'Sanyo',
682
  'SM' => 'Symphony',
683
  '4S' => 'Syrox',
684
  'SR' => 'Smart',
685
  'S7' => 'Smartisan',
686
  'S4' => 'Star',
687
+ 'OL' => 'Starlight',
688
  'SB' => 'STF Mobile',
689
  'S8' => 'STK',
690
  'S9' => 'Savio',
716
  'T0' => 'TD Systems',
717
  'TI' => 'TIANYU',
718
  '2T' => 'Tinai',
719
+ 'TF' => 'Tinmo',
720
  'TG' => 'Telego',
721
  'TL' => 'Telefunken',
722
  '2L' => 'Tele2',
734
  'T8' => 'Touchmate',
735
  'TS' => 'Toshiba',
736
  'TT' => 'TechnoTrend',
737
+ '5C' => 'TTEC',
738
  'T6' => 'TrekStor',
739
  'T3' => 'Trevi',
740
  'TU' => 'Tunisie Telecom',
756
  'UN' => 'Unowhy',
757
  'US' => 'Uniscope',
758
  'UX' => 'Unimax',
759
+ 'U2' => 'UNIWA',
760
  'UM' => 'UMIDIGI',
761
  'UU' => 'Unonu',
762
  'UK' => 'UTOK',
779
  'VT' => 'Vestel',
780
  'VR' => 'Vernee',
781
  'V4' => 'Verizon',
782
+ '4V' => 'Verico',
783
  'VL' => 'Verykool',
784
  'V6' => 'VGO TEL',
785
  'VV' => 'Vivo',
804
  'WN' => 'Wink',
805
  'WM' => 'Weimei',
806
  'WE' => 'WellcoM',
807
+ 'W0' => 'Wiseasy',
808
  'WY' => 'Wexler',
809
  'W2' => 'Wigor',
810
  'WI' => 'Wiko',
833
  'YO' => 'Yota',
834
  'YT' => 'Ytone',
835
  'YX' => 'Yxtel',
836
+ '0Z' => 'Zatec',
837
  'ZE' => 'Zeemi',
838
  'ZK' => 'Zenek',
839
  'ZF' => 'Zfiner',
848
  'ZQ' => 'ZYQ',
849
  'XS' => 'Xshitou',
850
  'XT' => 'X-TIGI',
851
+ '4X' => 'Xtouch',
852
  'XB' => 'NEXBOX',
853
  'X3' => 'X-BO',
 
854
  // legacy brands, might be removed in future versions
855
  'WB' => 'Web TV',
856
  'XX' => 'Unknown',
947
  */
948
  public static function getShortCode(string $brand): string
949
  {
950
+ return (string) \array_search($brand, self::$deviceBrands) ?: '';
951
  }
952
 
953
  /**
app/vendor/matomo/device-detector/Parser/OperatingSystem.php CHANGED
@@ -78,6 +78,7 @@ class OperatingSystem extends AbstractParser
78
  'MOR' => 'MorphOS',
79
  'NBS' => 'NetBSD',
80
  'MTK' => 'MTK / Nucleus',
 
81
  'WII' => 'Nintendo',
82
  'NDS' => 'Nintendo Mobile',
83
  'OS2' => 'OS/2',
@@ -88,6 +89,7 @@ class OperatingSystem extends AbstractParser
88
  'PS3' => 'PlayStation',
89
  'RHT' => 'Red Hat',
90
  'ROS' => 'RISC OS',
 
91
  'REM' => 'Remix OS',
92
  'RZD' => 'RazoDroiD',
93
  'SAB' => 'Sabayon',
@@ -142,11 +144,11 @@ class OperatingSystem extends AbstractParser
142
  'GNU/Linux' => [
143
  'LIN', 'ARL', 'DEB', 'KNO', 'MIN', 'UBT', 'KBT', 'XBT', 'LBT', 'FED',
144
  'RHT', 'VLN', 'MDR', 'GNT', 'SAB', 'SLW', 'SSE', 'CES', 'BTR', 'SAF',
145
- 'ORD', 'TOS',
146
  ],
147
  'Mac' => ['MAC'],
148
  'Mobile Gaming Console' => ['PSP', 'NDS', 'XBX'],
149
- 'Real-time OS' => ['MTK', 'TDX'],
150
  'Other Mobile' => ['WOS', 'POS', 'SBA', 'TIZ', 'SMG', 'MAE'],
151
  'Symbian' => ['SYM', 'SYS', 'SY3', 'S60', 'S40'],
152
  'Unix' => ['SOS', 'AIX', 'HPX', 'BSD', 'NBS', 'OBS', 'DFB', 'SYL', 'IRI', 'T64', 'INF'],
78
  'MOR' => 'MorphOS',
79
  'NBS' => 'NetBSD',
80
  'MTK' => 'MTK / Nucleus',
81
+ 'MRE' => 'MRE',
82
  'WII' => 'Nintendo',
83
  'NDS' => 'Nintendo Mobile',
84
  'OS2' => 'OS/2',
89
  'PS3' => 'PlayStation',
90
  'RHT' => 'Red Hat',
91
  'ROS' => 'RISC OS',
92
+ 'RSO' => 'Rosa',
93
  'REM' => 'Remix OS',
94
  'RZD' => 'RazoDroiD',
95
  'SAB' => 'Sabayon',
144
  'GNU/Linux' => [
145
  'LIN', 'ARL', 'DEB', 'KNO', 'MIN', 'UBT', 'KBT', 'XBT', 'LBT', 'FED',
146
  'RHT', 'VLN', 'MDR', 'GNT', 'SAB', 'SLW', 'SSE', 'CES', 'BTR', 'SAF',
147
+ 'ORD', 'TOS', 'RSO',
148
  ],
149
  'Mac' => ['MAC'],
150
  'Mobile Gaming Console' => ['PSP', 'NDS', 'XBX'],
151
+ 'Real-time OS' => ['MTK', 'TDX', 'MRE'],
152
  'Other Mobile' => ['WOS', 'POS', 'SBA', 'TIZ', 'SMG', 'MAE'],
153
  'Symbian' => ['SYM', 'SYS', 'SY3', 'S60', 'S40'],
154
  'Unix' => ['SOS', 'AIX', 'HPX', 'BSD', 'NBS', 'OBS', 'DFB', 'SYL', 'IRI', 'T64', 'INF'],
app/vendor/matomo/device-detector/README.md CHANGED
@@ -203,15 +203,15 @@ There are already a few ports of this tool to other languages:
203
 
204
  The lists below are auto generated and updated from time to time. Some of them might not be complete.
205
 
206
- *Last update: 2020/11/12*
207
 
208
  ### List of detected operating systems:
209
 
210
- AIX, Android, AmigaOS, Apple TV, Arch Linux, BackTrack, Bada, BeOS, BlackBerry OS, BlackBerry Tablet OS, Brew, CentOS, Chrome OS, CyanogenMod, Debian, DragonFly, Fedora, Firefox OS, Fire OS, FreeBSD, Gentoo, Google TV, HP-UX, Haiku OS, IRIX, Inferno, KaiOS, Knoppix, Kubuntu, GNU/Linux, Lubuntu, VectorLinux, Mac, Maemo, Mandriva, MeeGo, MocorDroid, Mint, MildWild, MorphOS, NetBSD, MTK / Nucleus, Nintendo, Nintendo Mobile, OS/2, OSF1, OpenBSD, Ordissimo, PlayStation Portable, PlayStation, Red Hat, RISC OS, Remix OS, RazoDroiD, Sabayon, SUSE, Sailfish OS, Slackware, Solaris, Syllable, Symbian, Symbian OS, Symbian OS Series 40, Symbian OS Series 60, Symbian^3, ThreadX, Tizen, TmaxOS, Ubuntu, WebTV, Windows, Windows CE, Windows IoT, Windows Mobile, Windows Phone, Windows RT, Xbox, Xubuntu, YunOs, iOS, palmOS, webOS
211
 
212
  ### List of detected browsers:
213
 
214
- 115 Browser, 2345 Browser, 360 Phone Browser, 360 Browser, Avant Browser, ABrowse, ANT Fresco, ANTGalio, Aloha Browser, Aloha Browser Lite, Amaya, Amigo, Android Browser, AOL Desktop, AOL Shield, Arora, Arctic Fox, Amiga Voyager, Amiga Aweb, Atom, Atomic Web Browser, Avast Secure Browser, AVG Secure Browser, Beaker Browser, Beamrise, BlackBerry Browser, Baidu Browser, Baidu Spark, Basilisk, Beonex, BlackHawk, Bunjalloo, B-Line, Blue Browser, Brave, BriskBard, BrowseX, Camino, CCleaner, Centaury, Coc Coc, Colibri, Comodo Dragon, Coast, Charon, CM Browser, Chrome Frame, Headless Chrome, Chrome, Chrome Mobile iOS, Conkeror, Chrome Mobile, CoolNovo, CometBird, COS Browser, ChromePlus, Chromium, Cyberfox, Cheshire, Crusta, Cunaguaro, Chrome Webview, dbrowser, Deepnet Explorer, Delta Browser, Dolphin, Dorado, Dooble, Dillo, DuckDuckGo Privacy Browser, Ecosia, Epic, Elinks, Element Browser, Elements Browser, eZ Browser, EUI Browser, GNOME Web, Espial TV Browser, Falkon, Faux Browser, Firefox Mobile iOS, Firebird, Fluid, Fennec, Firefox, Firefox Focus, Firefox Reality, Firefox Rocket, Flock, Firefox Mobile, Fireweb, Fireweb Navigator, FreeU, Galeon, Glass Browser, Google Earth, GOG Galaxy, Hawk Turbo Browser, hola! Browser, HotJava, Huawei Browser, IBrowse, iCab, iCab Mobile, Iridium, Iron Mobile, IceCat, IceDragon, Isivioo, Iceweasel, Internet Explorer, IE Mobile, Iron, Japan Browser, Jasmine, Jig Browser, Jig Browser Plus, Jio Browser, K.Browser, Kindle Browser, K-meleon, Konqueror, Kapiko, Kinza, Kiwi, Kylo, Kazehakase, Cheetah Browser, LieBaoFast, LG Browser, Light, Links, Lovense Browser, LuaKit, Lulumi, Lunascape, Lunascape Lite, Lynx, mCent, MicroB, NCSA Mosaic, Meizu Browser, Mercury, Mobile Safari, Midori, Mobicip, MIUI Browser, Mobile Silk, Minimo, Mint Browser, Maxthon, Mypal, Monument Browser, Nokia Browser, Nokia OSS Browser, Nokia Ovi Browser, Nox Browser, NetSurf, NetFront, NetFront Life, NetPositive, Netscape, NTENT Browser, Oculus Browser, Opera Mini iOS, Obigo, Odyssey Web Browser, Off By One, OhHai Browser, ONE Browser, Opera GX, Opera Neon, Opera Devices, Opera Mini, Opera Mobile, Opera, Opera Next, Opera Touch, Ordissimo, Oregano, Origin In-Game Overlay, Origyn Web Browser, Openwave Mobile Browser, OmniWeb, Otter Browser, Palm Blazer, Pale Moon, Polypane, Oppo Browser, Palm Pre, Puffin, Palm WebPro, Palmscape, Phoenix, Polaris, Polarity, Microsoft Edge, QQ Browser Mini, QQ Browser, Qutebrowser, Quark, QupZilla, Qwant Mobile, QtWebEngine, Realme Browser, Rekonq, RockMelt, Samsung Browser, Sailfish Browser, SEMC-Browser, Sogou Explorer, Safari, Safe Exam Browser, SalamWeb, Shiira, SimpleBrowser, Sizzy, Skyfire, Seraphic Sraf, Sleipnir, Snowshoe, Sogou Mobile Browser, Splash, Sputnik Browser, Sunrise, SuperBird, Super Fast Browser, surf, START Internet Browser, Steam In-Game Overlay, Streamy, Swiftfox, Seznam Browser, t-online.de Browser, Tao Browser, TenFourFox, Tenta Browser, Tizen Browser, Tungsten, ToGate, TweakStyle, TV Bro, UBrowser, UC Browser, UC Browser Mini, UC Browser Turbo, Uzbl, Vivaldi, vivo Browser, Vision Mobile Browser, VMware AirWatch, Wear Internet Browser, Web Explorer, WebPositive, Waterfox, Whale Browser, wOSBrowser, WeTab Browser, Yahoo! Japan Browser, Yandex Browser, Yandex Browser Lite, Yaani Browser, Xiino, Xvast, Zvu
215
 
216
  ### List of detected browser engines:
217
 
@@ -239,7 +239,7 @@ Akregator, Apple PubSub, BashPodder, Breaker, Downcast, FeedDemon, Feeddler RSS
239
 
240
  ### List of brands with detected devices:
241
 
242
- 2E, 3Q, 4Good, 360, 8848, A1, Accent, Ace, Acer, Advan, Advance, AGM, Ainol, Airness, Airties, AIS, Aiwa, Akai, Alba, Alcatel, Alcor, Alfawise, Aligator, AllCall, AllDocube, Allview, Allwinner, Altech UEC, altron, Amazon, AMGOO, Amigoo, Amoi, Anry, ANS, Aoson, Apple, Archos, Arian Space, Ark, ArmPhone, Arnova, ARRIS, Artel, Asano, Ask, Assistant, Asus, AT&T, Atom, Audiovox, Avenzo, AVH, Avvio, Axxion, Azumi Mobile, BangOlufsen, Barnes & Noble, BBK, BB Mobile, BDF, Becker, Beeline, Beelink, Beetel, BenQ, BenQ-Siemens, Bezkam, BGH, BIHEE, Billion, Bird, Bitel, Bitmore, Black Fox, Blackview, Blaupunkt, Blu, Bluboo, Bluegood, Bmobile, Bobarry, bogo, Boway, bq, Bravis, Brondi, Bush, CAGI, Capitel, Captiva, Carrefour, Casio, Casper, Cat, Celkon, Changhong, Cherry Mobile, China Mobile, Chuwi, Clarmin, Cloudfone, Clout, CnM, Coby Kyros, Comio, Compal, Compaq, ComTrade Tesla, Concord, ConCorde, Condor, Contixo, Coolpad, Cowon, CreNova, Crescent, Cricket, Crius Mea, Crony, Crosscall, Cube, CUBOT, CVTE, Cyrus, Daewoo, Danew, Datang, Datawind, Datsun, Dbtel, Dell, Denver, Desay, DeWalt, DEXP, Dialog, Dicam, Digi, Digicel, Digiland, Digma, Divisat, DMM, DNS, DoCoMo, Doffler, Dolamee, Doogee, Doopro, Doov, Dopod, Doro, Droxio, Dune HD, E-Boda, E-Ceros, E-tel, Easypix, EBEST, Echo Mobiles, ECS, EE, EKO, Eks Mobility, Element, Elenberg, Elephone, Eltex, Energizer, Energy Sistem, Enot, Ergo, Ericsson, Ericy, Essential, Essentielb, Eton, eTouch, Etuline, Eurostar, Evercoss, Evertek, Evolio, Evolveo, EvroMedia, Explay, Extrem, Ezio, Ezze, Fairphone, Famoco, Fengxiang, Fero, FiGO, FinePower, FireFly Mobile, Fly, FNB, Fondi, FORME, Forstar, Foxconn, Freetel, Fujitsu, G-TiDE, Garmin-Asus, Gateway, Gemini, General Mobile, Geotel, Ghia, Ghong, Gigabyte, Gigaset, Ginzzu, Gionee, Globex, GOCLEVER, Goly, Gome, GoMobile, Google, Goophone, Gradiente, Grape, Gree, Grundig, Hafury, Haier, HannSpree, Hasee, Hi-Level, Highscreen, Hisense, Hoffmann, Homtom, Hoozo, Hosin, Hotwav, How, HP, HTC, Huadoo, Huawei, Humax, Hyrican, Hyundai, i-Cherry, i-Joy, i-mate, i-mobile, iBall, iBerry, iBrit, IconBIT, iDroid, iGet, iHunt, Ikea, iKoMo, iLA, iLife, iMars, IMO Mobile, Impression, iNew, Infinix, InFocus, Inkti, InnJoo, Innostream, Inoi, INQ, Insignia, Intek, Intex, Inverto, Invin, iOcean, iPro, IQM, Irbis, Iris, iRola, iRulu, iTel, iTruck, iVA, iView, iVooMi, iZotron, JAY-Tech, JFone, Jiayu, Jinga, JKL, Jolla, Just5, K-Touch, Kaan, Kaiomy, Kalley, Kanji, Karbonn, KATV1, Kazam, KDDI, Kempler & Strauss, Keneksi, Kenxinda, Kiano, Kingsun, Kivi, Klipad, Kocaso, Kodak, Kogan, Komu, Konka, Konrow, Koobee, Kooper, KOPO, Koridy, KRONO, Krüger&Matz, KT-Tech, Kuliao, Kumai, Kyocera, Kzen, LAIQ, Land Rover, Landvo, Lanix, Lark, Lava, LCT, Leagoo, Ledstar, LeEco, Lemhoov, Lenco, Lenovo, Leotec, Le Pan, Lephone, Lesia, Lexand, Lexibook, LG, Lingwin, Loewe, Logic, Logicom, Lumigon, Lumus, Luna, LYF, M.T.T., M4tel, Macoox, Majestic, Mann, Manta Multimedia, Masstel, Maxcom, Maxtron, MAXVI, Maxwest, Maze, meanIT, Mecer, Mecool, Mediacom, MediaTek, Medion, MEEG, MegaFon, Meitu, Meizu, Melrose, Memup, Metz, MEU, MicroMax, Microsoft, Minix, Mio, Miray, Mito, Mitsubishi, MIXC, MiXzo, MLLED, MLS, Mobicel, Mobiistar, Mobiola, Mobistel, Mobo, Modecom, Mofut, Motorola, Movic, Mpman, MSI, MTC, MTN, Multilaser, MYFON, MyPhone, Myria, Mystery, MyTab, MyWigo, National, Navon, NEC, Neffos, Neomi, Netgear, NeuImage, Newgen, Newland, Newman, NewsMy, NEXBOX, Nexian, NEXON, Nextbit, NextBook, NextTab, NGM, NG Optics, Nikon, Nintendo, NOA, Noain, Nobby, Noblex, Nokia, Nomi, Nomu, Nos, Nous, NUU Mobile, Nuvo, Nvidia, NYX Mobile, O+, O2, Obi, Odys, Onda, OnePlus, Onix, ONN, Openbox, OPPO, Opsson, Orange, Orbic, Ordissimo, Ouki, Oukitel, OUYA, Overmax, Ovvi, Owwo, Oysters, Oyyu, OzoneHD, P-UP, Palm, Panacom, Panasonic, Pantech, PCBOX, PCD, PCD Argentina, PEAQ, Pentagram, Phicomm, Philco, Philips, Phonemax, phoneOne, Pioneer, Pixelphone, Pixus, Ployer, Plum, PocketBook, POCO, Point of View, Polaroid, PolyPad, Polytron, Pomp, Positivo, Positivo BGH, PPTV, Prestigio, Primepad, Primux, Prixton, Proline, ProScan, Protruly, PULID, Q-Touch, Q.Bell, Qilive, QMobile, Qtek, Quantum, Quechua, Qumo, R-TV, Ramos, Ravoz, Razer, RCA Tablets, Readboy, Realme, RED, Rikomagic, RIM, Rinno, Ritmix, Ritzviva, Riviera, Roadrover, Rokit, Roku, Rombica, Ross&Moor, Rover, RoverPad, RT Project, RugGear, Runbo, Ryte, Safaricom, Sagem, Samsung, Sanei, Santin, Sanyo, Savio, Schneider, Sega, Selevision, Selfix, SEMP TCL, Sencor, Sendo, Senkatel, Senseit, Senwa, SFR, Sharp, Shift Phones, Shuttle, Siemens, Sigma, Silent Circle, Simbans, Sky, Skyworth, Smart, Smartfren, Smartisan, Softbank, Sonim, Sony, Sony Ericsson, Soundmax, Soyes, Spectrum, Spice, SQOOL, Star, Starway, STF Mobile, STK, Stonex, Storex, Sugar, Sumvision, Sunstech, SunVan, Sunvell, SuperSonic, Supra, Swipe, SWISSMOBILITY, Swisstone, Symphony, Syrox, T-Mobile, Takara, TB Touch, TCL, TD Systems, TechniSat, TechnoTrend, TechPad, Teclast, Tecno Mobile, Tele2, Telefunken, Telego, Telenor, Telit, Tesco, Tesla, Tetratab, teXet, ThL, Thomson, TIANYU, Time2, Timovi, Tinai, TiPhone, Tolino, Tone, Tooky, Top House, Toplux, Torex, Toshiba, Touchmate, Transpeed, TrekStor, Trevi, Tronsmart, True, Tunisie Telecom, Turbo, Turbo-X, TurboKids, TVC, TWM, Twoe, U.S. Cellular, Ugoos, Uhans, Uhappy, Ulefone, Umax, UMIDIGI, Unihertz, Unimax, Uniscope, Unknown, Unnecto, Unonu, Unowhy, UTOK, UTStarcom, Vastking, Venso, Verizon, Vernee, Vertex, Vertu, Verykool, Vesta, Vestel, VGO TEL, Videocon, Videoweb, ViewSonic, Vinga, Vinsoc, Vipro, Vitelcom, Vivax, Vivo, Vizio, VK Mobile, VKworld, Vodacom, Vodafone, Vonino, Vontar, Vorago, Vorke, Voto, Voxtel, Voyo, Vsmart, Vsun, Vulcan, VVETIME, Walton, Web TV, Weimei, WellcoM, Wexler, Wieppo, Wigor, Wiko, Wileyfox, Winds, Wink, Wolder, Wolfgang, Wonu, Woo, Wortmann, Woxter, X-BO, X-TIGI, X-View, Xgody, Xiaolajiao, Xiaomi, Xion, Xolo, Xoro, Xshitou, Yandex, Yarvik, Yes, Yezz, Yota, Ytone, Yu, Yuandao, Yusun, Yxtel, Zeemi, Zen, Zenek, Zfiner, Zidoo, Ziox, Zonda, Zopo, ZTE, Zuum, Zync, ZYQ, öwn
243
 
244
  ### List of detected bots:
245
 
203
 
204
  The lists below are auto generated and updated from time to time. Some of them might not be complete.
205
 
206
+ *Last update: 2020/12/05*
207
 
208
  ### List of detected operating systems:
209
 
210
+ AIX, Android, AmigaOS, Apple TV, Arch Linux, BackTrack, Bada, BeOS, BlackBerry OS, BlackBerry Tablet OS, Brew, CentOS, Chrome OS, CyanogenMod, Debian, DragonFly, Fedora, Firefox OS, Fire OS, FreeBSD, Gentoo, Google TV, HP-UX, Haiku OS, IRIX, Inferno, KaiOS, Knoppix, Kubuntu, GNU/Linux, Lubuntu, VectorLinux, Mac, Maemo, Mandriva, MeeGo, MocorDroid, Mint, MildWild, MorphOS, NetBSD, MTK / Nucleus, MRE, Nintendo, Nintendo Mobile, OS/2, OSF1, OpenBSD, Ordissimo, PlayStation Portable, PlayStation, Red Hat, RISC OS, Rosa, Remix OS, RazoDroiD, Sabayon, SUSE, Sailfish OS, Slackware, Solaris, Syllable, Symbian, Symbian OS, Symbian OS Series 40, Symbian OS Series 60, Symbian^3, ThreadX, Tizen, TmaxOS, Ubuntu, WebTV, Windows, Windows CE, Windows IoT, Windows Mobile, Windows Phone, Windows RT, Xbox, Xubuntu, YunOs, iOS, palmOS, webOS
211
 
212
  ### List of detected browsers:
213
 
214
+ 115 Browser, 2345 Browser, 360 Phone Browser, 360 Browser, Avant Browser, ABrowse, ANT Fresco, ANTGalio, Aloha Browser, Aloha Browser Lite, Amaya, Amigo, Android Browser, AOL Desktop, AOL Shield, Arora, Arctic Fox, Amiga Voyager, Amiga Aweb, Atom, Atomic Web Browser, Avast Secure Browser, AVG Secure Browser, Beaker Browser, Beamrise, BlackBerry Browser, Baidu Browser, Baidu Spark, Basilisk, Beonex, BlackHawk, Bunjalloo, B-Line, Blue Browser, Borealis Navigator, Brave, BriskBard, BrowseX, Browzar, Camino, CCleaner, Centaury, Coc Coc, Colibri, Comodo Dragon, Coast, Charon, CM Browser, Chrome Frame, Headless Chrome, Chrome, Chrome Mobile iOS, Conkeror, Chrome Mobile, CoolNovo, CometBird, COS Browser, ChromePlus, Chromium, Cyberfox, Cheshire, Crusta, Crazy Browser, Cunaguaro, Chrome Webview, dbrowser, Deepnet Explorer, Delta Browser, Dolphin, Dorado, Dooble, Dillo, DuckDuckGo Privacy Browser, Ecosia, Epic, Elinks, Element Browser, Elements Browser, eZ Browser, EUI Browser, GNOME Web, Espial TV Browser, Falkon, Faux Browser, Firefox Mobile iOS, Firebird, Fluid, Fennec, Firefox, Firefox Focus, Firefox Reality, Firefox Rocket, Flock, Firefox Mobile, Fireweb, Fireweb Navigator, FreeU, Galeon, Ghostery Privacy Browser, Glass Browser, Google Earth, GOG Galaxy, Hawk Turbo Browser, hola! Browser, HotJava, Huawei Browser, IBrowse, iCab, iCab Mobile, Iridium, Iron Mobile, IceCat, IceDragon, Isivioo, Iceweasel, Internet Explorer, IE Mobile, Iron, Japan Browser, Jasmine, Jig Browser, Jig Browser Plus, Jio Browser, K.Browser, Kindle Browser, K-meleon, Konqueror, Kapiko, Kinza, Kiwi, Kylo, Kazehakase, Cheetah Browser, LieBaoFast, LG Browser, Light, Links, Lovense Browser, LuaKit, Lulumi, Lunascape, Lunascape Lite, Lynx, mCent, MicroB, NCSA Mosaic, Meizu Browser, Mercury, Mobile Safari, Midori, Mobicip, MIUI Browser, Mobile Silk, Minimo, Mint Browser, Maxthon, MxNitro, Mypal, Monument Browser, MAUI WAP Browser, NFS Browser, Nokia Browser, Nokia OSS Browser, Nokia Ovi Browser, Nox Browser, NetSurf, NetFront, NetFront Life, NetPositive, Netscape, NTENT Browser, Oculus Browser, Opera Mini iOS, Obigo, Odyssey Web Browser, Off By One, OhHai Browser, ONE Browser, Opera GX, Opera Neon, Opera Devices, Opera Mini, Opera Mobile, Opera, Opera Next, Opera Touch, Ordissimo, Oregano, Origin In-Game Overlay, Origyn Web Browser, Openwave Mobile Browser, OmniWeb, Otter Browser, Palm Blazer, Pale Moon, Polypane, Oppo Browser, Palm Pre, Puffin, Palm WebPro, Palmscape, Phoenix, Phoenix Browser, Polaris, Polarity, PrivacyWall, Microsoft Edge, QQ Browser Mini, QQ Browser, Qutebrowser, Quark, QupZilla, Qwant Mobile, QtWebEngine, Realme Browser, Rekonq, RockMelt, Samsung Browser, Sailfish Browser, SEMC-Browser, Sogou Explorer, Safari, Safe Exam Browser, SalamWeb, Shiira, SimpleBrowser, Sizzy, Skyfire, Seraphic Sraf, Sleipnir, Slimjet, 7Star, Smart Lenovo Browser, Snowshoe, Sogou Mobile Browser, Splash, Sputnik Browser, Sunrise, SuperBird, Super Fast Browser, surf, Stargon, START Internet Browser, Steam In-Game Overlay, Streamy, Swiftfox, Seznam Browser, t-online.de Browser, Tao Browser, TenFourFox, Tenta Browser, Tizen Browser, Tungsten, ToGate, TweakStyle, TV Bro, UBrowser, UC Browser, UC Browser Mini, UC Browser Turbo, Uzbl, Vivaldi, vivo Browser, Vision Mobile Browser, VMware AirWatch, Wear Internet Browser, Web Explorer, WebPositive, Waterfox, Whale Browser, wOSBrowser, WeTab Browser, Yahoo! Japan Browser, Yandex Browser, Yandex Browser Lite, Yaani Browser, Yolo Browser, Xiino, Xvast, Zvu
215
 
216
  ### List of detected browser engines:
217
 
239
 
240
  ### List of brands with detected devices:
241
 
242
+ 2E, 3Q, 4Good, 360, 8848, A1, Accent, Ace, Acer, Advan, Advance, AGM, Ainol, Airness, Airties, AIS, Aiwa, Akai, Alba, Alcatel, Alcor, Alfawise, Aligator, AllCall, AllDocube, Allview, Allwinner, Altech UEC, altron, Amazon, AMGOO, Amigoo, Amoi, Anry, ANS, Aoson, Apple, Archos, Arian Space, Ark, ArmPhone, Arnova, ARRIS, Artel, Asano, Ask, Assistant, Asus, AT&T, Atom, Audiovox, Avenzo, AVH, Avvio, Axxion, Azumi Mobile, BangOlufsen, Barnes & Noble, BBK, BB Mobile, BDF, Becker, Beeline, Beelink, Beetel, BenQ, BenQ-Siemens, Bezkam, BGH, BIHEE, Billion, Bird, Bitel, Bitmore, Black Fox, Blackview, Blaupunkt, Blu, Bluboo, Bluegood, Bmobile, Bobarry, bogo, Boway, bq, Bravis, Brondi, Bush, CAGI, Capitel, Captiva, Carrefour, Casio, Casper, Cat, Celkon, Changhong, Cherry Mobile, China Mobile, Chuwi, Clarmin, Cloudfone, Cloudpad, Clout, CnM, Coby Kyros, Comio, Compal, Compaq, ComTrade Tesla, Concord, ConCorde, Condor, Conquest, Contixo, Coolpad, Cowon, CreNova, Crescent, Cricket, Crius Mea, Crony, Crosscall, Cube, CUBOT, CVTE, Cyrus, Daewoo, Danew, Datang, Datawind, Datsun, Dbtel, Dell, Denver, Desay, DeWalt, DEXP, Dialog, Dicam, Digi, Digicel, Digiland, Digma, Divisat, DMM, DNS, DoCoMo, Doffler, Dolamee, Doogee, Doopro, Doov, Dopod, Doro, Droxio, Dune HD, E-Boda, E-Ceros, E-tel, Easypix, EBEST, Echo Mobiles, ECS, EE, EKO, Eks Mobility, Element, Elenberg, Elephone, Eltex, Energizer, Energy Sistem, Enot, Ergo, Ericsson, Ericy, Essential, Essentielb, eSTAR, Eton, eTouch, Etuline, Eurostar, Evercoss, Evertek, Evolio, Evolveo, EvroMedia, ExMobile, EXO, Explay, Extrem, Ezio, Ezze, Fairphone, Famoco, Fengxiang, Fero, FiGO, FinePower, FireFly Mobile, Fly, FNB, Fondi, Fonos, FORME, Forstar, Foxconn, Freetel, Fujitsu, G-TiDE, Garmin-Asus, Gateway, Gemini, General Mobile, GEOFOX, Geotel, Ghia, Ghong, Gigabyte, Gigaset, Ginzzu, Gionee, Globex, GOCLEVER, Goly, Gome, GoMobile, Google, Goophone, Gradiente, Grape, Gree, Grundig, Hafury, Haier, HannSpree, Hasee, Hi-Level, Highscreen, Hipstreet, Hisense, Hoffmann, Hometech, Homtom, Hoozo, Hosin, Hotwav, How, HP, HTC, Huadoo, Huawei, Humax, Hyrican, Hyundai, i-Cherry, i-Joy, i-mate, i-mobile, iBall, iBerry, iBrit, IconBIT, iDroid, iGet, iHunt, Ikea, iKoMo, iLA, iLife, iMars, IMO Mobile, Impression, iNew, Infinix, InFocus, Inkti, InnJoo, Innostream, Inoi, INQ, Insignia, Intek, Intex, Inverto, Invin, iOcean, iPro, IQM, Irbis, Iris, iRola, iRulu, iTel, iTruck, iVA, iView, iVooMi, iZotron, JAY-Tech, JFone, Jiayu, Jinga, JKL, Jolla, Just5, K-Touch, Kaan, Kaiomy, Kalley, Kanji, Karbonn, KATV1, Kazam, KDDI, Kempler & Strauss, Keneksi, Kenxinda, Kiano, Kingsun, Kivi, Klipad, Kocaso, Kodak, Kogan, Komu, Konka, Konrow, Koobee, Kooper, KOPO, Koridy, KRONO, Krüger&Matz, KT-Tech, Kuliao, Kumai, Kyocera, Kzen, LAIQ, Land Rover, Landvo, Lanix, Lark, Lava, LCT, Leagoo, Ledstar, LeEco, Lemhoov, Lenco, Lenovo, Leotec, Le Pan, Lephone, Lesia, Lexand, Lexibook, LG, Lingwin, Loewe, Logic, Logicom, Lumigon, Lumus, Luna, LYF, M.T.T., M4tel, Macoox, Majestic, Mann, Manta Multimedia, Masstel, Matrix, Maxcom, Maxtron, MAXVI, Maxwest, Maze, meanIT, Mecer, Mecool, Mediacom, MediaTek, Medion, MEEG, MegaFon, Meitu, Meizu, Melrose, Memup, Metz, MEU, MicroMax, Microsoft, Minix, Mio, Miray, Mito, Mitsubishi, MIXC, MiXzo, MLLED, MLS, Mobicel, Mobiistar, Mobiola, Mobistel, Mobo, Modecom, Mofut, Motorola, Movic, Mpman, MSI, MTC, MTN, Multilaser, MYFON, MyPhone, Myria, Mystery, MyTab, MyWigo, National, Navitech, Navon, NEC, Neffos, Neomi, Netgear, NeuImage, Newgen, Newland, Newman, NewsMy, NEXBOX, Nexian, NEXON, Nextbit, NextBook, NextTab, NGM, NG Optics, Nikon, Nintendo, NOA, Noain, Nobby, Noblex, Nokia, Nomi, Nomu, Nos, Nous, NUU Mobile, Nuvo, Nvidia, NYX Mobile, O+, O2, Obi, Odys, Okapia, Onda, OnePlus, Onix, ONN, Openbox, OPPO, Opsson, Orange, Orbic, Ordissimo, Ouki, Oukitel, OUYA, Overmax, Ovvi, Owwo, Oysters, Oyyu, OzoneHD, P-UP, Palm, Panacom, Panasonic, Pantech, PCBOX, PCD, PCD Argentina, PEAQ, Pentagram, Phicomm, Philco, Philips, Phonemax, phoneOne, Pioneer, Pixelphone, Pixus, Ployer, Plum, PocketBook, POCO, Point of View, Polaroid, PolyPad, Polytron, Pomp, Positivo, Positivo BGH, PPTV, Prestigio, Primepad, Primux, Prixton, Proline, ProScan, Protruly, PULID, Q-Touch, Q.Bell, Qilive, QMobile, Qtek, Quantum, Quechua, Qumo, R-TV, Ramos, Ravoz, Razer, RCA Tablets, Readboy, Realme, RED, Rikomagic, RIM, Rinno, Ritmix, Ritzviva, Riviera, Roadrover, Rokit, Roku, Rombica, Ross&Moor, Rover, RoverPad, RT Project, RugGear, Runbo, Ryte, Safaricom, Sagem, Samsung, Sanei, Santin, Sanyo, Savio, Schneider, Sega, Selenga, Selevision, Selfix, SEMP TCL, Sencor, Sendo, Senkatel, Senseit, Senwa, SFR, Sharp, Shift Phones, Shtrikh-M, Shuttle, Siemens, Sigma, Silent Circle, Simbans, Sky, Skyworth, Smart, Smartfren, Smartisan, Softbank, Sonim, Sony, Sony Ericsson, Soundmax, Soyes, Spectrum, Spice, SQOOL, Star, Starlight, Starway, STF Mobile, STK, Stonex, Storex, Sugar, Sumvision, Sunstech, SunVan, Sunvell, SuperSonic, Supra, Swipe, SWISSMOBILITY, Swisstone, Symphony, Syrox, T-Mobile, Takara, TB Touch, TCL, TD Systems, TechniSat, TechnoTrend, TechPad, Teclast, Tecno Mobile, Tele2, Telefunken, Telego, Telenor, Telit, Tesco, Tesla, Tetratab, teXet, ThL, Thomson, TIANYU, Time2, Timovi, Tinai, Tinmo, TiPhone, Tolino, Tone, Tooky, Top House, Toplux, Torex, Toshiba, Touchmate, Transpeed, TrekStor, Trevi, Tronsmart, True, TTEC, Tunisie Telecom, Turbo, Turbo-X, TurboKids, TVC, TWM, Twoe, U.S. Cellular, Ugoos, Uhans, Uhappy, Ulefone, Umax, UMIDIGI, Unihertz, Unimax, Uniscope, Unknown, Unnecto, Unonu, Unowhy, UTOK, UTStarcom, Vastking, Venso, Verico, Verizon, Vernee, Vertex, Vertu, Verykool, Vesta, Vestel, VGO TEL, Videocon, Videoweb, ViewSonic, Vinga, Vinsoc, Vipro, Vitelcom, Vivax, Vivo, Vizio, VK Mobile, VKworld, Vodacom, Vodafone, Vonino, Vontar, Vorago, Vorke, Voto, Voxtel, Voyo, Vsmart, Vsun, Vulcan, VVETIME, Walton, Web TV, Weimei, WellcoM, Wexler, Wieppo, Wigor, Wiko, Wileyfox, Winds, Wink, Wiseasy, Wolder, Wolfgang, Wonu, Woo, Wortmann, Woxter, X-BO, X-TIGI, X-View, Xgody, Xiaolajiao, Xiaomi, Xion, Xolo, Xoro, Xshitou, Xtouch, Yandex, Yarvik, Yes, Yezz, Yota, Ytone, Yu, Yuandao, Yusun, Yxtel, Zatec, Zeemi, Zen, Zenek, Zfiner, Zidoo, Ziox, Zonda, Zopo, ZTE, Zuum, Zync, ZYQ, öwn
243
 
244
  ### List of detected bots:
245
 
app/vendor/matomo/device-detector/regexes/bots.yml CHANGED
@@ -112,7 +112,7 @@
112
  name: 'Castro 2'
113
  category: 'Service Agent'
114
  url: 'http://supertop.co/castro/'
115
- producer:
116
  name: 'Supertop'
117
  url: 'http://supertop.co'
118
 
@@ -788,7 +788,7 @@
788
  name: ''
789
  url: ''
790
 
791
- - regex : 'masscan'
792
  name: 'masscan'
793
  url: 'https://github.com/robertdavidgraham/masscan'
794
  category: 'Crawler'
@@ -941,7 +941,7 @@
941
  category: 'Crawler'
942
  producer:
943
  name: 'Nuzzel'
944
- url: https://www.nuzzel.com/
945
 
946
  - regex: 'Octopus [0-9]'
947
  name: 'Octopus'
112
  name: 'Castro 2'
113
  category: 'Service Agent'
114
  url: 'http://supertop.co/castro/'
115
+ producer:
116
  name: 'Supertop'
117
  url: 'http://supertop.co'
118
 
788
  name: ''
789
  url: ''
790
 
791
+ - regex: 'masscan'
792
  name: 'masscan'
793
  url: 'https://github.com/robertdavidgraham/masscan'
794
  category: 'Crawler'
941
  category: 'Crawler'
942
  producer:
943
  name: 'Nuzzel'
944
+ url: 'https://www.nuzzel.com/'
945
 
946
  - regex: 'Octopus [0-9]'
947
  name: 'Octopus'
app/vendor/matomo/device-detector/regexes/client/browser_engine.yml CHANGED
@@ -23,6 +23,9 @@
23
  - regex: 'Presto'
24
  name: 'Presto'
25
 
 
 
 
26
  - regex: '(?<!like )Gecko'
27
  name: 'Gecko'
28
 
@@ -34,6 +37,3 @@
34
 
35
  - regex: 'Servo'
36
  name: 'Servo'
37
-
38
- - regex: 'Goanna'
39
- name: 'Goanna'
23
  - regex: 'Presto'
24
  name: 'Presto'
25
 
26
+ - regex: 'Goanna'
27
+ name: 'Goanna'
28
+
29
  - regex: '(?<!like )Gecko'
30
  name: 'Gecko'
31
 
37
 
38
  - regex: 'Servo'
39
  name: 'Servo'
 
 
 
app/vendor/matomo/device-detector/regexes/client/browsers.yml CHANGED
@@ -5,6 +5,86 @@
5
  # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
6
  ###############
7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  # Safe Exam Browser (https://safeexambrowser.org/)
9
  - regex: 'SEB/(?:(\d+[\.\d]+))?'
10
  name: 'Safe Exam Browser'
@@ -276,6 +356,27 @@
276
  engine:
277
  default: 'Blink'
278
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
279
  # Huawei Browser
280
  - regex: 'HuaweiBrowser(?:/(\d+[\.\d]+))?'
281
  name: 'Huawei Browser'
@@ -569,7 +670,7 @@
569
  version: '$1'
570
 
571
  # t-online.de Browser (https://www.t-online.de/computer/browser/)
572
- - regex: 'TO-Browser(?:/TOB(\d+[\.\d]+))?'
573
  name: 't-online.de Browser'
574
  version: '$1'
575
 
@@ -893,13 +994,6 @@
893
  engine:
894
  default: 'Blink'
895
 
896
- # Yaani Browser
897
- - regex: 'YaaniBrowser(?:/(\d+[\.\d]+))?'
898
- name: 'Yaani Browser'
899
- version: '$1'
900
- engine:
901
- default: 'Blink'
902
-
903
  #Vivaldi
904
  - regex: 'Vivaldi(?:/(\d+[\.\d]+))?'
905
  name: 'Vivaldi'
@@ -1481,7 +1575,7 @@
1481
  name: 'iCab Mobile'
1482
  version: '$1'
1483
  engine:
1484
- default: 'WebKit'
1485
 
1486
  #iCab
1487
  - regex: 'iCab(?:[ /](\d+[\.\d]+))?'
@@ -1499,6 +1593,13 @@
1499
  engine:
1500
  default: '' # multi engine
1501
 
 
 
 
 
 
 
 
1502
  #Internet Explorer
1503
  - regex: 'IEMobile[ /](\d+[\.\d]+)'
1504
  name: 'IE Mobile'
@@ -1512,22 +1613,22 @@
1512
  default: 'Trident'
1513
  - regex: 'MSIE.*Trident/4.0'
1514
  name: 'Internet Explorer'
1515
- version: 8.0
1516
  engine:
1517
  default: 'Trident'
1518
  - regex: 'MSIE.*Trident/5.0'
1519
  name: 'Internet Explorer'
1520
- version: 9.0
1521
  engine:
1522
  default: 'Trident'
1523
  - regex: 'MSIE.*Trident/6.0'
1524
  name: 'Internet Explorer'
1525
- version: 10.0
1526
  engine:
1527
  default: 'Trident'
1528
  - regex: 'Trident/[78].0'
1529
  name: 'Internet Explorer'
1530
- version: 11.0
1531
  engine:
1532
  default: 'Trident'
1533
  - regex: 'MSIE (\d+[\.\d]+)'
@@ -1738,13 +1839,13 @@
1738
  version: '$1'
1739
  engine:
1740
  default: 'WebKit'
1741
-
1742
- #Dorado
1743
  - regex: 'Dorado WAP-Browser[/ ](\d+[\.\d]+)'
1744
  name: 'Dorado'
1745
  version: '$1'
1746
 
1747
- #NetSurf
1748
  - regex: 'NetSurf(?:/(\d+[\.\d]+))?'
1749
  name: 'NetSurf'
1750
  version: '$1'
@@ -1772,4 +1873,8 @@
1772
  - regex: 'GOGGalaxyClient/(?:(\d+[\.\d]+))?'
1773
  name: 'GOG Galaxy'
1774
  version: '$1'
1775
-
 
 
 
 
5
  # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
6
  ###############
7
 
8
+ # Kode Browser (https://www.kodebrowser.com/ | https://play.google.com/store/apps/details?id=com.app.downloadmanager | https://apps.apple.com/us/app/kode-browser-fast-private/id625458492)
9
+ - regex: '(?:Kode(?:iOS)?/(?:(\d+[\.\d]+))?|TansoDL)'
10
+ name: 'Kode Browser'
11
+ version: '$1'
12
+
13
+ # UR Browser (https://www.ur-browser.com/)
14
+ - regex: 'UR/(?:(\d+[\.\d]+))'
15
+ name: 'UR Browser'
16
+ version: '$1'
17
+ engine:
18
+ default: 'Blink'
19
+
20
+ # Smart Lenovo Browser (https://www.lenovo.com.cn/)
21
+ - regex: 'Chrome/.+ SLBrowser/(?:(\d+[\.\d]+))?'
22
+ name: 'Smart Lenovo Browser'
23
+ version: '$1'
24
+ engine:
25
+ default: 'Blink'
26
+ - regex: 'SLBrowser/(?:(\d+[\.\d]+))?'
27
+ name: 'Smart Lenovo Browser'
28
+ version: '$1'
29
+
30
+ # Browzar (https://www.browzar.com/)
31
+ - regex: 'Browzar'
32
+ name: 'Browzar'
33
+ version: '$1'
34
+
35
+ # Stargon (http://www.stargon.org/ | https://play.google.com/store/apps/details?id=net.onecook.browser)
36
+ - regex: 'Stargon/(?:(\d+[\.\d]+))?'
37
+ name: 'Stargon'
38
+ version: '$1'
39
+ engine:
40
+ default: 'Blink'
41
+
42
+ # NFS Browser (https://github.com/nfschina/nfs-browser)
43
+ - regex: 'NFSBrowser/(?:(\d+[\.\d]+))?'
44
+ name: 'NFS Browser'
45
+ version: '$1'
46
+ engine:
47
+ default: 'Blink'
48
+
49
+ # Borealis Navigator (https://binaryoutcast.com/projects/borealis/)
50
+ - regex: 'Borealis/(\d+[\.\d]+)'
51
+ name: 'Borealis Navigator'
52
+ version: '$1'
53
+
54
+ # Yolo Browser
55
+ - regex: 'YoloBrowser/(?:(\d+[\.\d]+))?'
56
+ name: 'Yolo Browser'
57
+ version: '$1'
58
+ engine:
59
+ default: 'Blink'
60
+
61
+ # Phoenix Browser (http://phoenix-browser.com/ | https://play.google.com/store/apps/details?id=com.transsion.phoenix)
62
+ - regex: 'PHX/(?:(\d+[\.\d]+))?'
63
+ name: 'Phoenix Browser'
64
+ version: '$1'
65
+
66
+ # PrivacyWall (https://play.google.com/store/apps/details?id=org.privacywall.browser)
67
+ - regex: 'PrivacyWall/(?:(\d+[\.\d]+))?'
68
+ name: 'PrivacyWall'
69
+ version: '$1'
70
+
71
+ # Ghostery Privacy Browser (https://play.google.com/store/apps/details?id=com.ghostery.android.ghostery | https://apps.apple.com/us/app/ghostery-privacy-browser/id472789016)
72
+ - regex: 'Ghostery:?(\d+[\.\d]+)?'
73
+ name: 'Ghostery Privacy Browser'
74
+ version: '$1'
75
+
76
+ # Yaani Browser
77
+ - regex: 'Firefox/.*(?:Turkcell-)?YaaniBrowser(?:/(\d+[\.\d]+))?'
78
+ name: 'Yaani Browser'
79
+ version: '$1'
80
+ engine:
81
+ default: 'Gecko'
82
+ - regex: '(?:Turkcell-)?YaaniBrowser(?:/(\d+[\.\d]+))?'
83
+ name: 'Yaani Browser'
84
+ version: '$1'
85
+ engine:
86
+ default: 'Blink'
87
+
88
  # Safe Exam Browser (https://safeexambrowser.org/)
89
  - regex: 'SEB/(?:(\d+[\.\d]+))?'
90
  name: 'Safe Exam Browser'
356
  engine:
357
  default: 'Blink'
358
 
359
+ # Slimjet (https://slimjet.com)
360
+ - regex: 'Slimjet/(?:(\d+[\.\d]+))'
361
+ name: 'Slimjet'
362
+ version: '$1'
363
+ engine:
364
+ default: 'Blink'
365
+
366
+ # 7Star
367
+ - regex: '7Star/(?:(\d+[\.\d]+))'
368
+ name: '7Star'
369
+ version: '$1'
370
+ engine:
371
+ default: 'Blink'
372
+
373
+ # MxNitro
374
+ - regex: 'MxNitro/(?:(\d+[\.\d]+))'
375
+ name: 'MxNitro'
376
+ version: '$1'
377
+ engine:
378
+ default: 'Blink'
379
+
380
  # Huawei Browser
381
  - regex: 'HuaweiBrowser(?:/(\d+[\.\d]+))?'
382
  name: 'Huawei Browser'
670
  version: '$1'
671
 
672
  # t-online.de Browser (https://www.t-online.de/computer/browser/)
673
+ - regex: '(?:TO-Browser/TOB|DT-Browser/DTB)(\d+[\.\d]+)'
674
  name: 't-online.de Browser'
675
  version: '$1'
676
 
994
  engine:
995
  default: 'Blink'
996
 
 
 
 
 
 
 
 
997
  #Vivaldi
998
  - regex: 'Vivaldi(?:/(\d+[\.\d]+))?'
999
  name: 'Vivaldi'
1575
  name: 'iCab Mobile'
1576
  version: '$1'
1577
  engine:
1578
+ default: 'WebKit'
1579
 
1580
  #iCab
1581
  - regex: 'iCab(?:[ /](\d+[\.\d]+))?'
1593
  engine:
1594
  default: '' # multi engine
1595
 
1596
+ # Crazy Browser
1597
+ - regex: 'Crazy Browser (\d+[\.\d]+)'
1598
+ name: 'Crazy Browser'
1599
+ version: '$1'
1600
+ engine:
1601
+ default: 'Trident'
1602
+
1603
  #Internet Explorer
1604
  - regex: 'IEMobile[ /](\d+[\.\d]+)'
1605
  name: 'IE Mobile'
1613
  default: 'Trident'
1614
  - regex: 'MSIE.*Trident/4.0'
1615
  name: 'Internet Explorer'
1616
+ version: '8.0'
1617
  engine:
1618
  default: 'Trident'
1619
  - regex: 'MSIE.*Trident/5.0'
1620
  name: 'Internet Explorer'
1621
+ version: '9.0'
1622
  engine:
1623
  default: 'Trident'
1624
  - regex: 'MSIE.*Trident/6.0'
1625
  name: 'Internet Explorer'
1626
+ version: '10.0'
1627
  engine:
1628
  default: 'Trident'
1629
  - regex: 'Trident/[78].0'
1630
  name: 'Internet Explorer'
1631
+ version: '11.0'
1632
  engine:
1633
  default: 'Trident'
1634
  - regex: 'MSIE (\d+[\.\d]+)'
1839
  version: '$1'
1840
  engine:
1841
  default: 'WebKit'
1842
+
1843
+ # Dorado
1844
  - regex: 'Dorado WAP-Browser[/ ](\d+[\.\d]+)'
1845
  name: 'Dorado'
1846
  version: '$1'
1847
 
1848
+ # NetSurf
1849
  - regex: 'NetSurf(?:/(\d+[\.\d]+))?'
1850
  name: 'NetSurf'
1851
  version: '$1'
1873
  - regex: 'GOGGalaxyClient/(?:(\d+[\.\d]+))?'
1874
  name: 'GOG Galaxy'
1875
  version: '$1'
1876
+
1877
+ # MAUI Wap Browser
1878
+ - regex: 'WAP Browser/MAUI|(?:\w+)?Maui Wap Browser|MAUI[- ]Browser'
1879
+ name: 'MAUI WAP Browser'
1880
+ version: ''
app/vendor/matomo/device-detector/regexes/client/feed_readers.yml CHANGED
@@ -22,7 +22,7 @@
22
  version: ''
23
  url: 'http://lincgeek.org/bashpodder/'
24
  type: 'Feed Reader'
25
-
26
  - regex: 'Breaker/v([\d\.]+)'
27
  name: 'Breaker'
28
  version: '$1'
22
  version: ''
23
  url: 'http://lincgeek.org/bashpodder/'
24
  type: 'Feed Reader'
25
+
26
  - regex: 'Breaker/v([\d\.]+)'
27
  name: 'Breaker'
28
  version: '$1'
app/vendor/matomo/device-detector/regexes/client/mediaplayers.yml CHANGED
@@ -32,7 +32,7 @@
32
  - regex: 'FlyCast(?:/([\d\.]+))?'
33
  name: 'FlyCast'
34
  version: '$1'
35
-
36
  - regex: 'foobar2000(?:/([\d\.]+))?'
37
  name: 'Foobar2000'
38
  version: '$1'
32
  - regex: 'FlyCast(?:/([\d\.]+))?'
33
  name: 'FlyCast'
34
  version: '$1'
35
+
36
  - regex: 'foobar2000(?:/([\d\.]+))?'
37
  name: 'Foobar2000'
38
  version: '$1'
app/vendor/matomo/device-detector/regexes/client/pim.yml CHANGED
@@ -48,4 +48,4 @@
48
  # SeaMonkey
49
  - regex: '(?:SeaMonkey|Iceape)(?:/(\d+[\.\d]+))?'
50
  name: 'SeaMonkey'
51
- version: '$1'
48
  # SeaMonkey
49
  - regex: '(?:SeaMonkey|Iceape)(?:/(\d+[\.\d]+))?'
50
  name: 'SeaMonkey'
51
+ version: '$1'
app/vendor/matomo/device-detector/regexes/device/cameras.yml CHANGED
@@ -17,12 +17,12 @@ Samsung:
17
  device: 'camera'
18
  models:
19
  - regex: 'EK-GN120'
20
- model: 'GALAXY NX'
21
  - regex: 'EK-GC100'
22
- model: 'GALAXY Camera'
23
  - regex: 'EK-GC110'
24
- model: 'GALAXY Camera WiFi only'
25
  - regex: 'EK-GC200'
26
- model: 'GALAXY Camera 2'
27
  - regex: 'EK-GC([0-9]{3})'
28
- model: 'GALAXY Camera $1'
17
  device: 'camera'
18
  models:
19
  - regex: 'EK-GN120'
20
+ model: 'Galaxy NX'
21
  - regex: 'EK-GC100'
22
+ model: 'Galaxy Camera'
23
  - regex: 'EK-GC110'
24
+ model: 'Galaxy Camera WiFi only'
25
  - regex: 'EK-GC200'
26
+ model: 'Galaxy Camera 2'
27
  - regex: 'EK-GC([0-9]{3})'
28
+ model: 'Galaxy Camera $1'
app/vendor/matomo/device-detector/regexes/device/consoles.yml CHANGED
@@ -14,8 +14,14 @@ Microsoft:
14
  regex: 'Xbox'
15
  device: 'console'
16
  models:
 
 
 
 
17
  - regex: 'Xbox One'
18
  model: 'Xbox One'
 
 
19
  - regex: 'Xbox'
20
  model: 'Xbox 360'
21
 
14
  regex: 'Xbox'
15
  device: 'console'
16
  models:
17
+ - regex: 'Xbox Series X'
18
+ model: 'Xbox Series X'
19
+ - regex: 'Xbox One X'
20
+ model: 'Xbox One X'
21
  - regex: 'Xbox One'
22
  model: 'Xbox One'
23
+ - regex: 'XBOX_ONE_ED'
24
+ model: 'Xbox One S'
25
  - regex: 'Xbox'
26
  model: 'Xbox 360'
27
 
app/vendor/matomo/device-detector/regexes/device/mobiles.yml CHANGED
@@ -176,6 +176,8 @@ Microsoft:
176
  model: 'Lumia 435'
177
  - regex: 'RM-1031|Lumia 532'
178
  model: 'Lumia 532'
 
 
179
  - regex: 'RM-109[02]|RM-1089|Lumia 535'
180
  model: 'Lumia 535'
181
  - regex: 'RM-1141|Lumia 540'
@@ -184,9 +186,18 @@ Microsoft:
184
  model: 'Lumia 550'
185
  - regex: 'RM-1010'
186
  model: 'Lumia 638'
 
 
 
187
  - regex: 'RM-106[57]|RM-1096|Lumia 640 XL'
188
  model: 'Lumia 640 XL'
189
  device: 'phablet'
 
 
 
 
 
 
190
  - regex: 'RM-1109|RM-1113|RM-107[23467]|Lumia 640'
191
  model: 'Lumia 640'
192
  - regex: 'RM-1154|Lumia 650'
@@ -195,9 +206,14 @@ Microsoft:
195
  model: 'Lumia 650 SS'
196
  - regex: 'Lumia 850'
197
  model: 'Lumia 850'
 
 
 
198
  - regex: 'Lumia 950 XL'
199
  model: 'Lumia 950 XL'
200
  device: 'phablet'
 
 
201
  - regex: 'Lumia 950'
202
  model: 'Lumia 950'
203
  - regex: 'RM-994|Lumia 1320'
@@ -690,6 +706,11 @@ MicroMax:
690
  model: 'Bolt Selfie'
691
  - regex: 'Q426'
692
  model: 'Canvas Mega 2'
 
 
 
 
 
693
  - regex: 'MicroMax(?:[ \-\_])?(P[a-z0-9]+)'
694
  model: '$1'
695
  device: 'tablet'
@@ -811,6 +832,8 @@ Bravis:
811
  model: 'A510 Jeans 4G'
812
  - regex: 'A509_Jeans'
813
  model: 'A509 Jeans'
 
 
814
  - regex: 'N1_550_Cruiser'
815
  model: 'N1-550 Cruiser'
816
  - regex: 'BRAVIS OMEGA'
@@ -819,6 +842,8 @@ Bravis:
819
  model: 'Biz'
820
  - regex: 'BRAVIS POWER'
821
  model: 'Power'
 
 
822
 
823
  - regex: 'BRAVIS[ _]SLIM[ _]3G'
824
  model: 'Slim 3G'
@@ -842,7 +867,7 @@ Bravis:
842
 
843
  # Acer
844
  Acer:
845
- regex: 'acer|(?<!Satellite |ZTE BLADE |ImSmart |ERGO |X-Style Tab )a(?:101|110|2[10]0|211|50[10]|51[10]|70[10])(?:[);/ ]|$)|Android.*V3[67]0(?:[);/ ]|$)|Android.*Z1[23456]0 Build|Android.*Z5\d{2} Build|Android.*T0[234678] Build|Android.*S55(?:[);/ ]|$)|(?:A1-(713(HD)?|7[23]4|830|841|840FHD|81[01])|A3-A[1234][01]|B1-(7[1235-8][01](HD)?|7[23]3|7A0|8[1235]0|A71|860A)|B3-(A[125]0|A3[02]|A40FHD)|E39)(?:[);/ ]|$)|S5[12]0 Build|(DA[0-9]+HQ?L|Aspire V5-121|Chromebook 14 \(CB3-431\)|Predator G9-793|GT-810|B1-870|B3-A4[02])(?:[);/ ]|$)'
846
  device: 'smartphone'
847
  models:
848
  # smart displays
@@ -860,6 +885,9 @@ Acer:
860
  - regex: 'A1-81[01]'
861
  model: 'Iconia A'
862
  device: 'tablet'
 
 
 
863
  - regex: 'A1-84(1|0FHD)'
864
  model: 'Iconia Tab 8'
865
  device: 'tablet'
@@ -890,7 +918,7 @@ Acer:
890
  - regex: 'B1-8[123567]0'
891
  model: 'Iconia One 8'
892
  device: 'tablet'
893
- - regex: 'B3-A([125]0|3[02]|40FHD|4[02])'
894
  model: 'Iconia One 10'
895
  device: 'tablet'
896
  - regex: 'A101'
@@ -974,7 +1002,7 @@ Acer:
974
  - regex: '(?:Acer )?(Chromebook 14)'
975
  model: '$1'
976
  device: 'desktop'
977
- - regex: '(Aspire V5-121)'
978
  model: '$1'
979
  device: 'desktop'
980
  - regex: '(Predator G9-793)'
@@ -1088,9 +1116,9 @@ Arian Space:
1088
  - regex: '70 ST7001RW'
1089
  model: '70'
1090
 
1091
- # Alcatel
1092
  Alcatel:
1093
- regex: 'Alcatel|Alc(?!or )[a-z0-9]+|One[ _]?Touch|idol3|TIMXL|(?:(?:4003[AJ]|4009[ADEFIKMSX]|4013[DEJKMX]|4014[ADEKMX]|4015[ADNTX]|4016[ADX]|4017[ADEFSX]|4018[ADEFMX]|4024[EDX]|4027[ADNX]|4028[AEJS]|4032[ADEX]|4034L|4034[ADEFGX]|4035[ADXY]|4045[ADEX]|4047[ADFGNX]|4049[DEGMX]|4060[SW]|A466BG|A621BL|4114E|5001[ADJTU]|5002[ADF]|5003[ADG]|5007[AU]|5008[DUY]|5009[AD]|5010[DEGSUX]|5011A|5012[DFG]|5015[ADEX]|5016[AXJ]|5017[ABDEOX]|5019D|5022[EDX]|5023[EF]|5024[ADJ]|5025[DEG]|5026[ADJ]|5027B|5028[AY]|5029[EY]|5032W|5033[AEFXDJGMOTXY]|5034D|5036D|5038[ADEX]|5039[D]|5041[CD]|5042[ADEFGWXT]|5044[ADGIKOPSTY]|5045[ADFGIJTXY]|5046[ADGIJSTUY]|5047[DIUY]|5048[AYU]|5049[EGSWZ]|5050[ASXY]|5051[ADEJMTWX]|5052[ADY]|5053[AKY]|5054[ADNSTWX]|5056[ADEGIJMNTUWX]|5057M|5058[AIY]|5059[ADXYZIST]|5060D|5065[ADNWX]|5070D|5080[ADFQUX]|5085[ABCDGHIJNOQY]|5086[ADY]|5090[AIY]|5095[IKY]|5098[OS]|5099[ADYUI]|5116J|5145A|6016[ADEX]|6036[AXY]|6037[BKY]|6039[AHJKY]|6043[AD]|6044D|6045[BFIKOYX]|6050[AFY]|6055[ABDHIKPUYZ]|6058[ADX]|6060S|6062W|6070K|7040[ADEFKRT]|7041[DX]|7042A|7043[AEKY]|7044[AX]|7045Y|7048[ASWX]|7053D|7055A|7070X|8030Y|8050[DEGX]|8063|8088[XQ]|9001[DIX]|9002X|9003[AX]|9024O|9005X|9026X|9007[ATX]|9008[ADIJNTUX]|9010X|9020A|9022X|9027[FTWX]|9203A|A(?:464BG|570BL|50[13]DL|57[17]VL|574BL)|I213|I216X)(?:_(?:EEA|RU))?)(?:[);/ ]|$)'
1094
  device: 'smartphone'
1095
  models:
1096
  - regex: '5022[EDX]|5070D'
@@ -1159,7 +1187,7 @@ Alcatel:
1159
  model: 'One Touch Astro'
1160
  - regex: '5027B'
1161
  model: 'One Touch Dawn'
1162
- - regex: '5024[AD]|5028Y'
1163
  model: '1S'
1164
  - regex: '5002[AD]'
1165
  model: '1B (2020)'
@@ -1171,8 +1199,10 @@ Alcatel:
1171
  model: 'One Touch Fierce 2'
1172
  - regex: '5056[NW]'
1173
  model: 'One Touch Fierce 4'
1174
- - regex: '5054[NW]'
1175
  model: 'One Touch Fierce XL'
 
 
1176
  - regex: '6016[AX]'
1177
  model: 'One Touch Idol 2 mini'
1178
  - regex: '6016[DE]'
@@ -1242,6 +1272,9 @@ Alcatel:
1242
  - regex: '9007[TX]'
1243
  model: 'One Touch Pixi 3 7" 4G'
1244
  device: 'tablet'
 
 
 
1245
  - regex: '9022X'
1246
  model: 'One Touch Pixi 3 8"'
1247
  device: 'phablet'
@@ -1301,7 +1334,7 @@ Alcatel:
1301
  model: 'A30 Fierce'
1302
  - regex: '5085[GO]'
1303
  model: 'A50'
1304
- - regex: '5048[AYU]'
1305
  model: '3X (2019)'
1306
  - regex: '5049W'
1307
  model: 'Revvl'
@@ -1399,10 +1432,14 @@ Alcatel:
1399
  model: '1V (2020)'
1400
  - regex: '5003[ADG]'
1401
  model: '1C (2019)'
 
 
1402
  - regex: '5024J'
1403
  model: '1S'
1404
- - regex: '5028A'
1405
  model: '1S (2020)'
 
 
1406
  - regex: '5001[ADJTU]'
1407
  model: '1V'
1408
  - regex: '5059[ADXYZIT]'
@@ -1416,7 +1453,7 @@ Alcatel:
1416
  model: '3'
1417
  - regex: '5029E'
1418
  model: '3 (2020)'
1419
- - regex: '5029Y'
1420
  model: '3L (2020)'
1421
  - regex: '5032W|5099[ADYUI]'
1422
  model: '3V'
@@ -1427,6 +1464,8 @@ Alcatel:
1427
  device: 'phablet'
1428
  - regex: '5058[AIY]'
1429
  model: '3X'
 
 
1430
  - regex: '5086[ADY]'
1431
  model: '5'
1432
  - regex: '6062W'
@@ -1451,7 +1490,7 @@ Alcatel:
1451
 
1452
  # Allview
1453
  Allview:
1454
- regex: 'Allview|A4You|A5_(?:Easy(?:_TM)?|Ready(?:_TM)?|Quad|Quad_Plus_TM)|A[56789]_Lite|A5Smiley|A6_Duo|A10_Lite_2019|A10_Plus|AX2_Frenzy|AX4Nano|AX5NanoQ|C6_Duo|E[23]_Living|E3_(?:Jump|Sign)|E4_Lite|M9_Connect|P(?:43_Easy|[5689]_Energy|6_Energy_Lite|[68]_Energy_Mini(?:_TM)?|(41|[458])_eMagic(?:_TM)?|[589](?:_)?Life(?:_TM)?|[567]_Lite(?:_TM)?|6_plus|[45678]_Pro|7_Seon|10_Life|10_Max|10_Style|7_Xtreme|6_Qmax|4_Quad)|V(?:[134]_Viper|1_Viper_I|2_Viper_(?:E|I|S|X|X_plus|Xe))|X(?:[1234]_Soul_Xtreme|[12345]_Soul|3_Soul_Lite|[23456]_Soul_Mini(?:_TM)?|4_Soul_Mini_S(?:_TM)?|[234]_Soul_Style(?:_TM)?|2_Soul_Style_Plus|2_Twin)|Viva_(H801|100[13]G|H1001_LTE)'
1455
  device: 'smartphone'
1456
  models:
1457
  - regex: 'A4You'
@@ -1524,7 +1563,9 @@ Allview:
1524
  model: 'V2 Viper X Plus'
1525
  - regex: 'V2_Viper_(E|I|S|X(?:e)?)'
1526
  model: 'V2 Viper $1'
1527
- - regex: 'X([124])_Soul_Xtreme'
 
 
1528
  model: 'X$1 Soul Xtreme'
1529
  - regex: 'X4_Soul_Infinity_(L|N|S|Z)'
1530
  model: 'X4 Soul Infinity $1'
@@ -1540,7 +1581,7 @@ Allview:
1540
  model: 'X$1 Soul Pro'
1541
  - regex: 'X2_Soul_Style_Plus'
1542
  model: 'X2 Soul Style Plus'
1543
- - regex: 'X([234])_Soul_Style(?:_TM)?'
1544
  model: 'X$1 Soul Style'
1545
  - regex: 'X([12345])_Soul'
1546
  model: 'X$1 Soul'
@@ -1587,7 +1628,7 @@ Allview:
1587
  - regex: 'Allview3SpeedQuad'
1588
  device: 'tablet'
1589
  model: 'Alldro 3 Speed Quad'
1590
- - regex: 'Viva_(H801|100[13]G|H1001_LTE)'
1591
  device: 'tablet'
1592
  model: 'Viva $1'
1593
  - regex: 'ALLVIEW ?SPEEDI'
@@ -1616,10 +1657,10 @@ Allwinner:
1616
  regex: '(?:QUAD-CORE A64 p3|ZY-07B)(?:[);/ ]|$)'
1617
  device: 'tablet'
1618
  models:
1619
- - regex: 'QUAD-CORE A64 p3'
1620
- model: 'A64 QUAD-CORE p3'
1621
- - regex: 'ZY-07B'
1622
- model: 'ZY-07B'
1623
 
1624
  # altron
1625
  altron:
@@ -1683,7 +1724,7 @@ Amoi:
1683
 
1684
  # Ainol
1685
  Ainol:
1686
- regex: 'Numy|novo[0-9]|Novo 10 Hero|AX10PRO|NUMY3GAX9|NOVO10 Spark'
1687
  device: 'tablet'
1688
  models:
1689
  - regex: 'Numy 3G AX1'
@@ -1702,6 +1743,8 @@ Ainol:
1702
  model: 'Numy 3G AX9'
1703
  - regex: '(Novo 10 Hero QuadCore)'
1704
  model: '$1'
 
 
1705
  - regex: 'Novo7 Flame(?:[);/ ]|$)'
1706
  model: 'Novo 7 Flame'
1707
  - regex: 'NOVO7(?:[);/ ]|$)'
@@ -1898,7 +1941,7 @@ Assistant:
1898
 
1899
  # Ark (Ark Electronic Technology)
1900
  Ark:
1901
- regex: '(ARK[_ -])?Benefit[_ -]([^/;]*)(?: Build|\))|EDGE A5HD|Elf_S8|ICON (R40\+|R45)|Impulse[ _](P[12])|Wizard_1(?:[);/ ]|$)'
1902
  device: 'smartphone'
1903
  models:
1904
  - regex: '(?:ARK[_ -])?Benefit[_ -]([^/;]*)(?: Build|\))'
@@ -1911,8 +1954,8 @@ Ark:
1911
  model: 'Edge $1'
1912
  - regex: 'ICON (R40\+|R45)'
1913
  model: 'Icon $1'
1914
- - regex: 'Wizard_1'
1915
- model: 'Wizard 1'
1916
  - regex: 'Elf_S8(?:[);/ ]|$)'
1917
  model: 'Elf S8'
1918
 
@@ -1930,7 +1973,7 @@ Garmin-Asus:
1930
 
1931
  # Asus
1932
  Asus:
1933
- regex: 'Asus|Transformer|ZenFone Max|TF300T|Slider SL101|PadFone|ME302(?:C|KL)|ME301T|ME371MG|ME17(?:1|2V|3X)|(?:K0[01][0-9a-z]|P(?:00[18ACIL]|01[MTVWYZ]|01MA|01T_1|02[13478])(?: Build|\))|X015D|X018D|X003|X00[7ABT]D|Z00D|Z00[MTY]D|Z01[7FGHKMR]D)(?:[);/ ]|$)|G55[023]KL|ZB(631|602|633|55[135]|50[01])KL|ZC(55[134]|520|600)KL|ZA550KL|ZE(520|620|55[2345])KL|ZD55[23]KL|ZS600KL|ZS(6[236]0|55[10])KL|ZB(500KG|601KL)|MeMo Pad FHD 10 LTE|Z00VD'
1934
  device: 'smartphone'
1935
  models:
1936
  # explicit tablet models
@@ -2065,7 +2108,7 @@ Asus:
2065
  model: 'ZenFone Max Pro M1'
2066
  - regex: '(?:ASUS_)?(X01([AB]D)|ZB633KL)(?:[);/ ]|$)'
2067
  model: 'ZenFone Max M2'
2068
- - regex: '(?:ASUS_)?(?:Z00[AD]|Z008D|Z008|Z00AD[AB]?)'
2069
  model: 'ZenFone 2'
2070
  - regex: '(?:ASUS_)?(?:ZenFone 2E)'
2071
  model: 'ZenFone 2E'
@@ -2109,7 +2152,7 @@ Asus:
2109
  model: 'ZenFone Go Life'
2110
  - regex: '(?:ASUS_)?G550KL'
2111
  model: 'ZenFone Go TV'
2112
- - regex: '(?:ASUS_)?Z00VD' #ZC500TG
2113
  model: 'ZenFone Go'
2114
  - regex: '(?:ASUS_)?(X00[23])'
2115
  model: 'ZenFone Pegasus'
@@ -2159,7 +2202,7 @@ Asus:
2159
  model: 'ROG Phone'
2160
  - regex: '(?:ASUS_)?(?:I001D[ABCE]?|ZS660KL)'
2161
  model: 'ROG Phone 2'
2162
- - regex: '(?:ASUS_)?(?:I003DD?)'
2163
  model: 'ROG Phone 3'
2164
 
2165
  # general detections
@@ -2172,9 +2215,9 @@ Asus:
2172
  - regex: '(?:Asus|Transformer) ((?:Pad |Prime )?TF[0-9a-z]+)'
2173
  device: 'tablet'
2174
  model: 'Transformer $1'
2175
- - regex: 'Chromebook Flip C100PA'
2176
- device: 'tablet'
2177
- model: 'Chromebook Flip C100PA'
2178
 
2179
  # Audiovox
2180
  Audiovox:
@@ -2266,69 +2309,76 @@ Bitel:
2266
 
2267
  # Blu
2268
  Blu:
2269
- regex: 'BLU |(?:blu|Dash)[ _]([^/;]+) Build|Studio (5.0K|5.5|View XL|Mega|C 8\+8|C HD|C|G|Selfie LTE|Touch|M HD|M5 Plus|J[1258]|X|X8 HD)|Advance (4.0 ?[LM]|5.[02](?: HD)?|A4|L5)|ENERGY (DIAMOND|XL)|LIFE XL|B110DL|Dash (?:X[2L]|L3)|PURE XL|Life One X2|GRAND (?:5.5 HD|XL LTE)|R1 (HD|PLUS)|Tank Xtreme 5.0|Tank Xtreme Pro|STUDIO SELFIE'
2270
- device: 'smartphone'
2271
- models:
2272
- - regex: 'Advance (4.0 ?[LM]|4.0|5.[02](?: HD)?|A4|L5)'
2273
- model: 'Advance $1'
2274
- - regex: 'Studio (5.0 C|5.5|View XL|Mega|C 8\+8|C HD|C|G|Touch|M HD|M5 Plus|J[1258]|X|X8 HD)'
2275
- model: 'Studio $1'
2276
- - regex: 'Studio (5.0)K'
2277
- model: 'Studio $1 K'
2278
- - regex: 'STUDIO SELFIE LTE'
2279
- model: 'Studio Selfie LTE'
2280
- - regex: 'STUDIO ONE'
2281
- model: 'Studio One'
2282
- - regex: 'STUDIO SELFIE ([23]|LTE)'
2283
- model: 'Studio Selfie $1'
2284
- - regex: 'STUDIO SELFIE'
2285
- model: 'Studio Selfie'
2286
- - regex: 'ENERGY DIAMOND'
2287
- model: 'Energy Diamond'
2288
- - regex: 'ENERGY XL'
2289
- model: 'Energy XL'
2290
- - regex: 'ENERGY X PLUS 2'
2291
- model: 'Energy X Plus 2'
2292
- - regex: 'ENERGY X PLUS'
2293
- model: 'Energy X Plus'
2294
- - regex: 'LIFE XL'
2295
- model: 'Life XL'
2296
- - regex: 'Dash XL'
2297
- model: 'Dash XL'
2298
- - regex: 'PURE XL'
2299
- model: 'Pure XL'
2300
- - regex: 'Life One X2'
2301
- model: 'Life One X2'
2302
- - regex: 'LIFE ONE'
2303
- model: 'Life One'
2304
- - regex: 'NEO X PLUS'
2305
- model: 'Neo X Plus'
2306
- - regex: 'NEO (XL|X)'
2307
- model: 'Neo $1'
2308
- - regex: 'GRAND 5.5 HD'
2309
- model: 'Grand 5.5 HD'
2310
- - regex: 'Grand X LTE'
2311
- model: 'Grand X LTE'
2312
- - regex: 'Grand XL LTE'
2313
- model: 'Grand XL LTE'
2314
- - regex: 'B110DL'
2315
- model: 'View Mega'
2316
- - regex: 'R1 HD'
2317
- model: 'R1 HD'
2318
- - regex: 'R1 PLUS'
2319
- model: 'R1 Plus'
2320
- - regex: 'Tank Xtreme 5.0'
2321
- model: 'Tank Xtreme 5.0'
2322
- - regex: 'Tank Xtreme Pro'
2323
- model: 'Tank Xtreme Pro'
2324
- - regex: 'VIVO AIR LTE'
2325
- model: 'Vivo Air LTE'
2326
- - regex: 'DASH[ _]([^/;]+) Build'
2327
- model: 'Dash $1'
2328
- - regex: 'DASH (5.0|L3|L|M|X2|X)'
2329
- model: 'Dash $1'
2330
- - regex: 'blu[ _]([^/;]+) Build'
2331
- model: '$1'
 
 
 
 
 
 
 
2332
 
2333
  # Bluegood
2334
  Bluegood:
@@ -2340,7 +2390,7 @@ Bluegood:
2340
 
2341
  # Blackview
2342
  Blackview:
2343
- regex: 'Blackview|(BV([24-9]000|(5[589]|9[15689])00|6[138]00)(?:[ _](?:PRO))?|(P10000(?:[ _](?:PRO))?)|omega[ _]pro|Alife[ _][PS]1|Heatwave|DM550|BV9700Pro|(?<!Lenovo[_ ])A[68]0(?:Pro)?\))'
2344
  device: 'smartphone'
2345
  models:
2346
  - regex: 'A60Pro\)'
@@ -2353,7 +2403,7 @@ Blackview:
2353
  model: '$1'
2354
  - regex: '(BV9700)Pro'
2355
  model: '$1 Pro'
2356
- - regex: 'Blackview (A8|E7S)'
2357
  model: '$1'
2358
  - regex: 'BV9000Pro-F'
2359
  model: 'BV9000 Pro F'
@@ -2362,7 +2412,7 @@ Blackview:
2362
  - regex: '(BV6100)(?:[);/ ]|$)'
2363
  model: '$1'
2364
  device: 'phablet'
2365
- - regex: '(BV([24-9]000|(5[589]|9[15689])00)(?:[ _](?:PRO))?)'
2366
  model: '$1'
2367
  - regex: '(P10000(?:[ _](?:PRO))?)'
2368
  model: '$1'
@@ -2391,13 +2441,15 @@ Bluboo:
2391
 
2392
  # Black Fox
2393
  'Black Fox':
2394
- regex: 'BMM[ _-]?(?:44[123]D|441S|431D|533D|54[12]S|541[ABW]|54[123]D|543S|531[ABD])(?:[);/ ]|$)'
2395
  device: 'smartphone'
2396
  models:
2397
  - regex: 'BMM443D'
2398
  model: 'B7 Fox+'
2399
  - regex: 'BMM441S'
2400
  model: 'B8 Fox'
 
 
2401
  - regex: 'BMM442D'
2402
  model: 'B7'
2403
  - regex: 'BMM531D'
@@ -2488,7 +2540,7 @@ VGO TEL:
2488
 
2489
  # Vivo (vivo.com.cn, vivo.com)
2490
  Vivo:
2491
- regex: '((?:VIV-|BBG-)?(?<!FBCR/)vivo(?!(?:Browser)))|(?:V1730(D[AT]|GA)|V18(18CA|01A0|13B[AT]|18T|09[AT]|1[346][AT]|[13]8[AT]|14A|24[B]?A|2[19][AT]|3[12][AT]|36[AT])|V1731CA|V1732[AT]|V1818CT|V19[01]1[AT]|V1932[AT]|V191[3469][AT]|V192[1348]A|V193[04]A|V194[15]A|V1938CT|V1955A|V1938T|V1730EA|V19[26]2A|V196[35]A|V198[16]A|V1936A[L]?|V19[59]0A|V200[125]A|1819|V201[12]A|V202[0345]C?A|V202[37])(?:[);/ ]|$)'
2492
  device: 'smartphone'
2493
  models:
2494
  - regex: 'V1824[B]?A(?:[);/ ]|$)'
@@ -2517,6 +2569,8 @@ Vivo:
2517
  model: 'iQOO 5'
2518
  - regex: 'V2025A(?:[);/ ]|$)'
2519
  model: 'iQOO 5 Pro'
 
 
2520
  - regex: 'vivo 1805(?:[);/ ]|$)'
2521
  model: 'Nex'
2522
  - regex: 'V1923A(?:[);/ ]|$)'
@@ -2553,6 +2607,8 @@ Vivo:
2553
  model: 'V15 Pro'
2554
  - regex: 'vivo 1909(?:[);/ ]|$)'
2555
  model: 'V17 Pro'
 
 
2556
  - regex: '(?:VIV-|BBG-)?vivo[ _]1601(?:[);/ ]|$)'
2557
  model: 'V5'
2558
  - regex: 'vivo 1609(?:[);/ ]|$)'
@@ -2746,13 +2802,17 @@ BenQ-Siemens:
2746
 
2747
  # BenQ
2748
  BenQ:
2749
- regex: 'BENQ(?:[ \-])?([a-z0-9]+)'
2750
  device: 'feature phone'
2751
- model: '$1'
 
 
 
 
2752
 
2753
  # Blaupunkt
2754
  Blaupunkt:
2755
- regex: 'Blaupunkt|Atlantis[_ ](?:1001A|1010A|A10\.G40[23])|Discovery[_ ](?:A10_302|111C|1000C|1001A?)|Endeavour[_ ](?:785|101[GLM]|1000|1001|101[03]|1100)|Polaris[_ ]803'
2756
  device: 'tablet'
2757
  models:
2758
  - regex: 'Discovery[_ ]111C'
@@ -2771,13 +2831,15 @@ Blaupunkt:
2771
  model: 'Polaris $1'
2772
  - regex: 'Atlantis[_ ](1001A|1010A|A10\.G40[23])'
2773
  model: 'Atlantis $1'
 
 
2774
  - regex: 'Blaupunkt (SL 0[124]|SM 01)'
2775
  device: 'smartphone'
2776
  model: '$1'
2777
 
2778
  # Bmobile
2779
  Bmobile:
2780
- regex: 'Bmobile[_ ]|AX-?([1-9][0-9]{2,3}[eEO+]?|7OO)'
2781
  device: 'smartphone'
2782
  models:
2783
  - regex: 'AX-?([1-9][0-9]{2,3}[eEO+]?)'
@@ -2798,14 +2860,18 @@ bq:
2798
  model: 'Strike LTE'
2799
  - regex: 'BQ(?:ru)?-(?:6035L)(?:[);/ ]|$)'
2800
  model: 'Strike Power Max'
2801
- - regex: 'BQ(?:ru)?-(5535L)(?:[);/ ]|$)'
2802
  model: 'Strike Power Plus'
2803
- - regex: 'BQ(S|ru)?-(5070|6040L)(?:[);/ ]|$)'
2804
  model: 'Magic'
 
 
2805
  - regex: 'BQ(?:S|ru)?-(?:5730L)(?:[);/ ]|$)'
2806
  model: 'Magic C'
2807
  - regex: 'BQ(?:S|ru)?-(?:5731L)(?:[);/ ]|$)'
2808
  model: 'Magic S'
 
 
2809
  - regex: 'BQ-9011[G]?(?:[);/ ]|$)'
2810
  model: 'Vision'
2811
  device: 'tablet'
@@ -2856,7 +2922,7 @@ bq:
2856
  model: 'Aura'
2857
  - regex: 'BQ(ru)?[ -]6015L'
2858
  model: 'Universe'
2859
- - regex: 'BQ-6010G|BQ(?:ru)?-5525'
2860
  model: 'Practic'
2861
  - regex: 'BQ-6001L|BQ-6050'
2862
  model: 'Jumbo'
@@ -2866,7 +2932,7 @@ bq:
2866
  model: 'Spring'
2867
  - regex: 'BQ-5700L(?:[);/ ]|$)'
2868
  model: 'Space X'
2869
- - regex: 'BQ-(?:5591|5518G)(?:[);/ ]|$)'
2870
  model: 'Jeans'
2871
  - regex: 'BQ-5522'
2872
  model: 'Next'
@@ -2902,6 +2968,10 @@ bq:
2902
  model: 'Strike Selfie Max'
2903
  - regex: 'BQ(?:ru)?-5503(?:[);/ ]|$)'
2904
  model: 'Nice 2'
 
 
 
 
2905
  - regex: 'BQS-5502(?:[);/ ]|$)'
2906
  model: 'Hammer'
2907
  - regex: 'BQS-5501(?:[);/ ]|$)'
@@ -2930,6 +3000,8 @@ bq:
2930
  model: 'Space'
2931
  - regex: 'BQ-5082(?:[);/ ]|$)'
2932
  model: 'Sense 2'
 
 
2933
  - regex: 'BQ-5071(?:[);/ ]|$)'
2934
  model: 'Belief'
2935
  - regex: 'BQ[S]?-(?:5065|5340)(?:[);/ ]|$)'
@@ -3191,10 +3263,10 @@ Bush:
3191
  regex: 'Bush[ _-]'
3192
  device: 'smartphone'
3193
  models:
3194
- - regex: 'BUSH ([^;/]+)Tablet Build'
3195
  model: '$1Tablet'
3196
  device: 'tablet'
3197
- - regex: 'BUSH ([^;/]+) Build'
3198
  model: '$1'
3199
 
3200
  # CAGI
@@ -3257,7 +3329,7 @@ Casper:
3257
 
3258
  # Cat (Caterpillar, Catphones)
3259
  Cat:
3260
- regex: 'Cat ?(tablet|stargate|nova)|B15Q|CAT B35'
3261
  device: 'tablet'
3262
  models:
3263
  - regex: 'B15Q'
@@ -3271,6 +3343,10 @@ Cat:
3271
  - regex: 'Cat ?tablet'
3272
  model: 'Nova'
3273
 
 
 
 
 
3274
  # Carrefour
3275
  Carrefour:
3276
  regex: 'CT(?:10[0123]0|7[12]0|820)(?:W|FR)?(?:[);/ ]|$)'
@@ -3285,12 +3361,14 @@ Carrefour:
3285
 
3286
  # Celkon
3287
  Celkon:
3288
- regex: 'Celkon'
3289
  device: 'smartphone'
3290
  models:
3291
  - regex: 'Celkon[ _*](C[78]20)'
3292
  model: '$1'
3293
  device: 'tablet'
 
 
3294
  - regex: 'Celkon[ _*](CT[^;/]+) Build'
3295
  model: '$1'
3296
  device: 'tablet'
@@ -3390,7 +3468,7 @@ Compal:
3390
 
3391
  # Artel
3392
  Artel:
3393
- regex: 'Artel[_ ]'
3394
  device: 'smartphone'
3395
  models:
3396
  - regex: 'Artel[_ ](Quadro(?: Pro)?|Tesla|Air|Tomchi|Premium|U3_4G|Z5|Sentinel (?:X 8G|X D5|X))'
@@ -3401,6 +3479,10 @@ Artel:
3401
  model: '$1'
3402
  device: 'tablet'
3403
 
 
 
 
 
3404
  # ComTrade Tesla
3405
  ComTrade Tesla:
3406
  regex: 'Tesla|Impulse 7.85 3G|Smartphone_6.1|SP(?:6.2|6.2_Lite)|TTL(?:713G|8)'
@@ -3595,7 +3677,7 @@ Condor:
3595
 
3596
  # Coolpad
3597
  Coolpad:
3598
- regex: '(?:YL-)?Coolpad|(?:Cool_9S|8190Q|1831-A0|8676-A01|CP8298_I00|CP3648A|CP8676_I0[23]|REVVLPLUS C3701A|VCR-[AI]0|C106-7|MTS-T0|cp3705A[S]?|ORL-C0)(?:[);/ ]|$)|(8295|5860S) Build'
3599
  device: 'smartphone'
3600
  models:
3601
  - regex: 'VCR-[AI]0'
@@ -3607,18 +3689,24 @@ Coolpad:
3607
  device: 'phablet'
3608
  - regex: '8190Q(?:[);/ ]|$)'
3609
  model: '8190Q'
 
 
3610
  - regex: 'CP3705A[S]?(?:[);/ ]|$)'
3611
  model: 'Legacy'
3612
  - regex: 'CP3648A(?:[);/ ]|$)'
3613
  model: 'Legacy S'
3614
  - regex: 'MTS-T0(?:[);/ ]|$)'
3615
  model: 'N2M'
3616
- - regex: 'C106-7(?:[);/ ]|$)'
3617
  model: 'Cool 1'
 
 
3618
  - regex: 'ORL-C0(?:[);/ ]|$)'
3619
  model: 'Cool 9'
3620
  - regex: 'Cool_9S(?:[);/ ]|$)'
3621
  model: 'Cool 9S'
 
 
3622
  - regex: '(5860S|8295) Build'
3623
  model: '$1'
3624
  - regex: 'CP8676_I02(?:[);/ ]|$)'
@@ -3627,7 +3715,7 @@ Coolpad:
3627
  model: 'Note 3 Plus'
3628
  - regex: 'CP8298_I00(?:[);/ ]|$)'
3629
  model: 'Note 3 Lite'
3630
- - regex: '(8676-A01)(?:[);/ ]|$)'
3631
  model: '$1'
3632
  - regex: '(?:YL-)?Coolpad[ _\-]?([^/;]+) Build'
3633
  model: '$1'
@@ -3674,14 +3762,14 @@ Crosscall:
3674
 
3675
  # AllDocube (https://www.alldocube.com/)
3676
  AllDocube:
3677
- regex: '(?:T1001XS?|iPlay_20|U1006)(?:[);/ ]|$)'
3678
  device: 'tablet'
3679
  models:
3680
  - regex: 'T1001XS(?:[);/ ]|$)'
3681
  model: 'M5XS'
3682
  - regex: 'T1001X(?:[);/ ]|$)'
3683
  model: 'M5X'
3684
- - regex: 'U1006(?:[);/ ]|$)'
3685
  model: 'iPlay 10 Pro 10.1"'
3686
  - regex: 'iPlay_20(?:[);/ ]|$)'
3687
  model: 'iPlay 20'
@@ -3717,7 +3805,7 @@ Cube:
3717
 
3718
  # CUBOT
3719
  CUBOT:
3720
- regex: 'CUBOT|RAINBOW 2|KING_KONG_3|KINGKONG_MINI|KING KONG CS|(?<!QUMO )QUEST(?: LITE)?'
3721
  device: 'smartphone'
3722
  models:
3723
  - regex: 'CHEETAH 2'
@@ -3842,7 +3930,7 @@ Datsun:
3842
 
3843
  # Danew
3844
  Danew:
3845
- regex: 'Dslide ?([^;/]+) Build|Konnect_?(402|504|60[127])'
3846
  device: 'smartphone'
3847
  models:
3848
  - regex: 'Konnect_?(402|504|60[127])'
@@ -3850,6 +3938,9 @@ Danew:
3850
  - regex: 'Dslide ?([^;/]+) Build'
3851
  device: 'tablet'
3852
  model: 'DSlide $1'
 
 
 
3853
 
3854
  # Denver Electronics
3855
  Denver:
@@ -3898,14 +3989,23 @@ Desay:
3898
 
3899
  # DEXP
3900
  DEXP:
3901
- regex: 'DEXP|(?:Ursus|Ixion)[ _]([^;/)]+)|H135[ _]Build|(SENIOR|F4[38]D8000K|VA[12]10|VA170|ML450|MS[56]50|BL[12]50|BS155|BS160|BS[1256]50|AL[12]40|AS260| (?:B450|B340|A1[45]0))(?:[);/ ]|$)'
3902
  device: 'smartphone'
3903
  models:
3904
-
3905
  - regex: 'Ixion[_ ]([^;/]+)(?: Build|\))'
3906
  model: 'Ixion $1'
3907
  - regex: '(ML450|MS[56]50)(?:[);/ ]|$)'
3908
  model: 'Ixion $1'
 
 
 
 
 
 
 
 
 
 
3909
  - regex: 'AS260(?:[);/ ]|$)'
3910
  model: '5.85" AS260'
3911
  device: 'phablet'
@@ -3913,7 +4013,7 @@ DEXP:
3913
  - regex: 'Ursus ([^;/)]+)(?: Build|\))'
3914
  model: 'Ursus $1'
3915
  device: 'tablet'
3916
- - regex: '(VA[21]10|VA170)(?:[);/ ]|$)'
3917
  model: 'Ursus $1'
3918
  device: 'tablet'
3919
 
@@ -3922,10 +4022,14 @@ DEXP:
3922
  - regex: 'SENIOR(?:[);/ ]|$)'
3923
  model: 'Senior'
3924
 
 
 
 
 
3925
  - regex: 'H135[ _]Build'
3926
  model: 'Atlas'
3927
  device: 'desktop'
3928
- - regex: '(BL[12]50|BS155|BS160|BS[1256]50|AL[12]40|A1[45]0)(?:[);/ ]|$)'
3929
  model: '$1'
3930
  - regex: 'DEXP[ _]([^;/]+) Build'
3931
  model: '$1'
@@ -3981,7 +4085,7 @@ Digiland:
3981
 
3982
  # Digma
3983
  Digma:
3984
- regex: 'Digma[_ ]([^;/]+) Build|HIT HT707[10]MG|CITI ATL 4G|CITI Octa 80|CITI 1902 3G|CITI Z530 3G|(CITI[_ ](?:[A-Z0-9]+)[_ ][34]G)[ _][TC][ST](11[459]4MG|1195MG|1196ML|3001ML|500[67]PG|7113PL|7193MG|8209MG|8139ML|8143MG|8152ML|1050PL|8205PG|7203MG)|HIT 4G|HT7074ML|IDX5|(iDx10|iDx7)|MVM900H(?:WZ|C)|MVM908HCZ|(iDxD8 3G|iDxD10 3G|iDrQ10 3G|iDxD[45]|iDxQ5|iD[nx]D7(?:[_ ]3G)?)|PS604M|PT452E|LINX B510 3G LT5037MG|LINX A452 3G LT4030PG|LINX A453 3G LT4038PG|LINX A420 3G LS4019PG|LINX A450 3G LT4028PG|Linx A400 3G LT4001PG|Linx C500 3G LT5001PG|Linx PS474S|LS504[01]PL|LT40(47|54)MG|PS1043MG|LS405[01]MG|LS5053ML|LT5048MG|HT7071MG|LT5052ML|HT5035PG|HT4039PG|LT4049PG|NS6902QL|NS9797MG|TT1004PG|TT7025MG|((?:Optima|Platina|Plane)[ _](?:[EM])?(?:[0-9\.ST]+|Prime)(?:[ _][43]G)?)|(VOX[ _](?:[0-9\.A-Z]+)[_ ][43]G)'
3985
  device: 'smartphone'
3986
  models:
3987
  - regex: 'HIT(?: 3G)? HT707[10]MG'
@@ -4027,10 +4131,18 @@ Digma:
4027
  model: 'CITI ATL 4G'
4028
  - regex: '(CITI Z530 3G)'
4029
  model: '$1'
 
 
4030
 
 
 
 
4031
  - regex: 'PS1043MG'
4032
  model: 'Plane 10.3" 3G'
4033
  device: 'tablet'
 
 
 
4034
  - regex: 'MVM900H(?:WZ|C)'
4035
  model: 'iDx8'
4036
  device: 'tablet'
@@ -4047,13 +4159,10 @@ Digma:
4047
  - regex: 'HIT 4G HT7074ML'
4048
  model: 'HIT 4G'
4049
  device: 'tablet'
4050
- - regex: '(CITI 1902 3G)'
4051
  model: '$1'
4052
  device: 'tablet'
4053
- - regex: '(CITI_8527_4G|CITI Octa 80)'
4054
- model: '$1'
4055
- device: 'tablet'
4056
- - regex: '(CITI[ _](?:[A-Z0-9]+)[ _][34]G)[ _][TC][ST](?:3001ML|500[67]PG|8209MG|11[459]4MG|1195MG|1196ML|3001ML|8152ML|1050PL|7113PL|7193MG|8205PG|7203MG|8143MG)'
4057
  model: '$1'
4058
  device: 'tablet'
4059
  - regex: 'iDxD8 3G'
@@ -4074,6 +4183,15 @@ Digma:
4074
  - regex: 'TT7025MG'
4075
  model: 'Optima 7.5" 3G'
4076
  device: 'tablet'
 
 
 
 
 
 
 
 
 
4077
  - regex: '((?:Optima|Platina|Plane)[ _](?:[EM])?(?:[0-9\.STNM]+|Prime)(?:[ _][43]G)?)'
4078
  model: '$1'
4079
  device: 'tablet'
@@ -4095,7 +4213,7 @@ DoCoMo:
4095
 
4096
  # Doogee
4097
  Doogee:
4098
- regex: 'DOOGEE[ _-]|Valencia2_Y100_?(?:pro|plus)|Y100_Plus|X5max(?:[_ ]PRO)?|(KISSME|BIGBOY|COLLO[23]?|DAGGER|DISCOVERY2?|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|VOYAGER2?|TITANS2?)[ -_](DG[0-9]+C?)(?:[);/ ]|$)|BL[579]000(?:[);/ ]|$)|BL12000|BL5500[_ ]Lite|X9 Mini|LEO_DG280|Y9Plus|Hitman_DG850'
4099
  device: 'smartphone'
4100
  models:
4101
  - regex: '(?:Valencia2_)?Y100_Plus(?:[);/ ]|$)'
@@ -4104,7 +4222,7 @@ Doogee:
4104
  model: 'Valencia2 Y100 Pro'
4105
  - regex: 'LEO_(DG280)'
4106
  model: 'Leo $1'
4107
- - regex: '(BL[579]000)(?:[);/ ]|$)'
4108
  model: '$1'
4109
  - regex: 'BL12000 PRO'
4110
  model: 'BL12000 Pro'
@@ -4112,12 +4230,20 @@ Doogee:
4112
  model: 'BL5500 Lite'
4113
  - regex: 'BL12000'
4114
  model: 'BL12000'
 
 
 
 
4115
  - regex: 'KISSME-DG580'
4116
  model: 'Kissme DG580'
4117
  - regex: 'Hitman_DG850'
4118
  model: 'Hitman DG580'
4119
  - regex: 'X9 Mini'
4120
  model: 'X9 Mini'
 
 
 
 
4121
  - regex: '(X5max(?:[_ ]PRO)?)'
4122
  model: '$1'
4123
  - regex: '(?:DOOGEE[ _-])?(BIGBOY|COLLO[23]?|DAGGER|DISCOVERY2?|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|Valencia2_Y100pro|VOYAGER2?|TITANS2?)[ -_](DG[0-9]+C?)(?:[);/ ]|$)'
@@ -4198,8 +4324,8 @@ Easypix:
4198
  models:
4199
  - regex: '(EasyPhone[^/;]+) Build'
4200
  model: '$1'
4201
- - regex: '(EasyPad[^/;]+) Build'
4202
- model: '$1'
4203
  device: 'tablet'
4204
 
4205
  # Ebest
@@ -4384,13 +4510,13 @@ Riviera:
4384
 
4385
  # Senseit
4386
  Senseit:
4387
- regex: 'SENSEIT[ _]?([^;/)]+)( Build|\))'
4388
- device: 'smartphone'
4389
- model: '$1'
4390
 
4391
  # Sony & Sony Ericsson (combined as they are mixed up)
4392
  Sony:
4393
- regex: 'Sony(?: ?Ericsson)?|SGP|Xperia|(?:[4-9]0[12])SO|C1[569]0[45]|C2[01]0[45]|C230[45]|C530[236]|C550[23]|C6[56]0[236]|C6616|C68(?:0[26]|[34]3)|C69(?:0[236]|16|43)|D200[45]|D21(?:0[45]|14)|D22(?:0[236]|12|43)|D230[2356]|D240[36]|D25(?:02|33)|D510[236]|D530[36]|D5316|D5322|D5503|D58[03]3|D65(?:0[23]|43|63)|D66[03458]3|D66[14]6|D6708|E(?:20[0345]3|2006|210[45]|2115|2124|230[36]|2312|23[356]3|530[36]|53[3456]3|5506|55[356]3|56[46305][36]|58[02]3|65[35]3|66[0358]3|68[358]3)|I[34]312|I4332|F311[12356]|F331[13]|F321[12356]|F5[13]21|F5122|F813[12]|F833[12]|G312[135]|G311[26]|G322[136]|G3212|G331[123]|G3412|G3416|G342[136]|G823[12]|G834[123]|G8[14]4[12]|H(?:3113|3123|3133|3213|3223|3311|3321|4113|4133|4213|4233|4311|4331|4413|4433|82[167]6|83[12]4|8416|9436)|(?:WT|LT|SO|ST|SK|MK)[0-9]+[a-z]+[0-9]*(?: Build|\))|X?L39H|XM50[ht]|W960|portalmmm/2\.0 K|S3[69]h|SOG01|SOL2[246]|SOV3[1-9]|SOV4[0-3]|X10[ia]v?|E1[05][ai]v?|MT[0-9]{2}[a-z]? Build|SO-0(?:[12]C|[345]D|[234]E|[1-5]F|[1-5]G|[1-4]H|[1-4]J|[1-5]K|1M|[1-3]L)|R800[aix]|J3173|J82[17]0|J9110|J92[16]0|J81[17]0|I[34]113|I3[12]23|I42[19]3|H9493|H8296|H8166|H4493|LiveWithWalkman|BRAVIA|SGP771|E3 Dual|A001SO|I4193|E6508|SOT31|SO-[45]1A|XQ-A[DT]51|XQ-AT42|XQ-A[TSU]52|SOL25|SOG02|A002SO|NW-A100Series'
4394
  device: 'smartphone'
4395
  models:
4396
  # SONY ERICSSON: explicit smartphone models
@@ -4546,7 +4672,7 @@ Sony:
4546
  model: 'Xperia 5 Dual'
4547
  - regex: '(?:Sony(?:Ericsson)?)?(?:J82[17]0|SO-01M|SOV41|901SO)'
4548
  model: 'Xperia 5'
4549
- - regex: '(?:Sony(?:Ericsson)?)?(?:SOG02|A002SO|XQ-AS52)'
4550
  model: 'Xperia 5 II'
4551
  - regex: '(?:Sony(?:Ericsson)?)?(?:SOV42|902SO)'
4552
  model: 'Xperia 8'
@@ -4911,6 +5037,13 @@ Ergo:
4911
  - regex: 'ERGO[_ ]Tab[ _]Hero[ _]II'
4912
  model: 'Tab Hero II'
4913
  device: 'tablet'
 
 
 
 
 
 
 
4914
 
4915
  # Ericsson
4916
  Ericsson:
@@ -4994,17 +5127,22 @@ Evolveo:
4994
  regex: 'EVOLVEO'
4995
  device: 'smartphone'
4996
  models:
 
 
 
4997
  - regex: 'Smart TV ([^;/]*) Build'
4998
  device: 'tv'
4999
  model: 'Smart TV $1'
5000
  - regex: 'EVOLVEO StrongPhone G([248])'
5001
  model: 'StrongPhone G$1'
 
 
5002
  - regex: 'EVOLVEO[ _]([^;/]*) Build'
5003
  model: '$1'
5004
 
5005
  # Explay
5006
  Explay:
5007
- regex: 'Explay|ActiveD[ _]|Atlant |Informer[ _][0-9]+|CinemaTV 3G|Surfer[ _][0-9\.]|sQuad[ _][0-9\.]|Onliner[1-3]|RioPlay|Leader|Infinityll|Imperium[78]'
5008
  device: 'tablet'
5009
  models:
5010
  - regex: 'ActiveD[ _]7.4[ _]3G'
@@ -5028,6 +5166,12 @@ Explay:
5028
  - regex: 'Atlant(?:[);/ ]|$)'
5029
  device: 'smartphone'
5030
  model: 'Atlant'
 
 
 
 
 
 
5031
  - regex: 'Explay[ _-]([^;/]+) Build'
5032
  model: '$1'
5033
  - regex: 'Explay[ _-]([^;/]+)(?:[;/)]|$)'
@@ -5040,13 +5184,15 @@ Explay:
5040
 
5041
  # EvroMedia
5042
  EvroMedia:
5043
- regex: 'EVROMEDIA|Playpad[ _]'
5044
  device: 'tablet'
5045
  models:
5046
  - regex: 'Playpad 3G GOO'
5047
  model: 'Play Pad 3G Goo'
5048
  - regex: 'Play Pad PRO'
5049
  model: 'Play Pad Pro'
 
 
5050
  - regex: 'PlayPad 3GTab XL'
5051
  model: 'Play Pad 3G Tab XL'
5052
  # EKO
@@ -5287,17 +5433,21 @@ Gemini:
5287
 
5288
  # General Mobile
5289
  General Mobile:
5290
- regex: 'GM 5 Plus|GM8 go|GM 8 d|GM 8'
5291
  device: 'smartphone'
5292
  models:
5293
  - regex: 'GM 5 Plus'
5294
  model: 'GM 5 Plus'
5295
- - regex: 'GM 8 d'
5296
- model: 'GM 8D'
5297
  - regex: 'GM 8'
5298
  model: 'GM 8'
5299
  - regex: 'GM8 go'
5300
  model: 'GM 8 Go'
 
 
 
 
5301
 
5302
  # Geotel
5303
  Geotel:
@@ -5324,13 +5474,17 @@ Ghia:
5324
 
5325
  # Gigabyte
5326
  Gigabyte:
5327
- regex: 'GSmart[ _][a-z0-9 ]+(?: Build|\))|Gigabyte-[a-z0-9]+'
5328
  device: 'smartphone'
5329
  models:
5330
  - regex: '(GSmart[ _][a-z0-9 ]+)(?: Build|\))'
5331
  model: '$1'
5332
  - regex: 'Gigabyte-([a-z0-9]+)'
5333
  model: '$1'
 
 
 
 
5334
 
5335
  # Gigaset
5336
  Gigaset:
@@ -5359,17 +5513,17 @@ Gigaset:
5359
 
5360
  # Ginzzu
5361
  Ginzzu:
5362
- regex: 'GINZZU[_ ]|((?:RS(?:7[14]|81|9[67])D)|S50[45]0|S5120|RS(6[12]|9[45])D|S40[23]0|RS850[12]|RS9602)(?:[);/ ]|$)'
5363
  device: 'smartphone'
5364
  models:
5365
- - regex: 'GINZZU[_ ]?(S40[17]0|S4710|ST6040|ST6120)'
5366
  model: '$1'
5367
- - regex: 'GINZZU[_ ]?(GT-(?:1050|7105|70[1-4]0|7115|7210|[WX]831|X770|7810|8[01]10))'
5368
  model: '$1'
5369
  device: 'tablet'
5370
  - regex: '(RS6[12]D) ULTIMATE'
5371
  model: '$1 Ultimate'
5372
- - regex: '(?:GINZZU[ _])?((?:RS(?:7[14]|81|9[4-7])D)|S50[45]0|S5120|S40[23]0|RS850[12]|RS9602|RS94D)(?:[);/ ]|$)'
5373
  model: '$1'
5374
 
5375
  # Gionee
@@ -5565,9 +5719,11 @@ Hafury:
5565
 
5566
  # Haier
5567
  Haier:
5568
- regex: 'Haier|I6_Infinity|Titan[ _]T[13]|(?:HW-)?W(?:716|757|860|970)(?:[);/ ]|$)|S5 Silk|(?:HM-)?(N505|N700|G(?:152|303|353|552|70[01])?-FL|HM-N501-FL|G(?:303)?-W|I(?:557)?-FL)|(?:PAD[ _](D71|G781|d85))'
5569
  device: 'smartphone'
5570
  models:
 
 
5571
  - regex: 'HM-N505-FL'
5572
  model: 'I8'
5573
  - regex: 'S5 Silk'
@@ -5578,7 +5734,7 @@ Haier:
5578
  model: 'L56'
5579
  - regex: '(?:HM-)?(G(?:152|353|552|70[01])|G(?:303)|I(?:557))'
5580
  model: '$1'
5581
- - regex: '(Titan[_ ]T[13]|I6_Infinity)'
5582
  model: '$1'
5583
  - regex: '(?:HW-)?W(716|757|860|970)(?:[);/ ]|$)'
5584
  model: 'W$1'
@@ -5773,7 +5929,7 @@ Minix:
5773
 
5774
  # Huawei
5775
  Huawei:
5776
- regex: '(HW-)?(?:Huawei|MediaPad T1|Ideos|Honor[ _]?|(?:(?:AGS|AGS2|ALE|ALP|AMN|ANE|ARE|ARS|ASK|ATH|ATU|AUM|BAC|BAH[23]?|BG2|BGO|B[ZK]K|BKL|BL[ALN]|BND|BTV|CA[GMNZ]|CH[CM]|CHE[12]?|CLT|CMR|COL|COR|CPN|CRO|CRR|CUN|DIG|DLI|DRA|DUA|DUB|DUK|EDI|ELE|EML|EVA|EVR|FDR|FIG|FLA|FRD|GEM|GRA|HDN|HLK|HMA|Hol|HRY|HWI|H[36]0|INE|JAT|JDN|JDN2|JKM|JMM|JSN|KII|KIW|KNT|KOB|KSA|LDN|LEO|LIO|LLD|LND|LON|LRA|LUA|LY[AO]|MAR|MHA|MRD|MYA|NCE|NEM|NEO|NXT|PAR|PCT|PIC|PLE|PLK|POT|PRA|RIO|RNE|RVL|SCC|SCL|SCM|SEA|SHT|SLA|SNE|SPN|STF|STK|TAG|TIT|TNY|TRT|VCE|VEN|VIE|VKY|VNS|VOG|VRD|VTR|WAS|YAL|G(?:527|620S|621|630|735)|Y(?:221|330|550|6[23]5))-(?:[A-Z]{0,2}[0-9]{1,4}[A-Z]{0,3}?)|H1711|U(?:8230|8500|8661|8665|8667|8800|8818|8860|9200|9508))(?:[);/ ]|$))|hi6210sft|PE-(UL00|TL[12]0|TL00M)|T1-(A21[Lw]|A23L|701u|823L)|G7-(?:L01|TL00)|HW-01K|JNY-(LX[12]|AL10)|OXF-AN[01]0|TAS-(A[LN]00|L29|TL00)|WLZ-(AL10|AN00)|NIC-LX1A|MRX-(AL09|W09)|CDY-(?:[AT]N00|AN90|NX9A)|GLK-[AT]L00|JER-[AT]N10|ELS-(?:[AT]N[10]0|NX9|N39|N04)|AKA-(AL10|L29)|MON-(W|AL)19|BMH-AN[12]0|AQM-([AT]L[01]0|LX1)|MOA-(AL00|LX9N)|NTS-AL00|ART-(?:[AT]L00[xm]|L29N?)|JEF-(?:[AT]N00|AN20)|MED-(?:[AT]L00|LX9N?)|EBG-AN[01]0|ANA-(?:[AT]N00|NX9)|BZ[AK]-W00|BZT-(W09|AL[01]0)|HDL-(AL09|W09)|HWV3[123]|HW-02L|TEL-[AT]N(?:00a?|10)|KKG-AN00|MXW-AN00|JKM-AL00[ab]|TAH-(?:N29|AN00)m|C8817D|T1-821W|d-01J|d-02[HK]|HWT31|Y320-U10|Y541-U02|VAT-L19|70[14]HW|60[58]HW|TNNH-AN00|LIO-(?:[TA]L00|[LN]29|AN00)|KOB2-[LW]09|PPA-LX2|AGS3-L09'
5777
  device: 'smartphone'
5778
  models:
5779
  - regex: 'POT-[TA]L00a(?:[);/ ]|$)'
@@ -6036,6 +6192,8 @@ Huawei:
6036
  model: 'Honor X10'
6037
  - regex: 'KKG-AN00(?:[);/ ]|$)'
6038
  model: 'Honor X10 Max'
 
 
6039
  - regex: 'U8500(?:[);/ ]|$)'
6040
  model: 'Ideos X2'
6041
  - regex: 'U8510(?:[);/ ]|$)'
@@ -6146,6 +6304,8 @@ Huawei:
6146
  model: 'P smart'
6147
  - regex: 'POT-(?:LX(?:[13]|1T|2J|1AF)|AL00)(?:[);/ ]|$)'
6148
  model: 'P smart (2019)'
 
 
6149
  - regex: 'PPA-LX2(?:[);/ ]|$)'
6150
  model: 'P smart (2021)'
6151
  - regex: 'STK-LX1(?:[);/ ]|$)'
@@ -6168,7 +6328,7 @@ Huawei:
6168
  model: 'P30'
6169
  - regex: '(?:MAR-(?:LX(?:1[BM]|2J?|3BM)|TL00)|NIC-LX1A|HWV33)(?:[);/ ]|$)'
6170
  model: 'P30 Lite'
6171
- - regex: 'MAR-LX[13]A(?:[);/ ]|$)'
6172
  model: 'P30 Lite Dual SIM'
6173
  - regex: '(?:VOG-(?:L(?:04|09|29)|TL00|AL10)|HW-02L)(?:[);/ ]|$)'
6174
  model: 'P30 Pro'
@@ -6178,7 +6338,7 @@ Huawei:
6178
  model: 'P40 Lite E'
6179
  - regex: 'ART-L29N(?:[);/ ]|$)'
6180
  model: 'P40 Lite E NFC'
6181
- - regex: 'ELS-(?:[AT]N00|NX9|N04)(?:[);/ ]|$)'
6182
  model: 'P40 Pro'
6183
  - regex: 'ELS-(?:AN10|N39)(?:[);/ ]|$)'
6184
  model: 'P40 Pro Plus'
@@ -6218,6 +6378,8 @@ Huawei:
6218
  model: 'Y5 (2019)'
6219
  - regex: 'DRA-LX5(?:[);/ ]|$)'
6220
  model: 'Y5 lite'
 
 
6221
  - regex: 'CRO-L[02]3(?:[);/ ]|$)'
6222
  model: 'Y5 Lite (2017)'
6223
  - regex: 'CAG-L[02]3(?:[);/ ]|$)'
@@ -6470,11 +6632,13 @@ Hyundai:
6470
 
6471
  # iBall
6472
  iBall:
6473
- regex: 'iBall[ _]([^;/)]+)[ _]Build|(Snap_4G2)(?:[);/ ]|$)'
6474
  device: 'tablet'
6475
  models:
6476
  - regex: '(Snap_4G2)(?:[);/ ]|$)'
6477
  model: '$1'
 
 
6478
  - regex: 'iBall[ _]([^;/)]+)[ _]Build'
6479
  model: '$1'
6480
 
@@ -6492,13 +6656,18 @@ iRola:
6492
 
6493
  # iRulu
6494
  iRulu:
6495
- regex: 'iRULU[ _](X11|V[34])(?:[);/ ]|$)'
6496
  device: 'tablet'
6497
- model: '$1'
 
 
 
 
 
6498
 
6499
  # Irbis
6500
  Irbis:
6501
- regex: 'IRBIS|TZ(1(?:0[04]|42|50|84|65|7[01345-89]|8[356]|9[12578])|49|7(?:1[2467]|2[01567]|37|4[257]|5[23457]|6[12]|72|7[17]|8[1]|9[47])|8(?:[34]1|5[3-8]|6[45]|7[2478]|8[1-5]|9[0127])|96[0-9])|TZ85|TZ13|TZ(?:one|art|HIT|81L)|(SP(?:0[56]|2[01]|4[1-36]|40[12]|45[345]|49[34]|50|51[0147]|531|54[12]|55[0124]|571))(?:[);/ ]|$)'
6502
  device: 'tablet'
6503
  models:
6504
  - regex: '(TZ(?:[0-9]+)|TZ(?:one|art|HIT|81L))(?:[);/ ]|$)'
@@ -6545,7 +6714,7 @@ iHunt:
6545
 
6546
  # IconBIT
6547
  IconBIT:
6548
- regex: 'IconBIT|NT-(3506M|0704S|0909T|1009T|10[01]1T|1017T|3601P/3602P|3603P|3702S|3805C|3905T|3701S|0701S|0805C|0902S|370[23]M)|XDS[789]4K'
6549
  device: 'tablet'
6550
  models:
6551
  - regex: 'NT-3506M'
@@ -6584,7 +6753,7 @@ IconBIT:
6584
  - regex: 'NT-3703M'
6585
  model: 'NetTAB Matrix 3GT'
6586
 
6587
- - regex: '(?:iconBIT )?(Movie Ultra HD 4K|XDS[789]4K)'
6588
  model: '$1'
6589
  device: 'tv'
6590
 
@@ -7128,7 +7297,7 @@ Impression:
7128
 
7129
  #iLife or i-life (lifedigital.com)
7130
  iLife:
7131
- regex: '(ITELL_K3500N)(?:[);/ ]|$)'
7132
  device: 'tablet'
7133
  model: '$1'
7134
 
@@ -7170,15 +7339,15 @@ JAY-Tech:
7170
 
7171
  # Jiayu
7172
  Jiayu:
7173
- regex: 'JIAYU[ _-]|(?:JY-G4[\\_]G5|(?:JY-[a-z0-9]+))(?:[);/ ]|$)'
7174
  device: 'smartphone'
7175
  models:
7176
  - regex: '(?:JIAYU G4_G5|JY-G4[\\_]G5)(?:[);/ ]|$)'
7177
  model: 'G4/G5'
7178
  - regex: 'JIAYU[ _-](G4[S]?|G2F|G3[S]?|S[23])(?:[);/ ]|$)'
7179
  model: '$1'
7180
- - regex: '(JY-[a-z0-9]+)(?:[);/ ]|$)'
7181
- model: '$1'
7182
 
7183
  # Jolla
7184
  Jolla:
@@ -7224,13 +7393,15 @@ Kaan:
7224
 
7225
  # Kazam
7226
  Kazam:
7227
- regex: 'Kazam|Trooper_X[0-9][0-9](?:[);/ ]|$)|Tornado 348'
7228
  device: 'smartphone'
7229
  models:
7230
  - regex: 'Tornado 348'
7231
  model: 'Tornado 348'
7232
  - regex: 'Thunder 450W'
7233
  model: 'Thunder 450W'
 
 
7234
  - regex: 'Trooper_X([0-9])([0-9])(?:[);/ ]|$)'
7235
  model: 'Trooper X$1.$2'
7236
  - regex: 'Kazam[; _]([^;/)]+)(?: Build|\))'
@@ -7447,7 +7618,7 @@ K-Touch:
7447
 
7448
  # kyocera (kyocera.co.jp, kyocera.com)
7449
  Kyocera:
7450
- regex: 'Kyocera|KWC-|QC-|(?:NP501KC|503KC|602KC|705KC|C51[27]0|C5155|C5215|C67[35]0|C6522N?|C6530N|C6740N?|C6743|E6[89]10|KYL2[13]|KYV3[13-9]|KYT3[123]|KYF3[123579]|KYY2[1-4]|S2151|KC-S701|S4-KC|KYV40U?|KYV4[1-8]|KYV4[47][-_]u|KC-S301AE|X3-KC|S6-KC|E6560[CT]|E6782[L]?|E6790(?:TM)?|704KC|A001KC)(?:[);/ ]|$)'
7451
  device: 'smartphone'
7452
  models:
7453
  # explicit smartphone models
@@ -7465,6 +7636,8 @@ Kyocera:
7465
  model: 'Digno E'
7466
  - regex: '704KC(?:[);/ ]|$)'
7467
  model: 'Digno J'
 
 
7468
  - regex: 'NP501KC(?:[);/ ]|$)'
7469
  model: 'Digno'
7470
  - regex: 'KYV36(?:[);/ ]|$)'
@@ -7581,7 +7754,7 @@ Kyocera:
7581
 
7582
  # Krüger&Matz (Kruger&Matz)
7583
  Krüger&Matz:
7584
- regex: 'Kruger[ _&]Matz|KrugerMatz[ _]|MOVE_|LIVE4_KM043[89]|KM(?:106[67]|1065G|0701_1|0702|0805_1)'
7585
  device: 'smartphone'
7586
  models:
7587
  - regex: 'MOVE_6_mini'
@@ -7590,11 +7763,11 @@ Krüger&Matz:
7590
  model: 'MOVE $1'
7591
  - regex: 'DRIVE 4 mini LTE'
7592
  model: 'DRIVE 4 mini LTE'
7593
- - regex: 'DRIVE (4[S]?)(?:[);/ ]|$)'
7594
  model: 'DRIVE $1'
7595
- - regex: 'Drive 5(?:[);/ ]|$)'
7596
- model: 'DRIVE 5'
7597
- - regex: 'FLOW (4[S]?)(?:[);/ ]|$)'
7598
  model: 'FLOW $1'
7599
  - regex: 'LIVE4_(KM043[89])(?:[);/ ]|$)'
7600
  model: 'LIVE 4 $1'
@@ -7602,6 +7775,10 @@ Krüger&Matz:
7602
  model: 'LIVE 4'
7603
  - regex: '_LIVE5_(KM0450)(?:[);/ ]|$)'
7604
  model: 'LIVE 5 $1'
 
 
 
 
7605
 
7606
  - regex: 'KM(106[67])(?:[);/ ]|$)'
7607
  device: 'tablet'
@@ -7637,9 +7814,9 @@ AIS:
7637
  - regex: 'Kingcomm C500'
7638
  model: 'Super Smart Plus X3'
7639
 
7640
- # Lava
7641
  Lava:
7642
- regex: 'Lava[ _]|iris[ _]?([^/;]+)(?:\)| Build)|A(?:67|76) Build|X1 Selfie Build|X41 Plus Build|(?:Flair Z1|PixelV1|Z61_2GB|A97 IPS)(?:[);/ ]|$)'
7643
  device: 'smartphone'
7644
  models:
7645
  - regex: 'Flair Z1(?:[);/ ]|$)'
@@ -7656,12 +7833,23 @@ Lava:
7656
  model: 'Iris X1 Selfie'
7657
  - regex: 'X41 Plus Build'
7658
  model: 'X41 Plus'
7659
- - regex: 'LAVA_A3'
7660
- model: 'A3'
7661
  - regex: 'LAVA_R1'
7662
  model: 'R1'
7663
  - regex: 'Z61_2GB(?:[);/ ]|$)'
7664
  model: 'Z61'
 
 
 
 
 
 
 
 
 
 
 
7665
  - regex: 'iris[ _]?([^/;]+)(?:\)| Build)'
7666
  model: 'Iris $1'
7667
  - regex: 'Lava[ _]?([^/;]+)(?:/| Build)'
@@ -7766,7 +7954,7 @@ LCT:
7766
 
7767
  # Leagoo
7768
  Leagoo:
7769
- regex: 'LEAGOO[ _-]?|(?:M5 EDGE|KIICAA (POWER|MIX)|Leapad[ _]7s|Elite 1|Venture 1)(?:[);/ ]|$)'
7770
  device: 'smartphone'
7771
  models:
7772
  - regex: 'LEAGOO[- _]M8[_-]?Pro(?:[);/ ]|$)'
@@ -7785,6 +7973,8 @@ Leagoo:
7785
  model: 'Elite 1'
7786
  - regex: 'Venture 1(?:[);/ ]|$)'
7787
  model: 'Venture 1'
 
 
7788
 
7789
  - regex: '(Leapad[ _]7s)'
7790
  model: '$1'
@@ -7802,7 +7992,7 @@ Ledstar:
7802
 
7803
  # LeEco
7804
  LeEco:
7805
- regex: 'Letv|LeEco|X[89]00\+(?:[);/ ]|$)|Le ?X[0-9][^;/]+|Le Max|Le [12]|Le2[_ ]x527|X900 Build'
7806
  device: 'smartphone'
7807
  models:
7808
  - regex: 'X800\+'
@@ -7815,7 +8005,7 @@ LeEco:
7815
  model: '$1'
7816
  - regex: 'X900 Build'
7817
  model: 'Le X900'
7818
- - regex: '(?:Le ?X526|Le2[_ ]x527|Le 2)(?:[);/ ]|$)'
7819
  model: 'Le 2'
7820
  - regex: 'Le ?X([^;/]+) Build'
7821
  model: 'Le X$1'
@@ -7847,13 +8037,13 @@ Leotec:
7847
 
7848
  # Lephone
7849
  Lephone:
7850
- regex: 'lephone[ _]'
7851
  device: 'smartphone'
7852
  models:
7853
  - regex: 'lephone[ _](K7|K10)'
7854
  device: 'feature phone'
7855
  model: '$1'
7856
- - regex: 'lephone[ _](W(1[0125]|[279])|T2)(?:[);/ ]|$)'
7857
  model: '$1'
7858
  - regex: 'lephone_W7_plus'
7859
  model: 'W7 Plus'
@@ -7866,7 +8056,7 @@ Lenco:
7866
 
7867
  # lenovo
7868
  Lenovo:
7869
- regex: '(?:LNV-)?Lenovo|IdeaTab|IdeaPad|Thinkpad|Yoga Tablet|Tab2A[0-9]-[0-9]{2}[a-z]?|ZUK[ -_]|(?:TB2-X30L|TB3-710I|YT3-X50[ML]|K50a40|TB-(?:8504F|X304F|X704V|X704A)|A2107A-H|S6000|Z2 Plus|VIBE Z2|Vibe K5(?: Plus)?|P2A42|L18011|[5-8]01LV|Z2131|K350t|VIBE X2|K31-t3|TAB 2 A8-50LC)(?:[);/ ]|$)'
7870
  device: 'smartphone'
7871
  models:
7872
  - regex: 'Lenovo ?G780'
@@ -7878,7 +8068,7 @@ Lenovo:
7878
  - regex: 'Lenovo ?A3500-(H|HV|F)'
7879
  model: 'IdeaTab A7-50'
7880
  device: 'tablet'
7881
- - regex: 'Lenovo ?A5500-[HF]'
7882
  model: 'IdeaTab A8-50'
7883
  device: 'tablet'
7884
  - regex: 'Lenovo ?A7600-[HF]'
@@ -7917,6 +8107,9 @@ Lenovo:
7917
  - regex: '801LV(?:[);/ ]|$)'
7918
  model: 'TAB5 10.1"'
7919
  device: 'tablet'
 
 
 
7920
  - regex: 'TB-X704A(?:[);/ ]|$)'
7921
  model: 'Moto Tab'
7922
  device: 'tablet'
@@ -8026,6 +8219,8 @@ Lenovo:
8026
  model: 'Vibe K5'
8027
  - regex: 'VIBE Z2(?:[);/ ]|$)'
8028
  model: 'Vibe Z2'
 
 
8029
  - regex: 'VIBE X2(?:[);/ ]|$)'
8030
  model: 'Vibe X2'
8031
  - regex: 'k33a48(?:[);/ ]|$)'
@@ -8038,7 +8233,7 @@ Lenovo:
8038
  model: 'K6 Power'
8039
  - regex: 'P1ma40(?:[);/ ]|$)'
8040
  model: 'Vibe P1m'
8041
- - regex: 'P1(?:a42|c72)(?:[);/ ]|$)'
8042
  model: 'Vibe P1'
8043
  - regex: 'A2016a40(?:[);/ ]|$)'
8044
  model: 'Vibe B'
@@ -8152,7 +8347,7 @@ Lexibook:
8152
 
8153
  # LG
8154
  LG:
8155
- regex: 'LG|portalmmm/2\.0 (?:KE|KG|KP|L3)|(?:VX[0-9]+|L-0[12]D|L-07C|P713|(LM-[A-Z][0-9]{3}[A-Z]{0,3}(?:\(FGN?\)|\(G\)|\.FN|\.F(?:GN?)?)?)|LM-(X625N1|G820QM[0127]))(?:[);/ ]|$)|NetCast|RS98[78]|RS500|VS(?:50[01]|835|876|880|98[0578]|99[056]|(410|415|425|500|880)PP)|VS820|VS870 4G|Nexsus 5|LML(41[34]D|211B|713D|212V)L|VK810 4G|VK815|X5-LG|L-05D|L-03K|L-01[LJK]|L-[45]1A|901LG|A001LG|802LG|402LG|LGT32|L-02K|L-01F'
8156
  device: 'smartphone'
8157
  models:
8158
  - regex: 'LG-D325'
@@ -8305,7 +8500,7 @@ LG:
8305
  model: 'Aristo 2'
8306
  - regex: 'LM-X220'
8307
  model: 'Aristo 3'
8308
- - regex: 'LM-V40(5|9N)'
8309
  model: 'V40 ThinQ'
8310
  - regex: 'LM-V500N'
8311
  model: 'V50'
@@ -8574,9 +8769,9 @@ Konrow:
8574
  - regex: 'Link5(?:[);/ ]|$)'
8575
  model: 'Link 5'
8576
 
8577
- # Karbonn
8578
  Karbonn:
8579
- regex: '(?:Browser-)?Karbonn|K9 Kavach 4G|K9 Music 4G|K9 Smart|K9 VIRAAT 4G|Aura Sleek Plus|Aura Note Play|Titanium (?:Vista 4G|Jumbo)'
8580
  device: 'smartphone'
8581
  models:
8582
  - regex: 'K9 Kavach 4G'
@@ -8601,14 +8796,20 @@ Karbonn:
8601
  model: 'K9 Viraat 4G'
8602
  - regex: 'Titanium[ _]S2[ _]Plus'
8603
  model: 'Titanium S2 Plus'
8604
- - regex: 'Titanium_S99'
8605
- model: 'Titanium S99'
8606
  - regex: 'Titanium Vista 4G'
8607
  model: 'Titanium Vista 4G'
8608
  - regex: 'Titanium Jumbo 2'
8609
  model: 'Titanium Jumbo 2'
8610
  - regex: 'Titanium Jumbo'
8611
  model: 'Titanium Jumbo'
 
 
 
 
 
 
8612
  - regex: 'Karbonn ([a-z0-9]+) WAP-Browser'
8613
  model: '$1'
8614
  device: 'feature phone'
@@ -8663,34 +8864,36 @@ Majestic:
8663
  regex: 'MAJESTIC[ _-]|CRONO ?[0-9]+|TAB (?:647|411) 3G|URANO 77LTE'
8664
  device: 'smartphone'
8665
  models:
8666
- - regex: 'URANO 77LTE(?:[);/ ]|$)'
8667
- model: 'Urano 77 LTE'
8668
- - regex: 'TAB (647|411) 3G'
8669
- model: 'Tab $1 3G'
8670
- device: 'tablet'
8671
- - regex: 'MAJESTIC[ _]Tab([^;/]+)Build'
8672
- model: 'Tab$1'
8673
- device: 'tablet'
8674
- - regex: 'MAJESTIC[ _]Tab([^);/]+)(?:[);/]|$)'
8675
- model: 'Tab$1'
8676
- device: 'tablet'
8677
- - regex: 'MAJESTIC[ _]([^;/]+)Build'
8678
- model: '$1'
8679
- - regex: 'MAJESTIC[ _]([^);/]+)(?:(?:[);/ ]|$)|$)'
8680
- model: '$1'
8681
- - regex: 'CRONO ?([0-9]+) Build'
8682
- model: 'Crono $1'
8683
- - regex: 'CRONO ?([0-9]+)(?:[);/]|$)'
8684
- model: 'Crono $1'
8685
 
8686
  # Manta Multimedia
8687
  Manta Multimedia:
8688
- regex: 'MSP950(1[45]|2[01])|MSP96017|((?<!/)MID713|MID(?:06[SN]|08[S]?|12|13|14|15|701|702|703|704|705(?:DC)?|706[AS]?|707|708|709|711|712|714|717|781|801|802|901|1001|1002|1003|1004(?: 3G)?|1005|1009|1010|7802|9701|9702))(?:[);/ ]|$)'
8689
  device: 'smartphone'
8690
  models:
8691
  - regex: '((?<!/)MID713|MID(?:06[SN]|08[S]?|12|13|14|15|701|702|703|704|705(?:DC)?|706[AS]?|707|708|709|711|712|714|717|781|801|802|901|1001|1002|1003|1004(?: 3G)?|1005|1009|1010|7802|9701|9702))(?:[);/ ]|$)'
8692
  device: 'tablet'
8693
  model: '$1'
 
 
8694
  - regex: 'MSP95014'
8695
  model: 'Titano 3'
8696
  - regex: 'MSP95015'
@@ -8843,10 +9046,10 @@ Mediacom:
8843
  - regex: 'M[_-]PP[Ax]X(470|510|520)U(?:[);/ ]|$)'
8844
  model: 'PhonePad Duo X$1U'
8845
  device: 'smartphone'
8846
- - regex: 'M-PPxG(400|501)(?:[);/ ]|$)'
8847
  model: 'PhonePad Duo G$1'
8848
  device: 'smartphone'
8849
- - regex: 'M-PPxS(470|501)(?:[);/ ]|$)'
8850
  model: 'PhonePad Duo S$1'
8851
  device: 'smartphone'
8852
 
@@ -8999,13 +9202,15 @@ Meitu:
8999
 
9000
  # Memup
9001
  Memup:
9002
- regex: 'SlidePad ?([^;/]*) Build|SPNG?[0-9]{2,4}[a-z]{0,2}(?:[);/ ]|$)|SP704CE?'
9003
  device: 'tablet'
9004
  models:
9005
  - regex: 'SlidePad ?([^;/]*) Build'
9006
  model: 'SlidePad $1'
9007
  - regex: 'SPNG([0-9]{2,4}[a-z]{0,2})(?:[);/ ]|$)'
9008
  model: 'SlidePad NG$1'
 
 
9009
  - regex: 'SP704(CE?)'
9010
  model: 'SlidePad 704$1'
9011
 
@@ -9027,13 +9232,16 @@ Mecer:
9027
 
9028
  # mio
9029
  Mio:
9030
- regex: 'MIO(?:/)?([a-z0-9]+)|MOBIX M6(?:[);/ ]|$)'
9031
  device: 'smartphone'
9032
  models:
9033
  - regex: 'MOBIX M6(?:[);/ ]|$)'
9034
  model: 'Mobix M6'
9035
  - regex: 'MIO(?:/)?([a-z0-9]+)'
9036
  model: '$1'
 
 
 
9037
 
9038
  # Miray
9039
  Miray:
@@ -9106,11 +9314,13 @@ Mobiola:
9106
 
9107
  # Mobicel
9108
  Mobicel:
9109
- regex: 'Mobicel_(R1)|Matrix'
9110
  device: 'smartphone'
9111
  models:
9112
  - regex: 'Matrix'
9113
  model: 'Matrix'
 
 
9114
  - regex: 'Mobicel_(R1)'
9115
  model: '$1'
9116
 
@@ -9467,20 +9677,29 @@ MyTab:
9467
  - regex: 'MyTAB-U55GT(?:[);/ ]|$)'
9468
  model: 'U55GT'
9469
 
9470
- # myphone
9471
  MyPhone:
9472
- regex: '(?:MyPhone|MyPad|MyTab)[ _][^;/)]+( Build|\))|Cube_LTE|myTab10II|HAMMER[ _](Blade2_PRO|ENERGY|Titan 2|AXE[_ ](?:M[_ ]LTE|Pro)|Iron 2|Active[2]?(_LTE)?)|C-Smart_pix|myPhone_Fun_8|myA17'
9473
  device: 'smartphone'
9474
  models:
 
9475
  - regex: 'MyPad[ _]([^;/]+) Build'
9476
  model: 'MyPad $1'
9477
  device: 'tablet'
9478
  - regex: 'MyTab[ _]([^;/]+) Build'
9479
  model: 'MyTab $1'
9480
  device: 'tablet'
 
 
 
9481
  - regex: 'myTab10II'
9482
  model: 'MyTab 10 II'
9483
  device: 'tablet'
 
 
 
 
 
9484
  - regex: 'Cube_LTE'
9485
  model: 'Cube LTE'
9486
  - regex: 'HAMMER[ _]ENERGY'
@@ -9489,8 +9708,10 @@ MyPhone:
9489
  model: 'Hammer Axe M LTE'
9490
  - regex: 'Hammer Titan 2'
9491
  model: 'Hammer Titan 2'
9492
- - regex: 'Hammer Iron 2'
9493
- model: 'Hammer Iron 2'
 
 
9494
  - regex: 'Hammer Active(?:[);/ ]|$)'
9495
  model: 'Hammer Active'
9496
  - regex: 'Hammer_Active2(?:[);/ ]|$)'
@@ -9503,10 +9724,22 @@ MyPhone:
9503
  model: 'Hammer Blade 2 Pro'
9504
  - regex: 'C-Smart_pix'
9505
  model: 'C-Smart Pix'
 
 
9506
  - regex: 'myA17(?:[);/ ]|$)'
9507
  model: 'myA17'
9508
  - regex: 'myPhone_Fun_8'
9509
  model: 'FUN 8'
 
 
 
 
 
 
 
 
 
 
9510
  - regex: 'MyPhone[ _]([^;/)]+)( Build|\))'
9511
  model: '$1'
9512
 
@@ -9552,7 +9785,7 @@ M.T.T.:
9552
 
9553
  # Navon
9554
  Navon:
9555
- regex: '(?:Superme_Max|Supreme[_ ](?:Fine|Chief|Pure|Pro)(?:[_ ](?:Mini|Plus))?|Navon[_ ]Infinity)(?:[);/ ]|$)'
9556
  device: 'smartphone'
9557
  models:
9558
  - regex: 'Superme_Max(?:[);/ ]|$)'
@@ -9573,16 +9806,20 @@ Navon:
9573
  model: 'Supreme Pro'
9574
  - regex: 'Navon[_ ]Infinity(?:[);/ ]|$)'
9575
  model: 'Infinity'
 
 
9576
 
9577
  # NOA
9578
  NOA:
9579
- regex: 'NOA[ _]|HummerLE|NextSE'
9580
  device: 'smartphone'
9581
  models:
9582
  - regex: 'NOA[_ ]CORE[_ ]FORTE'
9583
  model: 'Core Forte'
9584
  - regex: 'HummerLE'
9585
  model: 'Hummer LE'
 
 
9586
  - regex: 'NOA[_ ]Hummer[_ ]Lite'
9587
  model: 'Hummer Lite'
9588
  - regex: 'NOA[_ ]MOVEse'
@@ -9615,11 +9852,13 @@ Nobby:
9615
 
9616
  # nec
9617
  NEC:
9618
- regex: 'NEC[ _\-]|KGT/2\.0|PC-TE508HAW|portalmmm/1\.0 (?:DB|N)|(?:portalmmm|o2imode)/2.0[ ,]N|N-06C(?:[);/ ]|$)'
9619
  device: 'smartphone'
9620
  models:
9621
  - regex: 'N-06C(?:[);/ ]|$)'
9622
  model: 'Medias Amadana'
 
 
9623
  - regex: '(?:NEC[ _\-]|KGT/2\.0 )([a-z0-9]+)'
9624
  model: '$1'
9625
  - regex: 'portalmmm/1\.0 ((?:DB|N)[a-z0-9]+)'
@@ -9663,8 +9902,8 @@ Netgear:
9663
  regex: 'GTV100'
9664
  device: 'tv'
9665
  models:
9666
- - regex: 'GTV100'
9667
- model: 'NeoTV Prime'
9668
 
9669
  # NeuImage
9670
  NeuImage:
@@ -9676,13 +9915,19 @@ NeuImage:
9676
 
9677
  # NextBook
9678
  NextBook:
9679
- regex: 'Next[0-9]|NX785QC8G|NXM900MC|NX008HD8G|NX010HI8G|NXM908HC|NXM726|NXA8QC116'
9680
  device: 'tablet'
9681
  models:
9682
  - regex: 'NX008HD8G'
9683
  model: 'Premium 8 HD'
9684
  - regex: 'NXA8QC116'
9685
  model: 'Ares 8'
 
 
 
 
 
 
9686
  - regex: 'NXM908HC'
9687
  model: 'Premium 9'
9688
  - regex: 'NX010HI8G'
@@ -9743,21 +9988,27 @@ Noblex:
9743
 
9744
  # Nomu
9745
  Nomu:
9746
- regex: 'Nomu[ _-](?:T18|S30mini)(?:[);/ ]|$)'
9747
  device: 'smartphone'
9748
  models:
9749
  - regex: 'Nomu[ _-]T18(?:[);/ ]|$)'
9750
  model: 'T18'
 
 
9751
  - regex: 'Nomu[ _-]S30mini(?:[);/ ]|$)'
9752
  model: 'S30 Mini'
 
 
9753
 
9754
  # Nomi
9755
  Nomi:
9756
- regex: 'Nomi[ _-]|(C101010 Ultra2|i501[234]|i5032|i5050|i5510|i5532|C0(700(?:[02358]|2HD)|7850)|C1010[0-3])(?:[);/ ]|$)'
9757
  device: 'smartphone'
9758
  models:
9759
  - regex: 'i501[23](?:[);/ ]|$)'
9760
  model: 'Evo M2'
 
 
9761
  - regex: 'i5014(?:[);/ ]|$)'
9762
  model: 'Evo M4'
9763
  - regex: 'i5032(?:[);/ ]|$)'
@@ -9894,7 +10145,7 @@ O2:
9894
 
9895
  # Odys
9896
  Odys:
9897
- regex: 'ODYS[ _-]|IEOS[_ ]([^/;]+)|NOON(?:_PRO)? Build|SPACE10_(?:PLUS|PRO)_3G|THOR_?10|TAO_X10|RAPID_?(?:10|7)_?LTE|MAVEN_?10_|CONNECT[78]|ELEMENT10_PLUS_3G|XELIO[_0-9P]|ADM816HC|ADM8000KP|NEO6_LTE|EOS10|AEON|FALCON_10_PLUS_3G|FUSION|THANOS_10|MAVEN_X10_HD(?:_LTE)?|JUNIOR_8_PRO'
9898
  device: 'tablet'
9899
  models:
9900
  - regex: 'XELIO[_ ]A10'
@@ -9911,6 +10162,10 @@ Odys:
9911
  model: 'Xelio 10 Xtreme'
9912
  - regex: 'XELIO10_PLUS_3G'
9913
  model: 'Xelio 10 Plus 3G'
 
 
 
 
9914
  - regex: 'ELEMENT10_PLUS_3G'
9915
  model: 'Element 10 Plus 3G'
9916
  - regex: 'CONNECT8PLUS'
@@ -9941,6 +10196,8 @@ Odys:
9941
  model: 'Space 10 Pro 3G'
9942
  - regex: 'THOR_?10 Build'
9943
  model: 'Thor 10'
 
 
9944
  - regex: 'JUNIOR_8_PRO'
9945
  model: 'Junior 8 Pro'
9946
  - regex: 'ADM816HC'
@@ -9953,13 +10210,28 @@ Odys:
9953
  model: 'Falcon 10 Plus 3G'
9954
  - regex: 'FUSION'
9955
  model: 'Fusion 7'
9956
- - regex: 'NEO6[_ ]LTE'
9957
- model: 'Neo 6 LTE'
9958
- device: 'smartphone'
9959
  - regex: 'ADM8000KP'
9960
  model: 'Titan'
 
 
 
 
 
 
9961
  - regex: 'THOR_?10_PLUS_3G'
9962
  model: 'Thor 10 Plus 3G'
 
 
 
 
 
 
 
 
 
 
9963
  - regex: 'IEOS[ _]([^/;]+) Build'
9964
  model: 'Ieos $1'
9965
  - regex: '(?:ODYS[ _-])?NOON Build'
@@ -10009,9 +10281,17 @@ Obi:
10009
  - regex: 'Obi[ _-]([^;/)]+)(?:[;/)]|$)'
10010
  model: '$1'
10011
 
 
 
 
 
 
 
 
 
10012
  # onda
10013
  Onda:
10014
- regex: 'Onda|(?:(?:V820w|V891[w]?|V919(?: 3G)? Air)[ _-]DualOS|(?:V919 4G Air|V989 Air) Core8|T2101L2B1C| V10 4G|OBOOK (?:20 SE|20 PLUS DUALOS)|OBOOK10 SE|V919 Air CH DualOS)(?:[);/ ]|$)'
10015
  device: 'smartphone'
10016
  models:
10017
  # explicit tablet models
@@ -10039,6 +10319,9 @@ Onda:
10039
  - regex: 'V919 4G Air Core8'
10040
  model: 'V919 4G Air Core 8'
10041
  device: 'tablet'
 
 
 
10042
  - regex: 'V989 Air Core8'
10043
  model: 'V989 Air Core 8'
10044
  device: 'tablet'
@@ -10104,7 +10387,7 @@ OnePlus:
10104
 
10105
  # Realme (sub brand Oppo)
10106
  Realme:
10107
- regex: 'Realme[ _]|(?:RMX(?:19(03|4[1235]|19|9[23]|2[157]|[01379]1|73)|20(?:[025-7]1|[037]2|2[57]|63|7[56]|8[56]|[234]0)|21(?:[12]1|42|7[60]|8[059])|2200|18(0[1579]|11|3[13]|2[157]|[45]1|45))|(?:OPPO[ _]?)?CPH1861)(?:[);/ ]|$)'
10108
  device: 'smartphone'
10109
  models:
10110
  - regex: '(?:OPPO[ _]?)?CPH1861(?:[);/ ]|$)'
@@ -10147,6 +10430,8 @@ Realme:
10147
  model: '6S'
10148
  - regex: 'RMX206[13](?:[);/ ]|$)'
10149
  model: '6 Pro'
 
 
10150
  - regex: 'RMX2170'
10151
  model: '7 Pro'
10152
  - regex: 'RMX1925(?:[);/ ]|$)'
@@ -10187,7 +10472,7 @@ Realme:
10187
 
10188
  # Oppo (oppo.com)
10189
  OPPO:
10190
- regex: '(?:OB-)?OPPO[ _]?([a-z0-9]+)|N1T|OPG01|A00[12]OP|(?:X90[07][0679]|U70[57]T?|X909T?|R(?:10[01]1|2001|201[07]|6007|7005|7007|80[13579]|81[13579]|82[01379]|83[013]|800[067]|8015|810[679]|811[13]|820[057])[KLSTW]?|N520[79]|N5117|A33f|A33fw|A37fw?|PAAM00|PAAT00|PAC[TM]00)(?:[);/ ]|$)|R7kf|R7plusf|R7Plusm|A1601|CPH[0-9]{4}|CPH19(69|79|23|1[179])|PB(A[TM]00|CT10|BT30|CM[13]0|[FD]M00)|P(DAM10|ADM00|AF[TM]00|ADT00|AHM00|BBM[03]0|BBT00|BDT00|BFT00|[CB]E[MT]00|CA[MT]00|C[CDG]M00|CA[MT]10|[CD]PM00|CRM00|CDT00|CD[TM]10|CHM[013]0|CKM[08]0|CLM[15]0|DEM[13]0|DHM00|DK[TM]00|DPT00|DB[TM]00|DCM00|[CD]NM00|DVM00|DY[TM]20|DNT00|EA[TM]00)'
10191
  device: 'smartphone'
10192
  models:
10193
  - regex: 'PCHM10(?:[);/ ]|$)'
@@ -10266,10 +10551,12 @@ OPPO:
10266
  model: 'AX7'
10267
  - regex: '(?:OPPO[ _]?)?X9009(?:[);/ ]|$)'
10268
  model: 'F1 Plus'
10269
- - regex: 'CPH1911(?:[);/ ]|$)'
10270
  model: 'F11'
10271
  - regex: 'CPH19(?:69|87)(?:[);/ ]|$)'
10272
  model: 'F11 Pro'
 
 
10273
  - regex: '(?:OPPO[ _]?)?A1601(?:[);/ ]|$)'
10274
  model: 'F1s'
10275
  - regex: '(?:OPPO[ _]?)?CPH1609(?:[);/ ]|$)'
@@ -10344,6 +10631,8 @@ OPPO:
10344
  model: 'Piano'
10345
  - regex: '(?:OPPO[ _]?)?CPH1707(?:[);/ ]|$)'
10346
  model: 'R11'
 
 
10347
  - regex: '(?:OPPO[ _]?)?CPH1719(?:[);/ ]|$)'
10348
  model: 'R11s'
10349
  - regex: '(?:OPPO[ _]?)?CPH1721(?:[);/ ]|$)'
@@ -10358,7 +10647,7 @@ OPPO:
10358
  model: 'R17'
10359
  - regex: '(?:OPPO[ _]?)?(?:CPH1893)(?:[);/ ]|$)'
10360
  model: 'R17 Neo'
10361
- - regex: '(?:OPPO[ _]?)?(?:CPH1877|CPH2119|PBD[MT]00)(?:[);/ ]|$)'
10362
  model: 'R17 Pro'
10363
  - regex: '(?:OPPO[ _]?)?R8006(?:[);/ ]|$)'
10364
  model: 'R1L'
@@ -10477,20 +10766,22 @@ Orange:
10477
 
10478
  # Oukitel
10479
  Oukitel:
10480
- regex: 'OUKITEL|(?:(?:C15|C16|K10000|K[46]000)(?:[ _]Pro)|U20_Plus|WP5 Pro|K[46]000[ _](?:Plus|Lite)|Y4800|K10000|K[4567]000)(?:[);/ ]|$)'
10481
  device: 'smartphone'
10482
  models:
10483
- - regex: '(C15|C16|K10000|K[46]000|WP[25])[ _]Pro(?:[);/ ]|$)'
10484
  model: '$1 Pro'
10485
  - regex: 'OUKITEL K([37])(?:[);/ ]|$)'
10486
  model: 'K$1'
10487
  - regex: '(K10000)[ _]Max(?:[);/ ]|$)'
10488
  model: '$1 Max'
10489
- - regex: '(U20|K[46]000)[_ ]Plus(?:[);/ ]|$)'
10490
  model: '$1 Plus'
10491
  - regex: '(K4000)[_ ]Lite(?:[);/ ]|$)'
10492
  model: '$1 Lite'
10493
- - regex: '(Y4800|K10000|K[4567]000|WP2)(?:[);/ ]|$)'
 
 
10494
  model: '$1'
10495
 
10496
  # Ouki
@@ -10534,7 +10825,7 @@ Overmax:
10534
 
10535
  # Oysters
10536
  Oysters:
10537
- regex: 'Oysters|T84ERI[ _]3G|T72HM(s_)?3G|T102MS_3G|T102ER3G|(T74HMi|T84Bi)[_ ]4G|T74MR4G|T84Ni[_ ][34]G|Pacific[ ]?800i|T104B_[34]G|IndianV|T72HA_3G|T74D_3G|T74N_3G|T74SC_3G|T74Mai_3G|T104MBi_3G|T104SCi_3G|T104ER4G|Atlantic4G|AntarcticE'
10538
  device: 'tablet'
10539
  models:
10540
  - regex: 'Pacific[ ]?800i'
@@ -10554,7 +10845,7 @@ Oysters:
10554
  model: '$1'
10555
  - regex: '(T84ERI[ _]3G|T72HM(s_)?3G|(?:(T74HMi|T84Bi)[_ ]4G)|T84Ni[_ ][34]G)'
10556
  model: '$1'
10557
- - regex: '(T74MR|T102MS|T104B|T74SC|T74[DN]|T72HA|T102ER|T104SCi|T104MBi|T104ER)[ _]?([34]G)'
10558
  model: '$1 $2'
10559
  - regex: 'T74Mai_3G'
10560
  model: 'T74MAi 3G'
@@ -10662,7 +10953,7 @@ PCD Argentina:
10662
 
10663
  # ArmPhone
10664
  ArmPhone:
10665
- regex: '(TSD Octa A0520P|TSD Quadra A0509P)(?:[);/ ]|$)'
10666
  device: 'smartphone'
10667
  model: '$1'
10668
 
@@ -10688,11 +10979,13 @@ Pentagram:
10688
 
10689
  # philips
10690
  Philips:
10691
- regex: 'Philips|AND1E(?:[);/ ]|$)|NETTV/|PI3210G|TLE(821L|722G)|TPM1[79]1E|70PUH6774_96|QM16[134]E|Xenium S[25]66'
10692
  device: 'smartphone'
10693
  models:
10694
  - regex: '(?:Philips[_ ])?Xenium[ _](S[25]66|V787)(?:[);/ ]|$)'
10695
  model: 'Xenium $1'
 
 
10696
  - regex: 'AND1E(?: TV)?(?:[);/ ]|$)'
10697
  model: 'Android TV'
10698
  device: 'tv'
@@ -10768,6 +11061,10 @@ Pixus:
10768
  model: 'Play Three v$1'
10769
  - regex: 'Play Two'
10770
  model: 'Play Two'
 
 
 
 
10771
  - regex: 'Touch 7 3G'
10772
  model: 'Touch 7 3G'
10773
  - regex: 'Pixus[ _]hiMax'
@@ -10776,6 +11073,8 @@ Pixus:
10776
  model: 'Blast 10.1"'
10777
  - regex: 'Pixus[ _]Joker'
10778
  model: 'Joker 10.1"'
 
 
10779
 
10780
  - regex: 'Raze'
10781
  model: 'Raze'
@@ -10914,17 +11213,18 @@ Rover:
10914
 
10915
  # RoverPad or Rover Pad
10916
  RoverPad:
10917
- regex: '(Rover[ ]?Pad|RoverPhone)(?:[);/ ]|$)'
10918
  device: 'tablet'
10919
  models:
10920
  - regex: 'RoverPhone(?:[);/ ]|$)'
10921
  model: ''
10922
  device: 'smartphone'
10923
- - regex: 'Rover[ ]?Pad sky 7.85(?:[);/ ]|$)'
10924
- model: 'Sky 7.85'
10925
  - regex: 'RoverPad (10.4|Air S70|9.7 3G|Sky 9.7|3W A73|3W7|3WT70|3W9.4)(?:[);/ ]|$)'
10926
  model: '$1'
10927
 
 
10928
  # Roadrover
10929
  Roadrover:
10930
  regex: 'Roadrover ChangAn S'
@@ -10992,9 +11292,9 @@ Siemens:
10992
 
10993
  # Soundmax
10994
  Soundmax:
10995
- regex: '((?:SM-LED32M(?:11|04)S)(?:_-Ver01)?|SM-LED40M04S)(?:[);/ ]|$)'
10996
- device: 'tv'
10997
- model: '$1'
10998
 
10999
  # Samsung
11000
  Samsung:
@@ -11015,450 +11315,450 @@ Samsung:
11015
  # explicit tablet models
11016
  - regex: '(?:SAMSUNG-)?(?:GT-)?N5100'
11017
  device: 'tablet'
11018
- model: 'GALAXY Note 8.0"'
11019
  - regex: '(?:SAMSUNG-)?SM-T677(?:[ATV]|N[KL])?(?:[);/ ]|$)'
11020
  device: 'tablet'
11021
- model: 'GALAXY View 18.4" LTE'
11022
  - regex: '(?:SAMSUNG-)?SM-T670(?:[);/ ]|$)'
11023
  device: 'tablet'
11024
- model: 'GALAXY View 18.4" WiFi'
11025
  - regex: '(?:SAMSUNG-)?(?:GT-)?N5110'
11026
  device: 'tablet'
11027
- model: 'GALAXY Note 8.0" WiFi'
11028
  - regex: '(?:SAMSUNG-)?GT-N5120'
11029
  device: 'tablet'
11030
- model: 'GALAXY Note 8.0" LTE'
11031
  - regex: '(?:SAMSUNG-)?GT-N8000'
11032
  device: 'tablet'
11033
- model: 'GALAXY Note 10.1"'
11034
  - regex: '(?:SAMSUNG-)?GT-N8010'
11035
  device: 'tablet'
11036
- model: 'GALAXY Note 10.1" WiFi'
11037
  - regex: '(?:SAMSUNG-)?GT-N8020'
11038
  device: 'tablet'
11039
- model: 'GALAXY Note 10.1" LTE'
11040
  - regex: '(?:SAMSUNG-)?GT-P1000M?|SCH-I800'
11041
  device: 'tablet'
11042
- model: 'GALAXY Tab'
11043
  - regex: '(?:SAMSUNG-)?GT-P3100B?'
11044
  device: 'tablet'
11045
- model: 'GALAXY Tab 2 7"'
11046
  - regex: '(?:SAMSUNG-)?GT-P311[03]'
11047
  device: 'tablet'
11048
- model: 'GALAXY Tab 2 7" WiFi'
11049
  - regex: '(?:SAMSUNG-)?GT-P5100|SCH-I915'
11050
  device: 'tablet'
11051
- model: 'GALAXY Tab 2 10.1"'
11052
  - regex: '(?:SAMSUNG-)?GT-P511[03]'
11053
  device: 'tablet'
11054
- model: 'GALAXY Tab 2 10.1" WiFi'
11055
  - regex: '(?:SAMSUNG-)?SM-T217T'
11056
  device: 'tablet'
11057
- model: 'GALAXY Tab 3 7.0" 4G'
11058
  - regex: '(?:SAMSUNG-)?GT-P5200'
11059
  device: 'tablet'
11060
- model: 'GALAXY Tab 3 10.1"'
11061
  - regex: '(?:SAMSUNG-)?GT-P5210'
11062
  device: 'tablet'
11063
- model: 'GALAXY Tab 3 10.1" WiFi'
11064
  - regex: '(?:SAMSUNG-)?GT-P5220'
11065
  device: 'tablet'
11066
- model: 'GALAXY Tab 3 10.1" LTE'
11067
  - regex: '(?:SAMSUNG-)?GT-P6200'
11068
  device: 'tablet'
11069
- model: 'GALAXY Tab 7" Plus'
11070
  - regex: '(?:SAMSUNG-)?GT-P6201'
11071
  device: 'tablet'
11072
- model: 'GALAXY Tab 7" Plus N'
11073
  - regex: '(?:SAMSUNG-)?GT-P6810'
11074
  device: 'tablet'
11075
- model: 'GALAXY Tab 7.7"'
11076
  - regex: '(?:SAMSUNG-)?GT-P7100'
11077
  device: 'tablet'
11078
- model: 'GALAXY Tab 10.1v'
11079
  - regex: '(?:SAMSUNG-)?GT-P75[01]0'
11080
  device: 'tablet'
11081
- model: 'GALAXY Tab 10.1"'
11082
  - regex: '(?:SAMSUNG-)?SM-P600'
11083
  device: 'tablet'
11084
- model: 'GALAXY Note 10.1" 2014 Edition WiFi'
11085
  - regex: '(?:SAMSUNG-)?SM-P60[12]'
11086
  device: 'tablet'
11087
- model: 'GALAXY Note 10.1" 2014 Edition'
11088
  - regex: '(?:SAMSUNG-)?SM-(?:P605|P607T)'
11089
  device: 'tablet'
11090
- model: 'GALAXY Note 10.1" 2014 Edition LTE'
11091
  - regex: '(?:SAMSUNG-)?SM-P900'
11092
  device: 'tablet'
11093
- model: 'GALAXY NotePRO 12.2" WiFi'
11094
  - regex: '(?:SAMSUNG-)?SM-P901'
11095
  device: 'tablet'
11096
- model: 'GALAXY NotePRO 12.2"'
11097
  - regex: '(?:SAMSUNG-)?SM-P905'
11098
  device: 'tablet'
11099
- model: 'GALAXY NotePRO 12.2" LTE'
11100
  - regex: '(?:SAMSUNG-)?SM-P587(?:[);/ ]|$)'
11101
  device: 'tablet'
11102
- model: 'GALAXY Tab A 10.1" with S Pen (2016) LTE'
11103
  - regex: '(?:SAMSUNG-)?SM-P205(?:[);/ ]|$)'
11104
  device: 'tablet'
11105
- model: 'GALAXY Tab A 8.0" with S Pen (2019) LTE'
11106
  - regex: '(?:SAMSUNG-)?SM-P200(?:[);/ ]|$)'
11107
  device: 'tablet'
11108
- model: 'GALAXY Tab A 8.0" with S Pen (2019) WiFi'
11109
  - regex: '(?:SAMSUNG-)?SM-T11[03]'
11110
  device: 'tablet'
11111
- model: 'GALAXY Tab 3 7.0" Lite WiFi'
11112
  - regex: '(?:SAMSUNG-)?SM-(?:T830[X]?|T837R4)(?:[);/ ]|$)'
11113
  device: 'tablet'
11114
- model: 'GALAXY Tab S4 10.5" WiFi'
11115
  - regex: '(?:SAMSUNG-)?SM-(?:T835[CN]?|T837[VTA])(?:[);/ ]|$)'
11116
  device: 'tablet'
11117
- model: 'GALAXY Tab S4 10.5"'
11118
  - regex: '(?:SAMSUNG-)?SM-(?:T725[N]?|T720X|T727[AV])(?:[);/ ]|$)'
11119
  device: 'tablet'
11120
- model: 'GALAXY Tab S5e 10.5"'
11121
  - regex: '(?:SAMSUNG-)?SM-T720(?:[);/ ]|$)'
11122
  device: 'tablet'
11123
- model: 'GALAXY Tab S5e 10.5" WiFi'
11124
  - regex: '(?:SAMSUNG-)?SM-T865N?(?:[);/ ]|$)'
11125
  device: 'tablet'
11126
- model: 'GALAXY Tab S6 10.5"'
11127
  - regex: '(?:SAMSUNG-)?SM-T867[V]?(?:[);/ ]|$)'
11128
  device: 'tablet'
11129
- model: 'GALAXY Tab S6 10.5" LTE'
11130
  - regex: '(?:SAMSUNG-)?SM-P615(?:[);/ ]|$)'
11131
  device: 'tablet'
11132
- model: 'GALAXY Tab S6 10.4" Lite'
11133
  - regex: '(?:SAMSUNG-)?SM-P610(?:[);/ ]|$)'
11134
  device: 'tablet'
11135
- model: 'GALAXY Tab S6 10.4" Lite WiFi'
11136
  - regex: '(?:SAMSUNG-)?SM-T860(?:[);/ ]|$)'
11137
  device: 'tablet'
11138
- model: 'GALAXY Tab S6 10.5" WiFi'
11139
  - regex: '(?:SAMSUNG-)?SM-T111[M]?(?:[);/ ]|$)'
11140
  device: 'tablet'
11141
- model: 'GALAXY Tab 3 7.0" Lite'
11142
  - regex: '(?:SAMSUNG-)?SM-T116(?:BU|NU|NY)?'
11143
  device: 'tablet'
11144
- model: 'GALAXY Tab 3 V'
11145
  - regex: '(?:SAMSUNG-)?SM-(?:T2105|T212)'
11146
  device: 'tablet'
11147
- model: 'GALAXY Tab 3 7.0" Kids'
11148
  - regex: '(?:SAMSUNG-)?SM-T210R?'
11149
  device: 'tablet'
11150
- model: 'GALAXY Tab 3 7.0" WiFi'
11151
  - regex: '(?:SAMSUNG-)?SM-T21(?:[15]|7[AS])'
11152
  device: 'tablet'
11153
- model: 'GALAXY Tab 3 7.0"'
11154
  - regex: '(?:SAMSUNG-)?SM-T230(?:NU)?'
11155
  device: 'tablet'
11156
- model: 'GALAXY Tab 4 7.0" WiFi'
11157
  - regex: '(?:SAMSUNG-)?SM-T23[15]|403SC'
11158
  device: 'tablet'
11159
- model: 'GALAXY Tab 4 7.0" 3G'
11160
  - regex: '(?:SAMSUNG-)?SM-(?:T239|T237P)'
11161
  device: 'tablet'
11162
- model: 'GALAXY Tab 4 7.0" LTE'
11163
  - regex: '(?:SAMSUNG-)?SM-T310'
11164
  device: 'tablet'
11165
- model: 'GALAXY Tab 3 8.0" WiFi'
11166
  - regex: '(?:SAMSUNG-)?SM-T311'
11167
  device: 'tablet'
11168
- model: 'GALAXY Tab 3 8.0"'
11169
  - regex: '(?:SAMSUNG-)?SM-T315'
11170
  device: 'tablet'
11171
- model: 'GALAXY Tab 3 8.0" LTE'
11172
  - regex: '(?:SAMSUNG-)?SM-T330'
11173
  device: 'tablet'
11174
- model: 'GALAXY Tab 4 8.0" WiFi'
11175
  - regex: '(?:SAMSUNG-)?SM-(?:T33[215]|T337[AVT])'
11176
  device: 'tablet'
11177
- model: 'GALAXY Tab 4 8.0" LTE'
11178
  - regex: '(?:SAMSUNG-)?SM-T520'
11179
  device: 'tablet'
11180
- model: 'GALAXY TabPRO 10.1" WiFi'
11181
  - regex: '(?:SAMSUNG-)?SM-(?:T53[15]|T537[AV])'
11182
  device: 'tablet'
11183
- model: 'GALAXY Tab 4 10.1" LTE'
11184
  - regex: '(?:SAMSUNG-)?SM-T536(?:[);/ ]|$)'
11185
  device: 'tablet'
11186
- model: 'GALAXY Tab 4 10.1" Advanced'
11187
  - regex: '(?:SAMSUNG-)?SM-T320'
11188
  device: 'tablet'
11189
- model: 'GALAXY TabPRO 8.4" WiFi'
11190
  - regex: '(?:SAMSUNG-)?SM-T325'
11191
  device: 'tablet'
11192
- model: 'GALAXY TabPRO 8.4" LTE'
11193
  - regex: '(?:SAMSUNG-)?SM-T525'
11194
  device: 'tablet'
11195
- model: 'GALAXY TabPRO 10.1" LTE'
11196
  - regex: '(?:SAMSUNG-)?SM-(?:T530(?:NU)?|T533)'
11197
  device: 'tablet'
11198
- model: 'GALAXY Tab 4 10.1" WiFi'
11199
  - regex: '(?:SAMSUNG-)?SM-T700'
11200
  device: 'tablet'
11201
- model: 'GALAXY Tab S 8.4" WiFi'
11202
  - regex: '(?:SAMSUNG-)?SM-(?:T705|T707A)'
11203
  device: 'tablet'
11204
- model: 'GALAXY Tab S 8.4" LTE'
11205
  - regex: '(?:SAMSUNG-)?SM-T800'
11206
  device: 'tablet'
11207
- model: 'GALAXY Tab S 10.5" WiFi'
11208
  - regex: '(?:SAMSUNG-)?(?:SM-(?:T805|T807[VP]?)|SCT21)'
11209
  device: 'tablet'
11210
- model: 'GALAXY Tab S 10.5" LTE'
11211
  - regex: '(?:SAMSUNG-)?SM-(?:T813|T810)'
11212
  device: 'tablet'
11213
- model: 'GALAXY Tab S2 9.7" WiFi'
11214
  - regex: '(?:SAMSUNG-)?SM-(?:T719[YC]?|T715(?:[YC]|N0)?)(?:[);/ ]|$)'
11215
  device: 'tablet'
11216
- model: 'GALAXY Tab S2 8.0" LTE'
11217
  - regex: '(?:SAMSUNG-)?SM-(?:T71[03]|T710X)(?:[);/ ]|$)'
11218
  device: 'tablet'
11219
- model: 'GALAXY Tab S2 8.0" WiFi'
11220
  - regex: '(?:SAMSUNG-)?SM-(?:T815|T817[ATW]?|T818[ATW]|T819[Y]?)'
11221
  device: 'tablet'
11222
- model: 'GALAXY Tab S2 9.7" LTE'
11223
  - regex: '(?:SAMSUNG-)?SM-T820'
11224
  device: 'tablet'
11225
- model: 'GALAXY Tab S3 9.7" WiFi'
11226
  - regex: '(?:SAMSUNG-)?SM-T82[57]'
11227
  device: 'tablet'
11228
- model: 'GALAXY Tab S3 9.7" LTE'
11229
  - regex: '(?:SAMSUNG-)?SM-T900'
11230
  device: 'tablet'
11231
- model: 'GALAXY TabPRO 12.2" WiFi'
11232
  - regex: '(?:SAMSUNG-)?SM-T280'
11233
  device: 'tablet'
11234
- model: 'GALAXY Tab A 7.0" WiFi'
11235
  - regex: '(?:SAMSUNG-)?SM-T285'
11236
  device: 'tablet'
11237
- model: 'GALAXY Tab A 7.0" LTE'
11238
  - regex: '(?:SAMSUNG-)?SM-T3[58]0'
11239
  device: 'tablet'
11240
- model: 'GALAXY Tab A 8.0" WiFi'
11241
  - regex: '(?:SAMSUNG-)?SM-(?:P350|T3[58]5|T357[TW])'
11242
  device: 'tablet'
11243
- model: 'GALAXY Tab A 8.0" LTE'
11244
  - regex: '(?:SAMSUNG-)?SM-T387(?:R4|VK|AA|[WVT])'
11245
  device: 'tablet'
11246
- model: 'GALAXY Tab A 8.0" LTE (2018)'
11247
  - regex: '(?:SAMSUNG-)?SM-T295'
11248
  device: 'tablet'
11249
- model: 'GALAXY Tab A 8.0" LTE (2019)'
11250
  - regex: '(?:SAMSUNG-)?SM-T290'
11251
  device: 'tablet'
11252
- model: 'GALAXY Tab A 8.0" WiFi (2019)'
11253
  - regex: '(?:SAMSUNG-)?SM-(?:P355([MY])?|T550)'
11254
  device: 'tablet'
11255
- model: 'GALAXY Tab A 9.7" WiFi'
11256
  - regex: '(?:SAMSUNG-)?SM-(?:P550|P555(M)?|T555)'
11257
  device: 'tablet'
11258
- model: 'GALAXY Tab A 9.7" LTE'
11259
  - regex: '(?:SAMSUNG-)?SM-(?:T58[05]|P58[05])'
11260
  device: 'tablet'
11261
- model: 'GALAXY Tab A 10.1" WiFi (2016)'
11262
  - regex: '(?:SAMSUNG-)?SM-T587[P]?'
11263
  device: 'tablet'
11264
- model: 'GALAXY Tab A 10.1" LTE (2016)'
11265
  - regex: '(?:SAMSUNG-)?SM-T59[057]'
11266
  device: 'tablet'
11267
- model: 'GALAXY Tab A 10.5" LTE (2018)'
11268
  - regex: '(?:SAMSUNG-)?SM-T51[05]'
11269
  device: 'tablet'
11270
- model: 'GALAXY Tab A 10.1" (2019)'
11271
  - regex: '(?:SAMSUNG-)?SM-(?:T37[57]|T378[KLSV])'
11272
  device: 'tablet'
11273
- model: 'GALAXY Tab E 8.0"'
11274
  - regex: '(?:SAMSUNG-)?SM-T56[02]'
11275
  device: 'tablet'
11276
- model: 'GALAXY Tab E 9.6" WiFi'
11277
  - regex: '(?:SAMSUNG-)?SM-T561'
11278
  device: 'tablet'
11279
- model: 'GALAXY Tab E 9.6" 3G'
11280
  - regex: '(?:SAMSUNG-)?SM-T567V'
11281
  device: 'tablet'
11282
- model: 'GALAXY Tab E 9.6" 4G'
11283
  - regex: '(?:SAMSUNG-)?SM-T365(?:[);/ ]|$)'
11284
  device: 'tablet'
11285
- model: 'GALAXY Tab Active 8.0"'
11286
  - regex: '(?:SAMSUNG-)?SM-T360(?:[);/ ]|$)'
11287
  device: 'tablet'
11288
- model: 'GALAXY Tab Active 8.0" WiFi'
11289
  - regex: '(?:SAMSUNG-)?SM-T39[057][U]?(?:[);/ ]|$)'
11290
  device: 'tablet'
11291
- model: 'GALAXY Tab Active 2 8.0"'
11292
  - regex: '(?:SAMSUNG-)?SM-P902(?:[);/ ]|$)'
11293
  device: 'tablet'
11294
- model: 'GALAXY Note Pro 12.2"'
11295
 
11296
  # explicit wearable models
11297
  - regex: '(?:SAMSUNG )?SM-R820'
11298
  device: 'wearable'
11299
- model: 'GALAXY Watch Active 2'
11300
 
11301
  # explicit smartphone models
11302
  - regex: '(?:SAMSUNG-)?SM-G850[AMSWYKLX]'
11303
- model: 'GALAXY Alpha'
11304
  - regex: '(?:SAMSUNG-)?GT-B5330'
11305
- model: 'GALAXY Chat'
11306
  - regex: '(?:SAMSUNG-)?SM-A605K'
11307
- model: 'GALAXY Jean'
11308
  - regex: '(?:SAMSUNG-)?SM-A202K'
11309
- model: 'GALAXY Jean 2'
11310
  - regex: '(?:SAMSUNG-)?GT-B5510'
11311
- model: 'GALAXY Y Pro'
11312
  - regex: '(?:SAMSUNG-)?GT-B5512'
11313
- model: 'GALAXY Y Pro Duos'
11314
  - regex: '(?:SAMSUNG-)?GT-B7510'
11315
- model: 'GALAXY Pro'
11316
  - regex: '(?:SAMSUNG-)?GT-I5700'
11317
- model: 'GALAXY Spica'
11318
  - regex: '(?:SAMSUNG-)?GT-I5801'
11319
- model: 'GALAXY Apollo'
11320
  - regex: '(?:SAMSUNG-)?GT-I5800'
11321
- model: 'GALAXY 3'
11322
  - regex: '(?:SAMSUNG-)?GT-I8000'
11323
  model: 'Omnia II'
11324
  - regex: '(?:SAMSUNG-)?(?:GT-I8150|SM-T255S)'
11325
- model: 'GALAXY W'
11326
  - regex: 'SC-01H(?:[);/ ]|$)'
11327
- model: 'GALAXY Active Neo'
11328
  - regex: '(?:SAMSUNG-)?GT-S5830'
11329
- model: 'GALAXY Ace'
11330
  - regex: '(?:SAMSUNG-)?SM-(?:G357(?:FZ|M)|G310HN)'
11331
- model: 'GALAXY Ace Style'
11332
  - regex: '(?:SAMSUNG-)?GT-I8160'
11333
- model: 'GALAXY Ace 2'
11334
  - regex: '(?:SAMSUNG-)?SM-G313(?:HY|M[LUY]|[FM])'
11335
- model: 'GALAXY Ace 4'
11336
  - regex: '(?:SAMSUNG-)?SM-G316M'
11337
- model: 'GALAXY Ace 4 Duos'
11338
  - regex: '(?:SAMSUNG-)?SM-G313[HU]'
11339
- model: 'GALAXY Ace 4 Lite'
11340
  - regex: '(?:SAMSUNG-)?SM-G318(?:H|ML)(?:[);/ ]|$)'
11341
- model: 'GALAXY Ace 4 Neo'
11342
  - regex: '(?:SAMSUNG-)?SM-G9100(?:[);/ ]|$)'
11343
- model: 'GALAXY S II'
11344
  - regex: '(?:SAMSUNG-)?SHV-E120S(?:[);/ ]|$)'
11345
- model: 'GALAXY S II HD LTE'
11346
  - regex: '(?:SAMSUNG-)?GT-I8190'
11347
- model: 'GALAXY S III mini'
11348
  - regex: '(?:SAMSUNG-)?GT-I8200'
11349
- model: 'GALAXY S III mini Value Edition'
11350
  - regex: '(?:SAMSUNG-)?GT-I826[02]'
11351
- model: 'GALAXY Core'
11352
  - regex: '(?:SAMSUNG-)?SM-G386W'
11353
- model: 'GALAXY Core LTE'
11354
  - regex: '(?:SAMSUNG-)?GT-I8320'
11355
  model: 'H1'
11356
  - regex: '(?:SAMSUNG-)?GT-I85[23]0'
11357
- model: 'GALAXY Beam'
11358
  - regex: '(?:SAMSUNG-)?SM-G3858'
11359
- model: 'GALAXY Beam 2'
11360
  - regex: '(?:SAMSUNG-)?SM-G600S'
11361
- model: 'GALAXY Wide'
11362
  - regex: '(?:SAMSUNG-)?GT-I855[028]'
11363
- model: 'GALAXY Win'
11364
  - regex: '(?:SAMSUNG-)?SM-G381[28]'
11365
- model: 'GALAXY Win Pro'
11366
  - regex: '(?:SAMSUNG-)?GT-I8580'
11367
- model: 'GALAXY Core Advance'
11368
  - regex: '(?:SAMSUNG-)?GT-I8730'
11369
- model: 'GALAXY Express'
11370
  - regex: '(?:SAMSUNG-)?SM-(?:E500(?:HQ|YZ|[0FHM])|S978L)'
11371
- model: 'GALAXY E5'
11372
  - regex: '(?:SAMSUNG-)?SM-E700(?:0|9|F|H|M)'
11373
- model: 'GALAXY E7'
11374
  - regex: '(?:SAMSUNG-)?GT-I90(?:00|08|18|88)'
11375
- model: 'GALAXY S'
11376
  - regex: '(?:SAMSUNG-)?GT-I9001'
11377
- model: 'GALAXY S Plus'
11378
  - regex: '(?:SAMSUNG-)?GT-I9003'
11379
- model: 'GALAXY SL'
11380
  - regex: '(?:SAMSUNG-)?GT-I9010'
11381
- model: 'GALAXY S Giorgio Armani'
11382
  - regex: '(?:SAMSUNG-)?GT-I9070'
11383
- model: 'GALAXY S Advance'
11384
  - regex: '(?:SAMSUNG-)?GT-I910[08]'
11385
- model: 'GALAXY S II'
11386
  - regex: '(?:SAMSUNG-)?ISW11SC'
11387
- model: 'GALAXY S II WiMAX'
11388
  - regex: '(?:SAMSUNG-)?GT-I9103'
11389
- model: 'GALAXY R'
11390
  - regex: '(?:SAMSUNG-)?GT-I9105'
11391
- model: 'GALAXY S II Plus'
11392
  - regex: '(?:SAMSUNG-)?SM-G730(?:W8|[AV])'
11393
- model: 'GALAXY S3 mini'
11394
  - regex: '(?:SAMSUNG-)?(?:GT-I919[025]|SCH-I435)'
11395
- model: 'GALAXY S4 mini'
11396
  - regex: '(?:SAMSUNG-)?GT-I9515'
11397
- model: 'GALAXY S4 Value Edition'
11398
  - regex: '(?:SAMSUNG-)?GT-I9295'
11399
- model: 'GALAXY S4 ACTIVE'
11400
  - regex: '(?:SAMSUNG-)?(?:GT-I9300|SCH-I535|SCH-L710|SCH-I939)'
11401
- model: 'GALAXY S III'
11402
  - regex: '(?:SAMSUNG-)?(?:GT-I9305|SCH-R530)'
11403
- model: 'GALAXY S III LTE'
11404
- - regex: '(?:SAMSUNG-)?(?:SM-S975L|GT-I9500|GT-I9502|GT-I9505|SCH-I545|SCH-I959|SCH-R970|GALAXY-S4|SGH-M919N?)|SC-04E'
11405
- model: 'GALAXY S4'
11406
  - regex: '(?:SAMSUNG-)?GT-I9506'
11407
- model: 'GALAXY S4 with LTE+'
11408
  - regex: '(?:SAMSUNG-)?GT-S5280'
11409
- model: 'GALAXY STAR'
11410
  - regex: '(?:SAMSUNG-)?GT-S5301'
11411
- model: 'GALAXY POCKET Plus'
11412
  - regex: '(?:SAMSUNG-)?GT-S5310'
11413
- model: 'GALAXY POCKET Neo'
11414
  - regex: '(?:SAMSUNG-)?SM-G110[BHM]'
11415
- model: 'GALAXY POCKET 2'
11416
  - regex: '(?:SAMSUNG-)?GT-S5360'
11417
- model: 'GALAXY Y Hello Kitty'
11418
  - regex: '(?:SAMSUNG-)?GT-S6310'
11419
- model: 'GALAXY Young'
11420
  - regex: '(?:SAMSUNG-)?GT-S6312'
11421
- model: 'GALAXY Young DUOS'
11422
  - regex: '(?:SAMSUNG-)?SM-G130(?:BT|HN|[EHMU])'
11423
- model: 'GALAXY Young 2'
11424
  - regex: '(?:SAMSUNG-)?SM-G130BU'
11425
- model: 'GALAXY Young 2 Pro'
11426
  - regex: '(?:SAMSUNG-)?GT-S6790'
11427
- model: 'GALAXY FAME Lite with NFC'
11428
  - regex: '(?:SAMSUNG-)?GT-S6810'
11429
- model: 'GALAXY FAME'
11430
  - regex: '(?:SAMSUNG-)?GT-S6812'
11431
- model: 'GALAXY FAME Duos'
11432
  - regex: 'SC-04J(?:[);/ ]|$)'
11433
- model: 'GALAXY Feel'
11434
  - regex: '(?:SAMSUNG-)?GT-S7275'
11435
- model: 'GALAXY ACE 3'
11436
  - regex: '(?:SAMSUNG-)?GT-S7500'
11437
- model: 'GALAXY ACE Plus'
11438
  - regex: '(?:SAMSUNG-)?(?:GT-S7560|SCH-I699)'
11439
- model: 'GALAXY Trend'
11440
  - regex: '(?:SAMSUNG-)?GT-S7390'
11441
- model: 'GALAXY Trend Lite'
11442
  - regex: '(?:SAMSUNG-)?GT-S7580'
11443
- model: 'GALAXY Trend Plus'
11444
  - regex: '(?:SAMSUNG-)?SCH-I739'
11445
- model: 'GALAXY Trend 2'
11446
  - regex: '(?:SAMSUNG-)?(?:GT-S7562|SCH-I919)'
11447
- model: 'GALAXY S DUOS'
11448
  - regex: '(?:SAMSUNG-)?GT-S7582'
11449
- model: 'GALAXY S DUOS 2'
11450
  - regex: '(?:SAMSUNG-)?SM-(?:G31[36]HU|G313HZ)'
11451
- model: 'GALAXY S DUOS 3'
11452
  - regex: '(?:SAMSUNG-)?GT-S7710'
11453
- model: 'GALAXY Xcover 2'
11454
  - regex: '(?:SAMSUNG-)?SM-G389F'
11455
- model: 'GALAXY Xcover 3'
11456
  - regex: '(?:SAMSUNG-)?SM-G715FN'
11457
- model: 'GALAXY Xcover Pro'
11458
  - regex: '(?:SAMSUNG-)?SM-G398FN'
11459
- model: 'GALAXY Xcover 4s'
11460
  - regex: '(?:SAMSUNG-)?SM-G390Y'
11461
- model: 'GALAXY Xcover 4'
11462
  - regex: '(?:SAMSUNG-)?GT-S8500'
11463
  model: 'Wave'
11464
  - regex: '(?:SAMSUNG-)?GT-S8530'
@@ -11478,519 +11778,519 @@ Samsung:
11478
  - regex: '(?:SAMSUNG-)?GT-S7230'
11479
  model: 'Wave 723'
11480
  - regex: '(?:SAMSUNG-)?SM-(?:C101|C105([AL])?)'
11481
- model: 'GALAXY S4 zoom'
11482
  - regex: '(?:SAMSUNG-)?SM-(?:C111(M)?|C115)'
11483
- model: 'GALAXY K zoom'
11484
  - regex: '(?:SAMSUNG-)?SM-G318[HM]Z'
11485
- model: 'GALAXY V Plus'
11486
  - regex: '(?:SAMSUNG-)?SM-(?:G355[HM]|G3556D)'
11487
- model: 'GALAXY Core 2'
11488
  - regex: '(?:SAMSUNG-)?SM-G350'
11489
- model: 'GALAXY Core Plus'
11490
  - regex: '(?:SAMSUNG-)?SM-(?:G360[FH]?|S820L)'
11491
- model: 'GALAXY Core Prime'
11492
  - regex: '(?:SAMSUNG-)?SM-G361[FH]?'
11493
- model: 'GALAXY Core Prime Value Edition'
11494
  - regex: '(?:SAMSUNG-)?SM-(?:G386F|G3586V)'
11495
- model: 'GALAXY Core LTE'
11496
  - regex: '(?:SAMSUNG-)?SM-G3568V'
11497
- model: 'GALAXY Core Mini 4G'
11498
  - regex: '(?:SAMSUNG-)?SM-G5108Q'
11499
- model: 'GALAXY Core Max'
11500
  - regex: '(?:SAMSUNG-)?SM-G3815'
11501
- model: 'GALAXY EXPRESS II'
11502
  - regex: '(?:SAMSUNG-)?SM-G388F'
11503
- model: 'GALAXY Xcover 3'
11504
  - regex: '(?:SAMSUNG-)?SM-G390[FW]'
11505
- model: 'GALAXY Xcover 4'
11506
  - regex: '(?:SAMSUNG-)?SM-G800'
11507
- model: 'GALAXY S5 mini'
11508
  - regex: '(?:SAMSUNG-)?SM-G9009D'
11509
- model: 'GALAXY S5 Dual-SIM'
11510
- - regex: '(?:SAMSUNG-)?SM-(?:G900|G906[KLS]|S902L|S903VL)|GALAXY-S5|SCL23'
11511
- model: 'GALAXY S5'
11512
  - regex: '(?:SAMSUNG-)?SM-G901F'
11513
- model: 'GALAXY S5 LTE+'
11514
  - regex: '(?:SAMSUNG-)?SM-G870[AFW]|SC-02G'
11515
- model: 'GALAXY S5 Active'
11516
  - regex: '(?:SAMSUNG-)?SM-G903[FMW]'
11517
- model: 'GALAXY S5 Neo'
11518
  - regex: '(?:SAMSUNG-)?SM-G860P'
11519
- model: 'GALAXY S5 K Sport'
11520
  - regex: '(?:SAMSUNG-)?(?:SM-G920(?:F[DQ]|W8|[089AFIKLPRSTVX])?|SM-S907VL)|SC-05G'
11521
- model: 'GALAXY S6'
11522
  - regex: '(?:SAMSUNG-)?SM-G890A'
11523
- model: 'GALAXY S5 Active'
11524
  - regex: '(?:SAMSUNG-)?SM-G925[0ADFIKLPRSTVWX]|SCV31|404SC'
11525
- model: 'GALAXY S6 Edge'
11526
  - regex: '(?:SAMSUNG-)?SM-G928(?:7C|R4|W8|[07ACFGIKLPSTVX])'
11527
- model: 'GALAXY S6 Edge+'
11528
  - regex: '(?:SAMSUNG-)?SM-G930(?:FD|W8|[0AFKLPRSTUVX8])?(?:[);/ ]|$)'
11529
- model: 'GALAXY S7'
11530
  - regex: '(?:SAMSUNG-)?SM-G935(?:R4|W8|[0AFKLPSTUVX])|SC-02H|SCV33'
11531
- model: 'GALAXY S7 Edge'
11532
  - regex: '(?:SAMSUNG-)?SM-G891A'
11533
- model: 'GALAXY S7 Active'
11534
  - regex: '(?:SAMSUNG-)?SM-G950[08FNUW]?|SCV36|SC-02J'
11535
- model: 'GALAXY S8'
11536
  - regex: '(?:SAMSUNG-)?SM-G8750'
11537
- model: 'GALAXY S8 Lite'
11538
  - regex: '(?:SAMSUNG-)?SM-G892[AU]'
11539
- model: 'GALAXY S8 Active'
11540
  - regex: '(?:SAMSUNG-)?SM-G955[AFKLNPRTUVW0X]?|SCV35|SC-03J'
11541
- model: 'GALAXY S8+'
11542
  - regex: '(?:SAMSUNG-)?SM-G960[FNUWX0]?|SCV38|SC-02K'
11543
- model: 'GALAXY S9'
11544
  - regex: '(?:SAMSUNG-)?SM-G965[FNUWX0]|SCV39|SC-03K'
11545
- model: 'GALAXY S9+'
11546
  - regex: '(?:SAMSUNG-)?(?:SM-(?:G973|G977[PUTNB])|SCV41|SC-03L)'
11547
- model: 'GALAXY S10'
11548
  - regex: '(?:SAMSUNG-)?SM-G770F'
11549
- model: 'GALAXY S10 Lite'
11550
  - regex: '(?:SAMSUNG-)?(?:SM-G975[0FUWNX]|SCV42|SC-04L)'
11551
- model: 'GALAXY S10+'
11552
  - regex: '(?:SAMSUNG-)?SM-G970[08FUNWX](?:[);/ ]|$)'
11553
- model: 'GALAXY S10e'
11554
  - regex: '(?:SAMSUNG-)?SM-G980F'
11555
- model: 'GALAXY S20'
11556
  - regex: '(?:SAMSUNG-)?SM-G981(?:[0BNUW]|U1)|SCG01'
11557
- model: 'GALAXY S20 5G'
11558
  - regex: '(?:SAMSUNG-)?SM-G988(?:[0BNUW]|U1)'
11559
- model: 'GALAXY S20 Ultra 5G'
11560
  - regex: '(?:SAMSUNG-)?SM-G985F|SCG02'
11561
- model: 'GALAXY S20+'
11562
  - regex: '(?:SAMSUNG-)?SM-G986(?:[0BNUW]|U1)|SC-52A'
11563
- model: 'GALAXY S20+ 5G'
11564
  - regex: '(?:SAMSUNG-)?SM-F700(?:[0FNUW]|U1)|SCV47'
11565
- model: 'GALAXY Z Flip'
11566
  - regex: '(?:SAMSUNG-)?SCH-I200'
11567
- model: 'GALAXY Stellar'
11568
  - regex: '(?:SAMSUNG-)?SCH-I829'
11569
- model: 'GALAXY Style Duos'
11570
  - regex: '(?:SAMSUNG-)?(?:SGH-S730|SCH-R740)'
11571
- model: 'GALAXY Discover'
11572
  - regex: '(?:SAMSUNG-)?SCH-S738'
11573
- model: 'GALAXY Centura'
11574
  - regex: 'vollo Vi86(?:[);/ ]|$)'
11575
  model: 'Vollo Vi86'
11576
  - regex: '(?:SAMSUNG-)?SM-G386(?:T1|T)'
11577
- model: 'GALAXY Avant'
11578
  - regex: '(?:SAMSUNG-)?SM-A015[AFGM]'
11579
- model: 'GALAXY A01'
11580
  - regex: '(?:SAMSUNG-)?SM-A260[FG]'
11581
- model: 'GALAXY A2 Core'
11582
  - regex: '(?:SAMSUNG-)?SM-A300(?:FU|YZ|XU|[09FGHMY])'
11583
- model: 'GALAXY A3 (2015)'
11584
  - regex: '(?:SAMSUNG-)?SM-A310(?:N0|[FMYX])'
11585
- model: 'GALAXY A3 (2016)'
11586
  - regex: '(?:SAMSUNG-)?SM-A320(?:FL|[FYX])'
11587
- model: 'GALAXY A3 (2017)'
11588
  - regex: '(?:SAMSUNG-)?SM-A500[LSWY9]?(?:[);/ ]|$)'
11589
- model: 'GALAXY A5'
11590
  - regex: '(?:SAMSUNG-)?SM-A500[FGHKM0]'
11591
- model: 'GALAXY A5 Duos'
11592
  - regex: '(?:SAMSUNG-)?SM-A500(?:FU|X)'
11593
- model: 'GALAXY A5 (2015)'
11594
  - regex: '(?:SAMSUNG-)?SM-A510[08FKLMSYX]'
11595
- model: 'GALAXY A5 (2016)'
11596
  - regex: '(?:SAMSUNG-)?SM-A520[FKLSWX]'
11597
- model: 'GALAXY A5 (2017)'
11598
  - regex: '(?:SAMSUNG-)?SM-A600(?:AZ|FN|GN|T1|[AFGNPTUX])'
11599
- model: 'GALAXY A6'
11600
  - regex: '(?:SAMSUNG-)?SM-A605(?:[FG]N|[08FGX])'
11601
- model: 'GALAXY A6+'
11602
  - regex: '(?:SAMSUNG-)?SM-G6200'
11603
- model: 'GALAXY A6s (2018)'
11604
  - regex: '(?:SAMSUNG-)?SM-A60(?:60|6Y)'
11605
- model: 'GALAXY A60'
11606
  - regex: '(?:SAMSUNG-)?SM-A700(?:YD|[09FHKLSX])'
11607
- model: 'GALAXY A7'
11608
  - regex: '(?:SAMSUNG-)?SM-A710[08FKLMSYX]'
11609
- model: 'GALAXY A7 (2016)'
11610
  - regex: '(?:SAMSUNG-)?SM-A720[FSX]'
11611
- model: 'GALAXY A7 (2017)'
11612
  - regex: '(?:SAMSUNG-)?SM-A750(?:GN|[FGCNX])'
11613
- model: 'GALAXY A7 (2018)'
11614
  - regex: '(?:SAMSUNG-)?SM-A71(?:5[FW])?(?:[);/ ]|$)'
11615
- model: 'GALAXY A71'
11616
  - regex: '(?:SAMSUNG-)?SM-A716U(?:[);/ ]|$)'
11617
- model: 'GALAXY A71 5G'
11618
  - regex: '(?:SAMSUNG-)?SM-A(?:530F|800[0FISY])|SCV32'
11619
- model: 'GALAXY A8'
11620
  - regex: '(?:SAMSUNG-)?SM-G885[FSY]'
11621
- model: 'GALAXY A8 Star'
11622
  - regex: '(?:SAMSUNG-)?SM-A810(?:YZ|[FS])'
11623
- model: 'GALAXY A8 (2016)'
11624
  - regex: '(?:SAMSUNG-)?SM-G887[0F]'
11625
- model: 'GALAXY A8s'
11626
  - regex: '(?:SAMSUNG-)?SM-A530[NWXM]'
11627
- model: 'GALAXY A8 (2018)'
11628
  - regex: '(?:SAMSUNG-)?SM-A730F'
11629
- model: 'GALAXY A8+ (2018)'
11630
  - regex: '(?:SAMSUNG-)?SM-A9000'
11631
- model: 'GALAXY A9'
11632
  - regex: 'SM-A9\[7\]'
11633
- model: 'GALAXY A9 7'
11634
  - regex: '(?:SAMSUNG-)?SM-A920[0FXN]'
11635
- model: 'GALAXY A9 (2018)'
11636
  - regex: '(?:SAMSUNG-)?SM-G885[08]'
11637
- model: 'GALAXY A9 Star'
11638
  - regex: '(?:SAMSUNG-)?SM-(?:A910[0F]|G887N)'
11639
- model: 'GALAXY A9 Pro'
11640
  - regex: '(?:SAMSUNG-)?SM-A105[FGMN]'
11641
- model: 'GALAXY A10'
11642
  - regex: '(?:SAMSUNG-)?SM-A107[FM]'
11643
- model: 'GALAXY A10s'
11644
  - regex: '(?:SAMSUNG-)?SM-(?:S102DL|A102[NWU])'
11645
- model: 'GALAXY A10e'
11646
  - regex: '(?:SAMSUNG-)?SM-A115F'
11647
- model: 'GALAXY A11'
11648
  - regex: '(?:SAMSUNG-)?SM-(?:A205(?:[FGSWU]|YN|U1)|S205DL)|SC-02M|SCV46'
11649
- model: 'GALAXY A20'
11650
  - regex: '(?:SAMSUNG-)?SM-A215U(?:[);/ ]|$)'
11651
- model: 'GALAXY A21'
11652
  - regex: '(?:SAMSUNG-)?SM-A217F(?:[);/ ]|$)'
11653
- model: 'GALAXY A21s'
11654
  - regex: '(?:SAMSUNG-)?SM-A202[FG]'
11655
- model: 'GALAXY A20e'
11656
  - regex: '(?:SAMSUNG-)?SM-A207[0FM]'
11657
- model: 'GALAXY A20s'
11658
  - regex: '(?:SAMSUNG-)?(?:SM-A305(?:[GYF]N|GT|[NFG])|SCV43)'
11659
- model: 'GALAXY A30'
11660
  - regex: '(?:SAMSUNG-)?SM-A307(?:FN|GN|GT|[FG])'
11661
- model: 'GALAXY A30s'
11662
  - regex: '(?:SAMSUNG-)?SM-A315[FNG](?:[);/ ]|$)'
11663
- model: 'GALAXY A31'
11664
  - regex: '(?:SAMSUNG-)?SM-A405(?:F[NM]|S)'
11665
- model: 'GALAXY A40'
11666
  - regex: '(?:SAMSUNG-)?SM-A305[01](?:[);/ ]|$)'
11667
- model: 'GALAXY A40s'
11668
  - regex: '(?:SAMSUNG-)?(?:SM-A415F|SCV48)(?:[);/ ]|$)'
11669
- model: 'GALAXY A41'
11670
  - regex: '(?:SAMSUNG-)?SM-(?:A505(?:F[NG]|[FGNWUX]|YN|U1?)|S506DL|505FN)'
11671
- model: 'GALAXY A50'
11672
  - regex: '(?:SAMSUNG-)?SM-A5070(?:[);/ ]|$)'
11673
- model: 'GALAXY A50s'
11674
  - regex: '(?:SAMSUNG-)?SM-A507FN'
11675
- model: 'GALAXY A50s'
11676
  - regex: '(?:SAMSUNG-)?SM-A515[F]'
11677
- model: 'GALAXY A51'
11678
  - regex: '(?:SAMSUNG-)?SM-A705(?:GM|[MYF]N|F|[W0X])'
11679
- model: 'GALAXY A70'
11680
  - regex: '(?:SAMSUNG-)?SM-A707[0F]'
11681
- model: 'GALAXY A70s'
11682
  - regex: '(?:SAMSUNG-)?SM-A805[0FNX]'
11683
- model: 'GALAXY A80'
11684
  - regex: '(?:SAMSUNG-)?SM-A908[BN]'
11685
- model: 'GALAXY A90'
11686
  - regex: '(?:SAMSUNG-)?GT-I9301I'
11687
- model: 'GALAXY S III Neo'
11688
  - regex: '(?:SAMSUNG-)?SM-S120VL(?:[);/ ]|$)'
11689
- model: 'GALAXY Luna'
11690
  - regex: '(?:SAMSUNG-)?SM-J100(?:FN|VPP|MU|[FHMY])'
11691
- model: 'GALAXY J1'
11692
  - regex: '(?:SAMSUNG-)?SM-J105[BFHYM]'
11693
- model: 'GALAXY J1 Mini'
11694
  - regex: '(?:SAMSUNG-)?SM-J106[FMHB]'
11695
- model: 'GALAXY J1 mini Prime'
11696
  - regex: '(?:SAMSUNG-)?SM-(?:J120(?:ZN|[AFHGMTW])|J05H)'
11697
- model: 'GALAXY J1 (2016)'
11698
  - regex: '(?:SAMSUNG-)?SM-(?:J110[FHMLG]|J111[FM])'
11699
- model: 'GALAXY J1 Ace'
11700
  - regex: '(?:SAMSUNG-)?SM-J200[FGHYM]'
11701
- model: 'GALAXY J2'
11702
  - regex: '(?:SAMSUNG-)?SM-J200BT'
11703
- model: 'GALAXY J2 Duos'
11704
  - regex: '(?:SAMSUNG-)?SM-J260AZ'
11705
- model: 'GALAXY J2 Pure'
11706
  - regex: '(?:SAMSUNG-)?SM-(?:J260([AFGMY]|T1)|S260DL)'
11707
- model: 'GALAXY J2 Core'
11708
  - regex: '(?:SAMSUNG-)?SM-J(?:210F|250[FNMGY])'
11709
- model: 'GALAXY J2 Pro'
11710
  - regex: '(?:SAMSUNG-)?SM-(?:S367VL|S357BL)'
11711
- model: 'GALAXY J3 Orbit'
11712
  - regex: '(?:SAMSUNG-)?SM-J311(?:[09]|9S)'
11713
- model: 'GALAXY J3 Pro'
11714
  - regex: '(?:SAMSUNG-)?SM-S320VL(?:[);/ ]|$)'
11715
- model: 'GALAXY J3 Sky'
11716
  - regex: '(?:SAMSUNG-)?SM-S327VL(?:[);/ ]|$)'
11717
- model: 'GALAXY J3 Luna Pro'
11718
  - regex: '(?:SAMSUNG-)?SM-J327(?:T1|[ATW])(?:[);/ ]|$)'
11719
- model: 'GALAXY J3 Prime'
11720
  - regex: '(?:SAMSUNG-)?SM-J327(?:[FP]|R4)'
11721
- model: 'GALAXY J3 Emerge'
11722
  - regex: '(?:SAMSUNG-)?SM-J337R4(?:[);/ ]|$)'
11723
- model: 'GALAXY J3 Aura'
11724
  - regex: '(?:SAMSUNG-)?SM-J337T(?:[);/ ]|$)'
11725
- model: 'GALAXY J3 Star'
11726
  - regex: '(?:SAMSUNG-)?SM-J327V'
11727
- model: 'GALAXY J3 Eclipse'
11728
  - regex: '(?:SAMSUNG-)?SM-S337TL'
11729
- model: 'GALAXY J3 Luna Pro'
11730
  - regex: '(?:SAMSUNG-)?SM-J3109'
11731
- model: 'GALAXY J3 (2015)'
11732
  - regex: '(?:SAMSUNG-)?SM-J320(?:[ZF]N|R4|W8|YZ|[AFGHMNPVY])'
11733
- model: 'GALAXY J3 (2016)'
11734
  - regex: '(?:SAMSUNG-)?SM-(?:J330(?:[08FGLN]|FN)|J327(?:R7|U))(?:[);/ ]|$)'
11735
- model: 'GALAXY J3 (2017)'
11736
  - regex: '(?:SAMSUNG-)?SM-J337(?:[AWPUV]|VPP)(?:[);/ ]|$)'
11737
- model: 'GALAXY J3 (2018)'
11738
  - regex: '(?:SAMSUNG-)?SM-J400[FGM]'
11739
- model: 'GALAXY J4'
11740
  - regex: '(?:SAMSUNG-)?SM-J500(?:[8F]|FN|[7GYMH]|N0)(?:[);/ ]|$)'
11741
- model: 'GALAXY J5 (2015)'
11742
  - regex: '(?:SAMSUNG-)?SM-(?:J510(?:[8FHKLSYG]|[UFMG]N)|5108|G510H)(?:[);/ ]|$)'
11743
- model: 'GALAXY J5 (2016)'
11744
  - regex: '(?:SAMSUNG-)?SM-J530'
11745
- model: 'GALAXY J5 (2017)'
11746
  - regex: '(?:SAMSUNG-)?SM-G570[0FMY]'
11747
- model: 'GALAXY J5 Prime'
11748
  - regex: '(?:SAMSUNG-)?SM-J600[NFGL]' # 2018
11749
- model: 'GALAXY J6'
11750
  - regex: '(?:SAMSUNG-)?SM-J610[FG]'
11751
- model: 'GALAXY J6+'
11752
  - regex: '(?:SAMSUNG-)?SM-J410[FG]'
11753
- model: 'GALAXY J4 Core'
11754
  - regex: '(?:SAMSUNG-)?SM-J415(?:[FNG]|[FG]N)'
11755
- model: 'GALAXY J4+'
11756
  - regex: '(?:SAMSUNG-)?SM-J7[01]0(?:8|F|FN|H|K|M|MN)'
11757
- model: 'GALAXY J7'
11758
  - regex: '(?:SAMSUNG-)?SM-J700P'
11759
- model: 'GALAXY J7 (2015)'
11760
  - regex: '(?:SAMSUNG-)?SM-(?:J700(?:T1|T)|J710GN|J7109)'
11761
- model: 'GALAXY J7 (2016)'
11762
  - regex: '(?:SAMSUNG-)?SM-(?:J730[K]|J727(?:[AUSF]|R4))(?:[);/ ]|$)'
11763
- model: 'GALAXY J7 (2017)'
11764
  - regex: '(?:SAMSUNG-)?SM-J737(?:[AVPUS]|T1?|VPP|R4)(?:[);/ ]|$)'
11765
- model: 'GALAXY J7 (2018)'
11766
  - regex: '(?:SAMSUNG-)?SM-C710F'
11767
- model: 'GALAXY J7+ (C7)'
11768
  - regex: '(?:SAMSUNG-)?SM-G610[FMY]'
11769
- model: 'GALAXY J7 Prime'
11770
  - regex: '(?:SAMSUNG-)?SM-G611(?:FF|MT|M)'
11771
- model: 'GALAXY J7 Prime 2'
11772
  - regex: '(?:SAMSUNG-)?SM-G615[F]'
11773
- model: 'GALAXY J7 Max'
11774
  - regex: '(?:SAMSUNG-)?SM-(?:S727VL|S737TL)'
11775
- model: 'GALAXY J7 Sky Pro'
11776
  - regex: '(?:SAMSUNG-)?SM-J730(?:F|G|GM)'
11777
- model: 'GALAXY J7 Pro'
11778
  - regex: '(?:SAMSUNG-)?SM-J701(?:F|M)'
11779
- model: 'GALAXY J7 Core' # also GALAXY J7 Nxt and GALAXY J7 Neo
11780
  - regex: '(?:SAMSUNG-)?SM-J720[FM]'
11781
- model: 'GALAXY J7 Duo'
11782
  - regex: '(?:SAMSUNG-)?SM-(?:S767VL|S757BL)'
11783
- model: 'GALAXY J7 Crown'
11784
  - regex: '(?:SAMSUNG-)?SM-J727(?:P|T|V)'
11785
- model: 'GALAXY J7 V'
11786
  - regex: 'SM-J7\[7\]'
11787
- model: 'GALAXY J7 7'
11788
  - regex: '(?:SAMSUNG-)?SM-J810'
11789
- model: 'GALAXY J8'
11790
  - regex: 'SM-J8 Pro'
11791
- model: 'GALAXY J8 Pro'
11792
  - regex: 'SM-J9\[7\] Prime'
11793
- model: 'GALAXY J9 7 Prime'
11794
  - regex: 'SM-J9\[8\] Pro'
11795
- model: 'GALAXY J9 8 Pro'
11796
  - regex: '(?:SAMSUNG-)?SM-M015[FG]'
11797
- model: 'GALAXY M01'
11798
  - regex: '(?:SAMSUNG-)?SM-M105[FGM]'
11799
- model: 'GALAXY M10'
11800
  - regex: '(?:SAMSUNG-)?SM-M107F'
11801
- model: 'GALAXY M10s'
11802
  - regex: '(?:SAMSUNG-)?SM-M115F'
11803
- model: 'GALAXY M11'
11804
  - regex: '(?:SAMSUNG-)?SM-M205[FGNM]'
11805
- model: 'GALAXY M20'
11806
  - regex: '(?:SAMSUNG-)?SM-M215F'
11807
- model: 'GALAXY M21'
11808
  - regex: '(?:SAMSUNG-)?SM-M307([0F]|FN)'
11809
- model: 'GALAXY M30s'
11810
  - regex: '(?:SAMSUNG-)?SM-M305'
11811
- model: 'GALAXY M30'
11812
  - regex: '(?:SAMSUNG-)?SM-M315F'
11813
- model: 'GALAXY M31'
11814
  - regex: '(?:SAMSUNG-)?SM-M317F'
11815
- model: 'GALAXY M31s'
11816
  - regex: '(?:SAMSUNG-)?SM-M405'
11817
- model: 'GALAXY M40'
11818
  - regex: '(?:SAMSUNG-)?SM-W201([689])'
11819
- model: 'GALAXY W201$1'
11820
 
11821
  - regex: '(?:SAMSUNG-)?SM-G850F'
11822
- model: 'GALAXY Alpha'
11823
  - regex: '(?:SAMSUNG-)?SM-G910S'
11824
- model: 'GALAXY Round'
11825
  - regex: '(?:SAMSUNG-)?SM-(?:G550(?:FY|T[12]?)|S550TL|G55[01]0|G5520)'
11826
- model: 'GALAXY On5'
11827
  - regex: '(?:SAMSUNG-)?SM-G5528'
11828
- model: 'GALAXY On5 (2016)'
11829
  - regex: '(?:SAMSUNG-)?SM-G600(?:FY|[0F])'
11830
- model: 'GALAXY On7'
11831
  - regex: '(?:SAMSUNG-)?SM-G610[0KLS]'
11832
- model: 'GALAXY On7 (2016)'
11833
  - regex: '(?:SAMSUNG-)?SM-G611[FSKL]'
11834
- model: 'GALAXY On7 Prime'
11835
  - regex: '(?:SAMSUNG-)?SM-C5000'
11836
- model: 'GALAXY C5'
11837
  - regex: '(?:SAMSUNG-)?SM-C501[08]'
11838
- model: 'GALAXY C5 Pro'
11839
  - regex: '(?:SAMSUNG-)?SM-C7000'
11840
- model: 'GALAXY C7'
11841
  - regex: '(?:SAMSUNG-)?SM-C701[08F]'
11842
- model: 'GALAXY C7 Pro'
11843
  - regex: '(?:SAMSUNG-)?SM-C710[08]'
11844
- model: 'GALAXY C8'
11845
  - regex: '(?:SAMSUNG-)?SM-C900[08FY]'
11846
- model: 'GALAXY C9 Pro'
11847
  - regex: '(?:SAMSUNG-)?SM-Z130H'
11848
- model: 'GALAXY Z1'
11849
  - regex: '(?:SAMSUNG-)?SM-Z200[FMY]'
11850
- model: 'GALAXY Z2'
11851
  - regex: '(?:SAMSUNG-)?SM-Z300H'
11852
- model: 'GALAXY Z3'
11853
  - regex: '(?:SAMSUNG-)?SM-Z400[FY]'
11854
- model: 'GALAXY Z4'
11855
  - regex: '(?:SAMSUNG-)?SM-(?:G150|G155S)(?:[);/ ]|$)'
11856
- model: 'GALAXY Folder'
11857
  - regex: '(?:SAMSUNG-)?(?:SM-G16(?:[05]0?|0N))(?:[);/ ]|$)'
11858
- model: 'GALAXY Folder 2'
11859
  - regex: '(?:SAMSUNG-)?SM-J321AZ(?:[);/ ]|$)'
11860
- model: 'GALAXY Sol'
11861
  - regex: '(?:SAMSUNG-)?SM-J326AZ(?:[);/ ]|$)'
11862
- model: 'GALAXY Sol 2'
11863
  - regex: '(?:SAMSUNG-)?SM-J336AZ(?:[);/ ]|$)'
11864
- model: 'GALAXY Sol 3'
11865
  - regex: '(?:SAMSUNG-)?SM-J727AZ(?:[);/ ]|$)'
11866
- model: 'GALAXY Halo'
11867
  - regex: '(?:SAMSUNG-)?SM-J327AZ'
11868
- model: 'GALAXY Amp Prime 2'
11869
  - regex: '(?:SAMSUNG-)?SM-J337AZ'
11870
- model: 'GALAXY Amp Prime 3 (2018)'
11871
 
11872
  # explicit phablet models
11873
  - regex: '(?:SAMSUNG-)?SM-(?:F900[0FU]|F907[BN])|SCV44'
11874
- model: 'GALAXY Fold'
11875
  device: 'phablet'
11876
  - regex: '(?:SAMSUNG-)?GT-I9060(?:[);/ ]|$)'
11877
- model: 'GALAXY Grand Neo'
11878
  device: 'phablet'
11879
  - regex: '(?:SAMSUNG-)?GT-I9063'
11880
- model: 'GALAXY Grand Neo Duos'
11881
  device: 'phablet'
11882
  - regex: '(?:SAMSUNG-)?GT-I9(?:080|128)'
11883
- model: 'GALAXY Grand'
11884
  device: 'phablet'
11885
  - regex: '(?:SAMSUNG-)?GT-I9168'
11886
- model: 'GALAXY Grand Neo+'
11887
  device: 'phablet'
11888
  - regex: '(?:SAMSUNG-)?GT-I9082'
11889
- model: 'GALAXY Grand Duos'
11890
  device: 'phablet'
11891
  - regex: '(?:SAMSUNG-)?GT-N7000'
11892
- model: 'GALAXY Note'
11893
  device: 'phablet'
11894
  - regex: '(?:SC-01G|SCL24)(?:[);/ ]|$)'
11895
- model: 'GALAXY Note Edge'
11896
  device: 'phablet'
11897
  - regex: '(?:SAMSUNG-)?SM-N935[FSLK](?:[);/ ]|$)'
11898
- model: 'GALAXY Note Fan Edition'
11899
  device: 'phablet'
11900
  - regex: '(?:SAMSUNG-)?(?:(?:GT-)?N7100|SCH-I605|SCH-N719|SCH-R950|SPH-L900)(?:[);/ ]|$)'
11901
- model: 'GALAXY Note II'
11902
  device: 'phablet'
11903
  - regex: '(?:SAMSUNG-)?GT-N7105'
11904
- model: 'GALAXY Note II LTE'
11905
  device: 'phablet'
11906
  - regex: '(?:SAMSUNG-)?SM-G710[25L]?(?:[);/ ]|$)'
11907
- model: 'GALAXY Grand 2'
11908
  device: 'phablet'
11909
  - regex: '(?:SAMSUNG-)?SM-G720(?:AX|N0|[02])(?:[);/ ]|$)'
11910
- model: 'GALAXY Grand Max'
11911
  - regex: '(?:SAMSUNG-)?SM-(?:G53(?:0[AFTYHWMP]|0[AF]Z|1[FH]|0[689]W|0MU|0BT|0R[47])|S920L)(?:[);/ ]|$)'
11912
- model: 'GALAXY Grand Prime'
11913
  device: 'phablet'
11914
  - regex: '(?:SAMSUNG-)?SM-G531(?:BT|[MY])(?:[);/ ]|$)'
11915
- model: 'GALAXY Grand Prime VE Duos'
11916
  device: 'phablet'
11917
  - regex: '(?:SAMSUNG-)?SM-G532F(?:[);/ ]|$)'
11918
- model: 'GALAXY Grand Prime Plus' # also GALAXY J2 Prime
11919
  device: 'phablet'
11920
  - regex: '(?:SAMSUNG-)?SM-G532MT(?:[);/ ]|$)'
11921
- model: 'GALAXY J2 Prime (TV)'
11922
  device: 'phablet'
11923
  - regex: '(?:SAMSUNG-)?SM-G532[MG](?:[);/ ]|$)'
11924
- model: 'GALAXY J2 Prime'
11925
  device: 'phablet'
11926
  - regex: '(?:SAMSUNG-)?SM-N7502(?:[);/ ]|$)'
11927
- model: 'GALAXY Note 3 Neo Duos'
11928
  device: 'phablet'
11929
  - regex: '(?:SAMSUNG-)?SM-N750[QL50]?'
11930
- model: 'GALAXY Note 3 Neo'
11931
  device: 'phablet'
11932
  - regex: '(?:SAMSUNG-)?SM-N9002(?:[);/ ]|$)'
11933
- model: 'GALAXY Note 3 Duos'
11934
  device: 'phablet'
11935
  - regex: '(?:SAMSUNG-)?SM-9005(?:[);/ ]|$)'
11936
- model: 'GALAXY Note 3 LTE'
11937
  device: 'phablet'
11938
  - regex: '(?:SAMSUNG-)?(?:SM-N900(?:[05689][VQ]?|[AKLPSTV]|W8)?|SCL22|SC-01F(?:[);/ ]|$))'
11939
- model: 'GALAXY Note 3'
11940
  device: 'phablet'
11941
  - regex: '(?:SAMSUNG-)?SM-(?:N910|910U)|N9100(?:[);/ ]|$)'
11942
- model: 'GALAXY Note 4'
11943
  device: 'phablet'
11944
  - regex: '(?:SAMSUNG-)?SM-N916[SKL]'
11945
- model: 'GALAXY Note 4 LTE'
11946
  device: 'phablet'
11947
  - regex: '(?:SAMSUNG-)?SM-N915'
11948
- model: 'GALAXY Note 4 Edge'
11949
  device: 'phablet'
11950
  - regex: '(?:SAMSUNG-)?SM-N920(?:[0ACGIKLSTPFVX]|R[467]|W8)'
11951
- model: 'GALAXY Note 5'
11952
  device: 'phablet'
11953
  - regex: '(?:SAMSUNG-)?SM-N9208'
11954
- model: 'GALAXY Note 5 Duos'
11955
  device: 'phablet'
11956
  - regex: '(?:SAMSUNG-)?SM-G750(?:8Q|[9AFH])'
11957
- model: 'GALAXY Mega 2'
11958
  device: 'phablet'
11959
  - regex: '(?:SAMSUNG-)?GT-I915[028]'
11960
- model: 'GALAXY Mega 5.8'
11961
  device: 'phablet'
11962
  - regex: '(?:SAMSUNG-)?GT-I920[05]'
11963
- model: 'GALAXY Mega 6.3'
11964
  device: 'phablet'
11965
  - regex: '(?:SAMSUNG-)?(?:SM-N930[VFST0P]|SCV34)'
11966
- model: 'GALAXY Note 7'
11967
  device: 'phablet'
11968
  - regex: '(?:SAMSUNG[- ])?SM-N950|SCV37|SC-01K'
11969
- model: 'GALAXY Note 8'
11970
  device: 'phablet'
11971
  - regex: '(?:SAMSUNG[- ])?(?:SM-N960|SCV40|SC-01L)'
11972
- model: 'GALAXY Note 9'
11973
  device: 'phablet'
11974
  - regex: '(?:SAMSUNG[- ])?SM-(?:N970(?:U1|W8|[089DFJKLSXUW])|N971N)'
11975
- model: 'GALAXY Note 10'
11976
  device: 'phablet'
11977
  - regex: '(?:SAMSUNG[- ])?SM-N770[FX]'
11978
- model: 'GALAXY Note 10 Lite'
11979
  device: 'phablet'
11980
  - regex: '(?:SAMSUNG[- ])?(?:SM-N975(?:[0FUXW]|U1|Xu)|SM-N976[0BVNUQ]|SC-01M|SCV45)'
11981
- model: 'GALAXY Note 10+'
11982
  device: 'phablet'
11983
  - regex: '(?:SAMSUNG[- ])?(?:SM-N980(?:F|F/DS))'
11984
- model: 'GALAXY Note 20'
11985
  device: 'phablet'
11986
  - regex: '(?:SAMSUNG[- ])?(?:SM-N981(?:B|B/DS|N|U|U1|W))'
11987
- model: 'GALAXY Note 20 5G'
11988
  device: 'phablet'
11989
  - regex: '(?:SAMSUNG[- ])?(?:SM-N985(?:F|F/DS))'
11990
- model: 'GALAXY Note 20 Ultra'
11991
  device: 'phablet'
11992
  - regex: '(?:SAMSUNG[- ])?(?:SM-N986(?:B/DS|U1|[BNWU])|SCG06)'
11993
- model: 'GALAXY Note 20 Ultra 5G'
11994
  device: 'phablet'
11995
 
11996
  - regex: '(?:SAMSUNG-)?SM-W750V'
@@ -12008,7 +12308,7 @@ Samsung:
12008
  device: 'tablet'
12009
  model: '$1'
12010
  - regex: 'SC-02C'
12011
- model: 'GALAXY S II'
12012
  - regex: '(?:SAMSUNG-)?((?:SM-[TNP]|GT-P)[a-z0-9_\-]+)'
12013
  device: 'tablet'
12014
  model: '$1'
@@ -12018,9 +12318,9 @@ Samsung:
12018
  device: 'tv'
12019
  model: 'Smart TV'
12020
  - regex: 'Galaxy ([^/;]+) Build'
12021
- model: 'GALAXY $1'
12022
  - regex: 'Galaxy ([a-z0-9]+)'
12023
- model: 'GALAXY $1'
12024
  - regex: 'SAMSUNG[\-][ ]?([a-z0-9]+[\-_][a-z0-9]+)'
12025
  model: '$1'
12026
  - regex: 'SAMSUNG;[ ]?([a-z0-9]+[\-_][a-z0-9]+)'
@@ -12064,10 +12364,12 @@ Selfix:
12064
 
12065
  # Sencor
12066
  Sencor:
12067
- regex: 'Sencor|ELEMENT[ _]?(?:7|8|9\.7|10[ _]1)(?:[ _]?V[23])?(?:[);/ ]|$)|ELEMENT[ _]?(?:P[0-9]+)(?:[);/ ]|$)'
12068
  device: 'tablet'
12069
  models:
12070
  # explicit tablet models
 
 
12071
  - regex: '(?:SENCOR[ _])?ELEMENT[ _]?7[ _]?V3'
12072
  model: 'Element 7 V3'
12073
  - regex: '(?:SENCOR[ _])?ELEMENT[ _]?7[ _]?V2[ _]BASIC'
@@ -12282,7 +12584,7 @@ SunVan:
12282
 
12283
  # SWISSMOBILITY
12284
  SWISSMOBILITY:
12285
- regex: 'SCHR9GR|ZUR722M'
12286
  device: 'smartphone'
12287
  models:
12288
  - regex: 'SCHR9GR'
@@ -12291,6 +12593,10 @@ SWISSMOBILITY:
12291
  device: 'phablet'
12292
  model: 'Z72 go'
12293
 
 
 
 
 
12294
  # Thomson
12295
  Thomson:
12296
  regex: '(?:Primo(7|8)|QM73[45]-8G|QM734-2|QM736-8G\(HD\)|8950|MID1002|5014G)(?:[);/ ]|$)|(?:Tlink|Every)[0-9]+'
@@ -12299,7 +12605,7 @@ Thomson:
12299
  # already detected as manta device
12300
  #- regex: 'MID1002'
12301
  # model: 'MID1002'
12302
- - regex : 'Primo(7|8)'
12303
  model: 'Primo $1'
12304
  - regex: 'QM734-2'
12305
  model: 'QM734-2'
@@ -12368,7 +12674,7 @@ Plum:
12368
 
12369
  # Polaroid
12370
  Polaroid:
12371
- regex: 'Polaroid|(?:PMID|MIDC)[0-9a-z]+(?:[);/ ]|$)|MID(?:1014|0714)|PRO[VG]?(?:[0-9]{3,}[a-z]*|[0-9]{2}[a-z])|(?:P(?:400[56]|4526|500[56]|502[56]|504[67]|552[56])A|PSPC(?:505|550|[MZL]20A0|K21NA)|SIGMA 5)(?:[);/ ]|$)'
12372
  device: 'smartphone'
12373
  models:
12374
  # explicit smartphone models
@@ -12421,6 +12727,9 @@ Polaroid:
12421
  - regex: '((?:PMID|MIDC)[0-9a-z]+)(?:[);/ ]|$)'
12422
  model: '$1'
12423
  device: 'tablet'
 
 
 
12424
  - regex: 'Polaroid'
12425
  model: ''
12426
  device: 'tablet'
@@ -12522,7 +12831,7 @@ Positivo:
12522
 
12523
  # Prestigio
12524
  Prestigio:
12525
- regex: '(?:PMP|PAP|PMT|PSP|PGPS)[0-9]+[a-z0-9_]+(?:[);/ ]|$)|Muze C3'
12526
  device: 'tablet'
12527
  models:
12528
  - regex: 'PMT3277_3G'
@@ -12537,6 +12846,9 @@ Prestigio:
12537
  model: 'Grace S5'
12538
  - regex: 'PMT3287_3G'
12539
  model: 'MultiPad Ranger 8.0 3G'
 
 
 
12540
  - regex: 'PMT3208[_ ]3G'
12541
  model: 'MultiPad Wize 8.0 3G'
12542
  - regex: 'PSP7546DUO([ _][A-Z]{2})?'
@@ -12657,9 +12969,13 @@ Quechua:
12657
 
12658
  # Ramos
12659
  Ramos:
12660
- regex: 'Ramos ?([^/;]+) Build'
12661
  device: 'tablet'
12662
- model: '$1'
 
 
 
 
12663
 
12664
  # Razer
12665
  Razer:
@@ -12738,7 +13054,7 @@ Sigma:
12738
 
12739
  # Spice
12740
  Spice:
12741
- regex: 'Spice'
12742
  device: 'smartphone'
12743
  models:
12744
  - regex: 'Spice[ _\-]?([^/;]+)(?:[\)]| Build)'
@@ -12748,7 +13064,7 @@ Spice:
12748
 
12749
  # Sharp (jp.sharp)
12750
  Sharp:
12751
- regex: 'SHARP|SBM|SH-?[0-9]+[a-z]?(?:[);/ ]|$)|AQUOS|(?:SH-M0[45789]|SH-M1[123]|S[357]-SH|SH-[MZ](10|01)|SH-[CL]02|SH-RM(?:1[12]|02)|[34]04SH|[45]02SH|[36]05SH|70[1246]SH|80[138]SH|90[1678]SH|50[3679]SH|SHL22|SHV4[0-8]|SHV3[1-9](?:[-_]u)?|FS80(?:1[08]|32|28|0[29])|TG-L900S|NP601SH|603SH|SHV4[035][-_]u|SW001SH|SHG0[12]|X4-SH|A002SH|DM-01J)(?:[);/ ]|$)'
12752
  device: 'smartphone'
12753
  models:
12754
  # explicit smartphone models
@@ -12814,7 +13130,7 @@ Sharp:
12814
  model: 'Aquos Ever'
12815
  - regex: 'SH-02H(?:[);/ ]|$)'
12816
  model: 'Aquos Compact'
12817
- - regex: '305SH(?:[);/ ]|$)'
12818
  model: 'Aquos Crystal'
12819
  - regex: '402SH(?:[);/ ]|$)'
12820
  model: 'Aquos Crystal X'
@@ -12848,6 +13164,8 @@ Sharp:
12848
  model: 'Aquos U'
12849
  - regex: 'TG-L900S(?:[);/ ]|$)'
12850
  model: 'Luna S'
 
 
12851
  - regex: '(?:FS8002|SHV47)(?:[);/ ]|$)'
12852
  model: 'Z2'
12853
  - regex: 'FS8009(?:[);/ ]|$)'
@@ -12860,6 +13178,8 @@ Sharp:
12860
  model: 'Star Wars'
12861
  - regex: 'SH-RM02'
12862
  model: 'Aquos SH-RM02'
 
 
12863
  - regex: 'DM-01J'
12864
  model: 'Disney Mobile'
12865
 
@@ -12999,9 +13319,11 @@ Amazon:
12999
 
13000
  # Symphony
13001
  Symphony:
13002
- regex: 'SYMPHONY[ \_]([a-z0-9]+)|roar (V20|E80)'
13003
  device: 'smartphone'
13004
  models:
 
 
13005
  - regex: 'roar V20'
13006
  model: 'Roar V20'
13007
  - regex: 'roar E80'
@@ -13053,7 +13375,7 @@ T-Mobile:
13053
 
13054
  # Tcl
13055
  TCL:
13056
- regex: 'TCL[_ -][a-z0-9]+|(?:TCL[_ -][^;/]+ Build)|(?:TCLGalaG60(?:\(9108A\))?|A502DL|T780H|5199I|7040N|5133A|5159[AJ]|5152D)(?:[);/ ]|$)'
13057
  device: 'smartphone'
13058
  models:
13059
  - regex: 'TCLGalaG60(?:\(9108A\))?(?:[);/ ]|$)'
@@ -13076,6 +13398,8 @@ TCL:
13076
  model: 'LX'
13077
  - regex: '5159[AJ](?:[);/ ]|$)'
13078
  model: 'L9'
 
 
13079
 
13080
  # Teclast
13081
  Teclast:
@@ -13171,7 +13495,7 @@ Tesco:
13171
 
13172
  # teXet
13173
  teXet:
13174
- regex: 'Texet|(NaviPad [^/;]*) Build|TM-(?:1046|1058|1057|1067|3000|3200R|3500|4003|4071|450[34]|451[30]|4377|4082R|550[83]|5010|5017|507[4-7]|5[23]77|6003|6906|702[13]|7055HD|709[69]|9747BT|9758|9751HD|9767|5513|520[410]|5505|507[13]|5581|7859|8044|9748[ _]3G|9720|7047HD[ _]3G|9757|9740|4982|4515|4083|500[3567]|5571|3204R|5016|8043|7047HD[ _]3G|8041HD|8066|705[23]|7041|8041HD|8051|8048|974[96]|973[78]W|974[170]|9743W|9750HD|7043XD|7049|7887|7037W|702[46])|TB-(771A|711A)|X-Force[\(-]?TM-5009\)?|X-Plus[\(-]?TM-5577\)?|TM_5011|X-pad (?:AIR 8|iX 7|NAVI 7.[35]|NAVI 10|SKY 8.1|STYLE 8|STYLE 10.1|HIT|LITE 7.[12]|QUAD (?:7.2|10|7)|SHINE 8.1)(?: 3G)?'
13175
  device: 'tablet'
13176
  models:
13177
  - regex: 'TM-9749'
@@ -13245,6 +13569,18 @@ teXet:
13245
  - regex: 'TM_5011'
13246
  device: 'smartphone'
13247
  model: 'X-Omega'
 
 
 
 
 
 
 
 
 
 
 
 
13248
  - regex: 'TM-5201'
13249
  device: 'smartphone'
13250
  model: 'Rock'
@@ -13260,6 +13596,9 @@ teXet:
13260
  - regex: 'TM-4982'
13261
  device: 'smartphone'
13262
  model: 'iX-Maxi'
 
 
 
13263
  - regex: 'TM-5010'
13264
  device: 'smartphone'
13265
  model: 'X-Selfie'
@@ -13278,10 +13617,13 @@ teXet:
13278
  - regex: 'X-Plus[\(-]?TM-5577\)?'
13279
  device: 'smartphone'
13280
  model: 'X-Plus'
 
 
 
13281
 
13282
  # Telefunken
13283
  Telefunken:
13284
- regex: 'TELEFUNKEN|Foxtrot|TEL-1013GIQA|TF-SP5001|(TF-MID(?:[78]02G|9705RG|7805G|1010G))|(TF-LED(?:65S75T2SU|32S39T2S|32S5[289]T2S|32S70T2S))'
13285
  device: 'tablet'
13286
  models:
13287
  - regex: 'TEL-1013GIQA'
@@ -13289,10 +13631,10 @@ Telefunken:
13289
  - regex: 'Foxtrot2'
13290
  model: 'Foxtrot 2'
13291
  device: 'smartphone'
13292
- - regex: '(?:TELEFUNKEN)?(TF-SP5001|Outdoor LTE|Foxtrot)'
13293
  model: '$1'
13294
  device: 'smartphone'
13295
- - regex: '(TF-MID(?:[78]02G|9705RG|7805G|1010G))'
13296
  model: '$1'
13297
  - regex: '(TF-LED(?:65S75T2SU|32S39T2S|32S5[289]T2S|32S70T2S))'
13298
  model: '$1'
@@ -13408,16 +13750,16 @@ Toplux:
13408
 
13409
  # Touchmate
13410
  Touchmate:
13411
- regex: 'TOUCHMATE|(TM-(?:MID1020A|MID710|MID798|MID792|MID788D|SM500N|SM410))'
13412
  device: 'smartphone'
13413
  models:
13414
- - regex: '(TM-(?:MID1020A|MID710|MID798|MID792|MID788D))'
13415
  device: 'tablet'
13416
  model: '$1'
13417
  - regex: '(TM-(?:SM500N|SM410))'
13418
- model: '$1'
13419
  - regex: 'Touchmate ([^/;]+) Build'
13420
- model: '$1'
13421
 
13422
  # TrekStor
13423
  TrekStor:
@@ -13532,7 +13874,7 @@ UTStarcom:
13532
 
13533
  # Ulefone
13534
  Ulefone:
13535
- regex: 'Ulefone|Gemini Pro|Power_[356]|S10_Pro|(?:Armor(?:(?:[ _])(?:[2367]|X[236]|6[SE]|X))?|U00[78][ _]Pro|Be[ _]X|Be[ _]Touch(?:[ _][23])?|Be[ _](?:One|Pure)(?:[ _]Lite)?)(?:[);/ ]|$)'
13536
  device: 'smartphone'
13537
  models:
13538
  - regex: 'S10_Pro'
@@ -13553,26 +13895,24 @@ Ulefone:
13553
  model: 'U007 Pro'
13554
  - regex: 'U008 Pro'
13555
  model: 'U008 Pro'
13556
- - regex: 'Armor[ _]2(?:[);/ ]|$)'
13557
- model: 'Armor 2'
13558
- - regex: 'Armor[ _]3(?:[);/ ]|$)'
13559
- model: 'Armor 3'
13560
- - regex: 'Armor[ _]7(?:[);/ ]|$)'
13561
- model: 'Armor 7'
13562
  - regex: 'Armor[ _]X([236])(?:[);/ ]|$)'
13563
  model: 'Armor X$1'
13564
  - regex: 'Armor[ _]6S(?:[);/ ]|$)'
13565
  model: 'Armor 6S'
13566
  - regex: 'Armor[ _]6E(?:[);/ ]|$)'
13567
  model: 'Armor 6E'
13568
- - regex: 'Armor[ _]6(?:[);/ ]|$)'
13569
- model: 'Armor 6'
13570
  - regex: 'Armor[ _]X5(?:[);/ ]|$)'
13571
  model: 'Armor X5'
13572
  - regex: 'Armor[ _]5S(?:[);/ ]|$)'
13573
  model: 'Armor 5S'
13574
  - regex: 'Armor[ _]X(?:[);/ ]|$)'
13575
  model: 'Armor X'
 
 
 
 
 
 
13576
  - regex: 'Armor(?:[);/ ]|$)'
13577
  model: 'Armor'
13578
  - regex: 'Gemini Pro(?:[);/ ]|$)'
@@ -13588,7 +13928,7 @@ Ulefone:
13588
 
13589
  # UMIDIGI
13590
  UMIDIGI:
13591
- regex: 'UMI(?:DIGI)?[ _]|A5_Pro'
13592
  device: 'smartphone'
13593
  models:
13594
  - regex: 'A5_Pro'
@@ -13597,6 +13937,8 @@ UMIDIGI:
13597
  model: 'Touch X'
13598
  - regex: 'UMI TOUCH'
13599
  model: 'Touch'
 
 
13600
  - regex: 'UMI_(London|Diamond(?:_X)?)'
13601
  model: '$1'
13602
  - regex: 'UMI(?:DIGI)?[ _]([^/;)]+)(?: Build|\))'
@@ -13708,12 +14050,12 @@ VK Mobile:
13708
 
13709
  # Vernee
13710
  Vernee:
13711
- regex: 'Vernee|Mars Pro|Apollo (?:Lite|X)|Thor (?:E|Plus)'
13712
  device: 'smartphone'
13713
  models:
13714
- - regex: 'Apollo Lite'
13715
  model: 'Apollo Lite'
13716
- - regex: 'Apollo X'
13717
  model: 'Apollo X'
13718
  - regex: 'Mars Pro'
13719
  model: 'Mars Pro'
@@ -13723,6 +14065,8 @@ Vernee:
13723
  model: 'Thor Plus'
13724
  - regex: 'Vernee_M5'
13725
  model: 'M5'
 
 
13726
  - regex: 'Vernee[ _-]([^;/]+) Build'
13727
  model: '$1'
13728
  - regex: 'Vernee[ _-]([a-z0-9_-]+)'
@@ -13778,9 +14122,9 @@ Verykool:
13778
  - regex: 'verykool[ _]?([^/;]+);'
13779
  model: '$1'
13780
 
13781
- # Vestel
13782
  Vestel:
13783
- regex: 'Venus[ _](GO|V[1-9]|Z[1-9]0)|V_?TAB|VP74|VT97PRO|VSP145M|VSP250[GS]|VSP355[GS]|V3_5580_Dual'
13784
  device: 'smartphone'
13785
  models:
13786
  - regex: 'VT97PRO'
@@ -13816,12 +14160,23 @@ Vestel:
13816
  model: 'Venus Z$1'
13817
  - regex: 'Venus[ _]GO'
13818
  model: 'Venus Go'
 
 
 
 
 
 
 
 
13819
 
13820
  # Videocon
13821
  Videocon:
13822
  regex: 'Videocon[_ \-]|VT75C|V502430'
13823
  device: 'smartphone'
13824
  models:
 
 
 
13825
  - regex: 'Videocon[_ \-]([a-z0-9]+)'
13826
  model: '$1'
13827
  - regex: 'VT75C(?:[);/ ]|$)'
@@ -14060,7 +14415,7 @@ WellcoM:
14060
 
14061
  # Wexler
14062
  Wexler:
14063
- regex: 'Wexler|ULTIMA 7 TWIST PLUS|TAB[ _]10Q(?:[);/ ]|$)|ZEN[ _](?:4\.5|4\.7|5)'
14064
  device: 'tablet'
14065
  models:
14066
  - regex: '(?:Wexler[ _\-\.])?ZEN[ _]4\.5(?:[);/ ]|$)'
@@ -14074,6 +14429,8 @@ Wexler:
14074
  device: 'smartphone'
14075
  - regex: '(?:Wexler[ _\-\.])?TAB[ _]10Q(?:[);/ ]|$)'
14076
  model: 'TAB 10Q'
 
 
14077
  - regex: 'Wexler[ _\-\.]([^;/]+) Build'
14078
  model: '$1'
14079
  - regex: 'Wexler[ _\-\.]([^);/]+)(?:[);/]|$)'
@@ -14083,7 +14440,7 @@ Wexler:
14083
 
14084
  # Wiko (wikomobile.com)
14085
  Wiko:
14086
- regex: '(?:WIKO[_ -])|(?:WIKO-)?CINK_[a-z0-9_]+|(?:WIKO-)?HIGHWAY_[a-z0-9_]+|(?:WIKO-)?(?:Cink([^/;]*)|Highway([^/;]*)|Iggy|Stairway|Rainbow ?(Jam|Lite|Up)?|Darkside|Darkmoon|Darkfull|Darknight|Freddy|FEVER|Jerry[2]?|Sublim|Ozzy|JIMMY|Barry|Birdy|Bloom|Getaway|Goa(?!nna)|Kite|Robby|Lenny[2-9]?|Slide|Sunset[2-9]?|Sunny[2-9]?|Tommy[2-9]?|PULP(?: Fab)?|Wax|HARRY|Ridge(?: Fab)?|U FEEL(?: Prime| Lite)?|U PULSE(?: LITE)?|View2 Go|View XL|View Prime)(?: Plus)?(?: 4G)?(?: Build|$)?|W_(?:C800|K[346]00|P200|C200SN)|WC300|W-(V7[23]0|V8[30]0|P[36]11|K420|K510)-(TVM|EEA|SUN|OPE)|WIM Lite|W-K360-TV|W-U300|U307AS|CINK PEAX 2'
14087
  device: 'smartphone'
14088
  models:
14089
  - regex: '(?:WIKO-)?Cink Peax 2'
@@ -14092,6 +14449,10 @@ Wiko:
14092
  model: 'Cink$1'
14093
  - regex: '(?:WIKO-)?CINK_([a-z0-9_]+)'
14094
  model: 'Cink $1'
 
 
 
 
14095
  - regex: '(?:Wiko-)?Highway([^/;]*) Build'
14096
  model: 'Highway$1'
14097
  - regex: '(?:WIKO-)?HIGHWAY_([a-z0-9_]+)'
@@ -14136,6 +14497,8 @@ Wiko:
14136
  model: 'Jerry Max'
14137
  - regex: 'W_K300'
14138
  model: 'Jerry 3'
 
 
14139
  - regex: '(?:WIKO-)?Jerry2'
14140
  model: 'Jerry 2'
14141
  - regex: '(?:WIKO-)?Jerry'
@@ -14168,12 +14531,16 @@ Wiko:
14168
  model: 'Sunset'
14169
  - regex: '(?:WIKO-)?Sunny3'
14170
  model: 'Sunny 3'
 
 
14171
  - regex: '(?:WIKO-)?Sunny2 Plus'
14172
  model: 'Sunny 2 Plus'
14173
  - regex: '(?:WIKO-)?Sunny2'
14174
  model: 'Sunny 2'
14175
  - regex: 'W-K360-TV'
14176
  model: 'Sunny 4 Plus'
 
 
14177
  - regex: '(?:WIKO-)?Sunny'
14178
  model: 'Sunny'
14179
  - regex: '(?:W_K600|Tommy3|W_C200SN)'
@@ -14188,6 +14555,8 @@ Wiko:
14188
  model: 'Wax'
14189
  - regex: '(?:WIKO-)?HARRY'
14190
  model: 'Harry'
 
 
14191
  - regex: '(?:WIKO-)?WIM Lite'
14192
  model: 'WIM Lite'
14193
  - regex: '(?:WIKO-)?Pulp Fab 4G'
@@ -14220,19 +14589,25 @@ Wiko:
14220
  model: 'View Lite'
14221
  - regex: 'W_C800'
14222
  model: 'View 2'
 
 
14223
  - regex: 'W_P200'
14224
  model: 'View Max'
14225
- - regex: 'W-V800-(TVM|EEA|OPE)'
 
 
14226
  model: 'View 3 Lite'
 
 
14227
  - regex: 'W-K420-EEA'
14228
  model: 'Y50'
14229
- - regex: 'W-K510-(TVM|EEA|OPE|SUN)'
14230
  model: 'Y60'
14231
- - regex: 'W-V720-(EEA|OPE)'
14232
  model: 'Y80'
14233
- - regex: 'W-P311-(EEA|OPE)'
14234
  model: 'View 3'
14235
- - regex: 'W-P611-EEA'
14236
  model: 'View 3 Pro'
14237
  - regex: 'W-V830-EEA'
14238
  model: 'View 4'
@@ -14247,7 +14622,7 @@ Wiko:
14247
 
14248
  # Wieppo
14249
  Wieppo:
14250
- regex: 'Wieppo (S6 Lite|S[658])(?:[);/ ]|$)'
14251
  device: 'smartphone'
14252
  model: '$1'
14253
 
@@ -14352,7 +14727,7 @@ POCO:
14352
 
14353
  # Xiaomi
14354
  Xiaomi:
14355
- regex: 'Xiaomi(?!/(?:Miui|Mint[ ])Browser)|Mi9 Pro 5G|(?:MI [a-z0-9]+|Mi-4c|MI-One[ _]?[a-z0-9]+|MIX(?: 2S?)?)(?:[);/ ]|$)|HM (?:[^/;]+) (?:Build|MIUI)|(?:2014501|2014011|201481[12378]|201302[23]|2013061) Build|Redmi|MI_NOTE_Pro|POCOPHONE|(?:SHARK )?(KLE|MBU)-[AH]0|SKR-[AH]0|SKW-[AH]0|POCO F1|DLT-[AH]0|MIBOX[234]([_ ]PRO)?|MiTV4[CSX]?|MiTV-(MSSP1|AXSO0)|AWM-A0|MI CC 9 Meitu Edition|MiBOX1S|MiTV4A|M2006C3(?:L[IGC]|LVG|MN?G)|M2007J1SC|M2002J9[EG]|HM2014819|WT88047|M2004J(?:7[AB]|19)C|M2003J15SC|M2007J3S[CG]|HM NOTE 1(?:LTE|W)|MI[_ ]PLAY|XIG01'
14356
  device: 'smartphone'
14357
  models:
14358
  # specific smartphone models
@@ -14392,7 +14767,7 @@ Xiaomi:
14392
  model: 'MI CC 9'
14393
  - regex: 'Xiaomi_M2001J2E_TD-LTE(?:[);/ ]|$)'
14394
  model: 'MI 10'
14395
- - regex: 'M2007J3SC(?:[);/ ]|$)'
14396
  model: 'MI 10T 5G'
14397
  - regex: 'M2007J3SG(?:[);/ ]|$)'
14398
  model: 'MI 10T Pro 5G'
@@ -14442,7 +14817,7 @@ Xiaomi:
14442
  model: 'Redmi 1'
14443
  - regex: 'M2004J7AC(?:[);/ ]|$)'
14444
  model: 'Redmi 10X'
14445
- - regex: 'M2004J19C(?:[);/ ]|$)'
14446
  model: 'Redmi 9'
14447
  - regex: 'M2006C3L[GCI](?:[);/ ]|$)'
14448
  model: 'Redmi 9A'
@@ -14486,7 +14861,7 @@ Xiaomi:
14486
  - regex: 'MiTV-MSSP1(?:[);/ ]|$)'
14487
  model: 'MiTV 4S'
14488
  device: 'tv'
14489
- - regex: '(?:MiTV-AXSO0|MiTV4(?:A|-ANSM0))(?:[);/ ]|$)'
14490
  model: 'MiTV 4A'
14491
  device: 'tv'
14492
  - regex: '(MiTV)(4[CSX]|4)(?:[);/ ]|$)'
@@ -14634,11 +15009,13 @@ Yezz:
14634
 
14635
  # Yu
14636
  Yu:
14637
- regex: '(?:YU5[05]10[A]?|YU4711|AO5510|YU5050|YU5014)(?:[);/ ]|$)'
14638
  device: 'smartphone'
14639
  models:
14640
  - regex: 'YU5010[A]?(?:[);/ ]|$)'
14641
  model: 'Yuphoria'
 
 
14642
  - regex: 'YU5050(?:[);/ ]|$)'
14643
  model: 'Yutopia'
14644
  - regex: 'AO5510(?:[);/ ]|$)'
@@ -14647,8 +15024,6 @@ Yu:
14647
  model: 'Yureka Plus'
14648
  - regex: 'YU4711(?:[);/ ]|$)'
14649
  model: 'Yunique'
14650
- - regex: 'YU4711(?:[);/ ]|$)'
14651
- model: 'Yunique'
14652
  - regex: 'YU5014(?:[);/ ]|$)'
14653
  model: 'Ace'
14654
 
@@ -15197,36 +15572,36 @@ Freetel:
15197
  regex: '(?:FTJ17A00|FTJ152[ABCD]|FT141B|FT142D_LTEXM|FT142A?|FTJ161[AB]|FTJ1[56]2E|FTJ162D|FTE161[GE])(?:[);/ ]|$)'
15198
  device: 'smartphone'
15199
  models:
15200
- - regex: 'FTJ152C'
15201
- model: 'Samurai Miyabi'
15202
- - regex: 'FTJ17A00(?:[);/ ]|$)'
15203
- model: 'Rei 2 Dual'
15204
- - regex: 'FTJ161A'
15205
- model: 'Musashi'
15206
- - regex: 'FTE161E'
15207
- model: 'Ice 2'
15208
- - regex: 'FTE161G'
15209
- model: 'Ice 2 Plus'
15210
- - regex: 'FTJ162E'
15211
- model: 'Raijin'
15212
- - regex: 'FT141B'
15213
- model: 'Nico'
15214
- - regex: 'FT142D_LTEXM'
15215
- model: 'XM'
15216
- - regex: 'FT142A?'
15217
- model: 'Priori 2'
15218
- - regex: 'FTJ152A'
15219
- model: 'Priori 3'
15220
- - regex: 'FTJ162D'
15221
- model: 'Priori 4'
15222
- - regex: 'FTJ152B'
15223
- model: 'Priori 3S LTE'
15224
- - regex: 'FTJ152D'
15225
- model: 'Samurai Kiwami'
15226
- - regex: 'FTJ161B'
15227
- model: 'Samurai Rei'
15228
- - regex: 'FTJ152E'
15229
- model: 'Katana 1'
15230
 
15231
  # Zeemi
15232
  Zeemi:
@@ -15259,8 +15634,10 @@ Zopo:
15259
  regex: 'ZOPO|(?:ZOPO[_ ])?(Flash X3|ZP[0-9]{2,}[^/;]+)(?:\)| Build)'
15260
  device: 'smartphone'
15261
  models:
15262
- - regex: '(ZOPO_C2_MOD|ZP998)(?:[);/ ]|$)'
15263
  model: 'C2 II'
 
 
15264
  - regex: '(?:ZOPO_)?ZP980[+](?:[);/ ]|$)'
15265
  model: 'ZP980+'
15266
  - regex: '(?:ZOPO_)?ZP980(?:[);/ ]|$)'
@@ -15302,7 +15679,7 @@ Zopo:
15302
 
15303
  # ZTE
15304
  ZTE:
15305
- regex: 'ZTE|AxonPhone|([a-z0-9]+)_USA_Cricket|(?:Blade (?:L110|L[2357]|L7A|S6|V[6789]|V8Q|V8 SE|V9 VITA|X7|A(310|460|465|475|520|530|602)|V580|V Ultra|Q Lux)|N9[15]8St|NX(?:403A|404H|406E|40[X2]|507J|503A|505J|506J|508J|510J|512J|511J|513J|521J|523J_V1|529J|531J|541J|5[48]9J|551J|563J|569[HJ]|573J|575J|59[157]J|60[1689]J|61[12679]J|62[79]J|65[19]J|907J)|N818S|N951[0579]|N91[38]0|N9101|N913[267]|N952[01]|N9560|N9810|N799D|[UV]9180|[UV]9815|Z(?:233V|331|5031O|559DL|6621O|667T|768G|792|81[25]|818L|82[08]|83[12359]|85[125]|851M|(557|71[67]|798|836|861|916)BL|986DL|(232|718|828)TL|(?:233|353|558|717|799|837|862|899|917|963)VL|955A|95[678]|965|97[018]|98[1237]|986U|999|936L)|Apex2|G (LTE|Lux)|Vec|Z959|V865M|Z3001S|902ZT|KIS II Max|Kis 3|K3DX-V5G|Z930L|Optus X|Blade[ _](A510|A[35] 2019-T|A6 MAX|A0622|X9)|Z3153V|Nubia Z(?:9|11)|Ctyon-A9|602ZT|MO-01[JK]|Z963U|402ZT|P545|P609|dandelion|901ZT|A001ZT|Z-01K)(?:[);/ ]|$)'
15306
  device: 'smartphone'
15307
  models:
15308
  # explicit smartphone models
@@ -15702,7 +16079,7 @@ ZTE:
15702
  model: '$1'
15703
  - regex: 'ZTE-(?:G |G-)?([a-z0-9 _]+)'
15704
  model: '$1'
15705
- - regex: 'ZTE[ _]([a-z0-9]+)'
15706
  model: '$1'
15707
 
15708
  Zuum:
@@ -15757,9 +16134,10 @@ Lemhoov:
15757
  models:
15758
  - regex: 'Lemhoov[ _-]([^/;]+) Build'
15759
  model: '$1'
15760
- # MTC
 
15761
  MTC:
15762
- regex: 'MTC[ _](968|97[82]|970|982[OT]?|1078)|(?:MTC[_ ])?SMART[ _]?(?:Race[2]?|Sprint|Run|Surf[2]?)[ _]4G|MTC975|MTC[ _]SMART[ _](?:Run|Start_2)'
15763
  device: 'smartphone'
15764
  models:
15765
  - regex: 'MTC[ _]?(97[258]|970[H]?|982[OT]?|968)'
@@ -15771,16 +16149,23 @@ MTC:
15771
  model: 'Smart Race 4G'
15772
  - regex: 'SMART[ _]Race2[ _]4G'
15773
  model: 'Smart Race 2 4G'
15774
- - regex: '(MTC_)?SMART[ _]Sprint[ _]4G'
15775
  model: 'Smart Sprint 4G'
15776
- - regex: '(MTC_)?SMART[ _]Start_2'
15777
  model: 'Smart Start 2'
 
 
 
 
15778
  - regex: 'SMART[ _]?Run(?:[ _]4G)?'
15779
  model: 'Smart Run 4G'
15780
  - regex: 'SMART[ _]Surf2[ _]4G'
15781
  model: 'Smart Surf 2 4G'
15782
  - regex: 'SMART[ _]Surf[ _]4G'
15783
  model: 'Smart Surf 4G'
 
 
 
15784
 
15785
  # MegaFon
15786
  MegaFon:
@@ -15815,18 +16200,23 @@ Inoi:
15815
 
15816
  # Vertex
15817
  Vertex:
15818
- regex: 'Lion_Dual|V709X|Baccara|Eagle[ _]4G|ImpressMAX|Impress[ _]([^;/]+)(?:Build|\))'
15819
  device: 'smartphone'
15820
  models:
15821
- - regex: '(Lion_Dual|Baccara|Eagle[ _]4G)'
15822
  model: '$1'
15823
  - regex: 'ImpressMAX(?:[);/ ]|$)'
15824
  model: 'Impress Max'
 
 
15825
  - regex: '(Impress[ _]([^;/]+))(?:Build|\))'
15826
  model: '$1'
15827
  - regex: '(V709X)'
15828
  device: 'tablet'
15829
  model: '$1'
 
 
 
15830
 
15831
  # Devices with undectable brand, but detectable model
15832
  Unknown:
@@ -15972,7 +16362,7 @@ FORME:
15972
  models:
15973
  - regex: 'FORME[ _-]F520(?:[);/ ]|$)'
15974
  model: 'Forever'
15975
- - regex: 'FORME[ _-](A37|R7S)(?:[);/ ]|$)'
15976
  model: '$1'
15977
 
15978
  # Shuttle
@@ -15993,7 +16383,7 @@ BDF:
15993
 
15994
  # Highscreen
15995
  Highscreen:
15996
- regex: 'HIGHSCREEN|(Easy[- ]Power(?:[- ]Pro)?|Pure[_ ]Power|Power Ice(?: Max)?|Easy[_ ]([SFL]|XL)(?:_Pro)?|Razar_Pro|Power Rage(?: Evo)?|Zera-S-Power|Zera[ _][UFS]|Power[ _]?Five[ _]?(?:Pro|Evo|Max|Max(?:Lite|2))|PowerFour|BOOST II(?:se)?|FestXL|Tasty|Boost3|Expanse)(?:[);/ ]|$)'
15997
  device: 'smartphone'
15998
  models:
15999
  - regex: '(Power Ice(?:[ ](?:Max|Evo))?|Power Rage(?: Evo)?|Zera[ _][UFS])(?:[);/ ]|$)'
@@ -16010,6 +16400,8 @@ Highscreen:
16010
  model: 'Power Five Max'
16011
  - regex: 'FestXL(?:[);/ ]|$)'
16012
  model: 'Fest XL'
 
 
16013
  - regex: 'PowerFour(?:[);/ ]|$)'
16014
  model: 'Power Four'
16015
  - regex: 'Pure[_ ]Power(?:[);/ ]|$)'
@@ -16028,6 +16420,10 @@ Highscreen:
16028
  model: 'Boost 2'
16029
  - regex: 'BOOST IIse(?:[);/ ]|$)'
16030
  model: 'Boost 2 SE'
 
 
 
 
16031
  - regex: 'BOOST3(?:[);/ ]|$)'
16032
  model: 'Boost 3'
16033
  - regex: 'Zera-S-Power(?:[);/ ]|$)'
@@ -16057,24 +16453,29 @@ Globex:
16057
  - regex: '(GU1011C|GU7013C|GU730C)(?:[);/ ]|$)'
16058
  model: '$1'
16059
 
16060
- # Atom
16061
  Atom:
16062
- regex: 'ATOM-(108AM)(?:[);/ ]|$)'
16063
  device: 'tv'
16064
  model: '$1'
16065
 
16066
  # Qumo
16067
  Qumo:
16068
- regex: 'QUMO[ _]?|(Vega[ _]?78[23])(?:[);/ ]|$)'
16069
  device: 'tablet'
16070
  models:
16071
  - regex: '(?:QUMO[ _]?)?Vega[ _]?(78[23]|8002)(?:[);/ ]|$)'
16072
  model: 'Vega $1'
16073
  - regex: 'Yooda(?:[);/ ]|$)'
16074
  model: 'Yooda'
 
 
16075
  - regex: '(?:QUMO)?(Sirius 101-4G 8GB Black|Altair 701 8GB Black|Altair 71 4GB Black|Altair 700[24]|Altair 706)(?:[);/ ]|$)'
16076
  model: '$1'
16077
- - regex: 'QUMO[ _]Quest[ _]?(35[34]|40[26]|45[28]|476|507|570|600)(?:[);/ ]|$)'
 
 
 
16078
  device: 'smartphone'
16079
  model: 'Quest $1'
16080
 
@@ -16099,12 +16500,12 @@ Mann:
16099
 
16100
  # Unihertz
16101
  Unihertz:
16102
- regex: '(Titan|Jelly-Pro|Atom_L)(?:[);/ ]|$)'
16103
  device: 'smartphone'
16104
  models:
16105
  - regex: '(Jelly)-(Pro)(?:[);/ ]|$)'
16106
  model: '$1 $2'
16107
- - regex: '(Titan|Atom_L)(?:[);/ ]|$)'
16108
  model: '$1'
16109
 
16110
  # Chuwi
@@ -16186,13 +16587,19 @@ Xoro:
16186
 
16187
  # Vinga
16188
  Vinga:
16189
- regex: 'VMP-(021-82|041-162|011-81)(?:[);/ ]|$)'
16190
  device: 'tv'
16191
  models:
16192
  - regex: 'VMP-021-82'
16193
  model: '021'
 
 
 
 
16194
  - regex: 'VMP-041-162'
16195
  model: '041'
 
 
16196
  - regex: 'VMP-011-81'
16197
  model: '011'
16198
 
@@ -16244,12 +16651,16 @@ Yota:
16244
 
16245
  # Mystery
16246
  Mystery:
16247
- regex: '(MYSTERY|MID-(?:123G|72[12]|7[01348]3G|753G|833G))(?:[);/ ]|$)'
16248
  device: 'tablet'
16249
  models:
16250
- - regex: 'MID-(123G|72[12]|7[01348]3G|753G|833G)(?:[);/ ]|$)'
16251
  model: 'MID-$1'
16252
 
 
 
 
 
16253
  # Ritzviva
16254
  Ritzviva:
16255
  regex: '(RITZVIVA[_ ]S500C)(?:[);/ ]|$)'
@@ -16312,10 +16723,10 @@ Spectrum:
16312
 
16313
  # Kivi
16314
  Kivi:
16315
- regex: '(?:24H600G[RU]|24FR50WU|24HK30B|32HR55GU|4[39]UP50GU|40UR50G[RU]|40U600G[RU]|55UP50GU|50U600GU|55UR50GR|40FK30G|40FR50BR|43UK35G|50FK30G|50UK35G|32HR50GR|55UC30G|32HK30G|40FK30G|32HR50GU|43UK30G|32FR50(?:WR|BU)|32FK3[02]G)(?:_-Ver0[0-9])?(?:[);/ ]|$)'
16316
  device: 'tv'
16317
  models:
16318
- - regex: '(24H600G[RU]|24FR50WU|24HK30B|32HR55GU|4[39]UP50GU|40UR50G[RU]|40U600G[RU]|55UP50GU|50U600GU|55UR50GR|40FK30G|40FR50BR|43UK35G|50FK30G|50UK35G|32HR50GR|32FR50(?:WR|BU)|32FK3[02]G)(?:[);/ ]|$)'
16319
  model: '$1'
16320
  - regex: '(55UC30G|40FK30G|43UK30G|32HR50G[RU]|32HK30G|32FK32G)_-Ver0([0-9])(?:[);/ ]|$)'
16321
  model: '$1 v$2'
@@ -16340,9 +16751,9 @@ Kanji:
16340
 
16341
  #Kaiomy
16342
  Kaiomy:
16343
- regex: 'KaiCloud[ ]?(7[48]4|942)(?:[);/ ]|$)'
16344
- device: 'tablet'
16345
- model: 'KaiCloud $1'
16346
 
16347
  # National
16348
  National:
@@ -16352,11 +16763,13 @@ National:
16352
 
16353
  # Vsun
16354
  Vsun:
16355
- regex: 'VSUN (ILLUSION|RACE|V9)(?:[);/ ]|$)'
16356
  device: 'smartphone'
16357
  models:
16358
  - regex: 'ILLUSION(?:[);/ ]|$)'
16359
  model: 'Illusion'
 
 
16360
  - regex: 'RACE(?:[);/ ]|$)'
16361
  model: 'Race'
16362
  - regex: '(V9)(?:[);/ ]|$)'
@@ -16370,7 +16783,7 @@ Shift Phones:
16370
 
16371
  # RugGear
16372
  RugGear:
16373
- regex: '(RugGear|RG(?:310|500|65[05]|702|710|850))(?:[);/ ]|$)'
16374
  device: 'smartphone'
16375
  models:
16376
  - regex: '(RG[0-9]+)(?:[);/ ]|$)'
@@ -16381,7 +16794,7 @@ Aligator:
16381
  regex: 'ALIGATOR[_ ]'
16382
  device: 'smartphone'
16383
  models:
16384
- - regex: 'ALIGATOR[ _](S4080|S50(?:6[56]|[678]0)|RX510|S6500|RX710|RX800)(?:[);/ ]|$)'
16385
  model: '$1'
16386
 
16387
  # Maxcom
@@ -16430,7 +16843,7 @@ Soyes:
16430
 
16431
  # Zidoo
16432
  Zidoo:
16433
- regex: 'ZIDOO[ _](H6 Pro|X6 Pro|X9S|Z10|X[158])(?:[);/ ]|$)'
16434
  device: 'tv'
16435
  model: '$1'
16436
 
@@ -16442,7 +16855,7 @@ Zfiner:
16442
 
16443
  # iGet
16444
  iGet:
16445
- regex: 'SMART_(G10[12]|G71|G81[H]?)(?:[);/ ]|$)'
16446
  device: 'tablet'
16447
  model: 'Smart $1'
16448
 
@@ -16536,13 +16949,19 @@ Wigor:
16536
 
16537
  # NEXON
16538
  NEXON:
16539
- regex: 'NEXON (X[19])(?:[);/ ]|$)'
16540
- device: 'tv'
16541
- model: '$1'
16542
 
16543
  # ONN
16544
  ONN:
16545
- regex: '(ONA19TB00[27])(?:[);/ ]|$)'
 
 
 
 
 
 
16546
  device: 'tablet'
16547
  model: '$1'
16548
 
@@ -16742,13 +17161,13 @@ Contixo:
16742
 
16743
  # E-Ceros
16744
  'E-Ceros':
16745
- regex: '(?:CT9716(?:-B)?)(?:[);/ ]|$)'
16746
- device: 'tablet'
16747
- models:
16748
- - regex: 'CT9716(?:[);/ ]|$)'
16749
- model: 'Revolution'
16750
- - regex: 'CT9716-B(?:[);/ ]|$)'
16751
- model: 'Revolution HD'
16752
 
16753
  # How (how.com.br)
16754
  How:
@@ -16769,6 +17188,8 @@ Multilaser:
16769
  models:
16770
  - regex: 'Multilaser[ _]G[_ ]Pro(?:[);/ ]|$)'
16771
  model: 'G Pro'
 
 
16772
  - regex: 'Multilaser[ _]G[_ ]Max(?:[);/ ]|$)'
16773
  model: 'G Max'
16774
  - regex: 'Multilaser[ _]G(?:[);/ ]|$)'
@@ -16834,7 +17255,7 @@ Positivo BGH:
16834
 
16835
  # Maxtron
16836
  Maxtron:
16837
- regex: 'Maxtron[ _-](V[327]|S8)(?:[);/ ]|$)'
16838
  device: 'smartphone'
16839
  model: '$1'
16840
 
@@ -16927,13 +17348,13 @@ Tone:
16927
 
16928
  # AT&T
16929
  AT&T:
16930
- regex: '(?:U304AA|QS5509A)(?:[);/ ]|$)'
16931
- device: 'smartphone'
16932
- models:
16933
- - regex: 'U304AA(?:[);/ ]|$)'
16934
- model: 'Radiant Core'
16935
- - regex: 'QS5509A(?:[);/ ]|$)'
16936
- model: 'Axia'
16937
 
16938
  # BIHEE
16939
  BIHEE:
@@ -17009,7 +17430,7 @@ Vipro:
17009
 
17010
  # OzoneHD
17011
  OzoneHD:
17012
- regex: 'OzoneHD[ _](T2 WiFi|4K(?: TV)?)(?:[);/ ]|$)'
17013
  device: 'tv'
17014
  model: '$1'
17015
 
@@ -17095,7 +17516,7 @@ Wortmann:
17095
 
17096
  # BB Mobile
17097
  BB Mobile:
17098
- regex: 'Techno[_ ](TQ863Q|X595BT|S700BF|I700AJ|10.1 LTE TQ060X|7.0 LTE TQ763I)(?:[);/ ]|$)'
17099
  device: 'tablet'
17100
  models:
17101
  - regex: 'Techno[_ ]S700BF(?:[);/ ]|$)'
@@ -17106,10 +17527,17 @@ BB Mobile:
17106
  model: 'Techno 8.0" Poplar LTE TQ863Q'
17107
  - regex: 'Techno[_ ]I700AJ(?:[);/ ]|$)'
17108
  model: 'Techno 7.0" Mozg LTE I700AJ'
 
 
 
 
17109
  - regex: 'Techno[_ ]7.0 LTE TQ763I(?:[);/ ]|$)'
17110
  model: 'Techno 7.0" Kalash LTE TQ763I'
17111
 
17112
- - regex: 'Techno[_ ](X595BT)(?:[);/ ]|$)'
 
 
 
17113
  device: 'smartphone'
17114
  model: 'Techno Spark 3G X595BT'
17115
 
@@ -17134,14 +17562,14 @@ Tele2:
17134
  regex: 'Tele2[ _](?:Mi[dn]i[ _][12][\._][10]|Mi[dn]i|Maxi(?:[ _](?:Plus|LTE))?)(?:[);/ ]|$)'
17135
  device: 'smartphone'
17136
  models:
17137
- - regex: 'Tele2[ _]Mini[ _]1[_\.]1(?:[);/ ]|$)'
17138
- model: 'Mini 1.1'
17139
- - regex: 'Tele2[ _]Midi[ _]2[_\.]0(?:[);/ ]|$)'
17140
- model: 'Midi 2.0'
17141
- - regex: 'Tele2[ _](Maxi(?:[_ ](?:Plus|LTE))?)(?:[);/ ]|$)'
17142
- model: '$1'
17143
- - regex: 'Tele2[ _](Midi[ _]1\.1|Mi[dn]i)(?:[);/ ]|$)'
17144
- model: '$1'
17145
 
17146
  # Alfawise
17147
  Alfawise:
@@ -17151,9 +17579,14 @@ Alfawise:
17151
 
17152
  # Klipad
17153
  Klipad:
17154
- regex: '(KL-V905)(?:[);/ ]|$)'
17155
  device: 'smartphone'
17156
- model: '$1'
 
 
 
 
 
17157
 
17158
  # SQOOL (sqool.fr)
17159
  SQOOL:
@@ -17169,7 +17602,7 @@ TurboKids:
17169
 
17170
  # Jinga
17171
  Jinga:
17172
- regex: 'Jinga[-_ ]|(?:Optim4G|PassPlus|PicassoNote|Hotz[_ ]M1)(?:[);/ ]|$)'
17173
  device: 'smartphone'
17174
  models:
17175
  - regex: 'Optim4G(?:[);/ ]|$)'
@@ -17178,6 +17611,12 @@ Jinga:
17178
  model: 'Hotz M1'
17179
  - regex: 'PassPlus(?:[);/ ]|$)'
17180
  model: 'Pass Plus'
 
 
 
 
 
 
17181
  - regex: 'PicassoNote(?:[);/ ]|$)'
17182
  model: 'Picasso Note'
17183
  - regex: 'Jinga Iron(?:[);/ ]|$)'
@@ -17190,8 +17629,8 @@ Jinga:
17190
  model: 'Trezor S1 Plus'
17191
  - regex: 'JINGA_IGO_L2(?:[);/ ]|$)'
17192
  model: 'IGO L2'
17193
- - regex: 'JINGA_IGO_M1(?:[);/ ]|$)'
17194
- model: 'IGO M1'
17195
  - regex: 'Jinga Trezor S1 Plus(?:[);/ ]|$)'
17196
  model: 'Trezor S1 Plus'
17197
 
@@ -17227,11 +17666,11 @@ Oyyu:
17227
 
17228
  # Primux
17229
  Primux:
17230
- regex: 'Primux'
17231
- device: 'smartphone'
17232
- models:
17233
- - regex: 'PrimuxDelta6(?:[);/ ]|$)'
17234
- model: 'Delta 6'
17235
 
17236
  # iMars
17237
  iMars:
@@ -17251,6 +17690,16 @@ Logic:
17251
  - regex: 'LOGIC[_ ](X[13]|X4M|L5D|X5[AFT]|X60G)(?:[);/ ]|$)'
17252
  model: '$1'
17253
 
 
 
 
 
 
 
 
 
 
 
17254
  # Cloudfone
17255
  Cloudfone:
17256
  regex: 'Thrill (?:Boost[ ]?(2|3)?|Snap|Access)(?:[);/ ]|$)'
@@ -17279,15 +17728,16 @@ Vsmart:
17279
 
17280
  # MiXzo
17281
  MiXzo:
17282
- regex: '(?:MiXzo )?(?:ME1030|MX1037|MX1041)[ _][34]G(?:[);/ ]|$)'
17283
  device: 'tablet'
17284
  models:
17285
- - regex: 'MiXzo ME1030[_ ]3G(?:[);/ ]|$)'
17286
- model: 'ME1030 3G'
17287
- - regex: '(?:MiXzo )?MX1041[ _]4G(?:[);/ ]|$)'
17288
- model: 'MX1041 4G'
17289
- - regex: '(?:MiXzo )?MX1037[ _]4G(?:[);/ ]|$)'
17290
- model: 'MX1037 4G'
 
17291
 
17292
  # Openbox
17293
  Openbox:
@@ -17354,8 +17804,8 @@ i-Cherry:
17354
  regex: 'iCherry_?'
17355
  device: 'smartphone'
17356
  models:
17357
- - regex: 'iCherry[ _]C(25[125]|21[16]|110|121|22[079]|23[03])(?:[);/ ]|$)'
17358
- model: 'C$1'
17359
 
17360
  # NextTab
17361
  NextTab:
@@ -17365,9 +17815,9 @@ NextTab:
17365
 
17366
  # Time 2
17367
  Time2:
17368
- regex: '(TC1050G)(?:[);/ ]|$)'
17369
- device: 'tablet'
17370
- model: '$1 10.1"'
17371
 
17372
  # Sunstech
17373
  Sunstech:
@@ -17395,7 +17845,7 @@ Dolamee:
17395
 
17396
  # INVIN
17397
  Invin:
17398
- regex: 'INVIN[ _-](X[24]|KM6)(?:[);/ ]|$)'
17399
  device: 'tv'
17400
  model: '$1'
17401
 
@@ -17459,9 +17909,19 @@ Beelink:
17459
 
17460
  # MAXVI
17461
  MAXVI:
17462
- regex: 'MAXVI[ _](MS401)(?:[);/ ]|$)'
17463
  device: 'smartphone'
17464
- model: '$1'
 
 
 
 
 
 
 
 
 
 
17465
 
17466
  # meanIT (meanit.hr)
17467
  meanIT:
@@ -17608,3 +18068,169 @@ Iris:
17608
  model: 'Vox Pop Plus'
17609
  - regex: 'VOX POP Pro'
17610
  model: 'Vox Pop Pro'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
176
  model: 'Lumia 435'
177
  - regex: 'RM-1031|Lumia 532'
178
  model: 'Lumia 532'
179
+ - regex: 'Lumia 535 Dual SIM'
180
+ model: 'Lumia 535 Dual SIM'
181
  - regex: 'RM-109[02]|RM-1089|Lumia 535'
182
  model: 'Lumia 535'
183
  - regex: 'RM-1141|Lumia 540'
186
  model: 'Lumia 550'
187
  - regex: 'RM-1010'
188
  model: 'Lumia 638'
189
+ - regex: 'Lumia 640 XL LTE'
190
+ model: 'Lumia 640 XL LTE'
191
+ device: 'phablet'
192
  - regex: 'RM-106[57]|RM-1096|Lumia 640 XL'
193
  model: 'Lumia 640 XL'
194
  device: 'phablet'
195
+ - regex: 'Lumia 640 LTE Dual SIM'
196
+ model: 'Lumia 640 LTE Dual SIM'
197
+ - regex: 'Lumia 640 LTE'
198
+ model: 'Lumia 640 LTE'
199
+ - regex: 'Lumia 640 Dual SIM'
200
+ model: 'Lumia 640 Dual SIM'
201
  - regex: 'RM-1109|RM-1113|RM-107[23467]|Lumia 640'
202
  model: 'Lumia 640'
203
  - regex: 'RM-1154|Lumia 650'
206
  model: 'Lumia 650 SS'
207
  - regex: 'Lumia 850'
208
  model: 'Lumia 850'
209
+ - regex: 'Lumia 950 XL Dual SIM'
210
+ model: 'Lumia 950 XL Dual SIM'
211
+ device: 'phablet'
212
  - regex: 'Lumia 950 XL'
213
  model: 'Lumia 950 XL'
214
  device: 'phablet'
215
+ - regex: 'Lumia 950 Dual SIM'
216
+ model: 'Lumia 950 Dual SIM'
217
  - regex: 'Lumia 950'
218
  model: 'Lumia 950'
219
  - regex: 'RM-994|Lumia 1320'
706
  model: 'Bolt Selfie'
707
  - regex: 'Q426'
708
  model: 'Canvas Mega 2'
709
+
710
+ - regex: 'MicroMax(?:[ \-\_])?(X291|X246|X252|X458|X312)'
711
+ model: '$1'
712
+ device: 'feature phone'
713
+
714
  - regex: 'MicroMax(?:[ \-\_])?(P[a-z0-9]+)'
715
  model: '$1'
716
  device: 'tablet'
832
  model: 'A510 Jeans 4G'
833
  - regex: 'A509_Jeans'
834
  model: 'A509 Jeans'
835
+ - regex: 'BRAVIS NEO'
836
+ model: 'A401 Neo'
837
  - regex: 'N1_550_Cruiser'
838
  model: 'N1-550 Cruiser'
839
  - regex: 'BRAVIS OMEGA'
842
  model: 'Biz'
843
  - regex: 'BRAVIS POWER'
844
  model: 'Power'
845
+ - regex: 'BRAVIS[ _]SPARK'
846
+ model: 'Spark'
847
 
848
  - regex: 'BRAVIS[ _]SLIM[ _]3G'
849
  model: 'Slim 3G'
867
 
868
  # Acer
869
  Acer:
870
+ regex: 'acer|(?<!Satellite |ZTE BLADE |ImSmart |ERGO |X-Style Tab )a(?:101|110|2[10]0|211|50[10]|51[10]|70[10])(?:[);/ ]|$)|Android.*V3[67]0(?:[);/ ]|$)|Android.*Z1[23456]0 Build|Android.*Z5\d{2} Build|Android.*T0[234678] Build|Android.*S55(?:[);/ ]|$)|(?:A1-(713(HD)?|7[23]4|830|841|840FHD|81[01])|A3-A[1234][01]|B1-(7[1235-8][01](HD)?|7[23]3|7A0|8[1235]0|A71|860A)|TPA60W|B3-(A[125]0|A3[02]|A40FHD)|E39)(?:[);/ ]|$)|S5[12]0 Build|(DA[0-9]+HQ?L|Aspire (?:V5-121|XC-704G|V5-573G)|Chromebook 14 \(CB3-431\)|Predator G9-793|GT-810|B1-870|B3-A4[02]|B3-A50FHD)(?:[);/ ]|$)'
871
  device: 'smartphone'
872
  models:
873
  # smart displays
885
  - regex: 'A1-81[01]'
886
  model: 'Iconia A'
887
  device: 'tablet'
888
+ - regex: 'TPA60W'
889
+ model: 'TPA60W'
890
+ device: 'tablet'
891
  - regex: 'A1-84(1|0FHD)'
892
  model: 'Iconia Tab 8'
893
  device: 'tablet'
918
  - regex: 'B1-8[123567]0'
919
  model: 'Iconia One 8'
920
  device: 'tablet'
921
+ - regex: 'B3-A([125]0|3[02]|[45]0FHD|4[02])'
922
  model: 'Iconia One 10'
923
  device: 'tablet'
924
  - regex: 'A101'
1002
  - regex: '(?:Acer )?(Chromebook 14)'
1003
  model: '$1'
1004
  device: 'desktop'
1005
+ - regex: '(Aspire (?:V5-121|XC-704G|V5-573G))'
1006
  model: '$1'
1007
  device: 'desktop'
1008
  - regex: '(Predator G9-793)'
1116
  - regex: '70 ST7001RW'
1117
  model: '70'
1118
 
1119
+ # Alcatel (alcatelmobile.com)
1120
  Alcatel:
1121
+ regex: 'Alcatel|Alc(?!or )[a-z0-9]+|One[ _]?Touch|idol3|TIMXL|(?:(?:4003[AJ]|4009[ADEFIKMSX]|4013[DEJKMX]|4014[ADEKMX]|4015[ADNTX]|4016[ADX]|4017[ADEFSX]|4018[ADEFMX]|4024[EDX]|4027[ADNX]|4028[AEJS]|4032[ADEX]|4034L|4034[ADEFGX]|4035[ADXY]|4045[ADEX]|4047[ADFGNX]|4049[DEGMX]|4060[SW]|A466BG|A621BL|4114E|5001[ADJTU]|5002[ADF]|5003[ADG]|5006D|5007[AU]|5008[DUY]|5009[AD]|5010[DEGSUX]|5011A|5012[DFG]|5015[ADEX]|5016[AXJ]|5017[ABDEOX]|5019D|5022[EDX]|5023[EF]|5024[ADJF]|5025[DEG]|5026[ADJ]|5027B|5028[AYD]|5029[EYD]|5030D|5032W|5033[AEFXDJGMOTXY]|5034D|5036D|5038[ADEX]|5039[D]|5041[CD]|5042[ADEFGWXT]|5044[ADGIKOPSTY]|5045[ADFGIJTXY]|5046[ADGIJSTUY]|5047[DIUY]|5048[AYUI]|5049[EGSWZ]|5050[ASXY]|5051[ADEJMTWX]|5052[ADY]|5053[AKY]|5054[ADNSTWX]|5056[ADEGIJMNTUWX]|5057M|5058[AIY]|5059[ADXYZIST]|5060D|5061[KU]|5065[ADNWX]|5070D|5080[ADFQUX]|5085[ABCDGHIJNOQY]|5086[ADY]|5090[AIY]|5095[IKY]|5098[OS]|5099[ADYUI]|5116J|5145A|6016[ADEX]|6036[AXY]|6037[BKY]|6039[AHJKY]|6042D|6043[AD]|6044D|6045[BFIKOYX]|6050[AFY]|6055[ABDHIKPUYZ]|6058[ADX]|6060S|6062W|6070K|7040[ADEFKRT]|7041[DX]|7042A|7043[AEKY]|7044[AX]|7045Y|7048[ASWX]|7053D|7055A|7070X|8030Y|8050[DEGX]|8063|8088[XQ]|9001[DIX]|9002X|9003[AX]|9024O|9005X|9026X|9007[ATX]|9008[ADIJNTUX]|9009G|9010X|9020A|9022X|9027[FTWX]|9203A|A(?:464BG|570BL|50[13]DL|57[17]VL|574BL)|I213|I216X)(?:_(?:EEA|RU))?)(?:[);/ ]|$)'
1122
  device: 'smartphone'
1123
  models:
1124
  - regex: '5022[EDX]|5070D'
1187
  model: 'One Touch Astro'
1188
  - regex: '5027B'
1189
  model: 'One Touch Dawn'
1190
+ - regex: '5024[ADF]|5028Y'
1191
  model: '1S'
1192
  - regex: '5002[AD]'
1193
  model: '1B (2020)'
1199
  model: 'One Touch Fierce 2'
1200
  - regex: '5056[NW]'
1201
  model: 'One Touch Fierce 4'
1202
+ - regex: '5054N'
1203
  model: 'One Touch Fierce XL'
1204
+ - regex: '6042D'
1205
+ model: 'One Touch Flash'
1206
  - regex: '6016[AX]'
1207
  model: 'One Touch Idol 2 mini'
1208
  - regex: '6016[DE]'
1272
  - regex: '9007[TX]'
1273
  model: 'One Touch Pixi 3 7" 4G'
1274
  device: 'tablet'
1275
+ - regex: '9009G'
1276
+ model: '1T'
1277
+ device: 'tablet'
1278
  - regex: '9022X'
1279
  model: 'One Touch Pixi 3 8"'
1280
  device: 'phablet'
1334
  model: 'A30 Fierce'
1335
  - regex: '5085[GO]'
1336
  model: 'A50'
1337
+ - regex: '5048[AYUI]'
1338
  model: '3X (2019)'
1339
  - regex: '5049W'
1340
  model: 'Revvl'
1432
  model: '1V (2020)'
1433
  - regex: '5003[ADG]'
1434
  model: '1C (2019)'
1435
+ - regex: '5006D'
1436
+ model: '3C (2019)'
1437
  - regex: '5024J'
1438
  model: '1S'
1439
+ - regex: '5028[AD]'
1440
  model: '1S (2020)'
1441
+ - regex: '5030D'
1442
+ model: '1SE (2020)'
1443
  - regex: '5001[ADJTU]'
1444
  model: '1V'
1445
  - regex: '5059[ADXYZIT]'
1453
  model: '3'
1454
  - regex: '5029E'
1455
  model: '3 (2020)'
1456
+ - regex: '5029[DY]'
1457
  model: '3L (2020)'
1458
  - regex: '5032W|5099[ADYUI]'
1459
  model: '3V'
1464
  device: 'phablet'
1465
  - regex: '5058[AIY]'
1466
  model: '3X'
1467
+ - regex: '5061[KU]'
1468
+ model: '3X (2020)'
1469
  - regex: '5086[ADY]'
1470
  model: '5'
1471
  - regex: '6062W'
1490
 
1491
  # Allview
1492
  Allview:
1493
+ regex: 'Allview|A4You|A5_(?:Easy(?:_TM)?|Ready(?:_TM)?|Quad|Quad_Plus_TM)|A[56789]_Lite|A5Smiley|A6_Duo|A10_Lite_2019|A10_Plus|AX2_Frenzy|AX4Nano|AX5NanoQ|C6_Duo|E[23]_Living|E3_(?:Jump|Sign)|E4_Lite|M9_Connect|P(?:43_Easy|[5689]_Energy|6_Energy_Lite|[68]_Energy_Mini(?:_TM)?|(41|[458])_eMagic(?:_TM)?|[589](?:_)?Life(?:_TM)?|[567]_Lite(?:_TM)?|6_plus|[45678]_Pro|7_Seon|10_Life|10_Max|10_Style|7_Xtreme|6_Qmax|4_Quad)|V(?:[134]_Viper|1_Viper_I|2_Viper_(?:E|I|S|X|X_plus|Xe))|X4_Soul_Vision|X(?:[12346]_Soul_Xtreme|[12345]_Soul|3_Soul_Lite|[23456]_Soul_Mini(?:_TM)?|4_Soul_Mini_S(?:_TM)?|[2345]_Soul_Style(?:_TM)?|2_Soul_Style_Plus|2_Twin)|Viva_(H801|100[13]G|H1001_LTE|C701|i701G)'
1494
  device: 'smartphone'
1495
  models:
1496
  - regex: 'A4You'
1563
  model: 'V2 Viper X Plus'
1564
  - regex: 'V2_Viper_(E|I|S|X(?:e)?)'
1565
  model: 'V2 Viper $1'
1566
+ - regex: 'X4_Soul_Vision'
1567
+ model: 'X4 Soul Vision'
1568
+ - regex: 'X([1246])_Soul_Xtreme'
1569
  model: 'X$1 Soul Xtreme'
1570
  - regex: 'X4_Soul_Infinity_(L|N|S|Z)'
1571
  model: 'X4 Soul Infinity $1'
1581
  model: 'X$1 Soul Pro'
1582
  - regex: 'X2_Soul_Style_Plus'
1583
  model: 'X2 Soul Style Plus'
1584
+ - regex: 'X([2345])_Soul_Style(?:_TM)?'
1585
  model: 'X$1 Soul Style'
1586
  - regex: 'X([12345])_Soul'
1587
  model: 'X$1 Soul'
1628
  - regex: 'Allview3SpeedQuad'
1629
  device: 'tablet'
1630
  model: 'Alldro 3 Speed Quad'
1631
+ - regex: 'Viva_(H801|100[13]G|H1001_LTE|C701|i701G)'
1632
  device: 'tablet'
1633
  model: 'Viva $1'
1634
  - regex: 'ALLVIEW ?SPEEDI'
1657
  regex: '(?:QUAD-CORE A64 p3|ZY-07B)(?:[);/ ]|$)'
1658
  device: 'tablet'
1659
  models:
1660
+ - regex: 'QUAD-CORE A64 p3'
1661
+ model: 'A64 QUAD-CORE p3'
1662
+ - regex: 'ZY-07B'
1663
+ model: 'ZY-07B'
1664
 
1665
  # altron
1666
  altron:
1724
 
1725
  # Ainol
1726
  Ainol:
1727
+ regex: 'Numy|novo[0-9]|Novo 10 Hero|AX10PRO|NUMY3GAX9|NOVO10 Spark|Aurora-II'
1728
  device: 'tablet'
1729
  models:
1730
  - regex: 'Numy 3G AX1'
1743
  model: 'Numy 3G AX9'
1744
  - regex: '(Novo 10 Hero QuadCore)'
1745
  model: '$1'
1746
+ - regex: 'Aurora-II'
1747
+ model: 'Novo 7 Aurora II'
1748
  - regex: 'Novo7 Flame(?:[);/ ]|$)'
1749
  model: 'Novo 7 Flame'
1750
  - regex: 'NOVO7(?:[);/ ]|$)'
1941
 
1942
  # Ark (Ark Electronic Technology)
1943
  Ark:
1944
+ regex: '(ARK[_ -])?Benefit[_ -]([^/;]*)(?: Build|\))|EDGE A5HD|Elf_S8|ICON (R40\+|R45)|Impulse[ _](P[12])|Wizard_[12](?:[);/ ]|$)'
1945
  device: 'smartphone'
1946
  models:
1947
  - regex: '(?:ARK[_ -])?Benefit[_ -]([^/;]*)(?: Build|\))'
1954
  model: 'Edge $1'
1955
  - regex: 'ICON (R40\+|R45)'
1956
  model: 'Icon $1'
1957
+ - regex: 'Wizard_([12])'
1958
+ model: 'Wizard $1'
1959
  - regex: 'Elf_S8(?:[);/ ]|$)'
1960
  model: 'Elf S8'
1961
 
1973
 
1974
  # Asus
1975
  Asus:
1976
+ regex: 'Asus|Transformer|ZenFone Max|TF300T|Slider SL101|PadFone|ME302(?:C|KL)|ME301T|ME371MG|ME17(?:1|2V|3X)|(?:K0[01][0-9a-z]|P(?:00[18ACIL]|01[MTVWYZ]|01MA|01T_1|02[13478])(?: Build|\))|X015D|X018D|X003|X00[7ABT]D|Z00D|Z00[MTY]D|Z01[7FGHKMR]D)(?:[);/ ]|$)|G55[023]KL|ZB(631|602|633|55[135]|50[01])KL|ZC(55[134]|520|600)KL|ZA550KL|ZE(520|620|55[2345])KL|ZD55[23]KL|ZS661KS|ZS(6[0236]0|55[10])KL|ZB(500KG|601KL)|MeMo Pad FHD 10 LTE|Z00[SV]D'
1977
  device: 'smartphone'
1978
  models:
1979
  # explicit tablet models
2108
  model: 'ZenFone Max Pro M1'
2109
  - regex: '(?:ASUS_)?(X01([AB]D)|ZB633KL)(?:[);/ ]|$)'
2110
  model: 'ZenFone Max M2'
2111
+ - regex: '(?:ASUS_)?(?:Z00[AD]|Z008D|Z008|Z00AD[AB]?|ZE551ML)'
2112
  model: 'ZenFone 2'
2113
  - regex: '(?:ASUS_)?(?:ZenFone 2E)'
2114
  model: 'ZenFone 2E'
2152
  model: 'ZenFone Go Life'
2153
  - regex: '(?:ASUS_)?G550KL'
2154
  model: 'ZenFone Go TV'
2155
+ - regex: '(?:ASUS_)?Z00[SV]D' #ZC500TG
2156
  model: 'ZenFone Go'
2157
  - regex: '(?:ASUS_)?(X00[23])'
2158
  model: 'ZenFone Pegasus'
2202
  model: 'ROG Phone'
2203
  - regex: '(?:ASUS_)?(?:I001D[ABCE]?|ZS660KL)'
2204
  model: 'ROG Phone 2'
2205
+ - regex: '(?:ASUS_)?(?:I003DD?|ZS661KS)'
2206
  model: 'ROG Phone 3'
2207
 
2208
  # general detections
2215
  - regex: '(?:Asus|Transformer) ((?:Pad |Prime )?TF[0-9a-z]+)'
2216
  device: 'tablet'
2217
  model: 'Transformer $1'
2218
+ - regex: 'Chromebook Flip (C100PA|C302)'
2219
+ device: 'desktop'
2220
+ model: 'Chromebook Flip $1'
2221
 
2222
  # Audiovox
2223
  Audiovox:
2309
 
2310
  # Blu
2311
  Blu:
2312
+ regex: 'BLU[ _]|(?:blu|Dash)[ _]([^/;)]+)(?: Build|[;)])|Studio (5.0K|5.5|View XL|Mega|C 8\+8|C HD|C|G|Selfie LTE|Touch|M HD|M5 Plus|J[1258]|X|X8 HD)|Advance (4.0 ?[LM]|5.[02](?: HD)?|A4|L5)|ENERGY (DIAMOND|XL)|LIFE XL|B110DL|Dash (?:X[2L]|L3)|PURE XL|Life One X2|GRAND (?:5.5 HD|XL LTE)|R1 (HD|PLUS)|Tank Xtreme 5.0|Tank Xtreme Pro|STUDIO SELFIE|Touchbook M7 Pro'
2313
+ device: 'smartphone'
2314
+ models:
2315
+ - regex: 'Advance (4.0 ?[LM]|4.0|5.[02](?: HD)?|A4|L5)'
2316
+ model: 'Advance $1'
2317
+ - regex: 'Studio (5.0 C|5.5|View XL|Mega|C 8\+8|C HD|C|G|Touch|M HD|M5 Plus|J[1258]|X|X8 HD)'
2318
+ model: 'Studio $1'
2319
+ - regex: 'Studio (5.0)K'
2320
+ model: 'Studio $1 K'
2321
+ - regex: 'STUDIO SELFIE LTE'
2322
+ model: 'Studio Selfie LTE'
2323
+ - regex: 'STUDIO ONE'
2324
+ model: 'Studio One'
2325
+ - regex: 'STUDIO SELFIE ([23]|LTE)'
2326
+ model: 'Studio Selfie $1'
2327
+ - regex: 'STUDIO SELFIE'
2328
+ model: 'Studio Selfie'
2329
+ - regex: 'BLU_STUDIO_XL'
2330
+ model: 'Studio XL'
2331
+ - regex: 'ENERGY DIAMOND'
2332
+ model: 'Energy Diamond'
2333
+ - regex: 'ENERGY XL'
2334
+ model: 'Energy XL'
2335
+ - regex: 'ENERGY X PLUS 2'
2336
+ model: 'Energy X Plus 2'
2337
+ - regex: 'ENERGY X PLUS'
2338
+ model: 'Energy X Plus'
2339
+ - regex: 'LIFE XL'
2340
+ model: 'Life XL'
2341
+ - regex: 'Dash XL'
2342
+ model: 'Dash XL'
2343
+ - regex: 'PURE XL'
2344
+ model: 'Pure XL'
2345
+ - regex: 'Life One X2'
2346
+ model: 'Life One X2'
2347
+ - regex: 'LIFE ONE'
2348
+ model: 'Life One'
2349
+ - regex: 'NEO X PLUS'
2350
+ model: 'Neo X Plus'
2351
+ - regex: 'NEO (XL|X)'
2352
+ model: 'Neo $1'
2353
+ - regex: 'GRAND 5.5 HD'
2354
+ model: 'Grand 5.5 HD'
2355
+ - regex: 'Grand X LTE'
2356
+ model: 'Grand X LTE'
2357
+ - regex: 'Grand XL LTE'
2358
+ model: 'Grand XL LTE'
2359
+ - regex: 'B110DL'
2360
+ model: 'View Mega'
2361
+ - regex: 'R1 HD'
2362
+ model: 'R1 HD'
2363
+ - regex: 'R1 PLUS'
2364
+ model: 'R1 Plus'
2365
+ - regex: 'Tank Xtreme 5.0'
2366
+ model: 'Tank Xtreme 5.0'
2367
+ - regex: 'Tank Xtreme Pro'
2368
+ model: 'Tank Xtreme Pro'
2369
+ - regex: 'VIVO AIR LTE'
2370
+ model: 'Vivo Air LTE'
2371
+
2372
+ - regex: 'Touchbook M7 Pro'
2373
+ model: 'Touchbook M7 Pro'
2374
+ device: 'tablet'
2375
+
2376
+ - regex: 'DASH[ _]([^/;]+) Build'
2377
+ model: 'Dash $1'
2378
+ - regex: 'DASH (5.0|L3|L|M|X2|X)'
2379
+ model: 'Dash $1'
2380
+ - regex: 'blu[ _]([^/;]+) Build'
2381
+ model: '$1'
2382
 
2383
  # Bluegood
2384
  Bluegood:
2390
 
2391
  # Blackview
2392
  Blackview:
2393
+ regex: 'Blackview|(BV([24-9]000|[46]900|(5[589]|9[15689])00|6[138]00)(?:[ _](?:PRO))?|(P10000(?:[ _](?:PRO))?)|omega[ _]pro|Alife[ _][PS]1|Heatwave|DM550|BV9700Pro|(?<!Lenovo[_ ])A[68]0(?:Pro)?\))'
2394
  device: 'smartphone'
2395
  models:
2396
  - regex: 'A60Pro\)'
2403
  model: '$1'
2404
  - regex: '(BV9700)Pro'
2405
  model: '$1 Pro'
2406
+ - regex: 'Blackview (A[78]|E7S)'
2407
  model: '$1'
2408
  - regex: 'BV9000Pro-F'
2409
  model: 'BV9000 Pro F'
2412
  - regex: '(BV6100)(?:[);/ ]|$)'
2413
  model: '$1'
2414
  device: 'phablet'
2415
+ - regex: '(BV([24-9]000|6900|4900|(5[589]|9[15689])00)(?:[ _](?:PRO))?)'
2416
  model: '$1'
2417
  - regex: '(P10000(?:[ _](?:PRO))?)'
2418
  model: '$1'
2441
 
2442
  # Black Fox
2443
  'Black Fox':
2444
+ regex: 'BMM[ _-]?(?:44[123]D|44[12]S|431D|533D|54[12]S|541[ABW]|54[123]D|543S|531[ABD])(?:[);/ ]|$)'
2445
  device: 'smartphone'
2446
  models:
2447
  - regex: 'BMM443D'
2448
  model: 'B7 Fox+'
2449
  - regex: 'BMM441S'
2450
  model: 'B8 Fox'
2451
+ - regex: 'BMM442S'
2452
+ model: 'B8 Fox+'
2453
  - regex: 'BMM442D'
2454
  model: 'B7'
2455
  - regex: 'BMM531D'
2540
 
2541
  # Vivo (vivo.com.cn, vivo.com)
2542
  Vivo:
2543
+ regex: '((?:VIV-|BBG-)?(?<!FBCR/)vivo(?!(?:Browser)))|(?:V1730(D[AT]|GA)|V18(18CA|01A0|13B[AT]|18T|09[AT]|1[346][AT]|[13]8[AT]|14A|24[B]?A|2[19][AT]|3[12][AT]|36[AT])|V1731CA|V1732[AT]|V1818CT|V19[01]1[AT]|V1932[AT]|V191[3469][AT]|V192[1348]A|V193[04]A|V194[15]A|V1938CT|V1955A|V1938T|V1730EA|V19[26]2A|V196[35]A|V198[16]A|V1936A[L]?|V19[59]0A|V200[125]A|1819|V201[12]A|V202[0345]C?A|V202[2357])(?:[);/ ]|$)'
2544
  device: 'smartphone'
2545
  models:
2546
  - regex: 'V1824[B]?A(?:[);/ ]|$)'
2569
  model: 'iQOO 5'
2570
  - regex: 'V2025A(?:[);/ ]|$)'
2571
  model: 'iQOO 5 Pro'
2572
+ - regex: 'V2025(?:[);/ ]|$)'
2573
+ model: 'V20'
2574
  - regex: 'vivo 1805(?:[);/ ]|$)'
2575
  model: 'Nex'
2576
  - regex: 'V1923A(?:[);/ ]|$)'
2607
  model: 'V15 Pro'
2608
  - regex: 'vivo 1909(?:[);/ ]|$)'
2609
  model: 'V17 Pro'
2610
+ - regex: 'V2022(?:[);/ ]|$)'
2611
+ model: 'V20 SE'
2612
  - regex: '(?:VIV-|BBG-)?vivo[ _]1601(?:[);/ ]|$)'
2613
  model: 'V5'
2614
  - regex: 'vivo 1609(?:[);/ ]|$)'
2802
 
2803
  # BenQ
2804
  BenQ:
2805
+ regex: 'BENQ(?:[ \-])?([a-z0-9]+)|F52_09(?:[);/ ]|$)'
2806
  device: 'feature phone'
2807
+ models:
2808
+ - regex: 'F52_09(?:[);/ ]|$)'
2809
+ model: 'F52'
2810
+ - regex: 'BENQ(?:[ \-])?([a-z0-9]+)'
2811
+ model: '$1'
2812
 
2813
  # Blaupunkt
2814
  Blaupunkt:
2815
+ regex: 'Blaupunkt|Atlantis[_ ](?:1001A|1010A|A10\.G40[23])|SLplus02|Discovery[_ ](?:A10_302|111C|1000C|1001A?)|Endeavour[_ ](?:785|101[GLM]|1000|1001|101[03]|1100)|Polaris[_ ]803'
2816
  device: 'tablet'
2817
  models:
2818
  - regex: 'Discovery[_ ]111C'
2831
  model: 'Polaris $1'
2832
  - regex: 'Atlantis[_ ](1001A|1010A|A10\.G40[23])'
2833
  model: 'Atlantis $1'
2834
+ - regex: 'SLplus02'
2835
+ model: 'SL Plus 02'
2836
  - regex: 'Blaupunkt (SL 0[124]|SM 01)'
2837
  device: 'smartphone'
2838
  model: '$1'
2839
 
2840
  # Bmobile
2841
  Bmobile:
2842
+ regex: 'Bmobile[_ ]|AX-?(?:[1-9][0-9]{2,3}[eEO+]?|7OO)(?:[);/ ]|$)'
2843
  device: 'smartphone'
2844
  models:
2845
  - regex: 'AX-?([1-9][0-9]{2,3}[eEO+]?)'
2860
  model: 'Strike LTE'
2861
  - regex: 'BQ(?:ru)?-(?:6035L)(?:[);/ ]|$)'
2862
  model: 'Strike Power Max'
2863
+ - regex: 'BQ(?:ru)?-(?:5535L)(?:[);/ ]|$)'
2864
  model: 'Strike Power Plus'
2865
+ - regex: 'BQ(S|ru)?-(?:5070|6040L)(?:[);/ ]|$)'
2866
  model: 'Magic'
2867
+ - regex: 'BQ(S|ru)?-(?:6424L)(?:[);/ ]|$)'
2868
+ model: 'Magic O'
2869
  - regex: 'BQ(?:S|ru)?-(?:5730L)(?:[);/ ]|$)'
2870
  model: 'Magic C'
2871
  - regex: 'BQ(?:S|ru)?-(?:5731L)(?:[);/ ]|$)'
2872
  model: 'Magic S'
2873
+ - regex: 'BQ(?:S|ru)?-(?:5732L)(?:[);/ ]|$)'
2874
+ model: 'Aurora SE'
2875
  - regex: 'BQ-9011[G]?(?:[);/ ]|$)'
2876
  model: 'Vision'
2877
  device: 'tablet'
2922
  model: 'Aura'
2923
  - regex: 'BQ(ru)?[ -]6015L'
2924
  model: 'Universe'
2925
+ - regex: 'BQ(?:S|ru)?-(?:5525|6030G|6010G)'
2926
  model: 'Practic'
2927
  - regex: 'BQ-6001L|BQ-6050'
2928
  model: 'Jumbo'
2932
  model: 'Spring'
2933
  - regex: 'BQ-5700L(?:[);/ ]|$)'
2934
  model: 'Space X'
2935
+ - regex: 'BQ-(?:5591|551[89]G)(?:[);/ ]|$)'
2936
  model: 'Jeans'
2937
  - regex: 'BQ-5522'
2938
  model: 'Next'
2968
  model: 'Strike Selfie Max'
2969
  - regex: 'BQ(?:ru)?-5503(?:[);/ ]|$)'
2970
  model: 'Nice 2'
2971
+ - regex: 'BQ(?:ru)?-6045L(?:[);/ ]|$)'
2972
+ model: 'Nice'
2973
+ - regex: 'BQ(?:ru)?-4030G(?:[);/ ]|$)'
2974
+ model: 'Nice Mini'
2975
  - regex: 'BQS-5502(?:[);/ ]|$)'
2976
  model: 'Hammer'
2977
  - regex: 'BQS-5501(?:[);/ ]|$)'
3000
  model: 'Space'
3001
  - regex: 'BQ-5082(?:[);/ ]|$)'
3002
  model: 'Sense 2'
3003
+ - regex: 'BQ-5045L(?:[);/ ]|$)'
3004
+ model: 'Wallet'
3005
  - regex: 'BQ-5071(?:[);/ ]|$)'
3006
  model: 'Belief'
3007
  - regex: 'BQ[S]?-(?:5065|5340)(?:[);/ ]|$)'
3263
  regex: 'Bush[ _-]'
3264
  device: 'smartphone'
3265
  models:
3266
+ - regex: 'BUSH ([^;/)]+)Tablet(?: Build|[);])'
3267
  model: '$1Tablet'
3268
  device: 'tablet'
3269
+ - regex: 'BUSH ([^;/)]+)(?: Build|[);])'
3270
  model: '$1'
3271
 
3272
  # CAGI
3329
 
3330
  # Cat (Caterpillar, Catphones)
3331
  Cat:
3332
+ regex: 'Cat ?(tablet|stargate|nova)|B15Q|CAT B35|CAT-B100'
3333
  device: 'tablet'
3334
  models:
3335
  - regex: 'B15Q'
3343
  - regex: 'Cat ?tablet'
3344
  model: 'Nova'
3345
 
3346
+ - regex: 'CAT-(B100)'
3347
+ device: 'feature phone'
3348
+ model: '$1'
3349
+
3350
  # Carrefour
3351
  Carrefour:
3352
  regex: 'CT(?:10[0123]0|7[12]0|820)(?:W|FR)?(?:[);/ ]|$)'
3361
 
3362
  # Celkon
3363
  Celkon:
3364
+ regex: 'Celkon|Millennia Hero'
3365
  device: 'smartphone'
3366
  models:
3367
  - regex: 'Celkon[ _*](C[78]20)'
3368
  model: '$1'
3369
  device: 'tablet'
3370
+ - regex: 'Millennia Hero'
3371
+ model: 'Millennia Hero'
3372
  - regex: 'Celkon[ _*](CT[^;/]+) Build'
3373
  model: '$1'
3374
  device: 'tablet'
3468
 
3469
  # Artel
3470
  Artel:
3471
+ regex: 'Artel[_ ]|\w+_ARTEL_\w+'
3472
  device: 'smartphone'
3473
  models:
3474
  - regex: 'Artel[_ ](Quadro(?: Pro)?|Tesla|Air|Tomchi|Premium|U3_4G|Z5|Sentinel (?:X 8G|X D5|X))'
3479
  model: '$1'
3480
  device: 'tablet'
3481
 
3482
+ - regex: '(?:\w+_)?ARTEL_([FVM]5|X4)_\w+'
3483
+ device: 'feature phone'
3484
+ model: '$1'
3485
+
3486
  # ComTrade Tesla
3487
  ComTrade Tesla:
3488
  regex: 'Tesla|Impulse 7.85 3G|Smartphone_6.1|SP(?:6.2|6.2_Lite)|TTL(?:713G|8)'
3677
 
3678
  # Coolpad
3679
  Coolpad:
3680
+ regex: '(?:YL-)?Coolpad|(?:Cool_9S|8190Q|1831-A0|8676-[AM]01|CP8298_I00|CP3648A|CP8676_I0[23]|REVVLPLUS C3701A|VCR-[AI]0|C105-E0|C106-[79]|MTS-T0|cp3705A[S]?|ORL-C0|DLS-E0|8298-M02|5560S)(?:[);/ ]|$)|(8295|5860S) Build'
3681
  device: 'smartphone'
3682
  models:
3683
  - regex: 'VCR-[AI]0'
3689
  device: 'phablet'
3690
  - regex: '8190Q(?:[);/ ]|$)'
3691
  model: '8190Q'
3692
+ - regex: 'DLS-E0(?:[);/ ]|$)'
3693
+ model: 'N5'
3694
  - regex: 'CP3705A[S]?(?:[);/ ]|$)'
3695
  model: 'Legacy'
3696
  - regex: 'CP3648A(?:[);/ ]|$)'
3697
  model: 'Legacy S'
3698
  - regex: 'MTS-T0(?:[);/ ]|$)'
3699
  model: 'N2M'
3700
+ - regex: 'C106-[79](?:[);/ ]|$)'
3701
  model: 'Cool 1'
3702
+ - regex: 'C105-E0(?:[);/ ]|$)'
3703
+ model: 'Cool S1'
3704
  - regex: 'ORL-C0(?:[);/ ]|$)'
3705
  model: 'Cool 9'
3706
  - regex: 'Cool_9S(?:[);/ ]|$)'
3707
  model: 'Cool 9S'
3708
+ - regex: '5560S(?:[);/ ]|$)'
3709
+ model: 'Arise'
3710
  - regex: '(5860S|8295) Build'
3711
  model: '$1'
3712
  - regex: 'CP8676_I02(?:[);/ ]|$)'
3715
  model: 'Note 3 Plus'
3716
  - regex: 'CP8298_I00(?:[);/ ]|$)'
3717
  model: 'Note 3 Lite'
3718
+ - regex: '(8676-[AM]01|8298-M02)(?:[);/ ]|$)'
3719
  model: '$1'
3720
  - regex: '(?:YL-)?Coolpad[ _\-]?([^/;]+) Build'
3721
  model: '$1'
3762
 
3763
  # AllDocube (https://www.alldocube.com/)
3764
  AllDocube:
3765
+ regex: '(?:T1001XS?|iPlay_20|U1006H?)(?:[);/ ]|$)'
3766
  device: 'tablet'
3767
  models:
3768
  - regex: 'T1001XS(?:[);/ ]|$)'
3769
  model: 'M5XS'
3770
  - regex: 'T1001X(?:[);/ ]|$)'
3771
  model: 'M5X'
3772
+ - regex: 'U1006H?(?:[);/ ]|$)'
3773
  model: 'iPlay 10 Pro 10.1"'
3774
  - regex: 'iPlay_20(?:[);/ ]|$)'
3775
  model: 'iPlay 20'
3805
 
3806
  # CUBOT
3807
  CUBOT:
3808
+ regex: 'CUBOT|RAINBOW 2|KING_KONG_3|KINGKONG_MINI|KING KONG CS|(?<!QUMO )QUEST(?!(?:[0-9]|\s[0-9]))(?: LITE)?'
3809
  device: 'smartphone'
3810
  models:
3811
  - regex: 'CHEETAH 2'
3930
 
3931
  # Danew
3932
  Danew:
3933
+ regex: 'Dslide ?([^;/]+) Build|Konnect_?(402|504|60[127])|GEODROID_A5'
3934
  device: 'smartphone'
3935
  models:
3936
  - regex: 'Konnect_?(402|504|60[127])'
3938
  - regex: 'Dslide ?([^;/]+) Build'
3939
  device: 'tablet'
3940
  model: 'DSlide $1'
3941
+ - regex: 'GEODROID_A5'
3942
+ device: 'tablet'
3943
+ model: 'Geodroid A5'
3944
 
3945
  # Denver Electronics
3946
  Denver:
3989
 
3990
  # DEXP
3991
  DEXP:
3992
+ regex: 'DEXP|(?:Ursus|Ixion)[ _]([^;/)]+)|H135[ _]Build|Larus_TV1|IxionML4.7|M150Storm|(?:SENIOR|F4[38]D8000K|VA[12]10|VA170|ML450|MS[56]50|BL[123]50|BS155|BS160|BS[1256]50|AL[12]40|AL[23]50|AS155|AS260| (?:N280i|P380i|R110|B450|B340|A1[45]0))(?:[);/ ]|$)'
3993
  device: 'smartphone'
3994
  models:
 
3995
  - regex: 'Ixion[_ ]([^;/]+)(?: Build|\))'
3996
  model: 'Ixion $1'
3997
  - regex: '(ML450|MS[56]50)(?:[);/ ]|$)'
3998
  model: 'Ixion $1'
3999
+ - regex: 'IxionML4.7(?:[);/ ]|$)'
4000
+ model: 'Ixion ML 4.7"'
4001
+ - regex: 'M150Storm(?:[);/ ]|$)'
4002
+ model: 'Ixion M150 Storm'
4003
+ - regex: 'AL250(?:[);/ ]|$)'
4004
+ model: '4.5" AL250'
4005
+ - regex: 'AL350(?:[);/ ]|$)'
4006
+ model: '5.0" AL350'
4007
+ - regex: 'AS155(?:[);/ ]|$)'
4008
+ model: '5.45" AS155'
4009
  - regex: 'AS260(?:[);/ ]|$)'
4010
  model: '5.85" AS260'
4011
  device: 'phablet'
4013
  - regex: 'Ursus ([^;/)]+)(?: Build|\))'
4014
  model: 'Ursus $1'
4015
  device: 'tablet'
4016
+ - regex: '(VA[21]10|VA170|R110|N280i|P380i)(?:[);/ ]|$)'
4017
  model: 'Ursus $1'
4018
  device: 'tablet'
4019
 
4022
  - regex: 'SENIOR(?:[);/ ]|$)'
4023
  model: 'Senior'
4024
 
4025
+ - regex: 'Larus_TV1'
4026
+ device: 'feature phone'
4027
+ model: 'Larus_TV1'
4028
+
4029
  - regex: 'H135[ _]Build'
4030
  model: 'Atlas'
4031
  device: 'desktop'
4032
+ - regex: '(BL[123]50|BS155|BS160|BS[1256]50|AL[12]40|A1[45]0)(?:[);/ ]|$)'
4033
  model: '$1'
4034
  - regex: 'DEXP[ _]([^;/]+) Build'
4035
  model: '$1'
4085
 
4086
  # Digma
4087
  Digma:
4088
+ regex: 'Digma[_ ]([^;/]+) Build|HIT HT707[10]MG|CITI ATL 4G|CITI Kids|CITI Octa [178]0|CITI 1902 3G|CITI Z530 3G|(CITI[_ ](?:[A-Z0-9]+)[_ ][34]G)[ _][TC][ST](606[32]ML|1114ML|11[459]4MG|1207MG|1210MG|1195MG|1196ML|3001ML|4024PG|500[67]PG|720[48]MG|7113PL|7193MG|820[69]MG|8139ML|8143MG|8152ML|1050PL|8205PG|7203MG|1062ML)|HIT 4G|HT7074ML|IDX5|(iDx10|iDx7)|MVM900H(?:WZ|C)|MVM908HCZ|(iDxD8 3G|iDxD10 3G|iDrQ10 3G|iDxD[45]|iDxQ5|iD[nx]D7(?:[_ ]3G)?)|PS604M|PT452E|LINX B510 3G LT5037MG|LINX A452 3G LT4030PG|LINX A453 3G LT4038PG|LINX A420 3G LS4019PG|LINX A450 3G LT4028PG|Linx A400 3G LT4001PG|Linx C500 3G LT5001PG|Linx PS474S|LS504[01]PL|LT40(47|54)MG|PS1043MG|LS405[01]MG|LS5053ML|LT5048MG|HT7071MG|LT5052ML|HT5035PG|HT4039PG|LT4049PG|NS6902QL|NS9797MG|TS7854M|TS1012E 3G|TT1004PG|TT702[045]MG|TT7026MW|((?:Optima|Platina|Plane)[ _](?:[EM])?(?:[0-9\.ST]+|Prime)(?:[ _][43]G)?)|(VOX[ _](?:[0-9\.A-Z]+)[_ ][43]G)'
4089
  device: 'smartphone'
4090
  models:
4091
  - regex: 'HIT(?: 3G)? HT707[10]MG'
4131
  model: 'CITI ATL 4G'
4132
  - regex: '(CITI Z530 3G)'
4133
  model: '$1'
4134
+ - regex: '(CITI [A-Z0-9]+ [34]G) C[ST](?:606[32]ML|4024PG)'
4135
+ model: '$1'
4136
 
4137
+ - regex: 'TS7854M'
4138
+ model: 'Plane 8.1" 3G'
4139
+ device: 'tablet'
4140
  - regex: 'PS1043MG'
4141
  model: 'Plane 10.3" 3G'
4142
  device: 'tablet'
4143
+ - regex: 'TS1012E 3G'
4144
+ model: 'Plane 10.1" 3G'
4145
+ device: 'tablet'
4146
  - regex: 'MVM900H(?:WZ|C)'
4147
  model: 'iDx8'
4148
  device: 'tablet'
4159
  - regex: 'HIT 4G HT7074ML'
4160
  model: 'HIT 4G'
4161
  device: 'tablet'
4162
+ - regex: '(CITI 1902 3G|CITI Kids|CITI_8527_4G|CITI Octa [178]0)'
4163
  model: '$1'
4164
  device: 'tablet'
4165
+ - regex: '(CITI[ _](?:[A-Z0-9]+)[ _][34]G)[ _][TC][ST](?:1062ML|1114ML|1207MG|1210MG|3001ML|500[67]PG|720[48]MG|820[69]MG|11[459]4MG|1195MG|1196ML|3001ML|8152ML|1050PL|7113PL|7193MG|7216MG|8205PG|7203MG|8143MG)'
 
 
 
4166
  model: '$1'
4167
  device: 'tablet'
4168
  - regex: 'iDxD8 3G'
4183
  - regex: 'TT7025MG'
4184
  model: 'Optima 7.5" 3G'
4185
  device: 'tablet'
4186
+ - regex: 'TT7026MW'
4187
+ model: 'Optima 7.6" 3G'
4188
+ device: 'tablet'
4189
+ - regex: 'TT7020MG'
4190
+ model: 'Optima 7.3" 3G'
4191
+ device: 'tablet'
4192
+ - regex: 'TT7024MG'
4193
+ model: 'Optima 7.4" 3G'
4194
+ device: 'tablet'
4195
  - regex: '((?:Optima|Platina|Plane)[ _](?:[EM])?(?:[0-9\.STNM]+|Prime)(?:[ _][43]G)?)'
4196
  model: '$1'
4197
  device: 'tablet'
4213
 
4214
  # Doogee
4215
  Doogee:
4216
+ regex: 'DOOGEE[ _-]|Valencia2_Y100_?(?:pro|plus)|Y100_Plus|X5max(?:[_ ]PRO)?|Shoot_[12]|x5_doogee|(KISSME|BIGBOY|COLLO[23]?|DAGGER|DISCOVERY2?|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|VOYAGER2?|TITANS2?)[ -_](DG[0-9]+C?)(?:[);/ ]|$)|BL[579]000(?:[);/ ]|$)|BL12000|BL5500[_ ]Lite|X9 Mini|LEO_DG280|Y9Plus|Hitman_DG850|S(?:68|9[05])Pro|S40Lite|(?<!Lenovo )S90C'
4217
  device: 'smartphone'
4218
  models:
4219
  - regex: '(?:Valencia2_)?Y100_Plus(?:[);/ ]|$)'
4222
  model: 'Valencia2 Y100 Pro'
4223
  - regex: 'LEO_(DG280)'
4224
  model: 'Leo $1'
4225
+ - regex: '(BL[579]000|S90C)(?:[);/ ]|$)'
4226
  model: '$1'
4227
  - regex: 'BL12000 PRO'
4228
  model: 'BL12000 Pro'
4230
  model: 'BL5500 Lite'
4231
  - regex: 'BL12000'
4232
  model: 'BL12000'
4233
+ - regex: 'S(68|9[05])Pro'
4234
+ model: 'S$1 Pro'
4235
+ - regex: 'S40Lite'
4236
+ model: 'S40 Lite'
4237
  - regex: 'KISSME-DG580'
4238
  model: 'Kissme DG580'
4239
  - regex: 'Hitman_DG850'
4240
  model: 'Hitman DG580'
4241
  - regex: 'X9 Mini'
4242
  model: 'X9 Mini'
4243
+ - regex: 'x5_doogee'
4244
+ model: 'X5'
4245
+ - regex: 'Shoot_([12])'
4246
+ model: 'Shoot $1'
4247
  - regex: '(X5max(?:[_ ]PRO)?)'
4248
  model: '$1'
4249
  - regex: '(?:DOOGEE[ _-])?(BIGBOY|COLLO[23]?|DAGGER|DISCOVERY2?|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|Valencia2_Y100pro|VOYAGER2?|TITANS2?)[ -_](DG[0-9]+C?)(?:[);/ ]|$)'
4324
  models:
4325
  - regex: '(EasyPhone[^/;]+) Build'
4326
  model: '$1'
4327
+ - regex: 'EasyPad ([^/;)]+)(?: Build|[;)])'
4328
+ model: 'EasyPad $1'
4329
  device: 'tablet'
4330
 
4331
  # Ebest
4510
 
4511
  # Senseit
4512
  Senseit:
4513
+ regex: 'SENSEIT[ _]?([^;/)]+)( Build|\))'
4514
+ device: 'smartphone'
4515
+ model: '$1'
4516
 
4517
  # Sony & Sony Ericsson (combined as they are mixed up)
4518
  Sony:
4519
+ regex: 'Sony(?: ?Ericsson)?|SGP|Xperia|(?:[4-9]0[12])SO|C1[569]0[45]|C2[01]0[45]|C230[45]|C530[236]|C550[23]|C6[56]0[236]|C6616|C68(?:0[26]|[34]3)|C69(?:0[236]|16|43)|D200[45]|D21(?:0[45]|14)|D22(?:0[236]|12|43)|D230[2356]|D240[36]|D25(?:02|33)|D510[236]|D530[36]|D5316|D5322|D5503|D58[03]3|D65(?:0[23]|43|63)|D66[03458]3|D66[14]6|D6708|E(?:20[0345]3|2006|210[45]|2115|2124|230[36]|2312|23[356]3|530[36]|53[3456]3|5506|55[356]3|56[46305][36]|58[02]3|65[35]3|66[0358]3|68[358]3)|I[34]312|I4332|F311[12356]|F331[13]|F321[12356]|F5[13]21|F5122|F813[12]|F833[12]|G312[135]|G311[26]|G322[136]|G3212|G331[123]|G3412|G3416|G342[136]|G823[12]|G834[123]|G8[14]4[12]|H(?:3113|3123|3133|3213|3223|3311|3321|4113|4133|4213|4233|4311|4331|4413|4433|82[167]6|83[12]4|8416|9436)|(?:WT|LT|SO|ST|SK|MK)[0-9]+[a-z]+[0-9]*(?: Build|\))|X?L39H|XM50[ht]|W960|portalmmm/2\.0 K|S3[69]h|SOG01|SOL2[246]|SOV3[1-9]|SOV4[0-3]|X10[ia]v?|E1[05][ai]v?|MT[0-9]{2}[a-z]? Build|SO-0(?:[12]C|[345]D|[234]E|[1-5]F|[1-5]G|[1-4]H|[1-4]J|[1-5]K|1M|[1-3]L)|R800[aix]|J3173|J82[17]0|J9110|J92[16]0|J81[17]0|I[34]113|I3[12]23|I42[19]3|H9493|H8296|H8166|H4493|LiveWithWalkman|BRAVIA|SGP771|E3 Dual|A001SO|I4193|E6508|SOT31|SO-[45]1A|XQ-A[DT]51|XQ-AT42|XQ-AS72|XQ-A[TSU]52|SOL25|SOG02|A002SO|NW-A100Series'
4520
  device: 'smartphone'
4521
  models:
4522
  # SONY ERICSSON: explicit smartphone models
4672
  model: 'Xperia 5 Dual'
4673
  - regex: '(?:Sony(?:Ericsson)?)?(?:J82[17]0|SO-01M|SOV41|901SO)'
4674
  model: 'Xperia 5'
4675
+ - regex: '(?:Sony(?:Ericsson)?)?(?:SOG02|A002SO|XQ-AS[75]2)'
4676
  model: 'Xperia 5 II'
4677
  - regex: '(?:Sony(?:Ericsson)?)?(?:SOV42|902SO)'
4678
  model: 'Xperia 8'
5037
  - regex: 'ERGO[_ ]Tab[ _]Hero[ _]II'
5038
  model: 'Tab Hero II'
5039
  device: 'tablet'
5040
+ - regex: 'ERGO[_ ](B700)'
5041
+ model: 'Tab $1'
5042
+ device: 'tablet'
5043
+
5044
+ - regex: 'ERGO SmartBox SX'
5045
+ model: 'SmartBox SX'
5046
+ device: 'tv'
5047
 
5048
  # Ericsson
5049
  Ericsson:
5127
  regex: 'EVOLVEO'
5128
  device: 'smartphone'
5129
  models:
5130
+ - regex: 'EVOLVEO MultiMedia Box M4'
5131
+ device: 'tv'
5132
+ model: 'MultiMedia Box M4'
5133
  - regex: 'Smart TV ([^;/]*) Build'
5134
  device: 'tv'
5135
  model: 'Smart TV $1'
5136
  - regex: 'EVOLVEO StrongPhone G([248])'
5137
  model: 'StrongPhone G$1'
5138
+ - regex: 'EVOLVEO[ _]StrongPhone[ _]Q([67])(_LTE)?'
5139
+ model: 'StrongPhone Q$1$2'
5140
  - regex: 'EVOLVEO[ _]([^;/]*) Build'
5141
  model: '$1'
5142
 
5143
  # Explay
5144
  Explay:
5145
+ regex: 'Explay|[\w]+-EXPLAY-FIN|ActiveD[ _]|Atlant |Informer[ _][0-9]+|CinemaTV 3G|Surfer[ _][0-9\.]|sQuad[ _][0-9\.]|Onliner[1-3]|RioPlay|Leader|Infinityll|Imperium[78]'
5146
  device: 'tablet'
5147
  models:
5148
  - regex: 'ActiveD[ _]7.4[ _]3G'
5166
  - regex: 'Atlant(?:[);/ ]|$)'
5167
  device: 'smartphone'
5168
  model: 'Atlant'
5169
+
5170
+ - regex: '[\w]+-EXPLAY-FIN'
5171
+ device: 'feature phone'
5172
+ model: 'Fin'
5173
+
5174
+
5175
  - regex: 'Explay[ _-]([^;/]+) Build'
5176
  model: '$1'
5177
  - regex: 'Explay[ _-]([^;/]+)(?:[;/)]|$)'
5184
 
5185
  # EvroMedia
5186
  EvroMedia:
5187
+ regex: 'EVROMEDIA|Playpad[ _]|PLAY_PAD_PRO_XL'
5188
  device: 'tablet'
5189
  models:
5190
  - regex: 'Playpad 3G GOO'
5191
  model: 'Play Pad 3G Goo'
5192
  - regex: 'Play Pad PRO'
5193
  model: 'Play Pad Pro'
5194
+ - regex: 'PLAY_PAD_PRO_XL'
5195
+ model: 'Play Pad Pro XL'
5196
  - regex: 'PlayPad 3GTab XL'
5197
  model: 'Play Pad 3G Tab XL'
5198
  # EKO
5433
 
5434
  # General Mobile
5435
  General Mobile:
5436
+ regex: 'GM 5 Plus|GM8 go|GM [68] d|GM 8|General Mobile 4G'
5437
  device: 'smartphone'
5438
  models:
5439
  - regex: 'GM 5 Plus'
5440
  model: 'GM 5 Plus'
5441
+ - regex: 'GM ([68]) d'
5442
+ model: 'GM $1D'
5443
  - regex: 'GM 8'
5444
  model: 'GM 8'
5445
  - regex: 'GM8 go'
5446
  model: 'GM 8 Go'
5447
+ - regex: 'General Mobile 4G Dual'
5448
+ model: '4G Dual'
5449
+ - regex: 'General Mobile 4G'
5450
+ model: '4G'
5451
 
5452
  # Geotel
5453
  Geotel:
5474
 
5475
  # Gigabyte
5476
  Gigabyte:
5477
+ regex: 'GSmart[ _][a-z0-9 ]+(?: Build|\))|Gigabyte-[a-z0-9]+|Simba SX1|Classic[_ ](?:Joy|Pro)'
5478
  device: 'smartphone'
5479
  models:
5480
  - regex: '(GSmart[ _][a-z0-9 ]+)(?: Build|\))'
5481
  model: '$1'
5482
  - regex: 'Gigabyte-([a-z0-9]+)'
5483
  model: '$1'
5484
+ - regex: '(Classic[ _](?:Joy|Pro))'
5485
+ model: '$1'
5486
+ - regex: 'Simba SX1'
5487
+ model: 'GSmart Simba SX1'
5488
 
5489
  # Gigaset
5490
  Gigaset:
5513
 
5514
  # Ginzzu
5515
  Ginzzu:
5516
+ regex: 'GINZZU[_ ]|((?:RS(?:7[14]|81|9[67])D)|S5002|(?<!Wave Pro )S5021|S5230|S50[45]0|S5120|RS(6[12]|9[45])D|S40[23]0|RS850[12]|RS9602)(?:[);/ ]|$)'
5517
  device: 'smartphone'
5518
  models:
5519
+ - regex: 'GINZZU[_ ]?(S40[17]0|S4710|ST60[14]0|ST6120)'
5520
  model: '$1'
5521
+ - regex: 'GINZZU[_ ]?(GT-(?:1050|7105|70[1-4]0|7115|7210|[WX]831|X[78]70|7810|8[01]10|X853))'
5522
  model: '$1'
5523
  device: 'tablet'
5524
  - regex: '(RS6[12]D) ULTIMATE'
5525
  model: '$1 Ultimate'
5526
+ - regex: '(?:GINZZU[ _])?((?:RS(?:7[14]|81|9[4-7])D)|S50[45]0|S5002|S5021|S5230|S5120|S40[23]0|RS850[12]|RS9602|RS94D)(?:[);/ ]|$)'
5527
  model: '$1'
5528
 
5529
  # Gionee
5719
 
5720
  # Haier
5721
  Haier:
5722
+ regex: 'Haier|I6_Infinity|Titan[ _]T[135]|(?:HW-)?W(?:716|757|860|970)(?:[);/ ]|$)|S5 Silk|(?:HM-)?(N505|N700|G(?:152|303|353|552|70[01])?-FL|HM-N501-FL|G(?:303)?-W|I(?:557)?-FL)|(?:PAD[ _](?:D71|G781|d85))|A2_Lite_NFC'
5723
  device: 'smartphone'
5724
  models:
5725
+ - regex: 'A2_Lite_NFC'
5726
+ model: 'Alpha A2 Lite NFC'
5727
  - regex: 'HM-N505-FL'
5728
  model: 'I8'
5729
  - regex: 'S5 Silk'
5734
  model: 'L56'
5735
  - regex: '(?:HM-)?(G(?:152|353|552|70[01])|G(?:303)|I(?:557))'
5736
  model: '$1'
5737
+ - regex: '(Titan[_ ]T[135]|I6_Infinity)'
5738
  model: '$1'
5739
  - regex: '(?:HW-)?W(716|757|860|970)(?:[);/ ]|$)'
5740
  model: 'W$1'
5929
 
5930
  # Huawei
5931
  Huawei:
5932
+ regex: '(HW-)?(?:Huawei|MediaPad T1|Ideos|Honor[ _]?|(?:(?:AGS|AGS2|ALE|ALP|AMN|ANE|ARE|ARS|ASK|ATH|ATU|AUM|BAC|BAH[23]?|BG2|BGO|B[ZK]K|BKL|BL[ALN]|BND|BTV|CA[GMNZ]|CH[CM]|CHE[12]?|CLT|CMR|COL|COR|CPN|CRO|CRR|CUN|DIG|DLI|DRA|DUA|DUB|DUK|EDI|ELE|EML|EVA|EVR|FDR|FIG|FLA|FRD|GEM|GRA|HDN|HLK|HMA|Hol|HRY|HWI|H[36]0|INE|JAT|JDN|JDN2|JKM|JMM|JSN|KII|KIW|KNT|KOB|KSA|LDN|LEO|LIO|LLD|LND|LON|LRA|LUA|LY[AO]|MAR|MHA|MRD|MYA|NCE|NEM|NEO|NXT|PAR|PCT|PIC|PLE|PLK|POT|PRA|RIO|RNE|RVL|SCC|SCL|SCM|SEA|SHT|SLA|SNE|SPN|STF|STK|TAG|TIT|TNY|TRT|VCE|VEN|VIE|VKY|VNS|VOG|VRD|VTR|WAS|YAL|G(?:527|620S|621|630|735)|Y(?:221|330|550|6[23]5))-(?:[A-Z]{0,2}[0-9]{1,4}[A-Z]{0,3}?)|H1711|U(?:8230|8500|8661|8665|8667|8800|8818|8860|9200|9508))(?:[);/ ]|$))|hi6210sft|PE-(UL00|TL[12]0|TL00M)|T1-(A21[Lw]|A23L|701u|823L)|G7-(?:L01|TL00)|HW-01K|JNY-(LX[12]|AL10)|OXF-AN[01]0|TAS-(A[LN]00|L29|TL00)|WLZ-(AL10|AN00)|NIC-LX1A|MRX-(AL09|W09)|CDY-(?:[AT]N00|AN90|NX9A)|GLK-[AT]L00|JER-[AT]N10|ELS-(?:[AT]N[10]0|NX9|N39|N04)|AKA-(AL10|L29)|MON-(W|AL)19|BMH-AN[12]0|AQM-([AT]L[01]0|LX1)|MOA-(AL00|LX9N)|NTS-AL00|ART-(?:[AT]L00[xm]|L29N?)|JEF-(?:[AT]N00|AN20)|MED-(?:[AT]L00|LX9N?)|EBG-AN[01]0|ANA-(?:[AT]N00|NX9)|BZ[AK]-W00|BZT-(W09|AL[01]0)|HDL-(AL09|W09)|HWV3[123]|HW-02L|TEL-[AT]N(?:00a?|10)|KKG-AN00|MXW-AN00|JKM-AL00[ab]|TAH-(?:N29|AN00)m|C8817D|T1-821W|d-01J|d-02[HK]|HWT31|Y320-U10|Y541-U02|VAT-L19|70[14]HW|60[58]HW|TNNH-AN00|LIO-(?:[TA]L00|[LN]29|AN00)|KOB2-[LW]09|PPA-LX2|AGS3-L09|DNN-LX9|NEY-NX9'
5933
  device: 'smartphone'
5934
  models:
5935
  - regex: 'POT-[TA]L00a(?:[);/ ]|$)'
6192
  model: 'Honor X10'
6193
  - regex: 'KKG-AN00(?:[);/ ]|$)'
6194
  model: 'Honor X10 Max'
6195
+ - regex: 'DNN-LX9(?:[);/ ]|$)'
6196
+ model: 'Honor X10 Lite'
6197
  - regex: 'U8500(?:[);/ ]|$)'
6198
  model: 'Ideos X2'
6199
  - regex: 'U8510(?:[);/ ]|$)'
6304
  model: 'P smart'
6305
  - regex: 'POT-(?:LX(?:[13]|1T|2J|1AF)|AL00)(?:[);/ ]|$)'
6306
  model: 'P smart (2019)'
6307
+ - regex: 'POT-LX1A(?:[);/ ]|$)'
6308
+ model: 'P smart (2020)'
6309
  - regex: 'PPA-LX2(?:[);/ ]|$)'
6310
  model: 'P smart (2021)'
6311
  - regex: 'STK-LX1(?:[);/ ]|$)'
6328
  model: 'P30'
6329
  - regex: '(?:MAR-(?:LX(?:1[BM]|2J?|3BM)|TL00)|NIC-LX1A|HWV33)(?:[);/ ]|$)'
6330
  model: 'P30 Lite'
6331
+ - regex: 'MAR-LX[13]Am?(?:[);/ ]|$)'
6332
  model: 'P30 Lite Dual SIM'
6333
  - regex: '(?:VOG-(?:L(?:04|09|29)|TL00|AL10)|HW-02L)(?:[);/ ]|$)'
6334
  model: 'P30 Pro'
6338
  model: 'P40 Lite E'
6339
  - regex: 'ART-L29N(?:[);/ ]|$)'
6340
  model: 'P40 Lite E NFC'
6341
+ - regex: '(?:ELS-(?:[AT]N00|NX9|N04)|NEY-NX9)(?:[);/ ]|$)'
6342
  model: 'P40 Pro'
6343
  - regex: 'ELS-(?:AN10|N39)(?:[);/ ]|$)'
6344
  model: 'P40 Pro Plus'
6378
  model: 'Y5 (2019)'
6379
  - regex: 'DRA-LX5(?:[);/ ]|$)'
6380
  model: 'Y5 lite'
6381
+ - regex: 'DRA-LX9(?:[);/ ]|$)'
6382
+ model: 'Y5p'
6383
  - regex: 'CRO-L[02]3(?:[);/ ]|$)'
6384
  model: 'Y5 Lite (2017)'
6385
  - regex: 'CAG-L[02]3(?:[);/ ]|$)'
6632
 
6633
  # iBall
6634
  iBall:
6635
+ regex: 'iBall[ _]([^;/)]+)[ _]Build|(?:Snap_4G2|6351-Q400i)(?:[);/ ]|$)'
6636
  device: 'tablet'
6637
  models:
6638
  - regex: '(Snap_4G2)(?:[);/ ]|$)'
6639
  model: '$1'
6640
+ - regex: '6351-Q400i(?:[);/ ]|$)'
6641
+ model: 'Slide'
6642
  - regex: 'iBall[ _]([^;/)]+)[ _]Build'
6643
  model: '$1'
6644
 
6656
 
6657
  # iRulu
6658
  iRulu:
6659
+ regex: 'iRULU[ _](X11|V[34]|U2)(?:[);/ ]|$)'
6660
  device: 'tablet'
6661
+ models:
6662
+ - regex: 'iRULU[ _](X11|V[34])(?:[);/ ]|$)'
6663
+ model: '$1'
6664
+ - regex: 'iRULU[ _](U2)(?:[);/ ]|$)'
6665
+ device: 'smartphone'
6666
+ model: '$1'
6667
 
6668
  # Irbis
6669
  Irbis:
6670
+ regex: 'IRBIS|TZ(1(?:0[04]|42|5[01]|84|65|7[01345-89]|8[356]|9[12578])|49|7(?:1[12467]|2[01567]|37|4[257]|5[23457]|6[12]|72|7[17]|8[1]|9[47])|8(?:[34]1|5[3-8]|6[45]|7[2478]|8[1-5]|9[0127])|96[0-9])|TZ85|TZ13|TZ(?:one|art|HIT|81L)|(SP(?:0[56]|2[01]|4[1-36]|40[12]|45[345]|49[34]|50|51[0147]|531|54[12]|55[0124]|571))(?:[);/ ]|$)'
6671
  device: 'tablet'
6672
  models:
6673
  - regex: '(TZ(?:[0-9]+)|TZ(?:one|art|HIT|81L))(?:[);/ ]|$)'
6714
 
6715
  # IconBIT
6716
  IconBIT:
6717
+ regex: 'IconBIT|NT-(3506M|0704S|0909T|1009T|10[01]1T|1017T|3601P/3602P|3603P|3702S|3805C|3905T|3701S|0701S|0805C|0902S|370[23]M)|XDS[789]4K|Omnicast UHD|Movie Smart 4K|Movie IPTV Quad'
6718
  device: 'tablet'
6719
  models:
6720
  - regex: 'NT-3506M'
6753
  - regex: 'NT-3703M'
6754
  model: 'NetTAB Matrix 3GT'
6755
 
6756
+ - regex: '(?:iconBIT )?(Movie Smart 4K|Movie IPTV Quad|Movie Ultra HD 4K|XDS[789]4K|Omnicast UHD)'
6757
  model: '$1'
6758
  device: 'tv'
6759
 
7297
 
7298
  #iLife or i-life (lifedigital.com)
7299
  iLife:
7300
+ regex: '(ITELL[_ ](?:K3300|K3500N))(?:[);/ ]|$)'
7301
  device: 'tablet'
7302
  model: '$1'
7303
 
7339
 
7340
  # Jiayu
7341
  Jiayu:
7342
+ regex: 'JIAYU[ _-]|(?:JY-G4[\\_]G5|(?:JY-[a-z0-9]+)|JY_G4C)(?:[);/ ]|$)'
7343
  device: 'smartphone'
7344
  models:
7345
  - regex: '(?:JIAYU G4_G5|JY-G4[\\_]G5)(?:[);/ ]|$)'
7346
  model: 'G4/G5'
7347
  - regex: 'JIAYU[ _-](G4[S]?|G2F|G3[S]?|S[23])(?:[);/ ]|$)'
7348
  model: '$1'
7349
+ - regex: 'JY[-_]([a-z0-9]+|G4C)(?:[);/ ]|$)'
7350
+ model: 'JY-$1'
7351
 
7352
  # Jolla
7353
  Jolla:
7393
 
7394
  # Kazam
7395
  Kazam:
7396
+ regex: 'Kazam|Trooper_X[0-9][0-9](?:[);/ ]|$)|Tornado 348|TROOPER 4\.0'
7397
  device: 'smartphone'
7398
  models:
7399
  - regex: 'Tornado 348'
7400
  model: 'Tornado 348'
7401
  - regex: 'Thunder 450W'
7402
  model: 'Thunder 450W'
7403
+ - regex: 'TROOPER 4\.0'
7404
+ model: 'Trooper X4.0'
7405
  - regex: 'Trooper_X([0-9])([0-9])(?:[);/ ]|$)'
7406
  model: 'Trooper X$1.$2'
7407
  - regex: 'Kazam[; _]([^;/)]+)(?: Build|\))'
7618
 
7619
  # kyocera (kyocera.co.jp, kyocera.com)
7620
  Kyocera:
7621
+ regex: 'Kyocera|KWC-|QC-|(?:NP501KC|302KC|503KC|602KC|705KC|C51[27]0|C5155|C5215|C67[35]0|C6522N?|C6530N|C6740N?|C6743|E6[89]10|KYL2[13]|KYV3[13-9]|KYT3[123]|KYF3[123579]|KYY2[1-4]|S2151|KC-S701|S4-KC|KYV40U?|KYV4[1-8]|KYV4[47][-_]u|KC-S301AE|X3-KC|S6-KC|E6560[CT]|E6782[L]?|E6790(?:TM)?|704KC|A001KC)(?:[);/ ]|$)'
7622
  device: 'smartphone'
7623
  models:
7624
  # explicit smartphone models
7636
  model: 'Digno E'
7637
  - regex: '704KC(?:[);/ ]|$)'
7638
  model: 'Digno J'
7639
+ - regex: '302KC(?:[);/ ]|$)'
7640
+ model: 'Digno T'
7641
  - regex: 'NP501KC(?:[);/ ]|$)'
7642
  model: 'Digno'
7643
  - regex: 'KYV36(?:[);/ ]|$)'
7754
 
7755
  # Krüger&Matz (Kruger&Matz)
7756
  Krüger&Matz:
7757
+ regex: 'Kruger[ _&]Matz|KrugerMatz[ _]|FLOW5PLUS|FLOW7|FLOW6S|DRIVE[_ ]6S?|MOVE_|LIVE_6plus|LIVE 5 PLUS|LIVE4_KM043[89]|KM(?:106[67]|1065G|0701_1|0702|0805_1)'
7758
  device: 'smartphone'
7759
  models:
7760
  - regex: 'MOVE_6_mini'
7763
  model: 'MOVE $1'
7764
  - regex: 'DRIVE 4 mini LTE'
7765
  model: 'DRIVE 4 mini LTE'
7766
+ - regex: 'DRIVE[ _]([456][S]?)(?:[);/ ]|$)'
7767
  model: 'DRIVE $1'
7768
+ - regex: 'FLOW5PLUS(?:[);/ ]|$)'
7769
+ model: 'FLOW 5 Plus'
7770
+ - regex: 'FLOW[ _]?([476][S]?)(?:[);/ ]|$)'
7771
  model: 'FLOW $1'
7772
  - regex: 'LIVE4_(KM043[89])(?:[);/ ]|$)'
7773
  model: 'LIVE 4 $1'
7775
  model: 'LIVE 4'
7776
  - regex: '_LIVE5_(KM0450)(?:[);/ ]|$)'
7777
  model: 'LIVE 5 $1'
7778
+ - regex: 'LIVE 5 PLUS(?:[);/ ]|$)'
7779
+ model: 'LIVE 5 Plus'
7780
+ - regex: 'LIVE_6plus(?:[);/ ]|$)'
7781
+ model: 'LIVE 6 Plus' # KM0454
7782
 
7783
  - regex: 'KM(106[67])(?:[);/ ]|$)'
7784
  device: 'tablet'
7814
  - regex: 'Kingcomm C500'
7815
  model: 'Super Smart Plus X3'
7816
 
7817
+ # Lava (Lavamobiles.com)
7818
  Lava:
7819
+ regex: 'Lava[ _]|LAVAA1|(?:DISCOVER136|KKT QUADRA)|iris[ _]?([^/;]+)(?:\)| Build)|A(?:67|76) Build|X1 Selfie Build|X41 Plus Build|(?:Flair Z1|PixelV1|Z61_2GB|A97 IPS)(?:[);/ ]|$)'
7820
  device: 'smartphone'
7821
  models:
7822
  - regex: 'Flair Z1(?:[);/ ]|$)'
7833
  model: 'Iris X1 Selfie'
7834
  - regex: 'X41 Plus Build'
7835
  model: 'X41 Plus'
7836
+ - regex: 'LAVA[_ ]?A([13])(?:[);/ ]|$)'
7837
+ model: 'A$1'
7838
  - regex: 'LAVA_R1'
7839
  model: 'R1'
7840
  - regex: 'Z61_2GB(?:[);/ ]|$)'
7841
  model: 'Z61'
7842
+
7843
+ - regex: 'DISCOVER136'
7844
+ device: 'feature phone'
7845
+ model: 'Discover 136'
7846
+ - regex: 'KKT QUADRA'
7847
+ device: 'feature phone'
7848
+ model: 'KKT Quadra'
7849
+ - regex: 'KKT40[ ]?Power[P\+]'
7850
+ device: 'feature phone'
7851
+ model: 'KKT40 Power Plus'
7852
+
7853
  - regex: 'iris[ _]?([^/;]+)(?:\)| Build)'
7854
  model: 'Iris $1'
7855
  - regex: 'Lava[ _]?([^/;]+)(?:/| Build)'
7954
 
7955
  # Leagoo
7956
  Leagoo:
7957
+ regex: 'LEAGOO[ _-]?|(?:M5 EDGE|KIICAA (POWER|MIX)|Leapad[ _]7s|Elite 1|Venture 1|Z10-E)(?:[);/ ]|$)'
7958
  device: 'smartphone'
7959
  models:
7960
  - regex: 'LEAGOO[- _]M8[_-]?Pro(?:[);/ ]|$)'
7973
  model: 'Elite 1'
7974
  - regex: 'Venture 1(?:[);/ ]|$)'
7975
  model: 'Venture 1'
7976
+ - regex: '(Z10-E)(?:[);/ ]|$)'
7977
+ model: '$1'
7978
 
7979
  - regex: '(Leapad[ _]7s)'
7980
  model: '$1'
7992
 
7993
  # LeEco
7994
  LeEco:
7995
+ regex: 'Letv|LeEco|Le ?X[0-9][^;/]+|Le Max|Le [12]|Le2[_ ]x527|X900 Build|(?:X[89]00\+|X52[67])(?:[);/ ]|$)'
7996
  device: 'smartphone'
7997
  models:
7998
  - regex: 'X800\+'
8005
  model: '$1'
8006
  - regex: 'X900 Build'
8007
  model: 'Le X900'
8008
+ - regex: '(?:Le ?X526|Le2[_ ]x527|Le 2|X52[67])(?:[);/ ]|$)'
8009
  model: 'Le 2'
8010
  - regex: 'Le ?X([^;/]+) Build'
8011
  model: 'Le X$1'
8037
 
8038
  # Lephone
8039
  Lephone:
8040
+ regex: 'lephone[ _]|lephoneP1'
8041
  device: 'smartphone'
8042
  models:
8043
  - regex: 'lephone[ _](K7|K10)'
8044
  device: 'feature phone'
8045
  model: '$1'
8046
+ - regex: 'lephone(?:[ _])?(W(1[0125]|[279])|T2|P1)(?:[);/ ]|$)'
8047
  model: '$1'
8048
  - regex: 'lephone_W7_plus'
8049
  model: 'W7 Plus'
8056
 
8057
  # lenovo
8058
  Lenovo:
8059
+ regex: '(?:LNV-)?Lenovo|IdeaTab|IdeaPad|Thinkpad|Yoga Tablet|Tab2A[0-9]-[0-9]{2}[a-z]?|ZUK[ -_]|(?:TB2-X30L|TB3-710I|YT3-X50[ML]|K50a40|TB-(?:X103F|8504F|X304F|X704V|X704A)|A5500-H|A2107A-H|S6000|Z2 Plus|Vibe P1|VIBE C|VIBE [ZX]2|Vibe K5(?: Plus)?|P2A42|L18011|[5-8]01LV|Z2131|K350t|K31-t3|TAB 2 A8-50LC)(?:[);/ ]|$)'
8060
  device: 'smartphone'
8061
  models:
8062
  - regex: 'Lenovo ?G780'
8068
  - regex: 'Lenovo ?A3500-(H|HV|F)'
8069
  model: 'IdeaTab A7-50'
8070
  device: 'tablet'
8071
+ - regex: '(?:Lenovo[ _])?A5500-[HF]'
8072
  model: 'IdeaTab A8-50'
8073
  device: 'tablet'
8074
  - regex: 'Lenovo ?A7600-[HF]'
8107
  - regex: '801LV(?:[);/ ]|$)'
8108
  model: 'TAB5 10.1"'
8109
  device: 'tablet'
8110
+ - regex: 'TB-X103F(?:[);/ ]|$)'
8111
+ model: 'TAB10 10.1"'
8112
+ device: 'tablet'
8113
  - regex: 'TB-X704A(?:[);/ ]|$)'
8114
  model: 'Moto Tab'
8115
  device: 'tablet'
8219
  model: 'Vibe K5'
8220
  - regex: 'VIBE Z2(?:[);/ ]|$)'
8221
  model: 'Vibe Z2'
8222
+ - regex: 'VIBE C(?:[);/ ]|$)'
8223
+ model: 'Vibe C'
8224
  - regex: 'VIBE X2(?:[);/ ]|$)'
8225
  model: 'Vibe X2'
8226
  - regex: 'k33a48(?:[);/ ]|$)'
8233
  model: 'K6 Power'
8234
  - regex: 'P1ma40(?:[);/ ]|$)'
8235
  model: 'Vibe P1m'
8236
+ - regex: '(?:P1(?:a42|c72)|Vibe P1)(?:[);/ ]|$)'
8237
  model: 'Vibe P1'
8238
  - regex: 'A2016a40(?:[);/ ]|$)'
8239
  model: 'Vibe B'
8347
 
8348
  # LG
8349
  LG:
8350
+ regex: 'LG|portalmmm/2\.0 (?:KE|KG|KP|L3)|(?:VX[0-9]+|L-0[12]D|L-07C|P713|(LM-[A-Z][0-9]{3}[A-Z]{0,3}(?:\(FGN?\)|\(G\)|\.FN|\.F(?:GN?)?)?)|LM-(X625N1|G820QM[0127]))(?:[);/ ]|$)|NetCast|RS98[78]|RS500|VS(?:50[01]|835|876|880|98[0578]|99[056]|(410|415|425|500|880)PP)|VS820|VS870 4G|Nexsus 5|LML(41[34]D|211B|713D|212V)L|VK810 4G|VK815|X5-LG|L-05D|L-03K|L-01[LJK]|L-[45]1A|901LG|A001LG|802LG|402LG|LGT32|L-02K|L-01F|LM-V40'
8351
  device: 'smartphone'
8352
  models:
8353
  - regex: 'LG-D325'
8500
  model: 'Aristo 2'
8501
  - regex: 'LM-X220'
8502
  model: 'Aristo 3'
8503
+ - regex: 'LM-V40(?:5|9N)?(?:[);/ ]|$)'
8504
  model: 'V40 ThinQ'
8505
  - regex: 'LM-V500N'
8506
  model: 'V50'
8769
  - regex: 'Link5(?:[);/ ]|$)'
8770
  model: 'Link 5'
8771
 
8772
+ # Karbonn (karbonnmobiles.com)
8773
  Karbonn:
8774
+ regex: '(?:Browser-)?Karbonn|K9 Kavach 4G|K9 Music 4G|K9 Smart|K9 VIRAAT 4G|Aura Sleek Plus|Aura Note Play|Titanium[ _](?:3D-Plex|Octane Plus|Vista 4G|Jumbo|S360|S1[059]|S35|S20[13]|S22|S1|S200 HD)|K-lite F3'
8775
  device: 'smartphone'
8776
  models:
8777
  - regex: 'K9 Kavach 4G'
8796
  model: 'K9 Viraat 4G'
8797
  - regex: 'Titanium[ _]S2[ _]Plus'
8798
  model: 'Titanium S2 Plus'
8799
+ - regex: 'Titanium[_ ]S(99|360|1[059]|109|35|200 HD|20[13]|22|1)(?:[);/ ]|$)'
8800
+ model: 'Titanium S$1'
8801
  - regex: 'Titanium Vista 4G'
8802
  model: 'Titanium Vista 4G'
8803
  - regex: 'Titanium Jumbo 2'
8804
  model: 'Titanium Jumbo 2'
8805
  - regex: 'Titanium Jumbo'
8806
  model: 'Titanium Jumbo'
8807
+ - regex: 'Titanium Octane Plus'
8808
+ model: 'Titanium Octane Plus'
8809
+ - regex: 'Titanium[ _]3D-Plex'
8810
+ model: 'Titanium 3D Plex'
8811
+ - regex: 'K-lite F3'
8812
+ model: 'K-Lite F3'
8813
  - regex: 'Karbonn ([a-z0-9]+) WAP-Browser'
8814
  model: '$1'
8815
  device: 'feature phone'
8864
  regex: 'MAJESTIC[ _-]|CRONO ?[0-9]+|TAB (?:647|411) 3G|URANO 77LTE'
8865
  device: 'smartphone'
8866
  models:
8867
+ - regex: 'URANO 77LTE(?:[);/ ]|$)'
8868
+ model: 'Urano 77 LTE'
8869
+ - regex: 'TAB (647|411) 3G'
8870
+ model: 'Tab $1 3G'
8871
+ device: 'tablet'
8872
+ - regex: 'MAJESTIC[ _]Tab([^;/]+)Build'
8873
+ model: 'Tab$1'
8874
+ device: 'tablet'
8875
+ - regex: 'MAJESTIC[ _]Tab([^);/]+)(?:[);/]|$)'
8876
+ model: 'Tab$1'
8877
+ device: 'tablet'
8878
+ - regex: 'MAJESTIC[ _]([^;/]+)Build'
8879
+ model: '$1'
8880
+ - regex: 'MAJESTIC[ _]([^);/]+)(?:(?:[);/ ]|$)|$)'
8881
+ model: '$1'
8882
+ - regex: 'CRONO ?([0-9]+) Build'
8883
+ model: 'Crono $1'
8884
+ - regex: 'CRONO ?([0-9]+)(?:[);/]|$)'
8885
+ model: 'Crono $1'
8886
 
8887
  # Manta Multimedia
8888
  Manta Multimedia:
8889
+ regex: 'MSP950(1[245]|2[01])|MSP96017|((?<!/)MID713|MID(?:06[SN]|08[S]?|12|13|14|15|701|702|703|704|705(?:DC)?|706[AS]?|707|708|709|711|712|714|717|781|801|802|901|1001|1002|1003|1004(?: 3G)?|1005|1009|1010|7802|9701|9702))(?:[);/ ]|$)'
8890
  device: 'smartphone'
8891
  models:
8892
  - regex: '((?<!/)MID713|MID(?:06[SN]|08[S]?|12|13|14|15|701|702|703|704|705(?:DC)?|706[AS]?|707|708|709|711|712|714|717|781|801|802|901|1001|1002|1003|1004(?: 3G)?|1005|1009|1010|7802|9701|9702))(?:[);/ ]|$)'
8893
  device: 'tablet'
8894
  model: '$1'
8895
+ - regex: 'MSP95012'
8896
+ model: 'Titano 1'
8897
  - regex: 'MSP95014'
8898
  model: 'Titano 3'
8899
  - regex: 'MSP95015'
9046
  - regex: 'M[_-]PP[Ax]X(470|510|520)U(?:[);/ ]|$)'
9047
  model: 'PhonePad Duo X$1U'
9048
  device: 'smartphone'
9049
+ - regex: 'M-PPxG(400|501|[457][PM]?)(?:[);/ ]|$)'
9050
  model: 'PhonePad Duo G$1'
9051
  device: 'smartphone'
9052
+ - regex: 'M-PPxS(470|501|5P?)(?:[);/ ]|$)'
9053
  model: 'PhonePad Duo S$1'
9054
  device: 'smartphone'
9055
 
9202
 
9203
  # Memup
9204
  Memup:
9205
+ regex: 'SlidePad ?([^;/]*) Build|SPNG?[0-9]{2,4}[a-z]{0,2}(?:[);/ ]|$)|SP704CE?|SP-NG708-3G'
9206
  device: 'tablet'
9207
  models:
9208
  - regex: 'SlidePad ?([^;/]*) Build'
9209
  model: 'SlidePad $1'
9210
  - regex: 'SPNG([0-9]{2,4}[a-z]{0,2})(?:[);/ ]|$)'
9211
  model: 'SlidePad NG$1'
9212
+ - regex: 'SP-NG(708)-3G(?:[);/ ]|$)'
9213
+ model: 'SlidePad NG$1 3G'
9214
  - regex: 'SP704(CE?)'
9215
  model: 'SlidePad 704$1'
9216
 
9232
 
9233
  # mio
9234
  Mio:
9235
+ regex: 'MIO(?:/)?([a-z0-9]+)|(?:MOBIX M6|Mio TouchPad 7 Quad Core)(?:[);/ ]|$)'
9236
  device: 'smartphone'
9237
  models:
9238
  - regex: 'MOBIX M6(?:[);/ ]|$)'
9239
  model: 'Mobix M6'
9240
  - regex: 'MIO(?:/)?([a-z0-9]+)'
9241
  model: '$1'
9242
+ - regex: 'Mio TouchPad 7 Quad Core'
9243
+ device: 'tablet'
9244
+ model: 'TouchPad 7 Quad Core'
9245
 
9246
  # Miray
9247
  Miray:
9314
 
9315
  # Mobicel
9316
  Mobicel:
9317
+ regex: 'Mobicel_(R1)|(?:Matrix|TRENDY PLUS)(?:[);/ ]|$)'
9318
  device: 'smartphone'
9319
  models:
9320
  - regex: 'Matrix'
9321
  model: 'Matrix'
9322
+ - regex: 'TRENDY PLUS'
9323
+ model: 'Trendy Plus'
9324
  - regex: 'Mobicel_(R1)'
9325
  model: '$1'
9326
 
9677
  - regex: 'MyTAB-U55GT(?:[);/ ]|$)'
9678
  model: 'U55GT'
9679
 
9680
+ # myphone (myphone.com.ph)
9681
  MyPhone:
9682
+ regex: '(?:MyPhone|MyPad|MyTab)[ _][^;/)]+( Build|\))|Cube_LTE|myTab10II|HAMMER[ _](Blade2_PRO|IRON_3|Explorer|ENERGY|Titan 2|AXE[_ ](?:M[_ ]LTE|Pro)|Iron 2|Active[2]?(_LTE)?)|C-Smart_pix|myPhone_Fun_8|myA17|myX12|Pocket_2|myT6 DTV|myXI1 (?:Plus|Pro)|myXI3'
9683
  device: 'smartphone'
9684
  models:
9685
+ # explicit table models
9686
  - regex: 'MyPad[ _]([^;/]+) Build'
9687
  model: 'MyPad $1'
9688
  device: 'tablet'
9689
  - regex: 'MyTab[ _]([^;/]+) Build'
9690
  model: 'MyTab $1'
9691
  device: 'tablet'
9692
+ - regex: 'myTab_10III'
9693
+ model: 'MyTab 10 III'
9694
+ device: 'tablet'
9695
  - regex: 'myTab10II'
9696
  model: 'MyTab 10 II'
9697
  device: 'tablet'
9698
+ - regex: 'myT6 DTV'
9699
+ model: 'myT6 DTV'
9700
+ device: 'tablet'
9701
+
9702
+ # explicit smartphones models
9703
  - regex: 'Cube_LTE'
9704
  model: 'Cube LTE'
9705
  - regex: 'HAMMER[ _]ENERGY'
9708
  model: 'Hammer Axe M LTE'
9709
  - regex: 'Hammer Titan 2'
9710
  model: 'Hammer Titan 2'
9711
+ - regex: 'Hammer[ _]Iron[ _](2|3)'
9712
+ model: 'Hammer Iron $1'
9713
+ - regex: 'Hammer[ _]Explorer'
9714
+ model: 'Hammer Explorer'
9715
  - regex: 'Hammer Active(?:[);/ ]|$)'
9716
  model: 'Hammer Active'
9717
  - regex: 'Hammer_Active2(?:[);/ ]|$)'
9724
  model: 'Hammer Blade 2 Pro'
9725
  - regex: 'C-Smart_pix'
9726
  model: 'C-Smart Pix'
9727
+ - regex: 'Pocket_2(?:[);/ ]|$)'
9728
+ model: 'Pocket 2'
9729
  - regex: 'myA17(?:[);/ ]|$)'
9730
  model: 'myA17'
9731
  - regex: 'myPhone_Fun_8'
9732
  model: 'FUN 8'
9733
+ - regex: 'myX12(?:[);/ ]|$)'
9734
+ model: 'myX12'
9735
+ - regex: 'myXI1 Plus(?:[);/ ]|$)'
9736
+ model: 'myXI1 Plus'
9737
+ - regex: 'myXI1 Pro(?:[);/ ]|$)'
9738
+ model: 'myXI1 Pro'
9739
+ - regex: 'myXI3(?:[);/ ]|$)'
9740
+ model: 'myXI3'
9741
+
9742
+ # general detections
9743
  - regex: 'MyPhone[ _]([^;/)]+)( Build|\))'
9744
  model: '$1'
9745
 
9785
 
9786
  # Navon
9787
  Navon:
9788
+ regex: 'Navon[_ ]|(?:Superme_Max|Supreme[_ ](?:Fine|Chief|Pure|Pro)(?:[_ ](?:Mini|Plus))?)(?:[);/ ]|$)'
9789
  device: 'smartphone'
9790
  models:
9791
  - regex: 'Superme_Max(?:[);/ ]|$)'
9806
  model: 'Supreme Pro'
9807
  - regex: 'Navon[_ ]Infinity(?:[);/ ]|$)'
9808
  model: 'Infinity'
9809
+ - regex: 'Navon[_ ]Platinum 10 3G(?:[);/ ]|$)'
9810
+ model: 'Platinum 10.1" 3G'
9811
 
9812
  # NOA
9813
  NOA:
9814
+ regex: 'NOA[ _]|Hummer(?:_2019_R|LE)|NextSE'
9815
  device: 'smartphone'
9816
  models:
9817
  - regex: 'NOA[_ ]CORE[_ ]FORTE'
9818
  model: 'Core Forte'
9819
  - regex: 'HummerLE'
9820
  model: 'Hummer LE'
9821
+ - regex: 'Hummer_2019_R'
9822
+ model: 'Hummer R (2019)'
9823
  - regex: 'NOA[_ ]Hummer[_ ]Lite'
9824
  model: 'Hummer Lite'
9825
  - regex: 'NOA[_ ]MOVEse'
9852
 
9853
  # nec
9854
  NEC:
9855
+ regex: 'NEC[ _\-]|KGT/2\.0|PC-TE508HAW|portalmmm/1\.0 (?:DB|N)|(?:portalmmm|o2imode)/2.0[ ,]N|(?:N-06C|N-02E)(?:[);/ ]|$)'
9856
  device: 'smartphone'
9857
  models:
9858
  - regex: 'N-06C(?:[);/ ]|$)'
9859
  model: 'Medias Amadana'
9860
+ - regex: 'N-02E(?:[);/ ]|$)'
9861
+ model: 'Medias U'
9862
  - regex: '(?:NEC[ _\-]|KGT/2\.0 )([a-z0-9]+)'
9863
  model: '$1'
9864
  - regex: 'portalmmm/1\.0 ((?:DB|N)[a-z0-9]+)'
9902
  regex: 'GTV100'
9903
  device: 'tv'
9904
  models:
9905
+ - regex: 'GTV100'
9906
+ model: 'NeoTV Prime'
9907
 
9908
  # NeuImage
9909
  NeuImage:
9915
 
9916
  # NextBook
9917
  NextBook:
9918
+ regex: 'Next[0-9]|NX(?:785QC8G|M900MC|008HD8G|010HI8G|M908HC|M726|16A8116K|A8QC116|16A10132S|16A11264)'
9919
  device: 'tablet'
9920
  models:
9921
  - regex: 'NX008HD8G'
9922
  model: 'Premium 8 HD'
9923
  - regex: 'NXA8QC116'
9924
  model: 'Ares 8'
9925
+ - regex: 'NX16A8116K'
9926
+ model: 'Ares A8'
9927
+ - regex: 'NX16A10132S'
9928
+ model: 'Ares A10'
9929
+ - regex: 'NX16A11264'
9930
+ model: 'Ares A11'
9931
  - regex: 'NXM908HC'
9932
  model: 'Premium 9'
9933
  - regex: 'NX010HI8G'
9988
 
9989
  # Nomu
9990
  Nomu:
9991
+ regex: 'Nomu[ _-](?:T18|S30mini|S10)(?:[);/ ]|$)|V1600S(?:[);/ ]|$)'
9992
  device: 'smartphone'
9993
  models:
9994
  - regex: 'Nomu[ _-]T18(?:[);/ ]|$)'
9995
  model: 'T18'
9996
+ - regex: 'Nomu[ _-]s10(?:[);/ ]|$)'
9997
+ model: 'S10'
9998
  - regex: 'Nomu[ _-]S30mini(?:[);/ ]|$)'
9999
  model: 'S30 Mini'
10000
+ - regex: '(V1600S)(?:[);/ ]|$)'
10001
+ model: '$1'
10002
 
10003
  # Nomi
10004
  Nomi:
10005
+ regex: 'Nomi[ _-]|(C101010 Ultra2|i501[234]|i5032|i50[57]0|i5510|i5532|C0(700(?:[02358]|2HD)|7850)|C1010[0-3])(?:[);/ ]|$)'
10006
  device: 'smartphone'
10007
  models:
10008
  - regex: 'i501[23](?:[);/ ]|$)'
10009
  model: 'Evo M2'
10010
+ - regex: 'I5070(?:[);/ ]|$)'
10011
+ model: 'Iron-X'
10012
  - regex: 'i5014(?:[);/ ]|$)'
10013
  model: 'Evo M4'
10014
  - regex: 'i5032(?:[);/ ]|$)'
10145
 
10146
  # Odys
10147
  Odys:
10148
+ regex: 'ODYS[ _-]|IEOS[_ ]([^/;]+)|NOON(?:_PRO)? Build|SPACE10_(?:PLUS|PRO)_3G|THOR_?10|TAO_X10|RAPID_?(?:10|7)_?LTE|MAVEN_?10_|CONNECT[78]|ELEMENT10_PLUS_3G|XELIO[_0-9P]|ADM816HC|ADM8000KP|NEO6_LTE|EOS10|AEON|FALCON_10_PLUS_3G|FUSION|THANOS_10|MAVEN_X10_HD(?:_LTE)?|JUNIOR_8_PRO|JuniorT8Pro|(?:NOVA|PYRO)_X?7_PLUS_3G|UNO_X8|SLADE_X55'
10149
  device: 'tablet'
10150
  models:
10151
  - regex: 'XELIO[_ ]A10'
10162
  model: 'Xelio 10 Xtreme'
10163
  - regex: 'XELIO10_PLUS_3G'
10164
  model: 'Xelio 10 Plus 3G'
10165
+ - regex: 'XELIO10_HD_PLUS_3G'
10166
+ model: 'Xelio 10 HD Plus 3G'
10167
+ - regex: 'XELIO_10_HD'
10168
+ model: 'Xelio 10 HD'
10169
  - regex: 'ELEMENT10_PLUS_3G'
10170
  model: 'Element 10 Plus 3G'
10171
  - regex: 'CONNECT8PLUS'
10196
  model: 'Space 10 Pro 3G'
10197
  - regex: 'THOR_?10 Build'
10198
  model: 'Thor 10'
10199
+ - regex: 'JuniorT8Pro'
10200
+ model: 'Junior T8 Pro'
10201
  - regex: 'JUNIOR_8_PRO'
10202
  model: 'Junior 8 Pro'
10203
  - regex: 'ADM816HC'
10210
  model: 'Falcon 10 Plus 3G'
10211
  - regex: 'FUSION'
10212
  model: 'Fusion 7'
10213
+ - regex: 'UNO_X8'
10214
+ model: 'Uno X8'
 
10215
  - regex: 'ADM8000KP'
10216
  model: 'Titan'
10217
+ - regex: 'PYRO_7_PLUS_3G'
10218
+ model: 'Pyro 7 Plus 3G'
10219
+ - regex: 'NOVA_X7_PLUS_3G'
10220
+ model: 'Nova X7 Plus 3G'
10221
+ - regex: 'ODYS_NOVA_X7'
10222
+ model: 'Nova X7'
10223
  - regex: 'THOR_?10_PLUS_3G'
10224
  model: 'Thor 10 Plus 3G'
10225
+
10226
+ # explicit smartphones models
10227
+ - regex: 'NEO6[_ ]LTE'
10228
+ model: 'Neo 6 LTE'
10229
+ device: 'smartphone'
10230
+ - regex: 'SLADE_X55'
10231
+ model: 'Slade X55'
10232
+ device: 'smartphone'
10233
+
10234
+ # general detections
10235
  - regex: 'IEOS[ _]([^/;]+) Build'
10236
  model: 'Ieos $1'
10237
  - regex: '(?:ODYS[ _-])?NOON Build'
10281
  - regex: 'Obi[ _-]([^;/)]+)(?:[;/)]|$)'
10282
  model: '$1'
10283
 
10284
+ # Okapia
10285
+ Okapia:
10286
+ regex: 'Signature (?:L|Pro|Touch)'
10287
+ device: 'smartphone'
10288
+ models:
10289
+ - regex: 'Signature (L|Pro|Touch)'
10290
+ model: 'Signature $1'
10291
+
10292
  # onda
10293
  Onda:
10294
+ regex: 'Onda|(?:(?:V820w|V891[w]?|V919(?: 3G)? Air)[ _-]DualOS|(?:V919 4G Air|V989 Air|V972) Core[48]|T2101L2B1C| V10 4G|OBOOK (?:20 SE|20 PLUS DUALOS)|OBOOK10 SE|V919 Air CH DualOS)(?:[);/ ]|$)'
10295
  device: 'smartphone'
10296
  models:
10297
  # explicit tablet models
10319
  - regex: 'V919 4G Air Core8'
10320
  model: 'V919 4G Air Core 8'
10321
  device: 'tablet'
10322
+ - regex: 'V972 Core4'
10323
+ model: 'V919 Core 4'
10324
+ device: 'tablet'
10325
  - regex: 'V989 Air Core8'
10326
  model: 'V989 Air Core 8'
10327
  device: 'tablet'
10387
 
10388
  # Realme (sub brand Oppo)
10389
  Realme:
10390
+ regex: 'Realme[ _]|(?:RMX(?:19(03|4[1235]|19|9[23]|2[157]|[01379]1|73)|20(?:[025-7]1|[037]2|2[57]|63|7[56]|8[56]|[234]0)|21(?:[12]1|42|55|7[60]|8[059])|2200|18(0[1579]|11|3[13]|2[157]|[45]1|45))|(?:OPPO[ _]?)?CPH1861)(?:[);/ ]|$)'
10391
  device: 'smartphone'
10392
  models:
10393
  - regex: '(?:OPPO[ _]?)?CPH1861(?:[);/ ]|$)'
10430
  model: '6S'
10431
  - regex: 'RMX206[13](?:[);/ ]|$)'
10432
  model: '6 Pro'
10433
+ - regex: 'RMX2155'
10434
+ model: '7'
10435
  - regex: 'RMX2170'
10436
  model: '7 Pro'
10437
  - regex: 'RMX1925(?:[);/ ]|$)'
10472
 
10473
  # Oppo (oppo.com)
10474
  OPPO:
10475
+ regex: '(?:OB-)?OPPO[ _]?([a-z0-9]+)|N1T|R8001|OPG01|A00[12]OP|(?:X90[07][0679]|U70[57]T?|X909T?|R(?:10[01]1|2001|201[07]|6007|7005|7007|80[13579]|81[13579]|82[01379]|83[013]|800[067]|8015|810[679]|811[13]|820[057])[KLSTW]?|N520[79]|N5117|A33f|A33fw|A37fw?|PAAM00|PAAT00|PAC[TM]00)(?:[);/ ]|$)|R7kf|R7plusf|R7Plusm|A1601|CPH[0-9]{4}|CPH19(69|79|23|1[179])|PB(A[TM]00|CT10|BT30|CM[13]0|[FD]M00)|P(DAM10|ADM00|AF[TM]00|ADT00|AHM00|BBM[03]0|BBT00|BDT00|BFT00|[CB]E[MT]00|CA[MT]00|C[CDG]M00|CA[MT]10|[CD]PM00|CRM00|CDT00|CD[TM]10|CHM[013]0|CKM[08]0|CLM[15]0|DEM[13]0|DHM00|DK[TM]00|DPT00|DB[TM]00|DCM00|[CD]NM00|DVM00|DY[TM]20|DNT00|EA[TM]00)'
10476
  device: 'smartphone'
10477
  models:
10478
  - regex: 'PCHM10(?:[);/ ]|$)'
10551
  model: 'AX7'
10552
  - regex: '(?:OPPO[ _]?)?X9009(?:[);/ ]|$)'
10553
  model: 'F1 Plus'
10554
+ - regex: 'CPH191[135](?:[);/ ]|$)'
10555
  model: 'F11'
10556
  - regex: 'CPH19(?:69|87)(?:[);/ ]|$)'
10557
  model: 'F11 Pro'
10558
+ - regex: '(?:OPPO[ _]?)?(?:CPH2119)(?:[);/ ]|$)'
10559
+ model: 'F17 Pro'
10560
  - regex: '(?:OPPO[ _]?)?A1601(?:[);/ ]|$)'
10561
  model: 'F1s'
10562
  - regex: '(?:OPPO[ _]?)?CPH1609(?:[);/ ]|$)'
10631
  model: 'Piano'
10632
  - regex: '(?:OPPO[ _]?)?CPH1707(?:[);/ ]|$)'
10633
  model: 'R11'
10634
+ - regex: 'R8001(?:[);/ ]|$)'
10635
+ model: 'R1K'
10636
  - regex: '(?:OPPO[ _]?)?CPH1719(?:[);/ ]|$)'
10637
  model: 'R11s'
10638
  - regex: '(?:OPPO[ _]?)?CPH1721(?:[);/ ]|$)'
10647
  model: 'R17'
10648
  - regex: '(?:OPPO[ _]?)?(?:CPH1893)(?:[);/ ]|$)'
10649
  model: 'R17 Neo'
10650
+ - regex: '(?:OPPO[ _]?)?(?:CPH1877|PBD[MT]00)(?:[);/ ]|$)'
10651
  model: 'R17 Pro'
10652
  - regex: '(?:OPPO[ _]?)?R8006(?:[);/ ]|$)'
10653
  model: 'R1L'
10766
 
10767
  # Oukitel
10768
  Oukitel:
10769
+ regex: 'OUKITEL|(?:(?:C15|C16|K10000|K[46]000)(?:[ _]Pro)|K4000Pro|U20_Plus|WP5000|WP[58] Pro|K[46]000[ _](?:Plus|Lite)|Y4800|K10000|K[4567]000| WP[5-7])(?:[);/ ]|$)'
10770
  device: 'smartphone'
10771
  models:
10772
+ - regex: '(C15|C16|K10000|K[46]000|WP[258]|U15)[ _]?Pro(?:[);/ ]|$)'
10773
  model: '$1 Pro'
10774
  - regex: 'OUKITEL K([37])(?:[);/ ]|$)'
10775
  model: 'K$1'
10776
  - regex: '(K10000)[ _]Max(?:[);/ ]|$)'
10777
  model: '$1 Max'
10778
+ - regex: '(U20|K[46]000)[_ ]?Plus(?:[);/ ]|$)'
10779
  model: '$1 Plus'
10780
  - regex: '(K4000)[_ ]Lite(?:[);/ ]|$)'
10781
  model: '$1 Lite'
10782
+ - regex: '(Y4800|K10000|K[4567]000|WP2|WP5000)(?:[);/ ]|$)'
10783
+ model: '$1'
10784
+ - regex: ' (WP[5-7])(?:[);/ ]|$)'
10785
  model: '$1'
10786
 
10787
  # Ouki
10825
 
10826
  # Oysters
10827
  Oysters:
10828
+ regex: 'Oysters|T84ERI[ _]3G|T72HM(s_)?3G|T102MS_3G|T102ER3G|(T74HMi|T84Bi)[_ ]4G|T74MR4G|T84Ni[_ ][34]G|Pacific[ ]?800i|T104B_[34]G|IndianV|T72HA_3G|T74D_3G|T74N_3G|T74SC_3G|T74Mai_3G|T104MBi_3G|T104SCi_3G|T104ER4G|Atlantic4G|AntarcticE|T7V 3G'
10829
  device: 'tablet'
10830
  models:
10831
  - regex: 'Pacific[ ]?800i'
10845
  model: '$1'
10846
  - regex: '(T84ERI[ _]3G|T72HM(s_)?3G|(?:(T74HMi|T84Bi)[_ ]4G)|T84Ni[_ ][34]G)'
10847
  model: '$1'
10848
+ - regex: '(T74MR|T102MS|T104B|T74SC|T74[DN]|T72HA|T102ER|T104SCi|T104MBi|T104ER|T7V)[ _]?([34]G)'
10849
  model: '$1 $2'
10850
  - regex: 'T74Mai_3G'
10851
  model: 'T74MAi 3G'
10953
 
10954
  # ArmPhone
10955
  ArmPhone:
10956
+ regex: '(TSD Octa A0520P|TSD Quadra A050[59]P)(?:[);/ ]|$)'
10957
  device: 'smartphone'
10958
  model: '$1'
10959
 
10979
 
10980
  # philips
10981
  Philips:
10982
+ regex: 'Philips|AND1E(?:[);/ ]|$)|NETTV/|PI3210G|TLE(821L|722G)|TPM1[79]1E|70PUH6774_96|QM16[134]E|Xenium S[25]66|S397|W5510'
10983
  device: 'smartphone'
10984
  models:
10985
  - regex: '(?:Philips[_ ])?Xenium[ _](S[25]66|V787)(?:[);/ ]|$)'
10986
  model: 'Xenium $1'
10987
+ - regex: '(?:Philips[_ ])?(S397|W5510)(?:[);/ ]|$)'
10988
+ model: '$1'
10989
  - regex: 'AND1E(?: TV)?(?:[);/ ]|$)'
10990
  model: 'Android TV'
10991
  device: 'tv'
11061
  model: 'Play Three v$1'
11062
  - regex: 'Play Two'
11063
  model: 'Play Two'
11064
+ - regex: 'Play Five'
11065
+ model: 'Play Five'
11066
+ - regex: 'Pixus[ _]Sprint'
11067
+ model: 'Sprint'
11068
  - regex: 'Touch 7 3G'
11069
  model: 'Touch 7 3G'
11070
  - regex: 'Pixus[ _]hiMax'
11073
  model: 'Blast 10.1"'
11074
  - regex: 'Pixus[ _]Joker'
11075
  model: 'Joker 10.1"'
11076
+ - regex: 'Pixus Blaze 10.1 3G'
11077
+ model: 'Blaze 10.1" 3G'
11078
 
11079
  - regex: 'Raze'
11080
  model: 'Raze'
11213
 
11214
  # RoverPad or Rover Pad
11215
  RoverPad:
11216
+ regex: '(?:Rover[ ]?Pad|RoverPhone|Sky 7.85 3G)(?:[);/ ]|$)'
11217
  device: 'tablet'
11218
  models:
11219
  - regex: 'RoverPhone(?:[);/ ]|$)'
11220
  model: ''
11221
  device: 'smartphone'
11222
+ - regex: '(?:Rover[ ]?Pad)?sky 7.85(?: 3G)?(?:[);/ ]|$)'
11223
+ model: 'Sky 7.85" 3G'
11224
  - regex: 'RoverPad (10.4|Air S70|9.7 3G|Sky 9.7|3W A73|3W7|3WT70|3W9.4)(?:[);/ ]|$)'
11225
  model: '$1'
11226
 
11227
+
11228
  # Roadrover
11229
  Roadrover:
11230
  regex: 'Roadrover ChangAn S'
11292
 
11293
  # Soundmax
11294
  Soundmax:
11295
+ regex: '((?:SM-LED32M(?:11|04)S)(?:_-Ver01)?|SM-LED40M04S)(?:[);/ ]|$)'
11296
+ device: 'tv'
11297
+ model: '$1'
11298
 
11299
  # Samsung
11300
  Samsung:
11315
  # explicit tablet models
11316
  - regex: '(?:SAMSUNG-)?(?:GT-)?N5100'
11317
  device: 'tablet'
11318
+ model: 'Galaxy Note 8.0"'
11319
  - regex: '(?:SAMSUNG-)?SM-T677(?:[ATV]|N[KL])?(?:[);/ ]|$)'
11320
  device: 'tablet'
11321
+ model: 'Galaxy View 18.4" LTE'
11322
  - regex: '(?:SAMSUNG-)?SM-T670(?:[);/ ]|$)'
11323
  device: 'tablet'
11324
+ model: 'Galaxy View 18.4" WiFi'
11325
  - regex: '(?:SAMSUNG-)?(?:GT-)?N5110'
11326
  device: 'tablet'
11327
+ model: 'Galaxy Note 8.0" WiFi'
11328
  - regex: '(?:SAMSUNG-)?GT-N5120'
11329
  device: 'tablet'
11330
+ model: 'Galaxy Note 8.0" LTE'
11331
  - regex: '(?:SAMSUNG-)?GT-N8000'
11332
  device: 'tablet'
11333
+ model: 'Galaxy Note 10.1"'
11334
  - regex: '(?:SAMSUNG-)?GT-N8010'
11335
  device: 'tablet'
11336
+ model: 'Galaxy Note 10.1" WiFi'
11337
  - regex: '(?:SAMSUNG-)?GT-N8020'
11338
  device: 'tablet'
11339
+ model: 'Galaxy Note 10.1" LTE'
11340
  - regex: '(?:SAMSUNG-)?GT-P1000M?|SCH-I800'
11341
  device: 'tablet'
11342
+ model: 'Galaxy Tab'
11343
  - regex: '(?:SAMSUNG-)?GT-P3100B?'
11344
  device: 'tablet'
11345
+ model: 'Galaxy Tab 2 7"'
11346
  - regex: '(?:SAMSUNG-)?GT-P311[03]'
11347
  device: 'tablet'
11348
+ model: 'Galaxy Tab 2 7" WiFi'
11349
  - regex: '(?:SAMSUNG-)?GT-P5100|SCH-I915'
11350
  device: 'tablet'
11351
+ model: 'Galaxy Tab 2 10.1"'
11352
  - regex: '(?:SAMSUNG-)?GT-P511[03]'
11353
  device: 'tablet'
11354
+ model: 'Galaxy Tab 2 10.1" WiFi'
11355
  - regex: '(?:SAMSUNG-)?SM-T217T'
11356
  device: 'tablet'
11357
+ model: 'Galaxy Tab 3 7.0" 4G'
11358
  - regex: '(?:SAMSUNG-)?GT-P5200'
11359
  device: 'tablet'
11360
+ model: 'Galaxy Tab 3 10.1"'
11361
  - regex: '(?:SAMSUNG-)?GT-P5210'
11362
  device: 'tablet'
11363
+ model: 'Galaxy Tab 3 10.1" WiFi'
11364
  - regex: '(?:SAMSUNG-)?GT-P5220'
11365
  device: 'tablet'
11366
+ model: 'Galaxy Tab 3 10.1" LTE'
11367
  - regex: '(?:SAMSUNG-)?GT-P6200'
11368
  device: 'tablet'
11369
+ model: 'Galaxy Tab 7" Plus'
11370
  - regex: '(?:SAMSUNG-)?GT-P6201'
11371
  device: 'tablet'
11372
+ model: 'Galaxy Tab 7" Plus N'
11373
  - regex: '(?:SAMSUNG-)?GT-P6810'
11374
  device: 'tablet'
11375
+ model: 'Galaxy Tab 7.7"'
11376
  - regex: '(?:SAMSUNG-)?GT-P7100'
11377
  device: 'tablet'
11378
+ model: 'Galaxy Tab 10.1v'
11379
  - regex: '(?:SAMSUNG-)?GT-P75[01]0'
11380
  device: 'tablet'
11381
+ model: 'Galaxy Tab 10.1"'
11382
  - regex: '(?:SAMSUNG-)?SM-P600'
11383
  device: 'tablet'
11384
+ model: 'Galaxy Note 10.1" 2014 Edition WiFi'
11385
  - regex: '(?:SAMSUNG-)?SM-P60[12]'
11386
  device: 'tablet'
11387
+ model: 'Galaxy Note 10.1" 2014 Edition'
11388
  - regex: '(?:SAMSUNG-)?SM-(?:P605|P607T)'
11389
  device: 'tablet'
11390
+ model: 'Galaxy Note 10.1" 2014 Edition LTE'
11391
  - regex: '(?:SAMSUNG-)?SM-P900'
11392
  device: 'tablet'
11393
+ model: 'Galaxy NotePRO 12.2" WiFi'
11394
  - regex: '(?:SAMSUNG-)?SM-P901'
11395
  device: 'tablet'
11396
+ model: 'Galaxy NotePRO 12.2"'
11397
  - regex: '(?:SAMSUNG-)?SM-P905'
11398
  device: 'tablet'
11399
+ model: 'Galaxy NotePRO 12.2" LTE'
11400
  - regex: '(?:SAMSUNG-)?SM-P587(?:[);/ ]|$)'
11401
  device: 'tablet'
11402
+ model: 'Galaxy Tab A 10.1" with S Pen (2016) LTE'
11403
  - regex: '(?:SAMSUNG-)?SM-P205(?:[);/ ]|$)'
11404
  device: 'tablet'
11405
+ model: 'Galaxy Tab A 8.0" with S Pen (2019) LTE'
11406
  - regex: '(?:SAMSUNG-)?SM-P200(?:[);/ ]|$)'
11407
  device: 'tablet'
11408
+ model: 'Galaxy Tab A 8.0" with S Pen (2019) WiFi'
11409
  - regex: '(?:SAMSUNG-)?SM-T11[03]'
11410
  device: 'tablet'
11411
+ model: 'Galaxy Tab 3 7.0" Lite WiFi'
11412
  - regex: '(?:SAMSUNG-)?SM-(?:T830[X]?|T837R4)(?:[);/ ]|$)'
11413
  device: 'tablet'
11414
+ model: 'Galaxy Tab S4 10.5" WiFi'
11415
  - regex: '(?:SAMSUNG-)?SM-(?:T835[CN]?|T837[VTA])(?:[);/ ]|$)'
11416
  device: 'tablet'
11417
+ model: 'Galaxy Tab S4 10.5"'
11418
  - regex: '(?:SAMSUNG-)?SM-(?:T725[N]?|T720X|T727[AV])(?:[);/ ]|$)'
11419
  device: 'tablet'
11420
+ model: 'Galaxy Tab S5e 10.5"'
11421
  - regex: '(?:SAMSUNG-)?SM-T720(?:[);/ ]|$)'
11422
  device: 'tablet'
11423
+ model: 'Galaxy Tab S5e 10.5" WiFi'
11424
  - regex: '(?:SAMSUNG-)?SM-T865N?(?:[);/ ]|$)'
11425
  device: 'tablet'
11426
+ model: 'Galaxy Tab S6 10.5"'
11427
  - regex: '(?:SAMSUNG-)?SM-T867[V]?(?:[);/ ]|$)'
11428
  device: 'tablet'
11429
+ model: 'Galaxy Tab S6 10.5" LTE'
11430
  - regex: '(?:SAMSUNG-)?SM-P615(?:[);/ ]|$)'
11431
  device: 'tablet'
11432
+ model: 'Galaxy Tab S6 10.4" Lite'
11433
  - regex: '(?:SAMSUNG-)?SM-P610(?:[);/ ]|$)'
11434
  device: 'tablet'
11435
+ model: 'Galaxy Tab S6 10.4" Lite WiFi'
11436
  - regex: '(?:SAMSUNG-)?SM-T860(?:[);/ ]|$)'
11437
  device: 'tablet'
11438
+ model: 'Galaxy Tab S6 10.5" WiFi'
11439
  - regex: '(?:SAMSUNG-)?SM-T111[M]?(?:[);/ ]|$)'
11440
  device: 'tablet'
11441
+ model: 'Galaxy Tab 3 7.0" Lite'
11442
  - regex: '(?:SAMSUNG-)?SM-T116(?:BU|NU|NY)?'
11443
  device: 'tablet'
11444
+ model: 'Galaxy Tab 3 V'
11445
  - regex: '(?:SAMSUNG-)?SM-(?:T2105|T212)'
11446
  device: 'tablet'
11447
+ model: 'Galaxy Tab 3 7.0" Kids'
11448
  - regex: '(?:SAMSUNG-)?SM-T210R?'
11449
  device: 'tablet'
11450
+ model: 'Galaxy Tab 3 7.0" WiFi'
11451
  - regex: '(?:SAMSUNG-)?SM-T21(?:[15]|7[AS])'
11452
  device: 'tablet'
11453
+ model: 'Galaxy Tab 3 7.0"'
11454
  - regex: '(?:SAMSUNG-)?SM-T230(?:NU)?'
11455
  device: 'tablet'
11456
+ model: 'Galaxy Tab 4 7.0" WiFi'
11457
  - regex: '(?:SAMSUNG-)?SM-T23[15]|403SC'
11458
  device: 'tablet'
11459
+ model: 'Galaxy Tab 4 7.0" 3G'
11460
  - regex: '(?:SAMSUNG-)?SM-(?:T239|T237P)'
11461
  device: 'tablet'
11462
+ model: 'Galaxy Tab 4 7.0" LTE'
11463
  - regex: '(?:SAMSUNG-)?SM-T310'
11464
  device: 'tablet'
11465
+ model: 'Galaxy Tab 3 8.0" WiFi'
11466
  - regex: '(?:SAMSUNG-)?SM-T311'
11467
  device: 'tablet'
11468
+ model: 'Galaxy Tab 3 8.0"'
11469
  - regex: '(?:SAMSUNG-)?SM-T315'
11470
  device: 'tablet'
11471
+ model: 'Galaxy Tab 3 8.0" LTE'
11472
  - regex: '(?:SAMSUNG-)?SM-T330'
11473
  device: 'tablet'
11474
+ model: 'Galaxy Tab 4 8.0" WiFi'
11475
  - regex: '(?:SAMSUNG-)?SM-(?:T33[215]|T337[AVT])'
11476
  device: 'tablet'
11477
+ model: 'Galaxy Tab 4 8.0" LTE'
11478
  - regex: '(?:SAMSUNG-)?SM-T520'
11479
  device: 'tablet'
11480
+ model: 'Galaxy TabPRO 10.1" WiFi'
11481
  - regex: '(?:SAMSUNG-)?SM-(?:T53[15]|T537[AV])'
11482
  device: 'tablet'
11483
+ model: 'Galaxy Tab 4 10.1" LTE'
11484
  - regex: '(?:SAMSUNG-)?SM-T536(?:[);/ ]|$)'
11485
  device: 'tablet'
11486
+ model: 'Galaxy Tab 4 10.1" Advanced'
11487
  - regex: '(?:SAMSUNG-)?SM-T320'
11488
  device: 'tablet'
11489
+ model: 'Galaxy TabPRO 8.4" WiFi'
11490
  - regex: '(?:SAMSUNG-)?SM-T325'
11491
  device: 'tablet'
11492
+ model: 'Galaxy TabPRO 8.4" LTE'
11493
  - regex: '(?:SAMSUNG-)?SM-T525'
11494
  device: 'tablet'
11495
+ model: 'Galaxy TabPRO 10.1" LTE'
11496
  - regex: '(?:SAMSUNG-)?SM-(?:T530(?:NU)?|T533)'
11497
  device: 'tablet'
11498
+ model: 'Galaxy Tab 4 10.1" WiFi'
11499
  - regex: '(?:SAMSUNG-)?SM-T700'
11500
  device: 'tablet'
11501
+ model: 'Galaxy Tab S 8.4" WiFi'
11502
  - regex: '(?:SAMSUNG-)?SM-(?:T705|T707A)'
11503
  device: 'tablet'
11504
+ model: 'Galaxy Tab S 8.4" LTE'
11505
  - regex: '(?:SAMSUNG-)?SM-T800'
11506
  device: 'tablet'
11507
+ model: 'Galaxy Tab S 10.5" WiFi'
11508
  - regex: '(?:SAMSUNG-)?(?:SM-(?:T805|T807[VP]?)|SCT21)'
11509
  device: 'tablet'
11510
+ model: 'Galaxy Tab S 10.5" LTE'
11511
  - regex: '(?:SAMSUNG-)?SM-(?:T813|T810)'
11512
  device: 'tablet'
11513
+ model: 'Galaxy Tab S2 9.7" WiFi'
11514
  - regex: '(?:SAMSUNG-)?SM-(?:T719[YC]?|T715(?:[YC]|N0)?)(?:[);/ ]|$)'
11515
  device: 'tablet'
11516
+ model: 'Galaxy Tab S2 8.0" LTE'
11517
  - regex: '(?:SAMSUNG-)?SM-(?:T71[03]|T710X)(?:[);/ ]|$)'
11518
  device: 'tablet'
11519
+ model: 'Galaxy Tab S2 8.0" WiFi'
11520
  - regex: '(?:SAMSUNG-)?SM-(?:T815|T817[ATW]?|T818[ATW]|T819[Y]?)'
11521
  device: 'tablet'
11522
+ model: 'Galaxy Tab S2 9.7" LTE'
11523
  - regex: '(?:SAMSUNG-)?SM-T820'
11524
  device: 'tablet'
11525
+ model: 'Galaxy Tab S3 9.7" WiFi'
11526
  - regex: '(?:SAMSUNG-)?SM-T82[57]'
11527
  device: 'tablet'
11528
+ model: 'Galaxy Tab S3 9.7" LTE'
11529
  - regex: '(?:SAMSUNG-)?SM-T900'
11530
  device: 'tablet'
11531
+ model: 'Galaxy TabPRO 12.2" WiFi'
11532
  - regex: '(?:SAMSUNG-)?SM-T280'
11533
  device: 'tablet'
11534
+ model: 'Galaxy Tab A 7.0" WiFi'
11535
  - regex: '(?:SAMSUNG-)?SM-T285'
11536
  device: 'tablet'
11537
+ model: 'Galaxy Tab A 7.0" LTE'
11538
  - regex: '(?:SAMSUNG-)?SM-T3[58]0'
11539
  device: 'tablet'
11540
+ model: 'Galaxy Tab A 8.0" WiFi'
11541
  - regex: '(?:SAMSUNG-)?SM-(?:P350|T3[58]5|T357[TW])'
11542
  device: 'tablet'
11543
+ model: 'Galaxy Tab A 8.0" LTE'
11544
  - regex: '(?:SAMSUNG-)?SM-T387(?:R4|VK|AA|[WVT])'
11545
  device: 'tablet'
11546
+ model: 'Galaxy Tab A 8.0" LTE (2018)'
11547
  - regex: '(?:SAMSUNG-)?SM-T295'
11548
  device: 'tablet'
11549
+ model: 'Galaxy Tab A 8.0" LTE (2019)'
11550
  - regex: '(?:SAMSUNG-)?SM-T290'
11551
  device: 'tablet'
11552
+ model: 'Galaxy Tab A 8.0" WiFi (2019)'
11553
  - regex: '(?:SAMSUNG-)?SM-(?:P355([MY])?|T550)'
11554
  device: 'tablet'
11555
+ model: 'Galaxy Tab A 9.7" WiFi'
11556
  - regex: '(?:SAMSUNG-)?SM-(?:P550|P555(M)?|T555)'
11557
  device: 'tablet'
11558
+ model: 'Galaxy Tab A 9.7" LTE'
11559
  - regex: '(?:SAMSUNG-)?SM-(?:T58[05]|P58[05])'
11560
  device: 'tablet'
11561
+ model: 'Galaxy Tab A 10.1" WiFi (2016)'
11562
  - regex: '(?:SAMSUNG-)?SM-T587[P]?'
11563
  device: 'tablet'
11564
+ model: 'Galaxy Tab A 10.1" LTE (2016)'
11565
  - regex: '(?:SAMSUNG-)?SM-T59[057]'
11566
  device: 'tablet'
11567
+ model: 'Galaxy Tab A 10.5" LTE (2018)'
11568
  - regex: '(?:SAMSUNG-)?SM-T51[05]'
11569
  device: 'tablet'
11570
+ model: 'Galaxy Tab A 10.1" (2019)'
11571
  - regex: '(?:SAMSUNG-)?SM-(?:T37[57]|T378[KLSV])'
11572
  device: 'tablet'
11573
+ model: 'Galaxy Tab E 8.0"'
11574
  - regex: '(?:SAMSUNG-)?SM-T56[02]'
11575
  device: 'tablet'
11576
+ model: 'Galaxy Tab E 9.6" WiFi'
11577
  - regex: '(?:SAMSUNG-)?SM-T561'
11578
  device: 'tablet'
11579
+ model: 'Galaxy Tab E 9.6" 3G'
11580
  - regex: '(?:SAMSUNG-)?SM-T567V'
11581
  device: 'tablet'
11582
+ model: 'Galaxy Tab E 9.6" 4G'
11583
  - regex: '(?:SAMSUNG-)?SM-T365(?:[);/ ]|$)'
11584
  device: 'tablet'
11585
+ model: 'Galaxy Tab Active 8.0"'
11586
  - regex: '(?:SAMSUNG-)?SM-T360(?:[);/ ]|$)'
11587
  device: 'tablet'
11588
+ model: 'Galaxy Tab Active 8.0" WiFi'
11589
  - regex: '(?:SAMSUNG-)?SM-T39[057][U]?(?:[);/ ]|$)'
11590
  device: 'tablet'
11591
+ model: 'Galaxy Tab Active 2 8.0"'
11592
  - regex: '(?:SAMSUNG-)?SM-P902(?:[);/ ]|$)'
11593
  device: 'tablet'
11594
+ model: 'Galaxy Note Pro 12.2"'
11595
 
11596
  # explicit wearable models
11597
  - regex: '(?:SAMSUNG )?SM-R820'
11598
  device: 'wearable'
11599
+ model: 'Galaxy Watch Active 2'
11600
 
11601
  # explicit smartphone models
11602
  - regex: '(?:SAMSUNG-)?SM-G850[AMSWYKLX]'
11603
+ model: 'Galaxy Alpha'
11604
  - regex: '(?:SAMSUNG-)?GT-B5330'
11605
+ model: 'Galaxy Chat'
11606
  - regex: '(?:SAMSUNG-)?SM-A605K'
11607
+ model: 'Galaxy Jean'
11608
  - regex: '(?:SAMSUNG-)?SM-A202K'
11609
+ model: 'Galaxy Jean 2'
11610
  - regex: '(?:SAMSUNG-)?GT-B5510'
11611
+ model: 'Galaxy Y Pro'
11612
  - regex: '(?:SAMSUNG-)?GT-B5512'
11613
+ model: 'Galaxy Y Pro Duos'
11614
  - regex: '(?:SAMSUNG-)?GT-B7510'
11615
+ model: 'Galaxy Pro'
11616
  - regex: '(?:SAMSUNG-)?GT-I5700'
11617
+ model: 'Galaxy Spica'
11618
  - regex: '(?:SAMSUNG-)?GT-I5801'
11619
+ model: 'Galaxy Apollo'
11620
  - regex: '(?:SAMSUNG-)?GT-I5800'
11621
+ model: 'Galaxy 3'
11622
  - regex: '(?:SAMSUNG-)?GT-I8000'
11623
  model: 'Omnia II'
11624
  - regex: '(?:SAMSUNG-)?(?:GT-I8150|SM-T255S)'
11625
+ model: 'Galaxy W'
11626
  - regex: 'SC-01H(?:[);/ ]|$)'
11627
+ model: 'Galaxy Active Neo'
11628
  - regex: '(?:SAMSUNG-)?GT-S5830'
11629
+ model: 'Galaxy Ace'
11630
  - regex: '(?:SAMSUNG-)?SM-(?:G357(?:FZ|M)|G310HN)'
11631
+ model: 'Galaxy Ace Style'
11632
  - regex: '(?:SAMSUNG-)?GT-I8160'
11633
+ model: 'Galaxy Ace 2'
11634
  - regex: '(?:SAMSUNG-)?SM-G313(?:HY|M[LUY]|[FM])'
11635
+ model: 'Galaxy Ace 4'
11636
  - regex: '(?:SAMSUNG-)?SM-G316M'
11637
+ model: 'Galaxy Ace 4 Duos'
11638
  - regex: '(?:SAMSUNG-)?SM-G313[HU]'
11639
+ model: 'Galaxy Ace 4 Lite'
11640
  - regex: '(?:SAMSUNG-)?SM-G318(?:H|ML)(?:[);/ ]|$)'
11641
+ model: 'Galaxy Ace 4 Neo'
11642
  - regex: '(?:SAMSUNG-)?SM-G9100(?:[);/ ]|$)'
11643
+ model: 'Galaxy S II'
11644
  - regex: '(?:SAMSUNG-)?SHV-E120S(?:[);/ ]|$)'
11645
+ model: 'Galaxy S II HD LTE'
11646
  - regex: '(?:SAMSUNG-)?GT-I8190'
11647
+ model: 'Galaxy S III mini'
11648
  - regex: '(?:SAMSUNG-)?GT-I8200'
11649
+ model: 'Galaxy S III mini Value Edition'
11650
  - regex: '(?:SAMSUNG-)?GT-I826[02]'
11651
+ model: 'Galaxy Core'
11652
  - regex: '(?:SAMSUNG-)?SM-G386W'
11653
+ model: 'Galaxy Core LTE'
11654
  - regex: '(?:SAMSUNG-)?GT-I8320'
11655
  model: 'H1'
11656
  - regex: '(?:SAMSUNG-)?GT-I85[23]0'
11657
+ model: 'Galaxy Beam'
11658
  - regex: '(?:SAMSUNG-)?SM-G3858'
11659
+ model: 'Galaxy Beam 2'
11660
  - regex: '(?:SAMSUNG-)?SM-G600S'
11661
+ model: 'Galaxy Wide'
11662
  - regex: '(?:SAMSUNG-)?GT-I855[028]'
11663
+ model: 'Galaxy Win'
11664
  - regex: '(?:SAMSUNG-)?SM-G381[28]'
11665
+ model: 'Galaxy Win Pro'
11666
  - regex: '(?:SAMSUNG-)?GT-I8580'
11667
+ model: 'Galaxy Core Advance'
11668
  - regex: '(?:SAMSUNG-)?GT-I8730'
11669
+ model: 'Galaxy Express'
11670
  - regex: '(?:SAMSUNG-)?SM-(?:E500(?:HQ|YZ|[0FHM])|S978L)'
11671
+ model: 'Galaxy E5'
11672
  - regex: '(?:SAMSUNG-)?SM-E700(?:0|9|F|H|M)'
11673
+ model: 'Galaxy E7'
11674
  - regex: '(?:SAMSUNG-)?GT-I90(?:00|08|18|88)'
11675
+ model: 'Galaxy S'
11676
  - regex: '(?:SAMSUNG-)?GT-I9001'
11677
+ model: 'Galaxy S Plus'
11678
  - regex: '(?:SAMSUNG-)?GT-I9003'
11679
+ model: 'Galaxy SL'
11680
  - regex: '(?:SAMSUNG-)?GT-I9010'
11681
+ model: 'Galaxy S Giorgio Armani'
11682
  - regex: '(?:SAMSUNG-)?GT-I9070'
11683
+ model: 'Galaxy S Advance'
11684
  - regex: '(?:SAMSUNG-)?GT-I910[08]'
11685
+ model: 'Galaxy S II'
11686
  - regex: '(?:SAMSUNG-)?ISW11SC'
11687
+ model: 'Galaxy S II WiMAX'
11688
  - regex: '(?:SAMSUNG-)?GT-I9103'
11689
+ model: 'Galaxy R'
11690
  - regex: '(?:SAMSUNG-)?GT-I9105'
11691
+ model: 'Galaxy S II Plus'
11692
  - regex: '(?:SAMSUNG-)?SM-G730(?:W8|[AV])'
11693
+ model: 'Galaxy S3 mini'
11694
  - regex: '(?:SAMSUNG-)?(?:GT-I919[025]|SCH-I435)'
11695
+ model: 'Galaxy S4 mini'
11696
  - regex: '(?:SAMSUNG-)?GT-I9515'
11697
+ model: 'Galaxy S4 Value Edition'
11698
  - regex: '(?:SAMSUNG-)?GT-I9295'
11699
+ model: 'Galaxy S4 ACTIVE'
11700
  - regex: '(?:SAMSUNG-)?(?:GT-I9300|SCH-I535|SCH-L710|SCH-I939)'
11701
+ model: 'Galaxy S III'
11702
  - regex: '(?:SAMSUNG-)?(?:GT-I9305|SCH-R530)'
11703
+ model: 'Galaxy S III LTE'
11704
+ - regex: '(?:SAMSUNG-)?(?:SM-S975L|GT-I9500|GT-I9502|GT-I9505|SCH-I545|SCH-I959|SCH-R970|Galaxy-S4|SGH-M919N?)|SC-04E'
11705
+ model: 'Galaxy S4'
11706
  - regex: '(?:SAMSUNG-)?GT-I9506'
11707
+ model: 'Galaxy S4 with LTE+'
11708
  - regex: '(?:SAMSUNG-)?GT-S5280'
11709
+ model: 'Galaxy STAR'
11710
  - regex: '(?:SAMSUNG-)?GT-S5301'
11711
+ model: 'Galaxy POCKET Plus'
11712
  - regex: '(?:SAMSUNG-)?GT-S5310'
11713
+ model: 'Galaxy POCKET Neo'
11714
  - regex: '(?:SAMSUNG-)?SM-G110[BHM]'
11715
+ model: 'Galaxy POCKET 2'
11716
  - regex: '(?:SAMSUNG-)?GT-S5360'
11717
+ model: 'Galaxy Y Hello Kitty'
11718
  - regex: '(?:SAMSUNG-)?GT-S6310'
11719
+ model: 'Galaxy Young'
11720
  - regex: '(?:SAMSUNG-)?GT-S6312'
11721
+ model: 'Galaxy Young DUOS'
11722
  - regex: '(?:SAMSUNG-)?SM-G130(?:BT|HN|[EHMU])'
11723
+ model: 'Galaxy Young 2'
11724
  - regex: '(?:SAMSUNG-)?SM-G130BU'
11725
+ model: 'Galaxy Young 2 Pro'
11726
  - regex: '(?:SAMSUNG-)?GT-S6790'
11727
+ model: 'Galaxy FAME Lite with NFC'
11728
  - regex: '(?:SAMSUNG-)?GT-S6810'
11729
+ model: 'Galaxy FAME'
11730
  - regex: '(?:SAMSUNG-)?GT-S6812'
11731
+ model: 'Galaxy FAME Duos'
11732
  - regex: 'SC-04J(?:[);/ ]|$)'
11733
+ model: 'Galaxy Feel'
11734
  - regex: '(?:SAMSUNG-)?GT-S7275'
11735
+ model: 'Galaxy ACE 3'
11736
  - regex: '(?:SAMSUNG-)?GT-S7500'
11737
+ model: 'Galaxy ACE Plus'
11738
  - regex: '(?:SAMSUNG-)?(?:GT-S7560|SCH-I699)'
11739
+ model: 'Galaxy Trend'
11740
  - regex: '(?:SAMSUNG-)?GT-S7390'
11741
+ model: 'Galaxy Trend Lite'
11742
  - regex: '(?:SAMSUNG-)?GT-S7580'
11743
+ model: 'Galaxy Trend Plus'
11744
  - regex: '(?:SAMSUNG-)?SCH-I739'
11745
+ model: 'Galaxy Trend 2'
11746
  - regex: '(?:SAMSUNG-)?(?:GT-S7562|SCH-I919)'
11747
+ model: 'Galaxy S DUOS'
11748
  - regex: '(?:SAMSUNG-)?GT-S7582'
11749
+ model: 'Galaxy S DUOS 2'
11750
  - regex: '(?:SAMSUNG-)?SM-(?:G31[36]HU|G313HZ)'
11751
+ model: 'Galaxy S DUOS 3'
11752
  - regex: '(?:SAMSUNG-)?GT-S7710'
11753
+ model: 'Galaxy Xcover 2'
11754
  - regex: '(?:SAMSUNG-)?SM-G389F'
11755
+ model: 'Galaxy Xcover 3'
11756
  - regex: '(?:SAMSUNG-)?SM-G715FN'
11757
+ model: 'Galaxy Xcover Pro'
11758
  - regex: '(?:SAMSUNG-)?SM-G398FN'
11759
+ model: 'Galaxy Xcover 4s'
11760
  - regex: '(?:SAMSUNG-)?SM-G390Y'
11761
+ model: 'Galaxy Xcover 4'
11762
  - regex: '(?:SAMSUNG-)?GT-S8500'
11763
  model: 'Wave'
11764
  - regex: '(?:SAMSUNG-)?GT-S8530'
11778
  - regex: '(?:SAMSUNG-)?GT-S7230'
11779
  model: 'Wave 723'
11780
  - regex: '(?:SAMSUNG-)?SM-(?:C101|C105([AL])?)'
11781
+ model: 'Galaxy S4 zoom'
11782
  - regex: '(?:SAMSUNG-)?SM-(?:C111(M)?|C115)'
11783
+ model: 'Galaxy K zoom'
11784
  - regex: '(?:SAMSUNG-)?SM-G318[HM]Z'
11785
+ model: 'Galaxy V Plus'
11786
  - regex: '(?:SAMSUNG-)?SM-(?:G355[HM]|G3556D)'
11787
+ model: 'Galaxy Core 2'
11788
  - regex: '(?:SAMSUNG-)?SM-G350'
11789
+ model: 'Galaxy Core Plus'
11790
  - regex: '(?:SAMSUNG-)?SM-(?:G360[FH]?|S820L)'
11791
+ model: 'Galaxy Core Prime'
11792
  - regex: '(?:SAMSUNG-)?SM-G361[FH]?'
11793
+ model: 'Galaxy Core Prime Value Edition'
11794
  - regex: '(?:SAMSUNG-)?SM-(?:G386F|G3586V)'
11795
+ model: 'Galaxy Core LTE'
11796
  - regex: '(?:SAMSUNG-)?SM-G3568V'
11797
+ model: 'Galaxy Core Mini 4G'
11798
  - regex: '(?:SAMSUNG-)?SM-G5108Q'
11799
+ model: 'Galaxy Core Max'
11800
  - regex: '(?:SAMSUNG-)?SM-G3815'
11801
+ model: 'Galaxy EXPRESS II'
11802
  - regex: '(?:SAMSUNG-)?SM-G388F'
11803
+ model: 'Galaxy Xcover 3'
11804
  - regex: '(?:SAMSUNG-)?SM-G390[FW]'
11805
+ model: 'Galaxy Xcover 4'
11806
  - regex: '(?:SAMSUNG-)?SM-G800'
11807
+ model: 'Galaxy S5 mini'
11808
  - regex: '(?:SAMSUNG-)?SM-G9009D'
11809
+ model: 'Galaxy S5 Dual-SIM'
11810
+ - regex: '(?:SAMSUNG-)?SM-(?:G900|G906[KLS]|S902L|S903VL)|Galaxy-S5|SCL23'
11811
+ model: 'Galaxy S5'
11812
  - regex: '(?:SAMSUNG-)?SM-G901F'
11813
+ model: 'Galaxy S5 LTE+'
11814
  - regex: '(?:SAMSUNG-)?SM-G870[AFW]|SC-02G'
11815
+ model: 'Galaxy S5 Active'
11816
  - regex: '(?:SAMSUNG-)?SM-G903[FMW]'
11817
+ model: 'Galaxy S5 Neo'
11818
  - regex: '(?:SAMSUNG-)?SM-G860P'
11819
+ model: 'Galaxy S5 K Sport'
11820
  - regex: '(?:SAMSUNG-)?(?:SM-G920(?:F[DQ]|W8|[089AFIKLPRSTVX])?|SM-S907VL)|SC-05G'
11821
+ model: 'Galaxy S6'
11822
  - regex: '(?:SAMSUNG-)?SM-G890A'
11823
+ model: 'Galaxy S5 Active'
11824
  - regex: '(?:SAMSUNG-)?SM-G925[0ADFIKLPRSTVWX]|SCV31|404SC'
11825
+ model: 'Galaxy S6 Edge'
11826
  - regex: '(?:SAMSUNG-)?SM-G928(?:7C|R4|W8|[07ACFGIKLPSTVX])'
11827
+ model: 'Galaxy S6 Edge+'
11828
  - regex: '(?:SAMSUNG-)?SM-G930(?:FD|W8|[0AFKLPRSTUVX8])?(?:[);/ ]|$)'
11829
+ model: 'Galaxy S7'
11830
  - regex: '(?:SAMSUNG-)?SM-G935(?:R4|W8|[0AFKLPSTUVX])|SC-02H|SCV33'
11831
+ model: 'Galaxy S7 Edge'
11832
  - regex: '(?:SAMSUNG-)?SM-G891A'
11833
+ model: 'Galaxy S7 Active'
11834
  - regex: '(?:SAMSUNG-)?SM-G950[08FNUW]?|SCV36|SC-02J'
11835
+ model: 'Galaxy S8'
11836
  - regex: '(?:SAMSUNG-)?SM-G8750'
11837
+ model: 'Galaxy S8 Lite'
11838
  - regex: '(?:SAMSUNG-)?SM-G892[AU]'
11839
+ model: 'Galaxy S8 Active'
11840
  - regex: '(?:SAMSUNG-)?SM-G955[AFKLNPRTUVW0X]?|SCV35|SC-03J'
11841
+ model: 'Galaxy S8+'
11842
  - regex: '(?:SAMSUNG-)?SM-G960[FNUWX0]?|SCV38|SC-02K'
11843
+ model: 'Galaxy S9'
11844
  - regex: '(?:SAMSUNG-)?SM-G965[FNUWX0]|SCV39|SC-03K'
11845
+ model: 'Galaxy S9+'
11846
  - regex: '(?:SAMSUNG-)?(?:SM-(?:G973|G977[PUTNB])|SCV41|SC-03L)'
11847
+ model: 'Galaxy S10'
11848
  - regex: '(?:SAMSUNG-)?SM-G770F'
11849
+ model: 'Galaxy S10 Lite'
11850
  - regex: '(?:SAMSUNG-)?(?:SM-G975[0FUWNX]|SCV42|SC-04L)'
11851
+ model: 'Galaxy S10+'
11852
  - regex: '(?:SAMSUNG-)?SM-G970[08FUNWX](?:[);/ ]|$)'
11853
+ model: 'Galaxy S10e'
11854
  - regex: '(?:SAMSUNG-)?SM-G980F'
11855
+ model: 'Galaxy S20'
11856
  - regex: '(?:SAMSUNG-)?SM-G981(?:[0BNUW]|U1)|SCG01'
11857
+ model: 'Galaxy S20 5G'
11858
  - regex: '(?:SAMSUNG-)?SM-G988(?:[0BNUW]|U1)'
11859
+ model: 'Galaxy S20 Ultra 5G'
11860
  - regex: '(?:SAMSUNG-)?SM-G985F|SCG02'
11861
+ model: 'Galaxy S20+'
11862
  - regex: '(?:SAMSUNG-)?SM-G986(?:[0BNUW]|U1)|SC-52A'
11863
+ model: 'Galaxy S20+ 5G'
11864
  - regex: '(?:SAMSUNG-)?SM-F700(?:[0FNUW]|U1)|SCV47'
11865
+ model: 'Galaxy Z Flip'
11866
  - regex: '(?:SAMSUNG-)?SCH-I200'
11867
+ model: 'Galaxy Stellar'
11868
  - regex: '(?:SAMSUNG-)?SCH-I829'
11869
+ model: 'Galaxy Style Duos'
11870
  - regex: '(?:SAMSUNG-)?(?:SGH-S730|SCH-R740)'
11871
+ model: 'Galaxy Discover'
11872
  - regex: '(?:SAMSUNG-)?SCH-S738'
11873
+ model: 'Galaxy Centura'
11874
  - regex: 'vollo Vi86(?:[);/ ]|$)'
11875
  model: 'Vollo Vi86'
11876
  - regex: '(?:SAMSUNG-)?SM-G386(?:T1|T)'
11877
+ model: 'Galaxy Avant'
11878
  - regex: '(?:SAMSUNG-)?SM-A015[AFGM]'
11879
+ model: 'Galaxy A01'
11880
  - regex: '(?:SAMSUNG-)?SM-A260[FG]'
11881
+ model: 'Galaxy A2 Core'
11882
  - regex: '(?:SAMSUNG-)?SM-A300(?:FU|YZ|XU|[09FGHMY])'
11883
+ model: 'Galaxy A3 (2015)'
11884
  - regex: '(?:SAMSUNG-)?SM-A310(?:N0|[FMYX])'
11885
+ model: 'Galaxy A3 (2016)'
11886
  - regex: '(?:SAMSUNG-)?SM-A320(?:FL|[FYX])'
11887
+ model: 'Galaxy A3 (2017)'
11888
  - regex: '(?:SAMSUNG-)?SM-A500[LSWY9]?(?:[);/ ]|$)'
11889
+ model: 'Galaxy A5'
11890
  - regex: '(?:SAMSUNG-)?SM-A500[FGHKM0]'
11891
+ model: 'Galaxy A5 Duos'
11892
  - regex: '(?:SAMSUNG-)?SM-A500(?:FU|X)'
11893
+ model: 'Galaxy A5 (2015)'
11894
  - regex: '(?:SAMSUNG-)?SM-A510[08FKLMSYX]'
11895
+ model: 'Galaxy A5 (2016)'
11896
  - regex: '(?:SAMSUNG-)?SM-A520[FKLSWX]'
11897
+ model: 'Galaxy A5 (2017)'
11898
  - regex: '(?:SAMSUNG-)?SM-A600(?:AZ|FN|GN|T1|[AFGNPTUX])'
11899
+ model: 'Galaxy A6'
11900
  - regex: '(?:SAMSUNG-)?SM-A605(?:[FG]N|[08FGX])'
11901
+ model: 'Galaxy A6+'
11902
  - regex: '(?:SAMSUNG-)?SM-G6200'
11903
+ model: 'Galaxy A6s (2018)'
11904
  - regex: '(?:SAMSUNG-)?SM-A60(?:60|6Y)'
11905
+ model: 'Galaxy A60'
11906
  - regex: '(?:SAMSUNG-)?SM-A700(?:YD|[09FHKLSX])'
11907
+ model: 'Galaxy A7'
11908
  - regex: '(?:SAMSUNG-)?SM-A710[08FKLMSYX]'
11909
+ model: 'Galaxy A7 (2016)'
11910
  - regex: '(?:SAMSUNG-)?SM-A720[FSX]'
11911
+ model: 'Galaxy A7 (2017)'
11912
  - regex: '(?:SAMSUNG-)?SM-A750(?:GN|[FGCNX])'
11913
+ model: 'Galaxy A7 (2018)'
11914
  - regex: '(?:SAMSUNG-)?SM-A71(?:5[FW])?(?:[);/ ]|$)'
11915
+ model: 'Galaxy A71'
11916
  - regex: '(?:SAMSUNG-)?SM-A716U(?:[);/ ]|$)'
11917
+ model: 'Galaxy A71 5G'
11918
  - regex: '(?:SAMSUNG-)?SM-A(?:530F|800[0FISY])|SCV32'
11919
+ model: 'Galaxy A8'
11920
  - regex: '(?:SAMSUNG-)?SM-G885[FSY]'
11921
+ model: 'Galaxy A8 Star'
11922
  - regex: '(?:SAMSUNG-)?SM-A810(?:YZ|[FS])'
11923
+ model: 'Galaxy A8 (2016)'
11924
  - regex: '(?:SAMSUNG-)?SM-G887[0F]'
11925
+ model: 'Galaxy A8s'
11926
  - regex: '(?:SAMSUNG-)?SM-A530[NWXM]'
11927
+ model: 'Galaxy A8 (2018)'
11928
  - regex: '(?:SAMSUNG-)?SM-A730F'
11929
+ model: 'Galaxy A8+ (2018)'
11930
  - regex: '(?:SAMSUNG-)?SM-A9000'
11931
+ model: 'Galaxy A9'
11932
  - regex: 'SM-A9\[7\]'
11933
+ model: 'Galaxy A9 7'
11934
  - regex: '(?:SAMSUNG-)?SM-A920[0FXN]'
11935
+ model: 'Galaxy A9 (2018)'
11936
  - regex: '(?:SAMSUNG-)?SM-G885[08]'
11937
+ model: 'Galaxy A9 Star'
11938
  - regex: '(?:SAMSUNG-)?SM-(?:A910[0F]|G887N)'
11939
+ model: 'Galaxy A9 Pro'
11940
  - regex: '(?:SAMSUNG-)?SM-A105[FGMN]'
11941
+ model: 'Galaxy A10'
11942
  - regex: '(?:SAMSUNG-)?SM-A107[FM]'
11943
+ model: 'Galaxy A10s'
11944
  - regex: '(?:SAMSUNG-)?SM-(?:S102DL|A102[NWU])'
11945
+ model: 'Galaxy A10e'
11946
  - regex: '(?:SAMSUNG-)?SM-A115F'
11947
+ model: 'Galaxy A11'
11948
  - regex: '(?:SAMSUNG-)?SM-(?:A205(?:[FGSWU]|YN|U1)|S205DL)|SC-02M|SCV46'
11949
+ model: 'Galaxy A20'
11950
  - regex: '(?:SAMSUNG-)?SM-A215U(?:[);/ ]|$)'
11951
+ model: 'Galaxy A21'
11952
  - regex: '(?:SAMSUNG-)?SM-A217F(?:[);/ ]|$)'
11953
+ model: 'Galaxy A21s'
11954
  - regex: '(?:SAMSUNG-)?SM-A202[FG]'
11955
+ model: 'Galaxy A20e'
11956
  - regex: '(?:SAMSUNG-)?SM-A207[0FM]'
11957
+ model: 'Galaxy A20s'
11958
  - regex: '(?:SAMSUNG-)?(?:SM-A305(?:[GYF]N|GT|[NFG])|SCV43)'
11959
+ model: 'Galaxy A30'
11960
  - regex: '(?:SAMSUNG-)?SM-A307(?:FN|GN|GT|[FG])'
11961
+ model: 'Galaxy A30s'
11962
  - regex: '(?:SAMSUNG-)?SM-A315[FNG](?:[);/ ]|$)'
11963
+ model: 'Galaxy A31'
11964
  - regex: '(?:SAMSUNG-)?SM-A405(?:F[NM]|S)'
11965
+ model: 'Galaxy A40'
11966
  - regex: '(?:SAMSUNG-)?SM-A305[01](?:[);/ ]|$)'
11967
+ model: 'Galaxy A40s'
11968
  - regex: '(?:SAMSUNG-)?(?:SM-A415F|SCV48)(?:[);/ ]|$)'
11969
+ model: 'Galaxy A41'
11970
  - regex: '(?:SAMSUNG-)?SM-(?:A505(?:F[NG]|[FGNWUX]|YN|U1?)|S506DL|505FN)'
11971
+ model: 'Galaxy A50'
11972
  - regex: '(?:SAMSUNG-)?SM-A5070(?:[);/ ]|$)'
11973
+ model: 'Galaxy A50s'
11974
  - regex: '(?:SAMSUNG-)?SM-A507FN'
11975
+ model: 'Galaxy A50s'
11976
  - regex: '(?:SAMSUNG-)?SM-A515[F]'
11977
+ model: 'Galaxy A51'
11978
  - regex: '(?:SAMSUNG-)?SM-A705(?:GM|[MYF]N|F|[W0X])'
11979
+ model: 'Galaxy A70'
11980
  - regex: '(?:SAMSUNG-)?SM-A707[0F]'
11981
+ model: 'Galaxy A70s'
11982
  - regex: '(?:SAMSUNG-)?SM-A805[0FNX]'
11983
+ model: 'Galaxy A80'
11984
  - regex: '(?:SAMSUNG-)?SM-A908[BN]'
11985
+ model: 'Galaxy A90'
11986
  - regex: '(?:SAMSUNG-)?GT-I9301I'
11987
+ model: 'Galaxy S III Neo'
11988
  - regex: '(?:SAMSUNG-)?SM-S120VL(?:[);/ ]|$)'
11989
+ model: 'Galaxy Luna'
11990
  - regex: '(?:SAMSUNG-)?SM-J100(?:FN|VPP|MU|[FHMY])'
11991
+ model: 'Galaxy J1'
11992
  - regex: '(?:SAMSUNG-)?SM-J105[BFHYM]'
11993
+ model: 'Galaxy J1 Mini'
11994
  - regex: '(?:SAMSUNG-)?SM-J106[FMHB]'
11995
+ model: 'Galaxy J1 mini Prime'
11996
  - regex: '(?:SAMSUNG-)?SM-(?:J120(?:ZN|[AFHGMTW])|J05H)'
11997
+ model: 'Galaxy J1 (2016)'
11998
  - regex: '(?:SAMSUNG-)?SM-(?:J110[FHMLG]|J111[FM])'
11999
+ model: 'Galaxy J1 Ace'
12000
  - regex: '(?:SAMSUNG-)?SM-J200[FGHYM]'
12001
+ model: 'Galaxy J2'
12002
  - regex: '(?:SAMSUNG-)?SM-J200BT'
12003
+ model: 'Galaxy J2 Duos'
12004
  - regex: '(?:SAMSUNG-)?SM-J260AZ'
12005
+ model: 'Galaxy J2 Pure'
12006
  - regex: '(?:SAMSUNG-)?SM-(?:J260([AFGMY]|T1)|S260DL)'
12007
+ model: 'Galaxy J2 Core'
12008
  - regex: '(?:SAMSUNG-)?SM-J(?:210F|250[FNMGY])'
12009
+ model: 'Galaxy J2 Pro'
12010
  - regex: '(?:SAMSUNG-)?SM-(?:S367VL|S357BL)'
12011
+ model: 'Galaxy J3 Orbit'
12012
  - regex: '(?:SAMSUNG-)?SM-J311(?:[09]|9S)'
12013
+ model: 'Galaxy J3 Pro'
12014
  - regex: '(?:SAMSUNG-)?SM-S320VL(?:[);/ ]|$)'
12015
+ model: 'Galaxy J3 Sky'
12016
  - regex: '(?:SAMSUNG-)?SM-S327VL(?:[);/ ]|$)'
12017
+ model: 'Galaxy J3 Luna Pro'
12018
  - regex: '(?:SAMSUNG-)?SM-J327(?:T1|[ATW])(?:[);/ ]|$)'
12019
+ model: 'Galaxy J3 Prime'
12020
  - regex: '(?:SAMSUNG-)?SM-J327(?:[FP]|R4)'
12021
+ model: 'Galaxy J3 Emerge'
12022
  - regex: '(?:SAMSUNG-)?SM-J337R4(?:[);/ ]|$)'
12023
+ model: 'Galaxy J3 Aura'
12024
  - regex: '(?:SAMSUNG-)?SM-J337T(?:[);/ ]|$)'
12025
+ model: 'Galaxy J3 Star'
12026
  - regex: '(?:SAMSUNG-)?SM-J327V'
12027
+ model: 'Galaxy J3 Eclipse'
12028
  - regex: '(?:SAMSUNG-)?SM-S337TL'
12029
+ model: 'Galaxy J3 Luna Pro'
12030
  - regex: '(?:SAMSUNG-)?SM-J3109'
12031
+ model: 'Galaxy J3 (2015)'
12032
  - regex: '(?:SAMSUNG-)?SM-J320(?:[ZF]N|R4|W8|YZ|[AFGHMNPVY])'
12033
+ model: 'Galaxy J3 (2016)'
12034
  - regex: '(?:SAMSUNG-)?SM-(?:J330(?:[08FGLN]|FN)|J327(?:R7|U))(?:[);/ ]|$)'
12035
+ model: 'Galaxy J3 (2017)'
12036
  - regex: '(?:SAMSUNG-)?SM-J337(?:[AWPUV]|VPP)(?:[);/ ]|$)'
12037
+ model: 'Galaxy J3 (2018)'
12038
  - regex: '(?:SAMSUNG-)?SM-J400[FGM]'
12039
+ model: 'Galaxy J4'
12040
  - regex: '(?:SAMSUNG-)?SM-J500(?:[8F]|FN|[7GYMH]|N0)(?:[);/ ]|$)'
12041
+ model: 'Galaxy J5 (2015)'
12042
  - regex: '(?:SAMSUNG-)?SM-(?:J510(?:[8FHKLSYG]|[UFMG]N)|5108|G510H)(?:[);/ ]|$)'
12043
+ model: 'Galaxy J5 (2016)'
12044
  - regex: '(?:SAMSUNG-)?SM-J530'
12045
+ model: 'Galaxy J5 (2017)'
12046
  - regex: '(?:SAMSUNG-)?SM-G570[0FMY]'
12047
+ model: 'Galaxy J5 Prime'
12048
  - regex: '(?:SAMSUNG-)?SM-J600[NFGL]' # 2018
12049
+ model: 'Galaxy J6'
12050
  - regex: '(?:SAMSUNG-)?SM-J610[FG]'
12051
+ model: 'Galaxy J6+'
12052
  - regex: '(?:SAMSUNG-)?SM-J410[FG]'
12053
+ model: 'Galaxy J4 Core'
12054
  - regex: '(?:SAMSUNG-)?SM-J415(?:[FNG]|[FG]N)'
12055
+ model: 'Galaxy J4+'
12056
  - regex: '(?:SAMSUNG-)?SM-J7[01]0(?:8|F|FN|H|K|M|MN)'
12057
+ model: 'Galaxy J7'
12058
  - regex: '(?:SAMSUNG-)?SM-J700P'
12059
+ model: 'Galaxy J7 (2015)'
12060
  - regex: '(?:SAMSUNG-)?SM-(?:J700(?:T1|T)|J710GN|J7109)'
12061
+ model: 'Galaxy J7 (2016)'
12062
  - regex: '(?:SAMSUNG-)?SM-(?:J730[K]|J727(?:[AUSF]|R4))(?:[);/ ]|$)'
12063
+ model: 'Galaxy J7 (2017)'
12064
  - regex: '(?:SAMSUNG-)?SM-J737(?:[AVPUS]|T1?|VPP|R4)(?:[);/ ]|$)'
12065
+ model: 'Galaxy J7 (2018)'
12066
  - regex: '(?:SAMSUNG-)?SM-C710F'
12067
+ model: 'Galaxy J7+ (C7)'
12068
  - regex: '(?:SAMSUNG-)?SM-G610[FMY]'
12069
+ model: 'Galaxy J7 Prime'
12070
  - regex: '(?:SAMSUNG-)?SM-G611(?:FF|MT|M)'
12071
+ model: 'Galaxy J7 Prime 2'
12072
  - regex: '(?:SAMSUNG-)?SM-G615[F]'
12073
+ model: 'Galaxy J7 Max'
12074
  - regex: '(?:SAMSUNG-)?SM-(?:S727VL|S737TL)'
12075
+ model: 'Galaxy J7 Sky Pro'
12076
  - regex: '(?:SAMSUNG-)?SM-J730(?:F|G|GM)'
12077
+ model: 'Galaxy J7 Pro'
12078
  - regex: '(?:SAMSUNG-)?SM-J701(?:F|M)'
12079
+ model: 'Galaxy J7 Core' # also Galaxy J7 Nxt and Galaxy J7 Neo
12080
  - regex: '(?:SAMSUNG-)?SM-J720[FM]'
12081
+ model: 'Galaxy J7 Duo'
12082
  - regex: '(?:SAMSUNG-)?SM-(?:S767VL|S757BL)'
12083
+ model: 'Galaxy J7 Crown'
12084
  - regex: '(?:SAMSUNG-)?SM-J727(?:P|T|V)'
12085
+ model: 'Galaxy J7 V'
12086
  - regex: 'SM-J7\[7\]'
12087
+ model: 'Galaxy J7 7'
12088
  - regex: '(?:SAMSUNG-)?SM-J810'
12089
+ model: 'Galaxy J8'
12090
  - regex: 'SM-J8 Pro'
12091
+ model: 'Galaxy J8 Pro'
12092
  - regex: 'SM-J9\[7\] Prime'
12093
+ model: 'Galaxy J9 7 Prime'
12094
  - regex: 'SM-J9\[8\] Pro'
12095
+ model: 'Galaxy J9 8 Pro'
12096
  - regex: '(?:SAMSUNG-)?SM-M015[FG]'
12097
+ model: 'Galaxy M01'
12098
  - regex: '(?:SAMSUNG-)?SM-M105[FGM]'
12099
+ model: 'Galaxy M10'
12100
  - regex: '(?:SAMSUNG-)?SM-M107F'
12101
+ model: 'Galaxy M10s'
12102
  - regex: '(?:SAMSUNG-)?SM-M115F'
12103
+ model: 'Galaxy M11'
12104
  - regex: '(?:SAMSUNG-)?SM-M205[FGNM]'
12105
+ model: 'Galaxy M20'
12106
  - regex: '(?:SAMSUNG-)?SM-M215F'
12107
+ model: 'Galaxy M21'
12108
  - regex: '(?:SAMSUNG-)?SM-M307([0F]|FN)'
12109
+ model: 'Galaxy M30s'
12110
  - regex: '(?:SAMSUNG-)?SM-M305'
12111
+ model: 'Galaxy M30'
12112
  - regex: '(?:SAMSUNG-)?SM-M315F'
12113
+ model: 'Galaxy M31'
12114
  - regex: '(?:SAMSUNG-)?SM-M317F'
12115
+ model: 'Galaxy M31s'
12116
  - regex: '(?:SAMSUNG-)?SM-M405'
12117
+ model: 'Galaxy M40'
12118
  - regex: '(?:SAMSUNG-)?SM-W201([689])'
12119
+ model: 'Galaxy W201$1'
12120
 
12121
  - regex: '(?:SAMSUNG-)?SM-G850F'
12122
+ model: 'Galaxy Alpha'
12123
  - regex: '(?:SAMSUNG-)?SM-G910S'
12124
+ model: 'Galaxy Round'
12125
  - regex: '(?:SAMSUNG-)?SM-(?:G550(?:FY|T[12]?)|S550TL|G55[01]0|G5520)'
12126
+ model: 'Galaxy On5'
12127
  - regex: '(?:SAMSUNG-)?SM-G5528'
12128
+ model: 'Galaxy On5 (2016)'
12129
  - regex: '(?:SAMSUNG-)?SM-G600(?:FY|[0F])'
12130
+ model: 'Galaxy On7'
12131
  - regex: '(?:SAMSUNG-)?SM-G610[0KLS]'
12132
+ model: 'Galaxy On7 (2016)'
12133
  - regex: '(?:SAMSUNG-)?SM-G611[FSKL]'
12134
+ model: 'Galaxy On7 Prime'
12135
  - regex: '(?:SAMSUNG-)?SM-C5000'
12136
+ model: 'Galaxy C5'
12137
  - regex: '(?:SAMSUNG-)?SM-C501[08]'
12138
+ model: 'Galaxy C5 Pro'
12139
  - regex: '(?:SAMSUNG-)?SM-C7000'
12140
+ model: 'Galaxy C7'
12141
  - regex: '(?:SAMSUNG-)?SM-C701[08F]'
12142
+ model: 'Galaxy C7 Pro'
12143
  - regex: '(?:SAMSUNG-)?SM-C710[08]'
12144
+ model: 'Galaxy C8'
12145
  - regex: '(?:SAMSUNG-)?SM-C900[08FY]'
12146
+ model: 'Galaxy C9 Pro'
12147
  - regex: '(?:SAMSUNG-)?SM-Z130H'
12148
+ model: 'Galaxy Z1'
12149
  - regex: '(?:SAMSUNG-)?SM-Z200[FMY]'
12150
+ model: 'Galaxy Z2'
12151
  - regex: '(?:SAMSUNG-)?SM-Z300H'
12152
+ model: 'Galaxy Z3'
12153
  - regex: '(?:SAMSUNG-)?SM-Z400[FY]'
12154
+ model: 'Galaxy Z4'
12155
  - regex: '(?:SAMSUNG-)?SM-(?:G150|G155S)(?:[);/ ]|$)'
12156
+ model: 'Galaxy Folder'
12157
  - regex: '(?:SAMSUNG-)?(?:SM-G16(?:[05]0?|0N))(?:[);/ ]|$)'
12158
+ model: 'Galaxy Folder 2'
12159
  - regex: '(?:SAMSUNG-)?SM-J321AZ(?:[);/ ]|$)'
12160
+ model: 'Galaxy Sol'
12161
  - regex: '(?:SAMSUNG-)?SM-J326AZ(?:[);/ ]|$)'
12162
+ model: 'Galaxy Sol 2'
12163
  - regex: '(?:SAMSUNG-)?SM-J336AZ(?:[);/ ]|$)'
12164
+ model: 'Galaxy Sol 3'
12165
  - regex: '(?:SAMSUNG-)?SM-J727AZ(?:[);/ ]|$)'
12166
+ model: 'Galaxy Halo'
12167
  - regex: '(?:SAMSUNG-)?SM-J327AZ'
12168
+ model: 'Galaxy Amp Prime 2'
12169
  - regex: '(?:SAMSUNG-)?SM-J337AZ'
12170
+ model: 'Galaxy Amp Prime 3 (2018)'
12171
 
12172
  # explicit phablet models
12173
  - regex: '(?:SAMSUNG-)?SM-(?:F900[0FU]|F907[BN])|SCV44'
12174
+ model: 'Galaxy Fold'
12175
  device: 'phablet'
12176
  - regex: '(?:SAMSUNG-)?GT-I9060(?:[);/ ]|$)'
12177
+ model: 'Galaxy Grand Neo'
12178
  device: 'phablet'
12179
  - regex: '(?:SAMSUNG-)?GT-I9063'
12180
+ model: 'Galaxy Grand Neo Duos'
12181
  device: 'phablet'
12182
  - regex: '(?:SAMSUNG-)?GT-I9(?:080|128)'
12183
+ model: 'Galaxy Grand'
12184
  device: 'phablet'
12185
  - regex: '(?:SAMSUNG-)?GT-I9168'
12186
+ model: 'Galaxy Grand Neo+'
12187
  device: 'phablet'
12188
  - regex: '(?:SAMSUNG-)?GT-I9082'
12189
+ model: 'Galaxy Grand Duos'
12190
  device: 'phablet'
12191
  - regex: '(?:SAMSUNG-)?GT-N7000'
12192
+ model: 'Galaxy Note'
12193
  device: 'phablet'
12194
  - regex: '(?:SC-01G|SCL24)(?:[);/ ]|$)'
12195
+ model: 'Galaxy Note Edge'
12196
  device: 'phablet'
12197
  - regex: '(?:SAMSUNG-)?SM-N935[FSLK](?:[);/ ]|$)'
12198
+ model: 'Galaxy Note Fan Edition'
12199
  device: 'phablet'
12200
  - regex: '(?:SAMSUNG-)?(?:(?:GT-)?N7100|SCH-I605|SCH-N719|SCH-R950|SPH-L900)(?:[);/ ]|$)'
12201
+ model: 'Galaxy Note II'
12202
  device: 'phablet'
12203
  - regex: '(?:SAMSUNG-)?GT-N7105'
12204
+ model: 'Galaxy Note II LTE'
12205
  device: 'phablet'
12206
  - regex: '(?:SAMSUNG-)?SM-G710[25L]?(?:[);/ ]|$)'
12207
+ model: 'Galaxy Grand 2'
12208
  device: 'phablet'
12209
  - regex: '(?:SAMSUNG-)?SM-G720(?:AX|N0|[02])(?:[);/ ]|$)'
12210
+ model: 'Galaxy Grand Max'
12211
  - regex: '(?:SAMSUNG-)?SM-(?:G53(?:0[AFTYHWMP]|0[AF]Z|1[FH]|0[689]W|0MU|0BT|0R[47])|S920L)(?:[);/ ]|$)'
12212
+ model: 'Galaxy Grand Prime'
12213
  device: 'phablet'
12214
  - regex: '(?:SAMSUNG-)?SM-G531(?:BT|[MY])(?:[);/ ]|$)'
12215
+ model: 'Galaxy Grand Prime VE Duos'
12216
  device: 'phablet'
12217
  - regex: '(?:SAMSUNG-)?SM-G532F(?:[);/ ]|$)'
12218
+ model: 'Galaxy Grand Prime Plus' # also Galaxy J2 Prime
12219
  device: 'phablet'
12220
  - regex: '(?:SAMSUNG-)?SM-G532MT(?:[);/ ]|$)'
12221
+ model: 'Galaxy J2 Prime (TV)'
12222
  device: 'phablet'
12223
  - regex: '(?:SAMSUNG-)?SM-G532[MG](?:[);/ ]|$)'
12224
+ model: 'Galaxy J2 Prime'
12225
  device: 'phablet'
12226
  - regex: '(?:SAMSUNG-)?SM-N7502(?:[);/ ]|$)'
12227
+ model: 'Galaxy Note 3 Neo Duos'
12228
  device: 'phablet'
12229
  - regex: '(?:SAMSUNG-)?SM-N750[QL50]?'
12230
+ model: 'Galaxy Note 3 Neo'
12231
  device: 'phablet'
12232
  - regex: '(?:SAMSUNG-)?SM-N9002(?:[);/ ]|$)'
12233
+ model: 'Galaxy Note 3 Duos'
12234
  device: 'phablet'
12235
  - regex: '(?:SAMSUNG-)?SM-9005(?:[);/ ]|$)'
12236
+ model: 'Galaxy Note 3 LTE'
12237
  device: 'phablet'
12238
  - regex: '(?:SAMSUNG-)?(?:SM-N900(?:[05689][VQ]?|[AKLPSTV]|W8)?|SCL22|SC-01F(?:[);/ ]|$))'
12239
+ model: 'Galaxy Note 3'
12240
  device: 'phablet'
12241
  - regex: '(?:SAMSUNG-)?SM-(?:N910|910U)|N9100(?:[);/ ]|$)'
12242
+ model: 'Galaxy Note 4'
12243
  device: 'phablet'
12244
  - regex: '(?:SAMSUNG-)?SM-N916[SKL]'
12245
+ model: 'Galaxy Note 4 LTE'
12246
  device: 'phablet'
12247
  - regex: '(?:SAMSUNG-)?SM-N915'
12248
+ model: 'Galaxy Note 4 Edge'
12249
  device: 'phablet'
12250
  - regex: '(?:SAMSUNG-)?SM-N920(?:[0ACGIKLSTPFVX]|R[467]|W8)'
12251
+ model: 'Galaxy Note 5'
12252
  device: 'phablet'
12253
  - regex: '(?:SAMSUNG-)?SM-N9208'
12254
+ model: 'Galaxy Note 5 Duos'
12255
  device: 'phablet'
12256
  - regex: '(?:SAMSUNG-)?SM-G750(?:8Q|[9AFH])'
12257
+ model: 'Galaxy Mega 2'
12258
  device: 'phablet'
12259
  - regex: '(?:SAMSUNG-)?GT-I915[028]'
12260
+ model: 'Galaxy Mega 5.8'
12261
  device: 'phablet'
12262
  - regex: '(?:SAMSUNG-)?GT-I920[05]'
12263
+ model: 'Galaxy Mega 6.3'
12264
  device: 'phablet'
12265
  - regex: '(?:SAMSUNG-)?(?:SM-N930[VFST0P]|SCV34)'
12266
+ model: 'Galaxy Note 7'
12267
  device: 'phablet'
12268
  - regex: '(?:SAMSUNG[- ])?SM-N950|SCV37|SC-01K'
12269
+ model: 'Galaxy Note 8'
12270
  device: 'phablet'
12271
  - regex: '(?:SAMSUNG[- ])?(?:SM-N960|SCV40|SC-01L)'
12272
+ model: 'Galaxy Note 9'
12273
  device: 'phablet'
12274
  - regex: '(?:SAMSUNG[- ])?SM-(?:N970(?:U1|W8|[089DFJKLSXUW])|N971N)'
12275
+ model: 'Galaxy Note 10'
12276
  device: 'phablet'
12277
  - regex: '(?:SAMSUNG[- ])?SM-N770[FX]'
12278
+ model: 'Galaxy Note 10 Lite'
12279
  device: 'phablet'
12280
  - regex: '(?:SAMSUNG[- ])?(?:SM-N975(?:[0FUXW]|U1|Xu)|SM-N976[0BVNUQ]|SC-01M|SCV45)'
12281
+ model: 'Galaxy Note 10+'
12282
  device: 'phablet'
12283
  - regex: '(?:SAMSUNG[- ])?(?:SM-N980(?:F|F/DS))'
12284
+ model: 'Galaxy Note 20'
12285
  device: 'phablet'
12286
  - regex: '(?:SAMSUNG[- ])?(?:SM-N981(?:B|B/DS|N|U|U1|W))'
12287
+ model: 'Galaxy Note 20 5G'
12288
  device: 'phablet'
12289
  - regex: '(?:SAMSUNG[- ])?(?:SM-N985(?:F|F/DS))'
12290
+ model: 'Galaxy Note 20 Ultra'
12291
  device: 'phablet'
12292
  - regex: '(?:SAMSUNG[- ])?(?:SM-N986(?:B/DS|U1|[BNWU])|SCG06)'
12293
+ model: 'Galaxy Note 20 Ultra 5G'
12294
  device: 'phablet'
12295
 
12296
  - regex: '(?:SAMSUNG-)?SM-W750V'
12308
  device: 'tablet'
12309
  model: '$1'
12310
  - regex: 'SC-02C'
12311
+ model: 'Galaxy S II'
12312
  - regex: '(?:SAMSUNG-)?((?:SM-[TNP]|GT-P)[a-z0-9_\-]+)'
12313
  device: 'tablet'
12314
  model: '$1'
12318
  device: 'tv'
12319
  model: 'Smart TV'
12320
  - regex: 'Galaxy ([^/;]+) Build'
12321
+ model: 'Galaxy $1'
12322
  - regex: 'Galaxy ([a-z0-9]+)'
12323
+ model: 'Galaxy $1'
12324
  - regex: 'SAMSUNG[\-][ ]?([a-z0-9]+[\-_][a-z0-9]+)'
12325
  model: '$1'
12326
  - regex: 'SAMSUNG;[ ]?([a-z0-9]+[\-_][a-z0-9]+)'
12364
 
12365
  # Sencor
12366
  Sencor:
12367
+ regex: 'Sencor|ELEMENT[ _]?(?:7|8|9\.7|10[ _]1)(?:[ _]?V[23])?(?:[);/ ]|$)|ELEMENT[ _]?(?:P[0-9]+|10.1 Q001)(?:[);/ ]|$)'
12368
  device: 'tablet'
12369
  models:
12370
  # explicit tablet models
12371
+ - regex: '(?:SENCOR[ _])?Element (10\.1) (Q001)'
12372
+ model: 'Element $1" $2'
12373
  - regex: '(?:SENCOR[ _])?ELEMENT[ _]?7[ _]?V3'
12374
  model: 'Element 7 V3'
12375
  - regex: '(?:SENCOR[ _])?ELEMENT[ _]?7[ _]?V2[ _]BASIC'
12584
 
12585
  # SWISSMOBILITY
12586
  SWISSMOBILITY:
12587
+ regex: 'SCHR9GR|ZUR(?:722M|70016W?|700[RW]|805A)'
12588
  device: 'smartphone'
12589
  models:
12590
  - regex: 'SCHR9GR'
12593
  device: 'phablet'
12594
  model: 'Z72 go'
12595
 
12596
+ - regex: 'ZUR(70016W?|700[RW]|805A)(?:[);/ ]|$)'
12597
+ device: 'tablet'
12598
+ model: 'ZUR$1'
12599
+
12600
  # Thomson
12601
  Thomson:
12602
  regex: '(?:Primo(7|8)|QM73[45]-8G|QM734-2|QM736-8G\(HD\)|8950|MID1002|5014G)(?:[);/ ]|$)|(?:Tlink|Every)[0-9]+'
12605
  # already detected as manta device
12606
  #- regex: 'MID1002'
12607
  # model: 'MID1002'
12608
+ - regex: 'Primo(7|8)'
12609
  model: 'Primo $1'
12610
  - regex: 'QM734-2'
12611
  model: 'QM734-2'
12674
 
12675
  # Polaroid
12676
  Polaroid:
12677
+ regex: 'Polaroid|(?:PMID|MIDC)[0-9a-z]+(?:[);/ ]|$)|MID(?:1014|0714)|PRO[VG]?(?:[0-9]{3,}[a-z]*|[0-9]{2}[a-z])|(?:P(?:400[56]|4526|500[56]|502[56]|504[67]|552[56])A|P902/A900|PSPC(?:505|550|[MZL]20A0|K21NA)|SIGMA 5)(?:[);/ ]|$)'
12678
  device: 'smartphone'
12679
  models:
12680
  # explicit smartphone models
12727
  - regex: '((?:PMID|MIDC)[0-9a-z]+)(?:[);/ ]|$)'
12728
  model: '$1'
12729
  device: 'tablet'
12730
+ - regex: '(P902/A900)(?:[);/ ]|$)'
12731
+ model: '$1'
12732
+ device: 'tablet'
12733
  - regex: 'Polaroid'
12734
  model: ''
12735
  device: 'tablet'
12831
 
12832
  # Prestigio
12833
  Prestigio:
12834
+ regex: 'Prestigio 5500 DUO|(?:PMP|PAP|PMT|PSP|PGPS)[0-9]+[a-z0-9_]+(?:[);/ ]|$)|Muze C3'
12835
  device: 'tablet'
12836
  models:
12837
  - regex: 'PMT3277_3G'
12846
  model: 'Grace S5'
12847
  - regex: 'PMT3287_3G'
12848
  model: 'MultiPad Ranger 8.0 3G'
12849
+ - regex: 'Prestigio 5500 DUO' # PAP5500DUO
12850
+ model: 'MultiPhone 5500 Duo'
12851
+ device: 'smartphone'
12852
  - regex: 'PMT3208[_ ]3G'
12853
  model: 'MultiPad Wize 8.0 3G'
12854
  - regex: 'PSP7546DUO([ _][A-Z]{2})?'
12969
 
12970
  # Ramos
12971
  Ramos:
12972
+ regex: 'Ramos ?([^/;]+) Build|MOS1(?:[);/ ]|$)'
12973
  device: 'tablet'
12974
+ models:
12975
+ - regex: '(MOS1)(?:[);/ ]|$)'
12976
+ model: '$1'
12977
+ - regex: 'Ramos ?([^/;]+) Build'
12978
+ model: '$1'
12979
 
12980
  # Razer
12981
  Razer:
13054
 
13055
  # Spice
13056
  Spice:
13057
+ regex: '(?<![\d];)Spice'
13058
  device: 'smartphone'
13059
  models:
13060
  - regex: 'Spice[ _\-]?([^/;]+)(?:[\)]| Build)'
13064
 
13065
  # Sharp (jp.sharp)
13066
  Sharp:
13067
+ regex: 'SHARP|SBM|SH-?[0-9]+[a-z]?(?:[);/ ]|$)|AQUOS|(?:SH-M0[45789]|SH-M1[123]|S[357]-SH|SH-[MZ](10|01)|SH-[CL]02|SH-RM(?:1[12]|02)|[34]04SH|401SH|[45]02SH|306SH|[36]05SH|70[1246]SH|80[138]SH|90[1678]SH|50[3679]SH|SHL22|SHV4[0-8]|SHV3[1-9](?:[-_]u)?|FS80(?:1[08]|32|28|0[29])|TG-L900S|NP601SH|603SH|SHV4[035][-_]u|SW001SH|SHG0[12]|X4-SH|A002SH|SH-A01|DM-01J)(?:[);/ ]|$)'
13068
  device: 'smartphone'
13069
  models:
13070
  # explicit smartphone models
13130
  model: 'Aquos Ever'
13131
  - regex: 'SH-02H(?:[);/ ]|$)'
13132
  model: 'Aquos Compact'
13133
+ - regex: '30[56]SH(?:[);/ ]|$)'
13134
  model: 'Aquos Crystal'
13135
  - regex: '402SH(?:[);/ ]|$)'
13136
  model: 'Aquos Crystal X'
13164
  model: 'Aquos U'
13165
  - regex: 'TG-L900S(?:[);/ ]|$)'
13166
  model: 'Luna S'
13167
+ - regex: 'SH-A01(?:[);/ ]|$)'
13168
+ model: 'B10'
13169
  - regex: '(?:FS8002|SHV47)(?:[);/ ]|$)'
13170
  model: 'Z2'
13171
  - regex: 'FS8009(?:[);/ ]|$)'
13178
  model: 'Star Wars'
13179
  - regex: 'SH-RM02'
13180
  model: 'Aquos SH-RM02'
13181
+ - regex: '401SH'
13182
+ model: 'Aquos 401SH'
13183
  - regex: 'DM-01J'
13184
  model: 'Disney Mobile'
13185
 
13319
 
13320
  # Symphony
13321
  Symphony:
13322
+ regex: 'SYMPHONY[ \_]([a-z0-9]+)|(?:roar (?:V20|E80))|ZVIII(?:[);/ ]|$)'
13323
  device: 'smartphone'
13324
  models:
13325
+ - regex: 'ZVIII'
13326
+ model: 'ZVIII'
13327
  - regex: 'roar V20'
13328
  model: 'Roar V20'
13329
  - regex: 'roar E80'
13375
 
13376
  # Tcl
13377
  TCL:
13378
+ regex: 'TCL[_ -][a-z0-9]+|(?:TCL[_ -][^;/]+ Build)|(?:TCLGalaG60(?:\(9108A\))?|A502DL|T780H|5199I|7040N|5133A|5159[AJ]|5152D|T770H)(?:[);/ ]|$)'
13379
  device: 'smartphone'
13380
  models:
13381
  - regex: 'TCLGalaG60(?:\(9108A\))?(?:[);/ ]|$)'
13398
  model: 'LX'
13399
  - regex: '5159[AJ](?:[);/ ]|$)'
13400
  model: 'L9'
13401
+ - regex: 'T770H(?:[);/ ]|$)'
13402
+ model: '10L'
13403
 
13404
  # Teclast
13405
  Teclast:
13495
 
13496
  # teXet
13497
  teXet:
13498
+ regex: 'Texet|(NaviPad [^/;]*) Build|TM-(?:1046|1058|1057|1067|3000|3200R|3500|4003|4071|450[34]|451[30]|4377|4082R|508[34]|550[358]|5010|5017|507[4-7]|5[23]77|6003|6906|702[13]|7055HD|709[69]|9747BT|9758|9751HD|9767|5513|520[410]|507[13]|558[134]|570[23]|7859|8044|9748[ _]3G|9720|7047HD[ _]3G|9757|9740|4982|4515|4083|500[3567]|5571|3204R|5016|8043|7047HD[ _]3G|8041HD|8066|705[23]|7041|8041HD|8051|8048|974[96]|973[78]W|974[170]|9743W|9750HD|7043XD|7049|7887|7037W|702[46])|TB-(771A|711A)|X-Force[\(-]?TM-5009\)?|X-Plus[\(-]?TM-5577\)?|TM_5011|X-pad (?:AIR 8|iX 7|NAVI 7.[35]|NAVI 10|SKY 8.1|STYLE 8|STYLE 10.1|HIT|LITE 7.[12]|QUAD (?:7.2|10|7)|SHINE 8.1)(?: 3G)?'
13499
  device: 'tablet'
13500
  models:
13501
  - regex: 'TM-9749'
13569
  - regex: 'TM_5011'
13570
  device: 'smartphone'
13571
  model: 'X-Omega'
13572
+ - regex: 'TM-508(3|4)'
13573
+ device: 'smartphone'
13574
+ model: 'Pay $1G'
13575
+ - regex: 'TM-558(3|4)'
13576
+ device: 'smartphone'
13577
+ model: 'Pay 5.5" $1G'
13578
+ - regex: 'TM-5702'
13579
+ device: 'smartphone'
13580
+ model: 'Pay 5.7" 3G'
13581
+ - regex: 'TM-5703'
13582
+ device: 'smartphone'
13583
+ model: 'Pay 5.7" Pro'
13584
  - regex: 'TM-5201'
13585
  device: 'smartphone'
13586
  model: 'Rock'
13596
  - regex: 'TM-4982'
13597
  device: 'smartphone'
13598
  model: 'iX-Maxi'
13599
+ - regex: 'TEXET[_ ]IX-MINI'
13600
+ device: 'smartphone'
13601
+ model: 'iX-Mini'
13602
  - regex: 'TM-5010'
13603
  device: 'smartphone'
13604
  model: 'X-Selfie'
13617
  - regex: 'X-Plus[\(-]?TM-5577\)?'
13618
  device: 'smartphone'
13619
  model: 'X-Plus'
13620
+ - regex: 'teXet[_ ]X-medium[_ ]plus'
13621
+ device: 'smartphone'
13622
+ model: 'X-Medium Plus'
13623
 
13624
  # Telefunken
13625
  Telefunken:
13626
+ regex: 'TELEFUNKEN|Foxtrot|TEL-1013GIQA|TF-SP(?:500[12]|4002)|(TF-MID(?:[78]02G|70[78]G|80[46]G|9705RG|9707G|7805G|100[57]G|1010G))|(TF-LED(?:65S75T2SU|32S39T2S|32S5[289]T2S|32S70T2S))'
13627
  device: 'tablet'
13628
  models:
13629
  - regex: 'TEL-1013GIQA'
13631
  - regex: 'Foxtrot2'
13632
  model: 'Foxtrot 2'
13633
  device: 'smartphone'
13634
+ - regex: '(?:TELEFUNKEN)?(TF-SP(?:500[12]|4002)|Outdoor LTE|Foxtrot)'
13635
  model: '$1'
13636
  device: 'smartphone'
13637
+ - regex: '(TF-MID(?:[78]02G|70[78]G|80[46]G|9705RG|9707G|7805G|100[57]G|1010G))'
13638
  model: '$1'
13639
  - regex: '(TF-LED(?:65S75T2SU|32S39T2S|32S5[289]T2S|32S70T2S))'
13640
  model: '$1'
13750
 
13751
  # Touchmate
13752
  Touchmate:
13753
+ regex: 'TOUCHMATE|(TM-(?:MID1020A|MID794C|MID795|MID710|MID798|MID792|MID788D|SM500N|SM410))'
13754
  device: 'smartphone'
13755
  models:
13756
+ - regex: '(TM-(?:MID1020A|MID794C|MID795|MID710|MID798|MID792|MID788D))'
13757
  device: 'tablet'
13758
  model: '$1'
13759
  - regex: '(TM-(?:SM500N|SM410))'
13760
+ model: '$1'
13761
  - regex: 'Touchmate ([^/;]+) Build'
13762
+ model: '$1'
13763
 
13764
  # TrekStor
13765
  TrekStor:
13874
 
13875
  # Ulefone
13876
  Ulefone:
13877
+ regex: 'Ulefone|Gemini Pro|Power_[356]|S10_Pro|(?:Armor(?:(?:[ _])(?:[2367]|X[236]|6[SE]|3WT|3W|X))?|U00[78][ _]Pro|Be[ _]X|Be[ _]Touch(?:[ _][23])?|Be[ _](?:One|Pure)(?:[ _]Lite)?)(?:[);/ ]|$)'
13878
  device: 'smartphone'
13879
  models:
13880
  - regex: 'S10_Pro'
13895
  model: 'U007 Pro'
13896
  - regex: 'U008 Pro'
13897
  model: 'U008 Pro'
 
 
 
 
 
 
13898
  - regex: 'Armor[ _]X([236])(?:[);/ ]|$)'
13899
  model: 'Armor X$1'
13900
  - regex: 'Armor[ _]6S(?:[);/ ]|$)'
13901
  model: 'Armor 6S'
13902
  - regex: 'Armor[ _]6E(?:[);/ ]|$)'
13903
  model: 'Armor 6E'
 
 
13904
  - regex: 'Armor[ _]X5(?:[);/ ]|$)'
13905
  model: 'Armor X5'
13906
  - regex: 'Armor[ _]5S(?:[);/ ]|$)'
13907
  model: 'Armor 5S'
13908
  - regex: 'Armor[ _]X(?:[);/ ]|$)'
13909
  model: 'Armor X'
13910
+ - regex: 'Armor[ _]3W(?:[);/ ]|$)'
13911
+ model: 'Armor 3W'
13912
+ - regex: 'Armor[ _]3WT(?:[);/ ]|$)'
13913
+ model: 'Armor 3WT'
13914
+ - regex: 'Armor[ _]([2367])(?:[);/ ]|$)'
13915
+ model: 'Armor $1'
13916
  - regex: 'Armor(?:[);/ ]|$)'
13917
  model: 'Armor'
13918
  - regex: 'Gemini Pro(?:[);/ ]|$)'
13928
 
13929
  # UMIDIGI
13930
  UMIDIGI:
13931
+ regex: 'UMI(?:DIGI)?[ _]|A5_Pro|ROME[_ ]X'
13932
  device: 'smartphone'
13933
  models:
13934
  - regex: 'A5_Pro'
13937
  model: 'Touch X'
13938
  - regex: 'UMI TOUCH'
13939
  model: 'Touch'
13940
+ - regex: 'ROME[_ ]X'
13941
+ model: 'Rome X'
13942
  - regex: 'UMI_(London|Diamond(?:_X)?)'
13943
  model: '$1'
13944
  - regex: 'UMI(?:DIGI)?[ _]([^/;)]+)(?: Build|\))'
14050
 
14051
  # Vernee
14052
  Vernee:
14053
+ regex: 'Vernee|Mars Pro|Apollo[ _](?:Lite|X)|Thor (?:E|Plus)|X2_euro'
14054
  device: 'smartphone'
14055
  models:
14056
+ - regex: 'Apollo[ _]Lite'
14057
  model: 'Apollo Lite'
14058
+ - regex: 'Apollo[ _]X'
14059
  model: 'Apollo X'
14060
  - regex: 'Mars Pro'
14061
  model: 'Mars Pro'
14065
  model: 'Thor Plus'
14066
  - regex: 'Vernee_M5'
14067
  model: 'M5'
14068
+ - regex: 'X2_euro'
14069
+ model: 'X2'
14070
  - regex: 'Vernee[ _-]([^;/]+) Build'
14071
  model: '$1'
14072
  - regex: 'Vernee[ _-]([a-z0-9_-]+)'
14122
  - regex: 'verykool[ _]?([^/;]+);'
14123
  model: '$1'
14124
 
14125
+ # Vestel (vestel.com)
14126
  Vestel:
14127
+ regex: 'Vestel[ _]|Venus[ _](GO|E[43]|V[1-9]|Z[1-9]0)|V_?TAB|VP74|VT97PRO|VSP145M|VSP250[GS]|VSP355[GS]|V3_5580_Dual'
14128
  device: 'smartphone'
14129
  models:
14130
  - regex: 'VT97PRO'
14160
  model: 'Venus Z$1'
14161
  - regex: 'Venus[ _]GO'
14162
  model: 'Venus Go'
14163
+ - regex: 'Venus[ _]E([34])'
14164
+ model: 'Venus E$1'
14165
+ - regex: 'Vestel_5000_Dual'
14166
+ model: '5000 Dual'
14167
+ - regex: 'Vestel_5000_2gb'
14168
+ model: '5000 2GB'
14169
+ - regex: 'Vestel[ _](5000|5530)'
14170
+ model: '$1'
14171
 
14172
  # Videocon
14173
  Videocon:
14174
  regex: 'Videocon[_ \-]|VT75C|V502430'
14175
  device: 'smartphone'
14176
  models:
14177
+ - regex: 'Videocon_V1585'
14178
+ device: 'feature phone'
14179
+ model: 'V1585'
14180
  - regex: 'Videocon[_ \-]([a-z0-9]+)'
14181
  model: '$1'
14182
  - regex: 'VT75C(?:[);/ ]|$)'
14415
 
14416
  # Wexler
14417
  Wexler:
14418
+ regex: 'Wexler|(?:ULTIMA 7 TWIST PLUS|TAB10iQ3G|TAB[ _]10Q)(?:[);/ ]|$)|ZEN[ _](?:4\.5|4\.7|5)'
14419
  device: 'tablet'
14420
  models:
14421
  - regex: '(?:Wexler[ _\-\.])?ZEN[ _]4\.5(?:[);/ ]|$)'
14429
  device: 'smartphone'
14430
  - regex: '(?:Wexler[ _\-\.])?TAB[ _]10Q(?:[);/ ]|$)'
14431
  model: 'TAB 10Q'
14432
+ - regex: 'TAB10iQ3G(?:[);/ ]|$)'
14433
+ model: 'TAB 10iQ 3G'
14434
  - regex: 'Wexler[ _\-\.]([^;/]+) Build'
14435
  model: '$1'
14436
  - regex: 'Wexler[ _\-\.]([^);/]+)(?:[);/]|$)'
14440
 
14441
  # Wiko (wikomobile.com)
14442
  Wiko:
14443
+ regex: '(?:WIKO[_ -])|(?:WIKO-)?CINK_[a-z0-9_]+|(?:WIKO-)?HIGHWAY_[a-z0-9_]+|(?:WIKO-)?(?:Cink([^/;]*)|Highway([^/;]*)|Iggy|Stairway|Rainbow ?(Jam|Lite|Up)?|Darkside|Darkmoon|Darkfull|Darknight|Freddy|FEVER|Jerry[2]?|Sublim|Ozzy|JIMMY|Barry|Birdy|Bloom|Getaway|Goa(?!nna)|Kite|Robby|Lenny[2-9]?|Slide|Sunset[2-9]?|Sunny[2-9]?|Tommy[2-9]?|PULP(?: Fab)?|Wax|HARRY|Ridge(?: Fab)?|U FEEL(?: Prime| Lite)?|U PULSE(?: LITE)?|View2 Go|View XL|View Prime)(?: Plus)?(?: 4G)?(?: Build|$)?|W_(?:C8[06]0|K[346]00|P130|P200|C200SN)|WC300|W-(?:V7[23]0|V8[30]0|P[36]11|K420|K510S?|K130)-(?:TMV|TIM|TVM|EEA|SUN|SWI|OPE|BYT|DU|TH)|WIM Lite|W-K360-TV|W-V600|W-K200|W-U300|U307AS|CINK PEAX 2|HIGHWAY PURE'
14444
  device: 'smartphone'
14445
  models:
14446
  - regex: '(?:WIKO-)?Cink Peax 2'
14449
  model: 'Cink$1'
14450
  - regex: '(?:WIKO-)?CINK_([a-z0-9_]+)'
14451
  model: 'Cink $1'
14452
+ - regex: '(?:WIKO-)?HIGHWAY PURE'
14453
+ model: 'Highway Pure'
14454
+ - regex: '(?:WIKO-)?HIGHWAY STAR'
14455
+ model: 'Highway Star'
14456
  - regex: '(?:Wiko-)?Highway([^/;]*) Build'
14457
  model: 'Highway$1'
14458
  - regex: '(?:WIKO-)?HIGHWAY_([a-z0-9_]+)'
14497
  model: 'Jerry Max'
14498
  - regex: 'W_K300'
14499
  model: 'Jerry 3'
14500
+ - regex: 'W-K420-TVM'
14501
+ model: 'Jerry 4'
14502
  - regex: '(?:WIKO-)?Jerry2'
14503
  model: 'Jerry 2'
14504
  - regex: '(?:WIKO-)?Jerry'
14531
  model: 'Sunset'
14532
  - regex: '(?:WIKO-)?Sunny3'
14533
  model: 'Sunny 3'
14534
+ - regex: 'W-K200'
14535
+ model: 'Sunny 3 Plus'
14536
  - regex: '(?:WIKO-)?Sunny2 Plus'
14537
  model: 'Sunny 2 Plus'
14538
  - regex: '(?:WIKO-)?Sunny2'
14539
  model: 'Sunny 2'
14540
  - regex: 'W-K360-TV'
14541
  model: 'Sunny 4 Plus'
14542
+ - regex: 'W-K130-TMV'
14543
+ model: 'Sunny 4'
14544
  - regex: '(?:WIKO-)?Sunny'
14545
  model: 'Sunny'
14546
  - regex: '(?:W_K600|Tommy3|W_C200SN)'
14555
  model: 'Wax'
14556
  - regex: '(?:WIKO-)?HARRY'
14557
  model: 'Harry'
14558
+ - regex: 'W-V600'
14559
+ model: 'Harry 2'
14560
  - regex: '(?:WIKO-)?WIM Lite'
14561
  model: 'WIM Lite'
14562
  - regex: '(?:WIKO-)?Pulp Fab 4G'
14589
  model: 'View Lite'
14590
  - regex: 'W_C800'
14591
  model: 'View 2'
14592
+ - regex: 'W_C860'
14593
+ model: 'View 2 Pro'
14594
  - regex: 'W_P200'
14595
  model: 'View Max'
14596
+ - regex: 'W_P130'
14597
+ model: 'View Go'
14598
+ - regex: 'W-V800-(TVM|TIM|EEA|OPE|DU)'
14599
  model: 'View 3 Lite'
14600
+ - regex: 'W-K130-(?:OPE|EEA)'
14601
+ model: 'Y50'
14602
  - regex: 'W-K420-EEA'
14603
  model: 'Y50'
14604
+ - regex: 'W-K510-(?:TVM|EEA|OPE|SUN|BYT|TH)|W-K510S-SWI'
14605
  model: 'Y60'
14606
+ - regex: 'W-V720-(?:EEA|OPE|SUN)'
14607
  model: 'Y80'
14608
+ - regex: 'W-P311-(?:EEA|OPE|TVM)'
14609
  model: 'View 3'
14610
+ - regex: 'W-P611-(?:EEA|OPE)'
14611
  model: 'View 3 Pro'
14612
  - regex: 'W-V830-EEA'
14613
  model: 'View 4'
14622
 
14623
  # Wieppo
14624
  Wieppo:
14625
+ regex: 'Wieppo (S6 Lite|S[658]|E1)(?:[);/ ]|$)'
14626
  device: 'smartphone'
14627
  model: '$1'
14628
 
14727
 
14728
  # Xiaomi
14729
  Xiaomi:
14730
+ regex: 'Xiaomi(?!/(?:Miui|Mint[ ])Browser)|Mi9 Pro 5G|(?:MI [a-z0-9]+|Mi-4c|MI-One[ _]?[a-z0-9]+|MIX(?: 2S?)?)(?:[);/ ]|$)|HM (?:[^/;]+) (?:Build|MIUI)|(?:2014501|2014011|201481[12378]|201302[23]|2013061) Build|Redmi|MI_NOTE_Pro|POCOPHONE|(?:SHARK )?(KLE|MBU)-[AH]0|SKR-[AH]0|SKW-[AH]0|POCO F1|DLT-[AH]0|MIBOX[234]([_ ]PRO)?|MiTV4[CSX]?|MiTV-(MSSP[01]|AXSO0)|AWM-A0|MI CC 9 Meitu Edition|MiBOX1S|MiTV4A|M2006C3(?:L[IGC]|LVG|MN?G)|M2007J1SC|M2002J9[EG]|HM2014819|WT88047|M2004J(?:7[AB]|19)C|M2006C3MII|M2003J15SC|M2007J3S[CYG]|HM NOTE 1(?:LTE|W)|MI[_ ]PLAY|XIG01'
14731
  device: 'smartphone'
14732
  models:
14733
  # specific smartphone models
14767
  model: 'MI CC 9'
14768
  - regex: 'Xiaomi_M2001J2E_TD-LTE(?:[);/ ]|$)'
14769
  model: 'MI 10'
14770
+ - regex: 'M2007J3S[CY](?:[);/ ]|$)'
14771
  model: 'MI 10T 5G'
14772
  - regex: 'M2007J3SG(?:[);/ ]|$)'
14773
  model: 'MI 10T Pro 5G'
14817
  model: 'Redmi 1'
14818
  - regex: 'M2004J7AC(?:[);/ ]|$)'
14819
  model: 'Redmi 10X'
14820
+ - regex: '(?:M2004J19C|M2006C3MII)(?:[);/ ]|$)'
14821
  model: 'Redmi 9'
14822
  - regex: 'M2006C3L[GCI](?:[);/ ]|$)'
14823
  model: 'Redmi 9A'
14861
  - regex: 'MiTV-MSSP1(?:[);/ ]|$)'
14862
  model: 'MiTV 4S'
14863
  device: 'tv'
14864
+ - regex: '(?:MiTV-AXSO0|MiTV4(?:A|-ANSM0)|MiTV-MSSP0)(?:[);/ ]|$)'
14865
  model: 'MiTV 4A'
14866
  device: 'tv'
14867
  - regex: '(MiTV)(4[CSX]|4)(?:[);/ ]|$)'
15009
 
15010
  # Yu
15011
  Yu:
15012
+ regex: '(?:YU5[05]10[A]?|YU4711|AO5510|YU5050|YU501[14])(?:[);/ ]|$)'
15013
  device: 'smartphone'
15014
  models:
15015
  - regex: 'YU5010[A]?(?:[);/ ]|$)'
15016
  model: 'Yuphoria'
15017
+ - regex: 'YU5011(?:[);/ ]|$)'
15018
+ model: 'Yunique 2'
15019
  - regex: 'YU5050(?:[);/ ]|$)'
15020
  model: 'Yutopia'
15021
  - regex: 'AO5510(?:[);/ ]|$)'
15024
  model: 'Yureka Plus'
15025
  - regex: 'YU4711(?:[);/ ]|$)'
15026
  model: 'Yunique'
 
 
15027
  - regex: 'YU5014(?:[);/ ]|$)'
15028
  model: 'Ace'
15029
 
15572
  regex: '(?:FTJ17A00|FTJ152[ABCD]|FT141B|FT142D_LTEXM|FT142A?|FTJ161[AB]|FTJ1[56]2E|FTJ162D|FTE161[GE])(?:[);/ ]|$)'
15573
  device: 'smartphone'
15574
  models:
15575
+ - regex: 'FTJ152C'
15576
+ model: 'Samurai Miyabi'
15577
+ - regex: 'FTJ17A00(?:[);/ ]|$)'
15578
+ model: 'Rei 2 Dual'
15579
+ - regex: 'FTJ161A'
15580
+ model: 'Musashi'
15581
+ - regex: 'FTE161E'
15582
+ model: 'Ice 2'
15583
+ - regex: 'FTE161G'
15584
+ model: 'Ice 2 Plus'
15585
+ - regex: 'FTJ162E'
15586
+ model: 'Raijin'
15587
+ - regex: 'FT141B'
15588
+ model: 'Nico'
15589
+ - regex: 'FT142D_LTEXM'
15590
+ model: 'XM'
15591
+ - regex: 'FT142A?'
15592
+ model: 'Priori 2'
15593
+ - regex: 'FTJ152A'
15594
+ model: 'Priori 3'
15595
+ - regex: 'FTJ162D'
15596
+ model: 'Priori 4'
15597
+ - regex: 'FTJ152B'
15598
+ model: 'Priori 3S LTE'
15599
+ - regex: 'FTJ152D'
15600
+ model: 'Samurai Kiwami'
15601
+ - regex: 'FTJ161B'
15602
+ model: 'Samurai Rei'
15603
+ - regex: 'FTJ152E'
15604
+ model: 'Katana 1'
15605
 
15606
  # Zeemi
15607
  Zeemi:
15634
  regex: 'ZOPO|(?:ZOPO[_ ])?(Flash X3|ZP[0-9]{2,}[^/;]+)(?:\)| Build)'
15635
  device: 'smartphone'
15636
  models:
15637
+ - regex: '(?:ZOPO_C2_MOD|ZP998)(?:[);/ ]|$)'
15638
  model: 'C2 II'
15639
+ - regex: 'ZOPO 9xxQuad(?:[);/ ]|$)'
15640
+ model: '9XX Quad'
15641
  - regex: '(?:ZOPO_)?ZP980[+](?:[);/ ]|$)'
15642
  model: 'ZP980+'
15643
  - regex: '(?:ZOPO_)?ZP980(?:[);/ ]|$)'
15679
 
15680
  # ZTE
15681
  ZTE:
15682
+ regex: 'ZTE|AxonPhone|([a-z0-9]+)_USA_Cricket|(?:Blade (?:L110|L[2357]|L7A|S6|V[6789]|V8Q|V8 SE|V9 VITA|X7|A(310|460|465|475|520|530|602)|V580|V Ultra|Q Lux)|N9[15]8St|NX(?:403A|404H|406E|40[X2]|507J|503A|505J|506J|508J|510J|512J|511J|513J|521J|523J_V1|529J|531J|541J|5[48]9J|551J|563J|569[HJ]|573J|575J|59[157]J|60[1689]J|61[12679]J|62[79]J|65[19]J|907J)|N818S|N951[0579]|N91[38]0|N9101|N913[267]|N952[01]|N9560|N9810|N799D|[UV]9180|[UV]9815|Z(?:233V|331|5031O|559DL|6621O|667T|768G|792|81[25]|818L|82[08]|83[12359]|85[125]|851M|(557|71[67]|798|836|861|916)BL|986DL|(232|718|828)TL|(?:233|353|558|717|799|837|862|899|917|963)VL|955A|95[678]|965|97[018]|98[1237]|986U|999|936L)|Apex2|G (LTE|Lux)|Vec|Z959|V865M|Z3001S|902ZT|KIS II Max|Kis 3|K3DX-V5G|Z930L|Optus X|Blade[ _](A510|A[35] 2019-T|A6 MAX|A0622|X9)|Z3153V|Nubia Z(?:9|11)|Ctyon-A9|602ZT|MO-01[JK]|Z963U|402ZT|P545|P609|dandelion|901ZT|A001ZT|Z-01K|UZTE V808)(?:[);/ ]|$)'
15683
  device: 'smartphone'
15684
  models:
15685
  # explicit smartphone models
16079
  model: '$1'
16080
  - regex: 'ZTE-(?:G |G-)?([a-z0-9 _]+)'
16081
  model: '$1'
16082
+ - regex: 'U?ZTE[ _]([a-z0-9]+)'
16083
  model: '$1'
16084
 
16085
  Zuum:
16134
  models:
16135
  - regex: 'Lemhoov[ _-]([^/;]+) Build'
16136
  model: '$1'
16137
+
16138
+ # MTC (MTS)
16139
  MTC:
16140
+ regex: 'MTC[ _](968|97[82]|970|982[OT]?|1078)|(?:MTC[_ ])?SMART[ _]?(?:Race[2]?|Sprint|Run|Surf[2]?)[ _]4G|MTC975|Smart_(?:LINE|Light)|MTC[ _]SMART[ _](?:Run|Start_2)|Redbox Mini 5\(MTS\)'
16141
  device: 'smartphone'
16142
  models:
16143
  - regex: 'MTC[ _]?(97[258]|970[H]?|982[OT]?|968)'
16149
  model: 'Smart Race 4G'
16150
  - regex: 'SMART[ _]Race2[ _]4G'
16151
  model: 'Smart Race 2 4G'
16152
+ - regex: '(?:MTC_)?SMART[ _]Sprint[ _]4G'
16153
  model: 'Smart Sprint 4G'
16154
+ - regex: '(?:MTC_)?SMART[ _]Start_2'
16155
  model: 'Smart Start 2'
16156
+ - regex: 'Smart_LINE'
16157
+ model: 'Smart Line'
16158
+ - regex: 'Smart_Light'
16159
+ model: 'Smart Light'
16160
  - regex: 'SMART[ _]?Run(?:[ _]4G)?'
16161
  model: 'Smart Run 4G'
16162
  - regex: 'SMART[ _]Surf2[ _]4G'
16163
  model: 'Smart Surf 2 4G'
16164
  - regex: 'SMART[ _]Surf[ _]4G'
16165
  model: 'Smart Surf 4G'
16166
+ - regex: 'Redbox Mini 5\(MTS\)'
16167
+ device: 'tv'
16168
+ model: 'Redbox Mini 5'
16169
 
16170
  # MegaFon
16171
  MegaFon:
16200
 
16201
  # Vertex
16202
  Vertex:
16203
+ regex: 'Lion_Dual|V709X|Tab [43]G (?:7-2|8-1|10-1)|Pro_P3[01]0_4G|Lion_DC|Baccara|Eagle[ _]4G|ImpressMAX|Impress[ _]([^;/]+)(?:Build|\))'
16204
  device: 'smartphone'
16205
  models:
16206
+ - regex: '(Lion_Dual|Lion_DC|Baccara|Eagle[ _]4G)'
16207
  model: '$1'
16208
  - regex: 'ImpressMAX(?:[);/ ]|$)'
16209
  model: 'Impress Max'
16210
+ - regex: 'Pro_P(3[01]0)_4G(?:[);/ ]|$)'
16211
+ model: 'Pro P$1 4G'
16212
  - regex: '(Impress[ _]([^;/]+))(?:Build|\))'
16213
  model: '$1'
16214
  - regex: '(V709X)'
16215
  device: 'tablet'
16216
  model: '$1'
16217
+ - regex: 'Tab ([43])G ([78]|10)-([21])'
16218
+ device: 'tablet'
16219
+ model: 'Tab $1G $2.$3"'
16220
 
16221
  # Devices with undectable brand, but detectable model
16222
  Unknown:
16362
  models:
16363
  - regex: 'FORME[ _-]F520(?:[);/ ]|$)'
16364
  model: 'Forever'
16365
+ - regex: 'FORME[ _-](A37|R7S?)(?:[);/ ]|$)'
16366
  model: '$1'
16367
 
16368
  # Shuttle
16383
 
16384
  # Highscreen
16385
  Highscreen:
16386
+ regex: 'HIGHSCREEN|(Easy[- ]Power(?:[- ]Pro)?|Pure[_ ]Power|Power Ice(?: Max)?|Easy[_ ]([SFL]|XL)(?:_Pro)?|Razar_Pro|Power Rage(?: Evo)?|Zera-S-Power|Zera[ _][UFS]|Power[ _]?Five[ _]?(?:Pro|Evo|Max|Max(?:Lite|2))|PowerFour|BOOST II(?:se)?|FestXL|Fest-Pro|Tasty|Boost3|Boost 3(?: Pro)? SE|Expanse)(?:[);/ ]|$)'
16387
  device: 'smartphone'
16388
  models:
16389
  - regex: '(Power Ice(?:[ ](?:Max|Evo))?|Power Rage(?: Evo)?|Zera[ _][UFS])(?:[);/ ]|$)'
16400
  model: 'Power Five Max'
16401
  - regex: 'FestXL(?:[);/ ]|$)'
16402
  model: 'Fest XL'
16403
+ - regex: 'Fest-Pro(?:[);/ ]|$)'
16404
+ model: 'Fest Pro'
16405
  - regex: 'PowerFour(?:[);/ ]|$)'
16406
  model: 'Power Four'
16407
  - regex: 'Pure[_ ]Power(?:[);/ ]|$)'
16420
  model: 'Boost 2'
16421
  - regex: 'BOOST IIse(?:[);/ ]|$)'
16422
  model: 'Boost 2 SE'
16423
+ - regex: 'Boost 3 SE(?:[);/ ]|$)'
16424
+ model: 'Boost 3 SE'
16425
+ - regex: 'Boost 3 Pro SE(?:[);/ ]|$)'
16426
+ model: 'Boost 3 Pro SE'
16427
  - regex: 'BOOST3(?:[);/ ]|$)'
16428
  model: 'Boost 3'
16429
  - regex: 'Zera-S-Power(?:[);/ ]|$)'
16453
  - regex: '(GU1011C|GU7013C|GU730C)(?:[);/ ]|$)'
16454
  model: '$1'
16455
 
16456
+ # Atom ()
16457
  Atom:
16458
+ regex: 'ATOM-(108AM|216RK|216AM)(?:[);/ ]|$)'
16459
  device: 'tv'
16460
  model: '$1'
16461
 
16462
  # Qumo
16463
  Qumo:
16464
+ regex: 'QUMO[ _]?|(?:Quest[ _]?(?:45[56]|50[67])|Vega[ _]?78[23]|Sirius[ _]?(?:1001|890))(?:[);/ ]|$)'
16465
  device: 'tablet'
16466
  models:
16467
  - regex: '(?:QUMO[ _]?)?Vega[ _]?(78[23]|8002)(?:[);/ ]|$)'
16468
  model: 'Vega $1'
16469
  - regex: 'Yooda(?:[);/ ]|$)'
16470
  model: 'Yooda'
16471
+ - regex: 'Sirius[ _]?(1001|890)(?:[);/ ]|$)'
16472
+ model: 'Sirius $1'
16473
  - regex: '(?:QUMO)?(Sirius 101-4G 8GB Black|Altair 701 8GB Black|Altair 71 4GB Black|Altair 700[24]|Altair 706)(?:[);/ ]|$)'
16474
  model: '$1'
16475
+ - regex: 'QUMO[ _]Quest[ _]?(35[34]|40[26]|45[28]|47[46]|507|5[17]0|600)(?:[);/ ]|$)'
16476
+ device: 'smartphone'
16477
+ model: 'Quest $1'
16478
+ - regex: 'Quest[ _]?(45[56]|50[67])(?:[);/ ]|$)'
16479
  device: 'smartphone'
16480
  model: 'Quest $1'
16481
 
16500
 
16501
  # Unihertz
16502
  Unihertz:
16503
+ regex: '(Titan|Jelly-Pro|Atom_X?L)(?:[);/ ]|$)'
16504
  device: 'smartphone'
16505
  models:
16506
  - regex: '(Jelly)-(Pro)(?:[);/ ]|$)'
16507
  model: '$1 $2'
16508
+ - regex: '(Titan|Atom_X?L)(?:[);/ ]|$)'
16509
  model: '$1'
16510
 
16511
  # Chuwi
16587
 
16588
  # Vinga
16589
  Vinga:
16590
+ regex: 'VMP-(015-162|021-82|041-162|011-81|025-324|045-664)(?:[);/ ]|$)'
16591
  device: 'tv'
16592
  models:
16593
  - regex: 'VMP-021-82'
16594
  model: '021'
16595
+ - regex: 'VMP-025-324'
16596
+ model: '025'
16597
+ - regex: 'VMP-015-162'
16598
+ model: '015'
16599
  - regex: 'VMP-041-162'
16600
  model: '041'
16601
+ - regex: 'VMP-045-664'
16602
+ model: '045'
16603
  - regex: 'VMP-011-81'
16604
  model: '011'
16605
 
16651
 
16652
  # Mystery
16653
  Mystery:
16654
+ regex: 'MYSTERY|(MID-(?:123G|72[12]|7[01348]3G|753G|8[23]3G))(?:[);/ ]|$)'
16655
  device: 'tablet'
16656
  models:
16657
+ - regex: 'MID-(123G|72[12]|7[01348]3G|753G|8[23]3G)(?:[);/ ]|$)'
16658
  model: 'MID-$1'
16659
 
16660
+ - regex: 'MYSTERY_TV_(D3155CH31)'
16661
+ device: 'tv'
16662
+ model: '$1'
16663
+
16664
  # Ritzviva
16665
  Ritzviva:
16666
  regex: '(RITZVIVA[_ ]S500C)(?:[);/ ]|$)'
16723
 
16724
  # Kivi
16725
  Kivi:
16726
+ regex: '(?:24H600G[RU]|24FR50WU|24HK30B|32HR55GU|4[39]UP50GU|40UR50G[RU]|40U600G[RU]|55UP50GU|50U600G[RU]|55UR50GR|40FK30G|40FR50BR|43UK35G|50FK30G|50UK35G|32HR50GR|55UC30G|32HK30G|40FK30G|32HR50GU|43UK30G|32FR50(?:WR|BU)|32FK3[02]G)(?:_-Ver0[0-9])?(?:[);/ ]|$)'
16727
  device: 'tv'
16728
  models:
16729
+ - regex: '(24H600G[RU]|24FR50WU|24HK30B|32HR55GU|4[39]UP50GU|40UR50G[RU]|40U600G[RU]|55UP50GU|50U600G[RU]|55UR50GR|40FK30G|40FR50BR|43UK35G|50FK30G|50UK35G|32HR50GR|32FR50(?:WR|BU)|32FK3[02]G)(?:[);/ ]|$)'
16730
  model: '$1'
16731
  - regex: '(55UC30G|40FK30G|43UK30G|32HR50G[RU]|32HK30G|32FK32G)_-Ver0([0-9])(?:[);/ ]|$)'
16732
  model: '$1 v$2'
16751
 
16752
  #Kaiomy
16753
  Kaiomy:
16754
+ regex: 'KaiCloud[ ]?(7[48]4|942)(?:[);/ ]|$)'
16755
+ device: 'tablet'
16756
+ model: 'KaiCloud $1'
16757
 
16758
  # National
16759
  National:
16763
 
16764
  # Vsun
16765
  Vsun:
16766
+ regex: '(?:VSUN (?:ILLUSION|RACE|V9)|MARS TOUCH)(?:[);/ ]|$)'
16767
  device: 'smartphone'
16768
  models:
16769
  - regex: 'ILLUSION(?:[);/ ]|$)'
16770
  model: 'Illusion'
16771
+ - regex: 'MARS TOUCH(?:[);/ ]|$)'
16772
+ model: 'Mars Touch'
16773
  - regex: 'RACE(?:[);/ ]|$)'
16774
  model: 'Race'
16775
  - regex: '(V9)(?:[);/ ]|$)'
16783
 
16784
  # RugGear
16785
  RugGear:
16786
+ regex: '(RugGear|RG(?:310|500|65[05]|702|7[13]0|850))(?:[);/ ]|$)'
16787
  device: 'smartphone'
16788
  models:
16789
  - regex: '(RG[0-9]+)(?:[);/ ]|$)'
16794
  regex: 'ALIGATOR[_ ]'
16795
  device: 'smartphone'
16796
  models:
16797
+ - regex: 'ALIGATOR[ _](S4080|S50(?:6[56]|[678]0)|RX510|S6500|RX710|RX800|S5520)(?:[);/ ]|$)'
16798
  model: '$1'
16799
 
16800
  # Maxcom
16843
 
16844
  # Zidoo
16845
  Zidoo:
16846
+ regex: 'ZIDOO[ _](H6 Pro|X6 Pro|X9S|Z10|X[158]|X20 Pro)(?:[);/ ]|$)'
16847
  device: 'tv'
16848
  model: '$1'
16849
 
16855
 
16856
  # iGet
16857
  iGet:
16858
+ regex: 'SMART[_ ](G10[12]|S7[02]|G71|G81[H]?)(?:[);/ ]|$)'
16859
  device: 'tablet'
16860
  model: 'Smart $1'
16861
 
16949
 
16950
  # NEXON
16951
  NEXON:
16952
+ regex: 'NEXON (X[1589])(?:[);/ ]|$)'
16953
+ device: 'tv'
16954
+ model: '$1'
16955
 
16956
  # ONN
16957
  ONN:
16958
+ regex: '(ONA19TB00[327])(?:[);/ ]|$)'
16959
+ device: 'tablet'
16960
+ model: '$1'
16961
+
16962
+ # EXO S.A
16963
+ EXO:
16964
+ regex: '(Wave_i101G)(?:[);/ ]|$)'
16965
  device: 'tablet'
16966
  model: '$1'
16967
 
17161
 
17162
  # E-Ceros
17163
  'E-Ceros':
17164
+ regex: '(?:CT9716(?:-B)?)(?:[);/ ]|$)'
17165
+ device: 'tablet'
17166
+ models:
17167
+ - regex: 'CT9716(?:[);/ ]|$)'
17168
+ model: 'Revolution'
17169
+ - regex: 'CT9716-B(?:[);/ ]|$)'
17170
+ model: 'Revolution HD'
17171
 
17172
  # How (how.com.br)
17173
  How:
17188
  models:
17189
  - regex: 'Multilaser[ _]G[_ ]Pro(?:[);/ ]|$)'
17190
  model: 'G Pro'
17191
+ - regex: 'Multilaser[ _]F[_ ]Pro(?:[);/ ]|$)'
17192
+ model: 'F Pro'
17193
  - regex: 'Multilaser[ _]G[_ ]Max(?:[);/ ]|$)'
17194
  model: 'G Max'
17195
  - regex: 'Multilaser[ _]G(?:[);/ ]|$)'
17255
 
17256
  # Maxtron
17257
  Maxtron:
17258
+ regex: 'Maxtron[ _-](V[327]|S[89])(?:[);/ ]|$)'
17259
  device: 'smartphone'
17260
  model: '$1'
17261
 
17348
 
17349
  # AT&T
17350
  AT&T:
17351
+ regex: '(?:U304AA|QS5509A)(?:[);/ ]|$)'
17352
+ device: 'smartphone'
17353
+ models:
17354
+ - regex: 'U304AA(?:[);/ ]|$)'
17355
+ model: 'Radiant Core'
17356
+ - regex: 'QS5509A(?:[);/ ]|$)'
17357
+ model: 'Axia'
17358
 
17359
  # BIHEE
17360
  BIHEE:
17430
 
17431
  # OzoneHD
17432
  OzoneHD:
17433
+ regex: 'OzoneHD[ _](T2 WiFi|4K(?: TV)?|Fun)(?:[);/ ]|$)'
17434
  device: 'tv'
17435
  model: '$1'
17436
 
17516
 
17517
  # BB Mobile
17518
  BB Mobile:
17519
+ regex: 'Techno[-_ ](8\.0|9\.7|TQ863Q|X595BT|S700BF|I700AJ|10.1 LTE TQ060X|7.0 LTE TQ763I|I785AP|I101BI)(?:[);/ ]|$)'
17520
  device: 'tablet'
17521
  models:
17522
  - regex: 'Techno[_ ]S700BF(?:[);/ ]|$)'
17527
  model: 'Techno 8.0" Poplar LTE TQ863Q'
17528
  - regex: 'Techno[_ ]I700AJ(?:[);/ ]|$)'
17529
  model: 'Techno 7.0" Mozg LTE I700AJ'
17530
+ - regex: 'Techno[-_ ]I785AP(?:[);/ ]|$)'
17531
+ model: 'Techno 7.85" Mozg I785AP'
17532
+ - regex: 'Techno[-_ ]I101BI(?:[);/ ]|$)'
17533
+ model: 'Techno 10.1" Mozg I101BI'
17534
  - regex: 'Techno[_ ]7.0 LTE TQ763I(?:[);/ ]|$)'
17535
  model: 'Techno 7.0" Kalash LTE TQ763I'
17536
 
17537
+ - regex: 'Techno[_ ](9\.7|8\.0) 3G(?:[);/ ]|$)'
17538
+ model: 'Techno $1" 3G'
17539
+
17540
+ - regex: 'Techno[_ ](?:X595BT)(?:[);/ ]|$)'
17541
  device: 'smartphone'
17542
  model: 'Techno Spark 3G X595BT'
17543
 
17562
  regex: 'Tele2[ _](?:Mi[dn]i[ _][12][\._][10]|Mi[dn]i|Maxi(?:[ _](?:Plus|LTE))?)(?:[);/ ]|$)'
17563
  device: 'smartphone'
17564
  models:
17565
+ - regex: 'Tele2[ _]Mini[ _]1[_\.]1(?:[);/ ]|$)'
17566
+ model: 'Mini 1.1'
17567
+ - regex: 'Tele2[ _]Midi[ _]2[_\.]0(?:[);/ ]|$)'
17568
+ model: 'Midi 2.0'
17569
+ - regex: 'Tele2[ _](Maxi(?:[_ ](?:Plus|LTE))?)(?:[);/ ]|$)'
17570
+ model: '$1'
17571
+ - regex: 'Tele2[ _](Midi[ _]1\.1|Mi[dn]i)(?:[);/ ]|$)'
17572
+ model: '$1'
17573
 
17574
  # Alfawise
17575
  Alfawise:
17579
 
17580
  # Klipad
17581
  Klipad:
17582
+ regex: 'KLIPAD_|(?:KL-V905|KL4889)(?:[);/ ]|$)'
17583
  device: 'smartphone'
17584
+ models:
17585
+ - regex: '(?:KLIPAD_)?(V355B?|KL600|KL-V905)(?:[);/ ]|$)'
17586
+ model: '$1'
17587
+ - regex: '(KL4889)(?:[);/ ]|$)'
17588
+ device: 'tablet'
17589
+ model: '$1'
17590
 
17591
  # SQOOL (sqool.fr)
17592
  SQOOL:
17602
 
17603
  # Jinga
17604
  Jinga:
17605
+ regex: 'Jinga[-_ ]|(?:Optim4G|PassPlus|PicassoNote|Hotz[_ ]M1|WinPRO|Touch4G|Start3G|IGO[ _]L[41])(?:[);/ ]|$)'
17606
  device: 'smartphone'
17607
  models:
17608
  - regex: 'Optim4G(?:[);/ ]|$)'
17611
  model: 'Hotz M1'
17612
  - regex: 'PassPlus(?:[);/ ]|$)'
17613
  model: 'Pass Plus'
17614
+ - regex: 'WinPRO(?:[);/ ]|$)'
17615
+ model: 'Win Pro'
17616
+ - regex: 'Touch4G(?:[);/ ]|$)'
17617
+ model: 'Touch 4G'
17618
+ - regex: 'Start3G(?:[);/ ]|$)'
17619
+ model: 'Start 4G'
17620
  - regex: 'PicassoNote(?:[);/ ]|$)'
17621
  model: 'Picasso Note'
17622
  - regex: 'Jinga Iron(?:[);/ ]|$)'
17629
  model: 'Trezor S1 Plus'
17630
  - regex: 'JINGA_IGO_L2(?:[);/ ]|$)'
17631
  model: 'IGO L2'
17632
+ - regex: '(?:JINGA[_ ])?IGO[_ ]([ML]1|L4)(?:[);/ ]|$)'
17633
+ model: 'IGO $1'
17634
  - regex: 'Jinga Trezor S1 Plus(?:[);/ ]|$)'
17635
  model: 'Trezor S1 Plus'
17636
 
17666
 
17667
  # Primux
17668
  Primux:
17669
+ regex: 'Primux'
17670
+ device: 'smartphone'
17671
+ models:
17672
+ - regex: 'PrimuxDelta6(?:[);/ ]|$)'
17673
+ model: 'Delta 6'
17674
 
17675
  # iMars
17676
  iMars:
17690
  - regex: 'LOGIC[_ ](X[13]|X4M|L5D|X5[AFT]|X60G)(?:[);/ ]|$)'
17691
  model: '$1'
17692
 
17693
+ # Cloudpad
17694
+ Cloudpad:
17695
+ regex: '\+VT(?:107C|Q007C)(?:[);/ ]|$)'
17696
+ device: 'tablet'
17697
+ models:
17698
+ - regex: '\+VT(107C)'
17699
+ model: '+VT$1'
17700
+ - regex: '\+VTQ(007C)'
17701
+ model: '+VTQ$1'
17702
+
17703
  # Cloudfone
17704
  Cloudfone:
17705
  regex: 'Thrill (?:Boost[ ]?(2|3)?|Snap|Access)(?:[);/ ]|$)'
17728
 
17729
  # MiXzo
17730
  MiXzo:
17731
+ regex: '(?:MiXzo[ _])?(?:ME1023|ME1030|MX1037|MX1024|MX10[24]1)([ _][34]G)?(?:[);/ ]|$)'
17732
  device: 'tablet'
17733
  models:
17734
+ - regex: 'MiXzo[_ ]ME(1023|1030)(?:[_ ]3G)(?:[);/ ]|$)'
17735
+ model: 'ME$1 3G'
17736
+ - regex: 'MiXzo[_ ]MX1021(?:[_ ]3G)?(?:[);/ ]|$)'
17737
+ model: 'MX1021 3G'
17738
+
17739
+ - regex: '(?:MiXzo[ _])?MX(1037|1041|1024)[ _]4G(?:[);/ ]|$)'
17740
+ model: 'MX$1 4G'
17741
 
17742
  # Openbox
17743
  Openbox:
17804
  regex: 'iCherry_?'
17805
  device: 'smartphone'
17806
  models:
17807
+ - regex: 'iCherry[ _]C(25[125]|21[16]|110|121|22[079]|23[03])(?:[);/ ]|$)'
17808
+ model: 'C$1'
17809
 
17810
  # NextTab
17811
  NextTab:
17815
 
17816
  # Time 2
17817
  Time2:
17818
+ regex: '(TC1050G)(?:[);/ ]|$)'
17819
+ device: 'tablet'
17820
+ model: '$1 10.1"'
17821
 
17822
  # Sunstech
17823
  Sunstech:
17845
 
17846
  # INVIN
17847
  Invin:
17848
+ regex: 'INVIN[ _-](X[24]|KM[67])(?:[);/ ]|$)'
17849
  device: 'tv'
17850
  model: '$1'
17851
 
17909
 
17910
  # MAXVI
17911
  MAXVI:
17912
+ regex: 'MAXVI[ _](?:MS401)(?:[);/ ]|$)|(?:\w+)?_MAXVI_\w+|MS502[_ ]Orion|MS531'
17913
  device: 'smartphone'
17914
+ models:
17915
+ - regex: 'MAXVI[ _](MS401)'
17916
+ model: '$1'
17917
+ - regex: 'MS531'
17918
+ model: 'MS531 Vega'
17919
+ - regex: 'MS502[_ ]Orion'
17920
+ model: 'MS502 Orion'
17921
+ - regex: '(?:\w+)?MAXVI_(P11|K10|X[358]00)_\w+'
17922
+ device: 'feature phone'
17923
+ model: '$1'
17924
+
17925
 
17926
  # meanIT (meanit.hr)
17927
  meanIT:
18068
  model: 'Vox Pop Plus'
18069
  - regex: 'VOX POP Pro'
18070
  model: 'Vox Pop Pro'
18071
+
18072
+ # Fonos
18073
+ Fonos:
18074
+ regex: 'Fonos-(O1)(?:[);/ ]|$)'
18075
+ device: 'smartphone'
18076
+ model: '$1'
18077
+
18078
+ # Xtouch
18079
+ Xtouch:
18080
+ regex: 'Xtouch X10(?:[);/ ]|$)'
18081
+ device: 'smartphone'
18082
+ model: 'X10'
18083
+
18084
+ # Conquest
18085
+ Conquest:
18086
+ regex: 'Conquest[-_](?:S(?:[68]|1[0126])|F2)(?:[);/ ]|$)'
18087
+ device: 'smartphone'
18088
+ models:
18089
+ - regex: 'Conquest[-_]S([68]|1[0126])'
18090
+ model: 'S$1'
18091
+ - regex: 'Conquest-F2'
18092
+ model: 'F2'
18093
+
18094
+ # Zatec
18095
+ Zatec:
18096
+ regex: 'ZATEC[_ ]|[ ]WIND(?:[);/ ]|$)'
18097
+ device: 'smartphone'
18098
+ models:
18099
+ - regex: 'ZATEC[_ ]GRAVITY(?:[);/ ]|$)'
18100
+ model: 'Gravity'
18101
+ - regex: '[ ]WIND(?:[);/ ]|$)'
18102
+ model: 'Wind'
18103
+
18104
+ # Selenga
18105
+ Selenga:
18106
+ regex: 'Selenga[ _](A[134])(?:[);/ ]|$)'
18107
+ device: 'tv'
18108
+ model: '$1'
18109
+
18110
+ # Starlight
18111
+ Starlight:
18112
+ regex: '(?:My_Star_X|RIO STAR|C_Note_Pro)(?:[);/ ]|$)'
18113
+ device: 'smartphone'
18114
+ models:
18115
+ - regex: 'My_Star_X'
18116
+ model: 'My Star X'
18117
+ - regex: 'RIO STAR'
18118
+ model: 'Rio Star'
18119
+ - regex: 'C_Note_Pro'
18120
+ model: 'C Note Pro'
18121
+
18122
+ # GEOFOX
18123
+ GEOFOX:
18124
+ regex: 'GEOFOX[_](MID743)(?:[);/ ]|$)'
18125
+ device: 'tablet'
18126
+ model: '$1'
18127
+
18128
+ # Tinmo
18129
+ Tinmo:
18130
+ regex: 'TiNMO[- _](A11|K3)(?:[);/ ]|$)'
18131
+ device: 'smartphone'
18132
+ model: '$1'
18133
+
18134
+ # Matrix
18135
+ Matrix:
18136
+ regex: '(7116-A5)(?:[);/ ]|$)'
18137
+ device: 'tablet'
18138
+ model: '$1'
18139
+
18140
+ # Verico
18141
+ Verico:
18142
+ regex: '(RP-UDM0[12]A|RP-UDP05A)(?:[);/ ]|$)'
18143
+ device: 'tablet'
18144
+ model: 'Uni Pad $1'
18145
+
18146
+ # TTEC (ttec.com.tr)
18147
+ TTEC:
18148
+ regex: '(Magictab (?:9GX|7GE|718))(?:[);/ ]|$)'
18149
+ device: 'tablet'
18150
+ model: '$1'
18151
+
18152
+ # eSTAR
18153
+ eSTAR:
18154
+ regex: 'eSTAR[_ ](?:Grand|GO\!?|Zoom Quad|Gemini|MINI[_ ]3G|BEAUTY|MOON)'
18155
+ device: 'tablet'
18156
+ models:
18157
+ - regex: 'eSTAR (Grand|GO\!?) (HD Intel|IPS Intel|IPS|HD|Intel) Quad Core 3G'
18158
+ model: '$1 $2 Quad Core 3G'
18159
+ - regex: 'eSTAR (Zoom Quad|Gemini|GO)'
18160
+ model: '$1'
18161
+ - regex: 'eSTAR GRAND HD quad core( [34]G)?'
18162
+ model: 'Grand HD Quad Core$1'
18163
+ - regex: 'eSTAR GRAND'
18164
+ model: 'Grand'
18165
+ - regex: 'eSTAR BEAUTY HD Quad core'
18166
+ model: 'Beauty HD Quad Core'
18167
+ - regex: 'eSTAR MOON HD Quad core'
18168
+ model: 'Moon HD Quad Core 3G'
18169
+ - regex: 'eSTAR BEAUTY 2 HD Quad core'
18170
+ model: 'Beauty 2 HD Quad Core'
18171
+ - regex: 'eSTAR[_ ]MINI[_ ]3G'
18172
+ model: 'Mini 3G'
18173
+
18174
+ # Hometech
18175
+ Hometech:
18176
+ regex: 'Ideal (?:10S|Tab [79])(?:[);/ ]|$)'
18177
+ device: 'tablet'
18178
+ models:
18179
+ - regex: '(Ideal (?:10S|Tab 9))'
18180
+ model: '$1'
18181
+ - regex: 'Ideal Tab 7 Ips( 3G)?'
18182
+ model: 'Ideal Tab 7 IPS$1'
18183
+
18184
+ # ExMobile
18185
+ ExMobile:
18186
+ regex: 'EX(29|45)i(?:[);/ ]|$)'
18187
+ device: 'smartphone'
18188
+ model: 'EX $1i'
18189
+
18190
+ # Hipstreet
18191
+ Hipstreet:
18192
+ regex: '10DTB12(?:[);/ ]|$)'
18193
+ device: 'tablet'
18194
+ model: 'Phoenix'
18195
+
18196
+ # Navitech
18197
+ Navitech:
18198
+ regex: '(NeoTab)[ _-]((?:S1[23]0|S125|H85|H11[05]|KID741|S9700))(?:[);/ ]|$)'
18199
+ device: 'tablet'
18200
+ model: '$1 $2'
18201
+
18202
+ # NorthTech (north-tech.us)
18203
+ NorthTech:
18204
+ regex: '(NT-TP10)(?:[);/ ]|$)'
18205
+ device: 'tablet'
18206
+ model: 'TouchPad 10.0"'
18207
+
18208
+ # UNIWA
18209
+ UNIWA:
18210
+ regex: 'UNIWA[ _](X5)(?:[);/ ]|$)'
18211
+ device: 'smartphone'
18212
+ model: '$1'
18213
+
18214
+ # ANDOWL
18215
+ Andowl:
18216
+ regex: 'ANDOWL-(Q[45])(?:[);/ ]|$)'
18217
+ device: 'tv'
18218
+ model: '$1'
18219
+
18220
+ # Hardkernel (www.hardkernel.com)
18221
+ Hardkernel:
18222
+ regex: 'ODROID[-]?(C2|U2|XU[34])(?:[);/ ]|$)'
18223
+ device: 'peripheral'
18224
+ model: 'ODROID $1'
18225
+
18226
+ # Wiseasy (wiseasy.com)
18227
+ Wiseasy:
18228
+ regex: 'WISENET5(?:[);/ ]|$)'
18229
+ device: 'peripheral'
18230
+ model: 'WISENET5'
18231
+
18232
+ # Shtrikh-M
18233
+ Shtrikh-M:
18234
+ regex: 'SHTRIH-SMARTPOS-F2(?:[);/ ]|$)'
18235
+ device: 'peripheral'
18236
+ model: 'Smartpos F2'
app/vendor/matomo/device-detector/regexes/device/portable_media_player.yml CHANGED
@@ -56,4 +56,4 @@ Samsung:
56
  - regex: 'YP-G50'
57
  model: 'Galaxy Player 50'
58
  - regex: 'YP-GB70D'
59
- model: 'Galaxy Player 70 Plus'
56
  - regex: 'YP-G50'
57
  model: 'Galaxy Player 50'
58
  - regex: 'YP-GB70D'
59
+ model: 'Galaxy Player 70 Plus'
app/vendor/matomo/device-detector/regexes/device/televisions.yml CHANGED
@@ -307,4 +307,4 @@ Videoweb:
307
  - regex: '(tv2n)'
308
  model: '$1'
309
  - regex: '(videowebtv)'
310
- model: 'VideoWeb TV'
307
  - regex: '(tv2n)'
308
  model: '$1'
309
  - regex: '(videowebtv)'
310
+ model: 'VideoWeb TV'
app/vendor/matomo/device-detector/regexes/oss.yml CHANGED
@@ -13,7 +13,6 @@
13
  version: '$1'
14
 
15
 
16
-
17
  ##########
18
  ## Sailfish OS
19
  ###########
@@ -34,8 +33,8 @@
34
  - regex: '(?:Windows Phone (?:OS)?|wds)[ ]?(\d+[\.\d]+)'
35
  name: 'Windows Phone'
36
  version: '$1'
37
-
38
-
39
  - regex: 'XBLWP7|Windows Phone'
40
  name: 'Windows Phone'
41
  version: ''
@@ -43,17 +42,17 @@
43
  - regex: 'Windows CE(?: (\d+[\.\d]+))?'
44
  name: 'Windows CE'
45
  version: '$1'
46
-
47
-
48
  - regex: '(?:IEMobile|Windows ?Mobile)(?: (\d+[\.\d]+))?'
49
  name: 'Windows Mobile'
50
  version: '$1'
51
-
52
-
53
  - regex: 'Windows NT 6.2; ARM;'
54
  name: 'Windows RT'
55
  version: ''
56
-
57
  - regex: 'Windows NT 6.3; ARM;'
58
  name: 'Windows RT'
59
  version: '8.1'
@@ -109,7 +108,7 @@
109
  - regex: '(?:(?:Orca-)?Android|Adr)[ /](?:[a-z]+ )?(\d+[\.\d]*)'
110
  name: 'Android'
111
  version: '$1'
112
-
113
  - regex: 'Android|Silk-Accelerated=[a-z]{4,5}'
114
  name: 'Android'
115
  version: ''
@@ -131,7 +130,7 @@
131
  name: 'Android'
132
  version: '$1'
133
 
134
-
135
  ##########
136
  # AmigaOS
137
  ##########
@@ -160,6 +159,13 @@
160
  name: 'MTK / Nucleus'
161
  version: '$1'
162
 
 
 
 
 
 
 
 
163
  ##########
164
  # Linux
165
  ##########
@@ -191,6 +197,10 @@
191
  name: '$1'
192
  version: '$2'
193
 
 
 
 
 
194
  # generic linux match -> end of file
195
 
196
  ##########
@@ -213,7 +223,7 @@
213
  name: 'MorphOS'
214
  version: '$1'
215
 
216
-
217
  ##########
218
  # Windows
219
  ##########
@@ -289,7 +299,7 @@
289
  name: 'Haiku OS'
290
  version: ''
291
 
292
-
293
  ##########
294
  # iOS
295
  ##########
@@ -497,7 +507,7 @@
497
  - regex: 'Mac[ +]OS[ +]X(?:[ /](?:Version )?(\d+(?:[_\.]\d+)+))?'
498
  name: 'Mac'
499
  version: '$1'
500
-
501
  - regex: 'Mac (\d+(?:[_\.]\d+)+)'
502
  name: 'Mac'
503
  version: '$1'
@@ -505,40 +515,38 @@
505
  - regex: 'Darwin|Macintosh|Mac_PowerPC|PPC|Mac PowerPC|iMac|MacBook'
506
  name: 'Mac'
507
  version: ''
508
-
509
-
510
-
511
  ##########
512
  # ChromeOS
513
  ##########
514
  - regex: 'CrOS [a-z0-9_]+ .* Chrome/(\d+[\.\d]+)'
515
  name: 'Chrome OS'
516
  version: '$1'
517
-
518
-
519
-
520
  ##########
521
  # BlackBerry
522
  ##########
523
  - regex: '(?:BB10;.+Version|Black[Bb]erry[0-9a-z]+|Black[Bb]erry.+Version)/(\d+[\.\d]+)'
524
  name: 'BlackBerry OS'
525
  version: '$1'
526
-
527
-
528
  - regex: 'RIM Tablet OS (\d+[\.\d]+)'
529
  name: 'BlackBerry Tablet OS'
530
  version: '$1'
531
-
532
-
533
  - regex: 'RIM Tablet OS|QNX|Play[Bb]ook'
534
  name: 'BlackBerry Tablet OS'
535
  version: ''
536
-
537
-
538
  - regex: 'BlackBerry'
539
  name: 'BlackBerry OS'
540
  version: ''
541
-
542
  - regex: 'bPod'
543
  name: 'BlackBerry OS'
544
  version: ''
@@ -552,8 +560,6 @@
552
  version: ''
553
 
554
 
555
-
556
-
557
  ##########
558
  # Symbian
559
  ##########
@@ -585,24 +591,23 @@
585
  - regex: 'SymbianOS/(\d+[\.\d]+)'
586
  name: 'Symbian OS'
587
  version: '$1'
588
-
589
-
590
  - regex: 'MeeGo|WeTab'
591
  name: 'MeeGo'
592
  version: ''
593
-
594
-
595
  - regex: 'Symbian(?: OS)?|SymbOS'
596
  name: 'Symbian OS'
597
  version: ''
598
-
599
-
600
  - regex: 'Nokia'
601
  name: 'Symbian'
602
  version: ''
603
 
604
 
605
-
606
  ##########
607
  # Firefox OS
608
  ##########
@@ -633,8 +638,7 @@
633
  - regex: 'bada(?:[ /](\d+[\.\d]+))'
634
  name: 'Bada'
635
  version: '$1'
636
-
637
-
638
  - regex: 'bada'
639
  name: 'Bada'
640
  version: ''
@@ -647,29 +651,28 @@
647
  name: 'Brew'
648
  version: '$1'
649
 
650
-
651
  - regex: 'Brew MP|BREW|BMP'
652
  name: 'Brew'
653
  version: ''
654
 
655
-
656
  ##########
657
  # Web TV
658
  ##########
659
  - regex: 'GoogleTV(?:[ /](\d+[\.\d]+))?'
660
  name: 'Google TV'
661
  version: '$1'
662
-
663
-
664
  - regex: 'AppleTV(?:/?(\d+[\.\d]+))?'
665
  name: 'Apple TV'
666
  version: '$1'
667
-
668
-
669
  - regex: 'WebTV/(\d+[\.\d]+)'
670
  name: 'WebTV'
671
  version: '$1'
672
-
673
 
674
  ##########
675
  # Remix OS
@@ -693,54 +696,53 @@
693
  - regex: '(?:SunOS|Solaris)(?:[/ ](\d+[\.\d]+))?'
694
  name: 'Solaris'
695
  version: '$1'
696
-
697
-
698
  - regex: 'AIX(?:[/ ]?(\d+[\.\d]+))?'
699
  name: 'AIX'
700
  version: '$1'
701
-
702
-
703
  - regex: 'HP-UX(?:[/ ]?(\d+[\.\d]+))?'
704
  name: 'HP-UX'
705
  version: '$1'
706
-
707
-
708
  - regex: 'FreeBSD(?:[/ ]?(\d+[\.\d]+))?'
709
  name: 'FreeBSD'
710
  version: '$1'
711
-
712
-
713
  - regex: 'NetBSD(?:[/ ]?(\d+[\.\d]+))?'
714
  name: 'NetBSD'
715
  version: '$1'
716
-
717
-
718
  - regex: 'OpenBSD(?:[/ ]?(\d+[\.\d]+))?'
719
  name: 'OpenBSD'
720
  version: '$1'
721
-
722
-
723
  - regex: 'DragonFly(?:[/ ]?(\d+[\.\d]+))?'
724
  name: 'DragonFly'
725
  version: '$1'
726
-
727
-
728
  - regex: 'Syllable(?:[/ ]?(\d+[\.\d]+))?'
729
  name: 'Syllable'
730
  version: '$1'
731
-
732
-
733
  - regex: 'IRIX(?:;64)?(?:[/ ]?(\d+[\.\d]+))'
734
  name: 'IRIX'
735
  version: '$1'
736
-
737
-
738
  - regex: 'OSF1(?:[/ ]?v?(\d+[\.\d]+))?'
739
  name: 'OSF1'
740
  version: '$1'
741
-
742
-
743
-
744
  ##########
745
  # Gaming Console
746
  ##########
@@ -751,35 +753,32 @@
751
  - regex: 'PlayStation ?([3|4])'
752
  name: 'PlayStation'
753
  version: '$1'
754
-
755
-
756
  - regex: 'Xbox|KIN\.(?:One|Two)'
757
  name: 'Xbox'
758
  version: '360'
759
-
760
-
761
-
762
  ##########
763
  # Mobile Gaming Console
764
  ##########
765
  - regex: 'Nitro|Nintendo ([3]?DS[i]?)'
766
  name: 'Nintendo Mobile'
767
  version: '$1'
768
-
769
-
770
  - regex: 'PlayStation ((?:Portable|Vita))'
771
  name: 'PlayStation Portable'
772
  version: '$1'
773
-
774
-
775
-
776
  ##########
777
  # IBM
778
  ##########
779
  - regex: 'OS/2'
780
  name: 'OS/2'
781
  version: ''
782
-
783
 
784
 
785
  ###########
@@ -788,5 +787,3 @@
788
  - regex: 'Linux(?:OS)?[^a-z]'
789
  name: 'GNU/Linux'
790
  version: ''
791
-
792
-
13
  version: '$1'
14
 
15
 
 
16
  ##########
17
  ## Sailfish OS
18
  ###########
33
  - regex: '(?:Windows Phone (?:OS)?|wds)[ ]?(\d+[\.\d]+)'
34
  name: 'Windows Phone'
35
  version: '$1'
36
+
37
+
38
  - regex: 'XBLWP7|Windows Phone'
39
  name: 'Windows Phone'
40
  version: ''
42
  - regex: 'Windows CE(?: (\d+[\.\d]+))?'
43
  name: 'Windows CE'
44
  version: '$1'
45
+
46
+
47
  - regex: '(?:IEMobile|Windows ?Mobile)(?: (\d+[\.\d]+))?'
48
  name: 'Windows Mobile'
49
  version: '$1'
50
+
51
+
52
  - regex: 'Windows NT 6.2; ARM;'
53
  name: 'Windows RT'
54
  version: ''
55
+
56
  - regex: 'Windows NT 6.3; ARM;'
57
  name: 'Windows RT'
58
  version: '8.1'
108
  - regex: '(?:(?:Orca-)?Android|Adr)[ /](?:[a-z]+ )?(\d+[\.\d]*)'
109
  name: 'Android'
110
  version: '$1'
111
+
112
  - regex: 'Android|Silk-Accelerated=[a-z]{4,5}'
113
  name: 'Android'
114
  version: ''
130
  name: 'Android'
131
  version: '$1'
132
 
133
+
134
  ##########
135
  # AmigaOS
136
  ##########
159
  name: 'MTK / Nucleus'
160
  version: '$1'
161
 
162
+ ##########
163
+ # MRE / MAUI Runtime Environment
164
+ ##########
165
+ - regex: 'MRE/(\d+)\.(\d+).*;MAUI'
166
+ name: 'MRE'
167
+ version: '$1.$2'
168
+
169
  ##########
170
  # Linux
171
  ##########
197
  name: '$1'
198
  version: '$2'
199
 
200
+ - regex: 'OS ROSA; Linux'
201
+ name: 'Rosa'
202
+ version: ''
203
+
204
  # generic linux match -> end of file
205
 
206
  ##########
223
  name: 'MorphOS'
224
  version: '$1'
225
 
226
+
227
  ##########
228
  # Windows
229
  ##########
299
  name: 'Haiku OS'
300
  version: ''
301
 
302
+
303
  ##########
304
  # iOS
305
  ##########
507
  - regex: 'Mac[ +]OS[ +]X(?:[ /](?:Version )?(\d+(?:[_\.]\d+)+))?'
508
  name: 'Mac'
509
  version: '$1'
510
+
511
  - regex: 'Mac (\d+(?:[_\.]\d+)+)'
512
  name: 'Mac'
513
  version: '$1'
515
  - regex: 'Darwin|Macintosh|Mac_PowerPC|PPC|Mac PowerPC|iMac|MacBook'
516
  name: 'Mac'
517
  version: ''
518
+
519
+
 
520
  ##########
521
  # ChromeOS
522
  ##########
523
  - regex: 'CrOS [a-z0-9_]+ .* Chrome/(\d+[\.\d]+)'
524
  name: 'Chrome OS'
525
  version: '$1'
526
+
527
+
 
528
  ##########
529
  # BlackBerry
530
  ##########
531
  - regex: '(?:BB10;.+Version|Black[Bb]erry[0-9a-z]+|Black[Bb]erry.+Version)/(\d+[\.\d]+)'
532
  name: 'BlackBerry OS'
533
  version: '$1'
534
+
535
+
536
  - regex: 'RIM Tablet OS (\d+[\.\d]+)'
537
  name: 'BlackBerry Tablet OS'
538
  version: '$1'
539
+
540
+
541
  - regex: 'RIM Tablet OS|QNX|Play[Bb]ook'
542
  name: 'BlackBerry Tablet OS'
543
  version: ''
544
+
545
+
546
  - regex: 'BlackBerry'
547
  name: 'BlackBerry OS'
548
  version: ''
549
+
550
  - regex: 'bPod'
551
  name: 'BlackBerry OS'
552
  version: ''
560
  version: ''
561
 
562
 
 
 
563
  ##########
564
  # Symbian
565
  ##########
591
  - regex: 'SymbianOS/(\d+[\.\d]+)'
592
  name: 'Symbian OS'
593
  version: '$1'
594
+
595
+
596
  - regex: 'MeeGo|WeTab'
597
  name: 'MeeGo'
598
  version: ''
599
+
600
+
601
  - regex: 'Symbian(?: OS)?|SymbOS'
602
  name: 'Symbian OS'
603
  version: ''
604
+
605
+
606
  - regex: 'Nokia'
607
  name: 'Symbian'
608
  version: ''
609
 
610
 
 
611
  ##########
612
  # Firefox OS
613
  ##########
638
  - regex: 'bada(?:[ /](\d+[\.\d]+))'
639
  name: 'Bada'
640
  version: '$1'
641
+
 
642
  - regex: 'bada'
643
  name: 'Bada'
644
  version: ''
651
  name: 'Brew'
652
  version: '$1'
653
 
 
654
  - regex: 'Brew MP|BREW|BMP'
655
  name: 'Brew'
656
  version: ''
657
 
658
+
659
  ##########
660
  # Web TV
661
  ##########
662
  - regex: 'GoogleTV(?:[ /](\d+[\.\d]+))?'
663
  name: 'Google TV'
664
  version: '$1'
665
+
666
+
667
  - regex: 'AppleTV(?:/?(\d+[\.\d]+))?'
668
  name: 'Apple TV'
669
  version: '$1'
670
+
671
+
672
  - regex: 'WebTV/(\d+[\.\d]+)'
673
  name: 'WebTV'
674
  version: '$1'
675
+
676
 
677
  ##########
678
  # Remix OS
696
  - regex: '(?:SunOS|Solaris)(?:[/ ](\d+[\.\d]+))?'
697
  name: 'Solaris'
698
  version: '$1'
699
+
700
+
701
  - regex: 'AIX(?:[/ ]?(\d+[\.\d]+))?'
702
  name: 'AIX'
703
  version: '$1'
704
+
705
+
706
  - regex: 'HP-UX(?:[/ ]?(\d+[\.\d]+))?'
707
  name: 'HP-UX'
708
  version: '$1'
709
+
710
+
711
  - regex: 'FreeBSD(?:[/ ]?(\d+[\.\d]+))?'
712
  name: 'FreeBSD'
713
  version: '$1'
714
+
715
+
716
  - regex: 'NetBSD(?:[/ ]?(\d+[\.\d]+))?'
717
  name: 'NetBSD'
718
  version: '$1'
719
+
720
+
721
  - regex: 'OpenBSD(?:[/ ]?(\d+[\.\d]+))?'
722
  name: 'OpenBSD'
723
  version: '$1'
724
+
725
+
726
  - regex: 'DragonFly(?:[/ ]?(\d+[\.\d]+))?'
727
  name: 'DragonFly'
728
  version: '$1'
729
+
730
+
731
  - regex: 'Syllable(?:[/ ]?(\d+[\.\d]+))?'
732
  name: 'Syllable'
733
  version: '$1'
734
+
735
+
736
  - regex: 'IRIX(?:;64)?(?:[/ ]?(\d+[\.\d]+))'
737
  name: 'IRIX'
738
  version: '$1'
739
+
740
+
741
  - regex: 'OSF1(?:[/ ]?v?(\d+[\.\d]+))?'
742
  name: 'OSF1'
743
  version: '$1'
744
+
745
+
 
746
  ##########
747
  # Gaming Console
748
  ##########
753
  - regex: 'PlayStation ?([3|4])'
754
  name: 'PlayStation'
755
  version: '$1'
756
+
757
+
758
  - regex: 'Xbox|KIN\.(?:One|Two)'
759
  name: 'Xbox'
760
  version: '360'
761
+
762
+
 
763
  ##########
764
  # Mobile Gaming Console
765
  ##########
766
  - regex: 'Nitro|Nintendo ([3]?DS[i]?)'
767
  name: 'Nintendo Mobile'
768
  version: '$1'
769
+
770
+
771
  - regex: 'PlayStation ((?:Portable|Vita))'
772
  name: 'PlayStation Portable'
773
  version: '$1'
774
+
775
+
 
776
  ##########
777
  # IBM
778
  ##########
779
  - regex: 'OS/2'
780
  name: 'OS/2'
781
  version: ''
 
782
 
783
 
784
  ###########
787
  - regex: 'Linux(?:OS)?[^a-z]'
788
  name: 'GNU/Linux'
789
  version: ''
 
 
assets/js/asset_manager_core_js.js CHANGED
@@ -1,4 +1,4 @@
1
- /* Matomo Javascript - cb=f05b184e20179434052ab810627efe71*/
2
 
3
  /*!
4
  * Matomo - free/libre analytics platform
@@ -838,7 +838,7 @@ if(hash){if(/^popover=/.test(hash)){var hashParts=['',hash.replace(/^popover=/,'
838
  var hashUrl=hashParts[0];var popoverParam='';if(hashParts.length>1){popoverParam=hashParts[1];popoverParam=decodeURIComponent(popoverParam);popoverParam=popoverParam.replace(/\$/g,'%');popoverParam=decodeURIComponent(popoverParam);}
839
  var pageUrlUpdated=(popoverParam==''||(broadcast.currentHashUrl!==false&&broadcast.currentHashUrl!=hashUrl));var popoverParamUpdated=(popoverParam!=''&&hashUrl==broadcast.currentHashUrl);if(broadcast.currentHashUrl===false){pageUrlUpdated=true;popoverParamUpdated=(popoverParam!='');}
840
  if(!broadcast.isWidgetizedDashboard()&&(pageUrlUpdated||broadcast.forceReload)){Piwik_Popover.close();if(hashUrl!=broadcast.currentHashUrl||broadcast.forceReload){broadcast.loadAjaxContent(hashUrl);$('.top_controls .dashboard-manager').hide();$('#dashboardWidgetsArea').dashboard('destroy');require('piwik/UI').UIControl.cleanupUnusedControls();}}
841
- broadcast.forceReload=false;broadcast.currentHashUrl=hashUrl;broadcast.currentPopoverParameter=popoverParam;Piwik_Popover.close();if(popoverParamUpdated){var popoverParamParts=popoverParam.split(':');var handlerName=popoverParamParts[0];popoverParamParts.shift();var param=popoverParamParts.join(':');if(typeof broadcast.popoverHandlers[handlerName]!='undefined'&&!broadcast.isLoginPage()){broadcast.popoverHandlers[handlerName](param);}}}else{Piwik_Popover.close();if(!broadcast.isWidgetizedDashboard()){$('.pageWrap #content:not(.admin)').empty();}}},isWidgetizedDashboard:function(){return broadcast.getValueFromUrl('module')=='Widgetize'&&broadcast.getValueFromUrl('moduleToWidgetize')=='Dashboard';},isWidgetizeRequestWithoutSession:function(){return broadcast.getValueFromUrl('module')=='Widgetize'&&broadcast.getValueFromUrl('module')=='iframe'&&broadcast.getValueFromUrl('force_api_session')!='1';},isLoginPage:function(){return!!$('body#loginPage').length;},propagateAjax:function(ajaxUrl,disableHistory){broadcast.init();globalAjaxQueue.abort();var currentHashStr=broadcast.getHash();ajaxUrl=ajaxUrl.replace(/^\?|&#/,'');var params_vals=ajaxUrl.split("&");for(var i=0;i<params_vals.length;i++){currentHashStr=broadcast.updateParamValue(params_vals[i],currentHashStr);}
842
  var action=broadcast.getParamValue('action',currentHashStr);if(action!='goalReport'&&action!='ecommerceReport'&&action!='products'&&action!='sales'&&(''+ajaxUrl).indexOf('&idGoal=')===-1){currentHashStr=broadcast.updateParamValue('idGoal=',currentHashStr);}
843
  var module=broadcast.getParamValue('module',currentHashStr);if(module!='Dashboard'){currentHashStr=broadcast.updateParamValue('idDashboard=',currentHashStr);}
844
  if(module!='CustomDimensions'){currentHashStr=broadcast.updateParamValue('idDimension=',currentHashStr);}
1
+ /* Matomo Javascript - cb=f6964928f2b95428fdad8da54f736226*/
2
 
3
  /*!
4
  * Matomo - free/libre analytics platform
838
  var hashUrl=hashParts[0];var popoverParam='';if(hashParts.length>1){popoverParam=hashParts[1];popoverParam=decodeURIComponent(popoverParam);popoverParam=popoverParam.replace(/\$/g,'%');popoverParam=decodeURIComponent(popoverParam);}
839
  var pageUrlUpdated=(popoverParam==''||(broadcast.currentHashUrl!==false&&broadcast.currentHashUrl!=hashUrl));var popoverParamUpdated=(popoverParam!=''&&hashUrl==broadcast.currentHashUrl);if(broadcast.currentHashUrl===false){pageUrlUpdated=true;popoverParamUpdated=(popoverParam!='');}
840
  if(!broadcast.isWidgetizedDashboard()&&(pageUrlUpdated||broadcast.forceReload)){Piwik_Popover.close();if(hashUrl!=broadcast.currentHashUrl||broadcast.forceReload){broadcast.loadAjaxContent(hashUrl);$('.top_controls .dashboard-manager').hide();$('#dashboardWidgetsArea').dashboard('destroy');require('piwik/UI').UIControl.cleanupUnusedControls();}}
841
+ broadcast.forceReload=false;broadcast.currentHashUrl=hashUrl;broadcast.currentPopoverParameter=popoverParam;Piwik_Popover.close();if(popoverParamUpdated){var popoverParamParts=popoverParam.split(':');var handlerName=popoverParamParts[0];popoverParamParts.shift();var param=popoverParamParts.join(':');if(typeof broadcast.popoverHandlers[handlerName]!='undefined'&&!broadcast.isLoginPage()){broadcast.popoverHandlers[handlerName](param);}}}else{Piwik_Popover.close();if(!broadcast.isWidgetizedDashboard()){$('.pageWrap #content:not(.admin)').empty();}}},isWidgetizedDashboard:function(){return broadcast.getValueFromUrl('module')=='Widgetize'&&broadcast.getValueFromUrl('moduleToWidgetize')=='Dashboard';},isWidgetizeRequestWithoutSession:function(){return broadcast.getValueFromUrl('token_auth')!=''&&broadcast.getValueFromUrl('force_api_session')!='1';},isLoginPage:function(){return!!$('body#loginPage').length;},propagateAjax:function(ajaxUrl,disableHistory){broadcast.init();globalAjaxQueue.abort();var currentHashStr=broadcast.getHash();ajaxUrl=ajaxUrl.replace(/^\?|&#/,'');var params_vals=ajaxUrl.split("&");for(var i=0;i<params_vals.length;i++){currentHashStr=broadcast.updateParamValue(params_vals[i],currentHashStr);}
842
  var action=broadcast.getParamValue('action',currentHashStr);if(action!='goalReport'&&action!='ecommerceReport'&&action!='products'&&action!='sales'&&(''+ajaxUrl).indexOf('&idGoal=')===-1){currentHashStr=broadcast.updateParamValue('idGoal=',currentHashStr);}
843
  var module=broadcast.getParamValue('module',currentHashStr);if(module!='Dashboard'){currentHashStr=broadcast.updateParamValue('idDashboard=',currentHashStr);}
844
  if(module!='CustomDimensions'){currentHashStr=broadcast.updateParamValue('idDimension=',currentHashStr);}
classes/WpMatomo.php CHANGED
@@ -50,6 +50,7 @@ class WpMatomo {
50
 
51
  if ( self::is_safe_mode() ) {
52
  if ( is_admin() ) {
 
53
  new \WpMatomo\Admin\SafeModeMenu( self::$settings );
54
  }
55
 
@@ -157,7 +158,14 @@ class WpMatomo {
157
  }
158
 
159
  public static function is_safe_mode() {
160
- return defined( 'MATOMO_SAFE_MODE' ) && MATOMO_SAFE_MODE;
 
 
 
 
 
 
 
161
  }
162
 
163
  public function add_settings_link( $links ) {
50
 
51
  if ( self::is_safe_mode() ) {
52
  if ( is_admin() ) {
53
+ new Admin( self::$settings, false );
54
  new \WpMatomo\Admin\SafeModeMenu( self::$settings );
55
  }
56
 
158
  }
159
 
160
  public static function is_safe_mode() {
161
+ if ( defined( 'MATOMO_SAFE_MODE' ) && MATOMO_SAFE_MODE) {
162
+ return true;
163
+ }
164
+
165
+ return function_exists('is_plugin_active') &&
166
+ (is_plugin_active('cookiebot/cookiebot.php')
167
+ || is_plugin_active('wp-rss-aggregator/wp-rss-aggregator.php')
168
+ );
169
  }
170
 
171
  public function add_settings_link( $links ) {
classes/WpMatomo/Admin/Admin.php CHANGED
@@ -19,8 +19,10 @@ class Admin {
19
  /**
20
  * @param Settings $settings
21
  */
22
- public function __construct( $settings ) {
23
- new Menu( $settings );
 
 
24
 
25
  add_action( 'admin_enqueue_scripts', array( $this, 'load_scripts' ) );
26
  }
19
  /**
20
  * @param Settings $settings
21
  */
22
+ public function __construct( $settings, $init_menu = true ) {
23
+ if ($init_menu) {
24
+ new Menu( $settings );
25
+ }
26
 
27
  add_action( 'admin_enqueue_scripts', array( $this, 'load_scripts' ) );
28
  }
classes/WpMatomo/Admin/SystemReport.php CHANGED
@@ -55,6 +55,8 @@ class SystemReport {
55
  'data-tables-generator-by-supsystic', // uses an old version of twig causing some styles to go funny in the reporting and admin
56
  'tweet-old-post-pro', // uses a newer version of monolog
57
  'secupress', // see #369 depending on setting might have issues
 
 
58
  );
59
 
60
  private $valid_tabs = array( 'troubleshooting' );
@@ -381,18 +383,22 @@ class SystemReport {
381
  );
382
 
383
  $wpmatomo_updater = new \WpMatomo\Updater($this->settings);
384
- $outstanding_updates = $wpmatomo_updater->get_plugins_requiring_update();
385
- $upgrade_in_progress = $wpmatomo_updater->is_upgrade_in_progress();
386
- $rows[] = array(
387
- 'name' => 'Upgrades outstanding',
388
- 'value' => !empty($outstanding_updates),
389
- 'comment' => !empty($outstanding_updates) ? json_encode($outstanding_updates) : '',
390
- );
391
- $rows[] = array(
392
- 'name' => 'Upgrade in progress',
393
- 'value' => $upgrade_in_progress,
394
- 'comment' => '',
395
- );
 
 
 
 
396
  if (!$wpmatomo_updater->load_plugin_functions()) {
397
  // this should actually never happen...
398
  $rows[] = array(
@@ -1354,11 +1360,19 @@ class SystemReport {
1354
  $additional_comment .= '<br><br>If reports aren\'t being generated then you may need to disable the feature "Firewall -> Block Bad Request Methods" in SecuPress (if it is enabled) or add the following line to your "wp-config.php": <br><code>define( \'MATOMO_SUPPORT_ASYNC_ARCHIVING\', false );</code>.';
1355
  }
1356
 
 
 
 
 
 
 
 
1357
  $rows[] = array(
1358
  'name' => __( 'Not compatible plugins', 'matomo' ),
1359
  'value' => count( $used_not_compatible ),
1360
  'comment' => implode( ', ', $used_not_compatible ) . '<br><br> Matomo may work fine when using these plugins but there may be some issues. For more information see<br>https://matomo.org/faq/wordpress/which-plugins-is-matomo-for-wordpress-known-to-be-not-compatible-with/ ' . $additional_comment,
1361
- 'is_warning' => true,
 
1362
  );
1363
  }
1364
  }
55
  'data-tables-generator-by-supsystic', // uses an old version of twig causing some styles to go funny in the reporting and admin
56
  'tweet-old-post-pro', // uses a newer version of monolog
57
  'secupress', // see #369 depending on setting might have issues
58
+ 'cookiebot', // see https://wordpress.org/support/topic/critical-error-after-upgrade/ conflict re php-di version
59
+ 'wp-rss-aggregator', // see https://wordpress.org/support/topic/critical-error-after-upgrade/ conflict re php-di version
60
  );
61
 
62
  private $valid_tabs = array( 'troubleshooting' );
383
  );
384
 
385
  $wpmatomo_updater = new \WpMatomo\Updater($this->settings);
386
+ if (!\WpMatomo::is_safe_mode()) {
387
+
388
+ $outstanding_updates = $wpmatomo_updater->get_plugins_requiring_update();
389
+ $upgrade_in_progress = $wpmatomo_updater->is_upgrade_in_progress();
390
+ $rows[] = array(
391
+ 'name' => 'Upgrades outstanding',
392
+ 'value' => !empty($outstanding_updates),
393
+ 'comment' => !empty($outstanding_updates) ? json_encode($outstanding_updates) : '',
394
+ );
395
+ $rows[] = array(
396
+ 'name' => 'Upgrade in progress',
397
+ 'value' => $upgrade_in_progress,
398
+ 'comment' => '',
399
+ );
400
+ }
401
+
402
  if (!$wpmatomo_updater->load_plugin_functions()) {
403
  // this should actually never happen...
404
  $rows[] = array(
1360
  $additional_comment .= '<br><br>If reports aren\'t being generated then you may need to disable the feature "Firewall -> Block Bad Request Methods" in SecuPress (if it is enabled) or add the following line to your "wp-config.php": <br><code>define( \'MATOMO_SUPPORT_ASYNC_ARCHIVING\', false );</code>.';
1361
  }
1362
 
1363
+ $is_warning = true;
1364
+ $is_error = false;
1365
+ if (in_array('cookiebot', $used_not_compatible)) {
1366
+ $is_warning = false;
1367
+ $is_error = true;
1368
+ }
1369
+
1370
  $rows[] = array(
1371
  'name' => __( 'Not compatible plugins', 'matomo' ),
1372
  'value' => count( $used_not_compatible ),
1373
  'comment' => implode( ', ', $used_not_compatible ) . '<br><br> Matomo may work fine when using these plugins but there may be some issues. For more information see<br>https://matomo.org/faq/wordpress/which-plugins-is-matomo-for-wordpress-known-to-be-not-compatible-with/ ' . $additional_comment,
1374
+ 'is_warning' => $is_warning,
1375
+ 'is_error' => $is_error,
1376
  );
1377
  }
1378
  }
classes/WpMatomo/Email.php CHANGED
@@ -97,7 +97,8 @@ class Email {
97
  $header = 'X-Matomo: ' . $random_id;
98
  $executed_action = false;
99
 
100
- add_action('phpmailer_init', function (\PHPMailer $phpmailer) use ($attachments, $subject, $random_id, &$executed_action) {
 
101
  if ($executed_action) {
102
  return; // already done, do not execute another time
103
  }
97
  $header = 'X-Matomo: ' . $random_id;
98
  $executed_action = false;
99
 
100
+ add_action('phpmailer_init', function ($phpmailer) use ($attachments, $subject, $random_id, &$executed_action) {
101
+ /** @var PHPMailer $phpmailer */
102
  if ($executed_action) {
103
  return; // already done, do not execute another time
104
  }
matomo.php CHANGED
@@ -4,10 +4,10 @@
4
  * Description: The #1 Google Analytics alternative that gives you full control over your data and protects the privacy for your users. Free, secure and open.
5
  * Author: Matomo
6
  * Author URI: https://matomo.org
7
- * Version: 4.0.2
8
  * Domain Path: /languages
9
  * WC requires at least: 2.4.0
10
- * WC tested up to: 4.6.0
11
  *
12
  * Matomo - free/libre analytics platform
13
  *
4
  * Description: The #1 Google Analytics alternative that gives you full control over your data and protects the privacy for your users. Free, secure and open.
5
  * Author: Matomo
6
  * Author URI: https://matomo.org
7
+ * Version: 4.0.3
8
  * Domain Path: /languages
9
  * WC requires at least: 2.4.0
10
+ * WC tested up to: 4.8.0
11
  *
12
  * Matomo - free/libre analytics platform
13
  *
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_i
4
  Tags: matomo,piwik,analytics,statistics,stats,tracking,ecommerce
5
  Requires at least: 4.8
6
  Tested up to: 5.6
7
- Stable tag: 4.0.2
8
  Requires PHP: 7.2.5
9
  License: GPLv3 or later
10
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
4
  Tags: matomo,piwik,analytics,statistics,stats,tracking,ecommerce
5
  Requires at least: 4.8
6
  Tested up to: 5.6
7
+ Stable tag: 4.0.3
8
  Requires PHP: 7.2.5
9
  License: GPLv3 or later
10
  License URI: https://www.gnu.org/licenses/gpl-3.0.html