diff --git a/.eslintrc.json b/.eslintrc.json index fdd2a9484a6..a906a5150f3 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -237,9 +237,6 @@ "for-direction": [ "off" ], - "no-console": [ - "off" - ], "no-control-regex": [ "off" ], @@ -343,4 +340,4 @@ } } ] -} \ No newline at end of file +} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 34cd366029d..e1f0cd198a8 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,6 +10,11 @@ on: # Allows you to run this workflow manually from the Actions tab workflow_dispatch: + inputs: + custom_tag: + description: 'Custom Docker tag (optional)' + required: false + default: '' # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: @@ -64,7 +69,7 @@ jobs: services: mongodb: - image: mongo:6.0 + image: mongo:8.0 options: >- --health-cmd mongosh --health-interval 10s @@ -74,7 +79,7 @@ jobs: - 27017:27017 container: - image: countly/countly-core:pipelines-${{ github.base_ref || github.ref_name }} + image: countly/countly-core:pipelines-${{ inputs.custom_tag || github.base_ref || github.ref_name }} env: COUNTLY_CONFIG__MONGODB_HOST: mongodb COUNTLY_CONFIG_API_PREVENT_JOBS: true @@ -121,7 +126,7 @@ jobs: services: mongodb: - image: mongo:6.0 + image: mongo:8.0 options: >- --health-cmd mongosh --health-interval 10s @@ -131,7 +136,7 @@ jobs: - 27017:27017 container: - image: countly/countly-core:pipelines-${{ github.base_ref || github.ref_name }} + image: countly/countly-core:pipelines-${{ inputs.custom_tag || github.base_ref || github.ref_name }} env: COUNTLY_CONFIG__MONGODB_HOST: mongodb COUNTLY_CONFIG_API_PREVENT_JOBS: true @@ -155,6 +160,11 @@ jobs: shell: bash run: "sed -i 's/port: 3001,/port: 3001, workers: 1,/' /opt/countly/api/config.js" + - name: NPM install + shell: bash + working-directory: /opt/countly + run: npm install + - name: Run tests shell: bash working-directory: /opt/countly @@ -168,7 +178,7 @@ jobs: services: mongodb: - image: mongo:6.0 + image: mongo:8.0 options: >- --health-cmd mongosh --health-interval 10s @@ -178,7 +188,7 @@ jobs: - 27017:27017 container: - image: countly/countly-core:pipelines-${{ github.base_ref || github.ref_name }} + image: countly/countly-core:pipelines-${{ inputs.custom_tag || github.base_ref || github.ref_name }} env: COUNTLY_CONFIG__MONGODB_HOST: mongodb COUNTLY_CONFIG_API_PREVENT_JOBS: true @@ -202,6 +212,11 @@ jobs: shell: bash run: "sed -i 's/port: 3001,/port: 3001, workers: 1,/' /opt/countly/api/config.js" + - name: NPM install + shell: bash + working-directory: /opt/countly + run: npm install + - name: Install plugins shell: bash run: | @@ -221,7 +236,7 @@ jobs: services: mongodb: - image: mongo:6.0 + image: mongo:8.0 options: >- --health-cmd mongosh --health-interval 10s @@ -231,7 +246,7 @@ jobs: - 27017:27017 container: - image: countly/countly-core:pipelines-${{ github.base_ref || github.ref_name }} + image: countly/countly-core:pipelines-${{ inputs.custom_tag || github.base_ref || github.ref_name }} env: COUNTLY_CONFIG__MONGODB_HOST: mongodb COUNTLY_CONFIG_API_PREVENT_JOBS: true @@ -255,6 +270,11 @@ jobs: shell: bash run: "sed -i 's/mongosh --quiet/mongosh --host mongodb --quiet/' /opt/countly/bin/backup/import_events.sh && sed -i 's/mongoimport --db/mongoimport --host mongodb --db/' /opt/countly/bin/backup/import_events.sh" + - name: NPM install + shell: bash + working-directory: /opt/countly + run: npm install + - name: Prepare environment shell: bash working-directory: /opt/countly @@ -281,7 +301,8 @@ jobs: /sbin/my_init & cd ui-tests npm install - npm run cy:run:dashboard + xvfb-run --auto-servernum --server-args="-screen 0 1280x1024x24" \ + npm run cy:run:dashboard --headless --no-sandbox --disable-gpu --disable-dev-shm-usage - name: Upload UI tests artifacts if: ${{ failure() }} @@ -298,7 +319,7 @@ jobs: services: mongodb: - image: mongo:6.0 + image: mongo:8.0 options: >- --health-cmd mongosh --health-interval 10s @@ -308,7 +329,7 @@ jobs: - 27017:27017 container: - image: countly/countly-core:pipelines-${{ github.base_ref || github.ref_name }} + image: countly/countly-core:pipelines-${{ inputs.custom_tag || github.base_ref || github.ref_name }} env: COUNTLY_CONFIG__MONGODB_HOST: mongodb COUNTLY_CONFIG_API_PREVENT_JOBS: true @@ -332,6 +353,11 @@ jobs: shell: bash run: "sed -i 's/mongosh --quiet/mongosh --host mongodb --quiet/' /opt/countly/bin/backup/import_events.sh && sed -i 's/mongoimport --db/mongoimport --host mongodb --db/' /opt/countly/bin/backup/import_events.sh" + - name: NPM install + shell: bash + working-directory: /opt/countly + run: npm install + - name: Prepare environment shell: bash working-directory: /opt/countly @@ -354,7 +380,8 @@ jobs: /sbin/my_init & cd ui-tests npm install - npm run cy:run:onboarding + xvfb-run --auto-servernum --server-args="-screen 0 1280x1024x24" \ + npm run cy:run:onboarding --headless --no-sandbox --disable-gpu --disable-dev-shm-usage - name: Upload UI tests artifacts if: ${{ failure() }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 860cd65e4e5..6c881958168 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,129 @@ +## Version 24.10 +Fixes: +- [core] Interpreting carrier value of "--" as an unknown value +- [crash] Fixed issues with visualisation of Flutter stack traces +- [dashoards] If a user is given access to a dashboard, they will now be able to see all widgets even if they don't have access to the underlying data +- [density] UI fixed +- [events] Fixed issue where slower loading data would replace newest event selection + +Enterprise fixes: +- [crashes-jira] Preventing crashing when jira authentification fails +- [formulas] Removing HTML from tooltip localization + +Features: +- Making user guide icons stand out more before first use +- [alerts] UI improvements +- [alerts] small improvements in email notifications +- [code] Unifying bottom menu for bulk operations +- [core] Aggregated events data collections merged together +- [nps] UI improvements +- [surveys] UI improvements +- upgraded mongoDB to version 7 +- upgraded nodejs to version 20 + +Enterprise Features: +- [crash_symbolication] Added ability to set custom domain override for the symbolication server +- [drill] Drill "by query" vizualization improved +- [drill] Drill data collections merged together +- [events] Added a quick transition to drill +- [hooks] Added audit log entries for hook "create", "edit", "delete", "update" actions +- [users] "Last Session" column in User Profiles is now sortable +- [users] Crashes in the crashes tab can now be sorted +- [users] UI improvements +- [views] Added a quick transition to drill + +## Version 24.05.15 +Enterprise fixes: +- [nps] Fixed UI issues in the widget editor related to the "user consent" section +- [ratings] Fixed rendering issue for escaped values + +## Version 24.05.14 +Fixes: +- [code] Added better handling for countly servers while deployed using subdirectory +- [data-manager] Added missing "Create" button for event groups +- [data-manager] Fixes for auto toggling data masking setting on redaction change +- [populator] Fixed issues in case of wrongly structured data +- [push] token shouldn't be revoked if it's already in db +- [server-stats] Fixed a data point calculation bug + +Enterprise fixes: +- [push_approver] Fixed issue with the plugin not handling being "soft disabled" +- [surveys] fixed a bug with the Survey widget where the "submit" button could become non interactable +- [surveys] fixed issues with dashboard editor in relation to the "terms and conditions" +- [surveys] fixed issues with previewing, creating and editing nps widgets + +## Version 24.05.13 +Fixes: +- [alerts] Fixed bugs related to NPS alerts +- [crash] Reworked symbol files upload to support larger symbol files +- [push] Fixed bug that would surface when sending Array or Object related payload + +Enterprise fixes: +- [ab-testing] Slight improvements to the UI and UX +- [remote-config] Slight improvements to the UI and UX + +Enterprise Features: +- [ab-testing] Improved UI for selecting AB test expiration + +## Version 24.05.12 +Fixes: +- [dashboards] Fixes for dashboards grid +- [dashboards] UI fix for dashboard widget action menu +- [push] Refactored fcm API related code +- [reports] Use config for encryption key in reports + +Enterprise fixes: + - [retention] Fixes for byval retention query calculation + +## Version 24.05.11 +Fixes: +- [cache] Use a cursor without timeout + +## Version 24.05.10 +Fixes: +- [alerts] Alerts improvements +- [core] Various fixes for frontend to support running countly from subdirectory +- [logs] Show collected problems on logger + +Enterprise fixes: +- [data-manager] Fixes in UI to allow events starting with "/" +- [flows] Fixes for flows step generation +- [surveys] Other is not allowed as a valid answer for required questions + +## Version 24.05.9 +Fixes: +- [crashes] Fix crashes template paths and add data check + +Enterprise fixes: +- [license] Fix for License warning appears is Flex server +- [drill] Fix typo in view regeneration api response + +## Version 24.05.8 +Fixes: +- [scripts] script to check settings limits +- [crashes] Update custom field cleanup script with streaming +- [core] Skip data masking on internal appUsers data refetching query +- [core][bugfix] Correct validation on "is any plugin masked" +- [scripts] Delete custom events scripts +- [dashboards] Show edit option also for invalid widgets +- [core] batcher stats added +- [dependencies] Bump xlsx-write-stream from 1.0.2 to 1.0.3 + +Enterprise fixes: +- [data-manager] changes to allow skipping query rewriting using passed property +- [os] fix for changing default repository of CentOS 8 to vault because OS reached EOL + +## Version 24.05.7 +Fixes: +- [countly-request]Fix countly-request get and post methods +- [core] Improvements to prevent XSS +- [push] objects are not allowed for the properties inside "data" key of the payload in new FCM API +- [populator] Fixes for handling bulk requests + +Enterprise fixes: +- [adjust] Added adjust plugin +- [surveys] UI changes for table + ## Version 24.05.6 Fixes: - [data-manager] Fix for event deletion timeout diff --git a/Gruntfile.js b/Gruntfile.js index 783ccca240e..51ee33cc5a6 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -241,7 +241,7 @@ module.exports = function(grunt) { 'frontend/express/public/javascripts/dom/drop/drop-theme-countly.min.css', 'frontend/express/public/javascripts/utils/tooltipster/tooltipster.bundle.min.css', 'frontend/express/public/stylesheets/bulma/bulma-custom.css', - 'frontend/express/public/stylesheets/styles/manifest.css', + 'frontend/express/public/stylesheets/styles/manifest2.css', 'frontend/express/public/stylesheets/vue/element-tiptap.css', ] } @@ -324,7 +324,25 @@ module.exports = function(grunt) { grunt.registerTask('default', ['mochaTest']); - grunt.registerTask('dist', ['sass', 'concat', 'uglify', 'cssmin']); + grunt.registerTask('replace-paths', 'Replace image paths in prod CSS files', function() { + var cssFiles = [ + { + filepath: 'frontend/express/public/stylesheets/styles/manifest.css', + lookup: '../../images', + replacement: '../images', + newPath: 'frontend/express/public/stylesheets/styles/manifest2.css' + } + ]; + + cssFiles.forEach(function(file) { + var content = grunt.file.read(file.filepath); + var newContent = content.replace(/\.\.\/\.\.\/images/g, file.replacement); + grunt.file.write(file.newPath, newContent); + grunt.log.writeln('Processed file: ' + file.filepath); + }); + }); + + grunt.registerTask('dist', ['sass', 'concat', 'uglify', 'replace-paths', 'cssmin']); grunt.registerTask('plugins', 'Minify plugin JS / CSS files and copy images', function() { var js = [], css = [], img = [], fs = require('fs'), path = require('path'); diff --git a/api/api.js b/api/api.js old mode 100755 new mode 100644 index 4a475af5272..5f259134ff8 --- a/api/api.js +++ b/api/api.js @@ -156,9 +156,9 @@ plugins.connectToAllDatabases().then(function() { console.log("Successfully stored batch state"); } catch (ex) { - console.log("Could not store batch state"); + console.log("Could not store batch state", ex); } - process.exit(code); + process.exit(typeof code === "number" ? code : 1); } /** @@ -370,10 +370,18 @@ plugins.connectToAllDatabases().then(function() { } const form = new formidable.IncomingForm(formidableOptions); - req.body = ''; - req.on('data', (data) => { - req.body += data; - }); + if (/crash_symbols\/(add_symbol|upload_symbol)/.test(req.url)) { + req.body = []; + req.on('data', (data) => { + req.body.push(data); + }); + } + else { + req.body = ''; + req.on('data', (data) => { + req.body += data; + }); + } let multiFormData = false; // Check if we have 'multipart/form-data' @@ -432,4 +440,4 @@ plugins.connectToAllDatabases().then(function() { plugins.loadConfigs(common.db); } -}); \ No newline at end of file +}); diff --git a/api/config.sample.js b/api/config.sample.js index f209659242c..d3532c70d9f 100644 --- a/api/config.sample.js +++ b/api/config.sample.js @@ -99,6 +99,7 @@ var countlyConfig = { * @property {string} algorithm - name of the algorithm to use for encryption. The algorithm is dependent on OpenSSL, examples are 'aes192', etc. On recent OpenSSL releases, openssl list-cipher-algorithms will display the available cipher algorithms. Default value is aes-256-cbc * @property {string} input_encoding - how encryption input is encoded. Used as output for decrypting. Default utf-8. * @property {string} output_encoding - how encryption output is encoded. Used as input for decrypting. Default hex. + * @property {string} reports_key - key used for encryption of reports links */ encryption: {}, @@ -106,7 +107,7 @@ var countlyConfig = { * Specifies where to store files. Value "fs" means file system or basically storing files on hard drive. Another currently supported option is "gridfs" storing files in MongoDB database using GridFS. By default fallback to "fs"; * @type {string} [default=fs] */ - fileStorage: "fs", + fileStorage: "gridfs", /** * Specifies after how long time configurations are reloded from data base. Default value is 10000 (10 seconds) * @type {integer} [default=10000] @@ -120,7 +121,7 @@ var countlyConfig = { /** * Share same database connection pool between databases */ - shared_connection: false, + shared_connection: true, /** * Simple SMTP mail sender configuration. * Can only be used when you don't have custom mailer extend ({@code countly/extend/mail.js}). diff --git a/api/lib/countly.common.js b/api/lib/countly.common.js index 632ae185217..2355641cba9 100644 --- a/api/lib/countly.common.js +++ b/api/lib/countly.common.js @@ -1533,9 +1533,6 @@ countlyCommon.extractTwoLevelData = function(db, rangeArray, clearFunction, data periodObj = countlyCommon.periodObj; } - if (!rangeArray) { - return {"chartData": tableData}; - } var periodMin = 0, periodMax = 0, dataObj = {}, @@ -1544,6 +1541,10 @@ countlyCommon.extractTwoLevelData = function(db, rangeArray, clearFunction, data propertyFunctions = underscore.pluck(dataProperties, "func"), propertyValue = 0; + if (!rangeArray) { + return {"chartData": tableData}; + } + if (!periodObj.isSpecialPeriod) { periodMin = periodObj.periodMin; periodMax = (periodObj.periodMax + 1); diff --git a/api/parts/data/batcher.js b/api/parts/data/batcher.js index 86d9acb21e6..ccb879b51dc 100644 --- a/api/parts/data/batcher.js +++ b/api/parts/data/batcher.js @@ -4,7 +4,24 @@ const plugins = require('../../../plugins/pluginManager.js'); const log = require('../../utils/log.js')("batcher"); const common = require('../../utils/common.js'); - +var batcherStats = { + key: 'BATCHER_STATS', + pid: process.pid, + insert_queued: 0, + insert_processing: 0, + insert_errored_fallback: 0, + insert_errored_no_fallback: 0, + insert_errored_no_fallback_last_error: "", + update_queued: 0, + update_processing: 0, + update_errored_fallback: 0, + update_errored_no_fallback: 0, + update_errored_no_fallback_last_error: "", +}; + +setInterval(function() { + log.i('%j', batcherStats); +}, 10000); /** * Class for batching database insert operations * @example @@ -56,6 +73,8 @@ class InsertBatcher { if (this.data[db][collection].length) { var docs = this.data[db][collection]; this.data[db][collection] = []; + batcherStats.insert_queued -= docs.length; + batcherStats.insert_processing += docs.length; try { await new Promise((resolve, reject) => { this.dbs[db].collection(collection).insertMany(docs, {ordered: false, ignore_errors: [11000]}, function(err, res) { @@ -63,6 +82,7 @@ class InsertBatcher { reject(err); return; } + batcherStats.insert_processing -= docs.length; resolve(res); }); }); @@ -75,7 +95,10 @@ class InsertBatcher { //trying to rollback operations to try again on next iteration if (ex.writeErrors && ex.writeErrors.length) { for (let i = 0; i < ex.writeErrors.length; i++) { + batcherStats.insert_processing--; if (no_fallback_errors.indexOf(ex.writeErrors[i].code) !== -1) { + batcherStats.insert_errored_no_fallback++; + batcherStats.insert_errored_no_fallback_last_error = ex.writeErrors[i].errmsg; //dispatch failure if (notify_fallback_errors.indexOf(ex.writeErrors[i].code) !== -1) { var index0 = ex.writeErrors[i].index; @@ -85,6 +108,7 @@ class InsertBatcher { //we could record in diagnostic data continue; } + batcherStats.insert_errored_fallback++; let index = ex.writeErrors[i].index; if (docs[index]) { this.data[db][collection].push(docs[index]); @@ -136,8 +160,10 @@ class InsertBatcher { for (let i = 0; i < doc.length; i++) { this.data[db][collection].push(doc[i]); } + batcherStats.insert_queued += doc.length; } else { + batcherStats.insert_queued++; this.data[db][collection].push(doc); } if (!this.process) { @@ -206,12 +232,14 @@ class WriteBatcher { updateOne: { filter: {_id: this.data[db][collection][key].id}, update: this.data[db][collection][key].value, - upsert: true + upsert: this.data[db][collection][key].upsert } }); } } this.data[db][collection] = {}; + batcherStats.update_queued -= queries.length; + batcherStats.update_processing += queries.length; try { await new Promise((resolve, reject) => { this.dbs[db].collection(collection).bulkWrite(queries, {ordered: false, ignore_errors: [11000]}, function(err, res) { @@ -219,6 +247,7 @@ class WriteBatcher { reject(err); return; } + batcherStats.update_processing -= queries.length; resolve(res); }); }); @@ -231,8 +260,10 @@ class WriteBatcher { //trying to rollback operations to try again on next iteration if (ex.writeErrors && ex.writeErrors.length) { for (let i = 0; i < ex.writeErrors.length; i++) { - + batcherStats.update_processing--; if (no_fallback_errors.indexOf(ex.writeErrors[i].code) !== -1) { + batcherStats.update_errored_no_fallback++; + batcherStats.update_errored_no_fallback_last_error = ex.writeErrors[i].errmsg; //dispatch failure if (notify_errors.indexOf(ex.writeErrors[i].code) !== -1) { var index0 = ex.writeErrors[i].index; @@ -242,6 +273,7 @@ class WriteBatcher { //we could record in diagnostic data continue; } + batcherStats.update_errored_fallback++; let index = ex.writeErrors[i].index; if (queries[index]) { //if we don't have anything for this document yet just use query @@ -308,17 +340,25 @@ class WriteBatcher { * @param {string} id - id of the document * @param {object} operation - operation * @param {string} db - name of the database for which to write data + * @param {object=} options - options for operation ((upsert: false) - if you don't want to upsert document) */ - add(collection, id, operation, db = "countly") { + add(collection, id, operation, db = "countly", options) { if (!this.shared || cluster.isMaster) { if (!this.data[db][collection]) { this.data[db][collection] = {}; } if (!this.data[db][collection][id]) { - this.data[db][collection][id] = {id: id, value: operation}; + this.data[db][collection][id] = {id: id, value: operation, upsert: true}; + if (options && options.upsert === false) { + this.data[db][collection][id].upsert = false; + } + batcherStats.update_queued++; } else { this.data[db][collection][id].value = common.mergeQuery(this.data[db][collection][id].value, operation); + if (options && options.upsert === false) { + this.data[db][collection][id].upsert = this.data[db][collection][id].upsert || false; + } } if (!this.process) { this.flush(db, collection); @@ -653,4 +693,4 @@ function getId() { return crypto.randomBytes(16).toString("hex"); } -module.exports = {WriteBatcher, ReadBatcher, InsertBatcher}; \ No newline at end of file +module.exports = {WriteBatcher, ReadBatcher, InsertBatcher}; diff --git a/api/parts/data/events.js b/api/parts/data/events.js index b3465b6f97c..e1dd8e1e6ce 100644 --- a/api/parts/data/events.js +++ b/api/parts/data/events.js @@ -93,7 +93,7 @@ countlyEvents.processEvents = function(params) { if (!shortEventName) { continue; } - eventCollectionName = "events" + crypto.createHash('sha1').update(shortEventName + params.app_id).digest('hex'); + eventCollectionName = crypto.createHash('sha1').update(shortEventName + params.app_id).digest('hex'); if (currEvent.segmentation) { for (var segKey in currEvent.segmentation) { @@ -141,7 +141,8 @@ countlyEvents.processEvents = function(params) { var postfix = common.crypto.createHash("md5").update(tmpSegVal).digest('base64')[0]; metaToFetch[eventCollectionName + "no-segment_" + common.getDateIds(params).zero + "_" + postfix] = { coll: eventCollectionName, - id: "no-segment_" + common.getDateIds(params).zero + "_" + postfix + id: "no-segment_" + common.getDateIds(params).zero + "_" + postfix, + app_id: params.app_id }; } catch (ex) { @@ -172,7 +173,6 @@ countlyEvents.processEvents = function(params) { } } } - processEvents(appEvents, appSegments, appSgValues, params, omitted_segments, whitelisted_segments, resolve); }); @@ -182,7 +182,7 @@ countlyEvents.processEvents = function(params) { * @param {function} callback - for result **/ function fetchEventMeta(id, callback) { - common.readBatcher.getOne(metaToFetch[id].coll, {'_id': metaToFetch[id].id}, {meta_v2: 1}, (err2, eventMetaDoc) => { + common.readBatcher.getOne("events_data", {'_id': metaToFetch[id].app_id + "_" + metaToFetch[id].coll + "_" + metaToFetch[id].id}, {meta_v2: 1}, (err2, eventMetaDoc) => { var retObj = eventMetaDoc || {}; retObj.coll = metaToFetch[id].coll; @@ -220,11 +220,12 @@ function processEvents(appEvents, appSegments, appSgValues, params, omitted_segm forbiddenSegValues.push(i + ""); } - for (let i = 0; i < params.qstring.events.length; i++) { + for (let i = 0; i < params.qstring?.events.length; i++) { var currEvent = params.qstring.events[i]; tmpEventObj = {}; tmpEventColl = {}; + var tmpTotalObj = {}; // Key fields is required if (!currEvent.key || (currEvent.key.indexOf('[CLY]_') === 0 && plugins.internalEvents.indexOf(currEvent.key) === -1)) { @@ -256,7 +257,7 @@ function processEvents(appEvents, appSegments, appSgValues, params, omitted_segm } // Create new collection name for the event - eventCollectionName = "events" + crypto.createHash('sha1').update(shortEventName + params.app_id).digest('hex'); + eventCollectionName = crypto.createHash('sha1').update(shortEventName + params.app_id).digest('hex'); eventHashMap[eventCollectionName] = shortEventName; @@ -271,11 +272,13 @@ function processEvents(appEvents, appSegments, appSgValues, params, omitted_segm if (currEvent.sum && common.isNumber(currEvent.sum)) { currEvent.sum = parseFloat(parseFloat(currEvent.sum).toFixed(5)); common.fillTimeObjectMonth(params, tmpEventObj, common.dbMap.sum, currEvent.sum); + common.fillTimeObjectMonth(params, tmpTotalObj, shortEventName + '.' + common.dbMap.sum, currEvent.sum); } if (currEvent.dur && common.isNumber(currEvent.dur)) { currEvent.dur = parseFloat(currEvent.dur); common.fillTimeObjectMonth(params, tmpEventObj, common.dbMap.dur, currEvent.dur); + common.fillTimeObjectMonth(params, tmpTotalObj, shortEventName + '.' + common.dbMap.dur, currEvent.dur); } if (currEvent.count && common.isNumber(currEvent.count)) { @@ -283,11 +286,22 @@ function processEvents(appEvents, appSegments, appSgValues, params, omitted_segm } common.fillTimeObjectMonth(params, tmpEventObj, common.dbMap.count, currEvent.count); + common.fillTimeObjectMonth(params, tmpTotalObj, shortEventName + '.' + common.dbMap.count, currEvent.count); var dateIds = common.getDateIds(params); + var postfix2 = common.crypto.createHash("md5").update(shortEventName).digest('base64')[0]; tmpEventColl["no-segment" + "." + dateIds.month] = tmpEventObj; + if (!eventCollections.all) { + eventCollections.all = {}; + } + var ee = {}; + ee["key." + dateIds.month + "." + postfix2] = tmpTotalObj; + + mergeEvents(eventCollections.all, ee); + //fill time object for total event count + if (currEvent.segmentation) { for (let segKey in currEvent.segmentation) { var tmpSegKey = ""; @@ -323,8 +337,6 @@ function processEvents(appEvents, appSegments, appSgValues, params, omitted_segm continue; } - - var myValues = []; var tmpSegVal; if (Array.isArray(currEvent.segmentation[segKey])) { @@ -401,13 +413,27 @@ function processEvents(appEvents, appSegments, appSgValues, params, omitted_segm eventCollections[eventCollectionName] = {}; } - mergeEvents(eventCollections[eventCollectionName], tmpEventColl); + if (!eventSegmentsZeroes.all) { + eventSegmentsZeroes.all = []; + common.arrayAddUniq(eventSegmentsZeroes.all, dateIds.zero + "." + postfix2); + } + else { + common.arrayAddUniq(eventSegmentsZeroes.all, dateIds.zero + "." + postfix2); + } + + if (!eventSegments["all." + dateIds.zero + "." + postfix2]) { + eventSegments["all." + dateIds.zero + "." + postfix2] = {}; + } + eventSegments["all." + dateIds.zero + "." + postfix2]['meta_v2.key.' + shortEventName] = true; + eventSegments["all." + dateIds.zero + "." + postfix2]["meta_v2.segments.key"] = true; + + mergeEvents(eventCollections[eventCollectionName], tmpEventColl); //switch back to request time params.time = time; } - if (!pluginsGetConfig.safe) { + if (!pluginsGetConfig.safe && !(params.qstring?.safe_api_response)) { for (let collection in eventCollections) { if (eventSegmentsZeroes[collection] && eventSegmentsZeroes[collection].length) { for (let i = 0; i < eventSegmentsZeroes[collection].length; i++) { @@ -421,18 +447,23 @@ function processEvents(appEvents, appSegments, appSgValues, params, omitted_segm } eventSegments[collection + "." + zeroId].m = zeroId.split(".")[0]; eventSegments[collection + "." + zeroId].s = "no-segment"; - common.writeBatcher.add(collection, "no-segment_" + zeroId.replace(".", "_"), {$set: eventSegments[collection + "." + zeroId]}); + eventSegments[collection + "." + zeroId].a = params.app_id + ""; + eventSegments[collection + "." + zeroId].e = eventHashMap[collection] || collection; + eventSegments[collection + "." + zeroId]._id = params.app_id + "_" + collection + "_" + "no-segment_" + zeroId.replace(".", "_"); + common.writeBatcher.add("events_data", params.app_id + "_" + collection + "_" + "no-segment_" + zeroId.replace(".", "_"), {$set: eventSegments[collection + "." + zeroId]}); } } for (let segment in eventCollections[collection]) { let collIdSplits = segment.split("."), - collId = segment.replace(/\./g, "_"); + collId = params.app_id + "_" + collection + "_" + segment.replace(/\./g, "_"); - common.writeBatcher.add(collection, collId, { + common.writeBatcher.add("events_data", collId, { $set: { "m": collIdSplits[1], - "s": collIdSplits[0] + "s": collIdSplits[0], + "a": params.app_id + "", + "e": eventHashMap[collection] || collection }, "$inc": eventCollections[collection][segment] }); @@ -441,7 +472,6 @@ function processEvents(appEvents, appSegments, appSgValues, params, omitted_segm } else { var eventDocs = []; - for (let collection in eventCollections) { if (eventSegmentsZeroes[collection] && eventSegmentsZeroes[collection].length) { for (let i = 0; i < eventSegmentsZeroes[collection].length; i++) { @@ -456,10 +486,13 @@ function processEvents(appEvents, appSegments, appSgValues, params, omitted_segm eventSegments[collection + "." + zeroId].m = zeroId.split(".")[0]; eventSegments[collection + "." + zeroId].s = "no-segment"; + eventSegments[collection + "." + zeroId].a = params.app_id + ""; + eventSegments[collection + "." + zeroId].e = eventHashMap[collection] || collection; + eventDocs.push({ - "collection": collection, - "_id": "no-segment_" + zeroId.replace(".", "_"), + "collection": "events_data", + "_id": params.app_id + "_" + collection + "_" + "no-segment_" + zeroId.replace(".", "_"), "updateObj": {$set: eventSegments[collection + "." + zeroId]} }); } @@ -467,15 +500,17 @@ function processEvents(appEvents, appSegments, appSgValues, params, omitted_segm for (let segment in eventCollections[collection]) { let collIdSplits = segment.split("."), - collId = segment.replace(/\./g, "_"); + collId = params.app_id + "_" + collection + "_" + segment.replace(/\./g, "_"); eventDocs.push({ - "collection": collection, + "collection": "events_data", "_id": collId, "updateObj": { $set: { "m": collIdSplits[1], - "s": collIdSplits[0] + "s": collIdSplits[0], + "a": params.app_id + "", + "e": eventHashMap[collection] || collection }, "$inc": eventCollections[collection][segment] }, @@ -517,13 +552,13 @@ function processEvents(appEvents, appSegments, appSgValues, params, omitted_segm var eventSplits = event.split("."), eventKey = eventSplits[0]; - var realEventKey = (eventHashMap[eventKey] + "").replace(/\./g, ':'); - - if (!eventSegmentList.$addToSet["segments." + realEventKey]) { + var realEventKey = ((eventHashMap[eventKey] || "") + "").replace(/\./g, ':'); + //for segment describing all events there is no event key. + if (realEventKey && !eventSegmentList.$addToSet["segments." + realEventKey]) { eventSegmentList.$addToSet["segments." + realEventKey] = {}; } - if (eventSegments[event]) { + if (eventSegments[event] && realEventKey) { for (let segment in eventSegments[event]) { if (segment.indexOf("meta_v2.segments.") === 0) { var name = segment.replace("meta_v2.segments.", ""); @@ -537,7 +572,6 @@ function processEvents(appEvents, appSegments, appSgValues, params, omitted_segm } } } - common.writeBatcher.add('events', common.db.ObjectID(params.app_id), eventSegmentList); } done(); diff --git a/api/parts/data/fetch.js b/api/parts/data/fetch.js index 2995f42bc4d..c94f20bb422 100644 --- a/api/parts/data/fetch.js +++ b/api/parts/data/fetch.js @@ -50,8 +50,8 @@ fetch.prefetchEventData = function(collection, params) { } } - var collectionName = "events" + crypto.createHash('sha1').update(collection + params.app_id).digest('hex'); - fetch.fetchTimeObj(collectionName, params, true); + var collectionName = crypto.createHash('sha1').update(collection + params.app_id).digest('hex'); + fetch.fetchTimeObj("events_data", params, true, {'id_prefix': params.app_id + "_" + collectionName + '_'}); } else { common.returnOutput(params, {}); @@ -59,8 +59,8 @@ fetch.prefetchEventData = function(collection, params) { }); } else { - var collectionName = "events" + crypto.createHash('sha1').update(params.qstring.event + params.app_id).digest('hex'); - fetch.fetchTimeObj(collectionName, params, true); + var collectionName = crypto.createHash('sha1').update(params.qstring.event + params.app_id).digest('hex'); + fetch.fetchTimeObj("events_data", params, true, {'id_prefix': params.app_id + "_" + collectionName + '_'}); } }; @@ -199,7 +199,7 @@ fetch.getMergedEventData = function(params, events, options, callback) { var eventKeysArr = []; for (let i = 0; i < events.length; i++) { - eventKeysArr.push(events[i] + params.app_id); + eventKeysArr.push({"e": events[i], "a": params.app_id}); } if (!eventKeysArr.length) { @@ -331,8 +331,10 @@ fetch.getMergedEventData = function(params, events, options, callback) { * @param {function} done - function to call when data fetched **/ function getEventData(eventKey, done) { - var collectionName = "events" + crypto.createHash('sha1').update(eventKey).digest('hex'); - fetchTimeObj(collectionName, params, true, options, function(output) { + var collectionName = crypto.createHash('sha1').update(eventKey.e + eventKey.a).digest('hex'); + var optionsCopy = JSON.parse(JSON.stringify(options)); + optionsCopy.id_prefix = eventKey.a + "_" + collectionName + "_"; + fetchTimeObj("events_data", params, true, optionsCopy, function(output) { done(null, output || {}); }); } @@ -1246,8 +1248,8 @@ fetch.fetchDataTopEvents = function(params) { **/ fetch.fetchEvents = function(params) { if (params.qstring.event && params.qstring.event.length) { - let collectionName = "events" + crypto.createHash('sha1').update(params.qstring.event + params.app_id).digest('hex'); - fetch.getTimeObjForEvents(collectionName, params, function(doc) { + let collectionName = crypto.createHash('sha1').update(params.qstring.event + params.app_id).digest('hex'); + fetch.getTimeObjForEvents("events_data", params, {'id_prefix': params.app_id + "_" + collectionName + '_'}, function(doc) { var options = {}; if (params.qstring.bucket) { options.bucket = params.qstring.bucket; @@ -1277,8 +1279,8 @@ fetch.fetchEvents = function(params) { if (Array.isArray(params.qstring.events)) { var data = {}; async.each(params.qstring.events, function(event, done) { - let collectionName = "events" + crypto.createHash('sha1').update(event + params.app_id).digest('hex'); - fetch.getTimeObjForEvents(collectionName, params, function(doc) { + let collectionName = crypto.createHash('sha1').update(event + params.app_id).digest('hex'); + fetch.getTimeObjForEvents("events_data", params, {'id_prefix': params.app_id + "_" + collectionName + '_'}, function(doc) { countlyEvents.setDb(doc || {}); if (params.qstring.segmentation && params.qstring.segmentation !== "no-segment") { data[event] = countlyEvents.getSegmentedData(params.qstring.segmentation); @@ -1294,7 +1296,15 @@ fetch.fetchEvents = function(params) { } } else { - common.returnMessage(params, 400, 'Must provide event or events'); + //no event passed, get total counts + let collectionName = "all"; + params.qstring.segmentation = "key"; + fetch.getTimeObjForEvents("events_data", params, {'id_prefix': params.app_id + "_" + collectionName + '_'}, function(doc) { + countlyEvents.setDb(doc || {}); + var data2 = {}; + data2.all = countlyEvents.getSegmentedData(params.qstring.segmentation); + common.returnOutput(params, data2); + }); } }; @@ -1313,6 +1323,9 @@ fetch.fetchEvents = function(params) { */ fetch.fetchTimeObj = function(collection, params, isCustomEvent, options) { fetchTimeObj(collection, params, isCustomEvent, options, function(output) { + if (params?.qstring?.event) { + output.eventName = params.qstring.event; + } common.returnOutput(params, output); }); }; @@ -1348,6 +1361,18 @@ fetch.getTimeObj = function(collection, params, options, callback) { * @param {function} callback - callback to retrieve the data, receiving only one param which is output */ fetch.getTimeObjForEvents = function(collection, params, options, callback) { + + if (typeof options === "function") { + callback = options; + options = {}; + } + + if (collection !== 'events_data' && collection.startsWith('events')) { + collection = collection.substring(6); + options = options || {}; + options.id_prefix = params.app_id + "_" + collection + "_"; + collection = "events_data"; + } fetchTimeObj(collection, params, true, options, callback); }; @@ -1589,7 +1614,7 @@ function fetchTimeObj(collection, params, isCustomEvent, options, callback) { options = {}; } - if (typeof options === "undefined") { + if (!options) { options = {}; } @@ -1622,7 +1647,7 @@ function fetchTimeObj(collection, params, isCustomEvent, options, callback) { } if (params.qstring.fullRange) { - options.db.collection(collection).find({ '_id': { $regex: "^" + options.id + ".*" } }).toArray(function(err1, data) { + options.db.collection(collection).find({ '_id': { $regex: "^" + (options.id_prefix || "") + options.id + ".*" } }).toArray(function(err1, data) { callback(getMergedObj(data, true, options.levels, params.truncateEventValuesList)); }); } @@ -1669,17 +1694,17 @@ function fetchTimeObj(collection, params, isCustomEvent, options, callback) { if (isCustomEvent) { let segment = params.qstring.segmentation || "no-segment"; - zeroIdToFetch = "no-segment_" + dbDateIds.zero; - monthIdToFetch = segment + "_" + dbDateIds.month; + zeroIdToFetch = (options.id_prefix || "") + "no-segment_" + dbDateIds.zero; + monthIdToFetch = (options.id_prefix || "") + segment + "_" + dbDateIds.month; } else { - zeroIdToFetch = options.id + "_" + dbDateIds.zero; - monthIdToFetch = options.id + "_" + dbDateIds.month; + zeroIdToFetch = (options.id_prefix || "") + options.id + "_" + dbDateIds.zero; + monthIdToFetch = (options.id_prefix || "") + options.id + "_" + dbDateIds.month; } var zeroDocs = [zeroIdToFetch]; var monthDocs = [monthIdToFetch]; - if (!(options && options.dontBreak)) { + if (!options.dontBreak) { for (let i = 0; i < common.base64.length; i++) { zeroDocs.push(zeroIdToFetch + "_" + common.base64[i]); monthDocs.push(monthIdToFetch + "_" + common.base64[i]); @@ -1702,44 +1727,47 @@ function fetchTimeObj(collection, params, isCustomEvent, options, callback) { let segment = params.qstring.segmentation || "no-segment"; for (let i = 0; i < periodObj.reqZeroDbDateIds.length; i++) { - documents.push("no-segment_" + periodObj.reqZeroDbDateIds[i]); + documents.push((options.id_prefix || "") + "no-segment_" + periodObj.reqZeroDbDateIds[i]); if (!(options && options.dontBreak)) { for (let m = 0; m < common.base64.length; m++) { - documents.push("no-segment_" + periodObj.reqZeroDbDateIds[i] + "_" + common.base64[m]); + documents.push((options.id_prefix || "") + "no-segment_" + periodObj.reqZeroDbDateIds[i] + "_" + common.base64[m]); } } } for (let i = 0; i < periodObj.reqMonthDbDateIds.length; i++) { - documents.push(segment + "_" + periodObj.reqMonthDbDateIds[i]); + documents.push((options.id_prefix || "") + segment + "_" + periodObj.reqMonthDbDateIds[i]); if (!(options && options.dontBreak)) { for (let m = 0; m < common.base64.length; m++) { - documents.push(segment + "_" + periodObj.reqMonthDbDateIds[i] + "_" + common.base64[m]); + documents.push((options.id_prefix || "") + segment + "_" + periodObj.reqMonthDbDateIds[i] + "_" + common.base64[m]); } } } } else { for (let i = 0; i < periodObj.reqZeroDbDateIds.length; i++) { - documents.push(options.id + "_" + periodObj.reqZeroDbDateIds[i]); + documents.push((options.id_prefix || "") + options.id + "_" + periodObj.reqZeroDbDateIds[i]); if (!(options && options.dontBreak)) { for (let m = 0; m < common.base64.length; m++) { - documents.push(options.id + "_" + periodObj.reqZeroDbDateIds[i] + "_" + common.base64[m]); + documents.push((options.id_prefix || "") + options.id + "_" + periodObj.reqZeroDbDateIds[i] + "_" + common.base64[m]); } } } for (let i = 0; i < periodObj.reqMonthDbDateIds.length; i++) { - documents.push(options.id + "_" + periodObj.reqMonthDbDateIds[i]); + documents.push((options.id_prefix || "") + options.id + "_" + periodObj.reqMonthDbDateIds[i]); if (!(options && options.dontBreak)) { for (let m = 0; m < common.base64.length; m++) { - documents.push(options.id + "_" + periodObj.reqMonthDbDateIds[i] + "_" + common.base64[m]); + documents.push((options.id_prefix || "") + options.id + "_" + periodObj.reqMonthDbDateIds[i] + "_" + common.base64[m]); } } } } options.db.collection(collection).find({ '_id': { $in: documents } }, {}).toArray(function(err, dataObjects) { + if (err) { + console.log(err); + } callback(getMergedObj(dataObjects, false, options.levels, params.truncateEventValuesList)); }); } @@ -1910,7 +1938,6 @@ function fetchTimeObj(collection, params, isCustomEvent, options, callback) { } } } - //Fixing meta to be escaped.(Because return output will escape keys and make values incompatable) for (let i in mergedDataObj.meta) { for (var p = 0; p < mergedDataObj.meta[i].length; p++) { @@ -1973,7 +2000,6 @@ function union(x, y) { } var res = []; - for (let k in obj) { res.push(k); } diff --git a/api/parts/jobs/job.js b/api/parts/jobs/job.js index a88b8c7ee74..1bf39c2e6a1 100644 --- a/api/parts/jobs/job.js +++ b/api/parts/jobs/job.js @@ -1068,9 +1068,16 @@ class IPCFaçadeJob extends ResourcefulJob { this.ipcChannel.remove(); }, (error) => { this.ipcChannel.remove(); - log.e('[%s] Error in IPCFaçadeJob %s: %j / %j', this.job.channel, this.resourceFaçade._id, error, error.stack); + if (error) { + log.e('[%s] Error in IPCFaçadeJob %s: %j / %j', this.job.channel, this.resourceFaçade._id, error, error.stack); + } + else { + log.e('[%s] Error in IPCFaçadeJob %s: Unknown error', this.job.channel, this.resourceFaçade._id); + } this.job._finish(error || 'Aborted').catch(()=>{}); - throw error; + if (error) { + throw error; + } }); } diff --git a/api/parts/mgmt/app_users.js b/api/parts/mgmt/app_users.js index f46f40b53b6..33adf032797 100644 --- a/api/parts/mgmt/app_users.js +++ b/api/parts/mgmt/app_users.js @@ -764,6 +764,7 @@ usersApi.merge = function(app_id, newAppUser, new_id, old_id, new_device_id, old var deleteMyExport = function(exportID) { //tries to delete packed file, exported folder and saved export in gridfs //normally there should be only export in gridfs. Cleaning all to be sure. //rejects only if there stays any saved data for export + log.d("deleteMyExport:" + exportID); return new Promise(function(resolve, reject) { //remove archive var errors = []; @@ -775,7 +776,6 @@ var deleteMyExport = function(exportID) { //tries to delete packed file, exporte errors.push(err); } } - countlyFs.gridfs.deleteFile("appUsers", path.resolve(__dirname, './../../../export/AppUser/' + exportID + '.tar.gz'), {id: exportID + '.tar.gz'}, function(error) { if (error && error.message && error.message.substring(0, 12) !== "FileNotFound" && error.message.substring(0, 14) !== 'File not found') { log.e(error.message.substring(0, 14)); @@ -806,6 +806,18 @@ var deleteMyExport = function(exportID) { //tries to delete packed file, exporte } }); + + }).then(function() { + return new Promise(function(resolve, reject) { + common.db.collection("exports").remove({"_eid": exportID}, function(err0) { + if (err0) { + reject(err0); + } + else { + resolve(); + } + }); + }); }); }; @@ -822,46 +834,42 @@ usersApi.deleteExport = function(filename, params, callback) { //remove archive deleteMyExport(base_name[0]).then( function() { - common.db.collection("exports").remove({"_eid": base_name[0]}, function(err0) { - if (err0) { - log.e(err0); - } - if (name_parts.length === 3 && name_parts[2] !== 'HASH') { - //update user info - common.db.collection('app_users' + name_parts[1]).update({"uid": name_parts[2]}, {$unset: {"appUserExport": ""}}, {upsert: false, multi: true}, function(err) { - if (err) { - callback(err, ""); - } - else { - plugins.dispatch("/systemlogs", { - params: params, - action: "export_app_user_deleted", - data: { - result: "ok", - uids: name_parts[2], - id: base_name[0], - app_id: name_parts[1], - info: "Exported data deleted" - } - }); - callback(null, "Export deleted"); - } - }); - } - else { - plugins.dispatch("/systemlogs", { - params: params, - action: "export_app_user_deleted", - data: { - result: "ok", - id: base_name[0], - app_id: name_parts[1], - info: "Exported data deleted" - } - }); - callback(null, "Export deleted"); - } - }); + if (name_parts.length === 3 && name_parts[2] !== 'HASH') { + //update user info + common.db.collection('app_users' + name_parts[1]).update({"uid": name_parts[2]}, {$unset: {"appUserExport": ""}}, {upsert: false, multi: true}, function(err) { + if (err) { + callback(err, ""); + } + else { + plugins.dispatch("/systemlogs", { + params: params, + action: "export_app_user_deleted", + data: { + result: "ok", + uids: name_parts[2], + id: base_name[0], + app_id: name_parts[1], + info: "Exported data deleted" + } + }); + callback(null, "Export deleted"); + } + }); + } + else { + plugins.dispatch("/systemlogs", { + params: params, + action: "export_app_user_deleted", + data: { + result: "ok", + id: base_name[0], + app_id: name_parts[1], + info: "Exported data deleted" + } + }); + callback(null, "Export deleted"); + } + }, function(err) { console.log(err); @@ -1073,12 +1081,20 @@ usersApi.export = function(app_id, query, params, callback) { // else { // resolve(); // } - new Promise(function(resolve) { - log.d("collection marked"); - //export data from metric_changes - export_safely({projection: {"appUserExport": 0}, export_id: export_id, app_id: app_id, args: [...dbargs, "--collection", "metric_changes" + app_id, "-q", '{"uid":{"$in": ["' + res[0].uid.join('","') + '"]}}', "--out", export_folder + "/metric_changes" + app_id + ".json"]}).finally(function() { - resolve(); + //try deleting old export + deleteMyExport(export_id).then(function(err) { + if (err) { + log.e(err); + } + log.d("old export deleted"); + return new Promise(function(resolve) { + log.d("collection marked"); + //export data from metric_changes + + export_safely({projection: {"appUserExport": 0}, export_id: export_id, app_id: app_id, args: [...dbargs, "--collection", "metric_changes" + app_id, "-q", '{"uid":{"$in": ["' + res[0].uid.join('","') + '"]}}', "--out", export_folder + "/metric_changes" + app_id + ".json"]}).finally(function() { + resolve(); + }); }); }).then(function() { log.d("metric_changes exported"); diff --git a/api/parts/mgmt/apps.js b/api/parts/mgmt/apps.js index ff476ea9c4b..6b279df5418 100644 --- a/api/parts/mgmt/apps.js +++ b/api/parts/mgmt/apps.js @@ -613,6 +613,7 @@ appsApi.updateAppPlugins = function(params) { * @returns {boolean} true if operation successful **/ appsApi.deleteApp = function(params) { + params = params || {}; var argProps = { 'app_id': { 'required': true, @@ -849,15 +850,11 @@ function deleteAllAppData(appId, fromAppDelete, params, app) { function deleteEvents() { common.db.collection('events').findOne({'_id': common.db.ObjectID(appId)}, function(err, events) { if (!err && events && events.list) { - - common.arrayAddUniq(events.list, plugins.internalEvents); - for (var i = 0; i < events.list.length; i++) { - var collectionNameWoPrefix = crypto.createHash('sha1').update(events.list[i] + appId).digest('hex'); - common.db.collection("events" + collectionNameWoPrefix).drop(function() {}); - } - if (fromAppDelete || params.qstring.args.period === "reset") { - common.db.collection('events').remove({'_id': common.db.ObjectID(appId)}, function() {}); - } + common.db.collection("events_data").remove({'_id': {"$regex": "^" + appId + "_.*"}}, function() { + if (fromAppDelete || params.qstring.args.period === "reset") { + common.db.collection('events').remove({'_id': common.db.ObjectID(appId)}, function() {}); + } + }); } }); } @@ -969,15 +966,16 @@ function deletePeriodAppData(appId, fromAppDelete, params, app) { segments = events.segments[events.list[i]]; } + var collectionNameWoPrefix = crypto.createHash('sha1').update(events.list[i] + appId).digest('hex'); segments.push("no-segment"); var docs = []; for (let j = 0; j < segments.length; j++) { for (let k = 0; k < dates.length; k++) { - docs.push(segments[j] + "_" + dates[k]); + docs.push(appId + "_" + collectionNameWoPrefix + "_" + segments[j] + "_" + dates[k]); } } - var collectionNameWoPrefix = crypto.createHash('sha1').update(events.list[i] + appId).digest('hex'); - common.db.collection("events" + collectionNameWoPrefix).remove({'_id': {$nin: docs}}, function() {}); + var collectionNameWoPrefix2 = crypto.createHash('sha1').update(events.list[i] + appId).digest('hex'); + common.db.collection("events_data").remove({"$and": [{'_id': {"$regex": "^" + appId + "_" + collectionNameWoPrefix2 + "_.*"}}, {'_id': {$nin: docs}}]}, function() {}); } } }); diff --git a/api/parts/mgmt/cms.js b/api/parts/mgmt/cms.js index df12df04e68..facb6470e38 100644 --- a/api/parts/mgmt/cms.js +++ b/api/parts/mgmt/cms.js @@ -157,10 +157,21 @@ function syncCMSDataToDB(params) { } cmsApi.saveEntries = function(params) { + + var entries = []; + try { + entries = JSON.parse(params.qstring.entries); + } + catch (ex) { + log.e(params.qstring.entries); + common.returnMessage(params, 400, 'Invalid entries parameter'); + return; + } + transformAndStoreData( Object.assign({dataTransformed: true}, params), null, - JSON.parse(params.qstring.entries), + entries, function(err1) { if (err1) { log.e('An error occured while storing entries in DB: ' + err1); diff --git a/api/parts/mgmt/mail.js b/api/parts/mgmt/mail.js index c4c9a69954c..c5330bcfc0b 100644 --- a/api/parts/mgmt/mail.js +++ b/api/parts/mgmt/mail.js @@ -186,6 +186,9 @@ mail.sendToNewMember = function(member, memberPassword) { mail.sendToNewMemberLink = function(member, prid) { member.lang = member.lang || "en"; mail.lookup(function(err, host) { + if (config.path) { + host = host + config.path; + } localize.getProperties(member.lang, function(err2, properties) { var message = localize.format(properties["mail.new-member-prid"], mail.escapedHTMLString(mail.getUserFirstName(member)), host, mail.escapedHTMLString(member.username), prid); mail.sendMessage(member.email, properties["mail.new-member-subject"], message); @@ -217,6 +220,9 @@ mail.sendToUpdatedMember = function(member, memberPassword) { mail.sendPasswordResetInfo = function(member, prid) { member.lang = member.lang || "en"; mail.lookup(function(err, host) { + if (config.path) { + host = host + config.path; + } localize.getProperties(member.lang, function(err2, properties) { var message = localize.format(properties["mail.password-reset"], mail.escapedHTMLString(mail.getUserFirstName(member)), host, prid); mail.sendMessage(member.email, properties["mail.password-reset-subject"], message); diff --git a/api/utils/common.js b/api/utils/common.js index 6203c0963ca..cd72466fe63 100644 --- a/api/utils/common.js +++ b/api/utils/common.js @@ -181,13 +181,14 @@ function getJSON(val) { } return ret; } + /** -* Logger object for creating module specific logging -* @type {module:api/utils/log~Logger} -* @example -* var log = common.log('myplugin:api'); -* log.i('myPlugin got a request: %j', params.qstring); -*/ + * Logger object for creating module-specific logging + * @type {function(string): Logger} + * @example + * const log = common.log('myplugin:api'); + * log.i('myPlugin got a request: %j', params.qstring); + */ common.log = logger; /** @@ -1048,7 +1049,7 @@ common.validateArgs = function(args, argProperties, returnErrors) { } else if (typeof args[arg] === 'string') { if (mongodb.ObjectId.isValid(args[arg])) { - parsed = mongodb.ObjectId(args[arg]); + parsed = new mongodb.ObjectId(args[arg]); } else { if (returnErrors) { @@ -2767,7 +2768,8 @@ common.updateAppUser = function(params, update, no_meta, callback) { if (callback) { common.db.collection('app_users' + params.app_id).findAndModify({'_id': params.app_user_id}, {}, common.clearClashingQueryOperations(update), { new: true, - upsert: true + upsert: true, + skipDataMasking: true }, function(err, res) { if (!err && res && res.value) { params.app_user = res.value; @@ -2791,13 +2793,19 @@ common.updateAppUser = function(params, update, no_meta, callback) { * @param {object} metrics - metrics object from SDK request */ common.processCarrier = function(metrics) { - if (metrics && metrics._carrier) { + // Initialize metrics if undefined + metrics = metrics || {}; + if (metrics._carrier) { var carrier = metrics._carrier + ""; //random hash without spaces - if (carrier.length === 16 && carrier.indexOf(" ") === -1) { + if ((carrier.length === 16 && carrier.indexOf(" ") === -1)) { + delete metrics._carrier; + } + + // Since iOS 16.04 carrier returns value "--", interpret as Unknown by deleting + if (carrier === "--") { delete metrics._carrier; - return; } //random code @@ -2809,15 +2817,16 @@ common.processCarrier = function(metrics) { } else { delete metrics._carrier; - return; } } carrier = carrier.replace(/\w\S*/g, function(txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); }); + metrics._carrier = carrier; } + metrics._carrier = metrics._carrier ? metrics._carrier : "Unknown"; }; /** @@ -3405,7 +3414,7 @@ common.mergeQuery = function(ob1, ob2) { common.dbext = { ObjectID: function(id) { try { - return mongodb.ObjectId(id); + return new mongodb.ObjectId(id); } catch (ex) { return id; @@ -3431,7 +3440,7 @@ common.dbext = { * @returns {ObjectID} id */ oid: function(id) { - return !id ? id : id instanceof mongodb.ObjectId ? id : mongodb.ObjectId(id); + return !id ? id : id instanceof mongodb.ObjectId ? id : new mongodb.ObjectId(id); }, /** @@ -3835,4 +3844,4 @@ common.trimWhitespaceStartEnd = function(value) { return value; }; -module.exports = common; +module.exports = common; \ No newline at end of file diff --git a/api/utils/countly-request/index.js b/api/utils/countly-request/index.js index da2d138edc0..69e72222903 100755 --- a/api/utils/countly-request/index.js +++ b/api/utils/countly-request/index.js @@ -154,13 +154,13 @@ var convertOptionsToGot = function(options) { module.exports = function(countlyConfig) { // Return the request function // eslint-disable-next-line require-jsdoc - function requestFunction(uri, options, callback) { + function requestFunction(uri, options, callback, config = countlyConfig) { if (typeof uri === 'undefined') { throw new Error('undefined is not a valid uri or options object.'); } // Initialize params with the provided config - const params = initParams(uri, options, callback, countlyConfig); + const params = initParams(uri, options, callback, config); // Request logic follows, unchanged from your provided code if (params.options && (params.options.url || params.options.uri)) { @@ -184,7 +184,7 @@ module.exports = function(countlyConfig) { } // eslint-disable-next-line require-jsdoc - function post(uri, options, callback, config) { + function post(uri, options, callback, config = countlyConfig) { var params = initParams(uri, options, callback, config); if (params.options && (params.options.url || params.options.uri)) { if (params.options.form && params.options.form.fileStream && params.options.form.fileField) { @@ -219,8 +219,8 @@ module.exports = function(countlyConfig) { } - function get(uri, options, callback, config) { - module.exports(uri, options, callback, config); + function get(uri, options, callback, config = countlyConfig) { + requestFunction(uri, options, callback, config); } requestFunction.post = post; @@ -259,4 +259,4 @@ async function uploadFormFile(url, fileData, callback) { -module.exports.convertOptionsToGot = convertOptionsToGot; \ No newline at end of file +module.exports.convertOptionsToGot = convertOptionsToGot; diff --git a/api/utils/countlyFs.js b/api/utils/countlyFs.js index 099905ae2fa..0bf9f7abcad 100644 --- a/api/utils/countlyFs.js +++ b/api/utils/countlyFs.js @@ -601,13 +601,19 @@ countlyFs.gridfs = {}; * console.log("Finished", err); * }); */ - ob.deleteFileById = function(category, id, callback) { + ob.deleteFileById = async function(category, id, callback) { var bucket = new GridFSBucket(db, { bucketName: category }); - bucket.delete(id, function(error) { + try { + await bucket.delete(id); if (callback) { - callback(error); + callback(null); } - }); + } + catch (ee) { + if (callback) { + callback(ee); + } + } }; /** diff --git a/api/utils/log.js b/api/utils/log.js index 746a927081e..40bdc3e6a3d 100644 --- a/api/utils/log.js +++ b/api/utils/log.js @@ -275,57 +275,124 @@ var ipcHandler = function(msg) { }; /** -* Creates new logger object for provided module -* @param {string} name - name of the module -* @returns {module:api/utils/log~Logger} logger object -**/ + * @typedef {Object} Logger + * @property {function(): string} id - Get the logger id + * @example + * const loggerId = logger.id(); + * console.log(`Current logger ID: ${loggerId}`); + * + * @property {function(...*): void} d - Log debug level messages + * @example + * logger.d('Debug message: %s', 'Some debug info'); + * + * @property {function(...*): void} i - Log information level messages + * @example + * logger.i('Info message: User %s logged in', username); + * + * @property {function(...*): void} w - Log warning level messages + * @example + * logger.w('Warning: %d attempts failed', attempts); + * + * @property {function(...*): void} e - Log error level messages + * @example + * logger.e('Error occurred: %o', errorObject); + * + * @property {function(string, function, string, ...*): boolean} f - Log variable level messages + * @example + * logger.f('d', (log) => { + * const expensiveOperation = performExpensiveCalculation(); + * log('Debug: Expensive operation result: %j', expensiveOperation); + * }, 'i', 'Skipped expensive debug logging'); + * + * @property {function(function=): function} callback - Create a callback function for logging + * @example + * const logCallback = logger.callback((result) => { + * console.log('Operation completed with result:', result); + * }); + * someAsyncOperation(logCallback); + * + * @property {function(string, function=, function=): function} logdb - Create a callback function for logging database operations + * @example + * const dbCallback = logger.logdb('insert user', + * (result) => { console.log('User inserted:', result); }, + * (error) => { console.error('Failed to insert user:', error); } + * ); + * database.insertUser(userData, dbCallback); + * + * @property {function(string): Logger} sub - Create a sub-logger + * @example + * const subLogger = logger.sub('database'); + * subLogger.i('Connected to database'); + */ + +/** + * Creates a new logger object for the provided module + * @module api/utils/log + * @param {string} name - Name of the module + * @returns {Logger} Logger object + * @example + * const logger = require('./log.js')('myModule'); + * logger.i('MyModule initialized'); + */ module.exports = function(name) { setLevel(name, logLevel(name)); // console.log('Got level for ' + name + ': ' + levels[name] + ' ( prefs ', prefs); /** - * @class Logger - **/ + * @type Logger + **/ return { /** - * Get logger id - * @returns {string} id of this logger - */ + * Get logger id + * @returns {string} id of this logger + * @example + * const loggerId = logger.id(); + * console.log(`Current logger ID: ${loggerId}`); + */ id: () => name, /** - * Log debug level messages - * @memberof module:api/utils/log~Logger - * @param {...*} var_args - string and values to format string with - **/ + * Log debug level messages + * @param {...*} var_args - string and values to format string with + * @example + * logger.d('Debug message: %s', 'Some debug info'); + */ d: log(NAMES.d, name, getEnabledWithLevel(ACCEPTABLE.d, name), this, console.log), /** - * Log information level messages - * @memberof module:api/utils/log~Logger - * @param {...*} var_args - string and values to format string with - **/ + * Log information level messages + * @param {...*} var_args - string and values to format string with + * @example + * logger.i('Info message: User %s logged in', username); + */ i: log(NAMES.i, name, getEnabledWithLevel(ACCEPTABLE.i, name), this, console.info), /** - * Log warning level messages - * @memberof module:api/utils/log~Logger - * @param {...*} var_args - string and values to format string with - **/ + * Log warning level messages + * @param {...*} var_args - string and values to format string with + * @example + * logger.w('Warning: %d attempts failed', attempts); + */ w: log(NAMES.w, name, getEnabledWithLevel(ACCEPTABLE.w, name), this, console.warn, styles.stylers.warn), /** - * Log error level messages - * @memberof module:api/utils/log~Logger - * @param {...*} var_args - string and values to format string with - **/ + * Log error level messages + * @param {...*} var_args - string and values to format string with + * @example + * logger.e('Error occurred: %o', errorObject); + */ e: log(NAMES.e, name, getEnabledWithLevel(ACCEPTABLE.e, name), this, console.error, styles.stylers.error), /** * Log variable level messages (for cases when logging parameters calculation are expensive enough and shouldn't be done unless the level is enabled) - * @param {String} l log level (d, i, w, e) - * @param {function} fn function to call with single argument - logging function - * @param {String} fl fallback level if l is disabled - * @param {any[]} fargs fallback level arguments + * @param {string} l - log level (d, i, w, e) + * @param {function} fn - function to call with single argument - logging function + * @param {string} fl - fallback level if l is disabled + * @param {...*} fargs - fallback level arguments * @returns {boolean} true if f() has been called + * @example + * logger.f('d', (log) => { + * const expensiveOperation = performExpensiveCalculation(); + * log('Debug: Expensive operation result: %j', expensiveOperation); + * }, 'i', 'Skipped expensive debug logging'); */ f: function(l, fn, fl, ...fargs) { if (ACCEPTABLE[l].indexOf(levels[name] || deflt) !== -1) { @@ -338,11 +405,15 @@ module.exports = function(name) { }, /** - * Logging inside callbacks - * @memberof module:api/utils/log~Logger - * @param {function=} next - next function to call, after callback executed - * @returns {function} function to pass as callback - **/ + * Logging inside callbacks + * @param {function=} next - next function to call, after callback executed + * @returns {function} function to pass as callback + * @example + * const logCallback = logger.callback((result) => { + * console.log('Operation completed with result:', result); + * }); + * someAsyncOperation(logCallback); + */ callback: function(next) { var self = this; return function(err) { @@ -356,13 +427,18 @@ module.exports = function(name) { }; }, /** - * Logging database callbacks - * @memberof module:api/utils/log~Logger - * @param {string} opname - name of the performed operation - * @param {function=} next - next function to call, after callback executed - * @param {function=} nextError - function to pass error to - * @returns {function} function to pass as callback - **/ + * Logging database callbacks + * @param {string} opname - name of the performed operation + * @param {function=} next - next function to call, after callback executed + * @param {function=} nextError - function to pass error to + * @returns {function} function to pass as callback + * @example + * const dbCallback = logger.logdb('insert user', + * (result) => { console.log('User inserted:', result); }, + * (error) => { console.error('Failed to insert user:', error); } + * ); + * database.insertUser(userData, dbCallback); + */ logdb: function(opname, next, nextError) { var self = this; return function(err) { @@ -382,9 +458,13 @@ module.exports = function(name) { }, /** * Add one more level to the logging output while leaving loglevel the same - * @param {string} subname sublogger name - * @returns {object} new logger + * @param {string} subname - sublogger name + * @returns {Logger} new logger + * @example + * const subLogger = logger.sub('database'); + * subLogger.i('Connected to database'); */ + sub: function(subname) { let full = name + ':' + subname, self = this; diff --git a/api/utils/requestProcessor.js b/api/utils/requestProcessor.js index 72e0642e391..d4786939a2e 100755 --- a/api/utils/requestProcessor.js +++ b/api/utils/requestProcessor.js @@ -299,7 +299,7 @@ const processRequest = (params) => { common.returnMessage(params, 400, 'Invalid parameter "requests"'); return false; } - if (!plugins.getConfig("api", params.app && params.app.plugins, true).safe && !params.res.finished) { + if (!params.qstring.safe_api_response && !plugins.getConfig("api", params.app && params.app.plugins, true).safe && !params.res.finished) { common.returnMessage(params, 200, 'Success'); } common.blockResponses(params); @@ -1824,6 +1824,9 @@ const processRequest = (params) => { switch (paths[3]) { case 'all': validateRead(params, 'core', () => { + if (!params.qstring.query) { + params.qstring.query = {}; + } if (typeof params.qstring.query === "string") { try { params.qstring.query = JSON.parse(params.qstring.query); @@ -1864,6 +1867,9 @@ const processRequest = (params) => { break; case 'count': validateRead(params, 'core', () => { + if (!params.qstring.query) { + params.qstring.query = {}; + } if (typeof params.qstring.query === "string") { try { params.qstring.query = JSON.parse(params.qstring.query); @@ -1896,6 +1902,9 @@ const processRequest = (params) => { break; case 'list': validateRead(params, 'core', () => { + if (!params.qstring.query) { + params.qstring.query = {}; + } if (typeof params.qstring.query === "string") { try { params.qstring.query = JSON.parse(params.qstring.query); @@ -2121,8 +2130,16 @@ const processRequest = (params) => { dbUserHasAccessToCollection(params, params.qstring.collection, (hasAccess) => { if (hasAccess) { + var dbs = { countly: common.db, countly_drill: common.drillDb, countly_out: common.outDb, countly_fs: countlyFs.gridfs.getHandler() }; + var db = ""; + if (params.qstring.db && dbs[params.qstring.db]) { + db = dbs[params.qstring.db]; + } + else { + db = common.db; + } countlyApi.data.exports.fromDatabase({ - db: (params.qstring.db === "countly_drill") ? common.drillDb : (params.qstring.dbs === "countly_drill") ? common.drillDb : common.db, + db: db, params: params, collection: params.qstring.collection, query: params.qstring.query, @@ -3184,7 +3201,7 @@ const processBulkRequest = (i, requests, params) => { const appKey = params.qstring.app_key; if (i === requests.length) { common.unblockResponses(params); - if (plugins.getConfig("api", params.app && params.app.plugins, true).safe && !params.res.finished) { + if (params.qstring.safe_api_response || plugins.getConfig("api", params.app && params.app.plugins, true).safe && !params.res.finished) { common.returnMessage(params, 200, 'Success'); } return; @@ -3193,9 +3210,10 @@ const processBulkRequest = (i, requests, params) => { if (!requests[i] || (!requests[i].app_key && !appKey)) { return processBulkRequest(i + 1, requests, params); } - + if (params.qstring.safe_api_response) { + requests[i].safe_api_response = true; + } params.req.body = JSON.stringify(requests[i]); - const tmpParams = { 'app_id': '', 'app_cc': '', @@ -3364,13 +3382,13 @@ function validateRedirect(ob) { log.e("Redirect error", error, body, opts, app, params); } - if (plugins.getConfig("api", params.app && params.app.plugins, true).safe) { + if (plugins.getConfig("api", params.app && params.app.plugins, true).safe || params.qstring?.safe_api_response) { common.returnMessage(params, code, message); } }); params.cancelRequest = "Redirected: " + app.redirect_url; params.waitForResponse = false; - if (plugins.getConfig("api", params.app && params.app.plugins, true).safe) { + if (plugins.getConfig("api", params.app && params.app.plugins, true).safe || params.qstring?.safe_api_response) { params.waitForResponse = true; } return false; diff --git a/api/utils/rights.js b/api/utils/rights.js index 8b77791bd28..6cb3024ff6e 100644 --- a/api/utils/rights.js +++ b/api/utils/rights.js @@ -55,7 +55,7 @@ function validate_token_if_exists(params) { * Additionally populates params with member information and app information. * @param {params} params - {@link params} object * @param {function} callback - function to call only if validation passes -* @param {any} callbackParam - parameter to pass to callback function (params is automatically passed to callback function, no need to include that) +* @param {any=} callbackParam - parameter to pass to callback function (params is automatically passed to callback function, no need to include that) * @returns {Promise} promise */ exports.validateUserForRead = function(params, callback, callbackParam) { @@ -151,7 +151,7 @@ exports.validateUserForRead = function(params, callback, callbackParam) { * Additionally populates params with member information and app information. * @param {params} params - {@link params} object * @param {function} callback - function to call only if validation passes -* @param {any} callbackParam - parameter to pass to callback function (params is automatically passed to callback function, no need to include that) +* @param {any=} callbackParam - parameter to pass to callback function (params is automatically passed to callback function, no need to include that) * @returns {Promise} promise */ exports.validateUserForWrite = function(params, callback, callbackParam) { @@ -240,7 +240,7 @@ exports.validateUserForWrite = function(params, callback, callbackParam) { * Additionally populates params with member information. * @param {params} params - {@link params} object * @param {function} callback - function to call only if validation passes -* @param {any} callbackParam - parameter to pass to callback function (params is automatically passed to callback function, no need to include that) +* @param {any=} callbackParam - parameter to pass to callback function (params is automatically passed to callback function, no need to include that) * @returns {Promise} promise */ exports.validateGlobalAdmin = function(params, callback, callbackParam) { @@ -311,7 +311,7 @@ exports.validateGlobalAdmin = function(params, callback, callbackParam) { * Additionally populates params with member information. * @param {params} params - {@link params} object * @param {function} callback - function to call only if validation passes -* @param {any} callbackParam - parameter to pass to callback function (params is automatically passed to callback function, no need to include that) +* @param {any=} callbackParam - parameter to pass to callback function (params is automatically passed to callback function, no need to include that) * @returns {Promise} promise */ exports.validateAppAdmin = function(params, callback, callbackParam) { @@ -389,7 +389,7 @@ exports.validateAppAdmin = function(params, callback, callbackParam) { * Additionally populates params with member information. * @param {params} params - {@link params} object * @param {function} callback - function to call only if validation passes -* @param {any} callbackParam - parameter to pass to callback function (params is automatically passed to callback function, no need to include that) +* @param {any=} callbackParam - parameter to pass to callback function (params is automatically passed to callback function, no need to include that) * @returns {Promise} promise */ exports.validateUser = function(params, callback, callbackParam) { @@ -458,7 +458,7 @@ exports.validateUser = function(params, callback, callbackParam) { * Wrap callback using promise * @param {params} params - {@link params} object * @param {function} callback - function to call only if validation passes -* @param {any} callbackParam - parameter to pass to callback function +* @param {any=} callbackParam - parameter to pass to callback function * @param {function} func - promise function * @returns {Promise} promise */ @@ -794,7 +794,7 @@ exports.dbUserHasAccessToCollection = function(params, collection, app_id, callb * @param {params} params - {@link params} object * @param {string} feature - feature that trying to access * @param {function} callback - function to call only if validation passes -* @param {any} callbackParam - parameter to pass to callback function (params is automatically passed to callback function, no need to include that) +* @param {any=} callbackParam - parameter to pass to callback function (params is automatically passed to callback function, no need to include that) * @returns {Promise} promise */ exports.validateRead = function(params, feature, callback, callbackParam) { @@ -947,7 +947,7 @@ exports.validateRead = function(params, feature, callback, callbackParam) { * @param {string} feature - feature that trying to access * @param {string} accessType - required access type for related request (c: create, u: update and d: delete) * @param {function} callback - function to call only if validation passes -* @param {any} callbackParam - parameter to pass to callback function (params is automatically passed to callback function, no need to include that) +* @param {any=} callbackParam - parameter to pass to callback function (params is automatically passed to callback function, no need to include that) * @returns {Promise} promise */ function validateWrite(params, feature, accessType, callback, callbackParam) { @@ -1089,7 +1089,7 @@ function validateWrite(params, feature, accessType, callback, callbackParam) { * @param {params} params - {@link params} object * @param {string} feature - feature that trying to access * @param {function} callback - function to call only if validation passes -* @param {any} callbackParam - parameter to pass to callback function (params is automatically passed to callback function, no need to include that) +* @param {any=} callbackParam - parameter to pass to callback function (params is automatically passed to callback function, no need to include that) */ exports.validateCreate = function(params, feature, callback, callbackParam) { validateWrite(params, feature, 'c', callback, callbackParam); @@ -1100,7 +1100,7 @@ exports.validateCreate = function(params, feature, callback, callbackParam) { * @param {params} params - {@link params} object * @param {string} feature - feature that trying to access * @param {function} callback - function to call only if validation passes -* @param {any} callbackParam - parameter to pass to callback function (params is automatically passed to callback function, no need to include that) +* @param {any=} callbackParam - parameter to pass to callback function (params is automatically passed to callback function, no need to include that) */ exports.validateUpdate = function(params, feature, callback, callbackParam) { validateWrite(params, feature, 'u', callback, callbackParam); @@ -1111,7 +1111,7 @@ exports.validateUpdate = function(params, feature, callback, callbackParam) { * @param {params} params - {@link params} object * @param {string} feature - feature that trying to access * @param {function} callback - function to call only if validation passes -* @param {any} callbackParam - parameter to pass to callback function (params is automatically passed to callback function, no need to include that) +* @param {any=} callbackParam - parameter to pass to callback function (params is automatically passed to callback function, no need to include that) */ exports.validateDelete = function(params, feature, callback, callbackParam) { validateWrite(params, feature, 'd', callback, callbackParam); diff --git a/api/utils/taskmanager.js b/api/utils/taskmanager.js index 8be6a3cfc6f..d5d703499c8 100644 --- a/api/utils/taskmanager.js +++ b/api/utils/taskmanager.js @@ -607,6 +607,7 @@ taskmanager.checkResult = function(options, callback) { * @param {funciton} callback - callback for the result */ taskmanager.checkIfRunning = function(options, callback) { + options = options || {}; options.db = options.db || common.db; var query = {}; if (options.id) { @@ -982,6 +983,7 @@ taskmanager.rerunTask = function(options, callback) { reqData = {}; } if (reqData.uri) { + reqData.json = reqData.json || {}; reqData.json.task_id = options.id; reqData.strictSSL = false; if (reqData.json && reqData.json.period && Array.isArray(reqData.json.period)) { diff --git a/bin/countly.install_rhel.sh b/bin/countly.install_rhel.sh index 2fbd19bcee8..a413c74ef63 100644 --- a/bin/countly.install_rhel.sh +++ b/bin/countly.install_rhel.sh @@ -60,7 +60,7 @@ sudo dnf install -y alsa-lib.x86_64 atk.x86_64 cups-libs.x86_64 gtk3.x86_64 libX sudo dnf update -y nss #install nodejs -sudo dnf module install -y nodejs:18/common +sudo dnf module install -y nodejs:20/common set +e NODE_JS_CMD=$(which nodejs) diff --git a/bin/countly.install_ubuntu.sh b/bin/countly.install_ubuntu.sh index b2719be2ebe..ffae84b7186 100644 --- a/bin/countly.install_ubuntu.sh +++ b/bin/countly.install_ubuntu.sh @@ -58,7 +58,7 @@ sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg sudo mkdir -p /etc/apt/keyrings curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg -NODE_MAJOR=18 +NODE_MAJOR=20 echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list sudo apt-get update sudo apt-get install nodejs -y diff --git a/bin/scripts/data-cleanup/delete_old_views.js b/bin/scripts/data-cleanup/delete_old_views.js index 9441222e845..dc0c54d40e3 100644 --- a/bin/scripts/data-cleanup/delete_old_views.js +++ b/bin/scripts/data-cleanup/delete_old_views.js @@ -90,8 +90,9 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" let view = await cursor.next(); //Find one drill entry for the view with timestamp greater than expiration date var drillEntry = await drillSession.client.db("countly_drill").collection(collectionName).findOne({"sg.name": view.view, "ts": { $gt: expiration_timestamp }}, {ts: 1}); + var drillEntry2 = await drillSession.client.db("countly_drill").collection("drill_events").findOne({"a": app._id + "", "e": event, "sg.name": view.view, "ts": { $gt: expiration_timestamp }}, {ts: 1}); //If no entry found, delete the view - if (!drillEntry) { + if (!drillEntry && !drillEntry2) { console.log("Deleting view: ", view.view); if (!DRY_RUN) { await new Promise(function(resolve) { diff --git a/bin/scripts/data-cleanup/remove_old_crashes_sync.js b/bin/scripts/data-cleanup/remove_old_crashes_sync.js index 5ee3ae43911..63472717e5d 100644 --- a/bin/scripts/data-cleanup/remove_old_crashes_sync.js +++ b/bin/scripts/data-cleanup/remove_old_crashes_sync.js @@ -67,6 +67,9 @@ Promise.all( count = await drillDb.collection("drill_events" + crypto.createHash('sha1').update("[CLY]_crash" + app._id).digest('hex')).countDocuments({ ts: { $lt: lastUnixTimestamp * 1000 } }); console.log("", count, "drill crashes to be deleted via command"); console.log("", "", "", `db.drill_events${crypto.createHash('sha1').update("[CLY]_crash" + app._id).digest('hex')}.deleteMany({ ts: { $lt: ${lastUnixTimestamp * 1000} } })`); + var count2 = await drillDb.collection("drill_events").countDocuments({"a": app._id + "", "e": "[CLY]_crash", ts: { $lt: lastUnixTimestamp * 1000 } }); + console.log("", count2, "drill crashes to be deleted via command"); + console.log("", "", "", `db.drill_events.deleteMany({"a": ${app._id}, "e": "[CLY]_crash", ts: { $lt: ${lastUnixTimestamp * 1000} } })`); checkThreshold(count); } else { @@ -77,8 +80,12 @@ Promise.all( res = await db.collection(`app_crashes${app._id}`).deleteMany({ ts: { $lt: lastUnixTimestamp } }); console.log("", res, "crashes deleted"); await sleep(SLEEP); + //deleting from old collection res = await drillDb.collection("drill_events" + crypto.createHash('sha1').update("[CLY]_crash" + app._id).digest('hex')).deleteMany({ ts: { $lt: lastUnixTimestamp * 1000 } }); console.log("", res, "drill crashes deleted"); + //deleting from amerged drill collection + res = await drillDb.collection("drill_events").deleteMany({"a": app._id + "", "e": "[CLY]_crash", ts: { $lt: lastUnixTimestamp * 1000 } }); + console.log("", res, "drill crashes deleted"); await sleep(SLEEP); } } diff --git a/bin/scripts/data-cleanup/remove_old_events_collections.js b/bin/scripts/data-cleanup/remove_old_events_collections.js new file mode 100644 index 00000000000..d27469e0d4c --- /dev/null +++ b/bin/scripts/data-cleanup/remove_old_events_collections.js @@ -0,0 +1,70 @@ +/* +Script to delete events collections after migrating to single collection +!! DO NOT RUN IT BEFORE MAKING SURE DATA IS MIGRATED TO SINGLE COLLECTION !! + + Path: $(countly dir)/bin/scripts/data-cleanup +To run this script use the following command +node /remove_old_events_collections.js +*/ +var pluginManager = require('../../../plugins/pluginManager.js'); + +var force = true; //if set to false will skip event collections which do not show up as migrated +if (force === false) { + console.log("Script will skip all collections without migration flag. If there are any collections which were skipped in migration because they could not be associated with any app - those will not be deleted. Safe approach is to run merging again and compare skipped collection list with collections not deleted by this scrip."); +} +console.log("Removing old Events collections"); +var failedCn = 0; +pluginManager.dbConnection().then(async(countlyDb) => { + //get list with all collections + try { + let allCollections = await countlyDb.listCollections().toArray(); + let collectionNames = allCollections.map(o => o.name); + + for (var z = 0; z < collectionNames.length; z++) { + if (collectionNames[z].indexOf("events") === 0 && collectionNames[z].length > 16) { + if (force) { + console.log("Dropping collection: " + collectionNames[z]); + await countlyDb.collection(collectionNames[z]).drop(); + } + else { + await new Promise((resolve) => { + countlyDb.collection(collectionNames[z]).findOne({"merged": {"$ne": true}}, {"_id": 1}, function(err, res) { + if (err) { + console.log(err); + failedCn++; + resolve(); + } + else { + if (res) { + console.log("Collection not migrated: " + collectionNames[z]); + failedCn++; + resolve(); + } + else { + countlyDb.collection(collectionNames[z]).drop(function(err) { + if (err) { + console.log(err); + failedCn++; + } + resolve(); + }); + } + } + }); + }); + } + } + } + } + catch (error) { + console.log(`Error removing old events collections: ${error}`); + countlyDb.close(); + } + finally { + if (failedCn > 0) { + console.log("Failed to remove collections: ", failedCn); + } + console.log("Done"); + countlyDb.close(); + } +}); \ No newline at end of file diff --git a/bin/scripts/data-reports/check_comparison_report.js b/bin/scripts/data-reports/check_comparison_report.js new file mode 100644 index 00000000000..f47138e3e3c --- /dev/null +++ b/bin/scripts/data-reports/check_comparison_report.js @@ -0,0 +1,35 @@ +//Script to look for meaningful differences in drill vs aggregated data. +var data = {"601ba83d99111111d9": {"name": "My Good test APP", "total": 25, "bad": 0}, "6026972d182f7e014cd82114": {"name": "My BAD APP", "total": 100, "bad": 2, "events": {"BAD EVENT": {"e": "BAD EVENT", "report": {"totals": {"c": 1000}, "data": {"2024.10.2": {"c": 1000, "s": 0, "dur": -9.094947017729282e-13}}}}}}}; //output of compare_drill_aggregated.js script + +//Should be adjusted based on data amount. +var total_treshold = 100; //If modulus daily value is bigger than this, it will be autputted +var daily_treshold = 50; //If for any day any value is biiger that this - it will be outputted. + +for (var appid in data) { + if (data[appid].bad > 0) { + for (var event in data[appid].events) { + var is_any_total_bad = false; + for (var m in data[appid].events[event].report.totals) { + if (data[appid].events[event].report.totals[m] > total_treshold || data[appid].events[event].report.totals[m] < -1 * total_treshold) { + is_any_total_bad = true; + } + } + if (is_any_total_bad) { + console.log("total difference in APP:" + appid + " for event " + event + " " + JSON.stringify(data[appid].events[event].report.totals)); + + for (var date in data[appid].events[event].report.data) { + var is_any_bad = false; + for (var m2 in data[appid].events[event].report.data[date]) { + if (data[appid].events[event].report.data[date][m2] > daily_treshold || data[appid].events[event].report.data[date][m2] < daily_treshold * -1) { + is_any_bad = true; + } + } + if (is_any_bad) { + console.log(" " + date + " : " + JSON.stringify(data[appid].events[event].report.data[date])); + } + } + + } + } + } +} \ No newline at end of file diff --git a/bin/scripts/data-reports/check_user_mismatch.js b/bin/scripts/data-reports/check_user_mismatch.js index b0504547452..d4e30b09d26 100644 --- a/bin/scripts/data-reports/check_user_mismatch.js +++ b/bin/scripts/data-reports/check_user_mismatch.js @@ -14,17 +14,25 @@ var query = {"ts": {"$gt": 1709762400000}}; //Change this query to set date rang var eventKey = "[CLY]_session"; //Write in your event key var appID = "6075f94b7e5e0d392902520c"; //Write in YOUR app ID +var union_with_old_collection = false; //False if all sessions are stored in drill_events collection + console.log("Running for:" + appID + " " + eventKey + " " + JSON.stringify(query)); Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection("countly_drill")]).then(async function([countlyDb, drillDb]) { var pipeline = []; - pipeline.push({"$match": query}); - pipeline.push({"$group": {"_id": null, "uid": {"$addToSet": "$uid"}}}); + var query2 = JSON.parse(JSON.stringify(query)); + query2.e = eventKey; + query2.a = appID; + pipeline.push({"$match": query2}); - var collection = "drill_events" + crypto.createHash('sha1').update(eventKey + appID).digest('hex'); + if (union_with_old_collection) { + var collection = "drill_events" + crypto.createHash('sha1').update(eventKey + appID).digest('hex'); + pipeline.push({"$unionWith": { "coll": collection, "pipeline": [{"$match": query}] }}); + } + pipeline.push({"$group": {"_id": null, "uid": {"$addToSet": "$uid"}}}); - drillDb.collection(collection).aggregate(pipeline, function(err, res) { + drillDb.collection("drill_events").aggregate(pipeline, function(err, res) { if (err) { console.log(err); countlyDb.close(); @@ -67,6 +75,9 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" console.log("Users missing in app_users collection: " + missingOnes.length); console.log(JSON.stringify(missingOnes)); } + else { + console.log("All users matched"); + } countlyDb.close(); drillDb.close(); diff --git a/bin/scripts/data-reports/compare_drill_aggregated.js b/bin/scripts/data-reports/compare_drill_aggregated.js new file mode 100644 index 00000000000..6a16af89c9d --- /dev/null +++ b/bin/scripts/data-reports/compare_drill_aggregated.js @@ -0,0 +1,262 @@ +/* + * Script compares aggregated data from events collection with drill data for given period. + * Place script ins + * {countly}/bin/scripts/data-reports/compare_drill_aggregated.js + * + * Usage: + * node compare_drill_aggregated.js +*/ +var period = "7days"; //Chose any of formats: "Xdays" ("7days","100days") or ["1-1-2024", "1-10-2024"], +var app_list = []; //List with apps +//Example var eventMap = {"6075f94b7e5e0d392902520c":["Logout","Login"],"6075f94b7e5e0d392902520d":["Logout","Login","Buy"]}; +var eventMap = {}; //If left empty will run for all alls/events. +var verbose = false; //true to show more output + + +const Promise = require("bluebird"); +const crypto = require("crypto"); +var pluginManager = require("../../../plugins/pluginManager"); +var fetch = require("../../../api/parts/data/fetch.js"); +var countlyCommon = require("../../../api/lib/countly.common.js"); +var common = require("../../../api/utils/common.js"); +var moment = require("moment"); + +var endReport = {}; + +console.log("Script compares numbers in aggregated data with drill data for given period."); +Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection("countly_drill")]).then(async function([countlyDb, drillDb]) { + common.db = countlyDb; + console.log("Connected to databases..."); + getAppList({db: countlyDb}, function(err, apps) { + if (!apps || !apps.length) { + console.log("No apps found"); + return close(); + } + else { + console.log("Apps found:", apps.length); + Promise.each(apps, function(app) { + return new Promise(function(resolve, reject) { + console.log("Processing app: ", app.name); + countlyDb.collection("events").findOne({_id: app._id}, {'list': 1}, function(err, events) { + if (err) { + console.log("Error getting events: ", err); + reject(); + } + else { + events = events || {}; + events.list = events.list || []; + events.list = events.list.filter(function(ee) { + if (ee.indexOf("[CLY]_") === 0) { + return false; + } + else { + return true; + } + }); + + if (eventMap && eventMap[app._id + ""]) { + var listBF = events.list.length; + events.list = events.list.filter(function(ee) { + if (eventMap && eventMap[app._id + ""]) { + return eventMap[app._id + ""].indexOf(ee) > -1; + } + else { + return false; + } + }); + if (events.list.length != listBF) { + console.log(" Filtered events based on eventMap: ", events.list.length, " from ", listBF); + } + + } + if (events && events.list && events.list.length) { + endReport[app._id] = {"name": app.name, "total": events.list.length, "bad": 0}; + Promise.each(events.list, function(event) { + return new Promise(function(resolve2, reject2) { + console.log(" Processing event: ", event); + var params = { + app_id: app._id + "", + appTimezone: app.timezone, + qstring: { period: period}, + time: common.initTimeObj(app.timezone, Date.now().valueOf()) + }; + + //fetch drill data + var periodObject = countlyCommon.getPeriodObj({"appTimezone": app.timezone, "qstring": {"period": period}}); + getDataFromDrill({event: event, app_id: app._id + "", timezone: app.timezone, drillDb: drillDb, periodObj: periodObject}, function(err, drillData) { + if (err) { + console.log(" Error getting drill data: ", err); + reject2(); + } + else { + if (verbose) { + console.log(" Drill data loaded"); + console.log(JSON.stringify(drillData)); + } + //fetch aggregated data + var collectionName = "events" + crypto.createHash('sha1').update(event + app._id).digest('hex'); + + fetch.getTimeObjForEvents(collectionName, params, null, function(data) { + var mergedData = {}; + var totals = {"c": 0, "s": 0, "dur": 0}; + for (var z0 = 0; z0 < periodObject.currentPeriodArr.length; z0++) { + var date = periodObject.currentPeriodArr[z0].split("."); + if (data && data[date[0]] && data[date[0]][date[1]] && data[date[0]][date[1]][date[2]]) { + mergedData[periodObject.currentPeriodArr[z0]] = {}; + mergedData[periodObject.currentPeriodArr[z0]].c = data[date[0]][date[1]][date[2]].c || 0; + mergedData[periodObject.currentPeriodArr[z0]].s = data[date[0]][date[1]][date[2]].s || 0; + mergedData[periodObject.currentPeriodArr[z0]].dur = data[date[0]][date[1]][date[2]].dur || 0; + totals.c += data[date[0]][date[1]][date[2]].c || 0; + totals.s += data[date[0]][date[1]][date[2]].s || 0; + totals.dur += data[date[0]][date[1]][date[2]].dur || 0; + } + } + if (verbose) { + console.log(" Aggregated data loaded"); + console.log(JSON.stringify(mergedData)); + } + var report = {"totals": {}, "data": {}}; + var haveAnything = false; + for (var key in totals) { + if (totals[key] != drillData.totals[key]) { + report.totals[key] = (totals[key] || 0) - (drillData.totals[key] || 0); + haveAnything = true; + } + } + for (var z = 0; z < periodObject.currentPeriodArr.length; z++) { + if (drillData.data[periodObject.currentPeriodArr[z]]) { + if (mergedData[periodObject.currentPeriodArr[z]]) { + var diff = {}; + for (var key0 in mergedData[periodObject.currentPeriodArr[z]]) { + diff[key0] = (mergedData[periodObject.currentPeriodArr[z]][key0] || 0) - (drillData.data[periodObject.currentPeriodArr[z]][key0] || 0); + } + if (diff.c || diff.s || diff.dur) { + report.data[periodObject.currentPeriodArr[z]] = diff; + haveAnything = true; + } + } + else { + report.data[periodObject.currentPeriodArr[z]] = {}; + report.data[periodObject.currentPeriodArr[z]].c = -1 * drillData.data[periodObject.currentPeriodArr[z]].c; + report.data[periodObject.currentPeriodArr[z]].s = -1 * drillData.data[periodObject.currentPeriodArr[z]].s; + report.data[periodObject.currentPeriodArr[z]].dur = -1 * drillData.data[periodObject.currentPeriodArr[z]].dur; + haveAnything; + } + } + else { + if (mergedData[periodObject.currentPeriodArr[z]]) { + report.data[periodObject.currentPeriodArr[z]] = mergedData[periodObject.currentPeriodArr[z]]; + haveAnything = true; + } + } + } + if (haveAnything) { + console.log(" " + JSON.stringify(report)); + endReport[app._id]["bad"]++; + endReport[app._id]["events"] = endReport[app._id]["events"] || {}; + endReport[app._id]["events"][event] = {"e": event, report: report}; + } + resolve2(); + }); + } + }); + }); + }).then(function() { + console.log("Finished processing app: ", app.name); + resolve(); + }).catch(function(eee) { + console.log("Error processing app: ", app.name); + console.log(eee); + reject(); + }); + } + else { + resolve(); + } + } + + }); + }); + + }).then(function() { + console.log("Finished"); + console.log(JSON.stringify(endReport)); + close(); + }).catch(function(eee) { + console.log("Error while fetching data"); + console.log(eee); + console.log("EXITING..."); + console.log(JSON.stringify(endReport)); + close(); + }); + } + }); + + function getDataFromDrill(options, callback) { + var tmpArr = options.periodObj.currentPeriodArr[0].split("."); + var startDate = moment(new Date(Date.UTC(parseInt(tmpArr[0]), parseInt(tmpArr[1]) - 1, parseInt(tmpArr[2])))); + if (options.timezone) { + startDate.tz(options.timezone); + } + startDate = startDate.valueOf() - startDate.utcOffset() * 60000; + + tmpArr = options.periodObj.currentPeriodArr[options.periodObj.currentPeriodArr.length - 1].split("."); + var endDate = moment(new Date(Date.UTC(parseInt(tmpArr[0]), parseInt(tmpArr[1]) - 1, parseInt(tmpArr[2])))).add(1, 'days'); + if (options.timezone) { + endDate.tz(options.timezone); + } + endDate = endDate.valueOf() - endDate.utcOffset() * 60000; + + let collection = "drill_events" + crypto.createHash('sha1').update(options.event + options.app_id).digest('hex'); + var query = {"ts": {"$gte": startDate, "$lt": endDate}}; + var pipeline = [ + {"$match": query}, + ]; + + pipeline.push({"$group": {"_id": "$d", "c": {"$sum": "$c"}, "s": {"$sum": "$s"}, "dur": {"$sum": "$dur"}}}); + options.drillDb.collection(collection).aggregate(pipeline, {"allowDiskUse": true}).toArray(function(err, data) { + if (err) { + console.log(err); + } + var result = {"data": {}, "totals": {"c": 0, "s": 0, "dur": 0}}; + if (data && data.length > 0) { + for (var z = 0; z < data.length; z++) { + var iid = data[z]._id.split(":").join("."); + if (options.periodObj.currentPeriodArr.indexOf(iid) !== -1) { + result.data[iid] = data[z]; + result.totals.c += data[z].c || 0; + result.totals.s += data[z].s || 0; + result.totals.dur += data[z].dur || 0; + } + } + } + callback(err, result); + }); + + } + + function close() { + countlyDb.close(); + drillDb.close(); + console.log("Done."); + } + + function getAppList(options, calllback) { + var query = {}; + if (app_list && app_list.length > 0) { + var listed = []; + for (var z = 0; z < app_list.length; z++) { + listed.push(options.db.ObjectID(app_list[z])); + } + query = {_id: {$in: listed}}; + } + options.db.collection("apps").find(query, {"name": 1, "timezone": 1}).toArray(function(err, apps) { + if (err) { + console.log("Error getting apps: ", err); + } + calllback(err, apps); + }); + + + } +}); diff --git a/bin/scripts/data-reports/drill_data_cd.js b/bin/scripts/data-reports/drill_data_cd.js index d87585618c1..440d23df3e0 100644 --- a/bin/scripts/data-reports/drill_data_cd.js +++ b/bin/scripts/data-reports/drill_data_cd.js @@ -7,16 +7,14 @@ */ //period to check -var startDate = new Date("2024-04-2T00:00:00"); -var endDate = new Date("2024-04-3T00:00:00"); +var startDate = new Date("2021-04-02T00:00:00"); +var endDate = new Date("2025-04-03T00:00:00"); var apps = []; //Put in your APP ID like ["3469834986y34968y206y2"] -var internal_events = []; -var verbose = true; - var Promise = require("bluebird"); -var crypto = require('crypto'); var pluginManager = require("../../../plugins/pluginManager"); +var results = {}; +var dates = {}; function output_data(dates, results) { var datesList = Object.keys(dates).sort(function(a, b) { @@ -70,80 +68,48 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" queryApps = {_id: {$in: apps}}; } - countlyDb.collection("apps").find(queryApps).toArray(function(err, apps) { + countlyDb.collection("apps").find(queryApps).toArray(function(err, apps2) { if (err) { console.log(err); countlyDb.close(); drillDb.close(); } else { - Promise.each(apps, function(app) { - console.log('------' + app.name + '------'); - return new Promise(function(resolve) { - var dates = {}; - var results = {}; - //fetch events list - countlyDb.collection("events").findOne({"_id": app._id}, {"list": 1}, function(err, events) { - events = events || []; - var list = events.list || []; - if (verbose) { - console.log(list.length + " events found"); - } - for (var z = 0; z < internal_events.length; z++) { - if (list.indexOf(internal_events[z]) === -1) { - list.push(internal_events[z]); - } + var query = {"cd": {"$gte": startDate, "$lt": endDate}}; + if (apps.length > 0) { + + var a = []; + for (var i = 0; i < apps2.length; i++) { + a.push(apps2[i]._id + ""); + } + query.a = {$in: a}; + } + var pipeline = [{"$match": query}, {"$group": {"_id": {"a": "$a", "e": "$e", "d": "$d"}, "c": {"$sum": 1}}}]; + drillDb.collection("drill_events").aggregate(pipeline, {"allowDiskUse": true}).toArray(function(err, data) { + if (err) { + console.log(err); + } + if (data && data.length > 0) { + results["_total"] = results["_total"] || {}; + + for (var z = 0; z < data.length; z++) { + var event = data[z]._id.e; + if (!dates[data[z]._id.d]) { + dates[data[z]._id.d] = true; } - Promise.each(list, function(event) { - return new Promise(function(resolve2) { - //get hashed drill collection name - let collection = "drill_events" + crypto.createHash('sha1').update(event + app._id).digest('hex'); - if (verbose) { - console.log(collection); - } - var pipeline = [ - {"$match": {"cd": {"$gte": startDate, "$lt": endDate}}}, - {"$group": {"_id": "$d", "c": {"$sum": 1}}} - ]; - drillDb.collection(collection).aggregate(pipeline, {"allowDiskUse": true}).toArray(function(err, data) { - if (err) { - console.log(err); - } - if (data.length > 0) { - results["_total"] = results["_total"] || {}; - results[event] = {}; - for (var z = 0; z < data.length; z++) { - if (!dates[data[z]._id]) { - dates[data[z]._id] = true; - } - results[event][data[z]._id] = data[z].c; - results["_total"][data[z]._id] = results["_total"][data[z]._id] || 0; - results["_total"][data[z]._id] += data[z].c || 0; - } - } - resolve2(); - }); - }); - }).then(function() { - //output - //sort dates - output_data(dates, results); - resolve(); - }).catch(function(err) { - output_data(dates, results); - console.log(err); - resolve(); - }); - }); - }); - }).then(function() { - countlyDb.close(); - drillDb.close(); - }).catch(function(err) { - console.log(err); + results[data[z]._id.e] = {}; + results[event][data[z]._id.d] = data[z].c; + results["_total"][data[z]._id.d] = results["_total"][data[z]._id.d] || 0; + results["_total"][data[z]._id.d] += data[z].c || 0; + } + output_data(dates, results); + } + countlyDb.close(); drillDb.close(); }); + + } }); }); diff --git a/bin/scripts/data-reports/old_scripts/drill_data_cd.js b/bin/scripts/data-reports/old_scripts/drill_data_cd.js new file mode 100644 index 00000000000..d87585618c1 --- /dev/null +++ b/bin/scripts/data-reports/old_scripts/drill_data_cd.js @@ -0,0 +1,149 @@ +/** + * Check for which dates data was recorded + * requires index on cd collections or else will be slower + * Server: countly + * Path: $(countly dir)/bin/scripts/data-reports + * Command: node drill_data_cd.js + */ + +//period to check +var startDate = new Date("2024-04-2T00:00:00"); +var endDate = new Date("2024-04-3T00:00:00"); +var apps = []; //Put in your APP ID like ["3469834986y34968y206y2"] + +var internal_events = []; +var verbose = true; + +var Promise = require("bluebird"); +var crypto = require('crypto'); +var pluginManager = require("../../../plugins/pluginManager"); + +function output_data(dates, results) { + var datesList = Object.keys(dates).sort(function(a, b) { + var d1 = a.split(":"); + var d2 = b.split(":"); + for (var z = 0; z < d1.length; z++) { + d1[z] = parseInt(d1[z]); + d2[z] = parseInt(d2[z]); + } + + for (var k = 0; k < d1.length; k++) { + if (d1[k] > d2[k]) { + return 1; + } + else if (d1[k] < d2[k]) { + return -1; + } + } + return 1; + + }); + //output header line + console.log("Event," + datesList.join(",")); + for (var key in results) { + if (key !== "_total") { + var line = key; + for (var z = 0; z < datesList.length; z++) { + line += "," + (results[key][datesList[z]] || 0); + } + console.log(line); + } + //output total + + + + } + var line2 = "Total"; + for (var z1 = 0; z1 < datesList.length; z1++) { + line2 += "," + (results["_total"][datesList[z1]] || 0); + } + console.log(line2); + +} +Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection("countly_drill")]).then(async function([countlyDb, drillDb]) { + //get apps + var queryApps = {}; + if (apps && apps.length) { + for (var z = 0; z < apps.length; z++) { + apps[z] = countlyDb.ObjectID(apps[z]); + } + queryApps = {_id: {$in: apps}}; + } + + countlyDb.collection("apps").find(queryApps).toArray(function(err, apps) { + if (err) { + console.log(err); + countlyDb.close(); + drillDb.close(); + } + else { + Promise.each(apps, function(app) { + console.log('------' + app.name + '------'); + return new Promise(function(resolve) { + var dates = {}; + var results = {}; + //fetch events list + countlyDb.collection("events").findOne({"_id": app._id}, {"list": 1}, function(err, events) { + events = events || []; + var list = events.list || []; + if (verbose) { + console.log(list.length + " events found"); + } + for (var z = 0; z < internal_events.length; z++) { + if (list.indexOf(internal_events[z]) === -1) { + list.push(internal_events[z]); + } + } + Promise.each(list, function(event) { + return new Promise(function(resolve2) { + //get hashed drill collection name + let collection = "drill_events" + crypto.createHash('sha1').update(event + app._id).digest('hex'); + if (verbose) { + console.log(collection); + } + var pipeline = [ + {"$match": {"cd": {"$gte": startDate, "$lt": endDate}}}, + {"$group": {"_id": "$d", "c": {"$sum": 1}}} + ]; + drillDb.collection(collection).aggregate(pipeline, {"allowDiskUse": true}).toArray(function(err, data) { + if (err) { + console.log(err); + } + if (data.length > 0) { + results["_total"] = results["_total"] || {}; + results[event] = {}; + for (var z = 0; z < data.length; z++) { + if (!dates[data[z]._id]) { + dates[data[z]._id] = true; + } + results[event][data[z]._id] = data[z].c; + results["_total"][data[z]._id] = results["_total"][data[z]._id] || 0; + results["_total"][data[z]._id] += data[z].c || 0; + } + } + resolve2(); + }); + }); + }).then(function() { + //output + //sort dates + output_data(dates, results); + resolve(); + }).catch(function(err) { + output_data(dates, results); + console.log(err); + resolve(); + }); + }); + }); + }).then(function() { + countlyDb.close(); + drillDb.close(); + }).catch(function(err) { + console.log(err); + countlyDb.close(); + drillDb.close(); + }); + } + }); +}); diff --git a/bin/scripts/data-reports/event_list_no_data.js b/bin/scripts/data-reports/old_scripts/event_list_no_data.js similarity index 100% rename from bin/scripts/data-reports/event_list_no_data.js rename to bin/scripts/data-reports/old_scripts/event_list_no_data.js diff --git a/bin/scripts/device_list/amazon.json b/bin/scripts/device_list/amazon.json index a080bb7d96a..b7ed445d6f8 100644 --- a/bin/scripts/device_list/amazon.json +++ b/bin/scripts/device_list/amazon.json @@ -3,6 +3,7 @@ "KFSNWI":"Fire Max 11 (2023, 13th Gen)", "KFRAWI (2GB)":"Fire HD 8 (2022, 2GB)", "KFRAPWI (3GB)":"Fire HD 8 (2022, 3GB)", + "KFRAPWI (4GB)":"Fire HD 8 (2024, 4GB)", "KFQUWI": "Fire 7 (2022)", "KFTRWI (3GB)":"Fire HD 10 (2021, 3GB)", "KFTRPWI (4GB)":"Fire HD 10 (2021, 4GB)", @@ -52,8 +53,9 @@ "AFTTIFF55":"Onida HD/FHD - Fire TV (2020)", "AFTSHN02":"TCL 32 FHD, 40 FHD Fire TV (2023)", "AFTMD002":"TCL Class S3 1080p LED Smart TV with Fire TV (2023)", - "AFTMD001":"Fire TV - TCL Q6 4K QLED HDR (2023)", + "AFTMA475B1":"TCL 4K Smart Fire TV (2024)", "AFTMD001":"Fire TV - TCL S4 Series 4K UHD HDR LED (2023)", + "AFTDEC012E":"Fire TV - TCL S4/S5/Q5/Q6 Series 4K UHD HDR LED (2024)", "AFTKA002":"Fire TV 2-Series (2023)", "AFTKAUK002":"Fire TV 2-Series (2023)", "AFTHA004":"Toshiba 4K UHD - Fire TV (2022)", diff --git a/bin/scripts/device_list/apple.json b/bin/scripts/device_list/apple.json index 6c6011013b3..cddc12fa1e2 100644 --- a/bin/scripts/device_list/apple.json +++ b/bin/scripts/device_list/apple.json @@ -56,6 +56,10 @@ "iPhone15,5":"iPhone 15 Plus", "iPhone16,1":"iPhone 15 Pro", "iPhone16,2":"iPhone 15 Pro Max", + "iPhone17,1":"iPhone 16 Pro", + "iPhone17,2":"iPhone 16 Pro Max", + "iPhone17,3":"iPhone 16", + "iPhone17,4":"iPhone 16 Plus", "iPod1,1":"iPod touch 1G", "iPod2,1":"iPod touch 2G", "iPod3,1":"iPod touch 3G", diff --git a/bin/scripts/device_list/generate.js b/bin/scripts/device_list/generate.js index 0d67b6835fb..221b8cbef3e 100644 --- a/bin/scripts/device_list/generate.js +++ b/bin/scripts/device_list/generate.js @@ -1,5 +1,6 @@ // run as // node generate.js > countly.device.list.js +// resulting file should be copied to "/frontend/express/public/javascripts/countly" //https://www.theiphonewiki.com/wiki/Models //https://gist.github.com/adamawolf/3048717 @@ -15,11 +16,17 @@ var amazon = require("./amazon.json"); for (var i in amazon) { devices[i] = amazon[i]; } + +// Informative messages are writer to stderr so they don't interfere with the stdout piping to a file +// When downloading the CSV file it will be UTF-16 LE. It needs to be transformed to UTF-8 (non BOM version) +// converting with notepad++ or vscode might not work on a windows device. Try on a mac device +process.stderr.write("Starting CSV parsing\n"); var csv = require('csvtojson'); csv() //from https://support.google.com/googleplay/answer/1727131?hl=en-GB .fromFile("./supported_devices.csv") .on('json', (jsonObj)=>{ + //process.stderr.write("Parsed data/json line: " + jsonObj); var d = jsonObj["Marketing Name"] + ""; var i = jsonObj["Model"] + ""; if (i != d && d.trim().length) { @@ -33,6 +40,14 @@ csv() } } }) + // .on('data', (data)=>{ + // //process.stderr.write("Parsed data line: " + data); + // }) + // .on('error', (err)=>{ + // process.stderr.write("Error while parsing: " + err); + // }) .on('done', ()=>{ + process.stderr.write("CSV parsing 'done' trigger\n"); process.stdout.write("/**\n * Object with device models as keys and pretty/marketing device names as values\n * @name countlyDeviceList\n * @global\n * @namespace countlyDeviceList\n */\nvar countlyDeviceList = " + JSON.stringify(devices, null, 4) + ";\n/*global module*/\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = countlyDeviceList;\n}"); - }); \ No newline at end of file + }); +process.stderr.write("Ending CSV parsing\n"); \ No newline at end of file diff --git a/bin/scripts/device_list/supported_devices.csv b/bin/scripts/device_list/supported_devices.csv index ee02f713157..6358592b713 100644 --- a/bin/scripts/device_list/supported_devices.csv +++ b/bin/scripts/device_list/supported_devices.csv @@ -34,6 +34,7 @@ Retail Branding,Marketing Name,Device,Model 7mobile,Swegue 2,Swegue_2,Swegue 2 8849,TANK MINI 1,TANK_MINI_1,TANK MINI 1 8849,TANK2,TANK2,TANK2 +8849,TANK2pro,TANK2PRO,TANK 2 PRO 8849,TANK3,TANK3,TANK 3 9mobile,DM_T901,DM_T901,DM_T901 A.O.I. ELECTRONICS FACTORY,A.O.I.,TR10CS1_11,TR10CS1 @@ -44,6 +45,10 @@ A1,A1 Smart N9,VFD720,VFD 720 A1,A1-Smart-Box-DV9161,DV9161-KBA,A1-Smart-Box-DV9161 A1,ADT-3,adt3,ADT-3 A1,Ai-ES1059,Ai-ES1059,Ai-ES1059 +AAUW,M50,M50,M50 +AAUW,M50_NEW,M50_NEW,M50_NEW +AAUW,M60_NEW,M60_NEW,M60_NEW +AAUW,T10,T10,T10 AAUW,T50_2023,T50_2023,T50_2023 AAUW,T60PRO,T60PRO_ROW,T60PRO_ROW AAUW,T60Pro,T60Pro,T60Pro @@ -54,13 +59,19 @@ ABCTECH,PG11,PG11,PG11 ABCTECH,X20,X20,X20 ABCTECH,X20_Pro,X20_Pro,X20_Pro ABCTECH,X5,X5,X5 +ACD Computers,ACD-Tab-10S,ACD-Tab-10S,ACD-Tab-10S +ACE (Global),AS0124,BUZZ_5_Lite,BUZZ 5 Lite ACE (Global),AS0224,BUZZ_5_Prime,BUZZ 5 Prime +ACE (Global),AS0324,BUZZ_5_Note,BUZZ 5 Note ACE (Global),AS0623,BUZZ_4_Note,BUZZ 4 Note ACE (Global),BUZZ 3,BUZZ_3,BUZZ 3 ACE (Global),BUZZ 3 Plus,BUZZ_3_Plus,BUZZ 3 Plus ACE (Global),BUZZ 4,BUZZ_4,BUZZ 4 ACE (Global),BUZZ 4 Prime,BUZZ_4_Prime,BUZZ 4 Prime ACE (Global),BUZZ 4 Ultra,BUZZ_4_Ultra,BUZZ 4 Ultra +ACE (Global),BUZZ 5 Ultra,BUZZ_5_Ultra,BUZZ 5 Ultra +ACE (Global),BUZZ 6 Prime,BUZZ_6_Prime,BUZZ 6 Prime +ACE (Global),BUZZ 6 Pro PLUS,BUZZ_6_Pro_PLUS,BUZZ 6 Pro PLUS ACE (Global),CLEVER 3,CLEVER_3,CLEVER 3 ACE (Global),URBAN 3,URBAN_3,URBAN 3 ACE (Global),URBAN 3 Plus,URBAN_3_PlusE,URBAN 3 Plus @@ -73,6 +84,8 @@ ACE France,BUZZ 3 Lite,BUZZ_3_Lite,BUZZ 3 Lite ACE France,BUZZ 4Lite,BUZZ_4Lite,BUZZ 4Lite ACE France,BUZZ 4Pro,BUZZ_4Pro,BUZZ 4Pro ACE France,BUZZ 4S,BUZZ_4S,BUZZ 4S +ACE France,BUZZ 5 Pro,BUZZ_5_Pro,BUZZ 5 Pro +ACE France,BUZZ 5 Pro PLUS,BUZZ_5_Pro_PLUS,BUZZ 5 Pro PLUS ACE France,BUZZ_1_Lite,BUZZ_1_Lite,BUZZ 1 Lite ACE France,BUZZ_1_Plus,BUZZ_1_Plus,BUZZ 1 Plus ACE France,BUZZ_3E,BUZZ_3E,BUZZ 3 @@ -91,6 +104,7 @@ ADOC,M3,M3,M3 ADVAN,ADVANNASAPro,ADVANNASAPro,ADVANNASAPro ADVAN,Sketsa3,ADVAN_SKETSA3,1013 ADVAN,TAB A8,ADVAN_TAB_A8,8004 +ADVAN,VX NEO,ADVAN_VX_NEO,1013 ADVAN,VX_LITE,ADVAN_TAB_VX_LITE,1013 AEEZO,TK701,TK701,TK701 AEEZO,TK701_EEA,TK701_EEA,TK701_EEA @@ -150,8 +164,19 @@ AGM Mobile,AGM_H5_PRO,AGM_H5_PRO,AGM_H5_PRO AGM Mobile,AGM_H6,AGM_H6,AGM_H6 AGM Mobile,AGM_Note_N1,AGM_Note_N1,AGM_Note_N1 AGM Mobile,AGM_PAD_P1,AGM_PAD_P1,AGM_PAD_P1 +AGM Mobile,AGM_PAD_P2,AGM_PAD_P2,AGM_PAD_P2 +AGM Mobile,AGM_PAD_P2W_EEA,AGM_PAD_P2_ACTIVE,AGM_PAD_P2W +AGM Mobile,AGM_PAD_T1,AGM_PAD_T1,AGM_PAD_T1 +AGM Mobile,AGM_PAD_T1_WIFI,AGM_PAD_T1_WIFI,AGM_PAD_T1 +AGM Mobile,AGM_X6,AGM_X6_EEA,AGM_X6 +AGM Mobile,AGM_X6,AGM_X6_ROW,AGM_X6 +AGM Mobile,AGM_X6,AGM_X6_RU,AGM_X6 +AGM Mobile,Android_Rugged,Android_Rugged,Android_Rugged AGM Mobile,Android_Tablet,Android_Tablet,Android_Tablet +AGNO,TAIG717A,TAIG717A,TA_G717 +AG_Neovo,MeetBoard_4,MeetBoard_4,MeetBoard_4 AHA(A),IFPD,AHA_ULTRA_RK3588,Hybrid_8600 +AIDATA,ADT-R10TME,ADT-R10TME,ADT-R10TME AIDATA,ADT1012L,ADT1012L,ADT1012L AIDATA,ADT1061,ADT1061,ADT1061 AIDATA,ADT1061_1,ADT1061_1,ADT1061_1 @@ -169,9 +194,11 @@ ALBADEEL,Smart TV,redwood,AI PONT ALMATEEN,LXL43G7H-AT,samseong,AI PONT ALPHA_LING,A97GT,A97GT,A97GT ALPHA_LING,A97GT_Pro,A97GT_Pro,A97GT_Pro +ALPHA_LING,P10SU_PLUS,P10SU_PLUS,P10SU_PLUS +ALPINE,INE-AX809,INE-AX809,INE-AX809 ALPINE,Intelligent vehicle network system,INE-AW409S,INE-AW409S -ALT(IN),ODIN Kids Phone,odin,AT-M130 -ALT.STYLEFOLDER,Style Folder,thor,AT-M120 +ALT.mive,Kids Phone,odin,AT-M130 +ALT.mive,Style Folder,thor,AT-M120 AMGx13e,ASPE2201,ASPE2201,ASPE2201 AMTC,MD1001 Tablet,MD1001,MD1001 AMTC,MD7008,MD7008A,MD7008 @@ -183,10 +210,12 @@ ANDDORO,B7V1-STK,B7V1-STK,B7V1-STK ANDRINO,Andrino,bangbae,andrino 4K Android TV ANDRINO,Andrino,komagome,andrino 2K Android TV ANEE,A1 Neo,A1_Neo,A1_Neo +ANEXA,Smart TV,redwood,ANEXA Android TV ANS,L50,L50,L50 ANS,L51,L51,L51 ANS,Trailblazer,rugged-smartphone,H450R ANS,UL40,UL40,UL40 +ANTEMPER,D106_EEA,D106_EEA,D106_EEA ANXONIT,AnPad_U2,AnPad_U2,AnPad_U2 AOC,A110_E,A110_E,A110_E AOC,A731,A731-N1,A731-N1 @@ -213,11 +242,14 @@ AOYODKG,A7,A7,A7 AOYODKG,M50,M50,M50 AOYODKG,M50_EEA,M50_EEA,M50_EEA AOYODKG,TAB-A8,TAB-A8,TAB-A8 +AOZORA,A57,A57,A57 +AOZORA,A61,A61,A61 AOpen,"RK3288 10"" Chromebase",tiger_cheets,AOpen Chromebase Mini AOpen,RK3288 Mini Chromebox,fievel_cheets,AOpen Chromebox Mini ARATEK,BM5500,BM5500,BM5500 ARATEK,Marshall-5,Marshall-5,Marshall-5 ARATEK,Marshall-8,Marshall-8,Marshall-8 +ARATEK,Marshall-8,Marshall-8-Plus,Marshall-8 ARBOR,G47,G47,G47 ARBOR,GT78-VN,GT78-VN,GT78-VN ARBOR,HT10,HT10,HT10 @@ -227,7 +259,11 @@ ARRQW,RO-55LCS,samseong,AI PONT ARRQW,Saudi Arabia,tamachi,ARRQW FHD Android TV ARRQW,Saudi Arabia,yeongdeungpo,ARRQW UHD Android TV ARRQW,Smart TV,longshan,AI PONT +ARTEQLED,Smart TV,redwood,ARTEQLED Android TV ARTRAN,ARTRAN _EI101F,ARTRAN_EI101F,EI101F +ARTRAN,AZ101F,AZ101F,AZ101F +ARTRAN,IB101F_Pro,IB101F_Pro,IB101F Pro +ARZOPA,P1S,P1S,P1S ASHER,Smart TV,longshan,AI PONT ASHER,Smart TV,redwood,AI PONT ASHIMA,OEM50ANDROID22/OEM55ANDROID22,songshan,SmartTV 4K @@ -243,6 +279,8 @@ ASTEX,ASTEX 4K Google TV,keoneae,ASTEX 4K Google TV ASTEX,ASTEX Google TV,bandra,ASTEX Google TV ASTON,IDEA,IDEA,IDEA ASTON,NEO,NEO,NEO +ASTREX,VegaPro,VegaPro,VegaPro +ASTREX,Victory,Victory,Victory AT&T,9020A,tint8_att,9020A AT&T,AT&T Calypso® 4,U380AA,U380AA AT&T,AT&T Maestro™ Plus,v350u,V350U @@ -269,10 +307,13 @@ ATM (Brazil),IT-1001A,IT-1001A,IT-1001A ATM (Brazil),R5,R5,R5 ATM (Brazil),R5Plus,R5Plus,R5Plus ATM (Brazil),R5_Pro,R5_Pro,R5 Pro +ATMPC,A9_EEA,A9,A9 +ATMPC,IT-801B,IT-801B,IT-801B ATMPC,IT_701A,IT_701A,IT_701A ATMPC,IT_701A_EEA,IT_701A_EEA,IT_701A ATOL,Smart.Slim Plus,t50p,Smart_Slim_Plus ATOL,Smart_Prime,t150,Smart_Prime +ATOTO,X10,Multifunctional_Tablet,X10 ATVIO,100011886BK,100011886BK,100011886BK ATVIO,ATVIO,mid7015_mk_32,MID7015 ATVIO,MID1032,mid1032_mr_32,MID1032 @@ -283,6 +324,7 @@ AURII,AURII ULTRA,AURII_ULTRA,AURII ULTRA AURII,AURII_AMUSE_4G,AURII_AMUSE_4G,AURII_AMUSE_4G AURII,AURII_FAME,AURII_FAME,AURII_FAME AURZEN,TB-AS100A,TB-AS100A,TB-AS100A +AURZEN,TB-AS110A,TB-AS110A,TB-AS110A AUZMAI,Mete8,Mete8,Mete8 AUZMAI,Mete8_EEA,Mete8_EEA,Mete8_EEA AUZMAI,V60,Azumi_V60F,V60 @@ -290,6 +332,7 @@ AV,AV10,RCT6203W46,AV10 AV,AV7,RCT6773W22,AV7 AVA(USA),AVA-RM-RX1-EU,AVA-RM-RX1,RX1 AVA(USA),AVA-RM-RX2-US,AVA-RM-RX2-US,RX2 +AVACOM,AVT015,AVT015,AVT015 AVANGARD,R3,R3,R3 AVANGARD,R4,R4,R4 AVATEL,DV8547_Avatel,DV8547-KSA,DV8547_Avatel @@ -308,6 +351,7 @@ AVITA,TS11A1,TS11A1,TS11A1 AWOW,AWOW_CreaPad_1001,AWOW_CreaPad_1001,AWOW_CreaPad_1001 AWOW,AWOW_CreaPad_1003,AWOW_CreaPad_1003_EEA,AWOW_CreaPad_1003_EEA AWOW,CQA1019_EEA,CQA1019_EEA,CQA1019_EEA +AWOW,CUBTAB_1001,CUBTAB_1001,CUBTAB_1001 AWOW,CreaPad_1002A,CreaPad_1002A,CreaPad_1002A AWOW,CreaPad_1002A_EEA,CreaPad_1002A_EEA,CreaPad_1002A_EEA AWOW,CreaPad_1005,CreaPad_1005,CreaPad_1005 @@ -318,6 +362,10 @@ AWOW,CreaPad_1009A_EEA,CreaPad_1009A_EEA,CreaPad_1009A_EEA AWOW,CreaPad_1009S,CreaPad_1009S,CreaPad_1009S AWOW,CreaPad_1009S_EEA,CreaPad_1009S_EEA,CreaPad_1009S_EEA AWOW,CreaPad_1009_EEA,CreaPad_1009_EEA,CreaPad_1009_EEA +AWOW,Funtab_1001,Funtab_1001,Funtab_1001 +AWOW,Funtab_1001_EEA,Funtab_1001_EEA,Funtab_1001_EEA +AWOW,Funtab_1002_EEA,Funtab_1002_EEA,Funtab_1002_EEA +AWOW,Funtab_1003_US,Funtab_1003_US,Funtab_1003_US AWOW,Funtab_801_I,Funtab_801_I,Funtab_801_I AWOW,Funtab_801_K,Funtab_801_K,Funtab_801_K AWOW,Funtab_801_K,Funtab_801_K_EEA,Funtab_801_K_EEA @@ -327,6 +375,7 @@ AWOW,MID_1085_EEA,MID_1085_EEA,MID_1085_EEA AWOW,MID_1089IPS_EEA,MID_1089IPS_EEA,MID_1089IPS_EEA AWOW,UTBook,UTBook,UTBook AWOW,UTBook_EEA,UTBook_EEA,UTBook_EEA +AX-META,AX_META_Tab_7,AX_META_Tab_7,AX_META_Tab_7 AXEL,AX_PRO,AX_PRO,AX_PRO AXON,Evolution,Evolution,Evolution AXSTV,AXSTV130,SEI130PTS,AXSTV130 @@ -391,9 +440,12 @@ Acegame S.A.,TitaniumHD,TitaniumHD,TitaniumHD Acepad,A121,A121,A121 Acepad,A130,A130,A130 Acepad,A130-2023,A130-2023,A130-2023 +Acepad,A131,A131,A131 Acepad,A140,A140,A140 Acepad,A145,A145,A145 +Acepad,A150,A150,A150 Acepad,A170,A170,A170 +Acepad,A171_14,A171_14,A171_14 Acepad,AX1,AX1,AX1 Acer,,C6,Acer E320 Acer,,C6,Acer E320-orange @@ -422,6 +474,8 @@ Acer,A3-A20FHD,acer_harleyfhd,A3-A20FHD Acer,A3-A30,omega,A3-A30 Acer,A3-A40,acer_jetfirefhd,A3-A40 Acer,ACER ALTOS EZA,AKREI13,ACER_ALTOS_EZA +Acer,ACER ALTOS EZBA,AKMEI14,ACER_ALTOS_EZBA +Acer,ACER_ALTOS_EZB,AKMEI14,ACER_ALTOS_EZB Acer,ACTAB1021_A,ACTAB1021_A,ACTAB1021_A Acer,ACTAB1022,ACTAB1022,ACTAB1022 Acer,ACTAB1024,ACTAB1024,ACTAB1024 @@ -434,7 +488,9 @@ Acer,ACTAB723,ACTAB723,ACTAB723 Acer,ACTAB821_A,ACTAB821_A,ACTAB821_A Acer,ACTABKID,ACTABKID,ACTABKID Acer,AK330s,C8n,AK330S +Acer,AS10L,AS10L,AS10L Acer,AS10W,AS10W,AS10W +Acer,AS10WF,AS10WF,AS10WF Acer,AS8W,AS8W,AS8W Acer,ATAB1021E,ATAB1021E,ATAB1021E Acer,ATAB1024E,ATAB1024E,ATAB1024E @@ -469,6 +525,7 @@ Acer,Acer_A60L,Acer_A60L,A60L Acer,Acer_A61L,Acer_A61L,A61L Acer,Acer_One_10_T9-1212L,Acer_One_10_T9-1212L,Acer_One_10_T9-1212L Acer,Acer_one_8_T2,Acer_one_8_T2,Acer_one_8_T2 +Acer,Acerpure,anglelake,DAC41F Acer,Android TV,R1,ATV R1 Acer,Android TV,R2,ATV R2 Acer,Aspire A3,aa3-600,AA3-600 @@ -637,10 +694,12 @@ Acer,Walle,Walle,ET-108-11A Acer,Walle,Walle,ET-108-11AR Acer,Z110,Z1,Z110 Acer,Z120,Z2,Z120 +Acer,acerpure,waiawa,DAC51U Aceson,R726,R726,R726 Acet,X63L,X63L,X63L Achate,Kids Tab 1,KidsTab1_EEA,Kids Tab 1 Achate,KidsTab3_EEA,KidsTab3_EEA,KidsTab3_EEA +Achate,Kids_Tab_2,Kids_Tab_2,Kids_Tab_2 Aconatic,ACONATIC,bangbae,Aconatic 4K Android TV Aconatic,ACONATIC,bruno,ACONATIC 2K Android TV Aconatic,ACONATIC,shilin,ACONATIC 4K Android TV @@ -670,6 +729,8 @@ Admiral Overseas Corporation,ADMIRAL,stanford,2K SMART TV Admiral Overseas Corporation,ADMIRAL,zhongshan,4K SMART TV Admiral Overseas Corporation,ADMIRAL 4K TV,SW4H,ADMIRAL 4K TV Admiral Overseas Corporation,ADMIRAL TV,sunnyvale,ADMIRAL TV +Admiral Overseas Corporation,Admiral,anglelake,ADS41F +Admiral Overseas Corporation,Admiral,waiawa,ADS51U Admiral Overseas Corporation,C7,C7,C7 Admiral Overseas Corporation,Fire,Fire,Fire Admiral Overseas Corporation,O7,O7,O7 @@ -762,6 +823,7 @@ Advance,HL6256,HL6256,HL6256 Advance,HL6577,HL6577,HL6577 Advance,HL7257,HL7257,HL7257 Advance,HL9000,HL9000,HL9000 +Advance,NP6070,NP6070,NP6070 Advance,PR5860,PR5860,PR5860 Advance,PR6149,PR6149,PR6149 Advance,PR6152,PR6152,PR6152 @@ -779,6 +841,7 @@ Advance,SP4702,SP4702,SP4702 Advance,SP4703,SP4703,SP4703 Advance,SP4872,SP4872,SP4872 Advance,SP5702,SP5702,SP5702 +Advance,SP5705,SP5705,SP5705 Advance,SP5712,SP5712,SP5712 Advance,SP5713,SP5713,SP5713 Advance,SP5732,SP5732,SP5732 @@ -803,6 +866,7 @@ Advance,TR7988,TR7988,TR7988 Advance,TR7989,TR7989,TR7989 Advance,TR7990,TR7990,TR7990 Advance,TR7998,TR7998,TR7998 +Advance,TR8990,TR8990,TR8990 Advance,Tablet_Advance,Tablet_adv_v1,ADVANCE Advance,Tr3946,Tr3946,Tr3946 Advance,Tr4986,Tablet_adv_v1,ADVANCE @@ -823,9 +887,12 @@ Advantech,DLT-V7312AP+,dlt_v7312plus,DLT-V7312AP+ Aelion,i8,Aelion_i8,i8 Aeon Communication (IN),AE1020,AE1020,AE1020 Aermoo,CM08,PT3_2,CM08 +Aermoo,CM10,PT1E_2,CM10 +Aermoo,CM20,PT2_1,CM20 Aermoo,DF10,M22PE,DF10 Aermoo,DF10 Pro,M22G_2,DF10 Pro Aermoo,PF10,M23HE_2,PF10 +Aermoo,PF10 Pro,M23HT_2,PF10 Pro Aermoo,PF20,ZN133SE,PF 20 Aermoo,PF20 Pro,ZN133TE,PF20 Pro Aermoo,RG Mini,ZN137E,RG Mini @@ -887,6 +954,7 @@ Aiwa,AWM580,AWM580,AWM580 Aiwa,AWM599,AWM599,AWM599 Aiwa,AWM999,AWM999,AWM999 Aiwa,AWT10H,AWT10H,AWT10H +Aiwa,AW_TAB10_14,AW_TAB10_14,AW_TAB10_14 Aiwa,Aiwa,KSTB6043,KSTB6043 Aiwa,Aiwa,hongkong,4K SMART TV Aiwa,Aiwa,mountbaker,2K SMART TV @@ -899,8 +967,10 @@ Aiwa,JA2-TBA0801,JA2-TBA0801,JA2-TBA0801 Aiwa,JA2-TBA1001,JA2-TBA1001,JA2-TBA1001 Aiwa,JA2-TBA1002,JA2-TBA1002,JA2-TBA1002 Aiwa,JA3-SMP0602,JA3-SMP0602,JA3-SMP0602 +Aiwa,JA3-TBA0802,JA3-TBA0802,JA3-TBA0802 Aiwa,JA3-TBA1005,JA3-TBA1005,JA3-TBA1005 Aiwa,JA3-TBA1007,JA3-TBA1007,JA3-TBA1007 +Aiwa,JA4-TBA1008,JA4-TBA1008,JA4-TBA1008 Aiwa,R3,R3,R3 Aiwa,R4,R4,R4 Aiwa,Smart TV,longshan,AI PONT @@ -912,6 +982,7 @@ Aiwa,TA10-SO10,TA10-SO10,TA10-SO10 Aiwa,TAB-1100,TAB-1100,TAB-1100 Aiwa,TAB-1102,TAB-1102,TAB-1102 Aiwa,TAB-1103,TAB-1103,TAB-1103 +Aiwa,TABLETAWTH801,TABLETAWTH801,AWTH801 Aiwa,TAB_1003G,TAB_1003G,TAB_1003G Aiwa,Z9,AIWA_Z9,Z9 Aiwa,Z9 PLUS,AIWA_Z9_PLUS,Z9 PLUS @@ -974,6 +1045,7 @@ Aligator,ALIGATOR_RX710_EEA,ALIGATOR_RX710,ALIGATOR RX710 Aligator,Aligator S5066,Aligator_S5066,Aligator_S5066 Aligator,Aligator_S6100,Aligator_S6100,Aligator_S6100 Aligator,Aligator_S6550,Aligator_S6550,Aligator_S6550 +Aligator,Aligator_S6600,Aligator_S6600,Aligator_S6600 Aligator,RX460,RX460,RX460 Aligator,RX600,RX600,RX600 Aligator,RX700,RX700,RX700 @@ -1143,6 +1215,8 @@ AllView,Viva i701G,Viva_i701G,Viva_i701G AllView,Viva i701G,Viva_i701G,Viva_i701G_TM AllView,Viva i7G,Viva_i7G,Viva_i7G AllView,Viva_H701_LTE,Viva_H701_LTE,Viva_H701_LTE +AllView,Viva_Play_804_EEA,Viva_Play_804,Viva_Play_804 +AllView,X10_Soul_EEA,X10_Soul,X10_Soul AllView,X10_Soul_Lite,X10_Soul_Lite,X10_Soul_Lite AllView,X2 Soul Lite,X2_Soul_Lite,X2_Soul_Lite AllView,X2 Soul Lite,X2_Soul_Lite,X2_Soul_Lite_TM @@ -1152,6 +1226,7 @@ AllView,X2 Soul Style,X2_Soul_Style,X2_Soul_Style AllView,X2 Soul Style,X2_Soul_Style,X2_Soul_Style_TM AllView,X2 Soul Style+,X2_Soul_Style_Plus,X2_Soul_Style_Plus AllView,X2 Soul Xtreme,X2_Soul_Xtreme,X2_Soul_Xtreme +AllView,X20_Soul_EEA,X20_Soul,X20_Soul AllView,X3 Soul Lite,X3_Soul_Lite,X3_Soul_Lite AllView,X3 Soul Lite,X3_Soul_Lite,X3_Soul_Lite_TM AllView,X3 Soul Plus,X3_Soul_PLUS,X3_Soul_PLUS @@ -1209,6 +1284,7 @@ Alldocube,iPlay 20S,T1021,iPlay20S Alldocube,iPlay 40H,T1020H,iPlay_40H Alldocube,iPlay 50,T1030,iPlay_50 Alldocube,iPlay 50S,T1029T,iPlay_50S +Alldocube,iPlay 60 Pad Pro,T1201,T1201 Alldocube,iPlay 8 Pro,T806MH,T806MH Alldocube,iPlay 8 Pro,T806MHE,T806MHE Alldocube,iPlay 8T,T802,iPlay_8T @@ -1220,6 +1296,8 @@ Alldocube,iPlay50S,T1029TA,iPlay50S Alldocube,iPlay50_Lite,U1030,iPlay50_Lite Alldocube,iPlay50_Mini_Lite,U807,iPlay50_Mini_Lite Alldocube,iPlay50_SE,iPlay50_SE,iPlay50_SE +Alldocube,iPlay60_S,U1033,iPlay60_S +Alldocube,iPlay60_mini_Turbo,U812,iPlay60 mini Turbo Alldocube,iPlay9T,U1008,iPlay9T Alldocube,iPlay_20,iPlay_20,iPlay_20 Alldocube,iPlay_30,T1012,iPlay_30 @@ -1227,6 +1305,7 @@ Alldocube,iPlay_40,T1020S,iPlay_40 Alldocube,iPlay_40_5G,T1016,iPlay40_5G Alldocube,iPlay_50_Pro,T1030MAN,iPlay_50_Pro Alldocube,iPlay_60,T1102T,iPlay_60 +Alldocube,iPlay_60_Lite,T1103T,iPlay_60_Lite Alldocube,kPad,T1026,kPad Allducube,T1001,T1001,T1001 Allente,Allente 1,OnePlace2,Allente 1 @@ -1236,7 +1315,9 @@ Allfine,PC1038Q,fine10_Joy,PC1038Q Alliance,DTP9731,DTP9731,DTP9731 Allnet,PrimeOne,PrimeOne,PrimeOne Allouette,PSY7020SKD,PSY7020SKD,PSY7020SKD +Alpha,ALPHA 4K,lushan,ALPHA 4K Alpha,Alpha 43G7NUA,samseong,AI PONT +Alpha,Alpha S6,Alpha_S6,Alpha S6 Alpha,M8T,ikebukuro,AI PONT Alpha,T1_Pro,T1_pro,T1_pro Alphascan,SAT2242 WorkTab,ADP_WW,G2SMNT @@ -1312,6 +1393,8 @@ Amgoo,AM530,AM530,AM530 Amgoo,AM535,AM535,AM535 Amgoo,AMGOO,AM518,AM518 Amgoo,Amgoo,AM518,AM518 +Amino,Amigo 7Y EspialTV,Amigo7Y,Amigo 7Y EspialTV +Amino,Amigo7Y,Amigo7Y,Amigo 7Y Amino,DFN-Amigo7x,Amigo7x3,DFN-Amigo7x Aminocom,Amigo,Amigo,Amigo7 Aminocom,Amigo7x,Amigo7x,Amigo7x @@ -1340,9 +1423,11 @@ Andersson,TBQ10322,TBQ10322,TBQ10322 Andersson,TBQ8322,TBQ8322,TBQ8322 Andersson,TBQ_10321,TBQ_10321,TBQ_10321 Andersson,TBX10,TBX10,TBX10 +Andersson,TBX11,TBX11,TBX11 AngelLira,ALFP200,ALFP200,ALFP200 AngelTech,E109GCM,E109GCM,E109GCM AngelTech,P80,P80,P80 +Antel,Antel Box2.0,Antel_B866V2FAS,Antel Box2.0 Antel,DV8547,DV8547,DV8547 Anydata,,ASP320Q_GSM,ASP320Q_ANDi Anydata,Aquaris I8,bq_Aquaris,bq Aquaris @@ -1410,10 +1495,14 @@ Anydata,iCraig CMP749,CMP749,CMP749 AoGo,AoGo1,AoGo1,AoGo1 Aocwei,X300,X300,X300 Aocwei,X300_EEA,X300_EEA,X300_EEA +Aocwei,X300_EEA_T,X300_EEA_T,X300_EEA +Aocwei,X300_T,X300_T,X300_US Aocwei,X500_EEA,X500_EEA,X500_EEA Aocwei,X500_T_EEA,X500_T_EEA,X500_T_EEA Aocwei,X500_US,X500_US,X500_US Aocwei,X700_EEA,X700_EEA,X700_EEA +Aocwei,X800_EEA,X800_EEA,X800_EEA +Aocwei,X800_US,X800_US,X800_US Aocwei,X900-US,X900-US,X900-US Aocwei,X900_EEA,X900_EEA,X900_EEA Aocwei,X900_US,X900_US,X900_US @@ -1427,7 +1516,16 @@ Apex,U10,U10,U10 Apex,U10PRO,U10PRO,U10PRO Apex,Z4PRO,Z4PRO,Z4PRO Apolosign,EM101A,EM101A,EM101A +Apolosign,EM101B,EM101B,EM101B +Apolosign,EM101B_EEA,EM101B_EEA,EM101B_EEA +Apolosign,EM101C,EM101C,EM101C +Apolosign,EM101C_EEA,EM101C_EEA,EM101C_EEA Apolosign,EM103A,EM103A,EM103A +Apolosign,EM103B_EEA,EP103B_EEA,EP103B_EEA +Apolosign,EP103B,EP103B,EP103B +Apolosign,EP1095T,EP1095T,EP1095T +Apolosign,EP1095T_EEA,EP1095T,EP1095T +Apolosign,EP1095T_EEA,EP1095T,EP1095T_EEA Apolosign,K109A,K109A,K109A Apolosign,K109_Pro,K109_Pro,K109_Pro Apolosign,K709A,K709A,K709A @@ -1640,6 +1738,8 @@ Archos,ARCHOS T101HD 4G,act101hd4g2,ARCHOS T101 HD 4G Archos,ARCHOS T96 3G_EEA,ARCHOST963G,ARCHOS T96 3G_EEA Archos,ARCHOS T96 WIFI_EEA,ARCHOST96,ARCHOS T96 WIFI_EEA Archos,ARCHOST963G,ARCHOST963G,ARCHOS T96 3G +Archos,AT101FHD2WF_EEA,act101fhd2wf,ARCHOS T101 FHD2 WIFI +Archos,AWACT80HDWF_EEA,act80hdwf,ARCHOS T80 HD WIFI Archos,Alba 10,ac101cplv3,ALBA 10 TABLET Archos,"Alba 10""",ac101cpl,"Alba 10""" Archos,Alba 4,ac40he,"Alba 4.0"" Smartphone" @@ -1790,7 +1890,13 @@ Archos,Qilive79,Qilive79,Qilive 79 Archos,Qilive7V2,ql70v2,Qilive 70v2 Archos,Quechua Phone 5,A50RG11,Quechua Phone 5 Archos,Quechua Tablet 8,A80RG11,A80RG11 +Archos,SPAC101SOXUL_EEA,ac101soxul,ARCHOS 101S Oxygen Ultra +Archos,SPACT101FHD4G,ACT101FHD4G,ARCHOS T101 FHD 4G ULTRA +Archos,SPACT101HD24G_EEA,act101hd24g,ARCHOS T101 HD2 4G +Archos,SPACT105FHD4G_EEA,act105fhd4g,ARCHOS T105 FHD 4G +Archos,SPACT105FHDWFUL_EEA,act105fhdwful,ARCHOS T105FHD WIFI ULTRA Archos,SPAT101FHDW_EEA,at101fhdw,ARCHOS T101 FHD WiFi +Archos,SPAZA101SOXUL_EEA,aza101soxul,Tikeasy 10d Archos,Smart Home Tablet,hometablet,Archos Smart Home Tablet Archos,Smarthome La Poste,hometablet,Archos Smart Home Tablet Archos,TV Connect,LUDO,ARCHOS LUDOG10 @@ -2346,16 +2452,24 @@ Atozee,AT70KS,AT70KS,AT70KS Atozee,AT70K_EEA,AT70K_EEA,AT70K_EEA Atozee,AT71K,AT71K,AT71K Atozee,AT81K,AT81K,AT81K +Atozee,CP10S,CP10S,CP10S +Atozee,CP20S,CP20S,CP20S +Atozee,CP20_GOLD,CP20_GOLD,CP20_GOLD Atozee,CP20_MAX,CP20_MAX,CP20_MAX Atozee,CP20_PRO,CP20_PRO,CP20_PRO Atozee,CP30,CP30,CP30 +Atozee,NV10S,NV10S,NV10S Atozee,P10,P10,P10 +Atozee,P12,P12,P12 Atozee,P70W,P70W,P70W Atozee,P80W,P80W,P80W +Atozee,P81M,P81M,P81M +Atozee,P81W,P81W,P81W Atozee,YQ10S_Gold,YQ10S_Gold,YQ10S_Gold Atozee,YQ10S_MAX,YQ10S_MAX,YQ10S_MAX Atozee,YQ10S_PRO,YQ10S_PRO,YQ10S_PRO Atozee,ZB10S,ZB10S,ZB10S +Atozee,ZB11S,ZB11S,ZB11S Atria Convergence Technologies,ACT,B860H_V1,B860H Attila,Magic_1,Magic_1,Magic_1 Attila,WTATTRW2,WTATTRW2,WTATTRW2 @@ -2437,7 +2551,12 @@ Avaya,Vantage,K175,Avaya Vantage Avaya,Vantage,K175,K175 Avaya,Vantage,Vantage,Avaya Vantage Avaya,Vantage,Vantage,K165 +AvidPad,A30,A30,A30 AvidPad,A30PRO,A30PRO,A30PRO +AvidPad,S30,S30,S30 +AvidPad,S60,S60,S60 +AvidPad,S80,S80,S80 +AvidPad,S90,S90,S90 Avion,Avion A10,Avion_A10,Avion A10 Avion,Avion A10 Pro,Avion_A10_Pro,Avion A10 Pro Avion,m2,Avion_M2,M2 @@ -2467,6 +2586,7 @@ Axioo,PICOpad_7H_JE,PICOpad_7H_JE,PICOpad_7H_JE Axioo,PICOpad_7H_JL,PICOpad_7H_JL,PICOpad_7H_JL Axioo,PICOpad_7H_R8,PICOpad_7H_R8,PICOpad_7H_R8 Axxa Mobile,GEM,GEM,GEM +Ayat,Ayat_101,Ayat_101,Ayat_101 Ayonz EKO,SV11,ICN,KATV10 Azatech,AZATECH,stanford,SMART TV Azatech,AZATECH,zhongshan,4K SMART TV @@ -2477,6 +2597,8 @@ Azeyou,AT1012U,AT1012U,AT1012U Azeyou,AT1014,AT1014,AT1014 Azeyou,AT1014U,AT1014U,AT1014U Azeyou,AT1016BBK,AT1016BBK,T50 +Azeyou,AT1016E,AT1016E,T50 +Azeyou,AT1016U,AT1016U,Tab6 Azeyou,AT1031E,AT1031E,AT1031E Azeyou,AT1031U,AT1031U,AT1031U Azeyou,AT701E,AT701E,AT701E @@ -2484,6 +2606,7 @@ Azeyou,AT701U,AT701U,AT701U Azeyou,AT801,AT801,AT801 Azeyou,AT801U,AT801U,AT801U Azeyou,AT_701B,AT_701B,AT_701B +Azeyou,M17QF27A,M17QF27A,M17QF27A Azeyou,M87QF6-4G,M87QF6-4G,M87QF6-4G Azumi,A4,A4,Azumi A4 Azumi,A4,A4_AC25,Azumi A4 @@ -2613,6 +2736,8 @@ BALMUDA,BALMUDA Phone,A101BM,A101BM BALMUDA,BALMUDA Phone,X01A,X01A BAMtelecoms,N3,N3,N3 BAMtelecoms,T3,T3,T3 +BARTEC,BARTEC SC9EX1 Smartscanner,SC9EX1,SC9EX1 +BARTEC,BARTEC SP9EX1 Smartphone,SP9EX1,SP9EX1 BARTEC,Pixavi Phone,PixaviPhone,Pixavi Phone BARTEC,Pixavi Thermal,PixaviThermal,Pixavi Thermal BATMAN,TM-MID1065BT,TM-MID1065BT,TM-MID1065BT @@ -2633,6 +2758,9 @@ BEISTA,X104-EEA,X104-EEA,X104-EEA BEISTA,X108,X108,X108 BEISTA,X80-EEA,X80-EEA,X80-EEA BERGSTROM,H634_BLK,H634_BLK,H634 BLK +BESTTAB,A10_EEA,A10,A10 +BESTTAB,A10_NEU,A10,A10 +BESTTAB,A20_EEA,A20,A20 BGH S.A.,BGH 2K Android TV,lasalle,BGH 2K Android TV BGH S.A.,BGH 4K Android TV,kenton,BGH 4K Android TV BGH S.A.,BGH Joy 303,BGH_Joy_303,BGH Joy 303 @@ -2679,24 +2807,36 @@ BLUESTAR,B850J,B850J,B850J BLUEWORLD,TM12,TM12,TM12 BMAX,BMAX_I9,BMAX_I9,BMAX_I9 BMAX,I10,I10,I10 +BMAX,I10Pro_LTE,I10Pro_LTE,I10Pro +BMAX,I10Pro_LTE_EEA,I10Pro_LTE_EEA,I10Pro BMAX,I10_EEA,I10_EEA,I10_EEA +BMAX,I10_LTE,I10_LTE,I10_LTE BMAX,I10_Plus,I10_Plus,I10_Plus BMAX,I10_Plus,I10_Plus_EEA,I10_Plus_EEA BMAX,I10_Pro_EEA,I10_Pro_EEA,I10_Pro BMAX,I10_Pro_LTE,I10_Pro_LTE,I10_Pro_LTE BMAX,I10_Pro_LTE_EEA,I10_Pro_LTE_EEA,I10_Pro_LTE_EEA BMAX,I10_Pro_ROW,I10_Pro_ROW,I10_Pro +BMAX,I10_S_Pro,I10_S_Pro,I10_S_Pro BMAX,I11,I11,I11 BMAX,I11_EEA,I11_EEA,I11_EEA +BMAX,I11_LTE,I11_LTE,I11_LTE +BMAX,I11_LTE_EEA,I11_LTE_EEA,I11_LTE BMAX,I11_Plus,I11_Plus,I11_Plus BMAX,I11_Plus_EEA,I11_Plus_EEA,I11_Plus_EEA +BMAX,I11_Plus_LTE,I11_Plus_LTE,I11_Plus +BMAX,I11_Plus_LTE_EEA,I11_Plus_LTE_EEA,I11_Plus BMAX,I11_Power,I11_Power,I11_Power +BMAX,I11_Power_LTE,I11_Power_LTE,I11_Power_LTE +BMAX,I11_S,I11_S,I11_S +BMAX,I8,I8,I8 BMAX,I9_Plus,I9_Plus_WIFI_EEA,I9_Plus BMAX,I9_Plus,I9_Plus_WIFI_ROW,I9_Plus BMAX,I9_Plus_EEA,I9_Plus_EEA,I9_Plus_EEA BMAX,I9_Plus_ROW,I9_Plus_ROW,I9_Plus_ROW BMAX,I9_Plus_WLAN,I9_Plus_WLAN,I9_Plus BMAX,I9_Plus_WLAN_EEA,I9_Plus_WLAN_EEA,I9_Plus +BMAX,I9_Plus_Wlanonly,I9_Plus_Wlanonly,I9_Plus BMAX,I9_Plus_Wlanonly_EEA,I9_Plus_Wlanonly_EEA,I9_Plus BMPRO,BMPRO7DI,BMPRO7DI,BMPRO7DI BMXC,BM108,BM108,BM108 @@ -2866,6 +3006,7 @@ BMobile,BL54_PRO_TG05,Bmobile_BL54_PRO_TG05,BL54_PRO BMobile,BL55,Bmobile_BL55,BMOBILE_BL55 BMobile,BL55,Bmobile_BL55_TG,BL55_TG BMobile,BL55_PRO_MV12,Bmobile_BL55_PRO_MV12,BL55_PRO +BMobile,BL55_TG06,Bmobile_BL55_TG06,BL55_TG06 BMobile,BL60,Bmobile_BL60,BL60 BMobile,BL60,Bmobile_BL60_TG05B,BL60_TG05B BMobile,BL60M_MV05,Bmobile_BL60M_MV05,BL60M_MV05 @@ -2884,6 +3025,7 @@ BMobile,BL65,Bmobile_BL65_TG,BL65_TG BMobile,BL65Plus_TG07,Bmobile_BL65Plus_TG07,BL65Plus BMobile,BL65Plus_TG07,Bmobile_BL65Plus_TG07,BL65Plus_TG07 BMobile,BL70,Bmobile_BL70,BL70 +BMobile,BM65 Pro,Bmobile_BM65Pro_TG05,BM65Pro_TG05 BMobile,Bella,Bella,Bella BMobile,Bmbile AX687,Bmobile_AX687,AX687 BMobile,Bmobile AX1076,Bmobile_AX1076,AX1076 @@ -2902,6 +3044,7 @@ BMobile,Bmobile_B60Pro,Bmobile_B60Pro,Bmobile_B60Pro BMobile,Bmobile_BM65Plus,Bmobile_BM65Plus,BM65Plus BMobile,Bmoblie AX683,Bmobile_AX683_MV04,AX683 BMobile,FUN 4,Bmobile_FUN_4_2018,FUN 4 2018 +BMobile,NOVUS65,Bmobile_NOVUS65_TG06,NOVUS65_TG06 BMobile,Nobu A55 Pro,Azumi_NA55_Pro,NOBU A55 PRO BMobile,Speed 5,Bmobile_SPEED5,Speed 5 BMobile,T70,Bmobile_T70,Bmobile_T70 @@ -2909,6 +3052,7 @@ BMobile,Ultra,Bmobile_ULTRA,ULTRA BMobile,Ultra,Bmobile_ULTRA_TG07,ULTRA BMobile,X10,Bmobile_X10_MV03,X10 BMobile,X11,Bmobile_X11,Bmobile X11 +BODYCRAFT,M1_IC0_N702_BC,CONNECT_22,CONNECT_22 BOLVA,B_TAB1021,B_TAB1021,B_TAB1021 BOREAL,Android TV,R1,ATV R1 BOREAL,Android TV,R2,ATV R2 @@ -2917,6 +3061,7 @@ BOTECH,Android TV,R2,ATV R2 BOTECH,BOTECH,stanford,2K SMART TV BOTECH,BOTECH,zhongshan,4K SMART TV BOTECH,WZONE,HND,WZONE +BOXY,BOXY,YYC,4K Android TV Box BPL,Android TV,ikebukuro,AI PONT BPL,Android TV,longshan,AI PONT BPL,Android TV,samseong,AI PONT @@ -3039,6 +3184,8 @@ BQru,BQ-6200L Aurora,BQru-6200L,BQ-6200L BQru,BQ-6424L,BQru-6424L,BQ-6424L BQru,BQ-6630L,BQru-6630L,BQ-6630L BQru,BQ-6645L Element,BQru-6645L,BQ-6645L +BQru,BQ-6761,BQ6761,BQ-6761 +BQru,BQ-6861L,BQ6861L,BQ-6861L BQru,BQ-6868L,BQru-6868L,BQru-6868L BQru,BQ-7000G,BQru-7000G,BQ-7000G BQru,BQ-7000G,BQru-7000G_2020,BQ-7000G @@ -3102,11 +3249,13 @@ BRAVE,BTSL1,BTSL1,BTSL1 BRAVE,BTXS1,BTXS1,BTXS1 BRAVE,BTXS1_1,BTXS1_1,BTXS1_1 BRAVE,EX10SL4,EXCEED,EX10SL4 +BRAVE,T2Max,T2Max,T2Max BRIGMTON,BTPC-1023OC4G_EEA,BTPC-1023OC4G,BTPC-1023OC4G BRIGMTON,BTPC-1024QC,BTPC-1024QC,BTPC-1024QC BRIGMTON,BTPC-1025OC,BTPC-1025OC,BTPC-1025OC BRIGMTON,BTPC-1027QC3G,BTPC-1027QC3G,BTPC-1027QC3G BRIGMTON,Spain,BTPC-801QC,BTPC-801QC +BROJ,AZ101FB,AZ101FB,AZ101FB BRUHM,BTF-43SG,ikebukuro,AI PONT BRUHM,BTF-75TG,samseong,AI PONT BTC Mobile,S5548,S5548,S5548 @@ -3115,6 +3264,8 @@ BUFF,X9 pro,X-9_LTEVII_PRO,X9 pro BULSATCOM,UPD-BJ00R,UPD-BJ00R,UPD-BJ00R BULSATCOM,b-box,HP44H,b-box BVS (AR),BVS 4K 0TT 01,SFO,BVS 4K OTT 01 +BWJBSW,KT802_EEA,KT802_EEA,KT802_EEA +BWJBSW,KT802_US,KT802_US,KT802_US BYD,DynaVox T10,T10,T10 BYD,FarEastone Smart 502,Smart502,Smart 502 BYD,INHON G3,G3,G3 @@ -3253,6 +3404,8 @@ BenQ,PT2200,PT2200,PT2200 BenQ,Q Stick,S905Y2,QS01 BenQ,QS01,S905Y2,QS01 BenQ,QS02,YUL,QS02 +BenQ,RE04N1_series,RE04N1_series,RE04N1_series +BenQ,RE04N_series,RE04N_series,RE04N_series BenQ,RE04_series,RE04_series,RE04_series BenQ,RM6504,RM6504,RM6504 BenQ,RM7504,RM7504,RM7504 @@ -3309,8 +3462,18 @@ Beyond,MAX4,MAX4,MAX4 Beyond,SURVE,SURVE,SURVE Beyond,WIN,WIN,WIN Bible-Pad,Bible-Pad,BTAB-7Q2,BTAB-7Q2 +Biegedy,B21_EEA,B21_EEA,B21_EEA +Biegedy,B22_EEA,B22_EEA,B22_EEA +Biegedy,B22_US,B22_US,B22_US +Biegedy,B23_US,B23_US,B23_US +Biegedy,B23_U_US,B23_U_US,B23_US +Biegedy,B23_U_US,B23_U_US,B23_U_US +Biegedy,B29_EEA,B29_EEA,B29_EEA +Biegedy,B29_US,B29_US,B29_US Bigben,BB8252,Bigben-TAB,BB8252 +Bigben,Bigtech_B_RU,Bigtech_B_RU,Bigtech_B_RU Bigben,GAMETAB-ONE,GAMETAB-ONE,GAMETAB-ONE +Bigtech,Bigtech_A_RU,Bigtech_A_RU,Bigtech_A_RU BilimBook,BilimBook_mini,BilimBook_mini,BilimBook mini Billion,Billion Capture+,rimoB,Capture+ Billow,X101PRO+,X101PRO,X101PRO+ @@ -3339,6 +3502,7 @@ Bitel,B9502,B9502,B9502 Bitel,B9504,B9504,B9504 Bitel,B9505,4G_Smart_Phone_B9505,B9505 Bitel,BPRO,BPRO,BPRO +Bitel,Bitel B866V2FAS,B866V2FAS_Bitel,Bitel B866V2FAS Bitel,M50,M50,M50 Bitel,Pro 9,PRO9,PRO9 Bitmore,Bitmore_Mobitab_8_4G,Mobitab_8_4G,Bitmore_Mobitab_8_4G @@ -3424,6 +3588,7 @@ Blackshark,KLE-A0,klein,SHARK KLE-A0 Blackshark,KLE-H0,klein,SHARK KLE-H0 Blackshark,MBU-A0,mobius,SHARK MBU-A0 Blackshark,MBU-H0,mobius,SHARK MBU-H0 +Blackshark,Pad6,Pad6,Pad6 Blackshark,SHARK KSR-A0,kaiser,SHARK KSR-A0 Blackshark,SHARK PRS-A0,penrose,SHARK PRS-A0 Blackshark,SHARK PRS-H0,penrose,SHARK PRS-H0 @@ -3444,6 +3609,7 @@ Blackview,A5,A5,A5 Blackview,A50,A50,A50 Blackview,A52,A52,A52 Blackview,A52 Pro,A52Pro,A52 Pro +Blackview,A52 Pro,A52Pro,A52 Pro(6+128GB) Blackview,A53,A53,A53 Blackview,A53 Pro,A53_Pro,A53 Pro Blackview,A55,A55,A55 @@ -3471,6 +3637,9 @@ Blackview,Active 6,Active6,Active 6 Blackview,Active 6,Active6_EEA,Active 6 Blackview,Active 6,Active6_RU,Active 6 Blackview,Active 8 Pro,Active8Pro,Active 8 Pro +Blackview,Active8_EEA,Active8,Active 8 +Blackview,Active8_NEU,Active8,Active 8 +Blackview,Active8_RU,Active8,Active 8 Blackview,BL5000,BL5000,BL5000 Blackview,BL6000Pro,BL6000Pro,BL6000Pro Blackview,BL8000,BL8000,BL8000 @@ -3481,6 +3650,7 @@ Blackview,BL9000 Pro,BL9000_Pro,BL9000 Pro Blackview,BV4000,BV4000,BV4000 Blackview,BV4000Pro_RU,BV4000Pro,BV4000Pro-RU Blackview,BV4800,BV4800,BV4800 +Blackview,BV4800 Pro,BV4800Pro,BV4800 Pro Blackview,BV4900,BV4900,BV4900 Blackview,BV4900Pro,BV4900Pro,BV4900Pro Blackview,BV4900s,BV4900s,BV4900s @@ -3510,6 +3680,7 @@ Blackview,BV6000s,BV6000S,BV6000S Blackview,BV6100,BV6100,BV6100 Blackview,BV6200,BV6200,BV6200 Blackview,BV6200 Pro,BV6200Pro,BV6200 Pro +Blackview,BV6200 Pro,BV6200_Pro_14,BV6200 Pro Blackview,BV6300,BV6300,BV6300 Blackview,BV6300Pro,BV6300Pro,BV6300Pro Blackview,BV6600,BV6600,BV6600 @@ -3527,6 +3698,7 @@ Blackview,BV7100,BV7100,BV7100 Blackview,BV7200,BV7200,BV7200 Blackview,BV8000 Pro,BV8000Pro,BV8000Pro Blackview,BV8000Pro_RU,BV8000Pro_RU,BV8000Pro_RU +Blackview,BV8100,BV8100,BV8100 Blackview,BV8800,BV8800,BV8800 Blackview,BV8900,BV8900,BV8900 Blackview,BV8900 Pro,BV8900_Pro,BV8900 Pro @@ -3573,6 +3745,7 @@ Blackview,P10000 Pro,P10000_Pro,P10000 Pro Blackview,P10000 Pro,P10000_Pro,P10000_Pro Blackview,P2 Lite,P2Lite,P2Lite Blackview,P6000,P6000,P6000 +Blackview,PILOT 2,PILOT_2,PILOT 2 Blackview,Pad8_EEA,Pad8_EEA,Pad8 Blackview,Pad8_ROW,Pad8_ROW,Pad8 Blackview,Pad8_RU,Pad8_RU,Pad8 @@ -3580,6 +3753,7 @@ Blackview,S6,S6,S6 Blackview,S8,S8,S8 Blackview,S8_RU,S8,S8 Blackview,SHARK 8,Shark8,SHARK 8 +Blackview,SHARK 9,SHARK_9,SHARK 9 Blackview,SOLID-4G3,SOLID_4G3,SOLID_4G3 Blackview,SOLID_4_G2,SOLID_4_G2,SOLID 4 G2 Blackview,Shark 8,Shark8,SHARK 8 @@ -3592,19 +3766,27 @@ Blackview,Tab 16 Pro,Tab16_Pro,Tab 16 Pro Blackview,Tab 16_Pro,Tab16_Pro,Tab 16 Pro Blackview,Tab 18,Tab18,Tab 18 Blackview,Tab 3 Kids,Tab3Kids,Tab 3 Kids +Blackview,Tab 50 Kids,Tab50Kids,Tab 50 Kids Blackview,Tab 50 Kids,Tab50Kids_TUR,Tab 50 Kids Blackview,Tab 50 WiFi,Tab50WiFi,Tab 50 WiFi Blackview,Tab 60,Tab60,Tab 60 Blackview,Tab 60 Kids,Tab60Kids,Tab 60 Kids Blackview,Tab 60 Kids,Tab60Kids_EEA,Tab 60 Kids Blackview,Tab 60 Kids,Tab60Kids_RU,Tab 60 Kids +Blackview,Tab 60 Pro,Tab_60_Pro,Tab 60 Pro +Blackview,Tab 60 WiFi,Tab_60_WiFi,Tab 60 WiFi Blackview,Tab 70 WiFi,Tab70WiFi,Tab 70 WiFi +Blackview,Tab 70 WiFi,Tab_70_WiFi_14,Tab 70 WiFi Blackview,Tab 8 WiFi,Tab8_WiFi_EEA,Tab 8 WiFi Blackview,Tab 8 WiFi,Tab8_WiFi_ROW,Tab 8 WiFi Blackview,Tab 80,Tab80,Tab 80 Blackview,Tab 80,Tab80_EEA,Tab 80 Blackview,Tab 80,Tab80_RU,Tab 80 +Blackview,Tab 80 Kids,Tab_80_Kids,Tab 80 Kids Blackview,Tab 9 WiFi,Tab_9_WiFi,Tab 9 WiFi +Blackview,Tab 90,Tab_90,Tab 90 +Blackview,Tab A5 Kids,Tab_A5_Kids,Tab A5 Kids +Blackview,Tab A6 Kids,Tab_A6_Kids,Tab A6 Kids Blackview,Tab10,Tab_10,Tab 10 Blackview,Tab11SE_EEA,Tab11SE_EEA,Tab 11 SE Blackview,Tab11SE_NEU,Tab11SE_NEU,Tab 11 SE @@ -3677,6 +3859,7 @@ Blaupunkt,BLAUPUNKT,bruno,BLAUPUNKT 2K Android TV Blaupunkt,BLAUPUNKT,hongkong,4K SMART TV Blaupunkt,BLAUPUNKT,hongkong,BLAUPUNKT 4K TV Blaupunkt,BLAUPUNKT,hongkong,BLAUPUNKT GOOGLE TV 4K +Blaupunkt,BLAUPUNKT,lavender,4K SMART TV Blaupunkt,BLAUPUNKT,lavender,BLAUPUNKT 4K TV Blaupunkt,BLAUPUNKT,mountbaker,BLAUPUNKT 2K TV Blaupunkt,BLAUPUNKT,stanford,CSV2K @@ -3782,6 +3965,8 @@ Blu,BLU Vivo ONE,V0270WW,Vivo ONE Blu,BLU_STUDIO_G2,BLU_STUDIO_G2,BLU STUDIO G2 Blu,BLU_Studio_G_Max,Studio_G_Max,Studio G Max Blu,BLU_Vivo_XL2,BLU_Vivo_XL2,Vivo XL2 +Blu,BOLD K10,K0110,BOLD K10 +Blu,BOLD K50,K0130,BOLD K50 Blu,BOLD M7,M0100WW,BOLD M7 Blu,BOLD M7,M0110WW,BOLD M7 Blu,BOLD M8,M0120WW,BOLD M8 @@ -3822,6 +4007,7 @@ Blu,C5L Max,C0170WW,C5L MAX Blu,C5L Max,C0170WW,C5L Max Blu,C5L Max,C0173WW,C5L Max Blu,C5L Max,C0175,C5L Max +Blu,C5L Max,C0175_IW,C5L Max Blu,C5L Max,C0176,C5L Max Blu,C5L PLUS,C0130UU,C5L PLUS Blu,C5L+ 2021,C0130WW,C5L+ 2021 @@ -3884,6 +4070,7 @@ Blu,ENERGY X PLUS 2,BLU_ENERGY_X_PLUS_2,BLU ENERGY X PLUS 2 Blu,ENERGY_DIAMOND_MINI,ENERGY_DIAMOND_MINI,ENERGY_DIAMOND_MINI Blu,Energy X 2,BLU_Energy_X_2,Energy X 2 Blu,Energy X LTE,BLU_Energy_X_LTE,Energy X LTE +Blu,F5,F0090,F5 Blu,F91 5G,F0030UU,F91 5G Blu,G0290WW,G0290WW,G80 Blu,G33,G0890,G33 @@ -3893,9 +4080,11 @@ Blu,G33,G0892_MXT,G33 Blu,G33,G0892_SP,G33 Blu,G33,G0892_SYN,G33 Blu,G33,G0894,G33 +Blu,G34,G1070,G34 Blu,G40,G0730WW,G40 Blu,G40,G0790UU,G40 Blu,G43,G0950,G43 +Blu,G44,G0970,G44 Blu,G5,G0090,G5 Blu,G5 Plus,G0180LL,G5 Plus Blu,G5 Plus,G0190,G5 Plus @@ -3928,6 +4117,8 @@ Blu,G61S,G0530WW,G61S Blu,G61S,G0630WW,G61S Blu,G63,G0860,G63 Blu,G63,G0870,G63 +Blu,G64,G1010,G64 +Blu,G64L,G0990,G64L Blu,G70,G0151WW,G70 Blu,G70,G0250WW,G70 Blu,G70,G0251WW,G70 @@ -3937,8 +4128,10 @@ Blu,G71_PLUS_TIGO,G0560WW,G71 PLUS Blu,G72 MAX,G0770,G72 MAX Blu,G73,G0771,G73 Blu,G73L,G0930,G73L +Blu,G74,G1030,G74 Blu,G8,G0160LL,G8 Blu,G8,G0170,G8 +Blu,G84,G1050,G84 Blu,G9,G0130WW,G9 Blu,G9,G0130WW_SR,G9 Blu,G9 PRO,G0230WW,G9 PRO @@ -3969,6 +4162,7 @@ Blu,Grand_M2_LTE,G0050,Grand M2 LTE Blu,Grand_X,Grand_X,Grand X Blu,J10L,J0140,J10L Blu,J10L,J0150,J10L +Blu,J12,J0230,J12 Blu,J5,J0210,J5 Blu,J6L,J0110,J6L Blu,J6S,J210EQ,J6S @@ -4281,6 +4475,7 @@ Bravis,X500,BRAVIS_X500,BRAVIS X500 Bravis,bravis_A506,bravis_A506,bravis_A506 Bravva,DM-901,DM-901,DM-901 Bravva,Impress_Aero,Impress_Aero,Impress_Aero +Bridgestone_Mobility_Solutions,PRO X,poseidon,PRO X Brighton,MAL-FWTVTB,MAL-FWTVTB,MAL-FWTVTB Brightside,BS101,BS101,BS101 Brightside,BS701,BS701,BS701 @@ -4344,18 +4539,16 @@ C5 Mobile,noa X Plus,noa_X_plus,noa X plus C5 Mobile,noa X2 Plus,noa_x2_Plus,noa X2 Plus C5 Mobile,noa_G1,noa_G1,noa_G1 CAIXUN,APAC,tamachi,AiPlus2K +CAIXUN,Amstrong,cottongreen,Amstrong CAIXUN,Apollo Premium TV,nagata,Apollo Premium TV CAIXUN,Australian/EU,yeongdeungpo,AiPlus4K +CAIXUN,CAIXUN SMART TV,marina,CAIXUN SMART TV CAIXUN,Caixun TV,marina,Caixun TV CAIXUN,Caixun TV,nagata,Caixun TV CAIXUN,Canada,yeongdeungpo,AiPlus4K CAIXUN,Columbia,marina,Apollo Premium4K TV CAIXUN,Columbia,patrick,Aiplus4K -CAIXUN,Dreamstar 2K SMART TV,nagata,Dreamstar 2K SMART TV -CAIXUN,Dreamstar 4K SMART TV,marina,Dreamstar 4K SMART TV -CAIXUN,EXPRESS,marina,Apollo Premium4K TV CAIXUN,Europe,martin,Caixun Android TV -CAIXUN,Europe,martin,SE 2K Android Monitor CAIXUN,Europe,martin,Smarttech Android Monitor CAIXUN,Korea,marina,DWsummus 4K SMART TV CAIXUN,MAXWELL SMART TV,marina,MAXWELL SMART TV @@ -4372,6 +4565,8 @@ CANAL-PLUS,CANAL+ BOX,HY40A2,CANAL PLUS BOX CANAL-PLUS,CANALATV1,HY40A2,CANAL PLUS BOX CANAL-PLUS,CANALATV1,HY40A2,CANALATV1 CAST,CAST,CAST,CAST +CATCHTABLE,AZ101FC,AZ101FC,AZ101FC +CATCHTABLE,AZ101FCN,AZ101FCN,AZ101FCN CBN Media,connect,connect,connect CBN Media,g-mee1,g-mee1,g-mee1 CCC,AirStick,ts201,AIrStick @@ -4386,6 +4581,11 @@ CCIT,Xedition,Xedition,Xedition CEM Global,Continental,CE10412-26,CE10412-26 CEM Global,Continential,CE10402-16,CE10402-16 CEM Global,HS29779-18,HS29779-18,HS29779-18 +CEPTER,CEPTER-TAB-10L,CEPTER-TAB-10L,CEPTERTAB10L +CEPTER,CEPTER-TAB-10S,CEPTER-TAB-10S,CEPTERTAB10S +CEPTER,CEPTERTAB101,CEPTERTAB101,CEPTERTAB101 +CEPTER,CEPTERTAB1095,CEPTERTAB1095,CEPTERTAB1095 +CEPTER,CEPTERTAB10E,CEPTERTAB10E,CEPTERTAB10E CG Inspiring Life,Android TV,R1,ATV R1 CG Inspiring Life,Android TV,R2,ATV R2 CG Inspiring Life,R3,R3,R3 @@ -4428,6 +4628,8 @@ CHCNAV,LT800,LT800,LT800 CHCNAV,LT800H,LT800,LT800 CHEETAH,Diplomat,Diplomat,Diplomat CHN TELECOM,CHN-UCAN MJ,lefhd,CHN-UCAN MJ +CHOFSLIA,A6,A6,A6 +CHOFSLIA,A6_EEA,A6,A6 "CHUBU TELECOMMUNICATIONS CO.,INC",STI6130C,sti6130d353,STI6130C "CHUBU TELECOMMUNICATIONS CO.,INC",STI6130d353,sti6130d353,STI6130C CHiQ,H7,redwood,AI PONT @@ -4460,6 +4662,7 @@ CLIO,Zion_5,Zion_5,Zion_5 CLOUD_AiR-WiFi,ATab-1,ATab-1,CAW21T101 CMCC,M811,m811,M811 CMCC,M811,m811hk,M811 +CMF by Nothing,CMF by Nothing Phone 1,Tetris,A015 COCOMM,COCOMM F900B,F900BN0101,F900B COCOMM,ENOS,ENOS,ENOS COCOMM,F900,F900N0101,F900 @@ -4467,9 +4670,27 @@ COCOMM,F910B0101,F910B0101,F910 COEX,COEX 2K Smart TV,sunnyvale,COEX 2K Smart TV COEX,COEX 4K Smart TV,SW6H,COEX 4K Smart TV COEX,COEX 4K Smart TV FF,SW6H,COEX 4K Smart TV FF +COLORROOM,C1,C1,C1 +COLORROOM,C10_EEA,C10_EEA,C10 +COLORROOM,C10_ROW,C10_ROW,C10 +COLORROOM,C2,C2,C2 +COLORROOM,C3_EEA,C3_EEA,C3 +COLORROOM,C3_Pro_EEA,C3_Pro_EEA,C3_Pro COLORROOM,C3_Pro_ROW,C3_Pro_ROW,C3_Pro +COLORROOM,C3_ROW,C3_ROW,C3 COLORROOM,C5,C5,C5 +COLORROOM,C5_EEA,C5_EEA,C5 +COLORROOM,C5_EEA,C5_EEA,C5_EEA +COLORROOM,K07-pro,K07-pro_EEA,K07-pro +COLORROOM,K07-pro_EEA,K07-pro_EEA,K07-pro +COLORROOM,K08,K08,K08 +COLORROOM,K10,K10,K10 +COLORROOM,K10C,K10C,K10C +COLORROOM,K10C_EEA,K10C,K10C COLORROOM,K12,K12,K12 +COLORROOM,K12-EEA,K12-EEA,K12 +COLORROOM,K12-EEA,K12-EEA,K12-ROW +COLORROOM,K12E,K12E,K12E COMBUSTECH,COMBUSTECH-IFPD,rk3588_t,COMBUS_IB COMPUMAX,BLUEPAD10,BLUEPAD10,BLUEPAD10 COMPUMAX,BlueS10,COMPUMAX,BlueS10 @@ -4477,8 +4698,10 @@ COMTECO,DV8535,DV8535-KBC,DV8535 CONKER,ST60,ST_60,ST 60 CONKER,SX50,SX50,SX50 CONSUNG,CS10L_PRO,CS10L_PRO,CS10L_PRO +CONSUNG,N101A,N101A,N101A CONVERGE,T7045PS,T7045PS,T7045PS CONVERGE,T8045PS,T8045PS,T8045PS +COOCAA,ATBOX001 THE ULTRA,YDA,4K Google TV Box COOKIE,YS-CK0001,YS-CK0001,YS-CK0001 COOLFAN,C107,C107,C107 COOLFAN,C107_EEA,C107,C107 @@ -4515,10 +4738,12 @@ CORN,R20,R20,CORN R20 CORN,R40,R40,R40 CORN,R60,R60,CORN R60 CORN,Star10_3G,Star10_3G,Star10_3G +CORN,Star10_Pro,Star10_Pro,Star10_Pro CORN,Star7_3G,Star7_3G,Star7 3G CORN,Star8,Corn_Star8,CORN Star8 CORN,Star8,Star8,Star8 CORN,Star8_3G,Star8_3G,Star8_3G +CORN,Star9_Pro,Star9_Pro,Star9_Pro CORN,Tronik 13S,Tronik_13S,Tronik 13S CORN,Tronik_12,Tronik_12,Tronik_12 CORN,Tronik_12S,Tronik_12S,Tronik_12S @@ -4527,16 +4752,21 @@ CORN,X60,X60,X60 CORN,X60,X60S,X60 CORN,Y60,Y60,Y60 COSMOTE TV,TV Box,HY44G,TV Box +COSTEL,M16,M16,M16 CP Plus,CP-MUD-M721,CP-MUD-M721,CP-MUD-M721 +CRAIG,CMP846,CMP846,CMP846 CRONY,Smart TV,longshan,AI PONT CROWN MUSTANG,Argentina,martin,Crown Mustang 2K Android TV CROWN MUSTANG,Argentina,patrick,Crown Mustang 4K Android TV CTOUCH,CTOUCH Droid OPS Module,Droid_OPS_Module,UGE013AM CVTE,CVTE SA12,rk3588_t,SA12 series -CVTE,edu_v2,rk3588_t,edu_v2 +CVTE,"Guangzhou Shirui Electronics Co., Ltd",rk3576_u,edu_v2 +CVTE,"Guangzhou Shirui Electronics Co., Ltd",rk3588_t,edu_v2 CWELL,M10,M10,CWELL M10 CWOWDEFU,C10G,C10G,C10G CWOWDEFU,C10W_EEA,C10W_EEA,C10W_EEA +CWOWDEFU,C18W,C18W,C18W +CWOWDEFU,C18W_EEA,C18W_EEA,C18W_EEA CWOWDEFU,C6,C6,C6 CWOWDEFU,C6 Pro,C6_Pro,C6 Pro CWOWDEFU,C6 Pro ROW,C6_Pro,C6 Pro @@ -4556,13 +4786,26 @@ CWOWDEFU,F80L,F80L,F80L CWOWDEFU,F80W,F80W,F80W CWOWDEFU,F80W_EEA,F80W_EEA,F80W_EEA CWOWDEFU,F81L_EEA,F81L,F81L +CWOWDEFU,P12W,P12W,P12W +CWOWDEFU,P12W_EEA,P12W_EEA,P12W_EEA CWOWDEFU,P15W,P15W,P15W CWOWDEFU,P15W_EEA,P15W_EEA,P15W_EEA +CWOWDEFU,P16-C,P16-C,P16 +CWOWDEFU,P16-C,P16-C,P16-C CWOWDEFU,P20L,P20L,P20L CWOWDEFU,P20L ROW,P20L,P20L +CWOWDEFU,P25L,P25L,P25L +CWOWDEFU,P25W,P25W,P25W +CWOWDEFU,P25W_EEA,P25W_EEA,P25W_EEA +CWOWDEFU,P38W,P38W,P38W +CWOWDEFU,P38W_EEA,P38W_EEA,P38W_EEA +CWOWDEFU,P50L,P50L,P50L +CWOWDEFU,P50L_EEA,P50L_EEA,P50L_EEA CWOWDEFU,P80L,P80L,P80L CWOWDEFU,P81L,P81L,P81L CWOWDEFU,P83L,P83L,P83L +CWOWDEFU,S18,S18,S18 +CWOWDEFU,S18 EEA,S18,S18 CX Argentina,CX9011,CX9011,CX9011 CYX Group,A7008,A7008,A7008 CYX Group,Retailer Stores,A7009,A7009 @@ -4725,12 +4968,16 @@ Cavion,Base_5.0,Cavion_Base_5_0,Cavion_Base_5_0 Cavion,Base_72_GO,Base_72_GO,Base_72_GO Cavion,M1092Q,M1092Q,M1092Q Cavion,base10.3g silver,base10_3g_silver,base10_3g_silver +Caxilysh,A10,A10,A10 +Caxilysh,A10_EEA,A10,A10 Cedar,Cedar CT8X2,CT8X2,CT8X2 Cedar,Cedar CT8X2,CT8XEU,CT8XEU Ceibal,A102,A102,A102 Ceibal,A81G_Ibi,A81G_Ibi,A81G_Ibi Ceibal,ACRUX,ACRUX,ACRUX +Ceibal,Alfard,Alfard,Alfard Ceibal,BETELGEUSE,BETELGEUSE,BETELGEUSE +Ceibal,CEIBAL_HFP_LT,CEIBAL_HFP_LT,CEIBAL_HFP_LT Ceibal,GACRUX,GACRUX,GACRUX Ceibal,Ibirapita,A81F,A81F Ceibal,KIL-TAB82WIFI,KIL-TAB82WIFI,KIL-TAB82WIFI @@ -4825,6 +5072,7 @@ Cellution,IRIS,IRIS,IRIS Cellution,IRIS_EV,IRIS_EV,IRIS_EV Cellution,PADUA,PADUA,PADUA Cellution,PADUA_1,PADUA_1,PADUA_1 +Centerm,CTA Q7,SmartPOS,CTA Q7 Centric,Centric L3,L3,Centric CM3331 Centric,Centric L4,Centric_L4,Centric L4 Centric,G1,CM4331,CM4331 @@ -4832,9 +5080,11 @@ Centric,G1,CM4331,G1 CenturyLink,PureTV,ctl_iptv_mrvl,CTLPlayer CenturyLink,PureTV,ctl_iptv_mrvl,S60CLI Challenger,4K Smart TV,gangbyeon,Challenger 4K AI Smart TV +Challenger,55BO67,barking,CHALLENGER AndroidTV Challenger,Android TV,R1,ATV R1 Challenger,Android TV,R2,ATV R2 Challenger,CHALLENGER,lavender,4K SMART TV +Challenger,CHALLENGER,mountbaker,2K SMART TV Challenger,R3,R3,R3 Challenger,R4,R4,R4 Challenger,Smart TV,osaki,2K AI Smart TV @@ -5022,8 +5272,11 @@ China Network System (CNS),STB-9642C1,BCM72604,STB-9642C1 Chosunbiz,Chosunbiz,kPad,kPad Chuwi,CHUWI,Hi9Air,Hi9Air Chuwi,Hi10_XPro,Hi10_XPro,Hi10 XPro +Chuwi,Hi10_XPro_Pad,Hi10_XPro_Pad,Hi10_XPro_Pad +Chuwi,Hi10_XPro_Pad_EEA,Hi10_XPro_Pad_EEA,Hi10_XPro_Pad Chuwi,Hi9,Hi9,Hi9 Chuwi,Hi9Pro,Hi9Pro,Hi9Pro +Chuwi,HiPad 11,HiPad_11,HiPad 11 Chuwi,HiPad Max,HiPad_Max,HiPad Max Chuwi,HiPad-Air,HiPad-Air,HiPad-Air Chuwi,HiPad-Air-EEA,HiPad-Air,HiPad-Air @@ -5038,15 +5291,20 @@ Chuwi,HiPadPro,HiPadPro,HiPadPro Chuwi,HiPadX-1_EEA,HiPadX,HiPad X Chuwi,HiPadX_11,HiPadX,HiPadX Chuwi,HiPadX_ROW,HiPadX,HiPadX +Chuwi,HiPad_11_EEA,HiPad_11,HiPad 11 Chuwi,HiPad_Pro,CH108Q,HiPad Pro +Chuwi,HiPad_X,HiPad_X,HiPad X Chuwi,HiPad_XPro,HiPad_XPro,HiPad XPro Chuwi,HiPad_XPro_EEA,HiPad_XPro_EEA,HiPad XPro Chuwi,HiPad_XPro_EEA13,HiPad_XPro,HiPad XPro +Chuwi,HiPad_XPro_ROW13,HiPad_XPro,HiPad XPro Chuwi,HiPad_XPro_RU,HiPad_XPro,HiPad XPro +Chuwi,HiPad_Xpro_Pad,HiPad_Xpro_Pad,HiPad XPro Chuwi,HipadX,HipadX,HiPad X Chuwi,HipadX_eea_1,HipadX,HiPad X Chuwi,HipadX_ru,HipadX,HiPad X Chuwi,Surpad,Surpad,Surpad +Cidea,CM14000Plus,CM14000Plus,CM14000Plus Cidea,CM76,CM76_EEA,CM76 Cidea,CM77,CM77,CM77 Cidea,CM81,CM81_EEA,CM81 @@ -5054,12 +5312,19 @@ Cidea,CM82,CM82,CM82 Cidea,CM826,CM826,CM826 Cidea,CM90,CM90,CM90 Cidea,CM91_EEA,CM91_EEA,CM91_EEA +Cidea,CM92_EEA,CM92_EEA,CM92 +Cidea,CM93,CM93,CM93 +Cidea,P100,P100,P100 Cidea,P1100,P1100,P1100 Cidea,P1150,P1150,P1150 +Cidea,P1300,P1300,P1300 +Cidea,P1350,P1350,P1350 +Cidea,P150,P150,P150 CignalPlayTV,CIGSEI100,CIGSEI100,CIGSEI100 Ciontek,CS20,CS20,CS20 Ciontek,CS30,CS30,CS30 Ciontek,CS50,CS50,CS50 +Ciontek,CS50C,CS50C,CS50C Ciontek,CS50_EEA,CS50,CS50 Cipherlab,Cipherlab RK25,RK25,RK25 Cipherlab,Hera51,Hera51,Hera51 @@ -5107,8 +5372,8 @@ Classpro,EGS42FHD,ikebukuro,AI PONT Classpro,G7N,redwood,AI PONT Classpro,Smart TV,longshan,AI PONT ClearTouch,NEXT_TDED,rk3588_t,CTI_NEXT_TDED_S10 -ClearTouch,UX Pro Edge,rk3588_t,UX_Pro_Edge_Display ClearTouch,six_zero_XXAplus,rk3588_t,six_zero_XXAplus +Clearsounds,CSTAAP8D,CSTAAP8D,CSTAAP8D Clementoni,CLEMPAD_2018,CLEMPAD_2018,CLEMPAD_2018 Clementoni,Clempad 4.4 Basic Special,Clempad2_special,Clempad2_special Clementoni,Clempad 4.4 Plus,Clempad2_plus,Clempad2_plus @@ -5136,7 +5401,10 @@ Clementoni,My First Clempad HR Plus,MFC_HR_Plus,MFC_HR_Plus Clementoni,My first Clempad 4.4 Basic Special,MFC2_Special,MFC2_Special Clementoni,My first Clempad 4.4 Plus,MFC2_Plus,MFC2_Plus Clementoni,Neo_Clempad_2021,Neo_Clempad_2021,Neo_Clempad_2021 +Clevertouch,Clevertouch LUX Mini,rk3588_t,LUX_Mini +Clevertouch,Clevertouch LUX Mini,rk3588_t,LUX_Mini_Module Clevertouch,IMPACT Lux,rk3588_t,Impact_Lux_Display +Clevertouch,UX Pro Edge,rk3588_t,UX_Pro_Edge_Display Click,M9021G,M9021G,M9021G Click,S7043G,S7043G,S7043G Click,"Tab 7""",I7043G,I7043G @@ -5185,6 +5453,7 @@ Cloud_Mobile,Stratus_C8,Stratus_C8,Stratus C8 Clout,Hind 5.1,Hind_5_1,Hind 5.1 Clout,X425 Shavit,X425_Shavit,X425 Shavit Clout,X428 Astute,X428_Astute,X428 Astute +Clover,KD101,KD101,KD101 Cobalt,CP101P,POS,CP101P Cobalt,Cobalt T10 wifi,Cobalt_T10_wifi,Cobalt_T10_wifi Cobalt,Cobalt-T7_3G,Cobalt-T7_3G,Cobalt-T7_3G @@ -5230,6 +5499,7 @@ Comio,COMIO P1,ComioP1,COMIO P1 Comio,COMIO S1,ComioS1,COMIO S1 Comio,COMIO S1 Lite,ComioS1Lite,COMIO S1 Lite Comio,COMIO X1,ComioX1,Comio X1 +CommBox,CommBox Classic S5,rk3576_u,CommBox_Classic_S5 Compal,,CA22,COSMO DUO Compal,,CAP5,A600 Compal,,CAP6,A600 @@ -5259,10 +5529,13 @@ Compaq,QT10,Compaq_QT10,QT10 Compaq,QTAB,QTAB,QTAB Compaq,QTAB10_1,QTAB10_1,QTAB10.1 Compaq,QTAB10_1,QTAB10_1,QTAB10_1 +Compaq,QTAB10_PLUS,QTAB10_PLUS,QTAB10 PLUS +Compaq,QTAB10_PLUS,QTAB10_PLUS,QTAB10_PLUS Compaq,QTAB8,QTAB8,QTAB8 Compaq,QTab10.1_LTE,QTab10_LTE,QTab10_LTE Compaq,QTab8,QTab8,QTab8 Compaq,QTab8_LTE,QTab8_LTE,QTab8_LTE +Compaq,QTabPro,QTabPro,QTabPro Compaq,QTabPro,Qtab,QTabPro Compaq,Qtab 10.1 with keyboard,Qtab10,Qtab 10.1 with keyboard Compaq,Qtab10Plus,Qtab10Plus,Qtab10Plus @@ -5299,6 +5572,7 @@ Condor,C7,PGN_506,PGN-506 Condor,C_5,u970_5,C-6 Condor,Customer need debug,TB108W,TB108W Condor,G6 Pro,PHQ526,PHQ526 +Condor,GT60 PRO,GT60_PRO,GT60 PRO Condor,Griffe G5,PHQ520,Griffe G5 Condor,Griffe G5,PHQ520,PHQ520 Condor,Griffe G5 Plus,PAM524,PAM524 @@ -5322,6 +5596,7 @@ Condor,Infinity E5 Pro,Infinity_E5_Pro,Infinity e5 pro Condor,Infinity_E4,Infinity_e4,Infinity e4 Condor,Infinity_a4,Infinity_a4,Infinity a4 Condor,Infinity_i5,Infinity_i5,Infinity_i5 +Condor,NOVA60,NOVA60,NOVA60 Condor,PGN404,PGN404,PGN404 Condor,PGN409,PGN409,PGN409 Condor,PGN410,PGN410,PGN410 @@ -5371,6 +5646,11 @@ Condor,Plume_L5_Pro,Plume_L5_Pro,Plume L5 Pro Condor,R4,R4,R4 Condor,SP530,SP530,Griffe T2 Condor,SP638,SP638,Plume L3 Smart +Condor,SP659,NOVA60_i,NOVA60 i +Condor,SP661,GT60,GT60 +Condor,SP662,NOVA_70SE,NOVA 70SE +Condor,SP663,NOVA_70i,NOVA 70i +Condor,SP664,NOVA_70,NOVA 70 Condor,Smart TV,redwood,AI PONT Condor,T705,TGW710G,TGW710G Condor,TB105L,TB105L,TB105L @@ -5431,6 +5711,7 @@ Continental Edison,France,tamachi,Continental Android TV Continential,CE10412,CE10412,CE10412 Continential,Edison-Continential,komagome,Continental 2K Android TV Contixo, K101A,K101A,K101A +Contixo,A1-64G,A1-64G,A1-64G Contixo,CONTIXO_V8,CONTIXO-V8,V8 Contixo,K101,K101,K101 Contixo,K102,K102,K102 @@ -5439,6 +5720,7 @@ Contixo,K103,K103,K103 Contixo,K103A,K103A,K103A Contixo,K4,K4,K4 Contixo,K80,K80,K80 +Contixo,K81,K81,K81 Contixo,LA703R,LA703R,LA703R Contixo,V10,V10,V10 Contixo,V10A,V10A,V10A @@ -5593,8 +5875,10 @@ Coolpad,COOL 20S 5G,CP07,CP07 Coolpad,COOLPAD_C202,COOLPAD_C202,COOLPAD C202 Coolpad,COOLPAD_C203,COOLPAD_C203,COOLPAD C203 Coolpad,CP12,CP12,CP12 +Coolpad,CP12P,CP12p,CP12p Coolpad,CP12p_S0,CP12p,CP12p Coolpad,CP12s,CP12s,CP12s +Coolpad,CP32,CP32,CP32 Coolpad,CP3503L,CP3503L,CP3503L Coolpad,CP3504L,CP3504L,CP3504L Coolpad,CP5108,msm7627a_a8_5108_new,Coolpad 5108 @@ -5706,7 +5990,10 @@ Coolpad,Y91-921,Y91,Coolpad Y91-921 Coolpad,Y92-9,Y92-9,Coolpad Y92-9 Coolpad,coolpad 5651,CP12p,CP12p Coolpad,coolpad COOL 20,k69v1_64,CP03 +Coolpad,coolpad COOL 30 Play,CP36t,CP36t Coolpad,coolpad COOL 30i,CP12Q,CP12Q +Coolpad,coolpad CP12,CP12,CP12 +Coolpad,coolpad CP12s,CP12s,CP12s Coolpad,coolpad N7 Air,2021,2021 Coolpad,coolpad N7 Plus,coolpad_N7_Plus,2032 Coolpad,cp3648A,cp3648a,cp3648A @@ -5791,11 +6078,13 @@ Crosscall,Core-X5,L771,Core-X5 Crosscall,Core-Z5,L790,Core-Z5 Crosscall,Core-Z5,L790_02,Core-Z5 Crosscall,ODYSSEY,ODYSSEY3G,ODYSSEY +Crosscall,Stellar-M6,L768,Stellar-M6 Crosscall,Stellar-X5,L780,Stellar-X5 Crosscall,TREKKER- X3,HS8952QC,TREKKER-X3 Crosscall,TREKKER-M1 CORE,HS8909QC,TREKKER-M1 CORE Crosscall,Trekker- M1,HS8916QC,Trekker-M1 Crosscall,Trekker- X4,HSSDM660QC,Trekker-X4 +CryptoDATA,HidR_EVO,HidR_EVO,EVO CryptoDATA,Hidr S1 PRO,Hidr_S1_PRO,Hidr_S1_PRO CryptoDATA,Hidr S1 PRO ROW,Hidr_S1_PRO,Hidr_S1_PRO CryptoDATA,Hidr S1 PRO RU,Hidr_S1_PRO,Hidr_S1_PRO @@ -5811,7 +6100,9 @@ Ctroniq,SNOOK-X10,4G_TABLET,SNOOK-X10 Ctroniq,SNOOK-X10,SNOOK-X10,SNOOK-X10 Ctroniq,SNOOK-X75,SNOOK-X75,SNOOK-X75 Ctroniq,SNOOK-X80,SNOOK-X80,SNOOK-X80 +Cubot,A10,A10,A10 Cubot,A1_EEA,A1,A1 +Cubot,A20,A20,A20 Cubot,C20,C20,C20 Cubot,C30,C30,C30 Cubot,CUBOT CHEETAH 2,CUBOT_CHEETAH_2,CUBOT CHEETAH 2 @@ -5841,12 +6132,17 @@ Cubot,KINGKONG 6,KINGKONG_6,KINGKONG 6 Cubot,KINGKONG 7,KINGKONG_7,KINGKONG 7 Cubot,KINGKONG 8,KINGKONG_8,KINGKONG 8 Cubot,KINGKONG 9,KINGKONG_9,KINGKONG 9 +Cubot,KINGKONG ACE 2,KINGKONG_ACE_2,KINGKONG ACE 2 +Cubot,KINGKONG ACE 3,KINGKONG_ACE_3,KINGKONG ACE 3 Cubot,KINGKONG CS,KING_KONG_CS,KING KONG CS +Cubot,KINGKONG ES,KINGKONG_ES,KINGKONG_ES Cubot,KINGKONG MINI 3,KINGKONGMINI3,KINGKONG MINI 3 Cubot,KINGKONG MINI2,KINGKONG_MINI2,KINGKONG MINI2 Cubot,KINGKONG MINI2 Pro,KINGKONG_MINI2_Pro,KINGKONG MINI2 Pro Cubot,KINGKONG MINI2 Pro,KINGKONG_MINI2_Pro,KINGKONG_MINI2_Pro +Cubot,KINGKONG POWER 3,KINGKONG_POWER_3,KINGKONG POWER 3 Cubot,KINGKONG STAR,KINGKONG_STAR,KINGKONG STAR +Cubot,KINGKONG STAR 2,KINGKONG_STAR_2,KINGKONG STAR 2 Cubot,KINGKONG X,KINGKONG_X,KINGKONG X Cubot,KINGKONG_MINI,KINGKONG_MINI,KINGKONG_MINI Cubot,KING_KONG_3,KING_KONG_3,KING_KONG_3 @@ -5854,6 +6150,7 @@ Cubot,MANITO,CUBOT_MANITO,CUBOT_MANITO Cubot,MAX,x6069_cubot_5365u,CUBOT MAX Cubot,MAX 2,MAX_2,MAX 2 Cubot,MAX 3,MAX_3,MAX 3 +Cubot,MAX 5,MAX_5,MAX 5 Cubot,NOTE 20,NOTE_20,NOTE 20 Cubot,NOTE 20 PRO,NOTE_20_PRO,NOTE 20 PRO Cubot,NOTE 30,NOTE_30,NOTE 30 @@ -5885,6 +6182,7 @@ Cubot,TAB 20,TAB_20,TAB 20 Cubot,TAB 40,TAB_40,TAB 40 Cubot,TAB 50,TAB_50,TAB 50 Cubot,TAB KINGKONG,TAB_KINGKONG,TAB KINGKONG +Cubot,TAB KINGKONG 2,TAB_KINGKONG_2,TAB KINGKONG 2 Cubot,X19,X19,X19 Cubot,X19_S,X19_S,X19 S Cubot,X20,X20,X20 @@ -5945,10 +6243,16 @@ DBM Maroc,Speed X2,Speed-X2,Speed-X2 DCG-INSPIRATECH,DCG-N10,DCG-N10,DCG-N10 DEA Factory,KTAB,KTAB,KTAB DEED,DC-WT15,DC-WT15,DC-WT15 +DEERTiME,E10_EEA,E10_EEA,E10_EEA +DEERTiME,E10_US,E10_US,E10_US +DEERTiME,E15_EEA,E15_EEA,E15_EEA +DEERTiME,E15_US,E15_US,E15_US DEPLAY,BS101_EEA,BS101_EEA,BS101_EEA DEPLAY,BS703_EEA,BS703_EEA,BS703_EEA DEPLAY,BS801,BS801_EEA,BS801 DEPLAY,E108GCM,E108GCM,E108GCM +DEPLAY,LITE4_EEA,LITE4_EEA,LITE4_EEA +DEPLAY,PRO4,PRO4,PRO4 DEWSOD,C9,C9,C9 DEXP,A.350,A350,A350 DEXP,A150,A150,A150 @@ -6137,6 +6441,7 @@ DEXP,Z455,Z455,Z455 DEXP,lxion MS255,MS255,Ixion MS255 DEYI,DEYI-10M18,DEYI-10M18,DEYI-10M18 DEYI,DEYI10M18,DEYI10M18A53,DEYI10M18A53 +DGTEC,DG101HSTB,DG101HSTB,DG101HSTB DGTEC,DG101TBIPS,DG101TBIPS,DG101TBIPS DGTEC,DG7TBIPSBT,DG7TBIPSBT,DG7TBIPSBT DGTEC,DG7TBIPSDG,DG7TBIPSDG,DG7TBIPSDG @@ -6170,11 +6475,14 @@ DIALN,X65,X65,X65 DIALN,X65,X65A,X65 DIALN,X65,X65B,X65 DIALN,X65,X65C,X65 +DIALN,X68,X68,X68 +DIALN,X68,X68B,X68 DIALN,X8G,X8G,X8G DIALN,X8PRO,X8PRO,X8 PRO DIALN,X8ULTRA,X8ULTRA,X8ULTRA DIAMANT,EU,tamachi,DIAMANT Android TV DIAMANT,EU,yeongdeungpo,DIAMANT Android TV +DIDIK,DT24Plus,DT24Plus,DT24Plus DIDIK_TAB,DT24,DT24,DT24 DIFRNCE,DIT702201,DIT702201,NID_7010 DIJITSU,DCT 90,DCT_90,DCT 90 @@ -6211,12 +6519,22 @@ DL,Tablet_DL_3724,Tablet_DL_3724,Tablet_DL_3724 DL,X_Quad_Pro,X_Quad_Pro,Tablet DL 3410 DL,YZU_DS53,Smartphone_YZU_DS53,Smartphone_YZU_DS53 DL,i-Player_KIDS,Tablet_DL_3910,Tablet_DL_3910 +DMOAO,D11_EEA,D11_EEA,D11_EEA +DMOAO,D2_EEA,D2_EEA,D2_EEA +DMOAO,D2_US,D2_US,D2_US +DMOAO,D3_EEA,D3_EEA,D3_EEA DMOAO,D5-EEA,D5-EEA,D5-EEA +DMOAO,D5-T-EEA,D5-T-EEA,D5-T-EEA +DMOAO,D5-T-US,D5-T-US,D5-T-US DMOAO,D5-US,D5-US,D5-US +DMOAO,D6_EEA,D6_EEA,D6_EEA +DMOAO,DMOAO_D2_EEA,DMOAO_D2_EEA,DMOAO_D2_EEA +DMOAO,DMOAO_D2_US,DMOAO_D2_US,DMOAO_D2_US DNA,DNA,dctiw384,DNA Android TV DNA,DNA Hubi 2.0,m393gena,DNA Hubi 2.0 DNA,DNA Hubi Soundbox,m393vsb_dna,DNA Hubi Soundbox DNA,DNA TV-hubi,dctiw384,DNA Android TV +DNS:NET,DNSNETB866VW,DNSNETB866VW,DNSNETB866VW DO Mobile,DO_Mate2,Mate2,Mate2 DO Mobile,Mate1,Mate1,DO_S1 DO Mobile,Mate1,Mate1,Mate1 @@ -6229,14 +6547,17 @@ DOMATON,K111,K111,K111 DOMATON,K712,K712,K712 DOMATON,MID_1099IPS,MID_1099IPS,MID_1099IPS DOMATON,Ocean_K10,Ocean_K10,Ocean K10 +DOMO,VT502A,VT502A,VT502A DORA,Android TV,R1,ATV R1 DORA,Android TV,R2,ATV R2 DORA,Smart TV,longshan,AI PONT DORA,Smart TV,redwood,AI PONT +DPSTec,DTB,DTB,DTB DREAMTECH,STARPAD,STARPAD,STARPAD DSIC,Mobilebase DS6,ds6,DS6 DSIC,RD86QE,RD86QE,RD86QE DSTechnology,MATE ONE,MO_Pro,MO_Series +DTAB,TK-P617_3.3Ghz,TK_P617_3_3Ghz,TK_P617_3_3Ghz DTC products,S10,S10,S10 DTC products,S30,S30,S30 DTV (Thai),P3,Digital_Life_P3,P3 @@ -6258,6 +6579,7 @@ Daewoo,4K Smart TV,pioneer,4K SA Smart TV Daewoo,4K Smart TV,pioneer,DAEWOO 4K SA Smart TV Daewoo,DAEWOO,lavender,4K SMART TV Daewoo,DAEWOO,mountbaker,2K SMART TV +Daewoo,DAEWOO,mountbaker,DAEWOO SMART TV Daewoo,DAEWOO SMART TV,SW6H,DAEWOO SMART TV Daewoo,DAEWOO SMART TV,sunnyvale,DAEWOO SMART TV Daewoo,DW-TN7RK16,DW-TN7RK16,DW-TN7RK16 @@ -6280,7 +6602,11 @@ Daiwa,2K DATV,capitolhill,2K DATV Daiwa,2K DATV,capitolhill,Daiwa 2K Google TV Daiwa,4K DATV,keoneae,4K DATV Daiwa,4K DATV,keoneae,Daiwa 4K Google TV +Daiwa,4K DATV-Z,keoneae,4K DATV-Z Daiwa,4K DATV-Z,keoneae,Daiwa 4K Google TV-Z +Daiwa,DAIWA,hongkong,4K DVB SMART TV +Daiwa,DAIWA,mountbaker,2K SMART TV +Daiwa,DAIWA,mountbaker,DAIWA 2K SMART TV Danew,D809ProPlus,D809ProPlus,D809ProPlus Danew,DSlide 710,Dslide710,Dslide710 Danew,DSlide 750,Danew_DSlide750,DSlide750 @@ -6307,6 +6633,7 @@ Danew,Dslide808,Dslide808,Dslide808 Danew,Dslide971DC,Dslide971DC,Dslide971DC Danew,Dslide_1020,Dslide_1020,Dslide_1020 Danew,Dslide_1020M,Dslide_1020M,Dslide_1020M +Danew,Dslide_1020Pro_EEA,Dslide_1020Pro,Dslide_1020Pro Danew,Dslide_1021C,Dslide_1021C,Dslide_1021C Danew,Dslide_1021_EEA,Dslide_1021,Dslide_1021 Danew,Dslide_1025_EEA,Dslide_1025_EEA,Dslide_1025 @@ -6334,6 +6661,7 @@ Danew,Surnaturel_R500,Surnaturel_R500,Surnaturel_R500 Danew,TRACE ONE,T_ONE,T_ONE Danew,konnect 601,Konnect_601,Konnect_601 Dangbei,DBOD02,himalaya,DBOD02 +Dangbei,DBPADGO1,DBPADGO1,DBPADGO1 Dany,MAXX_05,MAXX_05,MAXX_05 Dany,Signature-S8,Signature-S8,Signature-S8 Daria,zahedan,zahedan,DM-B50104 @@ -6346,12 +6674,15 @@ Datalogic,MEMOR 1,M1_PISTOL,Memor 1 Datalogic,MEMOR 11,m11,Memor 11 Datalogic,Memor 20,Q10,Memor 20 Datalogic,Memor 20,Q10A,Memor 20 +Datalogic,Memor 30/30X,nebula_pda,Memor 30/30X +Datalogic,Memor 35/35X,nebula_pda,Memor 35/35X Datalogic,Memor K,memor_k,Memor K Datalogic,Skorpio X5,sx5,Skorpio X5 Datamini,K508101,K508101,K508101 Datamini,K908H4G,K908H4G,K908H4G Datamini,T104G,T104G,T104G Datamini,T104G_T610,T104G_T610,T104G_T610 +Datamini,T104G_T618,T104G,T104G Datamini,T74G,T74G,T74G Datamini,T8004G,T8004G,T8004G Datamini,T84G,T84G,T84G @@ -6375,6 +6706,7 @@ Dcode,DS_BD4_Pro,DS_BD4_Pro,DS-BD4 Pro Dcode,DS_CL1,DS_CL1,DS-CL1 Dcode,DS_CL2_Lite,DS_CL2_Lite,DS-CL2 Lite Dcode,DS_CL2_Pro,DS_CL2_Pro,DS-CL2 Pro +Dcode,DS_CL4_Lite,DS_CL4_Lite,DS-CL4 Lite Dcode,DS_CL4_Lite_C,DS_CL4_Lite,DS-CL4 Lite Dcode,DS_CL4_Pro,DS_CL4_Pro,DS-CL4 Pro Dcolor,GD1 4K,YUL,GD1 4K @@ -6382,6 +6714,7 @@ Ddm,ANDY 5EI,AM5E3I047,ANDY 5EI DeWALT,DeWalt md501,md501,md501 Decaview,Decaview 2K Google TV,capitolhill,Decaview 2K Google TV Decaview,Decaview 4K Google TV,keoneae,Decaview 4K Google TV +DeepHub,DeepHub Ultimate,rk3588_t,MC480-U Delephas,"Chang Co., Ltd",seocho,Delephas 4K Android TV Dell,,Dell_Grappa,Dell Aero Dell,,Dell_Grappa,Mini_3iG @@ -6477,10 +6810,16 @@ Denver Electronics,TIQ-70,TIQ-70,TIQ-70 Denver Electronics,TIQ_1048,TIQ_1048,TIQ-1048 Detco,Detco 4K Google TV,keoneae,Detco 4K Google TV Deutsche Telekom,T Phone,Jaguar,T Phone +Deutsche Telekom,T Phone 2,PUMA,T Phone 2 +Deutsche Telekom,T Phone 2 Pro,CHEETAH,T Phone 2 Pro Deutsche Telekom,T Phone Pro,Lion,T Phone Pro Deutsche Telekom,T Phone Pro (2023),Tiger,T Phone Pro (2023) Deutsche Telekom,T Phone (2023),Leopard,T Phone (2023) Deutsche Telekom,T Tablet,Hubbs,T Tablet +Dghrti,TAB20_EEA,TAB20_EEA,TAB20_EEA +Dghrti,TAB20_US,TAB20_US,TAB20_US +Dghrti,TAB8_EEA,TAB8_EEA,TAB8_EEA +Dghrti,TAB8_US,TAB8_US,TAB8_US DiDi (Japan),DDT-001,DDT-001,DDT-001 DiMora Mobile,Adrenalin Pro,Adrenalin_Pro,Adrenalin Pro DiMora Mobile,DiMora_LUX,DiMora_LUX,DiMora_LUX @@ -6511,6 +6850,7 @@ Dicle_Tab,Dicle Tab Active S,Dicle_Dtab_Active_S,Dicle_Dtab_Active_S Dicle_Tab,Dicle Tab MyPen P1,Tab_MyPen_P1,Tab_MyPen_P1 Dicle_Tab,Dicle Tab U1008,Dicle_Dtab_U1008,Dicle_Dtab_U1008 Dicle_Tab,Dicle Tab Ultra,Tab_Ultra,Tab_Ultra +Dicle_Tab,Dicle Tab XPAD,Dicle_Tab_XPAD,U1101 Dicle_Tab,Dicle_Tab_Active,Active,Active Digi,Digi C1,Digi_C1,Digi C1 Digi,Digi C2,Digi_C2,Digi C2 @@ -6790,6 +7130,7 @@ Dish,SV10,HiCast,SV10 Dish,Wireless Joey 4,ATVWJ4,Wireless Joey 4 DishTV (IN),D-805XATV HD,SEI110,D-805XATV HD DishTV-NZ,A7070,STB,A7070 +DishTV-NZ,A7080,SEI730BSVU,A7080 DishTV-NZ,SV10,HiCast,SV10 DishTV-NZ,SV11,ICN,SV11 DishTV-NZ,SV11HD,IAD,SV11HD @@ -6824,8 +7165,10 @@ Dixon,L-5,L-5,L-5 Dixon,L1,L1,L1 Dixon,S5790,S5790,S5790 Dixon,S90,S90,S90 +Dixon,TS-M105D,TS-M105D,TS-M105D Dixon,TS-M105G-1,TS-M105G-1,TS-M105G-1 Dixon,TS-M704F-1,TS-M704F-1,TS-M704F-1 +Dixon,TS-M704G,TS-M704G,TS-M704G Dixon,TS_M103A,TS_M103A,TS_M103A Docomo,F-06F,F06F,F-06F Docomo,Japan,TT01,TT01 @@ -6841,10 +7184,15 @@ Doogee,BL12000 PRO,t758_dg_a67t_n,BL12000 PRO Doogee,BL5000,BL5000,BL5000 Doogee,BL5500_Lite,BL5500_Lite,BL5500_Lite Doogee,BL7000,BL7000,BL7000 +Doogee,Blade10,F1CK,Blade10 +Doogee,Blade10 Max,F1P,Blade10 Max +Doogee,Blade10 Pro,F1C,Blade10 Pro +Doogee,Blade10 Ultra,F1CT,Blade10 Ultra +Doogee,DK10,ZN138,DK10 Doogee,F10,F1,F10 -Doogee,F10 Pro,F1S,F10 Pro Doogee,F10S,F1C,Blade10 Pro Doogee,F10S,F1C,F10S +Doogee,Fire_6_Power,F1S,F10 Pro Doogee,MIX,t766_dg_n_mix,MIX Doogee,MIX Lite,t766_dg_a66,MIX Lite Doogee,Mix,MIX,MIX @@ -6863,6 +7211,15 @@ Doogee,N50,1918Y,N50 Doogee,N50 Plus,1918P,N50 Plus Doogee,N50Pro,1918N,N50Pro Doogee,N50S,1918D,N50S +Doogee,N53,1928D,N53 +Doogee,N55,1928,N55 +Doogee,N55 Plus,1928Y,N55 Plus +Doogee,N55 Pro,1928P,N55 Pro +Doogee,N56,1928E,N56 +Doogee,N56 Max,1928N,N56 Max +Doogee,N56 Plus,1928P,N55 Pro +Doogee,N56 Plus,1928P,N56 Plus +Doogee,N56 Pro,1928T,N56 Pro Doogee,N60Pro,1919,N60Pro Doogee,N70,1925T,N70 Doogee,P3Mini Kid,P3Mini_Kid,T20Mini Kid @@ -6870,11 +7227,16 @@ Doogee,R08,PT3,R08 Doogee,R10,PT1,R10 Doogee,R10,PT1,R10 Pro Doogee,R20,PT2,R20 +Doogee,S cyber,M22GS,S cyber +Doogee,S punk,M22C,S punk Doogee,S100,M22,S100 Doogee,S100Pro,M22H,S100Pro Doogee,S108,M22G,S108 Doogee,S108,M22G,S118 Doogee,S110,M22P,S110 +Doogee,S118,M22G,S118 +Doogee,S120,M22C,S punk +Doogee,S200,M24P,S200 Doogee,S30,S30,S30 Doogee,S35,S35,S35 Doogee,S35,S35H,S35 @@ -6930,23 +7292,36 @@ Doogee,Shoot_ 1,Shoot_1,Shoot_1 Doogee,Smini,ZN137,Smini Doogee,T10,P1,T10 Doogee,T10,P1_2,T10 +Doogee,T10 Pro,P1S_2,T10Pro Doogee,T10E,P4,T10E +Doogee,T10E,P4,T40 +Doogee,T10Plus,P1T,T10PLUS Doogee,T10Plus,P1T,T10Plus Doogee,T10Pro,P1_2,T10Pro Doogee,T10S,P1D,T10S Doogee,T10SE,P4,T10E +Doogee,T10W,P1TC,T10W +Doogee,T10W,T1,T10W Doogee,T20,P2,T20 Doogee,T20,P2_2,T20 +Doogee,T20 Pro,P2TE,T20 Pro Doogee,T20Mini,P3Mini,T20Mini Doogee,T20Mini Pro,P3MiniS,T20Mini Pro Doogee,T20S,P2D,T20S Doogee,T20Ultra,P2T,T20Ultra +Doogee,T30 Max,P3T,T30 Max Doogee,T30 Mini,P3MiniTE_2,T30 Mini Doogee,T30 Mini Pro,P3MiniT,T30 Mini Pro +Doogee,T30 SE,P3C,T30 SE +Doogee,T30E,P3G,T30E +Doogee,T30E Pro,P3GS,T30E Pro Doogee,T30Pro,P3Pro,T30Pro +Doogee,T30Pro,P3Pro,T35 Doogee,T30S,P3D,T30S Doogee,T30S,P3D_2,T30S Doogee,T30Ultra,P3,T30Ultra +Doogee,T40,P3_Plus,T40 +Doogee,T40 Pro,P2TH,T40 Pro Doogee,T5,T5,T5 Doogee,T5S,T5S,T5S Doogee,U10,RK1,U10 @@ -6957,9 +7332,11 @@ Doogee,U8,RK3,U8 Doogee,U8 Kid,RK3KID,U8 Kid Doogee,U9,RK2,U9 Doogee,U9 Kid,RK2KID,U9 Kid +Doogee,U9Pro,T1,U9 Pro Doogee,V MAX,M23H,V Max Doogee,V Max,M23H,V Max Doogee,V Max,M23HR,V Max +Doogee,V Max Plus,M23HT,V Max Plus Doogee,V Max Pro,M23HC,V Max Pro Doogee,V10,V10,V10 Doogee,V10,V10,V11 @@ -7028,9 +7405,11 @@ Doogee,Y9Plus,Y9Plus,Y9Plus Doogee,shoot 2,t591_dga57_we,Shoot_2 Doopro,C1,C1,C1 Doopro,C1_Pro,C1_Pro,C1_Pro +Doopro,G10,T1_2,G10 Doopro,G11,P4_2,G11 Doopro,G20,P1TE,G20 Doopro,G8,RK3_2,G8 +Doopro,G8 Kid,RK3KID_2,G8 Kid Doopro,P1,P1,P1 Doopro,P1_Pro,P1_Pro,P1_Pro Doopro,P2,br6580_weg_n,P2 @@ -7144,6 +7523,8 @@ Dragontouch,Y88X_PRO_EEA,Y88X_PRO,Y88X_PRO Dragontouch,Y88X__PLUS,Y88X__PLUS,Y88X__PLUS DreamMaker,DreamMaker,DPLAY,DPLAY Dreamax,DMX-ST7A,DMX-ST7A,DMX-ST7A +Dreamstar,Dreamstar 2K SMART TV,nagata,Dreamstar 2K SMART TV +Dreamstar,Dreamstar 4K SMART TV,marina,Dreamstar 4K SMART TV Dreamstar,Nova,YYZ,Nova Dtac,Phone M2,dtacPhoneM2,dtacPhoneM2 Dtac,Phone S2,dtacPhoneS2,dtac_Phone_S2 @@ -7161,6 +7542,7 @@ Dual,Dual 4K Android TV,kenton,Dual 4K Android TV Dunns,Dunns Slinger,DunnsSlinger,Dunns Slinger Dunns,ETAB_M9041G,ETAB_M9041G,ETAB_M9041G Dunns,Smarty II,Smarty_II,Smarty_II +DuraGo,DG3200RTV,DG3200RTV,DG3200RTV Durabrand,Central America,nippori,Durabrand 2K Android TV Durabrand,DB Android TV 2K,broadway,DB Android TV 2K Durabrand,DB Android TV 4K,dupont,DB Android TV 4K @@ -7236,10 +7618,13 @@ EDENWOOD,EDENWOOD 4K Android TV,kenton,EDENWOOD 4K Android TV EDUTAB,ELITE_10,ELITE_10,ELITE_10 EGBOK,P803,P803,P803 EGOBOO,EB101,EB101,EB101 +EGOBOO,EB104,EB104,EB104 EGOTEK,AK10,AK10,AK10 +EGOTEK,EGO1003,EGO1003,EGO1003 EGOTEK,Mars8,Mars8,Mars8 EGOTEK,Penguin,Penguin,Penguin EGOTEK,Venus10,Venus10,Venus10 +EJBOARD,EJ_IFPD,rk3588_t,EP_Series EKEMP,T80 EEA,T80,T80 EKINOX,E6,E6,E6 EKINOX,E8_Ultra,E8_Ultra,E8_Ultra @@ -7292,6 +7677,9 @@ EL (Africa),X60 Pro,X60_PRO,X60 Pro EL (Africa),X70,X70,X70 EL (Africa),X80,X80,X80 EL (Africa),X90,X90a,X90 +EL(elongmobile),Pad-S11,Pad-S11,Pad-S11 +EL(elongmobile),Pad_S7,Pad_S7,Pad_S7 +EL(elongmobile),Pad_S8,Pad_S8,Pad_S8 ELC(cn),M108,M108,M108 ELDMandate,10BIZ332,10BIZ332,10BIZ332 ELEXIA,ELEXIA,bangbae,ELEXIA 4K Android TV @@ -7300,6 +7688,7 @@ ELEXIA,ELEXIA,expo,4K ELEXIA Google TV ELEXIA,ELEXIA,komagome,ELEXIA 2K Android TV ELEXIA,ELEXIA,tennoji,2K ELEXIA Google TV ELITESOFT,Tab101,Tab101,Tab101 +ELMO,ELXXR5G,ELXXR5G,ELXXR5X ELO Touch,10in-I-Series-4,10in-I-Series-4,10in-I-Series-4 ELO Touch,10in-I-Series-4-Value,10in-I-Series-4-Value,10in-I-Series-4-Value ELO Touch,15in-I-Series-4,15in-I-Series-4,15in-I-Series-4 @@ -7394,6 +7783,7 @@ EPIKONE,X650,X650,X650 EPIKONE,X650_tigo,X650,X650 EPIKONE,X655,X655,X655 EPIKONE,k503,K503,K503 +EQUINOXE,Europe,martin,SE 2K Android Monitor ER-Telecom,Movix Pro Voice,SEI700ER,Movix Pro Voice ESI Enterprises,CKT3,CKT3,CKT3 ESI Enterprises,DT101Bv51,DT101Bv51,DT101Bv51 @@ -7406,6 +7796,7 @@ ESI Enterprises,Trinity T101,Trinity_T101,Trinity T101 ESI Enterprises,Trinity T900,Trinity_T900,Trinity T900 ESOL,CCBEK,rk3588_t,CCBEK ESOL,HCB_5186,Interactive_White_Board,HCB_5186 +ESOL,HCB_52series,Interactive_White_Board,HCB_52series ETERNITY,HERO-SP001,HERO-SP001,HERO-SP001 ETERNITY,HEROSP001,HEROSP001,SP-001 ETG(G),ETG-BT1121,ETG-BT1121,ETG-BT1121 @@ -7464,6 +7855,7 @@ EXO S.A.,Wave i007Kids,Wave_i007Kids,Wave i007Kids EXO S.A.,Wave i007T,Wave_i007T,Wave i007T EXO S.A.,Wave_i007Kids,Wave_i007Kids,Wave i007Kids EXO S.A.,Wave_i101G,Wave_i101G,Wave_i101G +EXO S.A.,Wave_i101MC,Wave_i101MC,Wave_i101MC EXO S.A.,Wave_i101u,Wave_i101u,Wave_i101u EXO S.A.,i101T2,i101T2,TabletEXO_Wave_i101T2 EXO S.A.,wave-i007w,wave-i007w,wave-i007w @@ -7509,6 +7901,7 @@ Eks Mobility,Z5,Z5,Z5 Eks Mobility,x7,X7,X7 Elecost,QuadTab E10.1,QuadTab_E101,QuadTab E10.1 Elecson,Meeplus_1,Meeplus_1,Meeplus_1 +Elecson,Prime X,PrimeX1,Prime X Electroland Ghana,NASCO_Allure,NASCO_Allure,NASCO_Allure Electroman,ELECTROMAN,mountbaker,Smart FHD TV Electroman,Electroman,hongkong,Smart UHD TV @@ -7610,12 +8003,17 @@ Ematic,PBSKD7200,PBSKD7200,PBSKD7200 Ematic,PBSKD7201,PBSKD7201,PBSKD7201 Ematic,Sprout Channel Cubby,Cubby,SproutChannelCubby Ematic,USA,Jetstream,AGT418 +Emdoor,ARKENSTONE,ARKENSTONE_US,ARKENSTONE Emdoor,EM_I8180,em_i8180,em_i8180 Emerson,EID-1400,EID-1400,EID-1400 +Emerson,EID_1050,EID_1050,EID-1050 +Emerson,EID_1061,EID_1061,EID-1061 +Emerson,EID_9000,EID_9000,EID-9000 Emerson,EM749/748,EM749_748,EM749_748 Emerson,EM9,EM9,EM9 Emporia,E5mini,E5mini,E5mini Emporia,E6_EEA,E6,E6 +Emporia,E6mini,E6mini,E6mini Emporia,Emporia SMART 3,S3,S3 Emporia,S3mini,S3mini,S3mini Emporia,S4i,S4,S4 @@ -7655,6 +8053,7 @@ Engel,4K Smart TV,pioneer,4K PA Smart TV Engel,ENGEL,bangbae,Engel 4K Android TV Engel,Smart TV,mateo,2K PA Smart TV Engel,Smart TV,osaki,2K AI Smart TV +Englaon,ENGLAON,mountbaker,2K SMART TV Englaon,ENGLAON,stanford,2K SMART TV Enspert,,E-TAB,E-TAB Enspert,,ESP_E301,ESP_E301BK @@ -7698,6 +8097,7 @@ Entity,ENT15QF220,ENT15QF220,ENT15QF220 Entity,ENT71QF12,ENT71QF12,ENT71QF12 Entity,ENT75QF620_EEA,ENT75QF620,ENT75QF620 Entity,ENTG1011,ENTG1011,ENTG1011 +Entity,G10XM,G10XM,G10XM Entity,HW304_HW291,HW304_HW291,HW304_HW291 Envizen,ClickTabDSh18,ClickTabDSh18,ClickTabDSh18 Envizen,V1018A,V1018A,V1018A @@ -7710,6 +8110,7 @@ Epson,EH-LS650,sti6290d101,projector Epson,EH-LS800,sti6202d101,HA90 Epson,ELPAP12,Bushi,STI6110 Epson,Epson,embt4,EMBT4 +Epson,HB35,himalaya,HB35 Epson,Projector,sti6200d101,Projector Epson,STI6110,Bushi,STI6110 Epson,embt4,embt4,EMBT4 @@ -7778,6 +8179,7 @@ Estelle,EST-001-BLA,EST_001_BLK,EST_001_BLK Estla,Android TV,longshan,AI PONT NA Estla,UHD Android TV,sindorim,AI PONT Eten,ET660,ETEN,ET660 +Etisalat,eLife TV,KSTB6076,KSTB6076 Etuline,ETL-S4521,u939e_2,ETL-S4521 Etuline,ETL-S5042,u970_4,ETL-S5042 EuroLeague,I7a,Euroleague,EuroleaguePhone @@ -7922,6 +8324,7 @@ Evvoli,R4,R4,R4 Excelvan,SMY-M07R7,SMY_M07R7,M07R7_EEA Excelvan,SMY_M07R7,SMY_M07R7,M07R7 Exclusiv,Columbia,marina,Apollo Premium4K TV +Excotek,X20-T616,X20-T616,X20 Exertis,7GW_eea,7GW,7GW Exertis,SMB-H8009,SMB-H8009,SMB-H8009 Explay,4Game,4Game,4Game @@ -8012,6 +8415,7 @@ FACETEL,Q10-EEA,Q10-EEA,Q10-EEA FACETEL,Q10-Pro,Q10-Pro,Q10-Pro FACETEL,Q10-US,Q10-US,Q10-US FACETEL,Q10_EEA,Q10_EEA,Q10_EEA +FACETEL,Q10_T_EEA,Q10_T_EEA,Q10_T_EEA FACETEL,Q10_T_US,Q10_T_US,Q10_T_US FACETEL,Q3-EEA,Q3-EEA,Q3-EEA FACETEL,Q3-pro,Q3_pro,Q3_pro @@ -8021,6 +8425,8 @@ FACETEL,Q3pro_eea,Q3pro_eea,Q3pro_eea FACETEL,Q5_EEA,Q5_EEA,3W_EEA FACETEL,Q5_US,Q5_US,3W_US FACETEL,Q6_US,Q6_US,Q6_US +FACETEL,Q7_EEA,Q7_EEA,Q7_EEA +FACETEL,Q7_US,Q7_US,Q7_US FACETEL,W3_T_EEA,W3_T_EEA,3W_EEA FACETEL,W3_T_US,W3_T_US,3W_US FACILOTAB,Facilotab_L_Rubis,Facilotab_L_Rubis,Facilotab L Rubis @@ -8030,6 +8436,7 @@ FANGOR,F-863,F-863,F-863 FANGOR,F-C10,F-C10,F-C10 FANGOR,F-X10,F-X10,F-X10 FANGOR,UJ_1098,UJ_1098,UJ_1098 +FASTWD,L231-EEA,L231-EEA,L231-EEA FATARUS,K10,K10,K10 FAVORITT,R3,R3,R3 FAVORITT,R4,R4,R4 @@ -8048,12 +8455,20 @@ FCNT,arrows N F-51C,F51C,F-51C FCNT,arrows We A101FC,A101FC,A101FC FCNT,arrows We F-51B,F51B,F-51B FCNT,arrows We FCG01,FCG01,FCG01 +FCNT,arrows We2 F-52E,F52E,F-52E +FCNT,arrows We2 FCG02,FCG02,FCG02 +FCNT,arrows We2 M07,M07,M07 +FCNT,arrows We2 Plus F-51E,F51E,F-51E +FCNT,arrows We2 Plus M06,M06,M06 FEITIAN,F100,F100,F100 FEITIAN,F100_EEA,F100,F100 FELUX,LUXE 3,LUXE_3,LUXE 3 FELUX,X-ONE,X-ONE,X-ONE FELUX,X_Pro,X_Pro,X Pro +FEONAL,D105_EEA,D105_EEA,D105_EEA FEONAL,D106_EEA,D106_EEA,D106_EEA +FEONAL,D109_EEA,D109_EEA,D109_EEA +FEONAL,D115,D115,D115 FEONAL,D118_EEA,D118_EEA,D118_EEA FEONAL,K104,K104,K104 FEONAL,K110_EEA,K110_EEA,K110_EEA @@ -8089,7 +8504,11 @@ FIVAHIVA,YY_766_EEA,YY_766_EEA,YY_766_EEA FLEX MOBILE,S9,S9,S9 FMC,Digital Experience,belford,Infotainment-system FMC,Digital Experience,belford,SYNC +FOLG,FOLG_Tab_10s,FOLG_Tab_10s,S20 +FOLG,FT01,FT01,Folg Sky 1 FOLG,KS20,KS20,KidS Prime 1 +FOLG,S20,FOLG_TAB_10,FOLG TAB 10 +FOSSiBOT,DT1 Lite,DT1_Lite,DT1 Lite FOSSiBOT,DT1_Lite,DT1_Lite,DT1 Lite FOSSiBOT,DT2,DT2,DT2 FOSSiBOT,F101,F101,F101 @@ -8098,11 +8517,18 @@ FOSSiBOT,F101 P,F101_P,F101 P FOSSiBOT,F101 Pro,F101_Pro,F101 Pro FOSSiBOT,F102,F102,F102 FOSSiBOT,F102 ROW,F102,F102 +FOSSiBOT,F105,F105,F105 +FOSSiBOT,F106 Pro EEA,F106_Pro,F106 Pro FOSSiBOT,F106 Pro ROW,F106_Pro,F106 Pro +FOSSiBOT,F109,F109,F109 +FOSSiBOT,S1,S1,S1 FOSSiBOT,Tab 11,Tab_11,Tab 11 +FOSSiBOT,Tab_12,Tab_12,Tab 12 FOXX,T8C,T8C,T8C +FOXXD,A10U,A10U,A10U FOXXD,A2023,A2023,A2023 FOXXD,A55,A55,A55 +FOXXD,A551,A551,A551 FOXXD,A56,A56,A56 FOXXD,A5Pro,A5Pro,A5Pro FOXXD,A62,A62,A62 @@ -8111,6 +8537,7 @@ FOXXD,A65,A65,A65 FOXXD,A65M,A65M,A65M FOXXD,A65Plus,A65Plus,A65Plus FOXXD,A6_Plus,A6_Plus,A6 Plus +FOXXD,AS65U,AS65U,AS65U FOXXD,C10,C10,C10 FOXXD,FOXXD C65,FOXXD_C65,FOXXD C65 FOXXD,MIRO,L590A,L590A @@ -8120,15 +8547,18 @@ FOXXD,P8,P8,P8 FOXXD,T55,T55,T55 FOXXD,T8,T8,T8 FOXXD,T8A,T8A,T8A +FOXXD,T8B,T8B,T8B FOXXD,T8M,T8M,T8M FOXXD,T8Plus,T8Plus,T8 Plus FOXXD,T8Pro,T8Pro,T8Pro FPD,FPD,hongkong,EcoTV Pro A FPD,FPD,hongkong,EcoTV Pro D FPD,FPD,hongkong,EcoTV Pro I +FPD,FPD,lavender,EcoTV Plus C FPD,FPD,lavender,EcoTV Plus D FPD,FPD,lavender,EcoTV Plus I FPD,FPD,mountbaker,EcoTV A +FPD,FPD,mountbaker,EcoTV C FPD,FPD,mountbaker,EcoTV D FPD,FPD,mountbaker,EcoTV I FPT Telecom,FPT ATV Play Box,DV8236,FPT ATV Play Box @@ -8161,8 +8591,11 @@ Famous Fones,Famous_5Plus,Famous_5Plus,Famous 5Plus Famous Fones,Famous_TAB_10,Famous_TAB_10,Famous_TAB_10 Famous Fones,Fonos-O1,Fonos-O1,Fonos-O1 Famous Fones,Red_Royal_Edition,Red_Royal_Edition,Red Royal Edition +FancyDay,C10,C10,C10 +FancyDay,C10US,C10,C10 Fantec,FANTEC M200H,M200H,M200H Fantec,FANTEC M300H,M300H,FAN-M300H +Fanvil,W638C,W638C,W638C FarEasTone,Smart 403,msm8226,Smart 403 FarEasTone,Smart 505,Smart505,Smart 505 FarEasTone,Smart 509,Smart509,Smart509 @@ -8224,6 +8657,8 @@ Firehawk,FP-600,FP-600,FP-600 Firehawk,Firehawk,ToughDroid_Pro,FT-810 Firehawk,ToughDroid,ToughDroid,ToughDroid FirstNationalBank,FNB,SP5045V,SP5045V +Fitbit,Fitbit Ace LTE,p11,Fitbit Ace LTE +Fitbit,Fitbit Ace LTE,p11,P11 Flash,Ivory,Ivory,Ivory Flash,Live,Live,Live Flash,PRIME_1,PRIME_1,PRIME 1 @@ -8374,6 +8809,7 @@ Fonos,M1,M1,M1 Fonos,O3_EEA,O3,O3 Ford,Omni 8,Omni8,Omni8 Formuler,GTV,GTV,GTV +Foryoudigital,IWB_FYD_F,IWB_FYD_F,IWB_FYD_F Fossil,Fossil Gen 5 LTE,gila,Fossil G5L Fossil,Fossil Gen 5 LTE,gila,Fossil Gen 5 LTE Fossil,Fossil Gen 5e,sole,Fossil 5e @@ -8416,6 +8852,8 @@ Four Mobile,S62_Eco_3,S62_Eco_3,S62_Eco_3 Four Mobile,S710 Ruby,S710_Ruby,S710 Ruby Four Mobile,Sapphire,S750,Sapphire Four Mobile,Thunder,S350,Thunder +Fox_and_Sheep,Kidstablet1,Kidstablet1,Kidstablet_231 +Fox_and_Sheep,KidstabletOne,KidstabletOne,KidstabletOne Foxconn,,A1,MUCHTEL A1 Foxconn,,A800,WellcoM-A800 Foxconn,,Boston,Boston @@ -8476,6 +8914,12 @@ FreeYond,F9,F9,F9 FreeYond,F9S,F9S,2306004M FreeYond,F9S,F9S,F9S FreeYond,F9S,F9S_EEA,F9S +FreeYond,FreeYondA5,FreeYondA5,A5 +FreeYond,FreeYondA5_RU,FreeYondA5,A5 +FreeYond,FreeYondP6,FreeYondP6,FreeYond P6 +FreeYond,FreeYondP6,FreeYondP6,FreeYondP6 +FreeYond,FreeYondP6,FreeYondP6,P6 +FreeYond,FreeYondP6_RU,FreeYondP6,P6 FreeYond,M5,M5,M5 FreeYond,M5A,M5A,2305003M FreeYond,M6,M6,2308005M @@ -8578,6 +9022,7 @@ Fujitsu,FARTMB611Y,FARTMB611Y,FARTMB611Y Fujitsu,FHMD001,FHMD001,FHMD001 Fujitsu,FMP179R,FMP179R,FMP179R Fujitsu,FMP181L,FMP181L,FMP181L +Fujitsu,INTERACTIVE_PANEL,rk3588_t,IWxx2_DX Fujitsu,M02,M02,M02 Fujitsu,M305,M305,M305 Fujitsu,M305,M305SB,M305 @@ -8675,6 +9120,7 @@ G Y P NEW TREE SA,VIEWPAD M10M,M10M,VIEWPAD M10M G-Anica,HL_1088_A133P,HL_1088_A133P,HL_1088_A133P G-Guard,G Guard SMART TV,SW4H,G Guard SMART TV G-Guard,G GuardTV,shibuya,G GuardTV +G-Guard,G GuardTV,shibuya,GGuardTV G-Guard,fushan_Guard,hamamatsucho,Smart TV G-Guard,vileparle,vileparle,R6G G-Guard,xiaoyushan_emG,xiaoyushan,HiSmartTV A4 @@ -8711,6 +9157,8 @@ G-Tab,N281,N281,N281 G-Tab,P2000,P2000,P2000 G-Tab,P7000,P7000,P7000 G-Tab,P733,P733,P733 +G-Tab,PAD10,PAD10,PAD10 +G-Tab,PAD10_PRO,PAD10_PRO,PAD10_PRO G-Tab,PL1000B,S30,S30 G-Tab,Q2,Q2,Q2 G-Tab,Q2S,Q2S,Q2S @@ -8728,10 +9176,16 @@ G-Tab,S30_1,S30_1,S30_1 G-Tab,S40,S40,S40 G-Tab,S40-1,S40-1,S40 G-Tab,S50,S50,S50 +G-Tab,S50-pro,S50-pro,S50 G-Tab,S8,S8,S8 G-Tab,S8K_1,S8K_1,S8K G-Tab,S8K_2,S8K_2,S8K G-Tab,S8X,S8X,S8X +G-Tab,T10,T10_1,T10 +G-Tab,T11_1,T11_1,T11 +G-Tab,T11_1,T11_1,T11_1 +G-Tab,T8S_1,T8S_1,T8S +G-Tab,T9_1,T9_1,T9 G-TiDE,EX750,EX750,EX750 G-TiDE,EXTREME X9,EXTREME_X9,EXTREME X9 G-TiDE,FANS7,FANS7,G-TiDE FANS7 @@ -8749,6 +9203,7 @@ G-TiDE,G-TiDE_P1_3,G-TiDE_P1_3,G-TiDE_P1 G-TiDE,G-TiDE_P1_3G,G-TiDE_P1_3G,G-TiDE_P1_3G G-TiDE,G-TiDE_P1_4,G-TiDE_P1_4,G-TiDE_P1 G-TiDE,G-TiDE_P1_4G,G-TiDE_P1_4G,G-TiDE_P1_4G +G-TiDE,H2R,H2R,H2R G-TiDE,Klap_S1,Klap_S1,Klap_S1 G-TiDE,Klap_S1_EEA,Klap_S1_EEA,Klap_S1 G-TiDE,PL1080,G-TiDE_H1_4G_EEA,G-TiDE_H1_4G @@ -8777,8 +9232,11 @@ GEOFOX,GEOFOX_MID743,GEOFOX_MID743,GEOFOX_MID743 GETESA,GETESA Sky blue,GETESA_Sky_blue,GETESA Sky blue GETESA,GETESA_niebla,GETESA_niebla,GETESA_niebla GFive,Gpad701,Gpad701,Gpad701 +GFive,Note_25,Note_25,Note_25 +GFive,Note_25_ULTRA,Note_25_ULTRA,Note_25_ULTRA GFive,PRESIDENT_GOLD_10,PRESIDENT_GOLD_10,PRESIDENT_GOLD_10 GFive,PRESIDENT_GOLD_9,PRESIDENT_GOLD_9,PRESIDENT_GOLD_9 +GFive,PRO_16,PRO_16,PRO_16 GFive,President_Classic_9,President_Classic_9,President_Classic_9 GFive,President_smart_5,President_smart_5,President_smart_5 GFive,Speedo,Speedo,Speedo @@ -8793,20 +9251,34 @@ GIRASOLE,X9,X9,X9 GLOBAL3,B02,B02,B02 GMMZ,DongleTV1,DongleTV1,DongleTV1 GOMDUSA,X23,X23,X23 +GOMDUSA,X23_Pro,X23_Pro,X23_Pro GOODTEL,G10_EEA,G10_EEA,G10_EEA +GOODTEL,G10_T_EEA,G10_T_EEA,G10_T_EEA +GOODTEL,G10_T_US,G10_T_US,G10_T_US GOODTEL,G10_US,G10_US,G10_US GOODTEL,G2-EEA,G2-EEA,G2-EEA GOODTEL,G2_A_EEA,G2_A_EEA,G2_A_EEA GOODTEL,G2_EEA,G2_EEA,G2_EEA +GOODTEL,G2_T_US,G2_T_US,G2_T_US GOODTEL,G2_U_EEA,G2_U_EEA,G2_U_EEA GOODTEL,G2_U_US,G2_U_US,G2_U_US +GOODTEL,G3,G3,G3 +GOODTEL,G3,G3,G3_EEA +GOODTEL,G3-EEA,G3-EEA,G3-EEA +GOODTEL,G3-US,G3-US,G3-US GOODTEL,G3_EEA,G3_EEA,G3_EEA +GOODTEL,G3_US,G3_US,G3_US GOODTEL,G6,G6,G6 GOODTEL,G6_EEA,G6_EEA,G6 GOODTEL,G7,G7,G7 GOODTEL,G7_EEA,G7_EEA,G7 +GOODTEL,G7_EEA_T,G7_EEA_T,G7_EEA +GOODTEL,G7_T,G7_T,G7_US +GOODTEL,G9_EEA,G9_EEA,G9_EEA +GOODTEL,G9_US,G9_US,G9_US GOtv,GO700FR,GoFreeTV,GO700FR GOtv,SEI600GO,HND,SEI600GO +GP-electronic,YC-08P,YC-08P,YC-08P GP-electronic,YC-102D,YC-102D,YC-102D GP-electronic,YC-3135D,YC-3135D,YC-3135D GP-electronic,YC-83P,YC-83P,YC-83P @@ -8923,6 +9395,7 @@ General Mobile,Discovery II Mini,Discovery_II_Mini,Discovery II Mini General Mobile,E-tab 4,mehmet,e-tab4 General Mobile,Etab5,Etab5,Etab5 General Mobile,G310,G310,G310 +General Mobile,G518,G518,G518 General Mobile,GM 20,G301,G301 General Mobile,GM 20 PRO,G501,G501 General Mobile,GM 20 Pro,G501,G501 @@ -8936,6 +9409,7 @@ General Mobile,GM 23 Dual,G316,G316 General Mobile,GM 23 SE Dual,G314,G314 General Mobile,GM 23 SE Single,G314,G314 General Mobile,GM 23 Single,G316,G316 +General Mobile,GM 24,G319,G319 General Mobile,GM 24 Pro,G514,G514 General Mobile,GM 6 d,GM6_d_sprout,GM 6 d General Mobile,GM 6 ds,G100,G100 @@ -8948,6 +9422,7 @@ General Mobile,GM 9 Go,G008_d,G008 General Mobile,GM 9 Plus,GM9PLUS_s,GM 9 Plus General Mobile,GM 9 Pro,GM9PRO_d_sprout,GM 9 Pro d General Mobile,GM 9 Pro,GM9PRO_sprout,GM 9 Pro +General Mobile,GM Era 50,G318,G318 General Mobile,GM Phoenix 5G d,G901,G901 General Mobile,GM10,G300,G300 General Mobile,GM5 Plus,gm5plus_s_sprout,GM 5 Plus @@ -8963,6 +9438,7 @@ General Mobile,e-tab 20,e-tab20_variant,e-tab 20 General Motors,Infotainment 3.7,gminfo37,gminfo37 General Motors,Infotainment 3.8,gminfo37,gminfo38 General Motors,VCU,aegean,aegean +General Motors,VCU,burmese,burmese GeneralMobile,E-Tab10,blue_eye,E-Tab10 GeneralSupreme,Smart TV,longshan,AI PONT General_luxe,Shahin_III,Shahin_III,SHAHIN III @@ -8991,6 +9467,7 @@ Getac,ZX10,zx10,ZX10 Getac,ZX70,zx70,ZX70 Getac,ZX70,zx70,zx70 Getac,ZX70G2,zx70g2,ZX70G2 +Getac,ZX80,zx80,ZX80 Getnord,LYNX,LYNX,LYNX Gfast,MD_97_S464A,MD_97_S464A,MD_97_S464A Ghia,A7LED2,A7LED2,A7LED2 @@ -9013,11 +9490,19 @@ Ghia,GHIA_AXIS7P,GHIA_AXIS7P,GHIA_AXIS7P Ghia,GHIA_L1,GHIA_L1,GHIA_L1 Ghia,GHIA_VECTOR_3G,GHIA_VECTOR_3G,GHIA_VECTOR_3G Ghia,GK133,GK133,GK133 +Ghia,GK133D24,GK133D24,GK133D24 +Ghia,GK133M24,GK133M24,GK133M24 Ghia,GK133M3,GK133M3,GK133M3 Ghia,GK133N3,GK133N3,GK133N3 +Ghia,GK133P24,GK133P24,GK133P24 +Ghia,GK133S24,GK133S24,GK133S24 Ghia,GK133S3,GK133S3,GK133S3 Ghia,GK133T3,GK133T3,GK133T3 +Ghia,GK133U24,GK133U24,GK133U24 +Ghia,GK133V3,GK133V3,GK133V3 +Ghia,GK523A24,GK523A24,GK523A24 Ghia,GPND133,GPND133,GPND133 +Ghia,GPND133V4,GPND133V4,GPND133V4 Ghia,GS3G,GS3G,GS3G Ghia,GTA7PLUS,GTA7PLUS,GTA7PLUS Ghia,GTA7WF,GTA7WF,GTA7WF @@ -9034,6 +9519,7 @@ Ghia,GTKIDS7V8,GTKIDS7V8,GTKIDS7V8 Ghia,GTPND7,GTPND7,GTPND7 Ghia,GTTODD7,GTTODD7,GTTODD7 Ghia,GTVR10S,GTVR10S,GTVR10S +Ghia,GVLTE13,GVLTE13,GVLTE Ghia,GVP133,GVP133,GVP133 Ghia,GVPNT,GVPNT,GVPNT Ghia,I1,I1,I1 @@ -9313,6 +9799,7 @@ Gionee,X1,GIONEE_SWW1631,GIONEE X1 Gionee,X1S,GIONEE_SWW1627,X1S GlobalSec,BW819E_CR,BW819E_CR_EEA,BW819E_CR GlobalSec,BW819E_SK,BW819E_SK_EEA,BW819E_SK +GlobalSec,TAB_TEN,TAB_TEN,GLOBALSEC TAB TEN Globe Phoenix,DX768Pro,DX768Pro,DX768Pro Globe Phoenix,PHPHOENIXONETAB,PHPHOENIXONETAB,PHPHOENIXONETAB Globe Phoenix,Springboard,CS790Pro,CS790Pro @@ -9394,7 +9881,9 @@ Google,Emulator,generic_x86_64,Android SDK built for x86_64 Google,Galaxy S4 Google Play edition,jgedlte,GT-I9505G Google,Google Android Emulator,generic_x86_arm,sdk_gphone_x86 Google,Google Automotive Emulator,emulator_car64_x86_64,Android SDK built for x86_64 +Google,Google Automotive Emulator,emulator_car64_x86_64,Car on x86_64 emulator Google,Google Play Games on PC,vsoc_kiwi_x86_64,HPE device +Google,Google TV Streamer,kirkwood,Google TV Streamer Google,Intel Alder Lake Chromebook,brya_cheets,brya Google,Intel Alder Lake Chromebox,brask_cheets,brask Google,Intel Alder Lake-N Chromebook,nissa_cheets,nissa @@ -9417,6 +9906,7 @@ Google,Mediatek MT8183 Chromebook,jacuzzi_cheets,jacuzzi Google,Mediatek MT8183 Tablet,kukui_cheets,kukui Google,Mediatek MT8186 Chromebook,corsola_cheets,corsola Google,Mediatek MT8186 Tablet,staryu_cheets,staryu +Google,Mediatek MT8188G Detachable,geralt_cheets,geralt Google,Mediatek MT8192 Chromebook,asurada_cheets,asurada Google,Mediatek MT8195 Chromebook,cherry_cheets,cherry Google,Mediatek MTK8173 Chromebook,hana_cheets,Lenovo N23 Yoga/Flex 11 Chromebook @@ -9444,6 +9934,10 @@ Google,Pixel 7a,lynx,Pixel 7a Google,Pixel 8,shiba,Pixel 8 Google,Pixel 8 Pro,husky,Pixel 8 Pro Google,Pixel 8a,akita,Pixel 8a +Google,Pixel 9,tokay,Pixel 9 +Google,Pixel 9 Pro,caiman,Pixel 9 Pro +Google,Pixel 9 Pro Fold,comet,Pixel 9 Pro Fold +Google,Pixel 9 Pro XL,komodo,Pixel 9 Pro XL Google,Pixel C,dragon,Pixel C Google,Pixel Fold,felix,Pixel Fold Google,Pixel Slate,nocturne_cheets,Google Pixel Slate @@ -9455,6 +9949,10 @@ Google,Pixel Watch,r11btwifi,Google Pixel Watch Google,Pixel Watch 2,aurora,Google Pixel Watch 2 Google,Pixel Watch 2,eos,Google Pixel Watch 2 Google,Pixel XL,marlin,Pixel XL +Google,Pixel watch 3,helios,Pixel Watch 3 +Google,Pixel watch 3,luna,Pixel Watch 3 +Google,Pixel watch 3,selene,Pixel Watch 3 +Google,Pixel watch 3,sol,Pixel Watch 3 Google,Pixelbook,atlas_cheets,Google Pixelbook Go Google,Pixelbook,atlas_cheets,atlas Google,Pixelbook,eve_cheets,Google Pixelbook @@ -9471,6 +9969,7 @@ Google,emulator,emu64xa,sdk_gphone64_x86_64 Google,gcar emulator,generic_64bitonly_x86_64,Automotive SDK built for x86_64 Google,gcar emulator,generic_x86,AOSP on x86 Google,gcar emulator,generic_x86,Automotive SDK built for x86 +Gowin,QT8-T310,QT8-T310,QT8 Gplus,F53,GPLUS_F53,GPLUS F53 Gplus,F68+,F68,F68+ Gplus,FW6950,GPLUS_FW6950,GPLUS_FW6950 @@ -9492,6 +9991,7 @@ Gradiente,GTB_106,GTB_106,GTB_106 Gradiente,iphone C600,GBC_bravo,iphone C600 Gradiente,iphone C600,bravo,iphone C600 Graetz,GRAETZ,lavender,4K SMART TV +Graetz,GRAETZ,mountbaker,2K SMART TV Grandstream,Grandstream WP856,WP856,WP856 Greatwall,100011886,tablet,100011886 Greatwall,100011886_GTW,tablet,100011886_GTW @@ -9504,6 +10004,7 @@ Green House,GREEN HOUSE TV,SW6H,GREEN HOUSE TV Green House,Smart TV,mateo,2K SA Smart TV GreenLion,G-10_PRO,G-10_PRO,G-10 PRO GreenLion,G-10_ULTRA,G-10_ULTRA,G-10 ULTRA +GreenLion,G-20ULTRA,G-20ULTRA,G-20ULTRA GreenLion,G-8_PRO,G-8_PRO,G-8 PRO Greentel,A10_premium,A10_premium,A10_premium Greentel,A8,A8,A8 @@ -9596,6 +10097,8 @@ HAOVM,HP20,HP20,P20 HAOVM,MediaPad C8,HC8,C8 HAOVM,MediaPadP8,P8,P8 HAOVM,P10_2024,P10_2024,P10 +HAOVM,P10_Pro,P10_Pro,P10_Pro +HAOVM,P20,P20,P20 HAOVM,P8,HP8,P8 HAOVM,P9,P9,P9 HAOVM,P9_EEA,P9_EEA,P9_EEA @@ -9607,11 +10110,15 @@ HBESTORE,HL_1068_A133,HL_1068_A133,HL_1068_A133 HDC S.A.,H10_ONE,H10_ONE,H10_ONE HDC S.A.,H7_ONE,H7_ONE,H7_ONE HDC S.A.,HDC,TK718,TK718 +HDC S.A.,T10I-4128,T10I-4128,T10I-4128 HDC S.A.,T10_232,T10_232,T10_232 HDC S.A.,T700B,T700B,T700B HDC S.A.,T7I_232,T7I_232,T7I_232 HDD SAT,Tab_i_excess,Tab_i_excess,Tab_i_excess +HD_Plus,HD+ IP TV-Stick,SEI900HDPLUS,HD+ IP TV-Stick HEADWOLF,F2A,F2A,F2 +HEADWOLF,F3A,F3A,F3A +HEADWOLF,F5,Fpad5,F5 HEADWOLF,Fpad1,Fpad1,F1 HEADWOLF,Fpad2,Fpad2,Fpad2 HEADWOLF,Fpad3,Fpad3,F3 @@ -9621,31 +10128,43 @@ HEADWOLF,HPAD1A,HPAD1A,H1A HEADWOLF,Hpad1,Hpad1,Hpad1 HEADWOLF,Hpad2,Hpad2,H2 HEADWOLF,Hpad2,Hpad2,H2A +HEADWOLF,L1,L1,L1 +HEADWOLF,L1,L1,Lpad1 +HEADWOLF,W5,W5,W5 HEADWOLF,W5A,W5A,W5A HEADWOLF,WPAD2,WPAD2,W2 HEADWOLF,Wpad1,Wpad1,W1 HEADWOLF,Wpad2,Wpad2,W2 HEALTHJAY,JayPad_2_0,JayPad_2_0,JayPad_2_0 HEATZ,HZ9950,HZ9950,HZ9950 +HEATZ,Z9910A,Z9910A,Z9910 HEATZ,Z9950,Z9950,Z9950 HELIX_INC,C-TABLET,C-TABLET,C-TABLET HIGRACE,OC101,OC101,OC101 HIGRACE,OC101,OC101_EEA,OC101 HIKVISION,DS-D5C,DS_D5C65RB_A,DS_D5C65RB_A +HIKVISION,DS-MDT202,DS-MDT202,DS-MDT202 HIKVISION,DS-MDT301,DS-MDT301,DS-MDT301 HIMADE,HIMADE,shilin,HIMADE4KAndroidTV HIMADE,UHD Android TV,sindorim,AI PONT +HISORL, P50,P50,P50 +HISORL,P80-EEA,P80-EEA,P80 HISORL,P80-ROW,P80-ROW,P80 HISORL,T10P,T10P,T10P HISORL,TAB10_EEA,TAB10_EEA,TAB10_EEA HISORL,TAB_10,TAB_10,TAB_10 +HISORL,TB02_EEA,TB02_EEA,TB02 +HISORL,TB02_ROW,TB02_ROW,TB02 +HISORL,Y101P,Y101P,Y101P HKC,A79 Tablet,EM62,A79 HKC Elec,4K Smart TV,gangbyeon,HKC 4K AI Smart TV HKC Elec,4K Smart TV,gangbyeon,TATUNG 4K AI Smart TV HKC Elec,4K Smart TV,pioneer,4K PA Smart TV HKC Elec,4K Smart TV,pioneer,4K SA Smart TV HKC Elec,4K Smart TV,pioneer,HKC 4K SA Smart TV +HKC Elec,Google TV,burbank,4K KR Google TV HKC Elec,Google TV,burbank,4K PA Google TV +HKC Elec,Google TV,burbank,4K SA Google TV HKC Elec,Google TV,kannai,2K JP Google TV HKC Elec,Google TV,lakeside,4K COL Google TV HKC Elec,Google TV,lakeside,4K PA Google TV @@ -9657,16 +10176,32 @@ HKC Elec,Google TV,nagai,2K PA Google TV HKC Elec,Google TV,nagai,2K SA Google TV HKC Elec,Google TV,nagai,2K US Google TV HKC Elec,Google TV,nagai,POLYTRON 2K +HKC Elec,Google TV,piha,4K JP ACAS Google TV HKC Elec,Smart Monitor,mateo,2K Smart Monitor HKC Elec,Smart TV,mateo,2K PA Smart TV HKC Elec,Smart TV,mateo,2K US Smart TV HKC Elec,Smart TV,mateo,HKC 2K SA Smart TV HKC Elec,Smart TV,pioneer,4K PA Smart TV HKT,eye3,UY3-PCW,eye3 +HMD,HMD Aura,RCK,HMD Aura +HMD,HMD Fusion,NHK,HMD Fusion +HMD,HMD Fusion Business Edition,NHK,HMD Fusion Business Edition +HMD,HMD Pulse,LGD,HMD Pulse +HMD,HMD Pulse Pro,LGR,HMD Pulse Pro +HMD,HMD Pulse+,LGP,HMD Pulse Plus +HMD,HMD Skyline,TCT,HMD Skyline +HMD,HMD Skyline Business Edition,TCT,HMD Skyline Business Edition +HMD,HMD T21,AGTAH,HMD T21 +HMD,HMD T21,AGTH,HMD T21 +HMD,HMD XR21,SNT,HMD XR21 +HMD,M-KOPA X2,LGD,M-KOPA X2 +HMD,M-KOPA X20,LGR,M-KOPA X20 HMR NETWORKS,HMR NETWORKS (PTY) LTD,HMR5012,HMR5012 HOLO,USA,VE1983,VE1983 HOLO,VE0319,VE0319,VE0319 HOLO,X10,X10,X10 +HOLO,XULTRA2,XULTRA2,XULTRA2 +HOLO,XULTRAPLUS,XULTRAPLUS,XULTRAPLUS HOMII,HOMII M6,M6,M6 HOMII,XBOOK,XBOOK,XBOOK HOMII,XBOOK_PRO,XBOOK_PRO,XBOOK_PRO @@ -9698,7 +10233,6 @@ HORIZON,EU,yeongdeungpo,HORIZON Android TV HORIZON,ID65HZA3B1_C,Interactive_White_Board,ID65HZA3B1_C HORIZON,ID75HZA3B1_C,Interactive_White_Board,ID75HZA3B1_C HORIZON,ID86HZA3B1_C,Interactive_White_Board,ID86HZA3B1_C -HORIZON,IFPD,65W72B,W72B HOT (il),HOT ONE,VSB3918_ALT_ME,HOT ONE HOT (il),HOT Streamer,DV8555-KIH,HOT Streamer HOT (il),StreamerV3,DIW377_ALT_ME,HOT Streamer V3 @@ -9758,6 +10292,7 @@ HP,SlateBook 10 x2 PC,3645,HP SlateBook 10 x2 PC HP,SlateBook 14,200a,HP SlateBook 14 PC HP,Tablet 10,balsa,HP_10_Tablet HP,Voice Tab 7,almond,HP Slate 7 Voice Tab +HQ_bel,Tablet_HQ_T616,Tablet_HQ_T616,Tablet_HQ_T616 HRSolutions,HRS2000,HRS2000,HRS2000 HTC,,express,HTC Flyer HTC,,express,PG41200 @@ -10157,11 +10692,14 @@ HTC,HTC 5G Hub,htc_rtxcmcc,HTC 5G Hub HTC,HTC 5G Hub,htc_rtxspcs,HTC 5G Hub HTC,HTC A100,HTC_A100,HTC A100 HTC,HTC A101,HTC_A101,HTC A101 +HTC,HTC A101 Plus,HTC_A101_Plus,HTC A101 Plus HTC,HTC A102,HTC_A102,HTC A102 HTC,HTC A103,HTC_A103,HTC A103 HTC,HTC A103 Plus,HTC_A103_Plus,HTC A103 Plus HTC,HTC A104,HTC_A104,HTC A104 HTC,HTC A105 Plus,HTC_A105_Plus,HTC A105 Plus +HTC,HTC AT01,HTC_AT01,HTC AT01 +HTC,HTC AT01 Plus,HTC_AT01_Plus,HTC AT01 Plus HTC,HTC Desire 19s,htc_zddugl,2Q8L10000 HTC,HTC Desire 19s,htc_zddugl,HTC Desire 19s HTC,HTC Desire 20 Pro,htc_bymdugl,HTC 2Q9J10000 @@ -10476,6 +11014,10 @@ HTC,Wildfire E2 plus,Wildfire_E2_plus,Wildfire E2 plus HTC,Wildfire E3,Wildfire_E3,Wildfire E3 HTC,Wildfire E3 lite,Wildfire_E3_lite,Wildfire E3 lite HTC,Wildfire E4,Wildfire_E4,Wildfire E4 +HTC,Wildfire E5,Wildfire_E5,Wildfire E5 +HTC,Wildfire E5 Plus,Wildfire_E5_Plus,Wildfire E5 Plus +HTC,Wildfire E6,Wildfire_E6,Wildfire E6 +HTC,Wildfire E6 Plus,Wildfire_E6_Plus,Wildfire E6 Plus HTC,Wildfire S,marvel,HTC Wildfire S HTC,Wildfire S,marvel,HTC Wildfire S A510b HTC,Wildfire S,marvel,HTC Wildfire S A510e @@ -10490,6 +11032,7 @@ HTC,desire 400 dual sim,cp2dug,HTC Desire 400 dual sim HTC,desire 608t,cp3dtg,HTC 608t HTC,desire 610,htc_a3qhdul,HTC Desire 610 HTC,desire x,protou,HTC Desire X +HTC,enodugls_02401,htc_enodugls,HTC U24 pro HTC,first,mystul,HTC first HTC,myTouch 3G,sapphire,HTC Magic HTC,myTouch 3G,sapphire,T-Mobile myTouch 3G @@ -10497,8 +11040,10 @@ HTC,myTouch 3G Slide,espresso,T-Mobile myTouch 3G Slide HTC,myTouch 4G,glacier,HTC Glacier HTC,myTouch 4G,glacier,HTC Panache HTC,myTouch 4G Slide,doubleshot,myTouch_4G_Slide +HTOWAV,Cyber 13,Cyber_13,Cyber 13 HUAVI,Eastaeon - Mediatek,KHATARH10mini,KHATAR H-10 mini HUAVI,KHATAR H-20 PRO,KHATARH20PRO,KHATAR H-20 PRO +HUAVI,SH_700,GOLD_77,GOLD_77 HYPRO,S6,HYPRO_S6,HYPRO S6 HYUNDAI_MAESTRO,HDT-7427GU,HDT-7427GU,HDT-7427GU HYUNDAI_MAESTRO,HDT-7433X,HDT-7433X,HDT-7433X @@ -10627,6 +11172,8 @@ Haier,Haier MatrixTV BS,jordan,Haier MatrixTV BS Haier,Haier MatrixTV CE,deto,Haier MatrixTV CE Haier,Haier MatrixTV CN,deto,Haier MatrixTV CN Haier,Haier MatrixTV CS,deto,Haier MatrixTV CS +Haier,Haier MatrixTV DE,omonia,Haier MatrixTV DE +Haier,Haier MatrixTV EE,omonia,Haier MatrixTV EE Haier,Haier OLED TV AE,irvine,Haier OLED TV AE Haier,Haier TV,SW6H,Haier TV Haier,Haier TV FF,SW6H,Haier TV FF @@ -10771,6 +11318,7 @@ HannSpree,HSG1416,HANNSPAD,HSG1416 HannSpree,HSG1472,HSG1472,HSG1472 HannSpree,Hannspad,Hannspad,Hannspad HannSpree,HannspadPro,HannspadPro,HannspadPro +Hanshow,VisCart,Clip-on_Smart_Trolley,CT10-W0C3 Haoqin,SpaceTab_H20,SpaceTab_H20,SpaceTab_H20 Haoqin,SpaceTab_H20_EEA,SpaceTab_H20_EEA,SpaceTab_H20_EEA Harman TV,JBL link bar,atom,JBL LINK BAR @@ -10790,6 +11338,9 @@ Helio,Helio S5,Helio_S5,Helio S5 Helio,S10,S10,S10 Helio,S2,WBL7519SY,S2 Helio,S25,HelioS25,S25 +Helio,helio 40,helio_40,helio 40 +Helio,helio 50,helio_50,helio 50 +HelloPro,PK81R,PK81R,PK81R HemiltonPro,Tab1000,Tab1000,Tab1000 Hercls,HERCLS A15,A15,A15 Hercls,HERCLS L925,L925,L925 @@ -10797,6 +11348,7 @@ Hero,HERO 4ALL,HERO_4ALL,HERO 4ALL Hero,HERO B1,HERO_B1,HERO B1 HexaByte,HB_X7,HB_X7,HB_X7 Hezire,HBook-Prime,HBook-Prime,HBook-Prime +Hezire,HBook-Pro,HBook-Pro,HBook-Pro Hezire,HTB801,HTB801,HTB801 Hi TFG,Boost Max,Boost_Max,Boost_Max Hi TFG,Crusader,Crusader,Crusader @@ -11046,6 +11598,7 @@ Hisense,EG978,EG978,HS-EG978 Hisense,EG98,EG98,EG98 Hisense,EG98,EG98TW,EG98 Hisense,EG981,EG981,HS-EG981 +Hisense,Emeishanph,hirano,Hisense TV Hisense,F10,HS6737MT,BM001 Hisense,F10,HS6737MT,Hisense F10 Hisense,F10,HS6737MT,Hisense L675 PRO @@ -11099,6 +11652,7 @@ Hisense,HLTE229E,HLTE229E_01,HLTE229E Hisense,HLTE229E,HLTE229E_01,Hisense E40 Hisense,HLTE230E,SC9863A,Hisense Infinity H40 Lite Hisense,HLTE243E,HLTE243E,Hisense E33 +Hisense,HLTE243E,HLTE243E,Hisense E34 Hisense,HLTE300E_ 02,HS8937QC,HLTE300E Hisense,HLTE300E_ 02,HS8937QC,HLTE300E_02 Hisense,HLTE300E_ 02,HS8937QC,Hisense Infinity H11 @@ -11290,6 +11844,7 @@ Hisense,Hisense T17,HS6580MT,Hisense T17 Hisense,Hisense T5,HS6737MT,Hisense T5 Hisense,Hisense T5 Pro,HS6737MT,Hisense T5 Pro Hisense,Hisense T965,HS6580MT,Hisense T965 +Hisense,Hisense TV HK,hirano,Hisense TV HK Hisense,Hisense U3 2021,HLTE100E_20,Hisense U3 2021 Hisense,Hisense U3 2021,HLTE100E_21,Hisense U3 2021 Hisense,Hisense U3 2021,HLTE100E_22,Hisense U3 2021 @@ -11315,10 +11870,17 @@ Hisense,Hisense U605,HS7731ESP,Hisense U50 Hisense,Hisense U605,HS7731ESP,Hisense U605 Hisense,Hisense U605,HS7731ESP,Hisense U606 Hisense,Hisense U605,Hisense,Hisense U605 +Hisense,Hisense U62 Pro,HLTE121E,Hisense U62 Pro +Hisense,Hisense U70 Pro,HLTE109E,Hisense M71 Pro +Hisense,Hisense U70 Pro,HLTE109E,Hisense U62 Pro Hisense,Hisense U70 Pro,HLTE109E,Hisense U70 Pro +Hisense,Hisense U70 Pro,HLTE109E,Hisense Y81 Pro Hisense,Hisense U70 Pro,HLTE109E_01,Hisense U70 Pro Hisense,Hisense U70 Pro,HLTE109E_02,Hisense U70 Pro Hisense,Hisense U70 Pro,HLTE109E_03,Hisense U70 Pro +Hisense,Hisense U70 Pro,HLTE120E_01,Hisense U71 Pro +Hisense,Hisense U71 Pro,HLTE120E,Hisense U71 Pro +Hisense,Hisense U71 Pro,HLTE120E_01,Hisense U71 Pro Hisense,Hisense U963,HLTE100E_11,Hisense U963 Hisense,Hisense U963,HLTE100E_12,Hisense U963 Hisense,Hisense U963,HLTE100E_13,Hisense U963 @@ -11546,6 +12108,8 @@ Hisense,Sero 8 pro,rk3288,F5281 Hisense,Sero7,rk3168,E2171SS Hisense,Sero7 LE,rk3026,E2371 Hisense,Sero8,rk3188,E2281SS +Hisense,SmartLaser 4K,hengshan,SmartLaser 4K +Hisense,SmartTV 4K,hengshan,SmartTV 4K Hisense,SoundTab MA-317,rk3028a,Hisense SoundTab MA-317 Hisense,SoundTab MA-327,rk3028a,Hisense SoundTab MA-327 Hisense,T963,HS7331CSC,Hisense T963 @@ -11636,6 +12200,7 @@ Hisense,laoshan_laser,laoshan,HAT4KDTV Hisense,lt971,LT971,LT971 Hisense,lushan,lushan,SmartTV 4K FFM Hisense,lushan-NF,lushan,SmartTV 4K +Hisense,qingshan_hisense,moeraki,HJ4KAndroidTV Hisense,songshan,songshan,SmartTV 4K Hisense,u972,HS7731SP,U972 Hisense,vision2_1,vision2_1,vision2_1 @@ -11670,6 +12235,7 @@ Homatics,Global,YQB,Dongle R 4K Homatics,Kickpi,YYZ,KP1 Homatics,SEI600HM,HND,Box Q Homatics,SEI700HMG,SEI700HMG,Dongle 4K +Homatics,Stick 4K,YZF,Stick 4K Homatics,Stick HD,IAD,Stick HD Home Elite,Android TV,R1,ATV R1 Home Elite,Android TV,R2,ATV R2 @@ -11678,6 +12244,7 @@ Homeplustv,HCA6010,HCA6010,HCA-6010 Homeplustv,Homeplus_ATV HCA-6010,HCA6010,HCA-6010 Homeplustv,STB-6252C,STB6252C,STB-6252C Hometech, ALFA10TX,ALFA10TX,ALFA10TX +Hometech,7_PREMIUM_PRO,7_PREMIUM_PRO,7_PREMIUM_PRO Hometech,ALFA 10RC,ALFA_10RC,ALFA_10RC Hometech,ALFA 8RC,ALFA_8RC,ALFA_8RC Hometech,ALFA 8RX,ALFA_8RX,ALFA_8RX @@ -11733,8 +12300,10 @@ Honeywell,70eLGN,dblack_gn,Dolphin 70e Black Honeywell,70eLGN,dblack_go,Dolphin 70e Black Honeywell,70eLW0,dblack_wo,Dolphin 70e Black Honeywell,70eLWN,dblack_wn,Dolphin 70e Black +Honeywell,CK62,CK62,CK62 Honeywell,CK65,CK65-L0-C,CK65 Honeywell,CK65,CK65-L0-N,CK65 +Honeywell,CK67,CK67,CK67 Honeywell,CK75,CK75,CX75 AC0 Honeywell,CK75,CK75,CX75 AN0 Honeywell,CN51,CN51_NC0,CN51 NC0 @@ -11765,6 +12334,7 @@ Honeywell,CN80,CN80G-L1-N,CN80 Honeywell,CN85,CN85-L0-C,CN85 Honeywell,CN85,CN85-L1-C,CN85 Honeywell,CT30XP,CT30P,CT30P +Honeywell,CT37,CT37,CT37 Honeywell,CT40,CT40-L0-C,CT40 Honeywell,CT40,CT40-L0-CA,CT40 Honeywell,CT40,CT40-L1-C,CT40 @@ -11832,12 +12402,19 @@ Honeywell,RT10A,TA60A-L0-C,RT10A Honeywell,RT10A,TA60A-L0-C,TA60A Honeywell,RT10A,TA60A-L1-C,RT10A Honeywell,RT10A,TA60A-L1-C,TA60A +Honeywell,RT60A,TA60A-L1-C,TA60A Honeywell,Thor VM1A,VM1A-L0-N,VM1A Honeywell,Thor VM1A,VM1A-L0-P,VM1A Honeywell,Thor VM3A,VM3A-L0-N,VM3A Honeywell,Thor VM3A,VM3A-L0-P,VM3A Honor,HONOR 100,HNMAA,MAA-AN00 Honor,HONOR 100 Pro,HNMAP,MAA-AN10 +Honor,HONOR 200,HNELI,ELI-AN00 +Honor,HONOR 200,HNELIX,ELI-NX9 +Honor,HONOR 200 Pro,HNELP,ELP-AN00 +Honor,HONOR 200 Pro,HNELPX,ELP-NX9 +Honor,HONOR 200 Smart,HNALT-Q1,ALT-NX1 +Honor,HONOR 200 Smart,HNALT-Q2,ALT-NX3 Honor,HONOR 50,HNNTH,NTH-NX9 Honor,HONOR 50 Lite,HNNTN,NTN-L22 Honor,HONOR 50 Lite,HNNTN,NTN-LX1 @@ -11851,6 +12428,7 @@ Honor,HONOR 90 Lite,HNCRT-M2,CRT-NX3 Honor,HONOR 90 Smart,HNCLK-M1,CLK-NX1 Honor,HONOR 90 Smart,HNCLK-M1,CLK-NX3 Honor,HONOR Magic V2,HNVER,VER-N49 +Honor,HONOR Magic V3,HNFCPX,FCP-N49 Honor,HONOR Magic Vs,HNFRI,FRI-NX9 Honor,HONOR Magic4 Lite,HNANY-Q1,ANY-LX1 Honor,HONOR Magic4 Lite 5G,HNANY-Q,ANY-NX1 @@ -11864,12 +12442,15 @@ Honor,HONOR Magic6 Lite 5G,HNALI-Q,ALI-NX1 Honor,HONOR Magic6 Lite 5G,HNALI-Q,ALI-NX3 Honor,HONOR Magic6 Pro,HNBVL,BVL-AN16 Honor,HONOR Magic6 Pro,HNBVL,BVL-N49 +Honor,HONOR MagicPad2,HNROD2-Q,ROD2-W09 +Honor,HONOR MagicPad2,HNROD2-Q1,ROD2-W09 Honor,HONOR Pad 8,HNHEY-Q,HEY-W09 Honor,HONOR Pad 9,HNHEY2-Q,HEY2-N09 Honor,HONOR Pad 9,HNHEY2-Q,HEY2-W09 Honor,HONOR Pad X8,HNAGM3,AGM3-AL09HN Honor,HONOR Pad X8,HNAGM3,AGM3-W09HN Honor,HONOR Pad X8 Lite,HNAGM,AGM-W09HN +Honor,HONOR Pad X8a,HNNDL-Q,NDL-W09 Honor,HONOR Pad X9,HNELN-Q,ELN-L03 Honor,HONOR Pad X9,HNELN-Q,ELN-L09 Honor,HONOR Pad X9,HNELN-Q,ELN-W09 @@ -11884,17 +12465,24 @@ Honor,HONOR X6,HNVNE-M,VNE-LX3 Honor,HONOR X6a,HNWDY-M,WDY-LX1 Honor,HONOR X6a,HNWDY-M,WDY-LX2 Honor,HONOR X6a,HNWDY-M,WDY-LX3 +Honor,HONOR X6b,HNJDY-M1,JDY-LX1 +Honor,HONOR X6b,HNJDY-M1,JDY-LX2 +Honor,HONOR X6b,HNJDY-M1,JDY-LX3P +Honor,HONOR X6b 5G,HNALT-Q2,ALT-NX3 +Honor,HONOR X6b Plus,HNJDY-M1,JDY-LX3 Honor,HONOR X7,HNCMA-Q,CMA-LX1 Honor,HONOR X7,HNCMA-Q,CMA-LX2 Honor,HONOR X7,HNCMA-Q,CMA-LX3 Honor,HONOR X7a,HNRKY-M1,RKY-LX1 Honor,HONOR X7a,HNRKY-M1,RKY-LX2 Honor,HONOR X7a,HNRKY-M1,RKY-LX3 +Honor,HONOR X7b,,CLK-LX1 Honor,HONOR X7b,HNCLK-Q,CLK-LX1 Honor,HONOR X7b,HNCLK-Q,CLK-LX2 Honor,HONOR X7b,HNCLK-Q,CLK-LX3 Honor,HONOR X7b 5G,HNCLK-M1,CLK-NX1 Honor,HONOR X7b 5G,HNCLK-M1,CLK-NX2 +Honor,HONOR X7c 5G,HNALT-Q1,ALT-NX1 Honor,HONOR X8,HNTFY-Q,TFY-LX1 Honor,HONOR X8,HNTFY-Q,TFY-LX2 Honor,HONOR X8,HNTFY-Q,TFY-LX3 @@ -11916,6 +12504,7 @@ Honor,Honor 200 Lite,HNLLY-M1,LLY-NX1 Honor,Honor 200 Lite,HNLLY-M1,LLY-NX3 Honor,Honor X9b 5G,HNALI-Q,ALI-NX3P Honor,PORSCHE DESIGN HONOR Magic V2 RSR,HNVER,VER-N49DP +Honor,PORSCHE DESIGN HONOR Magic6,HNBVL,BVL-N59 Honor,PORSCHE DESIGN HONOR Magic6 RSR,HNBVL,BVL-AN20 Honor,RBN-NX1,HNRBN-Q,RBN-NX1 Honor,荣耀V Purse,HNVCA-Q,VCA-AN00 @@ -11940,6 +12529,8 @@ Hoozo,MZS10,MZS10,MZS10 Hoozo,T10A,T10A,T10A Hoozo,YK_P30,YK_P30,YK_P30 Hoozo,YK_P30_EEA,YK_P30_EEA,YK_P30_EEA +Horion,IFPD,65W72B,W72B +Horion,M6APro,M6APro,M6APro Hot Pepper,15 Pro Max,15_Pro_Max,15 Pro Max Hot Pepper,AJI,AJI,HPPR10A Hot Pepper,AP17,AP17,AP17 @@ -11952,10 +12543,12 @@ Hot Pepper,Ghost,HPP-GS1,HPP-GS1 Hot Pepper,H5,H5,H5 Hot Pepper,HPPAP16,HPPAP16,HPPAP16 Hot Pepper,HPPH82A,HPPH82A,HPPH82A +Hot Pepper,HPPH88C,Cascabel,HPPH88C Hot Pepper,K82A,K82A,K82A Hot Pepper,KR10,KR10,KR10 Hot Pepper,KT10,KT10,KT10 Hot Pepper,KT10_EEA,KT10_EEA,KT10_EEA +Hot Pepper,Panca,HPPL63A,HPPL63A Hot Pepper,Pulla,Pulla,Pulla Hot Pepper,ROJO,ROJO,HPPR20A Hot Pepper,Serrano,HPP-L55,HPP-L55 @@ -11977,6 +12570,7 @@ Hotwav,Cyber X,Cyber_X,Cyber X Hotwav,Cyber X Pro,Cyber_X_Pro,Cyber X Pro Hotwav,H1,H1,H1 Hotwav,HOT 6,HOT_6,HOT 6 +Hotwav,Hyper 7 Pro,Hyper_7_Pro,Hyper 7 Pro Hotwav,M5,M5,M5 Hotwav,M5 Plus,M5_Plus,M5 Plus Hotwav,M5_2021,M5_2021,M5 2021 @@ -11991,8 +12585,12 @@ Hotwav,Magic 9,Magic_9,Magic 9 Hotwav,Magic Q8,Magic_Q8,Magic Q8 Hotwav,Magic Q8 Plus,Magic_Q8_Plus,Magic Q8 Plus Hotwav,Magic_5_Plus,Magic_5_Plus,Magic 5 Plus +Hotwav,Note 12,Note_12_2024,Note 12 Hotwav,Note 12E,Note_12E_EEA,Note 12E +Hotwav,Note 13 Max,Note_13_Max,Note 13 Max +Hotwav,Note 15,Note_15,Note 15 Hotwav,Note 15 EEA,Note_15,Note 15 +Hotwav,Note 15 Pro,Note_15_Pro,Note 15 Pro Hotwav,Pad 11,Pad_11_EEA,Pad 11 Hotwav,Pearl K1,Pearl_K1,Pearl K1 Hotwav,Pearl K2,Pearl_K2,Pearl K2 @@ -12010,6 +12608,7 @@ Hotwav,T7 Pro EEA,T7_Pro,T7 Pro Hotwav,TAB R5,TAB_R5,TAB R5 Hotwav,TAB R6 Pro,TAB_R6_Pro,TAB R6 Pro Hotwav,TAB R6 Ultra,TAB_R6_Ultra,TAB R6 Ultra +Hotwav,TAB R8,TAB_R8,TAB R8 Hotwav,Venus,Venus,Venus Hotwav,W10,W10,W10 Hotwav,W10 Pro,W10_Pro,W10 Pro @@ -13585,6 +14184,7 @@ Hublot,Hublot Big Bang e,halibut,Big Bang e HumanWare,Connect12V21,Connect12V21,Connect12V21 HumanWare,Connect12V21_EEA,Connect12V21_EEA,Connect12V21_EEA Human_Acadaemy,HA-007,HA-007,HA-007 +Human_Academy,HA-008,HA-008,HA-008 HumaxDigital,Descodificador Orange TV,b604tnw,Descodificador Orange TV HumaxDigital,FVP-4KGTR,fvp4kgtr,FVP-4KGTR HumaxDigital,H5_DLIVE,h5mini,H5_DLIVE @@ -13770,6 +14370,7 @@ Hyundai,HYUNDAI,hongkong,4K SMART COL TV Hyundai,HYUNDAI,hongkong,4K SMART ISDB TV Hyundai,HYUNDAI,lavender,4K SMART COL TV Hyundai,HYUNDAI,lavender,4K SMART ISDB TV +Hyundai,HYUNDAI,mountbaker,2K SMART TV Hyundai,HYUNDAI,stanford,2K SMART TV Hyundai,HYUNDAI 2K Android TV,lasalle,HYUNDAI 2K Android TV Hyundai,HYUNDAI 2K Android TV-A,lasalle,HYUNDAI 2K Android TV-A @@ -13881,6 +14482,8 @@ I-Bridge,South Korea,IBT02H,IBT02H I-Scream,E1012T,ET1012T,ET1012T I-Scream,i-Screamedu,HL106,HL106 I3-TECHNOLOGIES,GOOGLE EDLA CERTIFIED SLOT-IN OPS,i3COMPUTER-A01-OPS,i3COMPUTER-A01-OPS +I3-TECHNOLOGIES,i3SIXTY-3,i3SIXTY-3,i3SIXTY-3 +I3-TECHNOLOGIES,i3TOUCH-X3,i3TOUCH-X3,i3TOUCH-X3 IAIWAI,A103,A103,A103 ICL-KME CS OJSC,TR10CD1,TR10CD1_7,TR10CD1 ICOM,CTGED01,CTGED01,CTGED01 @@ -13897,11 +14500,14 @@ IIIF150,Air1,Air1,Air1 IIIF150,Air1 Pro,Air1_Pro,Air1 Pro IIIF150,Air1 Ultra,Air1_Ultra,Air1 Ultra IIIF150,Air1 Ultra+,Air1_Ultra_Pro,Air1 Ultra Pro +IIIF150,Air2_Pro_EEA,Air2_Pro,Air2 Pro +IIIF150,Air3_EEA,Air3,Air3 IIIF150,B1,B1,B1 IIIF150,B1 Pro,B1_Pro,B1 Pro IIIF150,B2,B2,B2 IIIF150,B2 Pro,B2_Pro,B2 Pro IIIF150,B2 Ultra,B2_Ultra,B2 Ultra +IIIF150,B3_EEA,B3,B3 IIIF150,Raptor LTD,Raptor,Raptor IKALL,I KALL Z13,I_KALL_Z13,Z13 IKALL,IKALL,IKALL,IKALL @@ -13922,6 +14528,7 @@ IMO(In My Opinion),IMO Q3 Plus,IMO_Q3_Plus,IMO Q3 Plus IMO(In My Opinion),IMO Q4 Pro,IMO_Q4_Pro,IMO Q4 Pro IMO(In My Opinion),IMO Q5,IMO_Q5,IMO Q5 IMO(In My Opinion),IMO S2,S2,IMO S2 +IMOTOR,TP Serials,auto_rk_t60,IMTOS Pro IMPECCA,4K Smart TV,gangbyeon,IMPECCA 4K Smart TV IMPECCA,Smart TV,kanda,IMPECCA 2K Smart TV IMPEX,GRANDE UHD TV,OD0M_EA_T32,GRANDE UHD TV @@ -13936,12 +14543,14 @@ INFINITON,Infiniton,shilin,Infiniton4KAndroidTV INFINITON,"SPAIN, MOROCCO, PORTUGAL",tamachi,INFINITON Android TV INFINITON,"SPAIN, MOROCCO, PORTUGAL",yeongdeungpo,INFINITON Android TV INNOCN,32S1U Pro,32S1U_Pro,32S1U_Pro +INNOCN,32S2U_Pro,32S2U_Pro,32S2U Pro INNOCN,S1,YUL,S1 INNOVA,INNOVA 2K Android TV,lasalle,INNOVA 2K Android TV INNOVA,INNOVA 2K Google TV,capitolhill,INNOVA 2K Google TV INNOVA,INNOVA 4K Android TV,kenton,INNOVA 4K Android TV INNOVA,INNOVA 4K Google TV,keoneae,INNOVA 4K Google TV INOI,A126,A126,A126 +INOI,A14,INOI_A14,A140 INOI,A150,A150,A150 INOI,A160,A160,A160 INOI,A181,A181,A181 @@ -13991,12 +14600,16 @@ INOI,INOI_7_LITE,INOI_7_LITE,INOI_7_LITE INOI,INOI_7i,INOI_7i,INOI_7i INOI,INOI_A14,INOI_A14,A140 INOI,INOI_A14E,INOI_A14,A140 +INOI,T107_Plus,T107_Plus,inoiPad Pro INOI,easyphone,easyphone,INOI easyphone INOI,inoiPad,inoiPad,inoiPad 2+32 Wi-Fi+3G +INOI,inoiPad_Pro,inoiPad_Pro,inoiPad Pro +INOI,inoiPad_Pro,inoiPad_Pro,inoiPad_Pro INOI,inoiPad_mini_3G,inoiPad_mini_3G,inoiPad mini 2+32 Wi-Fi+3G INOI,inoiPad_mini_WiFi,inoiPad_mini_Wi-Fi,inoiPad mini 1+16 Wi-Fi INOVALLEY,MID_106_3G,MID106-3G,MID106-3G INOVALLEY,MID_109_Oreo_BTH,MID_109_Oreo_BTH,MID_109_Oreo_BTH +INOVIO,EVO_TAB7,EVO_TAB7,EVO_TAB7 INQ Mobile,,camden,Camden INQ Mobile,,camden,INQ Cloud Touch INQ Mobile,,camden,INQ Cloud Touch -parrot @@ -14022,6 +14635,7 @@ IQ Touch,VIATABQX1040,VIATABQX1040,VIATABQX1040 IQ Touch,VIATABQX730,VIATABQX730,VIATABQX730 IQ Touch,VIATABQX740,VIATABQX740,VIATABQX740 IQ Touch,iMax_EC1053,iMax_EC1053,iMax_EC1053 +IQU(SZ),IQUSMARTEASYT10W,IQUSMARTEASYT10W,IQUSMARTEASYT10W IQU_GROUP,IQU_T10_4G,IQU_T10_4G,IQU T10 4G IQU_GROUP,IQU_T8_4G,IQU_T8_4G,IQU T8 4G IQU_GROUP,SMARTEasy_Q50,SMARTEasy_Q50,SMARTEasy_Q50 @@ -14029,22 +14643,30 @@ IRA (explore more),IRA explore more,IRA_BHARATAB_1021,IRA_BHARATAB_1021 IRA (explore more),IRA801,IRA801,IRA801 IRA (explore more),IRABIO,IRABIO,IRABIO IRA (explore more),IRADUO_PRO,IRA_DUO_PRO,IRA_DUO_PRO +IRA (explore more),IRAT803,IRAT803,IRAT803 +IRA (explore more),IRAT803,IRAT803,Ira_bharatab_803 IRA (explore more),IRA_DUO_PLUS,IRA_DUO_PLUS,IRA_DUO_PLUS +IRA (explore more),IRA_T1029,IRA_T1029,IRA_T1029 IRA (explore more),IRA_W801,IRA_W801,IRA_W801 +IRA (explore more),T1015,T1015,IRA_T1015 IRA (explore more),T1021,T1021,T1021 IRA (explore more),T1030A,T1030A,T1030A IRA (explore more),T803,T803,T803 IRA (explore more),T808,T808,T808 IRIE,FFF-TAB10H,FFF-TAB10H,FFF-TAB10H +IRIS_OHYAMA,IB-75UED01B,IB-75UED01B,IB-75UED01B IRIS_OHYAMA,LUCA Tablet TM152,TM152M4,TM152 IRIS_OHYAMA,LUCA Tablet TM152,TM152M8,TM152 IRIS_OHYAMA,R4,R4,R4 IRIS_OHYAMA,TE082M2,Luna,TE082M2 IRIS_OHYAMA,TE083M3,TE083M3,TE083 +IRIS_OHYAMA,TE08D1M64,TE08D1M64,TE08D1M64 +IRIS_OHYAMA,TE08D2M64,TE08D2M64,TE08D2M64 IRIS_OHYAMA,TE101N1,Aquaman_10_Smart_WIFI,TE101 IRIS_OHYAMA,TE102M3,TE102M3,TE102 IRIS_OHYAMA,TE103M3,TE103M3,TE103 ISCED,ISCEDTAB21,ISCEDTAB21,ISCEDTAB21 +ISCS,QA3O_M110,QA3O_M110,QA3O_M110 ITAB,ITAB_X40L_Plus,ITAB_X40L_Plus,ITAB_X40L_Plus ITAB,X40L,X40L,X40L ITOS,IC-51,IC_51,IC_51 @@ -14239,6 +14861,7 @@ Infinix,HOT 4 PRO,X556,Infinix HOT 4 Pro Infinix,HOT 4 PRO,X556,Infinix_X556_LTE Infinix,HOT 4 Pro,Infinix-X5511-13M,Infinix HOT 4 Pro Infinix,HOT 4 Pro,X556,Infinix HOT 4 Pro +Infinix,HOT 50 Pro+,Infinix-X6880,Infinix X6880 Infinix,HOT 6,Infinix-X606,Infinix X606 Infinix,HOT 6,Infinix-X606B,Infinix X606B Infinix,HOT 6,Infinix-X606C,Infinix X606C @@ -14290,6 +14913,12 @@ Infinix,Infinix HOT 40,Infinix-X6836,Infinix X6836 Infinix,Infinix HOT 40 Pro,Infinix-X6837,Infinix X6837 Infinix,Infinix HOT 40i,Infinix-X6528,Infinix X6528 Infinix,Infinix HOT 40i,Infinix-X6528B,Infinix X6528B +Infinix,Infinix HOT 50,Infinix-X6882,Infinix X6882 +Infinix,Infinix HOT 50,Infinix-X6882B,Infinix X6882B +Infinix,Infinix HOT 50 5G,Infinix-X6720,Infinix X6720 +Infinix,Infinix HOT 50 5G,Infinix-X6720B,Infinix X6720B +Infinix,Infinix HOT 50 Pro,Infinix-X6881,Infinix X6881 +Infinix,Infinix HOT 50i,Infinix-X6531B,Infinix X6531B Infinix,Infinix HOT 6X,Infinix-X623,Infinix X623 Infinix,Infinix HOT 6X,Infinix-X623,Infinix X623B Infinix,Infinix HOT 7,Infinix-X625C,Infinix X625C @@ -14318,6 +14947,8 @@ Infinix,Infinix NOTE 40,Infinix-X6853,Infinix X6853 Infinix,Infinix NOTE 40 5G,Infinix-X6852,Infinix X6852 Infinix,Infinix NOTE 40 Pro,Infinix-X6850,Infinix X6850 Infinix,Infinix NOTE 40 Pro 5G,Infinix-X6851,Infinix X6851 +Infinix,Infinix NOTE 40S,Infinix-X6850B,Infinix X6850B +Infinix,Infinix NOTE 40X 5G,Infinix-X6838,Infinix X6838 Infinix,Infinix NOTE 5,Infinix-X604_sprout,Infinix X604 Infinix,Infinix NOTE 5,Infinix-X604_sprout,Infinix X604B Infinix,Infinix NOTE 5 Stylus,Infinix-X605_sprout,Infinix X605 @@ -14329,6 +14960,7 @@ Infinix,Infinix SMART 4 Plus,Infinix-X680D,Infinix X680D Infinix,Infinix SMART 7,Infinix-X6515,Infinix X6515 Infinix,Infinix SMART 7 HD,Infinix-X6516,Infinix X6516 Infinix,Infinix SMART 8,Infinix-X6525,Infinix X6525 +Infinix,Infinix SMART 8,Infinix-X6525D,Infinix X6525D Infinix,Infinix SMART 8 HD,Infinix-X6525,Infinix X6525 Infinix,Infinix SMART 8 PRO,Infinix-X6525B,Infinix X6525B Infinix,Infinix SMART 8 Plus,Infinix-X6526,Infinix X6526 @@ -14340,6 +14972,8 @@ Infinix,Infinix X571,Infinix-X571,Infinix X571 Infinix,Infinix X572,Infinix-X572,Infinix X572 Infinix,Infinix ZERO 20,Infinix-X6821,Infinix X6821 Infinix,Infinix ZERO 30,Infinix-X6731B,Infinix X6731B +Infinix,Infinix ZERO 40,Infinix-X6860,Infinix X6860 +Infinix,Infinix ZERO 40 5G,Infinix-X6861,Infinix X6861 Infinix,Infinix ZERO 5G,Infinix-X6815B,Infinix X6815B Infinix,Infinix ZERO 8i,Infinix-X687B,Infinix X687B Infinix,Infinix ZERO X,Infinix-X6811B,Infinix X6811B @@ -14403,6 +15037,7 @@ Infinix,SMART 6 PLUS,Infinix-X6823,Infinix X6823 Infinix,SMART 6 PLUS,Infinix-X6823C,Infinix X6823C Infinix,SMART 7 or SMART 7 PLUS,Infinix-X6517,Infinix X6517 Infinix,SMART 8 Plus,Infinix-X6526,Infinix X6526 +Infinix,SMART 9,Infinix-X6532,Infinix X6532 Infinix,SMART HD,Infinix-X612,Infinix X612 Infinix,SMART HD,Infinix-X612B,Infinix X612B Infinix,SMRAT 8 PRO,Infinix-X6525B,Infinix X6525B @@ -14459,10 +15094,13 @@ Infinix,X600,INFINIX-X600,INFINIX-X600 Infinix,X600,INFINIX-X600-5M,INFINIX-X600 Infinix,X600,INFINIX-X600-5M,Infinix-X600 Infinix,X600,INFINIX-X600-H533-5M,Infinix-X600-LTE +Infinix,XPAD,Infinix-X1101,Infinix X1101 +Infinix,XPAD,Infinix-X1101B,Infinix X1101B Infinix,ZERO 30 5G,Infinix-X6731,Infinix X6731 Infinix,ZERO 5G,Infinix-X6815,Infinix X6815 Infinix,ZERO 5G 2023,Infinix-X6815C,Infinix X6815C Infinix,ZERO 5G 2023,Infinix-X6815D,Infinix X6815D +Infinix,ZERO Flip,Infinix-X6962,Infinix X6962 Infinix,ZERO ULTRA,Infinix-X6820,Infinix X6820 Infinix,ZERO X Pro,Infinix-X6811,Infinix X6811 Infinix,Zero 2,Infinix_X509,Infinix X509 @@ -14496,6 +15134,7 @@ Infocus,IN815,VK3,IN815 Infocus,InFocus M6S,AH2,IF9003 Infocus,InFocus M7 Lite,A02,IF9031 Infocus,InFocus M7S,A08,IF9031 +Infocus,JTouch Series 13,D011,JTouch_Series_13 Infocus,LE5039,BX2,LE5039 Infocus,M2,LSO,InFocus M2 Infocus,M2+,LSC,InFocus M2PLUS @@ -14697,6 +15336,7 @@ Intex,STAARi 12,INTEX_ELYT_E6,INTEX ELYT E6 Intex,T1 Plus,INTEX_ELYT_DUAL,INTEX ELYT DUAL Intex,T1 Plus,INTEX_ELYT_DUAL,INTEX IM0118ND Intex,i1,INTEX_i1,INTEX i1 +Invens,CT1,Beige,CT1 Invens,Diamond,Diamond,Diamond Invens,Eager,Eager,Eager Invens,F1,F1,F1 @@ -14713,6 +15353,7 @@ Invens,S1,S1,S1 Invens,Spain,nagata,INVES SMART TV Invens,UNO,UNO,UNO Invens,WE1,WE1,WE1 +Inventus,CT1,Beige,CT1 Inventus,CT7,Aqua,CT7 Inverse Net,EP172BZ,EP172BZ,EP172BZ Inverse Net,EP172PR,EP172PR,EP172PR @@ -14722,6 +15363,7 @@ Inves,Spain,tamachi,INVES FHD Android TV Inves,Spain,yeongdeungpo,INVES UHD Android TV Ipro,Amber5S,Amber5S,Amber5S Ipro,Amber5S_Pro,Amber5S_Pro,Amber5S_Pro +Ipro,Amber5S_Pro,Mobilephone,Amber5S_Pro Ipro,Amber5s Plus,Amber5s_Plus,Amber5s Plus Ipro,Amber6,Amber6,Amber6 Ipro,Amber7S,Amber7S,Amber7S @@ -14891,6 +15533,7 @@ Isafe,IS520,IS520,IS520 Isafe,IS520.1,IS520_1,IS520_1 Isafe,IS530,IS530,IS530 Isafe,IS655,IS655,IS655 +Isafe,IS880,IS880,IS880 Isafe,IS910.1,IS910_1,IS910_1 Isafe,IS930,IS930,IS930 Isafe,IS940,IS940,IS940 @@ -14957,6 +15600,7 @@ Itel,ITEL,zhongshan,4K SMART TV Itel,ITELL_K4700Q,ITELL_K4700Q,ITELL K4700Q Itel,ITELMOBILE GP10X2019,GP10X2019,GP10X2019 Itel,Itel A58 Lite,itel-A631W,itel A631W +Itel,Orange Nola Up,Nola_Up,Orange Nola up Itel,Orange Nola fun 3,Nola_fun_3,Orange Nola fun 3 Itel,P11,itel_P11,itel P11 Itel,P12,itel_P12,itel P12 @@ -14973,9 +15617,12 @@ Itel,P37,itel-P651W,itel P651W Itel,P37 Pro(Vision2 Plus),itel-P681LM,itel P681LM Itel,P38,itel-P661W,itel P661W Itel,P51,P51,itel P51 +Itel,P65,itel-P671L,itel P671L +Itel,P65,itel-P671LN,itel P671LN Itel,Pad 1 mini,itel-IKP-31,IKP-31 Itel,Pad-2,itel-Pad-2,itel-P10002L Itel,Pad1,itel-P10001L,itel P10001L +Itel,Pad2 mini,itel-Pad,itel-P8002L Itel,Prime 4,itel_Prime4,itel Prime 4 Itel,S11,S11,itel S11 Itel,S11 Plus,S11Plus,itel S11 Plus @@ -15095,6 +15742,8 @@ Itel,itel A48,itel-L6006,itel L6006 Itel,itel A48,itel-L6006L,itel L6006L Itel,itel A49 Play,itel-A631L,itel A631L Itel,itel A50,itel-A667L,itel A667L +Itel,itel A50,itel-A667LP,itel A667LP +Itel,itel A50C,itel-A669L,itel A669L Itel,itel A510W,itel-A510W,itel A510W Itel,itel A52,itel-A52,itel A52 Itel,itel A52 Lite,itel-A52-Lite,itel A52 Lite @@ -15114,6 +15763,7 @@ Itel,itel A60E,itel-A662L,itel A662L Itel,itel A60S,itel-A662LM,itel A662LM Itel,itel A60s,itel-A662LM,itel A662LM Itel,itel A662L,itel-A662L,itel A662L +Itel,itel A80,itel-A671LC,itel A671LC Itel,itel AC12,itel-A14,itel A14 Itel,itel AC13,itel-W4001,itel W4001 Itel,itel AC13,itel-W4001P,itel W4001P @@ -15143,6 +15793,9 @@ Itel,itel P55 5G,itel-P661N,itel P661N Itel,itel P55+,itel-P663L,itel P663L Itel,itel P55+,itel-P663LN,itel P663LN Itel,itel P55T,itel-P665L,itel P665L +Itel,itel P65,itel-P671L,itel P671L +Itel,itel P65,itel-P671LN,itel P671LN +Itel,itel P65C,itel-P666L,itel P666L Itel,itel Prime 4,itel_Prime4,itel Prime 4 Itel,itel PrimeTab 1,itel-W7002,itel W7002 Itel,itel PrimeTab 1,itel-W7002P,itel W7002P @@ -15163,7 +15816,9 @@ Itel,itel V41,itel-W4001S,itel W4001S Itel,itel V51 LTE,itel-L5007S,itel L5007S Itel,itel V52 lite,itel-A507LV,itel A507LV Itel,itel V52A,itel-A507LX,itel A507LX +Itel,itel V52A,itel-A507LXU,itel A507LXU Itel,itel V52LTE,itel-A507LV,itel A507LV +Itel,itel V53,itel-A507LVU,itel A507LVU Itel,itel VISION 5 Plus,itel-S662LCN,itel S662LCN Itel,itel Vision 3,itel-S661L,itel S661L Itel,itel Vision 3,itel-S661LN,itel S661LN @@ -15172,6 +15827,8 @@ Itel,itel Vision 3 Plus(P38 Pro),itel-P682LP,itel P682LP Itel,itel Vision 5,itel-S663LC,itel S663LC Itel,itel Vision1(P36 Play),itel-L6005,itel L6005 Itel,itel Vision2s,itel-P651L,itel P651L +Itel,itel VistaTab 30,itel-P10003L,itel P10003L +Itel,itel VistaTab 10,itel-P10004L,itel P10004L Itel,itel W4001,itel-W4001,itel W4001 Itel,itel W4001O,itel-W4001O,itel W4001O Itel,itel W4001OZ,itel-W4001OZ,itel W4001O @@ -15190,12 +15847,14 @@ Itel,itel-A510W,itel-A510W,itel A510W Itel,itel-IKP-31,itel-IKP-31,IKP-31 Itel,itel-L5007S,itel-L5007S,itel L5007S Itel,itel-Pad-2,itel-Pad-2,itel-P10002L +Itel,itel-Pad-2-Pro,itel-Pad-2-Pro,itel-P10002LP Itworks,TM705,TM705,NID_7010 J-COM (cn),SC40,SC40,SC40 J:COM,KSTB7043,KSTB6165,KSTB7043 J:COM,XA401,XA401,XA401 J:COM,XA402,XA402,XA402 J:COM,XA403,sti6260d195,XA403 +JAV Smart-box,Smart-box,rk3588_t,BOX_1 JAY-TECH,TPC-G1010,TPC-G1010_EEA,TPC-G1010 JAY-TECH,TPC-G1011LTE,TPC-G1011LTE,TPC-G1011LTE JAY-TECH,TPC-G109_EEA,TPC-G109,TPC-G109 @@ -15225,12 +15884,22 @@ JREN,J11PLUS,J11PLUS,J11PLUS JREN,J7,J7,J7 JREN,JR-101,JR-101,JR-101 JREN,JR-802,JR-802,JR-802 +JREN,JR-J10A,JR-J10A,JR-J10A JREN,JR-J71,JR-J71,JR-J71 JREN,JR-J8,JR-J8,JR-J8 JREN,JR_J1063,JR_J1063,JR_J1063 JREN,JR_J7,JR_J7,JR_J7 JTWORKS,JTWORKS-IFPD,rk3588_t,JTW JTYPDA,X20L,X20L,X20L +JUEDUR,R500 EEA,R500_EEA,R500_EEA +JUEDUR,R500 US,R500_US,R500_US +JUEDUR,R700_EEA,R700_EEA,R700_EEA +JUEDUR,R700_US,R700_US,R700_US +JUEDUR,R800_EEA,R800_EEA,R800_EEA +JUEDUR,R800_US,R800_US,R800_US +JUEDUR,R800_U_EEA,R800_U_EEA,R800_U_EEA +JUEDUR,R900_EEA,R900_EEA,R900_EEA +JUEDUR,R900_US,R900_US,R900_US JUSYEA,J10_EEA,J10_EEA,J10_EEA JUSYEA,J10_US,J10_US,J10_US JUSYEA,J3,JUSYEA_J3,J3 @@ -15239,8 +15908,13 @@ JUSYEA,J5-EEA,J5-EEA,J5-EEA JUSYEA,J5_EEA,J5_EEA,J5_EEA JUSYEA,J5_M,J5_M,J5_M JUSYEA,J6_EEA,J6_EEA,J6_EEA +JUSYEA,J6_US,J6_US,J6_US JUSYEA,J8,J8,J8 JUSYEA,J8_EEA,J8_EEA,J8_EEA +JUSYEA,J8_EEA_T,J8_EEA_T,J8_EEA +JUSYEA,J8_T,J8_T,J8_US +JUSYEA,J9_EEA,J9_EEA,J9_EEA +JUSYEA,J9_US,J9_US,J9_US JVC,,gener,RY-AP1 JVC,4K Smart TV,gangbyeon,4K AI Smart TV JVC,4K Smart TV,pioneer,4K SA Smart TV @@ -15332,6 +16006,7 @@ JabrBox,S502,S502,S502 Jam,JAM,hongkong,4K SMART TV Jam,JAM,mountbaker,2K SMART TV Jambo_Technology,JamboPhone,JP1,JP1 +Jambo_Technology,JamboPhone2,JP2,JP2 Janam,HT1,HT1,HT1 Janam,XG200,XG200,XG200 Janam,XG4,XG4,XG4 @@ -15348,6 +16023,8 @@ Janam,XT75,XM75,XM75 Japan Digital Serve,Amigo7xJDS,Amigo7xJDS,Amigo7xJDS JapanTaxi,IRIS ITAB05,IRIS_ITAB05,IRIS_ITAB05 Jawwy TV,JAWWY-TV-2.0,HP40A,JAWWY-TV-2.0 +Jeazans,KT1016,KT1016,KT1016 +Jeazans,KT1016_EEA,KT1016,KT1016 Jenesis,A94GT_Plus,A94GT_Plus,A94GT_Plus Jenesis,JT07-81B,JT07-81B,JT07-81B Jenesis,JT10-81B,JT10-81B,JT10-81B @@ -15411,6 +16088,7 @@ Jooyon,UHD Android TV,sindorim,AI PONT Jumper,EZpad_M10S,EZpad_M10S,EZpad M10S Jumper,EZpad_M10S_ROW,EZpad_M10S_ROW,EZpad M10S Jumper,EZpad_M10_EEA,EZpad_M10,EZpad M10 +Jumper,EZpad_M10_HD,EZpad_M10_HD,EZpad M10 HD Jumper,EZpad_M11,EZpad_M11,EZpad_M11 Jumper,EZpad_M11_Pro,EZpad_M11_Pro,EZpad M11 Pro Jumper,Z1,Z1,Z1 @@ -15451,6 +16129,8 @@ KAAN,KAAN_N2,KAAN_N2,KAAN_N2 KAGIS,Australia,tamachi,KAGIS Android TV KAGIS,Australia,yeongdeungpo,KAGIS Android TV KAKTIN,D08,D08,D08 +KAKTIN,D9,D9,D9 +KAKTIN,SM1,SM1,SM1 KANSELIR,KTB-168,KTB-168,KTB-168 KAT(AF),SM1_Tablet,SM1_Tablet,SM1 KAZAM,TROOPER X3.5,KAZAM,Trooper_X35 @@ -15529,22 +16209,32 @@ KEMPLER STRAUSS,ZKEMPLER11PRO,ZKEMPLER11PRO,ZKEMPLER11PRO KEMPLER STRAUSS,ZKEMPLERMAX,ZKEMPLERMAX,ZKEMPLERMAX KEMPLER STRAUSS,ZKEMPLER_11,ZKEMPLER_11,ZKEMPLER_11 KEMPLER STRAUSS,ZKEMPLER_PLUS,ZKEMPLER_PLUS,ZKEMPLER PLUS +KENSHI,Armor C1 Max,Armor_C1_Max,Armor C1 Max KENSHI,Armor C1s,Armor_C1s,Armor C1s KENSHI,Armor H1s,Armor_H1s,Armor H1s KENSHI,Armor I1 Slim,Armor_I1_Slim,Armor I1 Slim KENSHI,Armor I1w,Armor_I1w,Armor I1w +KENSHI,Armor P1 Pro,Armor_P1_Pro,Armor P1 Pro +KENSHI,Armor V1s,Armor_V1s,Armor V1s KENSHI,Armor_C1w_RU,Armor_C1w,Armor_C1w KENSHI,Armor_P1s,Armor_P1s,Armor P1s KENSHI,E10,E10,E10 KENSHI,E17_RU,E17,E17 KENSHI,E18_RU,E18,E18 KENSHI,E28,E28,E28 +KENSHI,H14,H14,H14 KENSHI,H21,H21,H21 +KENSHI,H34,H34,H34 KENSHI,H38,H38,H38 +KENSHI,H44,H44,H44 KENSHI,Kenshi KP10,KP10,KP10 KENSHI,Kenshi KP11,KP11,KP11 KENSHI,O8,O8,O8 +KENSHI,Pad_Lite_E48,Pad_Lite_E48,Pad Lite E48 +KENSHI,Pad_Lite_E58,Pad_Lite_E58,Pad Lite E58 KEP-Tech,K-S18,K-S18,K-S18 +KEYENCE,BT-A2000,BT-A2000,BT-A2000 +KEYENCE,BT-A2000M,BT-A2000,BT-A2000M KEYENCE,BT-A500GA,BTA500,BTA500 KEYENCE,BTA700,BTA700,BTA700 KEYENCE,DX-A400,DX-A400,DX-A400 @@ -15603,6 +16293,7 @@ KONKA,SP5,SP5,SP5 KONKA,SP9,SP9,SP9 KONKA,TE1011,TE1011,TE1011 KONKA,TP701,TP701,TP701 +KONKA,VISION E1 Series,VISION_E1_Series,VISION_E1_Series KONKA,sp6,SP6,SP6 KOOLMAAX,GEMINI,GEMINI,GEMINI KOOLNEE,K1,KOOLNEE_K1,K1 @@ -15647,6 +16338,9 @@ KTC,EcoTV1 J,catlins,EcoTV1 J KTC,EcoTVCOL,lavender,EcoTV C KTC,EcoTVDVB,lavender,EcoTV D KTC,EcoTVISDB,lavender,EcoTV +KTC,KTC,mountbaker,2K SMART TV +KTC,SD_GM01,Capricorn,Eco Smart Display +KTC,W83B-LANGO3576,W83B-F2-RK3576,W83B-F2-RK3576 KTC (PD),BLISS503,BLISS503,BLISS503 KTC (PD),BLISS_8,BLISS_8,BLISS_8 KTCtv,ADSUN,stanford,2K SMART TV @@ -15667,7 +16361,10 @@ KTCtv,COLORVIEW,mountbaker,2K SMART TV KTCtv,CONTINUUS,stanford,SMART TV KTCtv,DAIWA,hongkong,4K SMART TV KTCtv,DAIWA,lavender,4K SMART TV +KTCtv,DAMASCO,lavender,4K SMART TV +KTCtv,DAMASCO,mountbaker,2K SMART TV KTCtv,DANILUX,hongkong,4K SMART TV +KTCtv,DANILUX,lavender,4K SMART TV KTCtv,DANILUX,mountbaker,2K SMART TV KTCtv,DIGGIO,hongkong,DIGGIO GOOGLE TV 4K KTCtv,DIGGIO,lavender,DIGGIO GOOGLE TV 4K @@ -15723,6 +16420,7 @@ KTCtv,NAKAMICHI,mountbaker,NAKAMICHI GOOGLE TV KTCtv,NAKAMICHI,stanford,CSV2K KTCtv,NAKAMICHI,zhongshan,CSV4K KTCtv,NEXUS,lavender,4K SMART TV +KTCtv,NEXUS,mountbaker,2K SMART TV KTCtv,OZON,stanford,2K SMART TV KTCtv,OZON,zhongshan,4K SMART TV KTCtv,PHIMARK,hongkong,4K SMART TV @@ -15731,9 +16429,11 @@ KTCtv,PHIMARK,mountbaker,2K SMART TV KTCtv,POWEROLOGY,hongkong,4K SMART TV KTCtv,QRIOM,hongkong,4K SMART TV KTCtv,QRIOM,lavender,4K SMART TV +KTCtv,QRIOM,minami,2K SMART TV KTCtv,QRIOM,mountbaker,2K SMART TV KTCtv,RENYA,mountbaker,2K SMART TV KTCtv,REYNA,hongkong,4K SMART TV +KTCtv,REYNA,lavender,4K SMART TV KTCtv,ROOMI,hongkong,4K SMART TV KTCtv,RZTK,stanford,2K SMART TV KTCtv,RZTK,zhongshan,4K SMART TV @@ -15752,6 +16452,12 @@ KTCtv,THEUHD,hongkong,4K SMART TV KTCtv,TRIBOSS,mountbaker,2K SMART TV KTCtv,VEIRA,lavender,4K SMART TV KTCtv,VEIRA,mountbaker,2K SMART TV +KTCtv,VIMEEL,lavender,VIMEEL GOOGLE TV 4K +KTCtv,VIMEEL,mountbaker,VIMEEL GOOGLE TV +KTCtv,VIOTTO,lavender,4K SMART ISDB TV +KTCtv,VIOTTO,lavender,4K SMART TV +KTCtv,VIOTTO,mountbaker,2K SMART ISDB TV +KTCtv,VIOTTO,mountbaker,2K SMART TV KTCtv,VISTA,stanford,2K SMART TV KTCtv,VISTA,zhongshan,4K SMART TV KTCtv,VON,stanford,2K SMART TV @@ -15792,12 +16498,15 @@ Kaicom,K7-40,K7-40,K7-40 Kaicom,K901,K901,K901 Kaicom,K901,K901_2,K901 Kaicom,KAICOM W660,W660,W660 +Kaliho,H3,H3,H3 Kalley, Silver Max Pro,Silver_Max_Pro,Silver Max Pro Kalley,Android TV,R1,ATV R1 Kalley,Android TV,R2,ATV R2 Kalley,BLACK_PRO,BLACK_PRO,BLACK_PRO Kalley,Black,Black,Black +Kalley,Black 1,Black_1,Black 1 Kalley,Black G,Black_G,Black G +Kalley,Black G3,Black_G3,Black G3 Kalley,Black_G_2,Black_G_2,Black_G_2 Kalley,Black_X,Black_X,Black X Kalley,Black_Z,Black_Z,Black_Z @@ -16008,6 +16717,7 @@ Kioto,MID1021,MID1021,MID1021 Kioto,MID1028,MID1028,MID1028 Kioto,MID1036,MID1036,MID1036 Kiowa,A5_CRISTAL,A5_CRISTAL,A5_CRISTAL +Kiowa,KIOWA,lavender,4K SMART TV Kiowa,KIOWA,mountbaker,2K SMART TV Kiowa,KIOWA,stanford,2K SMART TV Kiowa,KIOWA,zhongshan,4K SMART TV @@ -16098,6 +16808,7 @@ Kobo,Vox,pegasus,Vox Kodak,D50PRO,Kodak_D50PRO,D50PRO Kodak,Ektra,KodakEktra,Ektra Kodak,IM5,IM5,IM5 +Kodak,KD10112TB,KD10112TB,KD10112TB Kodak,KODAK,bruno,KODAK2KAndroidTV Kodak,KODAK,shilin,KODAK4KAndroidTV Kodak,KODAK SMARTWAY L1 PRO,L1_PRO,KODAK SMARTWAY L1 PRO @@ -16134,6 +16845,7 @@ Kogan,Australia,yeongdeungpo,Kogan TV Kogan,Australia and New Zeeland,guandu,Kogan 4K TV Kogan,EU、UK、AP,martin,Kogan TV Kogan,KALED32RH9210STA,ikebukuro,AI PONT +Kogan,KATB10128WPA,KATB10128WPA,KATB10128WPA Kogan,KATB1064WGRY,KATB1064WGRY,KATB1064WGRY Kogan,KATB21064CPA,KATB21064CPA,KATB21064CPA Kogan,Kogan 4K Android TV,SW4H,Kogan 4K Android TV @@ -16152,6 +16864,7 @@ Kogan,Smart TV,longshan,AI PONT Kolin,KOLIN,hongkong,4K SMART TV Kolin,Smart TV,longshan,AI PONT Kolin,Smart TV,redwood,AI PONT +Kolke,KTK-611,KTK-611,Kolke_KTK611 Komu,K22,K22,K22 Konchris,Konchris 2K Android,lasalle,Konchris 2K Android TV Konchris,Konchris 4K Android TV,kenton,Konchris 4K Android TV @@ -16169,6 +16882,7 @@ Konrow,EASY_S55P,EASY_S55P,EASY_S55P_EEA Konrow,K-TAB1005,K-TAB1005,K-TAB1005 Konrow,K-TAB703,K-TAB703,K-TAB703 Konrow,KONROW,KONROW_701X,KONROW_701X +Konrow,KTAB704,KTAB704,KTAB704 Konrow,KTAB_1003,KTAB_1003,KTAB_1003 Konrow,KTAB_1004,KTAB_1004,KTAB_1004 Konrow,LINK55,LINK55,LINK55 @@ -16208,6 +16922,7 @@ Krono,NET_ONE,NET_ONE,NET_ONE Krono,NET_R7,NET_R7,NET_R7 Krono,NET_TITAN,NET_TITAN,NET_TITAN Krono,NET_VOLT,NET_VOLT,NET_VOLT +Krono,NET_X2,NET_X2,NET_X2 Krono,Net_Max_Go,Net_Max_Go,Net_Max_Go Krono,SKY,SKY,SKY Krono,ULTRA,ULTRA,ULTRA @@ -16233,6 +16948,7 @@ Kruger&Matz,Eagle_1074,KM1074,Eagle_1074 Kruger&Matz,Eagle_1075,KM1075,Eagle_1075 Kruger&Matz,Eagle_1076,KM1076,Eagle_1076 Kruger&Matz,Eagle_702,Eagle_702,KM0702 +Kruger&Matz,Eagle_806_EEA,KM08061,Eagle_806 Kruger&Matz,Eagle_807,KM0807,Eagle_807 Kruger&Matz,FLOW,Kruger_Matz_FLOW,FLOW Kruger&Matz,FLOW 5,FLOW_5,FLOW_5 @@ -16247,6 +16963,9 @@ Kruger&Matz,Flow_7S_EEA,Flow_7S,Flow 7S Kruger&Matz,Flow_9_EEA,Flow_9,Flow 9 Kruger&Matz,KM 2K TV,capitolhill,KM 2K TV Kruger&Matz,KM 4K TV,keoneae,KM 4K TV +Kruger&Matz,KM0708,KM0708,KM0708 +Kruger&Matz,KM0808,KM0808,KM0808 +Kruger&Matz,KM1008,KM1008,KM1008 Kruger&Matz,KM1066,EAGLE_1066,KM1066 Kruger&Matz,KM1067,EAGLE_1067,KM1067 Kruger&Matz,KM1072,EAGLE_1072,KM1072 @@ -16282,6 +17001,7 @@ Kuori,KH660,Nupiton,KH660 Kurio,K01023,K01023,K01023 Kurio,K01023,K01023,KURIO_01023 Kurio,K01023US,K01023US,K01023US +Kurio,K01524,K01524,K01524 Kurio,KURIO LITE GO NEW,U3A_7_WIFI_Refresh_KD,9309S Kurio,KURIO LITE GO NEW,U3A_7_WIFI_Refresh_KD,9309S2 Kurio,KURIO LITE GO NEW,U3A_7_WIFI_Refresh_KD,9309S2_EEA @@ -16320,6 +17040,7 @@ Kyocera,DIGNO S,KYL21,KYL21 Kyocera,DIGNO SANGA edition,KC-S304,KC-S304 Kyocera,DIGNO SX2,KY21L-ST100,KC-S302 Kyocera,DIGNO SX3,KY22L-ST200,KYG02 +Kyocera,DIGNO SX4 Wi-Fi,KY24L-ST300,KC-S205 Kyocera,DIGNO T,302KC,302KC Kyocera,DIGNO Tab,KYT34,KYT34 Kyocera,DIGNO V,KYV42,KYV42_u @@ -17382,6 +18103,7 @@ LGE,LG Tribute Empire,mcv1s,LM-X220PM LGE,LG Tribute Royal,mmh5lm,LM-X320 LGE,LG U,bbg,LG-F820L LGE,LG Ultra Tab,jettalt,10A30Q +LGE,LG Ultra Tab,solemiolt,10AWM20S LGE,LG V35 ThinQ,judyp,LM-V350 LGE,LG V35 ThinQ,judyp,LM-V350N LGE,LG V50 ThinQ,flashlmdd,LM-V500 @@ -17835,12 +18557,16 @@ LGU+,U+tv soundbar,woofer2,S60UPA LGU+,UHD4K,UHD4K,UHD4K LGU+,UHD4T,uie4057lgu,uie4057lgu LGU+,WA-U420D,WA-U420D,WA-U420D +LG_Electronics,TR3DK,TR3DK,TR3DK +LG_Electronics,TR3PN,rk3588_t,TR3PN LIAONING YIYATONG,DISNEY_Tablet_PC,DISNEY_Tablet_PC,DS2310-70LP LIAONING YIYATONG,IRULU_MID,IRULU_MID,X10 +LIBERTON,Smart TV,longshan,AI PONT LIBERTON,Smart TV,redwood,AI PONT LIFE Digital,K3102_4G,K3102_4G,ITELL K3102 4G LIFE Digital,K3102_W,K3102_W,K3102_W LIFE Digital,K3102_WIFI,K3102_WIFI,K3102 WIFI +LIFEPHONE,HERO,LIFEPHONE_HERO,HERO LINNEX,LI22,LI22,LI22 LINSAY,F-7HD2CORE / F-7HD4CORE / F-10HD2CORE /F-10XHD4CORE,F-7HD2CORE,LINSAY F-7HD2CORE/F-7HD4CORE/F-10HD2CORE/F-10XHD4CORE LISTO,"France, Belgium, Germany, The Netherlands, Italy, Spain, Portugal",yeongdeungpo,LISTO Android TV @@ -17911,10 +18637,13 @@ LT Electronics,SPURT_K500,SPURT_K500,K500 LT Electronics,SPURT_K600,SPURT_K600,K600 LTC(LR),LTC1066,LTC1066,LTC1066 LT_Mobile,LT 2003,LT_2003,LT 2003 +LT_Mobile,LT-E6707,LT_Mobile_E6707,LT-E6707 LT_Mobile,LT_6217,LT_6217,LT_6217 LT_Mobile,LT_6509,LT_6509,LT_6509 +LT_Mobile,LT_8501,LT_8501,LT_8501 LT_Mobile,LT_9701,LT_9701,LT_9701 LT_Mobile,LT_9902,LT_9902,LT_9902 +LT_Mobile,LT_9906,LT_9906,LT_9906 LT_Mobile,LT_mobile_S22,LT_mobile_S22,S22 LUCOMS,Android TV,R1,ATV R1 LUCOMS,Android TV,R2,ATV R2 @@ -17954,6 +18683,8 @@ LW,LW788,LW788,LW788 LYNKNEX,LYNKNEX PX5,LYNKNEX-PX5,PX5 LYNKNEX,PX5,LYNKNEX-PX5,PX5 LYOTECH_LABS,LFi_ONE_EEA,LFi_ONE,LFi ONE +LZU_lzu,D113,D113,D113 +LZU_lzu,D113_EEA,D113_EEA,D113_EEA Laiq,GLAM,LAIQ_Glam,LAIQ Glam Laiq,Glow,Glow,Glow Laiq,STARTRAIL 8,STARTRAIL,STARTRAIL 8 @@ -18057,6 +18788,9 @@ Lanix,M1R,M1R,M1R Lanix,M5,M5,M5 Lanix,M5e,M5e,M5e Lanix,NA,stanford,2K SMART TV +Lanix,RX10v8,RX10v8,RX10v8 +Lanix,RX10v9,RX10v9,RX10v9 +Lanix,RX7V4,RX7V4,RX7V4 Lanix,RX7_v3,RX7_v3,RX7_v3 Lanix,RX8,Ilium_PAD_RX8,Ilium_PAD_RX8v4 Lanix,X100,ILIUM_X100,ILIUM_X100 @@ -18095,6 +18829,7 @@ Lark,PHABLET 7,PHABLET7,PHABLET 7 Lark,Ultimate X4 10.1 3G IPS,UltimateX41013GIPS,Ultimate X4 10.1 3G IPS Lark,Ultimate X4 8s 3G,UltimateX48s3G,Ultimate X4 8s 3G Laser,GRAND,GRAND,GRAND +Laser,MID-104GB-968,MID-104GB-968,MID-104GB-968 Laser,MID-1087,MID-1087,MID-1087 Laser,MID-1090IPS,MID-1090IPS,MID-1090IPS Laser,MID-787,MID-787,MID-787 @@ -18107,6 +18842,7 @@ Laser,MID_1089IPS,MID_1089IPS,MID_1089IPS Laser,MID_1089IPSA100,MID_1089IPSA100,MID_1089IPSA100 Laser,MID_1089IPS_EEA,MID_1089IPS,MID_1089IPS Laser,MID_1090IPSV9,MID_1090IPSV9,MID_1090IPSV9 +Laser,MID_1099IPS_V13,MID_1099IPS_V13,MID_1099IPS Laser,MID_785,MID_785,MID_785 Laser,MID_785A100,MID-785A100,MID_785A100 Laser,MID_787V9,MID_787V9,MID_787V9 @@ -18115,6 +18851,7 @@ Laser,MID_789A100,MID_789A100,MID_789A100 Laser,MID_789IPS,MID_789IPS,MID_789IPS Laser,MID_789IPSA100,MID_789IPSA100,MID_789IPSA100 Laser,MID_799IPS,MID_799IPS,MID_799IPS +Laser,MID_799IPS_V13,MID_799IPS_V13,MID_799IPS Laser,MID_899IPS,MID_899IPS,MID_899IPS Lava,A1,LAVAA1,LAVAA1 Lava,A3,LAVA_A3,LAVA_A3 @@ -18145,6 +18882,7 @@ Lava,BLAZE 5G,LXX503,LAVA LXX503 Lava,Blaze 2 Pro,LZX406,LAVA LZX406 Lava,Blaze Curve,LXX505,LAVA LXX505 Lava,Blaze Pro 5G,LXX506,LAVA LXX506 +Lava,Blaze X 5G,LXX513,LXX513 Lava,ERA 1X,era1X,era1X Lava,ERA 1X,era1X,era1Xpro Lava,Era 2X 3GB,XE2X3GB,Era 2X 3GB @@ -18233,7 +18971,10 @@ Lava,Xolo Era 2X,XE2X,Era 2X Lava,Xolo Era X,era_X,era_X Lava,Xolo era 2,era_2,era 2 Lava,Y50,AF9020,AF9020 +Lava,YUVA 2 PRO,LZX408,LAVA LZX408 Lava,YUVA 3,LZX415,LZX415 +Lava,Yuva 5G,LXX510,LAVA LXX510 +Lava,Yuva Star,LZG409,LAVA LZG409 Lava,Z1,Z1,Z1 Lava,Z1 Pro,LZG401,LAVA LZG401 Lava,Z10,LAVA_Z10,Z10 @@ -18323,6 +19064,7 @@ Le Pan,TC1010,FG6A-LP,Le Pan TC1010 Le Pan,TC1020,FG6Q,Le Pan TC1020 Le Pan,TC802A,UY8,Le Pan TC802A LeBest,A1,A1,A1 +LeBest,LeBest L2,L2,L2 LeBest,S1,S1,S1 LeTV,Le 2,le_s2,Le X520 LeTV,Le 2,le_s2_ww,Le X526 @@ -18768,6 +19510,7 @@ Lenovo,Lenovo A5s,A5s,Lenovo L18081 Lenovo,Lenovo A6 Note,Lenovo_A6_Note,Lenovo L19041 Lenovo,Lenovo A8,AK57,L10041 Lenovo,Lenovo A8,AK57,Lenovo L10041 +Lenovo,Lenovo Idea Tab Pro,TB373FU,TB373FU Lenovo,Lenovo K11,L38082,Lenovo L38082 Lenovo,Lenovo K11,L38083,Lenovo L38083 Lenovo,Lenovo K12 Note,guamp,Lenovo K12 Note @@ -18894,6 +19637,8 @@ Lenovo,Lenovo Tab K10 PRC,X6C6X,Lenovo TB-X6C6X Lenovo,Lenovo Tab K10c,TB-X6E6N,Lenovo TB-X6E6N Lenovo,Lenovo Tab K11,TB330FUP,TB330FUP Lenovo,Lenovo Tab K11,TB330XUP,TB330XUP +Lenovo,Lenovo Tab K11 Plus,TB352FU,TB352FU +Lenovo,Lenovo Tab K11e,TB330XUP,TB330XUP Lenovo,Lenovo Tab K8,TB-8506F,Lenovo TB-8506F Lenovo,Lenovo Tab M10 (3rd Gen),TB328FU,TB328FU Lenovo,Lenovo Tab M10 (3rd Gen),TB328XU,TB328XU @@ -19251,6 +19996,7 @@ Lesia,K2s,K2s,K2 Lesia,K5,K5,K5 Lesia,K6,K6,K6 Lesia,K7,K7,K7 +Lesia,P40,P40,P40 Lexia Mobile,S1,S1,S1 Lexia Mobile,S2,S2,S2 Lexia Mobile,S3,S3,S3 @@ -19259,6 +20005,8 @@ Lexibook,Fluo XL,MFC191FR2,MFC191FR2 Lexibook,Fluo XL Premium Edition,MFC510FR1,MFC510FR1 Lexibook,LT10,LT10,LT10 Lexibook,LT10EN_09,LT10EN_09,LT10EN_09 +Lexibook,LT10_01_EEA,LT10_01_EEA,LT10_01_EEA +Lexibook,LT10_10,LT10_10,LT10_10 Lexibook,"LexiTab 10""",MFC512,MFC512FR Lexibook,LexiTab 10'',mfc511,MFC511DE Lexibook,LexiTab 10'',mfc511,MFC511EN @@ -19332,6 +20080,7 @@ Logic Instrument,Fieldbook K80,lifbk80,Logic Instrument Fieldbook K80 Logic Instrument,Logic Instrument Fieldbook 57,lifb57,Logic Instrument Fieldbook F57 Logic Instrument,Logic Instrument Fieldbook KS80,lifbks80,Logic Instrument Fieldbook KS80 Logic Instrument,Logic Instrument Fieldbook N101,lifbn101,Logic Instrument Fieldbook N101 +Logic Instrument,Logic Instrument Fieldbook N101G2,lifbn101g2,Logic Instrument Fieldbook N101G2 Logic Instrument,Logic Instrument Fieldbook N80,lifbn80,Logic Instrument Fieldbook N80 Logic Mobility,L4T,L4T,L4T Logic Mobility,L50,LOGIC_L50,LOGIC L50 @@ -19346,9 +20095,11 @@ Logic Mobility,L63A,L63A,LOGIC L63 Logic Mobility,L66,L66,L66 Logic Mobility,L66 LITE,L66_LITE,L66 LITE Logic Mobility,L66 PRO,L66_PRO,LOGIC L66 PRO +Logic Mobility,L66M,LOGIC_L66M,L66M Logic Mobility,L68,LOGIC_L68,LOGIC L68 Logic Mobility,L68 Ultra,L68_Ultra,L68_Ultra Logic Mobility,LOGIC L55V PLUS,LOGIC_L55V_PLUS,LOGIC L55V PLUS +Logic Mobility,LOGIC L44,LOGIC_L5M,LOGIC L44 Logic Mobility,LOGIC L50T,LOGIC_L50T,LOGIC L50T Logic Mobility,LOGIC L61,LOGIC_L61,LOGIC L61 Logic Mobility,LOGIC L63,LOGIC_L63,LOGIC L63 @@ -19359,10 +20110,12 @@ Logic Mobility,LOGIC MV02,LOGIC_MV02,LOGIC MV02 Logic Mobility,LOGIC_L4T_1,LOGIC_L4T,LOGIC L4T Logic Mobility,LOGIC_L55S,LOGIC_L55S,LOGIC L55S Logic Mobility,LOGIC_L5D,LOGIC_L5D,LOGIC_L5D +Logic Mobility,LOGIC_L5M,LOGIC_L5M,LOGIC_L5M Logic Mobility,LOGIC_L60,LOGIC_L60,LOGIC L60 Logic Mobility,LOGIC_L65,LOGIC_L65,LOGIC L65 Logic Mobility,LOGIC_L66M,LOGIC_L66M,L66M Logic Mobility,LOGIC_L66M,LOGIC_L66M,LOGIC L66M +Logic Mobility,LOGIC_T10M,LOGIC_T10M,LOGIC T10M Logic Mobility,LOGIC_X40,LOGIC_X40,X40 Logic Mobility,LOGIC_X60G,LOGIC_X60G,LOGIC_X60G Logic Mobility,T10B,T10B,T10B @@ -19381,6 +20134,7 @@ Logic Mobility,X55_PLUS_B18,X55_PLUS,X55_PLUS Logic Mobility,X57A,LOGIC_X57A,LOGIC X57A Logic Mobility,X5A,LOGIC_X5A,LOGIC X5A Logic Mobility,l409,LOGIC_L40,LOGIC L40 +Logic_Controls,Elite_9550-A,Elite_9550-A,Elite_9550-A Logicom,B bot 50,BBOT50,B BOT 50 Logicom,B bot 550,BBOT550,B BOT 550 Logicom,C bot tab 100,CBotTab100,C Bot Tab 100 @@ -19391,9 +20145,11 @@ Logicom,E1052GP,E1052GP,E1052GP Logicom,E350,E350,E350 Logicom,E400,E400,E400 Logicom,E852GP,E852GP,E852GP +Logicom,Elio,Elio,Elio Logicom,FIVE,FIVE_EEA,FIVE Logicom,FLOW,FLOW_EEA,FLOW Logicom,Five Pro,Five_Pro,Five Pro +Logicom,Five Pro 32,Five_Pro_32,Five Pro 32 Logicom,ID bot 53,IDbot53,ID bot 53 Logicom,ID bot 553,IDbot553,IDbot553 Logicom,ID bot 553+,IDbot553PLUS,IDbot553PLUS @@ -19493,6 +20249,7 @@ Logicom,Le Hola,Le_Hola,Le_Hola Logicom,Le Hola FR,Le_Hola_FR,Le Hola FR Logicom,Le Hop,Logicom_LeHop,Le Hop Logicom,Le Lift,LeLift,Le Lift +Logicom,Le Link,Le_Link,Le Link Logicom,Le Must,LeMust,Le Must Logicom,Le Must 2,LeMust2,Le Must 2 Logicom,Le Omega,Le_Omega,Le Omega @@ -19543,11 +20300,15 @@ Logicom,SOLAR,SOLAR,SOLAR Logicom,Solar Pro,Solar_Pro,Solar Pro Logicom,TAB76,TAB76,TAB76 Logicom,TABLINK104,Tab_Link_104,Tab Link 104 +Logicom,TABXL_14,TABXL_14,Tab_XL_14 +Logicom,Tab_XL_14,Tab_XL_14,Tab_XL_14 Logicom,Touch Tablet CT730,CT730,CT730 Logicom,VRBOT552,VRBOT552,VR BOT 552 Logicom,VRBOT552PLUS,VRBOT552PLUS,VR BOT 552 PLUS Logicom,Volt-R,Volt-R,Volt-R +Logicom,WAVE 2s,WAVE_2s,WAVE 2s Logicom,Wave 2,Wave_2,Wave 2 +Logicom,Yuno,Yuno,Yuno Logicom,le Moov,LeMoov,LeMoov Logik,LOGIK,sadang,LOGIK 4K Android TV Logik,LOGIK,tabata,LOGIK 2K Android TV @@ -19563,6 +20324,9 @@ Lumigon,T2 HD,T2HD,T2HD Lumigon,T3,Lumigon_T3,Lumigon_T3 Lumitel,L9502,L9502,L9502 Lumitel,L9503,L9503,L9503 +Lunnen,TL42810L01,TL42810L01,TL42810L01 +Lunnen,TL4648S01,TL4648S01,TL4648S01 +Lunnen,TL62810G01,TL62810G01,TL62810G01 Lyf,LS-4004,LS-4004,LS-4004 Lyf,LS-4006,LS-4006,LYF_LS-4006 Lyf,LS-4503,LS-4503,LS-4503 @@ -19612,6 +20376,7 @@ M3 Mobile,M3 UL20X,M3UL20X,M3UL20X M3 Mobile,M3 US20W,M3US20W,M3US20W M3 Mobile,M3 US20X,M3US20X,M3US20X M3 Mobile,M3-SL10,M3-SL10,M3-SL10 +M3 Mobile,M3PC10,M3PC10,M3PC10 M3 Mobile,M3SL10,M3SL10,M3SL10 M3 Mobile,M3SL20K,M3SL20K,M3SL20K M3 Mobile,M3SM15N,M3SM15N,M3SM15N @@ -19621,6 +20386,7 @@ M3 Mobile,M3SM15X_EEA,M3SM15X,M3SM15X M3 Mobile,M3UL20F_EEA,M3UL20F,M3UL20F M3 Mobile,M3UL20W_EEA,M3UL20W,M3UL20W M3 Mobile,M3UL20X_EEA,M3UL20X,M3UL20X +M3 Mobile,M3US30,M3US30,M3US30 M4tel,M4 B1,M4_B1,M4_B1 M4tel,M4 B2,M4_B2,M4_B2 M4tel,M4 B3,M4_B3,M4_B3 @@ -19666,11 +20432,17 @@ MARVUE,M12,M12,M12 MARVUE,M15,M15,M15 MARVUE,M8,M8,M8 MARVUE,M81,M81,M81 +MARVUE,M8_Pro,M8_Pro,M8_Pro MARVUE,Pad_M10,Pad_M10,Pad_M10 MARVUE,Pad_M11_EEA,Pad_M11,Pad_M11 MARVUE,Pad_M11_EEA,Pad_M11_EEA,Pad_M11_EEA MASTERTECH,77-EV,77-EV,77-EV MASTERTECH,M2M-3T,M2M-3T,M2M-3T +MASTERTECH,R3,R3,R3 +MASTERTECH,R4,R4,R4 +MAXLEGEN,M621,M621,M621 +MAXLEGEN,M621-EEA,M621-EEA,M621-EEA +MAXRON,MXULTRA,MXULTRA,MXULTRA MAXX,Grand Prime,Grand_Prime,Grand Prime MAYA,P4,P4,P4 MAZE,Alpha,Alpha,Alpha @@ -19681,6 +20453,7 @@ MAZE,SSB-508E,SSB-508E,SSB-508E MAZE,SSB5518R,SSB5518R,SSB5518R MAZE,SSB558R,SSB558R,SSB558R MAZE,SSB700T,SSB700T,SSB700T +MBO(Aolixin),16A Pro,16A_Pro,16A_Pro MCTV,MCIFPD,rk3588_t,MCIFPD MDC Store,Grand,Grand,Grand MDC Store,M100,M100,M100 @@ -19703,11 +20476,12 @@ MEFERI,ME61,ME61,ME61 MEFERI,ME65,ME65,ME65 MEFERI,ME74,ME74,ME74 MEIZE,D105,D105,D105 -MEO(Portugal),AVATAR 3,VSB3918-MEO,MEOBox 4K (VSB3918) +MEIZE,D106,D106,D106 MEO(Portugal),MEO TV Box 4K,DV8555-MEO,MEO TV Box 4K MEO(Portugal),MEO TV Box 4K,DV8985-MEO,MEOBox 4K DV8985 MEO(Portugal),MEO TV Box 4K (DIW3930),DIW3930-MEO,MEO TV Box 4K (DIW3930) MEO(Portugal),MEOBox 4K,DIW3930-MEO,MEO TV Box 4K (DIW3930) +MEO(Portugal),MEOBox 4K VSB,VSB3918-MEO,MEOBox 4K (VSB3918) MEO(Portugal),MEOBox 4K v2,DIW377-MEO,MEO TV Box 4K (DIW377) METHOD_XI,KW_IWB,KW_RK3588,METHOD_XI_8600 MG Series,Any 302,TR10CS2_3,TR10CS2 @@ -19733,6 +20507,8 @@ MINDEO,MS8389,MS8389RU,MS8389 MINDEO,MS8589,MS8589,MS8589 MINDEO,MS8589_RU,MS8589RU,MS8589 MINIX,MINIX NEO T5,DV8553,DV8553 +MIRAI_TOUCH,IFP MIRAI TOUCH,PE3S_Series,PE3S_Series +MIRAI_TOUCH,MXXCE3XE,rk3588_t,MXXCE3XE MIRAY,Android TV,R1,ATV R1 MIRAY,Android TV,R2,ATV R2 MIRAY,MIDM_737,MIDM_737,MIDM_737 @@ -19740,10 +20516,13 @@ MIRAY,MIDM_F10,MIDM_F10,MIDM_F10 MIRAY,R3,R3,R3 MIRAY,R4,R4,R4 MIRAY,TM4G_1006,TM4G_1006,TM4G_1006 +MIRAY,TM4G_806,TM4G_806,TM4G_806 MIRAY,TPM4G_105,TPM4G_105,TPM4G_105 MIRAY,TPM4G_E108,TPM4G_E108,TPM4G_E108 MIRAY,TPM4G_E108_A,TPM4G_E108_A,TPM4G_E108 MIRAY,TPM4G_E9863,TPM4G_E9863,TPM4G_E9863 +MIRO,Miro A67,Miro_A67,Miro A67 +MIRO,Miro S67,Miro_S67,Miro S67 MITSUSHIBA,MITSUSHIBA,TP-10-0232P3G,TP-10-0232P3G MITSUSHIBA,TP-07-016,TP-07-016,TP-07-016 MJS,T2702,T2702,T2702 @@ -19869,6 +20648,7 @@ MTC,VINCENT,shilin,VINCENT 4K Android TV MTC,Vodafone Smart mini,Vodafone_875,MTC 970H MTC,WasabiMango,shilin,WasabiMango4KAndroidTV MTC,chile,S2000,S2000-Z0C11 +MTN,G56,G56,G56 MTN,S5012,S5012,S5012 MTN Group,5982C3,MTN-TBW5982C3,MTN-TBW5982C3 MTN Group,8978P,MTN-8978P,MTN-8978P @@ -19901,6 +20681,7 @@ MU (TH),3,3,3 MU (TH),8,8,8 MU (TH),mu 1,mu_1,1 MU (TH),mu6,mu6,mu6 +MUJENYZ,A9,A9,A9 MULTYNET,Pakistan,marina,MULTYNET 4K SMART TV MULTYNET,Pakistan,nagata,MULTYNET 2K SMART TV MULTYNET,Pakistan,tamachi,MULTYNET FHD Android TV @@ -19928,6 +20709,7 @@ MagentaTV,DV6067Y-T,DV6067Y_TVStick,DV6067Y-T MagentaTV,MagentaTV ONE,HY44G,MagentaTV ONE MagentaTV,OTT-G1,DV6067Y,OTT-G1 MagentaTV,One (2. Generation),SEI804DT,MagentaTV One (2. Generation) +MagneticNorth,Multiple_Applications_Display_Terminal,Multiple_Applications_Display_Terminal,P7 Majestic,JACK,JACK,JACK Majestic,JOE,JOE,JOE Majestic,MAJESTIC 2K Android TV,lasalle,MAJESTIC 2K Android TV @@ -19936,6 +20718,7 @@ Majestic,TAB 611 3G,TAB_611_3G,TAB 611 3G Majestic,TAB-714,TAB-714,TAB-714 Majestic,TAB-746,TAB-746,TAB-746 Majestic,TAB_711_4G,TAB_711_4G,TAB 711 4G +Majestic,TAB_720_PLUS,TAB_720_PLUS,TAB 720 PLUS Majestic,TAB_811_4G,TAB_811_4G,TAB_811_4G Majestic,TAB_812_4G,TAB_812_4G,TAB_812_4G Majestic,TAB_814,TAB_814,TAB_814 @@ -20037,6 +20820,8 @@ Masstel,Masstel_Juno_Q5,Masstel_Juno_Q5,Masstel_Juno_Q5 Masstel,Masstel_Tab10,Masstel_Tab10,Masstel Tab10 Masstel,Masstel_Tab10_4G,Masstel_Tab10_4G,Masstel_Tab10_4G Masstel,Masstel_Tab10_WiFi,Masstel_Tab10_WiFi,Masstel_Tab10_WiFi +Masstel,Masstel_Tab11_Pro_4G,Masstel_Tab11_Pro_4G,Masstel Tab 11 Pro 4G +Masstel,Masstel_Tab11_Pro_4G,Masstel_Tab11_Pro_4G,Masstel Tab11 Pro 4G Masstel,Masstel_Tab8_4G,Masstel_Tab8_4G,Masstel_Tab8_4G Masstel,Masstel_Tab8_Edu,Masstel_Tab8_Edu,Masstel Tab8 Edu Masstel,Masstel_Tab_10.1Pro,Masstel_Tab_101Pro,Tab 10.1Pro @@ -20123,6 +20908,7 @@ Maxwest,ASTRO A64,MX-A64,MX-A64 Maxwest,ASTRO A65,MX-A65,MX-A65 Maxwest,ASTRO_10,MX-A10WW,MX-A10 Maxwest,ASTRO_10_1,MX-AA10WW01,MX-A10 +Maxwest,ASTRO_10_A,MX-A10WW,MX-A10 Maxwest,ASTRO_8,MX-AA8WW01,MX-A8 Maxwest,ASTRO_8R,MX-A80RWW,MX-A8R Maxwest,ASTRO_A63,MX-A63,MX-A63 @@ -20149,6 +20935,7 @@ Maxwest,Astro_5X,Astro_5X,Astro 5X Maxwest,Astro 5T,Astro_5T,Astro 5T Maxwest,Astro 8Q,Astro_8Q,Astro 8Q Maxwest,GRAVITY G6,GRAVITY_G6,MX-GG6 +Maxwest,GRAVITY_G65,MX-GG65,MX-GG65 Maxwest,Gravity _55_ GO,Gravity_55_GO,Gravity_55_GO Maxwest,Gravity_5_GO,Gravity_5_GO,Gravity_5_GO Maxwest,Gravity_6P,Gravity_6P,Gravity_6P @@ -20162,6 +20949,7 @@ Maxwest,MX-N62,MX-NN62WW01,NITRO N62 Maxwest,MX-N63,MX-N63,MX-N63 Maxwest,Maxwest ASTRO_65T,MX-A65T,MX-A65T Maxwest,NITRO 55M,MX-N55MWW,MX-N55M +Maxwest,NITRO G55,MX-G55,NITRO_G55 Maxwest,NITRO N6,MX-NN6,NITRO N6 Maxwest,NITRO_55S,MX-N55S,MX-N55S Maxwest,Nitro 4N LTE,Nitro_4N_LTE,Nitro 4N LTE @@ -20194,6 +20982,7 @@ Maze_speed,M1582C,M1582C,M1582C Maze_speed,M1582C MAX,M1582C_MAX,M1582C_MAX Maze_speed,M1586K,M1586K,M1586K Maze_speed,M1587K,M1587K,M1587K +Maze_speed,M65,M65P,M65P Maze_speed,MS5314G,MS5314G,MS5314G Maze_speed,MS5414G,MS5414G,MS5414G Maze_speed,MS5424G,MS5424G,MS5424G @@ -20202,6 +20991,7 @@ Maze_speed,MS5524G,MS5524G,MS5524G Maze_speed,MS5528G,MS5528G,MS5528G Maze_speed,MS5539G,MS5539G,MS5539G Maze_speed,MS5614G,MS5614G,MS5614G +Maze_speed,MS650G,MS650G,MS650G Maze_speed,SM4T,SM4T,SM4T Maze_speed,SSB1000T,SSB1000T,SSB1000T Maze_speed,SSB1001T,SSB1001T,SSB1001T @@ -20227,7 +21017,9 @@ MeanIT,meanIT_X6,meanIT_X6,meanIT_X6 Meberry,M6,M6,M6 Meberry,M7,M7,M7 Meberry,M7Pro,M7Pro,M7Pro +Meberry,M7_EEA,M7_EEA,M7_EEA Meberry,M7_M,M7_M,M7_M +Meberry,M7_US,M7_US,M7_US Meberry,M8_EEA,M8_EEA,M8 Mecer,101P51C,101P51C,101P51C Mecer,101P51D,101P51D,101P51D @@ -20264,6 +21056,7 @@ Mecool,KM2 PLUS,YYC,4K Android TV Box Mecool,KM3,KM3,KM3 Mecool,KM6,KM6,KM6 Mecool,KM7,KM7,KM7 +Mecool,KM7 PLUS,YDA,4K Google TV Box Mecool,KM8,KM8,KM8 Mecool,KM9PRO,KM9PRO,KM9PRO Mecool,KT1,KT1,KT1 @@ -20289,6 +21082,7 @@ Mediacom,8AY,8AY,8AY Mediacom,8BY_EEA,8BY,8BY Mediacom,8CY,8CY,8CY Mediacom,8DY,M-SP8DY_EEA,8DY +Mediacom,AZIMUT_4,AZIMUT_4,AZIMUT_4 Mediacom,G5M,M-PPxG5M,M-PPxG5M Mediacom,M-PPAG4,M-PPAG4,M-PPAG4 Mediacom,M-PPxG4P,G4P,M-PPxG4P @@ -20301,6 +21095,7 @@ Mediacom,M-PPxS6P,M-PPxS6P,M-PPxS6P Mediacom,M-PPxS7,M-PPxS7,M-PPxS7 Mediacom,M-PPxS7P,M-PPxS7P,M-PPxS7P Mediacom,M-SP10HXxH,M-SP10HXxH,M-SP10HXxH +Mediacom,M-SP10KID,M-SP10KID,SmartKid10 Mediacom,M-SP10MXHA,SmartPad,M-SP10MXHA Mediacom,M-SP10MXHL,M-SP10MXHL,M-SP10MXHL Mediacom,M-SP1AGO3G,M-SP1AGO3G,M-SP1AGO3G @@ -20314,8 +21109,12 @@ Mediacom,M-SP1X10,M-SP1X10,X10 Mediacom,M-SP7HXAH,M-SP7HXAH,M-SP7HXAH Mediacom,M-SP7xGO3G,M-SP7xGO3G,M-SP7xGO3G Mediacom,M-SP8EY,M-SP8EY,8EY +Mediacom,M-SP8GY,M-SP8GY,SmartPad iyo8 Mediacom,M-SP8HXAH,M-SP8HXAH,M-SP8HXAH +Mediacom,M-SP8KID,M-SP8KID,M-SP8KID Mediacom,M-SP8MXA,SP8MXA,M-SP8MXA +Mediacom,SP1AZ4_L,SP1AZ4_L,AZIMUT_4_LITE +Mediacom,SP1AZ4_P,SP1AZ4_P,AZIMUT_4_PRO Medion,E1050X,E1050X,E1050X Medion,E1051X,E1051X,E1051X Medion,E1090X,E1090X,LIFETAB E1090X @@ -20403,6 +21202,7 @@ Megacable,Mexico,B826C-A12_ZTE,B826C-A12 Megacable,Mexico,B866V2_ZTE,Xview+ Megacable,OTT Xview+ AV1,B866V2F,OTT Xview+ AV1 Megacable,XView+,ucw4046meg,Xview+ +Megacable,XView+,uiw4059meg,XView+ Megahouse,CP-D403,CP-D403,CP-D403 Meiigoo,S8,MEIIGOO_S8,S8 Meiigoo,S9,S9,S9 @@ -20450,6 +21250,7 @@ Meizu,MEIZU 18s,meizu18s,MEIZU 18s Meizu,MEIZU 18s Pro,meizu18sPro,MEIZU 18s Pro Meizu,MEIZU 20 Inf,meizu20Inf,MEIZU 20 Inf Meizu,MEIZU 20 Inf.sat,meizu20Infsat,MEIZU 20 Inf.sat +Meizu,MEIZU 21 Note,Meizu21Note,MEIZU 21 Note Meizu,Meizu 6T,Meizu6T,Meizu 6T Meizu,Meizu S6,MeizuS6,M712C Meizu,Meizu S6,MeizuS6,Meizu S6 @@ -20486,6 +21287,7 @@ Memorex,MTAB-08530A,MTAB-08530A,MTAB-08530A Memorex,MTAB-09541AB,MTAB-09541AB,MTAB-09541AB MengalTab,ANZATECH,Mengaltab_Echague_anzatech,ANZATECH Mengdash,M_Q58_EEA,M_Q58_EEA,M_Q58EEA +Meswao,MES-B3,MES-B3,MES-B3 Metro,E2,E2,E2 Metro,Pro5,Pro5,Pro5 Mgt electric,Lumyai,Lumyai,Lumyai @@ -20504,6 +21306,7 @@ MiTAC,hera_pro_eea,hera_pro,N672 MiTAC,phaeton,phaeton,N722 MicroTouch,IDC_Series,IDC_Series,IDC_Series MicroTouch,M1_IC0_N702,MACH_10,MACH_10 +MicroTouch,M1_IC0_N702_MP,MACH_MP,MACH_MP MicroTouch,M1_IC1_N700_4G,IDC_Series_4G,IDC_Series_4G Micromax,32CAM6SHD,ikebukuro,AI PONT Micromax,A110,s9081,Micromax A110 @@ -20795,6 +21598,7 @@ MiiA,MiiA,TA10CA1_2,TA10CA1 Mikona,MFHD_BT1067QC16IPS2,MFHD_BT1067QC16IPS2,MFHD_BT1067QC16IPS2 Mikona,MHDBT10267,MHDBT10267,MHDBT10267 Mikona,MIKONA,MSW_BT767QC8TN,MSW_BT767QC8TN +Mimio,MimioPro-G XX5,rk3588_t,MimioProG5 Minister,Android TV,R1,ATV R1 Minister,Android TV,R2,ATV R2 Mint,Clover,M4CR,M4CR @@ -20820,6 +21624,7 @@ Mint,Orion_DS,Orion_DS,Orion_DS Mint,Pearl_Neo,Pearl_Neo,Pearl_Neo Mint,ULTRAMINTT_X5,ULTRAMINTT_X5,ULTRAMINTT X5 Mintt,A1,A1,A1 +Mintt,COOLMINTT NIU,COOLMINTT_NIU,COOLMINTT NIU Mintt,COOLMINTT_X7,COOLMINTT_X7,COOLMINTT X7 Mintt,CoolMintt Rival,CoolMintt_Rival,CoolMintt Rival Mintt,CoolMinttA3,CoolMinttA3,CoolMinttA3 @@ -20835,10 +21640,12 @@ Mintt,FRESHMINTTA7,FRESHMINTTA7,FRESHMINTTA7 Mintt,M1,M1,M1 Mintt,MINTT-DIGI,MINTT-DIGI,MINTT-DIGI Mintt,MINTT_DIGI_2,MINTT_DIGI_2,Mintt__Digi__2 +Mintt,MINTT_T11,MINTT_T11,MINTT_T11 Mintt,MinttM3,Mintt_M3,Mintt M3 Mintt,MinttM3,Mintt_M3,Mintt__M3 Mintt,MinttPoro,MinttPoro,MinttPoro Mintt,Mintt_Tab_T1,Mintt_Tab_T1,Mintt_Tab_T1 +Mintt,T3,T3,T3 Mintt,ULTRAMINTT A5,ULTRAMINTT_A5,ULTRAMINTT A5 Mintt,ULTRAMINTT Y3,ULTRAMINTT_Y3,ULTRAMINTT Y3 Mintt,ULTRAMINTT Y5,ULTRAMINTT_Y5,ULTRAMINTT Y5 @@ -20854,6 +21661,7 @@ Mio Tab,MI106,MI106,MI106 Mio Tab,MI706,MI706,MI706 Mio Tab,MI86,MI86,MI86 Mio Tab,MP0101632,MP0101632,MP0101632 +Mio Tab,MP0101788,MP0101788,MP0101788 Mio Tab,MioTab,MioTab2016,MioTab 2016 Mio Tab,MioTab MP0101635,MP0101635,MP0101635 Mio Tab,MioTab2017,MioTab2017,MioTab2017 @@ -20921,15 +21729,32 @@ MobiIoT,MobiGo,WM19,WM19 MobiIoT,MobiGo 2+,MobiGo2P,MobiGo2P MobiIoT,MobiGo 2+,MobiGo2PQV,MobiGo2P MobiIoT,MobiGo 2+ Pro,MobiGo2PP,MobiGo2PP +MobiIoT,MobiPrint 5,MP5,MP5 MobiIoT,MobiPrint4_Plus,MobiPrint4_Plus,MobiPrint4_Plus MobiIoT,Mobigo2,MobiGo2,MobiGo2 MobiIoT,Mobigo2L,MobiGo2L,MobiGo2L +MobiOcean,MO-T3,MO-T3,MO-T3 MobiOcean,MOT102,MOT102,MOT102 +MobiVista,MVT_1001,MVT_1001,MVT-1001 +MobiVista,MVT_1001,MVT_1001,MVT_1001 MobiVista,VisioTab_10,VisioTab_10,VisioTab 10 +Mobicel,F40,F40,F40 +Mobicel,F41,F41,F41 +Mobicel,F50,F50,F50 Mobicel,IX PLUS,IX_PLUS,IX_PLUS +Mobicel,MX3 PLUS,MX3_PLUS,MX3 PLUS +Mobicel,Mercury,Mercury,Mercury +Mobicel,MiPAD,MiPAD,MiPAD +Mobicel,Mobicel Mercury,Mobicel_Mercury,Mobicel Mercury +Mobicel,P11,P11,P11 +Mobicel,P12,P12,P12 Mobicel,P5,P5,P5 Mobicel,RX,RX,RX +Mobicel,Smart Tab 10 4G,Smart_Tab_10,Smart Tab 10 4G Mobicel,VX21,VX21,VX21 +Mobicel,Vodacom Smart Tab 8,Smart_Tab_8,Vodacom Smart Tab 8 +Mobicel,X6,X6,X6 +Mobicel,Z4,Z4,Z4 Mobicell,4U,4U,4U Mobicell,ARC,ARC,ARC Mobicell,ASTRO,ASTRO,ASTRO @@ -21140,7 +21965,9 @@ Mobiwire,ALTICE S35,S35,S35 Mobiwire,Ahiga,Ahiga,Ahiga Mobiwire,Airtel Imagine,H5032U,Airtel Imagine Mobiwire,Altice E55,E55,E55 +Mobiwire,Awadjidjè,H5111,Awadjidje Mobiwire,Benin,H6681_Pro,Moov Smart Pro +Mobiwire,Celtiis Smart 1,H5032U,Smart 1 Mobiwire,Chenoa,Chenoa,Chenoa Mobiwire,Cygnus,Cygnus45,Cygnus Mobiwire,Cygnus,Cygnus45,Cygnus45 @@ -21148,9 +21975,14 @@ Mobiwire,Cygnus mini,Cygnus_mini,Cygnus mini Mobiwire,Cygnus mini,Cygnus_mini,Cygnus_mini Mobiwire,H,Halona,Halona Mobiwire,H5111,H5111,H5111 +Mobiwire,H5111,H5111,Kicka 6 Plus 4G +Mobiwire,H5111L,H5111L,H5111L +Mobiwire,H5111L,H5111L,IKOSORA+ +Mobiwire,H5111L_common,H5111L,H5111L_MTN Mobiwire,H5112,H5112,H5112 Mobiwire,H6511,H6511,H6511 Mobiwire,H6682,H6682,H6682 +Mobiwire,H6682_VDC_TZ,H6682,H6682_VDC_TZ Mobiwire,H6821,H6821,H6821 Mobiwire,HALONA,Halona,Halona Mobiwire,Hawk from EE,Hawk_from_EE,Hawk_from_EE @@ -21187,6 +22019,7 @@ Mobiwire,STARXTREM 5,STARXTREM5,STARXTREM5 Mobiwire,Smart C11,Kicka_5_U,Smart C11 Mobiwire,Smart E11,Smart_E11,SmartE11 Mobiwire,Smart E11,Smart_E11_1,SmartE11 +Mobiwire,Smart E25,Smart_E25,Smart E25 Mobiwire,Smart Green,MobiWire_Verda,Smart_Green Mobiwire,Smart Green,MobiWire_Verda,Vodafone Lite 4G Mobiwire,Smart N11,Smart_N11,SmartN11 @@ -21207,6 +22040,7 @@ Mobiwire,Verda,MobiWire_Verda,Verda Mobiwire,Vodafone Lite 4G,MobiWire_Verda,Vodafone Lite 4G Mobiwire,Vodafone Pro 4G,Vodafone_Pro,Vodafone Pro 4G Mobiwire,Vodafone Smart 4G,Vodafone_Smart,Vodafone Smart 4G +Mobiwire,Éɖjròmi,Edjromi,Edjromi Mobvoi,TicWatch C2,skipjack,TicWatch C2 Mobvoi,TicWatch C2,skipjack,TicWatch C2+ Mobvoi,TicWatch E2/S2,tunny,TicWatch E2 @@ -21223,7 +22057,7 @@ Mobvoi,TicWatch Pro 3 GPS; TicWatch Pro 3 Ultra GPS,rubyfish,TicWatch Pro 3 GPS Mobvoi,TicWatch Pro 3 GPS; TicWatch Pro 3 Ultra GPS,rubyfish,TicWatch Pro 3 Ultra GPS Mobvoi,TicWatch Pro 3 GPS; TicWatch Pro 3 Ultra GPS,rubyfish,TicWatch Pro 3U Mobvoi,TicWatch Pro 4G,catshark,TicWatch Pro 4G -Mobvoi,TicWatch Pro 5,dace,TicWatch Pro 5 +Mobvoi,TicWatch Pro 5;TicWatch Pro 5 Enduro,dace,TicWatch Pro 5 Mobvoi,Ticwatch Pro 4G,catshark,TicWatch Pro 4G Mobvoi,Ticwatch S Smartwatch; Ticwatch E Smartwatch,mooneye,Ticwatch E Mobvoi,Ticwatch S Smartwatch; Ticwatch E Smartwatch,mooneye,Ticwatch S @@ -21437,6 +22271,7 @@ Motorola,Lenovo K15,hawaii,Hawaii Motorola,Lenovo K15,hawaii,Lenovo K15 Motorola,Lenovo XT2081-4,guam,Lenovo XT2081-4 Motorola,Lenovo XT2091-7,cebu,Lenovo XT2091-7 +Motorola,MOTOROLA,mountbaker,MOTOROLA GOOGLE TV 2K Motorola,MOTOROLA,stanford,2K SMART TV Motorola,MOTOROLA,stanford,SMART TV Motorola,MOTOROLA,stanford,Smart FHD TV @@ -21667,6 +22502,7 @@ Motorola,Razr V,umts_yangtze,XT885 Motorola,Razr V,umts_yangtze,XT886 Motorola,Smart TV,longshan,AI PONT Motorola,Spice,sesame,XT300 +Motorola,ThinkPhone 25 by motorola,vienna,ThinkPhone 25 by motorola Motorola,ThinkPhone by Motorola,bronco,ThinkPhone by motorola Motorola,ThinkPhone by Motorola,bronco,motorola edge 30 pro Motorola,XOOM,stingray,Xoom @@ -21781,6 +22617,8 @@ Motorola,moto g stylus 5G (2022),milanf,moto g stylus 5G (2022) Motorola,moto g stylus 5G (2022),milanf,moto g(50) Motorola,moto g stylus 5G - 2023,genevn,moto g stylus 5G - 2023 Motorola,moto g stylus 5G - 2023,genevn,moto g stylus 5g +Motorola,moto g stylus 5G - 2024,boston,moto g stylus 5G - 2023 +Motorola,moto g stylus 5G - 2024,boston,moto g stylus 5G - 2024 Motorola,moto g(10),capri,moto e(7) plus Motorola,moto g(10),capri,moto g(10) Motorola,moto g(100),nio,moto g(100) @@ -21850,6 +22688,8 @@ Motorola,moto g200 5G,xpeng,motorola edge 20 pro Motorola,moto g22,hawaiip,Lenovo K15 Plus Motorola,moto g22,hawaiip,moto g22 Motorola,moto g23,penangf,moto g23 +Motorola,moto g24,fogorow,moto g24 +Motorola,moto g24 power,fogorow,moto g24 power Motorola,moto g31,cofud,moto g31(w) Motorola,moto g31,cofud,motorola Motorola,moto g31,coful,moto g31 @@ -21859,11 +22699,14 @@ Motorola,moto g32,devon,moto g32 Motorola,moto g34,fogos,XT2363-4 Motorola,moto g34 5G,fogos,moto g34 5G Motorola,moto g34 5G,fogos,moto g53 5G +Motorola,moto g35 5G,manila,moto g35 5G Motorola,moto g40 fusion,hanoip,moto g(40) fusion Motorola,moto g41,corfu,moto g41 Motorola,moto g41,corfu,motorola Motorola,moto g42,hawao,moto g(100) Motorola,moto g42,hawao,moto g42 +Motorola,moto g45 5G,fogos,moto g34 5GP +Motorola,moto g45 5G,fogos,moto g45 5G Motorola,moto g51,cypfq,XT2171-3 Motorola,moto g51,cypfq,moto[SPACE]g(50) Motorola,moto g51 5G,cypfq,moto g(50) @@ -21880,6 +22723,8 @@ Motorola,moto g53y 5G,penang,moto g53y 5G Motorola,moto g54 5G,cancunf,XT2343-3 Motorola,moto g54 5G,cancunf,moto g54 5G Motorola,moto g54 5G,cancunf,moto g73 5G +Motorola,moto g55 5G,taipei,moto g54 5G +Motorola,moto g55 5G,taipei,moto g55 5G Motorola,moto g6 play,jeter,Moto G Play Motorola,moto g6 play,jeter,moto g(6) play Motorola,moto g62 5G,rhodec,moto g51 5G @@ -21888,22 +22733,28 @@ Motorola,moto g62 5G,rhodei,moto g62 5G Motorola,moto g62 5G,rhodei,moto g71 5G Motorola,moto g64 5G,cancunf,moto g54 5G Motorola,moto g64 5G,cancunf,moto g64 5G +Motorola,moto g64y 5G,cancunf,moto g54 5G +Motorola,moto g64y 5G,cancunf,moto g64y 5G Motorola,moto g71 5G,corfur,moto g(50) Motorola,moto g71 5G,corfur,moto g71 5G Motorola,moto g72,vicky,moto g(50) 5G Motorola,moto g72,vicky,moto g72 Motorola,moto g73 5G,devonf,moto g(50) 5G Motorola,moto g73 5G,devonf,moto g73 5G +Motorola,moto g75 5G,sorap,moto g75 5G Motorola,moto g82 5G,rhodep,XT2169-2 Motorola,moto g82 5G,rhodep,XT2225-2 Motorola,moto g82 5G,rhodep,moto g71 5G Motorola,moto g82 5G,rhodep,moto g82 5G Motorola,moto g84 5G,bangkk,moto g53 5G Motorola,moto g84 5G,bangkk,moto g84 5G +Motorola,moto g85 5G,malmo,moto g85 5G +Motorola,moto g85 5G,malmo,motorola edge 40 pro Motorola,moto p30,robusta,XT1943-1 Motorola,moto p30 play,deen,XT1941-2 Motorola,moto razr 40,lynkco,XT2323-3 Motorola,moto razr 40 Ultra,zeekr,XT2321-2 +Motorola,moto razr 50,arcfox,XT2451-4 Motorola,moto tab g20,mototabg20,moto tab g20 Motorola,moto z3 play,beckham,Moto Z3 Play Motorola,moto z4,foles,Moto Z3 Play @@ -21924,6 +22775,8 @@ Motorola,motorola edge 20 pro,pstar,moto g(100) Motorola,motorola edge 20 pro,pstar,motorola edge 20 pro Motorola,motorola edge 2023,aion,motorola edge (2022) Motorola,motorola edge 2023,aion,motorola edge 2023 +Motorola,motorola edge 2024,avatrn,motorola edge 2023 +Motorola,motorola edge 2024,avatrn,motorola edge 2024 Motorola,motorola edge 30,dubai,moto g200 5G Motorola,motorola edge 30,dubai,motorola edge 30 Motorola,motorola edge 30 fusion,tundra,moto g200 5G @@ -21940,6 +22793,13 @@ Motorola,motorola edge 40 neo,manaus,motorola edge (2022) Motorola,motorola edge 40 neo,manaus,motorola edge 40 neo Motorola,motorola edge 40 pro,rtwo,motorola edge 30 pro Motorola,motorola edge 40 pro,rtwo,motorola edge 40 pro +Motorola,motorola edge 50,tank,motorola edge 50 +Motorola,motorola edge 50,tank,motorola razr 40 +Motorola,motorola edge 50 fusion,cusco,moto g stylus 5G - 2023 +Motorola,motorola edge 50 fusion,cusco,motorola edge 50 fusion +Motorola,motorola edge 50 fusion,cuscoi,moto g stylus 5G - 2023 +Motorola,motorola edge 50 fusion,cuscoi,motorola edge 50 fusion +Motorola,motorola edge 50 neo,vienna,motorola edge 50 neo Motorola,motorola edge 50 pro,eqe,motorola edge 40 pro Motorola,motorola edge 50 pro,eqe,motorola edge 50 pro Motorola,motorola edge 50 ultra,ctwo,motorola edge 40 pro @@ -21984,14 +22844,23 @@ Motorola,motorola razr 2022,oneli,motorola edge 30 pro Motorola,motorola razr 2022,oneli,motorola razr 2022 Motorola,motorola razr 2023,lynkco,motorola razr 2022 Motorola,motorola razr 2023,lynkco,motorola razr 2023 +Motorola,motorola razr 2024,aito,motorola razr 2023 +Motorola,motorola razr 2024,aito,motorola razr 2024 Motorola,motorola razr 40,lynkco,motorola razr 2022 Motorola,motorola razr 40,lynkco,motorola razr 40 Motorola,motorola razr 40 ultra,zeekr,motorola razr 2022 Motorola,motorola razr 40 ultra,zeekr,motorola razr 40 ultra Motorola,motorola razr 40s,lynkco,motorola razr 40s +Motorola,motorola razr 50,aito,XT2453-2 +Motorola,motorola razr 50,aito,motorola razr 40 +Motorola,motorola razr 50,aito,motorola razr 50 +Motorola,motorola razr 50 ultra,arcfox,motorola razr 40 ultra +Motorola,motorola razr 50 ultra,arcfox,motorola razr 50 ultra Motorola,motorola razr 5G,smith,motorola razr 5G Motorola,motorola razr plus 2023,zeekr,motorola razr 2022 Motorola,motorola razr plus 2023,zeekr,motorola razr plus 2023 +Motorola,motorola razr plus 2024,arcfox,motorola razr plus 2023 +Motorola,motorola razr plus 2024,arcfox,motorola razr plus 2024 Motorola Solutions,EVOLVE,EVOLVE,EVOLVE Motorola Solutions,LEX F10,LEXF10,LEX F10 Motorola Solutions,LEX L10g,lexl10g,LEX L10g @@ -22068,6 +22937,7 @@ Movitel,Movitel_M9104,Movitel_M9104,Movitel_M9104 Movix,Movix,MVX01,Movix Movix,Movix Go,MVX02,Movix Go Movix,Movix Pro,MVX03,Movix Pro +Moxee,m2467,m2467,m2467 Moxee Technologies,MH-T6000,MH-T6000,MH-T6000 Moxee Technologies,MT-T800,MT-T800,MT-T800 Moxee Technologies,MT-T8B22,MT-T8B22,MT-T8B22 @@ -22084,6 +22954,7 @@ Mpgio,LEGEND_R,LEGEND_R,LEGEND_R Mpgio,LEGEND_R_PLUS,LEGEND_R_PLUS,LEGEND_R_PLUS Mpgio,Legend_A,Legend_A,Legend_A Mpgio,MAT10221,MAT10221,MAT10221 +Mpgio,MAT10421,MAT10421,MAT10421 Mpgio,MAT80211B,MAT80211B,MAT80211B Mpgio,MLT703824,MLT703824,MLT703824 Mpgio,MPGIO_10,MPGIO_10,MPGIO-10 @@ -22132,6 +23003,7 @@ Multilaser,M10 4G NOVA,ML_SO1C_M10_4G_NOVA,M10_4G_NOVA Multilaser,M10 4G PRO,ML_JI0B_M10_4G_PRO,M10_4G_PRO Multilaser,M10 4G PRO,ML_JI0F_M10_4G_PRO,M10_4G_PRO Multilaser,M10 4G PRO,ML_SO1G_M10_4G_PRO,M10_4G_PRO +Multilaser,M10 4G T1,ML_SO5C_M10_4G_T1,M10_4G_T1 Multilaser,M10 4G T3,ML-WI1C-M10-4G-T3,M10-4G-T3 Multilaser,M10 4G TERE,ML_JI0B_M10_4G_TERE,M10_4G_TERESOPOLIS Multilaser,M10 4G TERESOPOLIS,ML_SO0G_M10_4G_T,M10_4G_TERESOPOLIS @@ -22211,6 +23083,7 @@ Multilaser,M8_4G,ML_SO19_M8_4G,M8_4G Multilaser,M8_4G_T1,ML_SO2J_M8_4G_T1,M8_4G_T1 Multilaser,M9 3G,ML-WI16-M9_3G,M9_3G Multilaser,M9 WIFI,ML_JI0E_M9_WIFI,M9_WIFI +Multilaser,M9 WIFI,ML_SO0W_M9_WIFI,M9_WIFI Multilaser,M9 Wifi,ML_SO08_M9_Wifi,M9_Wifi Multilaser,M9-3G,M9-3G,M9-3G Multilaser,M9-3G,ML-JI05-M9-3G,M9-3G @@ -22290,6 +23163,7 @@ Multilaser,Oba Conecta 4G,Oba_Conecta_4G,Oba_Conecta_4G Multilaser,Sikur,Multilaser_GMax_2_Sikur,Multilaser_GMax_2_Sikur Multilaser,U10,ML_SO0K_U10_MTK,U10 Multilaser,ULTRA 10,ML_SO0C_ULTRA_10,ULTRA_10 +Mundo,Chile,S3001,MundoGoTV MwalimuPlus,MP01A3G,MP01A3G,MP01A3G My,Android TV,shandao,Android TV My,Android TV,tokyo,Android TV @@ -22339,6 +23213,7 @@ MyPhone (PL),myPhone_City_2,myPhone_City_2,myPhone_City_2 MyPhone (PL),myPhone_Fun5,myPhone_Fun5,Fun5 MyPhone (PL),myPhone_Power,myPhone_Power,Power MyPhone (PL),myPhone_Prime_2,myPhone_Prime_2,Prime 2 +MyRepublic,B866V2FA V3.3,B866V2FAV3,B866V2FA V3.3 MyTab_pro,My-10-13-1,MyTab_Pro_13,My-10-13-1 MyanmarNet,TVie 1B,SEI140FT,TVie 1B Myphone,CITY XL,myPhone_CityXL,CityXL @@ -22449,6 +23324,7 @@ Myphone,myXI1,myXI1,myXI1 Myphone,myXI1 Plus,myXI1_Plus,myXI1 Plus Myphone,myXI1 Pro,myXI1_Pro,myXI1 Pro Myphone,myXI3,myXI3,myXI3 +Myphone,myphone_N23_5G_EEA,MS2303x,myphone N23 5G Myphone,neocore_E1R1,neocore_E1R1,neocore_E1R1 Myria,3G MY8300,3G_MY8300,3G Myria,Classic MY8301,Classic_MY8301,Classic @@ -22473,7 +23349,16 @@ Mystic,R3,R3,R3 Mystic,R4,R4,R4 Mytron,Pad_60,Pad_60,Pad_60 N-one,NpadAir,NpadAir,NpadAir +N-one,NpadQ,NpadQ,NpadQ N-one,NpadS,NpadS,NpadS +N-one,NpadS1,NpadS1,Npad S1 +N-one,NpadSE,NpadSE,NpadSE +N-one,NpadY,NpadY,Npad Y1 +N-one,NpadY,NpadY,NpadY +N-one,NpadY1,NpadY1,NpadY1 +N-one,Npad_mini,Npad_mini,TAB011 +N-one,Npad_ultra,Npad_ultra,TAB012 +N-one,Npadplus,Npadplus,Npadplus NAGU,R1,NAGU_R1,R1 NASCO,Allure_Plus,NASCO_Allure_Plus,NASCO_Allure_Plus NASCO,CANDY2,CANDY2,CANDY2 @@ -22599,6 +23484,7 @@ NELATECH,V22S1,V22S1,V22S NELATECH,X1,X1_Pro,X1 NEO,GF214-NEO,GF214-NEO,GF214-NEO NEO,GF215-REY,GF214-NEO,GF215-REY +NEON,Neon Tab 11,Neon_Tab_11,Neon Tab 11 NEONIQ,NQT-1013GIQ,NQT-1013GIQ,NQT-1013GIQ NEONIQ,NQT-1014GIQ,NQT-1014GIQ,NQT-1014GIQ NEONIQ,NQT-1014GIQA,NQT-1014GIQA,NQT-1014GIQA @@ -22607,6 +23493,7 @@ NEONIQ,NQT-73GIQ11,NQT-73GIQ11,NQT-73GIQ11 NEONIQ,NQT_7W,NQT-7W,NQT-7W NESO,N810 i7,N810_i7_1,N810 i7 NETGREEN,H10,H10,H10 +NETGREEN,M11QF8,M11QF8,M11QF8 NETGREEN,M15QF6,M15QF6,M15QF6 NETGREEN,M15QF6AR,M15QF6AR,M15QF6AR NETGREEN,M16QF9AR,M16QF9AR,M16QF9AR @@ -22614,6 +23501,7 @@ NETGREEN,M16QF9ES,M16QF9ES,M16QF9ES NETGREEN,MW75QF6,MW75QF6,MW75QF6 NETOGY,NOVA,YXU,NOVA NETTV,NETTV,SEI500NTV,NETTV +NEWPOS,NEW9310Pro,NEW9310Pro,NEW9310Pro NEWSUN,S13,S13,S13 NEWSUN,S20,S20,S20 NEWSUN,S9,S9,S9 @@ -22675,6 +23563,7 @@ NOA Mobile,SPRINT 4G,SPRINT4G,SPRINT4G NOA Mobile,SparkSE,SparkSE,SparkSE NOA Mobile,Vivo 4G_r,Vivo4G_r,Vivo 4G_r NOGA,NOGA101GHD,NOGA101GHD,NOGAPAD101GHD +NOGA,NOGA7,NOGAPAD7G,NOGAPAD7G NOGA,NOGA7G,NOGA7G,NOGAPAD7G NOGA,NOGAPAD101GHD,NOGAPAD101GHD,NOGAPAD101GHD NOGA,NOGAPAD101XTREME,NOGAPAD101XTREME,NOGAPAD101XTREME @@ -22683,6 +23572,7 @@ NOVATAB,T10,NOVAT-10,NOVAT-10 NOVOJOY,NV10,NV10,NV10 NOWO,DV 8535 4K,DV8535-KPN,DV 8535 4K NOWO,DV 8935 X4,DV8935-KPN,DV 8935 X4 +NSDEVIL,ET1095A,ET1095A,ET1095A NSPRE,NX-20PRO1,NX-20PRO1,NX-20PRO1 NURIBOM,NRB-IFPD,rk3588_t,MP_Series NVIDIA,SHIELD Android TV,foster,SHIELD Android TV @@ -22733,6 +23623,7 @@ Nabi,DreamTab HD8 Tablet,t8400n,DMTAB-NV08B Nabi,Fisher Price Learning Tablet,NBFP07PMKG,NBFP07PMKG Nabi,Hot Wheels Tablet,NBTY07SMKG,NBTY07SMKG Nabi,TOY 7,NBTY07SMKG,NBTY07SMKG +Nakamichi,Nakamichi NA3615,NA3615,NA3615 Nanho,F101,F101,F101 Nano,4K Smart TV,gangbyeon,nano 4K AI Smart TV Nano,EU、UK、AP,martin,Nano Android TV @@ -22766,6 +23657,7 @@ Navitel,T505PRO,T505PRO,T505PRO Navitel,T700_3G_Pro,T700_3G_Pro,NAVITEL T700 3G PRO Navitel,T707_3G,T707_3G,NAVITEL T707 3G Navitel,T737PRO,T737PRO,T737PRO +Navitel,T787-4G,T787-4G,T787-4G Navon,D455,D455,D455 Navon,D504,D504,D504 Navon,F552,F552,NAVON F552 @@ -22890,6 +23782,7 @@ Netmak,NM_PADPRO,NM_PADPRO,NM_PADPRO Neusoft,S611,S611,S611 New Balance,Run IQ,shasta,NB RunIQ NewBridge,NBTB101,NBTB101,NBTB101 +NewBridge,NBTB101b,NBTB101b,NBTB101 NewBridge,NBTB102,NBTB102,NBTB102 Newal,Newal 2K SMART TV,nagata,Newal 2K SMART TV Newal,Newal 4K SMART TV,marina,Newal 4K SMART TV @@ -22917,6 +23810,7 @@ Newland,Newland NLS-NQuire,NLS-NQuire,NLS-NQuire Newline,23QA,velvet,LGA311D2 Newline,Q23,rk3588_t,Q23 Newline,WB55860W,WB55860W,WB55860W +Newline,Z Pro Series,Z24,24ZPro Newsday,A1,Newsday_A1,Newsday_A1 Newsday,A2,Newsday_A2,Newsday_A2 Newsday,E1,Newsday_E1,Newsday_E1 @@ -22926,6 +23820,7 @@ Nexian,journey one,Mi438S_sprout,Mi438S Next,4K TV Stick,YYT,4K Google TV Stick Next,NEXT,stanford,2K SMART TV Next,NEXT,zhongshan,4K SMART TV +Next,Start-4K,YDA,4K Google TV Box Next Learning,Nexttab N3,N3,N3 Next Technologies,GO7BSC,GO7BSC,GO7BSC Next Technologies,N7526,N7526,N7526 @@ -22952,6 +23847,7 @@ Nextel,V.35,up11_vsn_h1_single,Nextel V.35 Nextel,V.45,H26-VSN,NII Nextel Nextel,V.45,H26-VSN,V.45 Nextgear,Nextgear n1,Nextgear_n1,Nextgear n1 +Nextlife,T8metal,T8metal,T8metal Nexvoo,NexFone N380,N380,N380 Nexvoo,NexFone N380,N380_EEA,N380_EEA Nikkei,Android TV,longshan,AI PONT @@ -23115,6 +24011,7 @@ Nokia,Nokia C22,HKEA,Nokia C22 Nokia,Nokia C3,GMR,Nokia C3 Nokia,Nokia C30,MNI,Nokia C30 Nokia,Nokia C30,MNR,Nokia C30 +Nokia,Nokia C300,ORO,Nokia C300 Nokia,Nokia C300,ORT,N155DL Nokia,Nokia C31,VSI,Nokia C31 Nokia,Nokia C32,MKDA,Nokia C32 @@ -23136,6 +24033,7 @@ Nokia,Nokia G21,SCP_sprout,Nokia G21 Nokia,Nokia G22,SFI,Nokia G22 Nokia,Nokia G22,SFIA,Nokia G22 Nokia,Nokia G300,AKT,N1374DL +Nokia,Nokia G310 5G,SDT,Nokia G310 5G Nokia,Nokia G400 5G,STM,Nokia G400 5G Nokia,Nokia G400 5G,STO,Nokia G400 5G Nokia,Nokia G42 5G,SDW,Nokia G42 5G @@ -23227,10 +24125,12 @@ Nothing,Nothing Phone (1),Spacewar,A063 Nothing,Nothing Phone (2),Pong,A065 Nothing,Nothing Phone (2),Pong,AIN065 Nothing,Nothing Phone (2a),Pacman,A142 +Nothing,Nothing Phone (2a) Plus,PacmanPro,A142P Nous,Fabulous,NS5005,NS5005 Nous,NS5002,NS5002,NS5002 Nous,NS5502,NS5502,NS5502 Nous,Optimum,NS5008,NS5008 +Novey,Pro_K10,Pro_K10,Pro K10 Novinsun,N11,N11,N11 Novinsun,TN618,TN618,TN618 Novinsun,TN618pro,TN618pro,TN618pro @@ -23270,6 +24170,7 @@ Nuu,A9L,S6303LA_Go,S6303L Nuu,B10,S6505LA,S6505L Nuu,B15,S6701LA,S6701L Nuu,B20,N6501LA,N6501L +Nuu,B30,S6702XA,S6702X Nuu,B30 Pro,S6702XA,S6702X Nuu,G1,N5704LA,N5704L Nuu,G2,S6001LE,S6001L @@ -23278,6 +24179,9 @@ Nuu,M19,S5501LE,S5501L Nuu,M2,NUU_M2,NUU_M2 Nuu,M3,NUU_M3,NUU_M3 Nuu,M6,S6503LE,S6503L +Nuu,N10,S6603LA,S6603L +Nuu,N12,S6008LA,S6008L +Nuu,N13,S6514LA,S6514L Nuu,N4L,N4L,N4L Nuu,N5L,N5L,N5L Nuu,N6001L,N6001LA,N6001L @@ -23296,6 +24200,7 @@ Nuu,Tab 8,T0801LAV1,T0801L Nuu,Tab 8,T0801LAV2,T0801L Nuu,Tab 8,T0801LAV2,T0802L Nuu,Tab 8 Plus,T0805LAV1,T0805L +Nuu,X10 5G,S6707XA,S6707X Nuu,X4,X4,X4 Nuu,X5,NUU_X5,NUU_X5 Nuu,X6,S5702LA,S5702L @@ -23377,11 +24282,13 @@ OKAPI,Okapi_Tab8_Pro,Okapi_Tab8_Pro,Okapi_Tab8_Pro OKAPI,Tab10,Tab10,Tab10 OKSI,GEN-10,GEN-10,GEN-10 OKSI,GT1001,GT1001,GT1001 +OKView,IFP,rk3588_t,IFP OKWU,PI Plus,PI_Plus,PI Plus OLAX,Magic_Q1,Magic_Q1,Magic Q1 OLAX,Magic_Q8,Magic_Q8,Magic Q8 OLAX,Ocean K8,Ocean_K8,Ocean K8 OLAX,Ocean_F8,Ocean_F8,Ocean F8 +OLAX,Ocean_K8_Pro,Ocean_K8_Pro,Ocean K8 Pro OLAX,Q101_EEA,Q101_EEA,Q101_EEA OMAX,7PAN,7PAN,7PAN OMAX,OMAX-IFPD,rk3588_t,HANJI @@ -23401,7 +24308,11 @@ OMIX,X700,X700,OMIX X700 OMIX,X700,X700,X700 ONDA TLC,T7 Pro,T7_PRO,T7_PRO ONDA TLC,T9 S,T9S,T9S +ONERugged,M10X,M10X,M10X +ONERugged,M10XE,M10XE,M10XE ONERugged,M195T,M195T,M195T +ONERugged,M19TE,M19TE,M19TE +ONERugged,M86X,M86X,M86X ONERugged,M86XE,M86XE,M86XE ONERugged,MPC10T,MPC10T,MPC10T ONERugged,MPC80T,MPC80T,MPC80T @@ -23409,7 +24320,6 @@ ONIDA,ONIDA 2K Android TV,lasalle,ONIDA 2K Android TV ONIDA,ONIDA 4K Android TV,kenton,ONIDA 4K Android TV ONYX,AKA Model A,Model_A,Model A ONYX,BOOX,BOOX,BOOX -ONYX,BOOX Tab,BOOX_Tab,BOOX Tab ONYX,QuartzT10-3,QuartzT10-3,QuartzT10-3 ONYX,TabBoox,TabBoox,TabBoox ORBYS,F20,F20,F20 @@ -23430,12 +24340,18 @@ OSCAL,C30 Pro,C30_Pro,C30 Pro OSCAL,C60,C60,C60 OSCAL,C70,C70,C70 OSCAL,C80,C80,C80 +OSCAL,ELITE 1,ELITE_1,ELITE 1 OSCAL,FLAT 1C,FLAT1C,FLAT 1C +OSCAL,FLAT 2,FLAT_2,FLAT 2 OSCAL,MODERN 8,MODERN_8,MODERN 8 +OSCAL,PILOT 2,PILOT_2,PILOT 2 OSCAL,Pad 15,Pad15,Pad 15 OSCAL,Pad 15,Pad15_EEA,Pad 15 +OSCAL,Pad 15,Pad15_RU,Pad 15 OSCAL,Pad 16,Pad16,Pad 16 OSCAL,Pad 18,Pad18,Pad 18 +OSCAL,Pad 5,Pad_5,Pad 5 +OSCAL,Pad 5 Kids,Pad_5_Kids,Pad 5 Kids OSCAL,Pad 7,Pad_7,Pad 7 OSCAL,Pad 70,Pad70_NEU,Pad 70 OSCAL,Pad 70 WiFi,Pad_70_WiFi,Pad 70 WiFi @@ -23454,8 +24370,12 @@ OSCAL,S70,S70,S70 OSCAL,S70 Pro,S70_Pro,S70 Pro OSCAL,S80,S80,S80 OSCAL,S80_RU,S80,S80 +OSCAL,Spider8_EEA,Spider8,Spider 8 +OSCAL,Spider8_NEU,Spider8,Spider 8 +OSCAL,Spider8_RU,Spider8,Spider 8 OSCAL,TIGER 10,Tiger10,TIGER 10 OSCAL,TIGER 12,Tiger12,TIGER 12 +OSCAL,TIGER 13,TIGER_13,TIGER 13 OSCAL,Tiger 10,Tiger10,TIGER 10 OSCAL,Tiger 12,Tiger12,TIGER 12 OSN tv,NGB22-OSN,HY45N,NGB22-OSN @@ -23472,6 +24392,7 @@ OTOT,S7,S7,S7 OTOT,S8,S8,S8 OTOT,V350,V350,V350 OTTO,OTTO CR05,OTTO_CR05,OTTO CR05 +OUZRS,OUZRSM4,OUZRSM4,M4 OVERTECH,OX7A,OX7A,OX7A OVERTECH,OX7S,OX7S,OX7S OWXMobile,W50s,W50s,W50s @@ -23496,9 +24417,12 @@ Oale,dbx,dbx,dbx Oangcc,A13_EEA,A13_EEA,A13_EEA Oangcc,A13_US,A13_US,A13_US Oangcc,A15_EEA,A15_EEA,A15_EEA +Oangcc,A6_EEA,A6_EEA,A6_EEA Oangcc,A9-EEA,A9-EEA,A9-EEA Oangcc,A9_EEA,A9_EEA,A9_EEA Oangcc,A9_US,A9_US,A9_US +Oangcc,TAB_A8_EEA_T,TAB_A8_EEA_T,TAB_A8_EEA +Oangcc,TAB_A8_T,TAB_A8_T,TAB_A8_US Oangcc,Tab-A8,Tab-A8,Tab-A8 Oangcc,Tab-A8_EEA,Tab-A8_EEA,Tab-A8_EEA Oangcc,Tab_A6,Tab_A6,Tab_A6 @@ -23510,6 +24434,10 @@ Oceusnetworks,Xiphos®TMD,granite,Xiphos(R)TMD Octopus,Octopus_One,Octopus_One,Octopus_One Odea,A10_EEA,A10_EEA,A10 Odea,A10_ROW,A10_ROW,A10 +Odea,A11_ROW,A11_ROW,A11 +Odea,A12_EEA,A12_EEA,A12 +Odea,A12_ROW,A12_ROW,A12 +Odea,S11_EEA,S11_EEA,S11 Odea,S11_ROW,S11_ROW,S11 Odido,4K TV Box,SEI800TFAS,4K TV Box Odotpad,FIRE_V7,FIRE_V7,FIRE_V7 @@ -23517,6 +24445,7 @@ Odys,UNO X10,UNO_X10,UNO X10 Odys,UNO X8,UNO_X8,UNO_X8 Oioo,Model 2,wecct,Model 2 Oioo,Model 3,wecct3,Model 3 +Okin,Tablet_FP,FP290101,FP290101 Olike,E1,E1,E1 Olike,E3,E3,E3 Olimpo,R3,R3,R3 @@ -23637,6 +24566,8 @@ OnePlus,OnePlus Nord 2T 5G,OP557AL1,CPH2399 OnePlus,OnePlus Nord 2T 5G,OP557AL1,CPH2401 OnePlus,OnePlus Nord 3 5G,OP556FL1,CPH2491 OnePlus,OnePlus Nord 3 5G,OP556FL1,CPH2493 +OnePlus,OnePlus Nord 4,OP5E93L1,CPH2661 +OnePlus,OnePlus Nord 4,OP5E93L1,CPH2663 OnePlus,OnePlus Nord CE 2,OP555BL1,IV2201 OnePlus,OnePlus Nord CE 2 Lite 5G,OP535DL1,CPH2381 OnePlus,OnePlus Nord CE 2 Lite 5G,OP535DL1,CPH2409 @@ -23645,6 +24576,7 @@ OnePlus,OnePlus Nord CE 3 Lite 5G,OP5958L1,CPH2467 OnePlus,OnePlus Nord CE 5G,OnePlusNordCE,EB2101 OnePlus,OnePlus Nord CE 5G,OnePlusNordCE,EB2103 OnePlus,OnePlus Nord CE4,OP5D3FL1,CPH2613 +OnePlus,OnePlus Nord CE4 Lite 5G,OP5D49L1,CPH2619 OnePlus,OnePlus Nord N10 5G,OnePlusN10,BE2026 OnePlus,OnePlus Nord N10 5G,OnePlusN10,BE2028 OnePlus,OnePlus Nord N10 5G,OnePlusN10,BE2029 @@ -23669,6 +24601,7 @@ OnePlus,OnePlus Nord2 5G,OP515BL1,DN2103 OnePlus,OnePlus Pad,OP59BCL1,OPD2203 OnePlus,OnePlus Pad Go,OP5DA6L1,OPD2304 OnePlus,OnePlus Watch 2,OPWWE231,OPWWE231 +OnePlus,OnePlus Watch 2R,OPWWE234,OPWWE234 OnePlus,OnePlus2,OnePlus2,ONE A2003 OnePlus,OnePlus3,OnePlus3,ONEPLUS A3000 OnePlus,OnePlus3T,OnePlus3T,ONEPLUS A3000 @@ -23678,13 +24611,17 @@ OnePlus,OnePlus6T,OnePlus6T,ONEPLUS A6010 OnePlus,OnePlus6T,OnePlus6T,ONEPLUS A6013 OnePlus,OnePlus6T,OnePlus6TSingle,ONEPLUS A6013 OnePlus,Oneplus Ace 2 Pro,OP5943L1,PJA110 +OnePlus,Oneplus Ace 3 Pro,OP5D06L1,PJX110 +OnePlus,Oneplus Nord CE4 Lite 5G,OP5D49L1,CPH2621 OnePlus,Oneplus_Dosa_IN,Oneplus_Dosa_IN,Oneplus_Dosa_IN OnePlus,Open,OP5973L1,CPH2551 OnePlus,PHP110,OP5927,PHP110 OnePlus,X,OnePlus,ONE E1003 OnePlus,Y Series,shibuya,Y Series +OnePlus,一加平板Pro,OP5D77L1,OPD2404 OneScreen,OPS LF with Android,OneScreen-OPS-LF,OneScreen-OPS-LFA OneScreen,OneScreen T7,rk3588_t,T7 +OneScreen,Wandr_W1,Wandr,OneScreen Wandr Onix,AT101-1118,AT101-1118,AT101-1118 Onkyo,DP-CMX1,Gravity_128,DP-CMX1 Onkyo,DP-CTX1,DP-CTX1,DP-CTX1 @@ -23719,13 +24656,18 @@ OpelMobile,EasySmart,EasySmart,EasySmart OpelMobile,EasySmart 2,Easy_Smart_2,Easy_Smart_2 OpelMobile,OMSJ523B,OpelMobile_OMSJ523B,Smart J5 OpelMobile,Opel Mobile_Smart_J2,Smart_J2,Smart_J2 +OpelMobile,Opel Smart60R,OMS60R24B,Smart60R OpelMobile,Rugged60Q,OMR60Q23O,Rugged60Q +OpelMobile,SMARTJ5-M,SMARTJ5-M,SMARTJ5-M OpelMobile,SMARTKIDS,SMARTKIDS,SMARTKIDS OpelMobile,Smart X6,SmartX6,Opel Mobile SmartX6 OpelMobile,Smart55Q,OMS55Q23B,Smart55Q +OpelMobile,Smart55R,Smart55R,OMS55R24B OpelMobile,Smart65Q,OMS65Q23B,Smart65Q +OpelMobile,Smart65R,OMS65R24B,Smart65R OpelMobile,SmartJX,SmartJX,OpelMobile_SmartJX OpelMobile,SmartX1,SmartX1,OpelMobile_SmartX1 +OpelMobile,SmartX65,OMSX6524B,SmartX65 OpelMobile,SmartZ6,SmartZ6,SmartZ6 OpenPeak,,CIUS-7,CIUS-7 OpenPeak,,CIUS-7-AT,CIUS-7-AT @@ -23759,6 +24701,7 @@ Oppo,A1601,A1601,A1601 Oppo,A1601,A1601,A1601fw Oppo,A1601fw,A1601,A1601fw Oppo,A1603,A1603,A1603 +Oppo,A16K,OP5321,CPH2351 Oppo,A17,OP56F5,CPH2477 Oppo,A17k,OP56F5,CPH2471 Oppo,A18,OP575DL1,CPH2591 @@ -23766,7 +24709,12 @@ Oppo,A1k,OP486C,CPH1923 Oppo,A2 5G,OP5647,PJB110 Oppo,A2x 5G,OP5A0D,PJS110 Oppo,A3,CPH1837,CPH1837 +Oppo,A3,OP5B16L1,CPH2669 +Oppo,A3 5G,OP5B05L1,A402OP +Oppo,A3 5G,OP5EA7L1,CPH2693 Oppo,A3 Pro 5G,OP59FB,PJY110 +Oppo,A3 Pro 5G,OP5B05L1,CPH2665 +Oppo,A3 Pro 5G/A3 5G/A80 5G,OP5B05L1,CPH2639 Oppo,A31,A31t,A31 Oppo,A31c,A31c,A31c Oppo,A31u,A31u,A31u @@ -23794,10 +24742,18 @@ Oppo,A39,A39,OPPO A39 Oppo,A39m,A39,OPPO A39m Oppo,A39t,A39,OPPO A39t Oppo,A39tm,A39,OPPO A39tm +Oppo,A3m 5G,OP5A47,PKD120 Oppo,A3s,CPH1803,CPH1803 Oppo,A3s,CPH1853,CPH1853 +Oppo,A3x,OP5B16L1,CPH2641 +Oppo,A3x 5G,OP5A47,PKD130 +Oppo,A3x 5G,OP5EA7L1,CPH2681 +Oppo,A3x/A20,OP5B16L1,CPH2641 Oppo,A3中国版,PADM00,PADM00 Oppo,A3中国版,PADT00,PADT00 +Oppo,A3活力版 5G,OP5A47,PKD110 +Oppo,A40/A3/A40m,OP5B16L1,CPH2669 +Oppo,A40/A40m,OP5B16L1,CPH2669 Oppo,A5,CPH1809,CPH1809 Oppo,A5,PBAM00,PBAM00 Oppo,A5,PBAT00,PBAT00 @@ -23836,6 +24792,8 @@ Oppo,A57,A57,OPPO A57 Oppo,A57,A57,OPPO A57t Oppo,A57,OP5355,CPH2387 Oppo,A57,OP5355,CPH2407 +Oppo,A57,OP571F,CPH2387 +Oppo,A57,OP571F,CPH2407 Oppo,A57s/A77,OP5353L1,CPH2385 Oppo,A57t,A57,OPPO A57t Oppo,A58,OP574FL1,CPH2577 @@ -23848,6 +24806,8 @@ Oppo,A59st,A59,OPPO A59st Oppo,A59t,A59,OPPO A59t Oppo,A59tm,A59,OPPO A59tm Oppo,A60,OP5AE7L1,CPH2631 +Oppo,A60,OP5B16L1,CPH3669 +Oppo,A60 5G,OP5EA7L1,CPH2683 Oppo,A7,CPH1901,CPH1901 Oppo,A7,CPH1905,CPH1905 Oppo,A7,PBFM00,PBFM00 @@ -23875,6 +24835,7 @@ Oppo,A79t,A79t,OPPO A79t Oppo,A7n,PCDT00,PCDT00 Oppo,A7x 中国版,PBBM00,PBBM00 Oppo,A7x 中国版,PBBT00,PBBT00 +Oppo,A80 5G,OP5B05L1,CPH2639 Oppo,A83,A83,OPPO A83 Oppo,A83t,A83t,OPPO A83t Oppo,A9 2020,OP4B80L1,CPH1937 @@ -24039,6 +25000,8 @@ Oppo,Find5,FIND5,X909 Oppo,Find5,FIND5,X909T Oppo,K1,PBCM30,PBCM30 Oppo,K12 5G,OP5A15L1,PJR110 +Oppo,K12x 5G,OP5A1F,PJT110 +Oppo,K12x 5G,OP5B05L1,CPH2667 Oppo,K3,OP4679,PCGM00 Oppo,K3,OP4679,PCGT00 Oppo,K3,OP486B,CPH1955 @@ -24069,6 +25032,7 @@ Oppo,OPPO A57s,OP5353L1,CPH2385 Oppo,OPPO A74 5G,OP4F39L1,CPH2197 Oppo,OPPO A95 5G,OP4EB7,PELM00 Oppo,OPPO F21 Pro 5G,OP532FL1,CPH2341 +Oppo,OPPO F27 Pro+ 5G,OP5B19L1,CPH2643 Oppo,OPPO K11 5G,OP591D,PJC110 Oppo,OPPO K11x 5G,OP5925,PHF110 Oppo,OPPO Pad,OP5223,OPD2101 @@ -24290,8 +25254,17 @@ Oppo,Reno10 Pro 5G,OP56DBL1,CPH2525 Oppo,Reno10 Pro 5G,OP56DBL1,CPH2541 Oppo,Reno10 Pro+ 5G,OP56D3L1,CPH2521 Oppo,Reno11,OP59EDL1,PJH110 +Oppo,Reno11 A,OP5A0BL1,A401OP Oppo,Reno11 F 5G,OP5A0BL1,CPH2603 +Oppo,Reno11 F 5G/Reno11 A,OP5A0BL1,CPH2603 Oppo,Reno11 Pro,OP59EFL1,PJJ110 +Oppo,Reno12,OP5A29L1,PJV110 +Oppo,Reno12 5G,OP5ADDL1,CPH2625 +Oppo,Reno12 F,OP5EB1L1,CPH2687 +Oppo,Reno12 F 5G,OP5AF2L1,CPH2637 +Oppo,Reno12 F/FS 5G,OP5AF2L1,CPH2637 +Oppo,Reno12 Pro,OP5A2BL1,PJW110 +Oppo,Reno12 Pro 5G,OP5AE1L1,CPH2629 Oppo,Reno2 Z,OP4B65L1,CPH1945 Oppo,Reno2 Z,OP4B65L1,CPH1951 Oppo,Reno2 Z 中国版,OP4A43,PCKM80 @@ -24372,6 +25345,7 @@ Opticon,H-27,H-27,H-27 Opticon,H-31,h31,h31 Opticon,H-33,h33,h33 Opticon,H-35,H-35,H-35 +Optoma,IFP3Gen3,SXXSRK,SXXSRK Optoma,IFP5Gen3,rk3588_t,UXXSRK Oraimo,R401,oraimo-R401,oraimo R401 Oraimo,R402,oraimo-R402,oraimo R402 @@ -24426,6 +25400,7 @@ Orange,Rise52,BUZZ6T4G,Orange-Rise52 Orange,Rise_54,Rise_54,Orange Rise 54 Orange,Rise_54,Rise_54,Orange Rise 54 EEA Orange,Roya,Alto45,Orange Roya +Orange,Sanza plus,Sanza_plus,Orange Sanza plus Orange,Sanza_touch,Sanza_touch,Orange Sanza touch Orange,Sego,Orange_Sego,Orange Sego Orange,TV Box,zc4455v_orb,Orange TV Box @@ -24499,8 +25474,17 @@ Oukitel,C32_Pro_EEA,C32_Pro,C32 Pro Oukitel,C33_EEA,C33,C33 Oukitel,C35_EEA,C35,C35 Oukitel,C36_EEA,C36,C36 +Oukitel,C36_T_EEA,C36,C36 +Oukitel,C36_U_EEA,C36,C36 Oukitel,C37_EEA,C37,C37 +Oukitel,C38_EEA,C38,C 38 Oukitel,C38_EEA,C38,C38 +Oukitel,C50_EEA,C50,C50 +Oukitel,C51_EEA,C51,C51 +Oukitel,C53,C53,C53 +Oukitel,C57_S_EEA,C57_S,C57 S +Oukitel,C58_EEA,C58,C58 +Oukitel,C58_Pro_EEA,C58_Pro,C58 Pro Oukitel,C6 Pro,C6_Pro,C6 Pro Oukitel,C8,C8,C8 Oukitel,C8 4G,C8_4G,C8 4G @@ -24508,6 +25492,9 @@ Oukitel,C9,C9,C9 Oukitel,C90_EEA,C90,C90 Oukitel,C90_Pro_EEA,C90_Pro,C90 Pro Oukitel,Coosea,K3,K3 +Oukitel,Customer need debug,WP32_Pro,WP32 Pro +Oukitel,G1_EEA,G1,G1 +Oukitel,G2-EEA,G2,G2 Oukitel,K10,K10,K10 Oukitel,K10000 Mix,K10000_Mix,K10000 Mix Oukitel,K10000 Pro,K10000_Pro,K10000 Pro @@ -24537,21 +25524,34 @@ Oukitel,OK6000 PLUS,OK6000_Plus,OK6000 Plus Oukitel,OKC8 4G,OKC8_4G,OKC8 4G Oukitel,OKT1,OKT1,OKT1 Oukitel,OKT3,OKT3,OKT3 +Oukitel,OT11,OT11,OT11 +Oukitel,OT11_ROW,OT11,OT11 +Oukitel,OT12_EEA,OT12,OT12 +Oukitel,OT12_ROW,OT12,OT12 +Oukitel,OT15_EEA,OT15,OT15 Oukitel,OT5_EEA,OT5,OT5 Oukitel,OT5_S_EEA,OT5_S,OT5 S +Oukitel,OT6_EEA,OT6,OT6 +Oukitel,OT6_Kids_EEA,OT6_Kids,OT6 Kids Oukitel,OT7_EEA,OT7,OT7 +Oukitel,OT8_EEA,OT8,OT8 +Oukitel,OT8_ROW,OT8,OT8 +Oukitel,OT9,OT9,OT9 Oukitel,P07_EEA,P07,RT7 TITAN 5G Oukitel,P07_NFC_EEA,P07,RT7 TITAN 5G Oukitel,RT1,RT1,RT1 Oukitel,RT1_EEA,RT1,RT1 Oukitel,RT2_EEA,RT2,RT2 +Oukitel,RT3_Pro_EEA,RT3_Pro,RT3 Pro Oukitel,RT3_S_EEA,RT3_EEA,RT3 +Oukitel,RT3_T,RT3,RT3 Oukitel,RT3_T_EEA,RT3,RT3 Oukitel,RT5_EEA,RT5,RT5 Oukitel,RT6_EEA,RT6,RT6 Oukitel,RT6_NFC_EEA,RT6,RT6 Oukitel,RT7_TITAN_EEA,RT7_TITAN,RT7 TITAN Oukitel,RT8_EEA,RT8,RT8 +Oukitel,RT9_EEA,RT9,RT9 Oukitel,S105B_RU,S105B,WP21 Ultra Oukitel,S109_RU,S109,WP22 Oukitel,S115_EEA,S115,WP26 @@ -24599,14 +25599,22 @@ Oukitel,WP22,S109,WP22 Oukitel,WP23,S111,WP23 Oukitel,WP27_EEA,WP27,WP27 Oukitel,WP27_RU,WP27,WP27 +Oukitel,WP28_E_EEA,WP28_E,WP28 E +Oukitel,WP28_S_EEA,WP28_S,WP28 S Oukitel,WP30_Pro_EEA,WP30_Pro,WP30 Pro Oukitel,WP32_EEA,WP32,WP32 +Oukitel,WP32_Pro_U_EEA,WP32_Pro_U,WP32_Pro Oukitel,WP33_Pro_EEA,WP33_Pro,WP33 Pro +Oukitel,WP33_Pro_U_EEA,WP33_Pro,WP33 Pro +Oukitel,WP35_EEA,WP35,WP35 Oukitel,WP36_EEA,WP36,WP36 Oukitel,WP38_EEA,WP38,WP38 +Oukitel,WP39_EEA,WP39,WP39 Oukitel,WP5,WP5,WP5 Oukitel,WP5 Pro,WP5_Pro,WP5 Pro Oukitel,WP5000,WP5000,WP5000 +Oukitel,WP50_EEA,WP50,WP50 +Oukitel,WP52_EEA,WP52,WP52 Oukitel,WP5_Pro_row,WP5_Pro,WP5 Pro Oukitel,WP6,WP6,WP6 Oukitel,WP6_EEA,WP6,WP6 @@ -24621,6 +25629,7 @@ Overmax,OV-Qualcore-1023-3G,OV-Qualcore-1023-3G,OV-Qualcore-1023-3G Overmax,OV-Qualcore-7023-3G,OV-Qualcore-7023-3G,OV-Qualcore-7023-3G Overmax,OV10273G,OV10273G,OV10273G Overmax,OV10274G,OV10274G,OV10274G +Ovion,V30 Ultra,V30_Ultra,V30 Ultra OwnMobile,FUN 6,OWN_FUN_6,OWN FUN 6 OwnMobile,FUN 7,OWN_FUN_7,OWN FUN 7 OwnMobile,FUN VALUE 4G,FUNVALUE4G,FUN VALUE 4G @@ -24633,7 +25642,12 @@ Oxygen.id,B866V2FA V3.4,B866V2FA,B866V2FA V3.4 Oxygen.id,SEI700MRT,SEI700MRT,SEI700MRT Oysters,T72HM3G,T72HM3G,T72HM3G Oysters,T72HMs 3G,T72HM3G,T72HMs_3G +Oysters,Universal Phone 1,Universal_Phone_1,UBS1 +PAITANRY,CH10,CH10,CH10 +PAITANRY,CH10PRO,CH10PRO,CH10_PRO PAITANRY,R16,R16,R16 +PAITANRY,R16-PRO,R16-PRO,R16 PRO +PAITANRY,SSK10,SSK10,SSK10 PALSONIC,Android TV,R1,ATV R1 PANORAMA,Smart TV,kualakai,Smart TV PAPAGO,GoPad8,GoPad8,GoPad8 @@ -24685,6 +25699,8 @@ PCD Argentina,P60 CENAM,P60_CENAM,P60 CENAM PCD Argentina,P60_CA,P60_CA,P60_CA PCD Argentina,P63L,P63L_CA,P63L PCD Argentina,P63L,P63L_PR,P63L +PCD Argentina,P65,P65_CA,P65 +PCD Argentina,P65,P65_CA,P65R PCD Argentina,PCD508,PCD508,PCD508 PCD Argentina,PCD509,PCD509,PCD509 PCD Argentina,PD60,P60,P60 @@ -24701,6 +25717,7 @@ PCD Argentina,PL570,PL570,PL570 PCD Argentina,PL571,PL571,PL571 PCD Argentina,PL571US,PL571US,PL571US PCD Argentina,PL620,PL620,PL620 +PCD LLC,Bengal Max,Bengal_Max_iW,Bengal Max PCD LLC,Bengal_Max,Bengal_Max,Bengal Max PCD LLC,P41PR,P41PR,P41PR PCD LLC,P62,P62,P62 @@ -24712,10 +25729,14 @@ PEAQ,PET-101-H232E,PET-101-H232E,PET 101-H232E PEAQ,PET-101-H232E,PET-101-H232E,PET 101-H232E-13 PEAQ,PET-101-H332S-W,PET-101-H332S-W,PET 101-H332S-W PEAQ,PET-102-H232S,PET-102-H232S,PET-102-H232S +PEAQ,PET-10380-H628S,PET-10380-H628S,PET-10380-H628S PEAQ,PET-1081-H232S,PET-1081-H232S,PET 1081-H232S PEAQ,PET-1081-LH332S,PET-1081-LH332S,PET 1081-LH332S +PEAQ,PET-10980-F628E,PET-10980-F628E,PET-10980-F628E PEAQ,PET-882-H232S,PET-882-H232S,Lightyear 2 PEAQ,PET-882-H232S,PET-882-H232S,PET-882-H232S +PEAQ,PET_10180_H464S,PET_10180_H464S,PET_10180_H464S +PEAQ,PET_11080_H428S,PET_11080_H428S,PET_11080_H428S PEAQ,PET_8040_H464S,PET_8040_H464S,PET_8040_H464S PEICHENG,ZB31,ZB31,ZB31 PEL (PAK),PEL,lavender,4K SMART TV @@ -24734,6 +25755,8 @@ PIPO,IconX_P109,IconX_P109,IconX_P109 PIXART,Pixart_P20,Pixart_P20,Pixart_P20 PIXART,SZ10M68,SZ10M68,SZ10M68 PIXPEAK,Tablet,Tablet,P7-EEA +PIXPEAK,U921,U921,U921 +PIXPEAK,U921-EEA,U921-EEA,U921-EEA PIXPRO,PIXPRO L1 PRO,PIXPRO_L1_PRO,PIXPRO L1 PRO PIXPRO,PIXPRO T3,T3,PIXPRO T3 PLDT,PLDT-GMB8260,DS8942-KPP,PLDT-GMB8260 @@ -24757,6 +25780,9 @@ POCO,POCO F4,munch,22021211RI POCO,POCO F4 GT,ingres,21121210G POCO,POCO F5,marble,23049PCD8G POCO,POCO F5,marble,23049PCD8I +POCO,POCO F6,peridot,24069PC21G +POCO,POCO F6,peridot,24069PC21I +POCO,POCO F6 Pro,vermeer,23113RKC6G POCO,POCO M2,shiva,M2004J19PI POCO,POCO M2 Pro,gram,POCO M2 Pro POCO,POCO M3,citrus,M2010J19CG @@ -24771,6 +25797,8 @@ POCO,POCO M4 Pro 5G,evergreen,21091116AG POCO,POCO M5,rock,22071219CI POCO,POCO M5,stone,22071219CG POCO,POCO M5s,rosemary,2207117BPG +POCO,POCO M6,moon,2404APC5FG +POCO,POCO M6 Plus 5G,breeze,24066PC95I POCO,POCO M6 Pro,emerald,2312FPCA6G POCO,POCO M6 Pro 5G,sky,23076PC4BI POCO,POCO X2,phoenixin,POCO X2 @@ -24781,8 +25809,13 @@ POCO,POCO X3 Pro,vayu,M2102J20SG POCO,POCO X4 GT,xaga,22041216G POCO,POCO X4 Pro 5G,peux,2201116PI POCO,POCO X4 Pro 5G,veux,2201116PG +POCO,POCO X5 Pro 5G,redwood,22101320G +POCO,POCO X5 Pro 5G ,redwoodin,22101320I POCO,POCO X6 5G,garnet,23122PCD1G POCO,POCO X6 5G,garnet,23122PCD1I +POCO,POCO X6 Pro 5G,duchamp,2311DRK48G +POCO,POCO X6 Pro 5G,duchamp,2311DRK48I +POLSAT,polsat soundbox 4K,m391_polsat,polsat soundbox 4K POOLS,POOLS The DOLLAR,POOLS_The_DOLLAR,POOLS_The_DOLLAR POPTEL,Kammunica V10,Kammunica_V10,Kammunica_V10 POPTEL,P60,P60,P60 @@ -24797,6 +25830,9 @@ POS Terminal,ACT,POS,pCloud POS Terminal,MINT,POS,pCloud POSSAFE,OrderGo5_EEA,OrderGo5,OrderGo5 POSSAFE,OrderGo_6_TR,OrderGo_6,OrderGo 6 +POWMUS,L211-EEA,L211-EEA,L211-EEA +PRAZteck,2-IN-1_Tablet_PC,PT10EduPad21,PT10EduPad21 +PRAZteck,PT116LPREduPad,Laptop,PT116LPREduPad PRAZteck,PT7EduPad,PT7EduPad,PT7EduPad PRIMA,PRIMA 2K Android TV,lasalle,PRIMA 2K Android TV PRIMA,PRIMA 4K Android TV,kenton,PRIMA 4K Android TV @@ -24817,12 +25853,15 @@ PROTON,PROTON Google TV,bandra,PROTON Google TV PS_Mobile,Neo_Pro,Neo_Pro,Neo Pro PS_Mobile,neo,neo,neo PT mobile,P10,P10,P10 +PTCL SHOQ TV,PTCL B866V2F,PTCLBox_B866V2F,B866V2F +PTEZ,EZ24,EZ24,EZ24 PYUR,PYUR TV BOX,m377genb_pyur,PYUR TV BOX Packard Bell,A4000,A4000,A4000 Packard Bell,A5000,A5000,A5000 Packard Bell,A5700,A5700,A5700 Packard Bell,DAYTONA-G12,DAYTONA-G12,DAYTONA-G12 Packard Bell,DAYTONA-G6,DAYTONA-G6,DAYTONA-G6 +Packard Bell,DAYTONA_G8,BL_9UEEP_104,DAYTONA_G8 Packard Bell,INTERLAGOS-T32,INTERLAGOS-T32,INTERLAGOS-T32 Packard Bell,M10400,M10400,M10400 Packard Bell,M10500,M10500,M10500 @@ -24832,6 +25871,7 @@ Packard Bell,M10950,M10950,M10950 Packard Bell,M11550,M11550,M11550 Packard Bell,M7500,M7500,M7500 Packard Bell,M7600-D,M7600-D,M7600-D +Packard Bell,MONZA-T5,MONZA-T5,MONZA-T5 Packard Bell,MONZA-T7,MONZA-T7,MONZA-T7 Packard Bell,PB1009,PB1009,PB1009 Packard Bell,PB101,PB101,PB101 @@ -24839,6 +25879,7 @@ Packard Bell,PB9000-32,PB9000-32,PB9000-32 Packard Bell,SILVERSTONE-T10,SILVERSTONE-T10,SILVERSTONE-T10 Packard Bell,SILVERSTONE-T11,SILVERSTONE-T11,BL.9UEEP.209 Packard Bell,SILVERSTONE-T18,SILVERSTONE-T18,BL.9UEEP.210 +Packard Bell,Silverstone-T10X,Silverstone-T10X,Silverstone-T10X Packard Bell,T1000,T1000,T1000 PadBook,PadBook,PadBook,PadBook Palm,PVG100,Pepito,PVG100 @@ -25095,6 +26136,8 @@ Panasonic,SDU,SDU,SDU Panasonic,SM17,SM17,Smart Monitor 17 Panasonic,SMLK2A,SMLK2A,SMLK2A Panasonic,SPU-A05-SWG,SPU-A05-SWG,SPU-A05-SWG +Panasonic,SPU-A06L-LWG,SPU-A06L-LWG,SPU-A06L-LWG +Panasonic,SPU-A07-LSG,SPU-A07-LSG,SPU-A07-LSG Panasonic,SV-ME1000,K1,Panasonic SV-ME1000 Panasonic,SmartTVBox,C01AS,SMARTTVBOX Panasonic,T11,T11,Panasonic T11 @@ -25131,6 +26174,7 @@ Panasonic,WSCU,wscu,WSCU3 Panasonic,Yaris M,T31,Panasonic T31 Panasonic,fz_b2dh,fz_b2d,FZ-B2D Panavox,50 google tv/58 google tv/65 google tv/75 google tv,songshan,SmartTV 4K +Panavox,Panavox Android TV,lushan,Panavox Android TV Panavox,fushan_panavox,hamamatsucho,Panavox Android TV Panavox,xiaoyushan_panavox,xiaoyushan,Panavox Android TV Panodic,IPHDCK16H,IPHDCK16H,IPHDCK16H @@ -25340,9 +26384,11 @@ Philips,Philips Android TV,PH9M_EA_5599,TPM191KN Philips,Philips Android TV,PH9M_EA_5599,TPM191L Philips,Philips Google TV TA1,PH1M_WW_9972,Philips Google TV TA1 Philips,Philips Google TV TA2,PH1M_WW_9972,Philips Google TV TA2 +Philips,Philips Google TV TA5,PH1M_WW_9972,Philips Google TV TA5 Philips,Philips Google TV TA6,kujo,Philips Google TV TA6 Philips,Philips Google TV TA6,kujo,Philips Google TV TA6 LT Philips,Philips Google TV TA7,PH3M_AL_T32,Philips Google TV TA7 +Philips,Philips Google TV TB3,PH1M_WW_9687,Philips Google TV TB3 Philips,Philips S257,S257,Philips S257 Philips,Philips S260,Philips_S260,Philips_S260 Philips,Philips S310X,Philips_S310X,Philips S310X @@ -25355,6 +26401,7 @@ Philips,Philips S369,S369,Philips S369 Philips,Philips S397,Philips_S397,S397 Philips,Philips S561,S561,Philips S561 Philips,Philips S562Z,S562Z,Philips S562Z +Philips,Philips S6206,S6206,S6206 Philips,Philips SmartTV,freesia,PHILIPS 4K TV Philips,Philips SmartTV,freesia,PHILIPS 4k TV Philips,Philips V787,Philips_Xenium_V787,Philips Xenium V787 @@ -25371,6 +26418,7 @@ Philips,S337,S337_AG,Philips S337 Philips,S337,S337_BG,Philips S337 Philips,S337,scx35_sp7731gea_hd,Philips S337 Philips,S395,S395,Philips S395 +Philips,S6122,S6122,S6122 Philips,Smart TV,guui,PHILIPS 4k TV Philips,Smart TV,hino,PHILIPS TV Philips,Smart TV,queenstown,Philips 4K A1 @@ -25401,12 +26449,14 @@ Philips,Xenium S266,S266,Xenium S266 Philips,Xenium S386,S386,Philips S386 Philips,Xenium S566,S566,Xenium S566 Philips,Xenium V377,Philips_V377,Philips V377 +Philips,whitefield,whitefield,R8G Phoenix,PHONETABPRO,PHONETABPRO,PHONETABPRO Phoenix Note,M701A,M701A,M701A Phoenix Note,PPS2022-P156,PPS2022-P156,PPS2022-P156 Phone Max,M10,M10,M10 Phone Max,M3PRO,M3PRO,M3PRO Phone Max,P1000,P1000,P1000 +Phone Max,R4 GT,R4_GT,R4 GT Phone Max,Rocky 2,Rocky_2,Rocky 2 Phone Max,Rocky_1,Rocky_1,Rocky_1 Phone Max,S4G,S4G,S4G @@ -25451,14 +26501,17 @@ Pixela,KSTB5043,KSTB5043,KSTB5043 Pixela,PIX-SMB400,tennouji,PIX-SMB400 Pixela,PIX_VP100,kyobashi,PIX-VP100 Pixus,PixusJoker,PixusJoker,PixusJoker +Pixus,Pixus_Arena,Pixus_Arena,Pixus_Arena Pixus,Pixus_Blast,Pixus_Blast,Pixus_Blast Pixus,Pixus_Drive,Pixus_Drive,Pixus_Drive +Pixus,Pixus_Falcon,Pixus_Falcon,Pixus_Falcon Pixus,Pixus_Folio,Pixus_Folio,Pixus_Folio Pixus,Pixus_Hammer,Pixus_Hammer,Pixus_Hammer Pixus,Pixus_Joker,Pixus_Joker,Pixus_Joker Pixus,Pixus_Line,Pixus_Line,Pixus_Line Pixus,Pixus_Sprint,Sprint,Pixus_Sprint Pixus,Pixus_Sprint_2_16,Sprint_2_16,Pixus_Sprint_2_16 +Pixus,Pixus_Titan,Pixus_Titan,Pixus_Titan Pixus,Pixus_Touch_7_3G,Pixus_Touch_7_3G,Pixus_Touch_7_3G Pixus,Pixus_Wing,Pixus_Wing,Pixus_Wing Plaisio,A2,Turbo-X_A2,Turbo-X_A2 @@ -25500,16 +26553,24 @@ PlayPoland,PLAY NOW TV BOX 3,DV8945-KPP,PLAY NOW TV BOX 3 PlayPoland,Play Now,dctiw362p,DCTIW362_PLAY PlayPoland,play_dctiw362,dctiw362p,DCTIW362_PLAY Plimpton,Kids20,Kids20,Kids20 +Plimpton,Kids20A14,Kids20A14,Kids20 +Plimpton,Kids20A14_EEA,Kids20A14_EEA,Kids20 Plimpton,Kids20_EEA,Kids20_EEA,Kids20 Plimpton,Kids_10,Kids_10,Kids_10 Plimpton,Kids_10_EEA,Kids_10_EEA,Kids 10 Plimpton,Kids_10_ver13,Kids_10_ver13,Kids 10 +Plimpton,Kids_10_ver14,Kids_10_ver14,Kids 10 +Plimpton,Kids_10_ver14_EEA,Kids_10_ver14_EEA,Kids 10 Plimpton,Kids_8,Kids_8,Kids_8 Plimpton,P60Plus,P60Plus,P60Plus +Plimpton,P60Pro,P60Pro,P60_Pro Plimpton,P60_Pro,P60_Pro,PlimPad_P60_Pro Plimpton,P70_14,P70_14,P70 +Plimpton,P70_14_EEA,P70_14_EEA,P70 Plimpton,P8,P8,P8 +Plimpton,P8Pro,P8Pro,P8Pro Plimpton,P8ProA14,P8ProA14,P8Pro +Plimpton,P8ProA14_EEA,P8ProA14_EEA,P8Pro Plimpton,P8Pro_EEA,P8Pro_EEA,P8Pro Plimpton,PlimPad_P3,PlimPad_P3,PlimPad P3 Plimpton,PlimPad_P3_Pro,PlimPad_P3_Pro,PlimPad_P3_Pro @@ -25673,6 +26734,7 @@ Polaroid,midcb232pr_EEA,midcb232pr,midcb232pr Polaroid,polaroid,ewha,POLA-TVE19K Polaroid,polaroid,sindang,POLA-TVE19M Polestar,Polestar,ihu_abl_car,Polestar +Polestar,Polestar,moose,Polestar Polestar,Polestar Emu,ihu_emulator,Polestar 2 Polytron,2K,hayward,POLYTRON2K Polytron,4K Smart TV,pioneer,4K PA Smart TV @@ -25684,6 +26746,7 @@ Polytron,POLYTRON P552,POLYTRON_P552,POLYTRON_P552 Polytron,POLYTRON R2509,POLYTRON_R2509,POLYTRON R2509 Polytron,POLYTRON R2509SE,POLYTRON_R2509SE,POLYTRON R2509SE Polytron,POLYTRON R250A,POLYTRON_R250A,POLYTRON R250A +Polytron,POLYTRON4K,lushan,POLYTRON4K Polytron,POLYTRON_T553,POLYTRON_T553,POLYTRON_T553 Polytron,PRIME A8,POLYTRON_A552,A552 Polytron,PRIME T8,POLYTRON_R255B,R255B @@ -25694,6 +26757,7 @@ Polytron,T8001,T8001,T8001 Porsche,Porsche,sdis1,Porsche Rear Seat Entertainment Porsche,Rear Seat Entertainment,sdis1,Porsche Rear Seat Entertainment Porsche,SDIS1,sdis1,Porsche Rear Seat Entertainment +Portworld,YC-M10,YC-M10,YC-M10 Posiflex,MK_1000,MK_1000,MK_1000 Posiflex,MT-6208A,Opera,Posiflex MT62 Positivo,8MA-A,ochoMA_A_3G,8MA-A 3G @@ -25871,6 +26935,7 @@ Positivo BGH,Y1010,Y1010,Positivo BGH Y1010 Positivo BGH,Ypy,T701_AR,L701 TV Positivo BGH,Ypy,YPY_L700,Positivo BGH Ypy L700 Positivo BGH,Ypy Kids,YPY_L700,Positivo BGH Ypy L700 Kids +Postef,RAISECOM_M6511,RAISECOM_M6511,RAISECOM M6511 Power Green,POWER GREEN,zhongshan,4K SMART TV Power Green,POWER_GREEN,stanford,2K SMART TV Powerway,DRN,DRN,DRN @@ -25917,6 +26982,9 @@ Premio,S40,S40,S40 Premio,S51,S51,S51 Premio,S53,S53,S53 Premio,S54,S54,S54 +Premio,S55,S55,S55 +Premio,S56,S56,S56 +Premio,S57,S57,S57 Premio,S70,S70,S70 Premio,S71,S71,S71 Premio,S72,Premio_S72,S72 @@ -25934,9 +27002,11 @@ Premio,S88,S88,S88 Premio,S89,S89,S89 Premio,S90,S90,S90 Premio,S91,S91,S91 +Premio,S94,S94,S94 Premio,T1,T1,T1 Premio,TAB7,TAB7,TAB7 Premio,TAB8,TAB8,TAB8 +Premio,TAB_8.1,TAB_8_1,TAB 8.1 Premio,X1,186HS2080531,186HS2080531 Premio,X70-2021,X70-2021,X70-2021 Premio,X75,X75,X75 @@ -25954,6 +27024,7 @@ Premio,X87,X87,X87 Premio,X88,X88,X88 Premio,X90,X90,X90 Premio,X91,X91,X91 +Premio,X97,X97,X97 Prestige,7G,Prestige-7G,Prestige 7G Prestige,ELITE10Q,Elite10Q,Elite10Q Prestige,ELITE7Q,Elite7Q,Elite7Q @@ -26244,7 +27315,9 @@ Prestigio,Wize 3771 3G,CD10A2G,PMT3771_3G Prestigio,Wize J3,TL50B10G,PSP3522DUO_RU Prestigio,Wize W3,TL49B11G,PSP3497DUO Prestigio,Wize W3,TL49B11G,PSP3497DUO_RU +Prestigio_Solutions,PSTA111,HP80A33L,PSTA111 Prestigio_Solutions,Virtuoso PSTA101,HE10A3L,PSTA101 +Prestigio_Solutions,Vitruoso,BO11A1W,PSTA107 Prime,O9,PRIME_O9,O9 Prime,PRIME Android TV,shinagawa,PRIME Android TV Prime,PRIME P1,PRIME_P1,P1 @@ -26253,6 +27326,7 @@ Primux,Primux_ioxphone,Primux_ioxphone,Primux_ioxphone Prince Mobile,PC9,PC9,PC9 Prism,Android TV,longshan,AI PONT NA Prism,UHD Android TV,sindorim,AI PONT +Pritom, USA,L8_B03_Kids,L8 Pritom,1AZ2P_eea,1AZ2P_eea,1AZ2P_eea Pritom,Benton_M10,Benton_M10,Benton_M10 Pritom,K7,K7,K7 @@ -26260,6 +27334,8 @@ Pritom,K7,K7_A04,K7 Pritom,K7,K7_A04_EEA,K7 Pritom,K7,K7_A103,K7 Pritom,K7,K7_A103_EEA,K7 +Pritom,K7Pro,K7Pro,TOUCH 7 +Pritom,K7Pro_EEA,K7Pro_EEA,TOUCH 7 Pritom,K7_A03,K7_A03,K7 Pritom,K7_A03_EEA,K7_A03_EEA,K7 Pritom,K7_A101,K7_A101,K7_A101 @@ -26272,6 +27348,8 @@ Pritom,L10,L10,L10 Pritom,L10_EEA,L10_EEA,L10_EEA Pritom,L10_PRO,L10_PRO,L10_PRO Pritom,L10_PRO_EEA,L10_PRO_EEA,L10_PRO_EEA +Pritom,L10_T07,L10_T07,L10 +Pritom,L10_T07_EEA,L10_T07,L10 Pritom,L8,L8,L8 Pritom,L8-T01,L8-T01,L8-T01 Pritom,L8-T01_EEA,L8-T01_EEA,L8-T01_EEA @@ -26283,7 +27361,15 @@ Pritom,L8_B01,L8_B01,TAB_8 Pritom,L8_B01_EEA,L8_B01_EEA,TAB_8 Pritom,L8_B02,L8_B02,L8 Pritom,L8_B02_EEA,L8_B02_EEA,L8 +Pritom,L8_B03,L8_B03,L8 +Pritom,L8_B03_EEA,L8_B03_EEA,L8 +Pritom,L8_C01,L8_C01,L8_C01 +Pritom,L8_C01_EEA,L8_C01_EEA,L8_C01_EEA +Pritom,L8_C02,L8_C02,L8_C02 +Pritom,L8_C02_EEA,L8_C02_EEA,L8_C02_EEA Pritom,L8_EEA,L8_EEA,L8_EEA +Pritom,L8_PRO,L8_PRO,L8 +Pritom,L8_PRO_EEA,L8_PRO_EEA,L8 Pritom,M10,M10,M10 Pritom,M10,M10_A01,M10 Pritom,M10,M10_A05_EEA,M10 @@ -26299,8 +27385,19 @@ Pritom,M10_B02,M10_B02,M10 Pritom,M10_B02_EEA,M10_B02_EEA,M10 Pritom,M10_B03,M10_B03,M10 Pritom,M10_B03_EEA,M10_B03_EEA,M10 +Pritom,M10_B05,M10_B05,M10 +Pritom,M10_B05_EEA,M10_B05_EEA,M10 +Pritom,M10_C01,M10_C01,M10_C01 +Pritom,M10_C01_EEA,M10_C01_EEA,M10_C01_EEA +Pritom,M10_C02,M10_C02,M10_C02 +Pritom,M10_C02_EEA,M10_C02_EEA,M10_C02_EEA +Pritom,M10_C03,M10_C03,M10_C03 +Pritom,M10_C03_EEA,M10_C03_EEA,M10_C03_EEA Pritom,M10_C04,M10_C04,M10 Pritom,M10_C04_EEA,M10_C04_EEA,M10 +Pritom,M10_C05,M10_C05,M10 +Pritom,M10_C05_EEA,M10_C05_EEA,M10 +Pritom,M10_C05_Kids,M10_C05_Kids,M10 Pritom,M10_Lite,M10_Lite,M10_Lite Pritom,M10_Max,M10_Max,M10_Max Pritom,M10_Max_EEA,M10_Max_EEA,M10_Max_EEA @@ -26310,6 +27407,8 @@ Pritom,M10_PRO,M10_PRO,M10_PRO Pritom,M10_PRO_EEA,M10_PRO_EEA,M10_PRO_EEA Pritom,M10_R01,M10_R01,M10_R01 Pritom,M10_R01_EEA,M10_R01_EEA,M10_R01_EEA +Pritom,M10_R02,M10_R02,M10_R02 +Pritom,M10_R02_EEA,M10_R02_EEA,M10_R02_EEA Pritom,M20,M10_A05,M10 Pritom,M20,M10_A05,M20 Pritom,M30,M30,M30 @@ -26327,6 +27426,7 @@ Pritom,P7_A03,P7_A03,P7 Pritom,P7_A03_EEA,P7_A03_EEA,P7 Pritom,P7_A04,P7_A04,P7 Pritom,P7_A04_EEA,P7_A04_EEA,P7 +Pritom,P7_A05,P7_A05,P7 Pritom,P7_EEA,P7_A1_EEA,P7_EEA Pritom,P7_EEA,P7_EEA,P7_EEA Pritom,PRITOM,M10_EEA,M10_EEA @@ -26336,6 +27436,7 @@ Pritom,Pritom_M50_EEA,Pritom_M50_EEA,Pritom_M50_EEA Pritom,S84,S84,S84 Pritom,USA,M10,M10 Pro Prixton,Expert,Expert,Expert +Prixton,Nova,Nova,Nova Prixton,T1700Q,T1700Q,T1700Q Prixton,T1800Q_Plus,T1800Q_Plus,T1800Q Plus Prixton,T7014Q_Plus,T7014Q_Plus,T7014Q_Plus @@ -26418,8 +27519,10 @@ QBell,QPHONE_9_3,QPHONE_9_3,QPHONE_9_3 QBell,QTAB10,QTAB10,QTAB10 QBell,Qbell android TV,hanyang,QBELL Android TV QCELL,Qsmart,QSmart,QSmart +QCELL,Qsmart,QSmart_Plus,QSmart Plus QFX USA,TLW-100,PhonePad,TLW-100 QIN(cn),F22 Pro,F22Pro,F22Pro +QIUWOKY,C10S,C10S,C10S QLA,C600,GBC_bravo,C600 QLA (tw),T1,QLA,T1 QMobile,A1,QMobile_Noir_A1,Noir A1 @@ -26586,6 +27689,7 @@ QUEST,RAPTOR,RAPTOR,RAPTOR QUEST,VISION,VISION,VISION QUEST,Vibe,Vibe,Vibe QUICK,U55,U55,U55 +QVWI,Leap-S3,YDA,4K Google TV Box QVY TV,huangshan_QVY,huangshan,QVY 4K Laser Home Theatre QWILI,pula,Pula,Pula Qilive,Europe,tamachi,Qilive FHD Android TV @@ -26612,6 +27716,11 @@ Qilive,QT201101L,QT21101L_232_EEA,QT21101L Qilive,QT2108BP,QT2108BP,QT2108BP Qilive,QT2110BP,QT2110BP,QT2110BP Qilive,QT22101B,QT22101B,QT22101B +Qilive,QT2308BK,QT2308BK,QT2308BK +Qilive,QT23109BP,QT23109BP,QT23109BP +Qilive,QT24101B,QT24101B,QT24101B +Qilive,QT24105BP,QT24105BP,QT24105BP +Qilive,QT24109B,QT24109B,QT24109B Qilive,Qilive SMART TV,marina,Qilive SMART TV Qilive,Qilive SMART TV,nagata,Qilive SMART TV Qilive,W55,W55,W55 @@ -26637,6 +27746,7 @@ Qsmart,QSmart X20,X20,QSmart X20 Qsmart,QSmart X40,X40,QSmart X40 Qsmart,QSmart i4i,i4i,QSmart i4i Qsmart,Rocket_Lite,Rocket_Lite,Rocket Lite +Qsmart,Smart 8,Smart_8,Smart 8 Qsmart,Smart HD Pro,Smart_HD_Pro,Smart HD Pro Qsmart,View,View,View Qsmart,View Max,View_Max,View Max @@ -26648,6 +27758,7 @@ Qsmart,i6i_2020,QSmart_i6i_2020,i6i 2020 Qtouch,CMC_AL10,CMC_AL10,CMC_AL10 Qtouch,Q01A,Q01A,Q01A Qtouch,Q05A,Q05A,Q05A +Qtouch,Q624,Q624,Q624 Qtouch,QS31,QS31,QS31 Qtouch,QS355,QS355,QS355 Qtouch,QS362,QS362,QS362 @@ -26720,6 +27831,7 @@ RAVOZ,RAVOZ_Z4,RAVOZ_Z4,RAVOZ_Z4 RAVOZ,RAVOZ_Z6,RAVOZ_Z6,RAVOZ_Z6 RAVOZ,RAVOZ_Z8,RAVOZ_Z8,RAVOZ Z8 RAVOZ,Z3_Lite,RAVOZ_Z3_Lite,RAVOZ Z3 Lite +RAYO_MOVIl,ATLAS 2,ATLAS_2,ATLAS 2 RAYO_MOVIl,Atlas,Atlas,Atlas RAYO_MOVIl,RAYO X1,RAYO_X1,RAYO X1 RCA, RCA RCT6716Q25,RCT6716Q25,RCT6716Q25 @@ -26763,6 +27875,9 @@ RCA,Pro10 Edition II,RCT6203W46L,RCT6203W46L RCA,Pro12,RCT6223W87,RCT6223W87 RCA,Q2,Q2,Q2 RCA,RAKR30824,RAKR30824,RAKR30824 +RCA,RATM30846,RATM30846,RATM30846 +RCA,RATM31046,RATM31046,RATM31046 +RCA,RATM3144B,RATM3144B,RATM3144B RCA,RATR30824,RATR30824,RATR30824 RCA,RATR31024,RATR31024,RATR31024 RCA,RC10T3G21,RC10T3G21,RC10T3G21 @@ -26851,6 +27966,9 @@ RCA,Smart TV,mateo,2K SA Smart TV RCA,Smart TV,osaki,2K AI Smart TV RCA,Smart TV,osaki,Treeview 2K AI Smart TV RCA,Smart TV,ueno,2K Android TV +RCA,TAB_One,TAB_One,TAB_One +RCA,TAB_One_Plus,TAB_One_Plus,TAB_One_Plus +RCA,Tab_Pro,Tab_Pro,Tab_Pro RCA,US,marina,RCA 4K SMART TV RCA,Voyager,RCT6873W42BMF8,RCT6873W42BMF8 RCA,Voyager,RCT6873W42BMF9E,RCT6873W42BMF9E @@ -26860,6 +27978,8 @@ RCA,XLD Series,XLDRCAV1,XLDRCAV1 RDP(in),TP802,TP802,TP802 REACH,Q882,Q882,Q882 REBEOSOII,C11,C11,C11 +REBEOSOII,G11,G11,G11 +REBEOSOII,P31,P31,P31 RECCO,Android TV,R1,ATV R1 RECCO,Android TV,R2,ATV R2 RED,HydrogenONE,HydrogenONE,H1A1000 @@ -27031,6 +28151,11 @@ Realtek,RealtekThor,RealtekThor,RealtekThor Realtime,RS405,RS405,RS405 Realtime,RT503,RT503,RT503 Realtime,RT8,RT8,RT8 +Rebecco,K30_EEA,K30_EEA,K30_EEA +Rebecco,K30_ROW,K30_ROW,K30_ROW +Rebecco,K50_EEA,K50_EEA,K50_EEA +Rebecco,K50_ROW,K50_ROW,K50_ROW +Rebecco,K70_EEA,K70_EEA,K70_EEA Rectron,MX101M2,MX101M2,MX101M2 Rectron,MX702M1,MX702M1,MX702M1 Red Mobile,Quick_5_0,Quick_5_0,Quick 5.0 @@ -27089,11 +28214,17 @@ Redmi,Redmi 12C,aether,22126RN91Y Redmi,Redmi 12C,earth,22120RN86G Redmi,Redmi 12C,earth,22120RN86I Redmi,Redmi 12C,earth,2212ARNC4L +Redmi,Redmi 13,moon,24040RN64Y +Redmi,Redmi 13 5G,breeze,2406ERN9CI Redmi,Redmi 13C,gale,23100RN82L Redmi,Redmi 13C,gale,23106RN0DA Redmi,Redmi 13C,gale,2311DRN14I Redmi,Redmi 13C,gust,23108RN04Y Redmi,Redmi 13C 5G,air,23124RN87I +Redmi,Redmi 13C 5G,atmos,23124RN87G +Redmi,Redmi 14C,lake,2409BRN2CY +Redmi,Redmi 14C,pond,2409BRN2CA +Redmi,Redmi 14C,pond,2409BRN2CL Redmi,Redmi 6,cereus,Redmi 6 Redmi,Redmi 7,onc,Redmi 7 Redmi,Redmi 7,onc,Redmi Y3 @@ -27135,6 +28266,9 @@ Redmi,Redmi A2+,water,23028RNCAG Redmi,Redmi A3,blue,23129RN51H Redmi,Redmi A3,blue,23129RN51X Redmi,Redmi A3,blue,2312CRNCCL +Redmi,Redmi A3x,klein,24044RN32L +Redmi,Redmi A3x,klein,24048RN6CG +Redmi,Redmi A3x,klein,24048RN6CI Redmi,Redmi K20,davinci,Mi 9T Redmi,Redmi K20,davinci,Redmi K20 Redmi,Redmi K20,davinciin,Redmi K20 @@ -27159,6 +28293,10 @@ Redmi,Redmi K60,mondrian,23013RK75C Redmi,Redmi K60 Pro,socrates,22127RK46C Redmi,Redmi K60 Ultra,corot,23078RKD5C Redmi,Redmi K60E,rembrandt,22122RK93C +Redmi,Redmi K70,vermeer,23113RKC6C +Redmi,Redmi K70 Pro,manet,23117RK66C +Redmi,Redmi K70 Ultra,rothko,2407FRK8EC +Redmi,Redmi K70E,duchamp,2311DRK48C Redmi,Redmi Note 10,camellia,M2103K19C Redmi,Redmi Note 10,sunny,M2101K7AG Redmi,Redmi Note 10,sunny,M2101K7AI @@ -27170,6 +28308,7 @@ Redmi,Redmi Note 10 Pro,sweetin,M2101K6P Redmi,Redmi Note 10 Pro Max,sweetin,M2101K6I Redmi,Redmi Note 10 pro,chopin,M2104K10AC Redmi,Redmi Note 10S,maltose,M2101K7BL +Redmi,Redmi Note 10S,rosemary,M2101K7BL Redmi,Redmi Note 10S,rosemary,M2101K7BNY Redmi,Redmi Note 10S,secret,M2101K7BG Redmi,Redmi Note 10S,secret,M2101K7BI @@ -27227,6 +28366,7 @@ Redmi,Redmi Note 13 5G,gold,2312DRAABC Redmi,Redmi Note 13 5G,gold,2312DRAABI Redmi,Redmi Note 13 5G,iron,2312DRAABG Redmi,Redmi Note 13 Pro,emerald,23117RA68G +Redmi,Redmi Note 13 Pro 5G,XIG05,XIG05 Redmi,Redmi Note 13 Pro 5G,garnet,2312CRAD3C Redmi,Redmi Note 13 Pro 5G,garnet,2312DRA50C Redmi,Redmi Note 13 Pro 5G,garnet,2312DRA50G @@ -27235,6 +28375,8 @@ Redmi,Redmi Note 13 Pro+,zircon,23090RA98C Redmi,Redmi Note 13 Pro+ 5G,zircon,23090RA98G Redmi,Redmi Note 13 Pro+ 5G,zircon,23090RA98I Redmi,Redmi Note 13 Pro+ 5G,zircon,24040RA98R +Redmi,Redmi Note 13R,breeze,2406ERN9CC +Redmi,Redmi Note 14 Pro+,amethyst,24115RA8EC Redmi,Redmi Note 7,lavender,Redmi Note 7 Redmi,Redmi Note 8,biloba,M1908C3JGG Redmi,Redmi Note 8,ginkgo,GINKGO @@ -27263,10 +28405,14 @@ Redmi,Redmi Note 9T,cannong,M2007J22G Redmi,Redmi Pad,yunluo,22081283G Redmi,Redmi Pad Pro,dizi,2405CRPFDC Redmi,Redmi Pad Pro,dizi,2405CRPFDG +Redmi,Redmi Pad Pro,dizi,2405CRPFDI Redmi,Redmi Pad Pro 5G,ruan,24074RPD2C Redmi,Redmi Pad SE,xun,23073RPBFC Redmi,Redmi Pad SE,xun,23073RPBFG Redmi,Redmi Pad SE,xun,23073RPBFL +Redmi,Redmi Pad SE 4G,spark,24076RP19I +Redmi,Redmi Pad SE 8.7,flare,24075RP89G +Redmi,Redmi Pad SE 8.7 4G,spark,24076RP19G Redmi,Redmi Turbo 3,peridot,24069RA21C Redmi,Smart TV,tarzan,MiTV-MOOQ3 Redway,redway10,redway10,redway10 @@ -27278,6 +28424,7 @@ Reeder,M10S,M10S,M10S Reeder,M10SPlus,M10SPlus,M10SPlus Reeder,M10_Blue_Max,M10_Blue_Max,M10_Blue_Max Reeder,M10_Pro_LTE,M10_Pro_LTE,M10 Pro LTE +Reeder,M11_Pro_Max,M11_Pro_Max,M11_Pro_Max Reeder,M7 Plus,reeder_M7Plus,M7Plus Reeder,M7Go_2019,M7Go_2019,M7Go_2019 Reeder,M7S,M7S,M7S @@ -27323,10 +28470,14 @@ Reeder,S19 Max 32GB,S19_Max_32GB,S19 Max 32GB Reeder,S19 Max 64GB,S19_Max_64GB,S19 Max 64GB Reeder,S19 Max Pro,S19_Max_Pro,S19 Max Pro Reeder,S19 Max Pro S,S19_Max_Pro_S,S19 Max Pro S +Reeder,S19 Max Pro S 108 MP,S19_Max_Pro_S_108_MP,S19 Max Pro S 108 MP Reeder,S19 Max Pro S Edge,S19MaxProSEdge,S19 Max Pro S Edge Reeder,S19 MaxL 128GB,S19_MaxL_128GB,S19 MaxL 128GB +Reeder,S19_Max_2_128GB,S19_Max_2_128GB,S19 Max 2/128GB Reeder,S19 Max Pro S Zoom,S19_Max_Pro_S_Zoom,S19 Max Pro S Zoom Reeder,S23 Pro Max,S23_Pro_Max,S23 Pro Max +Reeder,S53,S53,S53 +Reeder,S71,S71,S71 Reeder,T8,reeder_T8,reeder_T8 Reeder,Turkcell_T_Tablet,Turkcell_T_Tablet,Turkcell_T_Tablet Reeder,reeder M10 Plus,reeder_M10_Plus,reeder_M10 Plus @@ -27347,7 +28498,19 @@ Reliance,RC501L,RC501L,RC501L Reliance,RC555L,RC555L,RC555L Reliance,RC608L,RC608L,RC608L Reliance,Smartphone JS LS-5010,LS-5010,LS-5010 +Relndoo,P60_EEA,P60_EEA,P60 +Relndoo,T10P,T10P,T10P +Relndoo,T10P_ROW,T10P_ROW,T10P +Relndoo,T618,T618,T618 +Relndoo,T618_WIFI,T618_WIFI,T618 +Relndoo,T618_WIFI_EEA,T618_WIFI_EEA,T618 +Relndoo,T88,T88,T88 +Relndoo,TAB10,TAB10,TAB10 +Relndoo,TAB10_EEA,TAB10_EEA,TAB10 +Relndoo,TAB10_ROW,TAB10_ROW,TAB10 Relndoo,TB02,TB02,TB02 +Relndoo,TB02_E,TB02_E,TB02_E +Relndoo,TB02_ROW,TB02_ROW,TB02 Remdun,RD-52,RD52,RD52 Remdun,RD115MQ,RD115MQ,RD115MQ Remdun,RD115MQE,RD115MQE,RD115MQE @@ -27381,6 +28544,7 @@ Remdun,RD895TE,RD895TE,RD895TE Remdun,t8332_T10_64_k419,t8332_T10_64_k419,t8332_l40mmeiw_T10_64_k419 Renault,OpenR Link,aivi2_full,AIVI2 FULL Renault,OpenR Link,aivi2_r_full_dom,AIVI2 R FULL DOM +RetroidPocket,4Pro,4Pro,Retroid Pocket 4 Pro Reveal 16i,rk3399_rvlEEA_box,rk3399_reveal16i_box,Reveal 16i Reveal 16i,rk3399_rvl_box,rk3399_reveal16i_box,Reveal 16i Revko,BE XL,BE_xl,BE_xl @@ -27403,6 +28567,7 @@ Rhino,RHINO T5se,atom,T5se Rhino,RHINO T8,Rhino_T8,T8 Rhino,RHINO T80,scout,T80 Rhino,T8,Rhino_T8,T8 +Ricoh,AXX10,AXX10,AXX10 RiksTV,SRT412,HP40A3,SRT412 Rindo,R-32B6600,ikebukuro,AI PONT Rindo,RINDO 2K Android TV,lasalle,RINDO 2K Android TV @@ -27423,8 +28588,8 @@ Rizzen,NovaTab_R10,NovaTab_R10,NovaTab_R10 Rizzen,NovaTab_R10s,NovaTab_R10s,R10s Rizzen,S1,S1,S1 Rizzen,X1,X1,X1 +Rizzen,X1x,X1x,X1x RoadQuest,RoadQuest,RQ-G,RQ-G -RockTek,Gretzky,TSA,TVDongle RockTek,RT-G1,RTBox,RT-G1 Rockcel,Quartzo UP,Quartzo_UP,Quartzo UP Rockcel,Quartzo Up,Quartzo_up,Quartzo_up @@ -27466,6 +28631,7 @@ Ruggear,RG750,RG750_ROW,RG750 Ruggear,RG760,RG760,RG760 Ruggear,RG850,RG850,RG850 Ruggear,RG880,RG880,RG880 +Ruggear,RG880i,RG880i,RG880i Ruggear,RG910,RG910,RG910 Ruggear,RG930i,RG930i,RG930i Ruggear,RG935,RG935,RG935 @@ -27491,6 +28657,8 @@ Ruio,S6506,S6506,S6506 Rumie,RT-1708,RT-1708,RT-1708 Runbo,F1Plus,F1Plus,F1Plus Russound,XTS7,XTS7,XTS7 +Ruufuuxy,R16Max,R16Max,R16Max +Ruufuuxy,R16Plus,R16Plus,R16Plus S Vision,AP,stanford,2K SMART TV S Vision,"AUSTRALIA, JAPAN, EUROPE",guandu,SVISION 4K Android TV S Vision,Australia,nippori,Svision Android TV 2K @@ -27555,17 +28723,24 @@ SCHNEIDER,Wave 3,Wave_3,Wave 3 SCIENTIA,BBT1019863,BBT1019863,BBT1019863 SCIENTIA,eWs10164T,eWs10164T,eWs10164T SCV Infinity,SCVinfi 4K,SEI630SCV,SCVinfi 4K +SEBBE,S21,S21,S21_US +SEBBE,S21_EEA,S21_EEA,S21_EEA SEBBE,S22-EEA,S22-EEA,S22-EEA SEBBE,S22-US,S22-US,S22-US SEBBE,S22_EEA,S22_EEA,S22_EEA SEBBE,S22_M_EEA,S22_M_EEA,S22_M_EEA SEBBE,S22_M_US,S22_M_US,S22_M_US +SEBBE,S22_T_EEA,S22_T_EEA,S22_T_EEA +SEBBE,S22_T_US,S22_T_US,S22_T_US SEBBE,S22_US,S22_US,S22_US SEBBE,S23_EEA,S23_EEA,S23_EEA SEBBE,S23_EEA_A,S23_EEA_A,S23_EEA_A SEBBE,S23_M_US,S23_M_US,S23_M_US +SEBBE,S23_T_EEA,S23_T_EEA,S23_T_EEA +SEBBE,S23_T_US,S23_T_US,S23_T_US SEBBE,S23_US,S23_US,S23_US SEBBE,S23_US_B,S23_US_B,S23_US_B +SEBBE,S23_U_EEA,S23_U_EEA,S23_U_EEA SEBBE,S23_U_US,S23_U_US,S23_U_US SED Wireless,GPH-650R,SPH_650R,GPH-650R SELECLINE,MID7526CM,MID7526CM,NID_7010 @@ -27576,6 +28751,8 @@ SEMP TCL,GO3C_Plus_VIVO,GO3C_Plus,GO3C Plus SEMP TCL,GO3C_VIVO,GO3C,GO3C SEMP TCL,GO3E,GO3E,GO3E SEMP TCL,GO5E,GO5E,GO5E +SENRAISE,H10,H10,H10 +SENRAISE,H10_EEA,H10,H10 SENSE,TW102,TW102,TW102 SENSETALK,ACM-T01K,ACM-T01K,ACM-T01K SERVO,P20,P20,P20 @@ -27602,6 +28779,13 @@ SGIN,M806BW6,M806BW6,M806BW6 SGIN,SGIN_E10M,SGIN_E10M,SGIN_E10M SGIN,SGIN_X10,SGIN_X10,SGIN_X10 SGIN,SGIN_X10_EEA,SGIN_X10_EEA,SGIN_X10_EEA +SGIN,T10S,T10S,T10S +SGIN,T10S_EEA,T10S,T10S +SGIN,T12S,T12S,T12S +SGIN,T12S_EEA,T12S_EEA,T12S_EEA +SGIN,T12S_ROW,T12S_ROW,T12S_ROW +SGIN,T12_EEA,T12_EEA,T12_EEA +SGIN,T12_ROW,T12_ROW,T12_ROW SGINO,6S,6S,6S SGINO,CP093,CP093,CP093 SGINO,SGINO6,SGINO6,SGINO6 @@ -27647,6 +28831,7 @@ SK broadband,AI2,BIP-AI100,BIP-AI100 SK broadband,AI2 ATV,INTEKS21SI,BID-AI100 SK broadband,BFX-AT100,BFX-AT100,BFX-AT100 SK broadband,BKO-UC500,K1100UA,BKO-UC500 +SK broadband,BMA-AI100,BMA-AI100,BMA-AI100 SK broadband,PlayZ,BIP-EB100,BIP-EB100 SK broadband,SMART3,INTEKS20SI,BID-AT200 SK broadband,Smart3 Mini,BIP-UW200,BIP-UW200 @@ -27657,6 +28842,9 @@ SKY EVO,Elite OctaPlus,Elite_OctaPlusa2,Elite OctaPlus SKY EVO,Elite OctaX,Elite_OctaXK2,Elite OctaX SKY EVO,Elite_OctaXS,Elite_OctaXS,Elite_OctaXS SKY EVO,SA100,HY40A,SA100 +SKY Perfect JSAT,SKP-IS401,SKP-IS401,SKP-IS401 +SKYEGG,K13_EEA,K13_EEA,K13_EEA +SKYEGG,K13_US,K13_US,K13_US SKY_Brasil,Sky Brazil,usw8052skb,SKR02 SMART Technologies,AM60 series,komodo,AM60 series SMART Technologies,AM60 series,komodo,SMART AM60 @@ -27665,8 +28853,11 @@ SMART Technologies,SMART AMG series,komodo,SMART AMG1 SMART Technologies,SMART Board MX Series (V5),groundhog,SMART Board MX Series (V5) SMART Technologies,SMART Board® RX Series,groundhog,SMART Board Interactive Display SMART_KASSEL,ARGENTINA,SK3402,SK3402 +SMART_KASSEL,SK-5503AR,SK-5503AR,SK-5503AR SMART_KASSEL,SK3403,SK3403,SK3403 SMART_KASSEL,SK3404,SK3404,SK3404 +SMART_KASSEL,SK3405,SK3405,SK3405 +SMART_KASSEL,SK3501,SK3501,SK3501 SMART_KASSEL,SK5501,SK5501,SK5501 SMART_KASSEL,SK5502,SK5502,SK5502 SMB Gadgets,SMB8112BK,SMB8112BK,SMB8112BK @@ -27688,6 +28879,7 @@ SOHO STYLE,SS5424G,SS5424G,SS5424G SOHO STYLE,SS5514G,SS5514G,SS5514G SOHO STYLE,SS5524G,SS5524G,SS5524G SOHO STYLE,SS5539G,SS5539G,SS5539G +SOHO STYLE,SS650G,SS650G,SS650G SOLO,Inspire_U5,Inspire_U5,Inspire_U5 SOLO,Inspire_U5_PLUS,Inspire_U5_PLUS,Inspire_U5_PLUS SORIANA,BE_ets,BE_ets,BE_ets @@ -27708,6 +28900,8 @@ SPC,GRAVITY_3,GRAVITY_3,GRAVITY_3 SPC,GRAVITY_3_MINI,GRAVITY_3_MINI,GRAVITY_3_MINI SPC,GRAVITY_3_PRO,GRAVITY_3_PRO,GRAVITY 3 PRO SPC,GRAVITY_3_SE,GRAVITY_3_SE,GRAVITY_3_SE +SPC,GRAVITY_4,GRAVITY_4,GRAVITY_4 +SPC,GRAVITY_4_PLUS,GRAVITY_4_PLUS,GRAVITY_4_PLUS SPC,GRAVITY_5_EEA,GRAVITY_5_EEA,GRAVITY_5_EEA SPC,GRAVITY_5_PRO,GRAVITY_5_PRO,GRAVITY 5 PRO SPC,GRAVITY_5_SE_EEA,GRAVITY_5_SE_EEA,GRAVITY 5 SE @@ -27723,6 +28917,7 @@ SPC,SMART_PRO,SMART_PRO,SMART_PRO SPC,SMART_PRO,SMART_PRO_EEA,SMART_PRO SPC,SMART_ULTIMATE,SMART_ULTIMATE,SMART_ULTIMATE SPC,US,martin,SPC Android Monitor +SPC,WUUM S,Discovery,Discovery SPC Mobile,APOLO,APOLO,APOLO SPC Mobile,GRAVITY-2-MAX,GRAVITY-2-MAX,GRAVITY-2-MAX SPC Mobile,GRAVITY2-4G,GRAVITY2-4G,GRAVITY2-4G @@ -27788,9 +28983,12 @@ SPJtv,Android TV,R1,ATV R1 SPJtv,Android TV,R2,ATV R2 SPJtv,R3,R3,R3 SPJtv,R4,R4,R4 +SPRANGE,Sprange_L8,Sprange_L8,Sprange_L8 SPURT,Spurt_K800,Spurt_K800,Spurt K800 SQ(max),Hope10_Max,Hope10_Max,Hope10 Max SQ(max),Hope8_Max,Hope8_Max,Hope8_Max +SSA-Digital,MID-1015T,MID-1015T,MID-1015T +SSA-Digital,MID-1016T,MID-1016T,MID-1016T SSA-Digital,MID736-737,MID736-737,MID736-737 SSB PHONES,AMS5118R_GO,AMS5118R_GO,AMS5118R_GO SSB PHONES,AMS5518R,AMS5518R,AMS5518R @@ -27827,9 +29025,11 @@ SSmooth,Smooth_5,SSmooth_5,Smooth 5.0 SSmooth,Smooth_8GT,Smooth_8GT,Smooth 8GT SSmooth,Vision,Vision,Vision SSmooth,Vision Plus,Vision_Plus,Vision Plus +STARK_FUTURE,ARKENSTONE,ARKENSTONE,ARKENSTONE STARK_FUTURE,VARG,VARG,VARG STARSHINE,STARSHINE,mountbaker,2K SMART TV STARSHINE,STARSHINE 2K Google TV,capitolhill,STARSHINE 2K Google TV +START,SH4651,SH4651,SH4651 STARTMOBIS,START24,START24,START24 STE (A),S11,S11,S11 STF Mobile,AERIAL,STFAERIAL,AERIAL @@ -27903,6 +29103,8 @@ STK(Santok),Transporter 1,STK_Transporter_1,STK_Transporter_1 STK(Santok),X3,X3,X3 STK(Santok),cayenne,cayenne,STK Ace STboard,HJ_TD,HJ_TD,HJ_TD +SUAAT,S3_EEA,S3_EEA,S3_EEA +SUAAT,S3_US,S3_US,S3_US SUNMAX,Model 6 Pro Max 4G,Model_6_Pro_Max_4G,Model_6_Pro_Max_4G SUNMAX,Model D,Model_D,Model D SUNMAX,Model E,Model_E,Model E @@ -27928,6 +29130,8 @@ SUNMAX,SP125D_2,SP125D_2,SP125D_2 SUNMAX,Sunmax Model Tab 10,Sunmax_Model_Tab_10,Sunmax Model Tab 10 SUNMAX,Tab_6,Tab_6,Tab_6 SUNPHONE,L4,L4,L3 +SUNTAK,MOJO,MOJO,MOJO +SUNTAK,MOX 2,MOX_2,MOX_2 SUNWIND,SKY 9 E201 3G,SS9237MG,SKY 9 E201 3G SS9237MG SUNWIND,SKY_9_A102_3G,SS9236PG,SKY 9 A102 3G SS9236PG SUNWIND,SS1270PL,SS1270PL,Sky 1430D 4G SS1270PL @@ -27953,11 +29157,17 @@ SUPERSONIC,SC_3110,SC_3110,SC-3110 SUPERSONIC,SC_4317,SC_4317,SC_4317 SUPERSONIC,SC_4317BT,SC_4317BT,SC_4317BT SUPERSONIC,SC_774KT,SC_774KT,SC_774KT +SUPERSONIC,SC_779KT,SC_779KT,SC-779KT SUPERSONIC,Smart TV,kanda,SUPERSONIC 2K Smart TV SUPERSONIC,Smart TV,mateo,2K US Smart TV SUPERSONIC,TAB7091,TAB7091,TAB7091 SUPERSONIC,USA,yeongdeungpo,SUPERSONIC UHD Android TV SUPOIN,S66,S66,S66 +SUXI,T700,T700,T700 +SUXI,T900,T900,T900 +SVITOO,P08,P08,P08 +SWACONNECT,SWA310,SWA310,SWA310 +SWACONNECT,SWA310_NEU,SWA310,SWA310 SWTV,Asia,SW3_ATV,SWTV SWTV,Europe,SW3H_ATV,SWTV SWTV,North America,SW3_ATV,SWTV @@ -27982,6 +29192,7 @@ SWTV,SWTV-21AE,sunnyvale,SWTV-21AE SWTV,SWTV-21SA,sunnyvale,SWTV-21SA SWTV,SWTV-22AE,SW6H,SWTV-22AE SWTV,SWTV-22AE-4K,anaheim,SWTV-22AE-4K +SWTV,SWTV-22AE-4K NF,anaheim,SWTV-22AE-4K NF SWTV,SWTV-22AE-FHD,umeda,SWTV-22AE-FHD SWTV,SWTV-22COL-4K,anaheim,SWTV-22COL-4K SWTV,SWTV-22HK-4K,anaheim,SWTV-22HK-4K @@ -28013,6 +29224,7 @@ SYLVOX,Smart TV 2K-B,lasalle,Smart TV 2K-B SYLVOX,Smart TV 4K,kenton,Smart TV 4K SYLVOX,Smart TV 4K-A,kenton,Smart TV 4K-A SYLVOX,Smart TV 4K-B,kenton,Smart TV 4K-B +SYMFONY,TAB_105,TAB_105,SYMFONY TAB 105 SZSUPER,KIDS05-X5,KIDS05-X5,KIDS05-X5 Safaricom,NEON LITE,NEON_LITE,NEON LITE Safaricom,NEON PLUS,NEON_PLUS,NEON PLUS @@ -28026,12 +29238,13 @@ Safaricom,NEON_RAY,NEON_RAY,NEON_RAY Safaricom,NEON_RAY_2,NEON_RAY_2,NEON RAY 2 Safaricom,NEON_RAY_PRO,NEON_RAY_PRO,NEON_RAY_PRO Safaricom,Neon Storm,Neon_Storm,Neon Storm +Safaricom,Neon_Smarta_2,Neon_Smarta_2,Neon Smarta 2 Safaricom,SFCSTB2LITE,SFCSTB2LITE,SFCSTB2LITE Safaricom,Safaricom ET Kimem,Safaricom_ET_Kimem,Safaricom ET Kimem SafeGear_Mobile,SG390,SG390,SG390 Sagemcom,Wibox,dtiw384wb,m384wb -Sagemcom,polsat soundbox 4K,m391_polsat,polsat soundbox 4K Saltillo,CF10,CF10,CF10 +Samsonix,A1250,A1250,A1250 Samsung,,GT-I5510M,GT-I5510M Samsung,,GT-I5510T,GT-I5510T Samsung,,GT-I5800L,GT-I5800L @@ -28160,6 +29373,8 @@ Samsung,Galaxy A05,a05m,SM-A055M Samsung,Galaxy A05s,a05s,SM-A057F Samsung,Galaxy A05s,a05s,SM-A057G Samsung,Galaxy A05s,a05s,SM-A057M +Samsung,Galaxy A06,a06,SM-A065F +Samsung,Galaxy A06,a06,SM-A065M Samsung,Galaxy A10,a10,SM-A105F Samsung,Galaxy A10,a10,SM-A105FN Samsung,Galaxy A10,a10,SM-A105G @@ -28803,6 +30018,7 @@ Samsung,Galaxy Express,expressziglteatt,SAMSUNG-SGH-I437Z Samsung,Galaxy Express2,wilcoxlte,SM-G3815 Samsung,Galaxy F02s,a02q,SM-E025F Samsung,Galaxy F04,m04,SM-E045F +Samsung,Galaxy F05,a05m,SM-E055F Samsung,Galaxy F12,f12,SM-F127G Samsung,Galaxy F13,m13,SM-E135F Samsung,Galaxy F14,a05s,SM-E145F @@ -29202,6 +30418,7 @@ Samsung,Galaxy M02,a02,SM-M022G Samsung,Galaxy M02,a02,SM-M022M Samsung,Galaxy M02s,a02q,SM-M025F Samsung,Galaxy M04,m04,SM-M045F +Samsung,Galaxy M05,a05m,SM-M055F Samsung,Galaxy M10,m10lte,SM-M105F Samsung,Galaxy M10,m10lte,SM-M105G Samsung,Galaxy M10,m10lte,SM-M105M @@ -29218,7 +30435,6 @@ Samsung,Galaxy M13,m13,SM-M135M Samsung,Galaxy M13 5G,a13x,SM-M136B Samsung,Galaxy M14,a05s,SM-M145F Samsung,Galaxy M14 5G,m14x,SM-M146B -Samsung,Galaxy M15 5G,m15x,SM-E156B Samsung,Galaxy M15 5G,m15x,SM-M156B Samsung,Galaxy M20,m20,SM-M205N Samsung,Galaxy M20,m20lte,SM-M205F @@ -29255,6 +30471,7 @@ Samsung,Galaxy M53 5G,m53x,SM-M536B Samsung,Galaxy M54 5G,m54x,SM-M546B Samsung,Galaxy M55 5G,m55xq,SM-M556B Samsung,Galaxy M55 5G,m55xq,SM-M556E +Samsung,Galaxy M55s 5G,m55xq,SM-M558B Samsung,Galaxy M62,m62,SM-M625F Samsung,Galaxy Mega 2,mega23g,SM-G750H Samsung,Galaxy Mega 5.8,crater,GT-I9152 @@ -29648,6 +30865,7 @@ Samsung,Galaxy Q,SGH-T589W,SGH-T589W Samsung,Galaxy Quantum2,a82xq,SM-A826S Samsung,Galaxy Quantum3,m53x,SM-M536S Samsung,Galaxy Quantum4,a54x,SM-A546S +Samsung,Galaxy Quantum5,a55x,SM-A556S Samsung,Galaxy R-Style,jaguark,SHV-E170K Samsung,Galaxy R-Style,jaguarl,SHV-E170L Samsung,Galaxy R-Style,jaguars,SHV-E170S @@ -29907,6 +31125,13 @@ Samsung,Galaxy S24,e1q,SM-S921U1 Samsung,Galaxy S24,e1q,SM-S921W Samsung,Galaxy S24,e1s,SM-S921B Samsung,Galaxy S24,e1s,SM-S921N +Samsung,Galaxy S24 FE,r12s,SM-S7210 +Samsung,Galaxy S24 FE,r12s,SM-S721B +Samsung,Galaxy S24 FE,r12s,SM-S721N +Samsung,Galaxy S24 FE,r12s,SM-S721Q +Samsung,Galaxy S24 FE,r12s,SM-S721U +Samsung,Galaxy S24 FE,r12s,SM-S721U1 +Samsung,Galaxy S24 FE,r12s,SM-S721W Samsung,Galaxy S24 Ultra,SC-52E,SC-52E Samsung,Galaxy S24 Ultra,SCG26,SCG26 Samsung,Galaxy S24 Ultra,e3q,SM-S9280 @@ -30497,6 +31722,14 @@ Samsung,Galaxy Tab S 8.4,klimtlte,SM-T705C Samsung,Galaxy Tab S 8.4,klimtlte,SM-T705Y Samsung,Galaxy Tab S 8.4,klimtltevzw,SM-T707V Samsung,Galaxy Tab S 8.4,klimtwifi,SM-T700 +Samsung,Galaxy Tab S10 Ultra,gts10uwifi,SM-X920 +Samsung,Galaxy Tab S10 Ultra 5G,gts10u,SM-X926B +Samsung,Galaxy Tab S10 Ultra 5G,gts10u,SM-X926C +Samsung,Galaxy Tab S10 Ultra 5G,gts10u,SM-X926N +Samsung,Galaxy Tab S10+,gts10pwifi,SM-X820 +Samsung,Galaxy Tab S10+ 5G,gts10p,SM-X826B +Samsung,Galaxy Tab S10+ 5G,gts10p,SM-X826N +Samsung,Galaxy Tab S10+ 5G,gts10p,SM-X828U Samsung,Galaxy Tab S2,gts210lte,SM-T815 Samsung,Galaxy Tab S2,gts210lte,SM-T815C Samsung,Galaxy Tab S2,gts210lte,SM-T815Y @@ -30807,6 +32040,12 @@ Samsung,Galaxy W,GT-I8150B,GT-I8150B Samsung,Galaxy W,GT-I8150T,GT-I8150T Samsung,Galaxy W,SGH-T679M,SGH-T679M Samsung,Galaxy W,q7lteskt,SM-T255S +Samsung,Galaxy Watch FE,lucky7bs,SM-R861 +Samsung,Galaxy Watch FE,lucky7us,SM-R866U +Samsung,Galaxy Watch Ultra,projectx2ul,SM-L7050 +Samsung,Galaxy Watch Ultra,projectx2ul,SM-L705F +Samsung,Galaxy Watch Ultra,projectx2ul,SM-L705N +Samsung,Galaxy Watch Ultra,projectx2ul,SM-L705U Samsung,Galaxy Watch4,freshbl,SM-R870 Samsung,Galaxy Watch4,freshbs,SM-R860 Samsung,Galaxy Watch4,freshul,SM-R875F @@ -30855,11 +32094,21 @@ Samsung,Galaxy Watch6 Classic,wise6ul,SM-R965U Samsung,Galaxy Watch6 Classic,wise6us,SM-R955F Samsung,Galaxy Watch6 Classic,wise6us,SM-R955N Samsung,Galaxy Watch6 Classic,wise6us,SM-R955U +Samsung,Galaxy Watch7,fresh7bl,SM-L310 +Samsung,Galaxy Watch7,fresh7bs,SM-L300 +Samsung,Galaxy Watch7,fresh7ul,SM-L3150 +Samsung,Galaxy Watch7,fresh7ul,SM-L315F +Samsung,Galaxy Watch7,fresh7ul,SM-L315N +Samsung,Galaxy Watch7,fresh7ul,SM-L315U +Samsung,Galaxy Watch7,fresh7us,SM-L305F +Samsung,Galaxy Watch7,fresh7us,SM-L305N +Samsung,Galaxy Watch7,fresh7us,SM-L305U Samsung,Galaxy Wide,on7nlteskt,SM-G600S Samsung,Galaxy Wide2,j7popelteskt,SM-J727S Samsung,Galaxy Wide3,j7toplteskt,SM-J737S Samsung,Galaxy Wide4,a20,SM-A205S Samsung,Galaxy Wide5,f42x,SM-E426S +Samsung,Galaxy Wide7,m15x,SM-M156S Samsung,Galaxy Win,delos3gcmcc,GT-I8558 Samsung,Galaxy Win,delos3gduosctc,SCH-I869 Samsung,Galaxy Win,delos3geur,GT-I8552 @@ -30973,6 +32222,15 @@ Samsung,Galaxy Z Flip5,b5q,SM-F731Q Samsung,Galaxy Z Flip5,b5q,SM-F731U Samsung,Galaxy Z Flip5,b5q,SM-F731U1 Samsung,Galaxy Z Flip5,b5q,SM-F731W +Samsung,Galaxy Z Flip6,SC-54E,SC-54E +Samsung,Galaxy Z Flip6,SCG29,SCG29 +Samsung,Galaxy Z Flip6,b6q,SM-F7410 +Samsung,Galaxy Z Flip6,b6q,SM-F741B +Samsung,Galaxy Z Flip6,b6q,SM-F741N +Samsung,Galaxy Z Flip6,b6q,SM-F741Q +Samsung,Galaxy Z Flip6,b6q,SM-F741U +Samsung,Galaxy Z Flip6,b6q,SM-F741U1 +Samsung,Galaxy Z Flip6,b6q,SM-F741W Samsung,Galaxy Z Fold2 5G,f2q,SM-F9160 Samsung,Galaxy Z Fold2 5G,f2q,SM-F916B Samsung,Galaxy Z Fold2 5G,f2q,SM-F916N @@ -31005,6 +32263,15 @@ Samsung,Galaxy Z Fold5,q5q,SM-F946Q Samsung,Galaxy Z Fold5,q5q,SM-F946U Samsung,Galaxy Z Fold5,q5q,SM-F946U1 Samsung,Galaxy Z Fold5,q5q,SM-F946W +Samsung,Galaxy Z Fold6,SC-55E,SC-55E +Samsung,Galaxy Z Fold6,SCG28,SCG28 +Samsung,Galaxy Z Fold6,q6q,SM-F9560 +Samsung,Galaxy Z Fold6,q6q,SM-F956B +Samsung,Galaxy Z Fold6,q6q,SM-F956N +Samsung,Galaxy Z Fold6,q6q,SM-F956Q +Samsung,Galaxy Z Fold6,q6q,SM-F956U +Samsung,Galaxy Z Fold6,q6q,SM-F956U1 +Samsung,Galaxy Z Fold6,q6q,SM-F956W Samsung,Galaxy player 70 Plus,YP-GB70D,YP-GB70D Samsung,Galaxy view,gvltektt,SM-T677NK Samsung,Galaxy view,gvltelgt,SM-T677NL @@ -31047,6 +32314,7 @@ Samsung,SM-W2018,kellyltechn,SM-W2018X Samsung,Samsung Interactive Display,SAMSUNG_INTERACTIVE_DISPLAY,WA65D Samsung,Samsung Interactive Display,SAMSUNG_INTERACTIVE_DISPLAY,WA75D Samsung,Samsung Interactive Display,SAMSUNG_INTERACTIVE_DISPLAY,WA86D +Samsung,Samsung WAF,SAMSUNG_INTERACTIVE_DISPLAY,WAF Samsung,Sidekick,SGH-T839,SGH-T839 Samsung,Transfix,SCH-R730,SCH-R730 Samsung,Transform,SPH-M920,SPH-M920 @@ -31157,6 +32425,7 @@ Seiki,North America,hongik,Seiki Android TV Seiki,North America,uguisudani,Seiki Android TV 2K Seleco,Seleco 2K Smart TV,beaudry,Seleco AndroidTV Seleco,Seleco 4K Smart TV,barking,Seleco AndroidTV +Selectron,T101G,T101G,T101G Selectron,T856G,T856G,T856G Selfix,ES733,ES733,ES733 Selfix,SELFIX_ES732_EXPERIUS,EXPERIUS,SELFIX_ES732_EXPERIUS @@ -31171,6 +32440,7 @@ Semeakoko,S-764,S-764,S-764 Semeakoko,SS1010,SS1010,SS1010 Semeakoko,SS10A,SS10A,SS10A Semeakoko,SS10A_EEA,SS10A_EEA,SS10A_EEA +SenlinTech,pad6_EEA,pad6_EEA,pad6_EEA Senseit,A109,SENSEIT_A109,SENSEIT_A109 Senseit,C205,C205,C205 Senseit,L301,SENSEIT-L301,SENSEIT L301 @@ -31245,6 +32515,7 @@ Sharp,4T-C**DL1/DJ1/DQ1/DN2,tcve2uj,AQUOS-TVJ21-2 Sharp,4T-C**DS1/DN1/DP1,tcvenuj,AQUOS-TVJ21 Sharp,4T-C**EN1/EQ1/ES1/EU1/EP1/FN1,tcvenruj,AQUOS-4KTVJ22 Sharp,4T-C**EN2/EL1/EQ2/FN2/FL1,tcvenruj,AQUOS-4KTVJ22-2 +Sharp,4T-C**GL1/GJ1/GJ2,awaroa,AQUOS-4KTVJ24-2 Sharp,4T-C**GP1/GS1/GQ1/GN1,tcmar1uj,AQUOS-4KTVJ23-1 Sharp,4T-C**GP2/GQ2/GN2,tcmar1uj,AQUOS-4KTVJ23-2 Sharp,4T-C50AG1T,LCD_50FOCAG1T,LCD_50FOCAG1T @@ -31360,6 +32631,9 @@ Sharp,AQUOS R8,SH-52D,SH-52D Sharp,AQUOS R8 pro,Kamille,A301SH Sharp,AQUOS R8 pro,Kamille,SH-R80P Sharp,AQUOS R8 pro,SH-51D,SH-51D +Sharp,AQUOS R9,Orga,A401SH +Sharp,AQUOS R9,Orga,SH-M28 +Sharp,AQUOS R9,SH-51E,SH-51E Sharp,AQUOS SERIE SHL25,SHL25,SHL25 Sharp,AQUOS SERIE SHV32,SHV32,SHV32 Sharp,AQUOS SERIE SHV34,SHV34,SHV34 @@ -31451,6 +32725,13 @@ Sharp,AQUOS wish3,SX3,A302SH-s Sharp,AQUOS wish3,SX3,A303SH Sharp,AQUOS wish3,SX3,A303SH-y Sharp,AQUOS wish3,SX3,SH-M25 +Sharp,AQUOS wish4,JUD,SHG13 +Sharp,AQUOS wish4,SH-52E,SD0L4 +Sharp,AQUOS wish4,SH-52E,SH-52E +Sharp,AQUOS wish4,SX4,A402SH +Sharp,AQUOS wish4,SX4,A403SH +Sharp,AQUOS wish4,SX4,SH-M27 +Sharp,AQUOS wish4,SX4,SM0L4 Sharp,AQUOS zero,SG801SH,801SH Sharp,AQUOS zero,SH-Z10,SH-Z10 Sharp,AQUOS zero,SH-Z10A,SH-Z10A @@ -31704,6 +32985,7 @@ Sharp,シンプルスマホ3,SG509SH,509SH Sharp,シンプルスマホ4,SG704SH,704SH Sharp,シンプルスマホ5,OI6,A001SH Sharp,シンプルスマホ6,Levil,A201SH +Sharp,シンプルスマホ7,Levil5,A404SH Sharp,ロボホン,SR01MW,SR01MW Sharp,ロボホン,SR02MW,SR02MW Sharp,ロボホン,SRX002,SRX002 @@ -31757,6 +33039,7 @@ Sigma Mobile,X-treme PQ36,X-treme_PQ36,X-treme_PQ36 Sigma Mobile,X-treme PQ38,X_treme_PQ38,X-TREME_PQ38 Sigma Mobile,X-treme PQ53,X-treme_PQ53,X-treme PQ53 Sigma Mobile,X-treme PQ54,X-treme_PQ54,X-treme_PQ54 +Sigma Mobile,X-treme PQ57,X-treme_PQ57,X-treme PQ57 Sigma Mobile,X-treme_PQ18,X-treme_PQ18,X-treme_PQ18 Sigma Mobile,X-treme_PQ54 MAX,X-treme_PQ54_MAX,X-treme_PQ54 MAX Sigma Mobile,X-treme_PQ55,X-treme_PQ55,X-treme PQ55 @@ -31803,6 +33086,7 @@ SimiMobile,S507,S507,S507 SimiMobile,S630,S630,S630 SimiMobile,S630M,S630M,S630M SimiMobile,S8001,S8001,S8001 +Simplytab,S-101TAB,S-101TAB,S-101TAB Singer,Android TV,R1,ATV R1 Singer,Android TV,R2,ATV R2 Singer,R3,R3,R3 @@ -31826,6 +33110,7 @@ Singtech,S2 Pro,S2_Pro,S2 Pro Singtech,SAPPHIRE H51,H51,H51 Singtech,Z500,Z500,Z500 Singtech,i-Tab Mini 3,iTab,i-Tab Mini 3 +Singtel TV,VIP7702,f561,VIP7702 SinoGNSS,R60 Data Collector,R60,R60 Sintel,SINTEL-X1,SINTEL_X1,SINTEL-X1 Siragon,SA,zhongshan,SMART TV @@ -31842,6 +33127,8 @@ Siragon,SP-6100,SP-6100,SP-6100 Siragon,SP-6150,SP-6150,SP-6150 Siragon,SP-7050,SP-7050,SP-7050 Siragon,SP-7100,SP-7100,SP-7100 +Siragon,SP_7250,SP_7250,SP_7250 +Siragon,SP_7275,SP_7275,SP_7275 Siragon,Siragon,hongkong,4K SMART TV Siragon,Siragon,mountbaker,2K SMART TV Siragon,Siragon_SP_7200,Siragon_SP_7200,Siragon_SP_7200 @@ -31879,6 +33166,8 @@ Sky Devices,ELITE_P55US,ELITE_P55US,Elite P55 Sky Devices,Elite 45T,Elite_45SM,Elite 45T Sky Devices,Elite 45T,Elite_45T,Elite 45T Sky Devices,Elite 5T,Elite_5T_GT,Elite 5T +Sky Devices,Elite 63Pro,Elite_63Pro,Elite 63Pro +Sky Devices,Elite 65Pro,Elite_65Pro,Elite 65Pro Sky Devices,Elite 6Max,Elite_6Max,Elite 6Max Sky Devices,Elite A5,BITA_5,Elite A5 Sky Devices,Elite A5,Elite_A5,Elite A5 @@ -31940,6 +33229,7 @@ Sky Devices,Elite OctaMax,Elite_OctaMaxom,Elite OctaMax Sky Devices,Elite OctaX,Elite_OctaX,Elite OctaX Sky Devices,Elite OctaX,Elite_OctaXK,Elite OctaX Sky Devices,Elite P5,Elite_P5,Elite P5 +Sky Devices,Elite P55Pro,Elite_P55Pro,Elite P55Pro Sky Devices,Elite R55,Elite_R55,Elite R55 Sky Devices,Elite T10,Elite_T10,Elite T10 Sky Devices,Elite T10,Elite_T10A,Elite T10 @@ -31970,6 +33260,7 @@ Sky Devices,Elite_OctaX,Elite_OctaXkk3,Elite OctaX Sky Devices,Elite_P55,Elite_P55,Elite P55 Sky Devices,Elite_PAD8USA,Elite_PAD8USA,SKY PAD8 Sky Devices,Elite_Q55,Elite_Q55,Elite_Q55 +Sky Devices,Elite_T10_PRO,Elite_T10_PRO,Elite T10 PRO Sky Devices,Elite_T8PUSA,Elite_T8PUSA,Elite T8Plus Sky Devices,Elite_T8Plus,Elite_T8Plus,Elite T8Plus Sky Devices,Elite_T8Pluss,Elite_T8Pluss,Elite T8Plus @@ -32086,7 +33377,9 @@ Skyworth,Euro,SW3_ATV,SWTV Skyworth,Europe,globe_eu,globe Skyworth,Hong Kong,open_uhd_hk,open_uhd Skyworth,LEAP-S1,LAS,LEAP-S1 +Skyworth,Leap-L1,BOS,TV Stick Skyworth,Leap-S2,YYT,4K Google TV Stick +Skyworth,Leap-S4,YYC,4K Android TV Box Skyworth,METZ 2K TV,shinagawa,METZ 2K TV Skyworth,NT-01,HP40A,NT-01 Skyworth,North America,globe_na,globe @@ -32127,8 +33420,10 @@ Smart (BD),MQ703G,MQ703G,MQ703G Smart (BD),MQ703G_1,MQ703G_1,MQ703G_1 Smart (BD),SQ811G,SQ811G,SQ811G Smart-Tech TV,Aiplus4K,guandu,Aiplus4K +Smart-Tech TV,Apollo Premium4K TV,marina,Apollo Premium4K TV Smart-Tech TV,Contex TV,cottongreen,Contex TV Smart-Tech TV,Contex TV,nagata,Contex TV +Smart-Tech TV,EU,cottongreen,Gameplay Smart-Tech TV,EU、UK、AP,martin,AiPlus2K Smart-Tech TV,EU、UK、AP,martin,WALTON Android TV Smart-Tech TV,France,tamachi,AiPlus2K @@ -32161,6 +33456,7 @@ Smartec,MiCA,MiCA,MiCA Smartec,N4,N4,N4 Smartec,SmartabS32,SmartabS32,SmartabS32 Smartec,SmartabS4,SmartabS4,SmartabS4 +Smartec,SmartabX8,SmartabX8,SmartabX8 Smartedu_Touch,WTC Series,WTC_Pro,Smartedu_WTC_Series Smartek,MR_POTATO_HEAD,MR_POTATO_HEAD,MR_POTATO_HEAD Smartek,PLAY_DOH,PLAY_DOH,PLAY_DOH @@ -32189,6 +33485,7 @@ Smartfren,NC36B1G,HS8610QC,Smartfren Andromax NC36B1G Smartfren,NEWAD688G,NEWAD688G,Smartfren Andromax AD688G Smarti,Smarti T2 plus,Smarti_T2_plus,Smarti T2 plus Smarti,Smarti_Gen_1,Smarti_Gen_1,Smarti_Gen_1 +Smarti,Smarti_Gen_2,Smarti_Gen_2,Smarti_Gen_2 Smartron,Srtphone,rimo02a,T5524 Smartron,tphone,rimo01a,T5511 Smartron,tphone P,P840F12,T5211 @@ -32202,10 +33499,12 @@ Snopow,M10,M10,M10 Snopow,ServiceChecKIT,ServiceChecKIT_EEA,ServiceChecKIT_EEA So ! Generation,T8100,T8100,T8100 So ! Generation,T8116,T8116,T8116 +So ! Generation,T8133_EEA,T8133_EEA,T8133 Soda,E1,soda_CSW1702,soda E1 Soda,FIRE,soda_CSW1803,soda FIRE Soda,Note 12,Note_12,Note 12 Soda,Note 12Pro,Note_12Pro,Note 12Pro +Soda,ROCK_30,ROCK_30,ROCK 30 Soda,s2,soda_CSW1802,soda S2 Soda,soda,soda_SW17W16,soda S1 SoftBank,602ZT,P809F10,602ZT @@ -32223,6 +33522,7 @@ Sonimtech,Ex-Handy 09,XP6700Z1,Ex-Handy 09 Sonimtech,RS60,RS60,RS60 Sonimtech,RS80,RS80,RS80 Sonimtech,Smart-Ex 01,XP7700Z1,Smart-Ex 01 +Sonimtech,XP Pro 5G,X800,X800 Sonimtech,XP10,XP9900,XP9900 Sonimtech,XP6,XP6700,Ex-Handy 209 Sonimtech,XP6,XP6700,XP6700 @@ -32370,7 +33670,12 @@ Sony,Xperia 10 V,SOG11,SOG11 Sony,Xperia 10 V,XQ-DC44,XQ-DC44 Sony,Xperia 10 V,XQ-DC54,XQ-DC54 Sony,Xperia 10 V,XQ-DC72,XQ-DC72 +Sony,Xperia 10 VI,A402SO,A402SO Sony,Xperia 10 VI,SO-52E,SO-52E +Sony,Xperia 10 VI,SOG14,SOG14 +Sony,Xperia 10 VI,XQ-ES44,XQ-ES44 +Sony,Xperia 10 VI,XQ-ES54,XQ-ES54 +Sony,Xperia 10 VI,XQ-ES72,XQ-ES72 Sony,Xperia 5,901SO,901SO Sony,Xperia 5,J8210,J8210 Sony,Xperia 5,J8270,J8270 @@ -32916,8 +34221,10 @@ SoyMomo,SoyMomo_Pro_EU_V2,SoyMomo_Pro_EU_V2,SoyMomo_Pro_EU_V2 SoyMomo,SoyMomo_Pro_V1,Pro_V1,SoyMomo_Pro_V1 SoyMomo,SoyMomo_Pro_V2,SoyMomo_Pro_V2,SoyMomo_Pro_V2 SoyMomo_Tablet,SoyMomo_PRO_V2MAX,SoyMomo_PRO_V2MAX,SoyMomo_PRO_V2MAX +SparX,Edge 20,Edge_20,Edge 20 SparX,Edge 20 Pro,Sparx_Edge_20_Pro,Edge 20 Pro SparX,NEO 5,NEO5,NEO 5 +SparX,NEO 9,Sparx_NEO_9,Sparx NEO 9 SparX,NEO_6,NEO_6,NEO_6 SparX,Neo 11,Neo_11,Neo 11 SparX,Neo 5 Plus,Neo_5_Plus,Sparx Neo 5 Plus @@ -32925,6 +34232,7 @@ SparX,Neo 5 Pro,Neo_5_Pro,Neo 5 Pro SparX,Neo 7 Plus,Neo_5_Plus,Sparx Neo 7 Plus SparX,Neo 7 Ultra,Neo_7_Ultra,Sparx Neo 7 Ultra SparX,Neo 7 Ultra,Neo_7_Ultra,Sparx Neo 7 Ultra 8GB +SparX,Neo 8 Lite,Neo8Lite,Neo 8 Lite SparX,Neo_X,Neo_X,Neo X SparX,Note 12,Note_12,Note 12 SparX,Note_20,Note_20,Note 20 @@ -32937,7 +34245,18 @@ SparX,Sparx Neo 7,Neo_7,Sparx Neo 7 SparX,Sparx Neo 7 Pro,Neo_7_Pro,Sparx Neo 7 Pro SparX,Sparx Neo 8 Plus,Neo_8_Plus,Sparx Neo 8 Plus SparX,Sparx Neo 8 Pro,Neo_8_Pro,Sparx Neo 8 Pro +SparX,Sparx Neo 8i,Neo_8_Plus,Sparx Neo 8i +SparX,Sparx Neo 9i,Neo_8_Plus,Sparx Neo 9i +SparX,Sparx Ultra 8i,Ultra_8i,Ultra 8i +SparX,Ultra 11,Ultra_11,Ultra 11 +SparX,Ultra 8,Ultra8,Ultra 8 +SparX,Ultra 8,Ultra_8,Ultra 8 +SparX,Ultra 8 Pro,Ultra8Pro,Ultra 8 Pro +SparX,Ultra 8 Pro,Ultra_8_Pro,Ultra 8 Pro +SparX,V5,Sparx_V5,Sparx V5 +SparX,V7,Sparx_V7,V7 Spark,Spark_Plus_3,Spark_Plus_3,Spark Plus 3 +Specktron,CDX,CDX,CDX Spectra Geospatial,MobileMapper60_2,MM60_2,MobileMapper60_2 Spectra Geospatial,Ranger 5,bcat,RGR5 SpectraPrecision,Ranger 5 Handheld,workhorse_wifi,Ranger5 @@ -32999,6 +34318,8 @@ Star-X,Middle East,yeongdeungpo,STAR-X UHD Android TV Star-X,STAR-X 2K SMART TV,nagata,STAR-X 2K SMART TV Star-X,United Arab Emirates,martin,STAR-X 2K Android TV StarBoard,Starboard Solution Inc,TE_YL,TE_YL +StarBoard,TE_QS,TE_QS,TE_QS +StarBoard,YL,YL,YL StarHub,Android TV Set-Top Box,KM_SH368AT,KM_SH368AT StarHub,StarHub TV+ Box (Innopia),NVSH800H1,NVSH800H1 StarHub,StarHub TV+ Pro,m393vsb_starhub,SCSH900AT @@ -33013,6 +34334,8 @@ StarMobile,UP_XL,UP_XL,UP_XL StarMobile,Y11,Y11,Y11 StarMobile,Y15,Y15,Y15 StarMobile,up_octa,UP_Octa,UP Octa +Starlight,Alpha 100,Alpha_100,Alpha 100 +Starlight,Alpha 200,Alpha_200,Alpha 200 Starlight,C_Note,C_Note,C_Note Starlight,C_Note_Pro,C_Note_Pro,C_Note_Pro Starlight,Future,Future,Future @@ -33090,6 +34413,7 @@ Stream System,R4_GTV,R4_GTV,R4G Strong,Android TV,R1,ATV R1 Strong,Android TV,R2,ATV R2 Strong,Android TV,redwood,AI PONT +Strong,HP4423,YYC,4K Android TV Box Strong,LEAP-S1,LAS,LEAP-S1 Strong,Leap-S3,YDA,4K Google TV Box Strong,SRT41,YYT,4K Google TV Stick @@ -33106,10 +34430,12 @@ Stylo,221,221,221 Stylo,721,721,721 Stylo,721_PRO,721_PRO,721_PRO Stylo,AIR,AIR,AIR +Stylo,APEX_5G,APEX_5G,APEX_5G Stylo,ARCTIC,ARCTIC,ARCTIC Stylo,AS210291,AS210291,AS210291 Stylo,ATLAS,AW230345,ATLAS Stylo,ATLAS,DVK83,ATLAS +Stylo,AURORA,AURORA,AURORA Stylo,BOLD,BOLD,BOLD Stylo,BOLD PLUS,BOLD_PLUS,BOLD_PLUS Stylo,BOLD_PLUS,BOLD_PLUS,BOLD_PLUS @@ -33129,6 +34455,7 @@ Stylo,Jupiter,DQR22,DQR22 Stylo,LIFE_2,LIFE_2,LIFE_2 Stylo,Luna,Luna,Luna Stylo,MAVERICK,MAVERICK,MAVERICK +Stylo,MIRAGE,MIRAGE,MIRAGE Stylo,MOSCOW,MOSCOW,MOSCOW Stylo,ORION PLUS TAB 10,DVK88,ORION PLUS TAB 10 Stylo,Onyx,Onyx,Onyx @@ -33163,6 +34490,7 @@ Stylo,STYLO MAX,Stylo_Max,MAX Stylo,STYLOF1,STYLOF1,STYLO F1 Stylo,STYLO_S61,STYLO_S61,STYLO SM61 MAGIC+ Stylo,STYLO_S61,STYLO_S61,STYLO SV61 VECTOR+ +Stylo,SWIFT_4G,SWIFT_4G,SWIFT_4G Stylo,Stylo S40,S40_Vida,Stylo S40 Stylo,Stylo_521,Stylo_521,Stylo_521 Stylo,Stylo_Viva,Stylo_Viva,Stylo_Viva @@ -33172,6 +34500,7 @@ Stylo,TITAN,TITAN,TITAN Stylo,UNIVERSE,UNIVERSE,UNIVERSE Stylo,Ultra,Ultra,Ultra Stylo,V,V,V +Stylo,VERTIGO,VERTIGO,VERTIGO Stylo,VS5502,VS5502,VS5502 Stylo,VS571,VS571,VS571 Stylo,X5,X5,X5 @@ -33182,6 +34511,7 @@ Stylos,TAB8F,TAB8F,Tab3 Stylos,TARISTAB2,TARISTAB2,TARISTAB2 Stylos,TARISTAB3,TARISTAB3,TARISTAB3 Stylos,TARISTAB4,TARISTAB4,TARISTAB4 +Stylos,Tab104,Tab104,Tab104 Stylos,Tab2,Tab2,Tab2 Stylos,Tab8,Tab8,Tab8 Stylus,AT703,AT703,AT703 @@ -33227,7 +34557,11 @@ Sumitomo Electric Networks,,dhe1100,Hikari-iFrame/WDPF-703SE Sunbio,SB-TM700,SB-TM700,SB-TM700 Sunbrite,huangshan_sunbrite,huangshan,SmartTV 4K Sunelan,Mountain M8,Mountain_M8,Mountain M8 +Sunelan,River X1,River_X1,River X1 Sunelan,River X3,River_X3,River X3 +Sunmi,D3 MINI,D3MINI,D3 MINI +Sunmi,D3 PRO,D3_PRO,D3 PRO +Sunmi,K2,K2,K2_A13 Sunmi,L2H_EDLA_GL,SUNMI-L2HNFC,L2H_EDLA_GL Sunmi,L2Ks,SUNMI-L2KsNFC,L2Ks_EDLA_GL Sunmi,L2s_PRO,SUNMI-L2s_PRO,L2s_PRO @@ -33241,6 +34575,7 @@ Sunmi,Sunmi L2Ks,SUNMI-L2KsNFC,L2Ks_TR Sunmi,Sunmi V2s,V2s,V2s_EEA Sunmi,Sunmi V2s,V2s,V2s_GL Sunmi,Sunmi V2s,V2s,V2s_TR +Sunmi,T3 PRO,T3_PRO,T3 PRO Sunmi,T3 PRO,T3_PRO,T3 Pro Max Sunmi,T3 PRO MAX,T3_PRO,T3 Pro Max Sunmi,V2s,V2s,V2s_EDLA_GL @@ -33264,6 +34599,7 @@ Sunny,SUNNY 2K Google TV,capitolhill,SUNNY 2K Google TV Sunny,SUNNY 4K Google TV,keoneae,SUNNY 4K Google TV Sunstech,Spain / Portugal,martin,SUNSTECH SD ANDROID TV Sunstech,TAB1011,TAB1011,TAB1011 +Sunstech,TAB1012,TAB1012,TAB1012 Sunstech,TAB1081,TAB1081,TAB1081 Sunstech,TAB1081_eea,TAB1081,TAB1081 Sunstech,TAB1090,TAB1090,TAB1090 @@ -33307,6 +34643,7 @@ SwissMobility,M9,M9,M9 SwissMobility,Z7,Z7,Z7 SwissMobility,Z72,Z72,Z72 SwissMobility,Z9,Z9,Z9 +Swisscom,IP1800,IP1800,IP1800 Swisscom,TV-Box5,IP2300,IP2300 Swisstone,swisstone SD 510,SD5103G,swisstone SD 510 Swisstone,swisstone SD 530,SD5304G,swisstone SD 530 @@ -33337,6 +34674,8 @@ Symphony,E95,E95,E95 Symphony,G10,G10,Symphony G10 Symphony,G100,G100,Symphony G100 Symphony,G10plus,G10plus,G10+ +Symphony,G27,G27,G27 +Symphony,G27 Lite,G27_Lite,G27 Lite Symphony,G50,G50,G50 Symphony,H300,H300,H300 Symphony,H400,H400,H400 @@ -33472,6 +34811,8 @@ T-Mobile,REVVL 6,Bethpage,TMAF025G T-Mobile,REVVL 6 Pro,Augusta,TMAF035G T-Mobile,REVVL 6x 5G,TorreyPines,TMRV065G T-Mobile,REVVL 6x PRO 5G,SouthernDunes,TMRV06P5G +T-Mobile,REVVL 7,CypressPoint,TMRV075G +T-Mobile,REVVL 7 Pro,Pinehurst,TMRV07P5G T-Mobile,REVVL TAB 5G,REVVLTAB5G,TMRV5GTB T-Mobile,REVVL V,Newcastle,TMRVL4G T-Mobile,REVVL V+ 5G,Sprout,REVVL V+ 5G @@ -33494,6 +34835,7 @@ TAG-DC,TAG-DC,TAG-DC,TAG-DC TAG-TECH,TAG Phone,TAG_Phone,TAG_Phone TAG-TECH,TAG-TAB-III,TAG-TAB-III,TAG-TAB-III TAG-TECH,TAG-TABKIDS,TAG-TABKIDS,TT-III +TAG-TECH,TAG_Pluto_TAB_II,TAG_Pluto_TAB_II,TAG_Pluto_TAB_II TAG-TECH,TAG_TAB_II,TAG_TAB_II,TAG TAB II TAG-TECH,Tagphone plus,Tagphone_plus,Tagphone plus TAGITAL,K88,K88,K88 @@ -33534,6 +34876,7 @@ TCL,G06_2K_US,G06,Smart TV TCL,G07_4K_GB_NF,G07,Smart TV TCL,G08,G08,Smart TV Pro TCL,G10,G10,Smart TV +TCL,G10_4K_US,G10,Smart TV Pro TCL,GO5c,U3A_PLUS_4G,5033E TCL,HotelTV,HotelTV,WelcomeTV TCL,Jitterbug Smart4,Sonata_BBH,T608G @@ -33558,6 +34901,7 @@ TCL,TAB 10s New,Odin2,9081X TCL,TBD,Apollo84GBoostR,9132S TCL,TBD,Odin_5G_TMO,9183W TCL,TBD,ScarabLite_TMO,T434W +TCL,TCL,Scarab_Pro_TF,T510D TCL,TCL 10 5G,Seattle,T790B TCL,TCL 10 5G,Seattle,T790H TCL,TCL 10 5G,Seattle,T790Y @@ -33645,9 +34989,21 @@ TCL,TCL 408,Civic_Plus,T507U TCL,TCL 40T,Sonata_TF,T608DL TCL,TCL 40XL,Sonata_Pro_OM,T608M TCL,TCL 50 5G,Dragonfly,T613K +TCL,TCL 50 5G,Dragonfly,T613P +TCL,TCL 50 LE,Scarab_Pro_VZW,T510SP +TCL,TCL 50 NXTPAPER 5G,Goldfinch_NP,T702D +TCL,TCL 50 Pro NXTPAPER 5G,Goldfinch_NP_Pro,T803D +TCL,TCL 50 Pro NXTPAPER 5G,Goldfinch_NP_Pro,T803E TCL,TCL 50 SE,Ladybird,T611B +TCL,TCL 50 XE 5G,Dragonfly_VZW,T614SP TCL,TCL 50 XL 5G,Goldfinch_TMO,T702W +TCL,TCL 50 XL NXTPAPER 5G,Goldfinch_Pro_CS,T702M +TCL,TCL 501,Bee_One,T433D +TCL,TCL 501,Bee_One,T433E TCL,TCL 502,Rio_CAN,T432J +TCL,TCL 505,Ant,T509A +TCL,TCL 505,Ant,T509K +TCL,TCL 505 S,Ant,T509A TCL,TCL A3X,Delhi_TF,A600DL TCL,TCL C5,A3A,5152D TCL,TCL C5,Gauss,5153A @@ -33698,6 +35054,7 @@ TCL,TCL TAB 10 4G,Aquaman_10_4G,8094X TCL,TCL TAB 10 FHD 4G,Aquaman_10_Pro,9060G TCL,TCL TAB 10 HD 4G,Aquaman_10_Pro,9060X TCL,TCL TAB 10 HD 4G,Aquaman_10_Pro,9060X_EEA +TCL,TCL TAB 10 NXTPAPER 5G,Optimus_5G_VZW,9199S TCL,TCL TAB 10 SMART,Aquaman_10_4G,8094T TCL,TCL TAB 10L,Aquaman_10_Smart_WIFI,8491X TCL,TCL TAB 10L,Aquaman_10_Smart_WIFI,8491X_EEA @@ -33711,14 +35068,18 @@ TCL,TCL TAB 10s 4G,Odin,9080G TCL,TCL TAB 10s 4G,Odin,9080X TCL,TCL TAB 10s 5G,Odin_5G,9183G TCL,TCL TAB 11,Eternals11,9466X +TCL,TCL TAB 11 FE,Ares_11_WIFI,9465X TCL,TCL TAB 11 LTE,Eternals11,9166G TCL,TCL TAB 7 Lite,U3A_7_WIFI_Refresh,9309X TCL,TCL TAB 7 Lite,U3A_7_WIFI_Refresh,9309X2 TCL,TCL TAB 8,Luna,9132G TCL,TCL TAB 8,Luna,9132X TCL,TCL TAB 8 4G,Apollo_8_4G,9032X +TCL,TCL TAB 8 Gen2,Venus_WiFi_GL,8188X TCL,TCL TAB 8 LE,Luna_8_4G_TMO,9137W +TCL,TCL TAB 8 LTE Gen2,Venus_4G_GL,8188G TCL,TCL TAB 8 Plus,Luna_8_4G_VZW,9138S +TCL,TCL TAB 8 SE,Luna_8_4G_ATT,9136K TCL,TCL TAB 8 SE,Luna_8_4G_ATT,9136R TCL,TCL TAB 8 V,Luna,9132X TCL,TCL TAB 8 Wi-Fi,Luna,9132X @@ -33727,7 +35088,6 @@ TCL,TCL TAB Disney Edition 2,Luna_8_4G_VZW,9150S TCL,TCL TAB Lite,Apollo84GBoostR,9132S TCL,TCL TAB kids,Thor_8_4G_VZW,9049L TCL,TCL TAB10 Gen2,Gaia,8496G -TCL,TCL TAB10 Gen2 LTE,Gaia,8196G TCL,TCL TAB10 LTE Gen2,Gaia,8196G TCL,TCL stylus 5G,Challenger_TH,T779P TCL,TCL201,Macau,5133MP @@ -35098,8 +36458,11 @@ TD Tech,TD Tech V800,V800,V800 TD Tech,TD Tech V900,V900,V900 TDS,VIP6102W,vip6102w,VIP6102W TECHLIFE,Smart TV,redwood,AI PONT +TECHLIFE,TLPAD001,TLPAD001,TLPAD001 TECHNOLOGIA Y CRATIVIDAD,M103H,M103H,M103H TECHcomputer,F102-T610-EEA,F102-T610-EEA,F102-T610-EEA +TECHcomputer,F102-T610-EEA-GG5,F102-T610-EEA-GG5,F102-T610-EEA-GG5 +TECHcomputer,F102-T618-EEA,F102-T618-EEA,F102-T618-EEA TECHcomputer,TEC-M1310,TEC-M1310,TEC-M1310 TECO,Android TV,longshan,AI PONT TECO,K5T,ikebukuro,AI PONT @@ -35109,10 +36472,12 @@ TELE System,EU、UK、AP,martin,TELESYSTEM 2K Android TV TELE System,"Italy,Poland,Czech,BeNeLux",guandu,TELESYSTEM 4K Android TV TELE System,ON T2 HD,ONT2HD,ONT2HD TELE System,UPT24K,UPT24K,UPT24K +TELECAB,B866V2FA,B866V2FA_TELECAB,B866V2FA TELOX,BN500,BN500,BN500 TELOX,TE620G,TE620G,TE620G TELSTAR,TELSTAR 2K Google TV,capitolhill,TELSTAR 2K Google TV TELSTAR,TELSTAR 4K Google TV,keoneae,TELSTAR 4K Google TV +TENCH,TAB_A10,TAB_A10,ADVAN TAB A10 TERRA,GPAD702,GPAD702,GPAD702 TERRA,TERRA PAD 101,TERRA_PAD_101,TERRA_PAD_101 TERRA,TERRA_MOBILE_PAD_1200,TERRA_MOBILE_PAD_1200,TERRA_MOBILE_PAD_1200 @@ -35150,6 +36515,7 @@ TIM,TIMVISION Box,uzw4054tim,TIMVISION Box TIM,TIMVISION VSB,m393vsb_tim,TIMVISION VSB TIM,TIMVISIONBOX,m393gena_tim,TIMVISIONBOX TIM,TIMvision,dwt765ti,skipper +TIOK,S32,S32,S32 TIT(SA),TIT SMART TV,SW4H,TIT SMART TV TIT(SA),TITTV,shibuya,TITTV TJC,Metal Tablet,Metal_Tablet_10,Metal_Tablet_10 @@ -35231,9 +36597,11 @@ TOSCIDO,T20-EEA,T20-EEA,T20-EEA TOSCIDO,T201,T201,T201 TOSCIDO,T201-EEA,T201-EEA,T201-EEA TOSCIDO,T21-EEA,T21-EEA,T21-EEA +TOSCIDO,T21-EEA,T21-EEA,X10 TOSCIDO,T211-EEA,T211-EEA,T211-EEA TOSCIDO,T22,T22,T22 TOSCIDO,T22-EEA,T22-EEA,T22-EEA +TOSCIDO,T221,T221,T221 TOSCIDO,T26,T26,T26 TOSCIDO,T26-EEA,T26-EEA,T26-EEA TOSCIDO,T28,T28,T28 @@ -35245,9 +36613,12 @@ TOSCIDO,T50-EEA,T50-EEA,T50-EEA TOSCIDO,T501-EEA,T501-EEA,T501-EEA TOSCIDO,X102,X102,X102 TOUCHSMART,QUICKTAB,Quicktab,Quicktab +TOUCH_DYNAMIC,Nexus,Nexus,Nexus TOUMAI,MI_1,MI_1,MI_1 TOYA,Poland,DTC974x,DTC974x +TOYA,Poland,DTC974y,DTC9740 TOYIN,RJ TOYIN,RJ_TOYIN,RJ TOYIN +TPLAY,Telecentro 4K,SEI800TCT,Telecentro 4K TPS,ALTAB08,ALTAB08,ALTAB08 TPS,MTC 982o,MTC_982O,MTC_982O TPS,S10-9863,S10-9863,S10-9863 @@ -35255,6 +36626,7 @@ TPS,SMART Sprint,SMARTSprint,SMART Sprint TPS,TPS-SC10,TPS-SC10,TPS-SC10 TREQ,SmarTab-8,SmarTab-8,SmarTab-8 TRIPLTEK,T mini,T_mini,T mini +TRT(SZ),NOTEXPRO,NOTEXPRO,NOTEXPRO TRUE_SLIM,T1586K,T1586K,T1586K TRUFON,TRUFON FLEX,TRUFON_FLEX,TRUFON FLEX TSUNAMi,Tablet Tsunami TSTA080D1,MG080D1T,MG080D1T @@ -35283,6 +36655,7 @@ TVCore,TV Stick,ts401,TV Stick TVCore,ts401l,ts401,TV StickL TVPLUS,TV PLUS 4K BOX,DV6069Y_TVPLUS,TV PLUS 4K BOX TVT(A),TVT-T108,TVT-T108,TVT-T108 +TVUp,Denali,Denali_B866V2F,Denali TVUp,HP5116,HPA12_8GB,HP5116 TVUp,Mediacenter 6G 4K,SEI300T,Mediacenter 6G 4K TVision,SEI400TM,SEI400TM,TVision @@ -35299,11 +36672,11 @@ TWZ Corporation PLC,T12,T12,T12 TWZ Corporation PLC,Tab-PLAY125,Tab-PLAY125,Tab-PLAY125 TWZ Corporation PLC,U18,U18,U18 TWZ Corporation PLC,V10,V10,V10 -TWZ Corporation PLC,V6,V6,V6 Tabi_by_T_GO,EUTB_758G,EUTB_758G,EUTB_758G_TABI_Argos_KIDS Tabi_by_T_GO,EUTB_758_Argos,EUTB_758_Argos,EUTB-758 TABI Argos Tabi_by_T_GO,TGO_TB1001_2R,TGO_TB1001_2R,TGO_TB1001_2R Tabi_by_T_GO,TGO_TB1001_4R,TGO_TB1001_4R,TGO_TB1001_4R +Tabi_by_T_GO,TGO_TB1001_4RO,TGO_TB1001_4RO,TGO_TB1001_4RO Tabi_by_T_GO,TGO_TB780i,TGO_TB780i,TGO_TB780i Tabi_by_T_GO,TGO_TB780ik,TGO_TB780ik,TGO_TB780ik TabletKiosk,TK80,TK80,TK80 @@ -35349,6 +36722,7 @@ Tataplay,Tata Sky Binge Plus,usw4026tat,Tata Sky Binge Plus TazTag,TazPad-FAP30,TazPad-FAP30,TazPad-FAP30 TazTag,Tazpad-FAP60,Tazpad-FAP60,Tazpad-FAP60 Tbltaca,KIDS02,KIDS02,KIDS02 +Tbltaca,Y108,Y108,Y108 Tech 4u,Aqua,Aqua,Aqua Tech 4u,Earth,Earth,Earth Tech 4u,Fire,Fire,Fire @@ -35374,6 +36748,7 @@ Technicolor,Wind,uzw4030wnh,WIND Technicolor,Wind,uzw4030wnh,Wind Technocrat,SC777,SC777,SC777 Technocrat,SC777-F,SC777-F,SC777-F +Technopc,TM-T10SA-V2,TM-T10SA-V2,TM-T10SA-V2 Technopc,UP10S43LA,Technopc_UP10S43LA,UP10S43LA Technopc,UP10SI36LA,Technopc_UP10SI36LA,UP10SI36LA Technopc,UP10_SH36LAG,UP10_SH36LAG,UP10_SH36LAG @@ -35417,6 +36792,8 @@ Techpad,Techpad_Kids_7,Techpad_Kids_7,Techpad_Kids_7 Techpad,X11,X11,X11 Techpad,X6,X6,X6 Techpad,X7,X7,X7 +Techpad,X9,X9_PLUS,X9 +Techpad,Z10,Z10,Z10 Techpad,i700,i700,Tech Pad i700 Techpad,k13pro,K13pro,K13pro Techsonic,TECHR720W,TECHR720W,TECHR720W @@ -35451,10 +36828,28 @@ Teclast,M40_Plus_EEA,M40_Plus_EEA,M40_Plus_EEA Teclast,M40_Plus_ROW,M40_Plus_ROW,M40_Plus_ROW Teclast,M40_ROW,M40_ROW,M40_ROW Teclast,M50-EEA,M50-EEA,M50 +Teclast,M50-ROW,M50-ROW,M50 +Teclast,M50HD_EEA,M50HD_EEA,M50HD +Teclast,M50HD_EEA,M50HD_EEA,M50HD_EEA +Teclast,M50HD_EEA,M50HD_T,M50HD_EEA +Teclast,M50HD_ROW,M50HD_ROW,M50HD +Teclast,M50HD_ROW,M50HD_ROW,M50HD_ROW Teclast,M50HD_ROW,M50HD_T,M50HD_ROW +Teclast,M50HD_RUS,M50HD_RUS,M50HD_RUS +Teclast,M50Mini_EEA,M50Mini_EEA,M50Mini Teclast,M50Mini_ROW,M50Mini_ROW,M50Mini Teclast,M50Pro_EEA,M50Pro_EEA,M50 Pro Teclast,M50Pro_ROW,M50Pro_ROW,M50 Pro +Teclast,M50Pro_RUS,M50Pro_RUS,M50 Pro_RUS +Teclast,M50S_EEA,M50S_EEA,M50S +Teclast,M50S_ROW,M50S_ROW,M50S +Teclast,M50_EEA,M50_T,M50_EEA +Teclast,M50_EU,M50_EU,M50 +Teclast,M50_EU,M50_EU,M50_EU +Teclast,M50_ROW,M50_ROW,M50 +Teclast,M50_ROW,M50_ROW,M50_ROW +Teclast,M50_ROW,M50_T,M50_ROW +Teclast,M50_RUS,M50_RUS,M50_RUS Teclast,P10HD_N5H6,P10S_ROW,P10S_ROW Teclast,P10SE_EEA,P10SE_EEA,P10SE_EEA Teclast,P10SE_ROW,P10SE_ROW,P10SE_ROW @@ -35497,6 +36892,10 @@ Teclast,P30S_W_EEA,P30S_W_EEA,P30S_W_EEA Teclast,P30S_W_ROW,P30S_W_ROW,P30S_W_ROW Teclast,P30T_EEA,P30T,P30T Teclast,P30T_ROW,P30T,P30T +Teclast,P30T_ROW,P30T_ROW,P30T +Teclast,P30T_ROW,P30T_ROW,P30T_ROW +Teclast,P30_EEA,P30_EEA,P30 +Teclast,P30_EEA,P30_EEA,P30_EEA Teclast,P30_ROW,P30,P30 Teclast,P40HD_EEA,P40HD_EEA,P40HD Teclast,P40HD_EEA,P40HD_T,P40HD_EEA @@ -35505,9 +36904,13 @@ Teclast,P40HD_ROW,P40HD_T,P40HD_ROW Teclast,P40HD_RUS,P40HD_RUS,P40HD Teclast,P40HD_T_EEA,P40HD_T_EEA,P40HD_T_EEA Teclast,P40HD_T_ROW,P40HD_T_ROW,P40HD_T_ROW +Teclast,P40HD_T_RUS,P40HD_T_RUS,P40HD_RUS Teclast,P50S_EEA,P50S_EEA,P50S Teclast,P50S_ROW,P50S_ROW,P50S +Teclast,P50_EEA,P50,P50_EEA Teclast,P50_EEA,P50_EEA,P50 +Teclast,P50_ROW,P50,P50_ROW +Teclast,P50_ROW,P50_ROW,P50 Teclast,P80T_EEA,P80T,P80T_EEA Teclast,P80T_ROW,P80T,P80T_ROW Teclast,P80T_Y_EEA,P80T_Y_EEA,P80T_EEA @@ -35528,6 +36931,7 @@ Teclast,P80h_KR,P80h_KR,P80h_KR Teclast,P80h_ROW,P80h_ROW,P80h_ROW Teclast,P85Pro_EEA,P85Pro_EEA,P85Pro_EEA Teclast,P85Pro_ROW,P85Pro_ROW,P85Pro_ROW +Teclast,P85T_ROW,P85T,P85T_ROW Teclast,P85_EEA,P85_EEA,P85_EEA Teclast,P85_ROW,P85_ROW,P85_ROW Teclast,P85_RUS,P85_RUS,P85_RUS @@ -35573,14 +36977,19 @@ Teclast,T40_Plus_RUS,T40_Plus_RUS,T40_Plus_RUS Teclast,T40_Pro_W_EEA,T40_Pro_W_EEA,T40_Pro_W_EEA Teclast,T40_Pro_W_ROW,T40_Pro_W_ROW,T40_Pro_W_ROW Teclast,T40_ROW,T40,TLA001 +Teclast,T45HD_EEA,T45HD_EEA,T45HD Teclast,T45HD_EEA,T45HD_T,T45HD_EEA +Teclast,T45HD_ROW,T45HD_ROW,T45HD Teclast,T45HD_ROW,T45HD_T,T45HD_ROW +Teclast,T45HD_RUS,T45HD_RUS,T45HD_RUS Teclast,T50,Teclast_T50_EEA,T50 Teclast,T50,Teclast_T50_ROW,T50 Teclast,T50,Teclast_T50_RUS,T50 Teclast,T50Air_EEA,T50Air,T50Air_EEA Teclast,T50HD_EEA,T50HD,T50HD_EEA +Teclast,T50HD_EEA,T50HD_EEA,T50HD Teclast,T50HD_ROW,T50HD,T50HD_ROW +Teclast,T50HD_ROW,T50HD_ROW,T50HD Teclast,T50Pro_W_EEA,T50Pro_W_EEA,T50Pro_W_EEA Teclast,T50Pro_W_ROW,T50Pro_W_ROW,T50Pro_W_ROW Teclast,T50_2022_EEA,T50_2022_EEA,T50_EEA @@ -35588,6 +36997,18 @@ Teclast,T50_2022_ROW,T50_2022_ROW,T50_ROW Teclast,T50_2022_RUS,T50_2022_RUS,T50_RUS Teclast,T50_EEA,T50_T,T50_EEA Teclast,T50_ROW,T50_T,T50_ROW +Teclast,T50_Y_EEA,T50_Y_EEA,T50 +Teclast,T50_Y_EEA,T50_Y_EEA,T50_Y_EEA +Teclast,T50_Y_ROW,T50_Y_ROW,T50 +Teclast,T50_Y_ROW,T50_Y_ROW,T50_Y_ROW +Teclast,T50_Y_RUS,T50_Y_RUS,T50_Y_RUS +Teclast,T60,T60,T60 +Teclast,T60-EEA,T60-EEA,T60 +Teclast,T60-ROW,T60-ROW,T60 +Teclast,T60_EEA,T60_EEA,T60 +Teclast,T60_EEA,T60_EEA,T60_EEA +Teclast,T60_ROW,T60_ROW,T60 +Teclast,T60_RUS,T60_RUS,T60_RUS Teclast,T8,T8,T8 Teclast,TLG01_EEA,TLG01_EEA,TLG01_EEA Teclast,X_EEA,X_EEA,X_EEA @@ -35814,6 +37235,7 @@ Tecno,TECNO,TECNO-BF7,TECNO BF7 Tecno,TECNO,TECNO-BF7n,TECNO BF7n Tecno,TECNO,TECNO-BF7s,TECNO BF7s Tecno,TECNO,TECNO-BG6,TECNO BG6 +Tecno,TECNO,TECNO-BG6m,TECNO BG6m Tecno,TECNO AX8,TECNO-AX8,TECNO AX8 Tecno,TECNO CAMON 12 Air,TECNO-KC3,TECNO KC3 Tecno,TECNO CAMON 12 Pro,TECNO-CC9,TECNO CC9 @@ -35838,6 +37260,9 @@ Tecno,TECNO CAMON 30 5G,TECNO-CL7k,TECNO CL7k Tecno,TECNO CAMON 30 5G,TECNO-CL7s,TECNO CL7s Tecno,TECNO CAMON 30 Premier 5G,TECNO-CL9,TECNO CL9 Tecno,TECNO CAMON 30 Pro 5G,TECNO-CL8,TECNO CL8 +Tecno,TECNO CAMON 30S,TECNO-CLA5,TECNO CLA5 +Tecno,TECNO CAMON 30S Pro,TECNO-CLA6,TECNO CLA6 +Tecno,TECNO CAMON 30T,TECNO-Mobile-CLA6,TECNO Mobile CLA6 Tecno,TECNO CAMON iACE 2,TECNO-KB2,TECNO KB2 Tecno,TECNO CAMON iACE 2x,TECNO-KB2j,TECNO KB2j Tecno,TECNO CX Air,TECNO-CX-Air,TECNO CX Air @@ -35847,8 +37272,12 @@ Tecno,TECNO Mobile SPARK 20 Pro,TECNO-Mobile-KJ6,TECNO Mobile KJ6 Tecno,TECNO Mobile SPARK 8,TECNO-Mobile-KG6k,TECNO Mobile KG6k Tecno,TECNO Mobile SPARK 8C,TECNO-Mobile-KG5k,TECNO Mobile KG5k Tecno,TECNO Mobile SPARK 8T,TECNO-Mobile-KG6p,TECNO Mobile KG6p +Tecno,TECNO Mobile SPARK Go 1,TECNO-Mobile-KL4,TECNO Mobile KL4 Tecno,TECNO P904,TECNO-P904,TECNO P904 +Tecno,TECNO PHANTOM V Flip2 5G,TECNO-AE11,TECNO AE11 Tecno,TECNO PHANTOM V Fold,TECNO-AD10,TECNO AD10 +Tecno,TECNO PHANTOM V Fold2 5G,TECNO-AE10,TECNO AE10 +Tecno,TECNO PHANTOM V2 Flip 5G,TECNO-AE11,TECNO AE11 Tecno,TECNO POP 2 Air,TECNO-SC7S,TECNO SC7S Tecno,TECNO POP 2F,TECNO-B1g,TECNO B1g Tecno,TECNO POP 2X Plus,TECNO-RB8S,TECNO RB8S @@ -35868,6 +37297,8 @@ Tecno,TECNO POP 6 Go,TECNO-BE7,TECNO BE7 Tecno,TECNO POP 6 Go 4G,TECNO-BE6j,TECNO BE6j Tecno,TECNO POP 7,TECNO-BF6,TECNO BF6 Tecno,TECNO POP 8,TECNO-BG6i,TECNO BG6i +Tecno,TECNO POP 9,TECNO-KL4,TECNO KL4 +Tecno,TECNO POP 9 5G,TECNO-KL8h,TECNO KL8h Tecno,TECNO POP X5,TECNO-L6502S,TECNO L6502S Tecno,TECNO POVA 2,TECNO-LE7,TECNO LE7 Tecno,TECNO POVA 2,TECNO-LE7n,TECNO LE7n @@ -35878,6 +37309,7 @@ Tecno,TECNO POVA 4 Pro,TECNO-LG8n,TECNO LG8n Tecno,TECNO POVA 5G,TECNO-LE8,TECNO LE8 Tecno,TECNO POVA 6,TECNO-LI7,TECNO LI7 Tecno,TECNO POVA 6 Neo,TECNO-LI6,TECNO LI6 +Tecno,TECNO POVA 6 Neo 5G,TECNO-KL8,TECNO KL8 Tecno,TECNO POVA 6 Pro 5G,TECNO-LI9,TECNO LI9 Tecno,TECNO POVA Neo 3,TECNO-LH6n,TECNO LH6n Tecno,TECNO R6S,TECNO-R6,TECNO R6S @@ -35902,6 +37334,13 @@ Tecno,TECNO SPARK 20 Pro+,TECNO-KJ7,TECNO KJ7 Tecno,TECNO SPARK 20 Pro+,TECNO-KJ7s,TECNO KJ7s Tecno,TECNO SPARK 20C,TECNO-BG7,TECNO BG7 Tecno,TECNO SPARK 20C,TECNO-BG7n,TECNO BG7n +Tecno,TECNO SPARK 30,TECNO-KL6,TECNO KL6 +Tecno,TECNO SPARK 30 5G,TECNO-KL8,TECNO KL8 +Tecno,TECNO SPARK 30 5G,TECNO-KL8s,TECNO KL8s +Tecno,TECNO SPARK 30 Pro,TECNO-KL7,TECNO KL7 +Tecno,TECNO SPARK 30C,TECNO-KL5n,TECNO KL5n +Tecno,TECNO SPARK 30C,TECNO-KL5s,TECNO KL5s +Tecno,TECNO SPARK 30C 5G,TECNO-KL8h,TECNO KL8h Tecno,TECNO SPARK 4,TECNO-KC2,TECNO KC2 Tecno,TECNO SPARK 4,TECNO-KC2j,TECNO KC2j Tecno,TECNO SPARK 4 Air,TECNO-KC1j,TECNO KC1j @@ -35940,9 +37379,11 @@ Tecno,TECNO SPARK 9 Pro,TECNO-KH7S,TECNO KH7S Tecno,TECNO SPARK 9 Pro,TECNO-KH7n,TECNO KH7n Tecno,TECNO SPARK 9T,TECNO-KH6,TECNO KH6 Tecno,TECNO SPARK Go,TECNO-KC1,TECNO KC1 +Tecno,TECNO SPARK Go 1,TECNO-KL4,TECNO KL4 Tecno,TECNO SPARK Go 2022,TECNO-KG5,TECNO KG5 Tecno,TECNO SPARK Go 2022,TECNO-KG5h,TECNO KG5h Tecno,TECNO SPARK Go 2022,TECNO-KG5m,TECNO KG5m +Tecno,TECNO SPARK Go 2024,TECNO-BG6m,TECNO BG6m Tecno,TECNO SPARK Go 2024,TECNO-BG6s,TECNO BG6 Tecno,TECNO SPARK Go 2024,TECNO-BG6s,TECNO BG6s Tecno,TECNO Tab,TECNO-P704,TECNO P704 @@ -35995,7 +37436,9 @@ Tecno Mobile,TECNO Mobile POVA 6 Neo,TECNO-Mobile-LI6,TECNO Mobile LI6 Tecno Mobile,TECNO Mobile SPARK 20,TECNO-Mobile-KJ5n,TECNO Mobile KJ5n Tecno Mobile,TECNO Mobile SPARK 20 Pro+,TECNO-Mobile-KJ7,TECNO Mobile KJ7 Tecno Mobile,TECNO Mobile SPARK 20C,TECNO-Mobile-BG7n,TECNO Mobile BG7n +Tecno Mobile,TECNO Mobile SPARK 30 Pro,TECNO-Mobile-KL7,TECNO Mobile KL7 Tecno Mobile,TECNO SPARK 10,TECNO-Mobile-KI5q,TECNO Mobile KI5q +Tecno Mobile,TECNO SPARK 30 5G,TECNO-Mobile-KL8,TECNO Mobile KL8 Tecnomaster,EDT800,EDT800,EDT800 Tecnomaster,TESHM1863,TESHM1863,TESHM1863 Tecnomaster,TESHM8863,TESHM8863,TESHM8863 @@ -36083,10 +37526,12 @@ Telenor,Smart,Telenor_Smart,Telenor_Smart Telenor,Smart II,SmartII,SmartII Telenor,Smart plus II,SmartPlusII,SmartPlusII Telenor,Smart4G,Telenor_Smart_4G,Telenor_Smart_4G +Telenor,Stream Dongle,DV6113Z-KST,Streaming Dongle Telenor,Telenor Mediahubb,vip5702w_tn,Telenor Mediahubb Telenor,V51,V51,Infinity_i4 Telenor(HU),Hipernet TV Box,Hipernet_TV_Box_B866V2,Hipernet TV Box Teleone,I06,I06,I06 +Telev8,MH700,MH700,MH700 Telia,DV8919X-KET,DV8919X-KET,DV8919X-EE Telia,Telia Nordic STB,DV8919-KST,Telia Nordic STB Telkom,TVB-100,DV8219,TVB-100 @@ -36112,10 +37557,13 @@ TeloSystems,TE580P,TE580P,TE580P TeloSystems,TE580PS,TE580PS,TE580PS TeloSystems,TE590P,TE590P_E,TE590P_E TeloSystems,TE590P,TE590P_O,TE590P_O +TeloSystems,TE590P,TE590P_U,TE590P TeloSystems,TELO_TE610,TELO_TE610,TELO_TE610 TeloSystems,TELO_TE610_O,TELO_TE610_O,TELO_TE610_O +TeloSystems,Telo_TE590P,TE590P_U,TE590P Telpo,C1,C1,C1 Telpo,M1,M1s,M1s +Telpo,M10,M10,M10 for arm64 Telpo,M1K,M1K,M1K Telus,HMB2213PW22TS,HMB2213PW22TS,HMB2213PW22TS Telus,Pik TV Media Box,HMB2213PW22TS,HMB2213PW22TS @@ -36145,9 +37593,11 @@ Tesla,Smartphone 6.4 Lite,Tesla_SP6_4_Lite,Tesla_SP6_4_Lite Tesla,South American,patrick,Tesla 4K Android TV Tesla,TESLA,zhongshan,Tesla 4K Android TV Tesla,TESLA 2K SMART TV,umeda,TESLA 2K SMART TV +Tesla,TESLA 4K GSMART TV,anaheim,TESLA 4K GSMART TV Tesla,TESLA 4K GSMART TV FF,SW6H,TESLA 4K GSMART TV FF Tesla,TESLA 4K SMART TV,SW6H,TESLA 4K SMART TV Tesla,TESLA 4K SMART TV FF,SW6H,TESLA 4K SMART TV FF +Tesla,TESLA 4K SMART TV FF,anaheim,TESLA 4K SMART TV FF Tesla,TESLA 4K TV FF,SW6H,TESLA 4K TV FF Tesla,Tablet_L7_1,Tablet_L7_1,Tesla L7.1 Tesla,Tesla 2K TV,shinagawa,Tesla 2K TV @@ -36183,6 +37633,8 @@ Thomson,Friendly TH101,Friendly_TH101,Friendly_TH101 Thomson,HERO10RK,HERO10RK_EEA,HERO10RK Thomson,Hero10RK,HERO10RK,HERO10RK Thomson,LEAP-S1,LAS,LEAP-S1 +Thomson,LEAP-S3+,YDA,4K Google TV Box +Thomson,Origin_1010_EEA,Origin_1010,Origin_1010 Thomson,Origin_679,Origin_679,Origin_679 Thomson,PRIMO7 Tablet,PRIMO7,PRIMO7 Thomson,PRIMO8 Tablet,AMLMY8306P,PRIMO8 @@ -36193,8 +37645,10 @@ Thomson,SPPL 4K GSmartTV,SW6H,SPPL 4K GSmartTV Thomson,SPPL 4K GSmartTV FF,SW6H,SPPL 4K GSmartTV FF Thomson,Smart TV,redwood,AI PONT Thomson,T13M4BK64LTE,TEO13M,T13M4BK64LTE +Thomson,T240G,YXQ,Thomson 240G Thomson,TEO 8,TEO8LTE32,TEO8LTE Thomson,TEO10,TEO10,SPTEO10BK16 +Thomson,TEO10-KID2BL32,TEO10-KID2BL32,TEO10-KID2BL32 Thomson,TEO104G,TEO104G,TEO104G Thomson,TEO10A,TEO10A1BK32,TEO10A Thomson,TEO10A,TEO10A2BK32P_EEA,TEO10A @@ -36204,11 +37658,14 @@ Thomson,TEO7RK,TEO7RK,TEO7RK Thomson,TEO8-A2BK32,TEO8-A2BK32,TEO8-A2BK32 Thomson,TEO84G,TEO84G332,TEO84G Thomson,TEO8M2BK32LTE,TEO8M2BK32LTE,TEO8M +Thomson,TEOX10-MT8SL128LTE,TEOX10-MT8SL128LTE,TEOX10-MT8SL128LTE Thomson,TEOX102,TEOX102,TEOX102 Thomson,TEOX103,TEOX103,TEOX103 +Thomson,THOMSON GS-SMART,anaheim,THOMSON GS-SMART Thomson,THOMSON SEREA500,L35_A,THOMSON SEREA500 Thomson,THOMSON_TEO10S,TEO10S,TEO10S Thomson,TLink 455,TLINK455,TLINK455 +Thomson,Thomson 140G,YZF,Thomson 140G Thomson,Thomson T50,Thomson_T50,Thomson T50 Thomson,Thomson TV,marina,Thomson TV Thomson,Thomson TV,nagata,Thomson TV @@ -36277,10 +37734,12 @@ Tonino Lamborghini,Antares,TL_Antares,Antares Tonino Lamborghini,TL99,ailsa_ii,TL99 Tonino Lamborghini,TL99G,ailsa_ii,TL99G Topicon,Topicon MDT1060,mdt1060,mdt1060 +Topicon,mdt865,mdt865,mdt865 Topsand,M8_U,M8_U,M8 Topsand,N10,N10_T,N10 Topsand,N8,N8,N8 Topsand,N8_KIDS,N8_KIDS,N8 KIDS +Topsand,N8_Plus,N8_Plus,N8_Plus Topwise,SK210,SK210,SK210 Torex,Rugged_tablets,Torex8plus,Torex8plus Toshiba,,WDPF-703TI,Hikari-iFrame/WDPF-703TI @@ -36336,6 +37795,7 @@ Toshiba,Mozart,Mozart,Mozart Toshiba,STB10,TOSPASB,TOSPASB Toshiba,TD-E657TS,xinnong,HIDB 4K Toshiba,TD-E757TS,ligen,HIDB 4K +Toshiba,TOSHIBA TV,hirano,TOSHIBA TV Toshiba,Thrive 7,tostab04,AT1S0 Toshiba,Toshiba Chromebook 2 (2015 Edition),gandof_cheets,Toshiba Chromebook 2 (2015 Edition) Toshiba,ToshibaTV,hayward,ToshibaTV @@ -36369,6 +37829,7 @@ Touchmate,TM-MID795,TM-MID795,TM-MID795 Touchmate,TM-TAB1085,TM-TAB1085,TM-TAB1085 Touchmate,TM_MID792WP,TM_MID792WP,TM-MID792WP Touchmate,TOUCHMATE-TM-MID811A,TM-MID811A,TOUCHMATE-TM-MID811A +Touchview Interactive,SD_ODMGM02,TouchView_Companion,TouchView Companion Touchview Interactive,TVULTRA98_G5,TVULTRA98_G5,TVULTRA98_G5 Toughshield,R200,R200,R200 Toughshield,T700_TABLET,T700_TABLET,T700 @@ -36380,6 +37841,9 @@ Transvision,TRANSVISION-OTT-Box,UHD_I56AD_TRV,TRANSVISION-OTT-Box Transvision,TRANSVISION-Xstream,SEI500TR,TRANSVISION-Xstream Transvision,Transvision,USB6_IR80,TRANSVISION-iTV TravelWifi,Sapphire Tablet,Sapphire_Tablet,S_TAB +Trayoo,K13,K13,K13 +Trecfone,17 Pro Max,17_Pro_Max,17_Pro_Max +Trecfone,T20,T20,T20 Trecfone,Trecfone_16 Pro Max,16_Pro_Max,16 Pro Max Trekstor,SurfTab ST70204-3,TREKM7100KLD,SurfTab ST70204-3 Trekstor,SurfTab breeze 9.6 quad,SurfTab,TrekStor SurfTab breeze 9.6 quad @@ -36458,11 +37922,14 @@ Trio,Stealth-G4-101,Trio-Stealth-G4-101,Trio-Stealth G4 10.1 Trio,Stealth-G4-7.85,Trio-Stealth-G4-785,Trio-Stealth-G4-7.85 True,20721400,Tablet,20721400 True,20721400E_EEA,Tablet,20721400E +True,20721400R,Tablet,20721400R True,20725300,Tablet,20725300 True,20725300E_EEA,Tablet,20725300E +True,20725300R,Tablet,20725300R True,20726600,Tablet,20726600 True,20728200,Tablet,20728200 True,20728200E_EEA,Tablet,20728200E +True,20728200R,Tablet,20728200R True,Alpha_5G,Alpha_5G,Alpha 5G True,HCH03,TrueHCH03,HCH03 True,S1,S1,S1 @@ -36526,15 +37993,24 @@ Turk Telekom,E4,722T,E4 Tvera,Tvera,seocho,Tvera 4K Android TV Tvstar,TVSTAR,seocho,TVSTAR 4K Android TV TwinMOS,MQ703G,MQ703G,MQ703G +UAUU,M10,M10,M10 UAUU,T30,T30,T30 +UAUU,T30Pro,T30Pro,T30Pro UAUU,T60,T60,T60 UAUU,T90_NEW,T90_NEW,T90_NEW UAUU,U10_RU,U10,U10 UBCtv,Vietnam,tamachi,UBC Android TV UBCtv,Vietnam,yeongdeungpo,UBC Android TV +UBOS,UTAB,UTAB,UTAB UCM(M),T12,T12,T12 UD (EU),Smart TV,longshan,AI PONT UD (EU),Smart TV,redwood,AI PONT +UGRIHACH,C11,C11,C11 +UGRIHACH,C11_EEA,C11,C11 +UGRIHACH,MB1001,MB1001,MB1001 +UGRIHACH,MB1001_EEA,MB1001,MB1001 +UJJ(SZ),U3_EEA,U3_EEA,U3_EEA +UJJ(SZ),U8_EEA,U8_EEA,U8_EEA UJoyFeel,KIDS705-701A,KIDS705_701A,KIDS705-701A UJoyFeel,KIDS705_701,KIDS705-701,KIDS705-701 UKA-Dream,UKA_Dream_1,UKA_Dream_1,UKA_Dream_1 @@ -36553,6 +38029,7 @@ UNIQ-CELL,UNIQCELL_A5,UNIQCELL_A5,UNIQCELL_A5 UNIQ-CELL,UNIQCELL_A55,UNIQCELL_A55,UNIQCELL_A55 UNIQ-CELL,W7,W7,W7 UNIQ-CELL,ZX_001,ZX_001,ZX_001 +UNISCED,UNISCEDTAB24,UNISCEDTAB24,UNISCEDTAB24 UNITED TV,4K Smart TV,gangbyeon,4K AI Smart TV UNITED TV,LED32HS72A9,ikebukuro,AI PONT UNITED TV,Smart TV,osaki,2K AI Smart TV @@ -36562,6 +38039,7 @@ UNIWA,K626_EEA,K626,K626 UNIWA,M101,M101,M101 UNIWA,M101,M101,UNIWA M101 UNIWA,UNIWA W888,UNIWA_W888,W888 +UNIWA,UNIWA_W999,UNIWA_W999,UNIWA_W999 UNIWA,W555,W555,W555 UNNIC,UC_TK03,UC_TK03,UC_TK03 UNOCP,Premier,Premier,Premier @@ -36610,7 +38088,12 @@ Ulefone,Armor 21,Armor_21,Armor 21 Ulefone,Armor 22,Armor_22,Armor 22 Ulefone,Armor 23 Ultra,Armor_23_Ultra,Armor 23 Ultra Ulefone,Armor 24,Armor_24,Armor 24 +Ulefone,Armor 25 Pro+,GQ5007AF2,Armor 25T Pro +Ulefone,Armor 25T 4G,GQ5007TF1,Armor 25T Ulefone,Armor 26 Ultra,Armor_26_Ultra,Armor 26 Ultra +Ulefone,Armor 27 Pro,GQ5008AF3,Armor 27 Pro +Ulefone,Armor 27 Pro,GQ5010AH1,Armor Mini 20T Pro +Ulefone,Armor 27T Pro,GQ5008AF2,Armor 27T Pro Ulefone,Armor 2S,Armor_2S,Armor_2S Ulefone,Armor 6,Armor_6,Armor_6 Ulefone,Armor 7,Armor_7_Q,Armor 7 @@ -36619,10 +38102,14 @@ Ulefone,Armor 8,Armor_8_R,Armor 8 Ulefone,Armor 8 Pro,Armor_8_Pro,Armor 8 Pro Ulefone,Armor 9,Armor_9,Armor 9 Ulefone,Armor 9E,Armor_9E,Armor 9E +Ulefone,Armor Mini 20 Pro,GQ5010AH2,Armor Mini 20 Pro Ulefone,Armor Pad,Armor_Pad,Armor Pad Ulefone,Armor Pad 2,Armor_Pad_2,Armor Pad 2 +Ulefone,Armor Pad 2,Armor_Pad_2,UTAB A2 Ulefone,Armor Pad 3 Pro,ArmorPad3Pro,Armor Pad 3 Pro +Ulefone,Armor Pad 4 Ultra,GQ3121AF1,Armor Pad 4 Ultra Ulefone,Armor Pad Lite,ArmorPadLite,Armor Pad Lite +Ulefone,Armor Pad Pro,ArmorPadPro,Armor Pad Pro Ulefone,Armor X,Armor_X,Armor_X Ulefone,Armor X10,Armor_X10,Armor X10 Ulefone,Armor X10 Pro,Armor_X10_Pro,Armor X10 Pro @@ -36644,6 +38131,7 @@ Ulefone,Armor X8i,Armor_X8i,Armor X8i Ulefone,Armor X9,Armor_X9,Armor X9 Ulefone,Armor X9 Pro,Armor_X9_Pro,Armor X9 Pro Ulefone,Armor6,Armor_6,Armor_6 +Ulefone,ArmorPad3Pro_EEA,ArmorPad3Pro,Armor Pad 3 Pro Ulefone,Armor_11T_5G,Armor_11T_5G,Armor 11T 5G Ulefone,Armor_11_5G,Armor_11_5G,Armor 11 5G Ulefone,Armor_3,Armor_3,Armor_3 @@ -36665,6 +38153,8 @@ Ulefone,Armor_X5,Armor_X5_R,Armor X5 Ulefone,Armor_X6,Armor_X6,Armor_X6 Ulefone,Armor_X8_R_EEA,Armor_X8_R,Armor X8 Ulefone,Armor_X9,Armor_X9,Armor X9 +Ulefone,GQ5007AF2,GQ5007AF2,Armor 25T Pro +Ulefone,GQ5008AF3,GQ5008AF3,Armor 27 Pro Ulefone,MIX,t816_gq_ulefone,MIX Ulefone,MIX S,t815_gq_ulefone,MIX_S Ulefone,MIX_2,MIX_2,MIX_2 @@ -36679,6 +38169,7 @@ Ulefone,Note 15,Note_15,Note 15 Ulefone,Note 16 Pro,GQ3106,Note 16 Pro Ulefone,Note 16 Pro,Note_16_Pro,Note 16 Pro Ulefone,Note 17 Pro,Note_17_Pro,Note 17 Pro +Ulefone,Note 18 Ultra,Note_18_Ultra,Note 18 Ultra Ulefone,Note 6,Note_6,Note 6 Ulefone,Note 6P,Note_6P,Note 6P Ulefone,Note 6T,Note_6T,Note 6T @@ -36723,11 +38214,14 @@ Ulefone,S8_Pro,S8_pro1,S8_Pro Ulefone,S9_Pro,S9_Pro,S9_Pro Ulefone,T1,Ulefone_T1,T1 Ulefone,T2,T2,T2 +Ulefone,Tab A11,UF1103A,Tab A11 +Ulefone,Tab A11 Pro,UF1103,Tab A11 Pro Ulefone,Tab A7,Ulefone_Tab_A7,Ulefone Tab A7 Ulefone,Tab A8,GQ3286,Tab A8 Ulefone,Tab A8,Tab_A8,Tab A8 Ulefone,Tab A8,Tab_A8_EEA,Tab A8 Ulefone,Tab R8 5G,Tab_R8_5G,Tab R8 5G +Ulefone,Tab W10,UF1001_1,Tab W10 Ulefone,Ulefone Tab A7,Ulefone_Tab_A7,Ulefone Tab A7 Ulefone,Ulefone_Note_7,Note_7P,Note_7P Ulefone,Ulefone_Note_7,Ulefone_Note_7,Ulefone_Note 7 @@ -36744,6 +38238,7 @@ Umax,10C-PRO-LTE,10C-PRO-LTE,10C-PRO-LTE Umax,10C_LTE,10C_LTE,10C_LTE Umax,10L-PLUS,10L-PLUS,10L-PLUS Umax,10Qa_3G,10Qa_3G,VisionBook_10Qa_3G +Umax,10T-LTE_EEA,10T-LTE_EEA,10T-LTE Umax,11T-LTE-Pro_EEA,11T-LTE-Pro_EEA,11T-LTE-Pro Umax,7A_3G,7A_3G,7A_3G Umax,7A_Plus_eea,7A_Plus,7A_Plus @@ -36790,6 +38285,8 @@ Umidigi,A15_Pro,A15_Pro,PA3NB15PA Umidigi,A15_Pro_5G,A15_Pro_5G,MP36 Umidigi,A15_Pro_5G_EEA,A15_Pro_5G,MP36 Umidigi,A15_Pro_EEA,A15_Pro,PA3NB15PA +Umidigi,A15_Tab,A15_Tab,MT08 +Umidigi,A15_Tab_EEA,A15_Tab_EEA,MT08 Umidigi,A3,A3,A3 Umidigi,A3S,A3S,A3S Umidigi,A3S_EEA,A3S,A3S @@ -36865,11 +38362,21 @@ Umidigi,G1 Max EEA,G1_Max,MP18 Umidigi,G1 Max RU,G1_Max,MP18 Umidigi,G1 Plus,G1_Plus,MP28 Umidigi,G1 Plus EEA,G1_Plus,MP28 +Umidigi,G1_Tab,G1_Tab,MT10 +Umidigi,G1_Tab_EEA,G1_Tab_EEA,MT10 Umidigi,G1_Tab_Kids,G1_Tab_Kids,MT10 +Umidigi,G1_Tab_Kids_EEA,G1_Tab_Kids_EEA,MT10 +Umidigi,G1_Tab_Mini,G1_Tab_Mini,TG3DBG1MA Umidigi,G1_Tab_Mini_EEA,G1_Tab_Mini_EEA,TG3DBG1MA +Umidigi,G1_Tab_Mini_GO,G1_Tab_Mini_GO,TG3DBG1MA +Umidigi,G1_Tab_Mini_Kids,G1_Tab_Mini_Kids,TG3DBG1MA +Umidigi,G1_Tab_Mini_Kids_EEA,G1_Tab_Mini_Kids_EEA,TG3DBG1MA Umidigi,G2,UMIDIGI_G2,MP21 Umidigi,G2 EEA,UMIDIGI_G2,MP21 +Umidigi,G2_Tab,G2_Tab,MT11 +Umidigi,G2_Tab_EEA,G2_Tab_EEA,MT11 Umidigi,G2_Tab_Kids,G2_Tab_Kids,MT11 +Umidigi,G2_Tab_Kids_EEA,G2_Tab_Kids_EEA,MT11 Umidigi,G3,UMIDIGI_G3,MP24 Umidigi,G3 EEA,UMIDIGI_G3,MP24 Umidigi,G3 Plus,G3_Plus,MP25 @@ -36881,9 +38388,17 @@ Umidigi,G5 Mecha EEA,G5_Mecha,RP08 Umidigi,G5 Mecha RU,G5_Mecha,RP08 Umidigi,G5_Tab,G5_Tab,MT16 Umidigi,G5_Tab_EEA,G5_Tab_EEA,MT16 +Umidigi,G5_Tab_Kids,G5_Tab_Kids,MT16 +Umidigi,G5_Tab_Kids_EEA,G5_Tab_Kids_EEA,MT16 Umidigi,G6_Tab,G6_Tab,TG2404GBA Umidigi,G6_Tab_EEA,G6_Tab_EEA,TG2404GBA +Umidigi,G7_Tab,G7_Tab,TG4FBG7TA +Umidigi,G7_Tab_EEA,G7_Tab,TG4FBG7TA Umidigi,G7_Tab_Mini,G7_Tab_Mini,TG2405GBA +Umidigi,G7_Tab_Mini_EEA,G7_Tab_Mini_EEA,TG2405GBA +Umidigi,G7_Tab_Pro,G7_Tab_Pro,TG2403GBA +Umidigi,G9 Tab,G9_Tab,TG4FBG9TA +Umidigi,G9 Tab,G9_Tab_EEA,TG4FBG9TA Umidigi,MT02_EEA,MT02_EEA,AblePad Umidigi,MT02_ROW,MT02_ROW,AblePad Umidigi,One,One,One @@ -36941,6 +38456,9 @@ Umidigi,UMIDIGI G6 5G,G6_5G,PG2309GBA Umidigi,UMIDIGI G7,G7,PG3NBG7YA Umidigi,UMIDIGI G7_5G,G7_5G,PG3NBG7YB Umidigi,UMIDIGI G7_EEA,G7,PG3NBG7YA +Umidigi,UMIDIGI G9 5G,G9_5G,UMIDIGI G9 5G +Umidigi,UMIDIGI G9A,G9A,UMIDIGI G9A +Umidigi,UMIDIGI G9T,G9T,UMIDIGI G9T Umidigi,UMIDIGI X,UMIDIGI_X,UMIDIGI X Umidigi,Z2,Z2,Z2 Umidigi,Z2 Pro,Z2_PRO,Z2_PRO @@ -36948,6 +38466,7 @@ Umiio,Q2,Q2,Q2 Umix,Lite L,UMIX_LITE_L,UMIX LITE L Umix,Lite M,UMIX_LITE_M,UMIX LITE M Umix,Lite XL,UMIX_LITE_XL,UMIX LITE XL +Umix,SP151,SP151,SP151 Umix,Vinci M,UMIX_VINCI_M,UMIX VINCI M Umx(Ultimate Mobile Experience),U2-PLUS-TE-VR,U2-PLUS-TE-VR,U2-PLUS-TE-VR Umx(Ultimate Mobile Experience),U2VR,U2VR,U2VR @@ -36969,6 +38488,7 @@ Unihertz,Atom,Atom,Atom Unihertz,Atom_L,Atom_L,Atom_L Unihertz,Atom_XL,Atom_XL,Atom_XL Unihertz,Jelly 2E,Jelly_2E,Jelly 2E +Unihertz,Jelly Max,Jelly_Max,Jelly Max Unihertz,Jelly Star,Jelly_Star,Jelly Star Unihertz,Jelly2,Jelly2,Jelly2 Unihertz,Jelly2_JP,Jelly2_JP,Jelly2_JP @@ -37071,11 +38591,14 @@ Utopia,UH0342 UHTABLET10.1INCH,UH0342,UH0342 V-MOCCS,VT-A9,VT-A9,VT-A9 V2COM,T2,ROCKY_T2,ROCKY T2 V7,BUV7TBLT10A,BUV7TBLT10A,BUV7TBLT10A +V7,IFPXX03-V7PRO,rk3588_t,IFP03V7PRO V7,IFPXX03-V7PRO,rk3588_t,IFPO3V7PRO V7,Zyro,zyro,V7 Zyro VAARAHI,TEO 8,T8LTE32G,TEO8LTE VAIO,VA-10J,VA-10J,JCI VA-10J VAIO,VPA051,VPA051,VPA051 +VALE,V10E-LTE,V10E-LTE,V10E-LTE-464 +VALE,V12E-LTE,V12E-LTE,V12E-LTE-8128 VALIFONE,M790,M790,M790 VALIFONE,V200_EEA,V200,V200 VALIFONE,V350,V350,V350 @@ -37083,17 +38606,29 @@ VALIFONE,V700,V700,V700 VALIFONE,V710,V710,V710 VALIFONE,V730,V730,V730 VALIFONE,W888,W888,W888 +VALIFONE,W999,W999,W999 VALTECH,TAB7Q804VAL,TAB7Q804VAL,TAB7Q804VAL VANTEC,G4,G4,G4 VANTEC,G5,G5,G5 VANTEC,telma_i401,G4,G4 VASOUN,L10-T01,L10-T01,L10-T01 VASOUN,L10-T02,L10-T02,L10-T02 +VASOUN,L10-T02-EEA,L10-T02-EEA,L10-T02 +VASOUN,L10-T02-EEA,L10-T02-EEA,L10-T02-EEA VASOUN,L10_A01,L10_A01,L10 VASOUN,L10_A01_EEA,L10_A01_EEA,L10 VASOUN,L10_A02,L10_A02,L10 VASOUN,L10_A02_EEA,L10_A02_EEA,L10 VASOUN,L10_A03,L10_A03,L10 +VASOUN,L10_A03_EEA,L10_A03_EEA,L10 +VASOUN,L10_T05,L10_T05,L10 +VASOUN,L10_T05_EEA,L10_T05_EEA,L10 +VASOUN,L10_T06,L10_T06,L10_T06 +VASOUN,L10_T06_EEA,L10_T06_EEA,L10_T06_EEA +VASOUN,L10_T08,L10_T08,L10_T08 +VASOUN,L10_T08_EEA,L10_T08_EEA,L10_T08 +VASOUN,L10_T10,L10_T10,L10_T10 +VASOUN,L10_T10_EEA,L10_T10_EEA,L10_T10_EEA VASOUN,M7,M7,M7 VASOUN,M7_EEA,M7_EEA,M7_EEA VASOUN,TAB12,TAB12,L10 @@ -37114,12 +38649,18 @@ VIKUSHA,V-E5,V-E5,V-E5 VIKUSHA,V-N5,V-N5,V-N5 VIKUSHA,V-Z40,V-Z40,V-Z40 VIKUSHA,V-Z40Pro,V-Z40Pro,V-Z40Pro +VIKUSHA,V-Z70,V-Z70,V-Z70 +VIKUSHA,V-Z70,V-Z70,V-Z70Plus VIKUSHA,VZ-30,VZ-30,VZ-30 +VIKUSHA,VZ-30Pro,VZ-30Pro,VZ-30 VILLAON,V20,V20,V20 VILLAON,V20 SE,VILLAON_V20_SE,VILLAON V501W VILLAON,V30 RS,VILLAON-V30-RS,VILLAON V6751L +VILLAON,V40,VILLAON-V40,VILLAON V651W +VILLAON,V40s,VILLAON-V40s,VILLAON V651L VILLAON,VILLAON V30,V30,VILLAON V30 VILLAON,VILLAON V30,VILLAON-V30,VILLAON V30 +VILLAON,VILLAON_V20_S,VILLAON_V20_SE,VILLAON V501W VIMOQ,A18,VIMOQ-A512WS,VIMOQ A512WS VIMOQ,A662LS,VIMOQ-A662LS,VIMOQ A662LS VIMOQ,SE668S,VIMOQ-P662LO,VIMOQ P662LO @@ -37139,6 +38680,7 @@ VIMOQ,VIMOQ-A661WS,VIMOQ-A661WS,VIMOQ A661WS VIMOQ,itel A18,VIMOQ-A512WS,VIMOQ A512WS VIOMI,Smart TV,longshan,AI PONT VIOS,VTAB7,VTAB7,VTAB7 +VIOS,VTABX,VTABX,VTABX VIPER,SZ11MK1,SZ11MK1,SZ11MK1 VIPER,VIPER-Z08MK,VIPER-Z08MK,Z08MK VIPER,Z11MK,Z11MK,Z11MK @@ -37150,6 +38692,7 @@ VIVIMAGE,VIVIMAGE_A10_EEA,VIVIMAGE_A10_EEA,VIVIMAGE_A10_EEA VIVIMAGE,VIVIMAGE_E10,E10,E10 VIVIMAGE,VIVIMAGE_E10_EEA,E10,E10_EEA VIVIMAGE,VIVIMAGE_E11,E11,VIVIMAGE_E11 +VIVITEK,NovoTouch,rk3588_t,EK4 VIVIVIEW,V10,V10,V10 VIVIVIEW,V5Pro,V5Pro,V5Pro VIVIVIEW,V8,V8,V8 @@ -37173,6 +38716,7 @@ VOLFEN,Nexo TAB 7,Nexo-TAB-7,Nexo-TAB-7 VOLIA,VOL001,VOL001,VOL001 VORCOM,AVALON,AVALON,AVALON VORCOM,QuartzLITE,QuartzLITE,QuartzLITE +VORCOM,QuartzPRO,QuartzPRO,QuartzPRO VORCOM,S12_classic,S12_classic,S12_classic VORCOM,S7-classic,S7-classic,S7-classic VORCOM,S7-classic-10,S7-classic-10,S7-classic @@ -37182,6 +38726,7 @@ VORCOM,S8Pro,S8Pro,S8Pro VORCOM,SXPRO,SXPRO,SXPRO VORCOM,SXPRO_classic,SXPRO_classic,SXPRO_classic VORCOM,SXPro-P40,SXPro-P40,SXPro-P40 +VORCOM,ULTRAPAD,ULTRAPAD,ULTRAPAD VOXelectronics,VOXELECTRONICS,lavender,4K SMART TV VOXelectronics,VOXelectronics 2K Android TV,lasalle,VOXelectronics 2K Android TV VOXelectronics,VOXelectronics 4K Android TV,kenton,VOXelectronics 4K Android TV @@ -37290,6 +38835,7 @@ Veidoo,T30_EEA,T30_EEA,T30 Veidoo,T30_Plus_EEA,T30_Plus_EEA,T30_Plus_EEA Veidoo,T40,T40,T40 Veidoo,T7,T7,T7 +Veidoo,T70,T70,T70 Veidoo,T7S,T7S,T7S Veidoo,T80,T80,T80 Veidoo,T80_PLUS,T80_PLUS,T80_PLUS @@ -37297,11 +38843,13 @@ Veidoo,T80_PLUS,T80_PLUS_EEA,T80_PLUS_EEA Veidoo,V88,V88,V88 Veidoo,VEIDOO_T30_PLUS ,VEIDOO_T30_PLUS,VEIDOO_T30_PLUS Veidoo,VEIDOO_T30_PLUS_EEA,VEIDOO_T30_PLUS_EEA,VEIDOO_T30_PLUS_EEA +Veidoo,VEIDOO_T40,VEIDOO_T40,VEIDOO_T40 Veidoo,VEIDOO_T40_EEA,VEIDOO_T40_EEA,VEIDOO_T40_EEA Veidoo,VEIDOO_T50,VEIDOO_T50,VEIDOO_T50 Veidoo,VEIDOO_T60,VEIDOO_T60,VEIDOO_T60 Veidoo,VEIDOO_T60_EEA,VEIDOO_T60_EEA,VEIDOO_T60_EEA Veidoo,VEIDOO_T70,VEIDOO_T70,VEIDOO_T70 +Veidoo,VEIDOO_T70_PLUS,VEIDOO_T70_PLUS,VEIDOO_T70_PLUS Veidoo,VEIDOO_T8,VEIDOO_T8,T8 Veidoo,VEIDOO_T80,VEIDOO_T80,VEIDOO_T80 Veidoo,VEIDOO_T80_EEA,VEIDOO_T80_EEA,VEIDOO_T80_EEA @@ -37619,6 +39167,8 @@ Vgo Tel,NEW 10,NEW_10,NEW 10 Vgo Tel,NEW 11,Smartphone,NEW 11 Vgo Tel,NEW 15,NEW_15,NEW 15 Vgo Tel,NEW 24,NEW_24,NEW 24 +Vgo Tel,NEW 25,NEW_25,NEW 25 +Vgo Tel,NEW 26,NEW_26,NEW 26 Vgo Tel,NEW 7,NEW_7,NEW 7 Vgo Tel,NEW_20,NEW_20,NEW 20 Vgo Tel,NOTE 24,NOTE_24,NOTE 24 @@ -37627,6 +39177,7 @@ Vgo Tel,OCEAN 6,VGOTEL_OCEAN_6,Ocean 6 Vgo Tel,Ocean 8,Ocean_8,Ocean_8 Vgo Tel,Ocean 9,Ocean_9,Ocean_9 Vgo Tel,Ocean9L,Ocean9L,Ocean9L +Vgo Tel,SMART 8,SMART_8,SMART 8 Vgo Tel,Smart 2,Smart_2,Smart 2 Vgo Tel,Smart 4,Smart_4,Smart 4 Vgo Tel,Smart 5,Smart_5,Smart 5 @@ -37774,6 +39325,8 @@ Vivo,I2012,2012,I2012 Vivo,I2017,2017,I2017 Vivo,I2127,I2127,I2127 Vivo,I2202,I2202,I2202 +Vivo,I2219,I2219,I2219 +Vivo,I2306,I2306,I2306 Vivo,NEX A,PD1806B,vivo NEX A Vivo,PA2170,DPD2106,PA2170 Vivo,PD1304DL,PD1304DL,vivo Y13iL @@ -37784,6 +39337,7 @@ Vivo,PD1731D,PD1731D,vivo Y71A Vivo,S17,PD2283,V2283A Vivo,S17 Pro,PD2284,V2284A Vivo,S18 Pro,PD2344,V2344A +Vivo,S19 Pro,PD2362,V2362A Vivo,T1,V2154,V2153 Vivo,T1,V2154,V2154 Vivo,T1,V2154,V2168 @@ -37796,6 +39350,8 @@ Vivo,T2 Pro 5G,V2321,V2321 Vivo,T2x 5G,V2225,V2253 Vivo,T2x 5G,V2225,V2312 Vivo,T3 5G,V2334,V2334 +Vivo,T3 Lite 5G,V2346,V2356 +Vivo,T3 Ultra,V2347,V2426 Vivo,U5x,PD2180,V2180GA Vivo,V1,V1,vivo V1 Vivo,V1730EA,PD1730E,V1730EA @@ -38022,6 +39578,10 @@ Vivo,V2220A,PD2220,V2220A Vivo,V2279A,PD2279J,V2279A Vivo,V2282A,PD2282,V2282A Vivo,V2314A,PD2314,V2314A +Vivo,V2338,V2338,V2338 +Vivo,V2353A,PD2353,V2353A +Vivo,V2353A,PD2353,V2353DA +Vivo,V2417A,PD2417,V2417A Vivo,V25,V2202,V2202 Vivo,V25,V2202,V2228 Vivo,V25 Pro,V2158,V2158 @@ -38050,15 +39610,27 @@ Vivo,V3M A,PD1524B,vivo PD1524B Vivo,V3Max,V3Max,vivo V3Max Vivo,V3Max + A,PD1523B,vivo V3Max+ A Vivo,V3Max A,PD1523,vivo PD1523A +Vivo,V40,V2348,V2348 Vivo,V40 Lite,V2339,V2340 Vivo,V40 Lite,V2339,V2341 +Vivo,V40 Lite,V2342,V2424 +Vivo,V40 Lite,V2418,V2417 +Vivo,V40 Lite,V2418,V2418 +Vivo,V40 Lite 5G,V2418,V2417 +Vivo,V40 Lite 5G,V2418,V2418 +Vivo,V40 Pro,V2347,V2347 +Vivo,V40 SE,V2342,V2342 +Vivo,V40 SE,V2418,V2418 Vivo,V40 SE 5G,V2327,V2337 +Vivo,V40 SE 80W,V2418,V2418 +Vivo,V40e,V2403,V2403 Vivo,V5Plus,V5Plus,vivo V5Plus Vivo,V9,1727ID,vivo 1727 Vivo,V9 6GB,1723CF,vivo 1723 Vivo,V9 Pro,1851,vivo 1851 Vivo,X Flip,PD2256,V2256A Vivo,X Fold3 Pro,PD2337,V2337A +Vivo,X Fold3 Pro,V2330,V2330 Vivo,X100,PD2309,V2309A Vivo,X100,V2308,V2308 Vivo,X100 Pro,PD2324,V2324A @@ -38108,11 +39680,14 @@ Vivo,Y02t,V2254,V2254 Vivo,Y02t,V2254,V2325 Vivo,Y03,V2333,V2332 Vivo,Y03,V2333,V2406 +Vivo,Y03t,V2344,V2344 +Vivo,Y03t,V2344,V2409 Vivo,Y100,PD2313,V2313A Vivo,Y100,V2239,V2239 Vivo,Y100,V2342,V2342 Vivo,Y100,V2342,V2412 Vivo,Y100 5G,V2327,V2327 +Vivo,Y100+,PD2354,V2354A Vivo,Y100A,V2222,V2222 Vivo,Y11,PD2236,V2236A Vivo,Y11,Y11,vivo Y11 @@ -38129,7 +39704,10 @@ Vivo,Y17s,V2310,V2331 Vivo,Y18,V2333,V2333 Vivo,Y18,V2333,V2345 Vivo,Y18e,V2333,V2350 +Vivo,Y18i,V2344,V2414 Vivo,Y18s,V2333,V2410 +Vivo,Y18t,V2344,V2408 +Vivo,Y200,V2418,V2417 Vivo,Y200 5G,V2307,V2307 Vivo,Y200 GT,PD2361,V2361GA Vivo,Y200 Pro 5G,V2303,V2303 @@ -38147,9 +39725,15 @@ Vivo,Y27 5G,V2248,V2302 Vivo,Y27 5G,V2248G,V2302 Vivo,Y27s,V2247,V2322 Vivo,Y27s,V2247,V2335 +Vivo,Y28,V2352,V2352 +Vivo,Y28,V2352,V2433 Vivo,Y28,Y28,vivo Y28 Vivo,Y28 5G,V2315,V2315 +Vivo,Y28e 5G,V2346,V2407 +Vivo,Y28s 5G,V2346,V2346 +Vivo,Y28s 5G,V2346,V2351 Vivo,Y30 5G,2160,V2160 +Vivo,Y300 Pro,PD2410,V2410A Vivo,Y31,PD1505,vivo Y31 Vivo,Y31,Y31,vivo Y31 Vivo,Y31L,Y31L,vivo Y31L @@ -38172,6 +39756,8 @@ Vivo,Y36,V2247,V2324 Vivo,Y36 5G,V2248,V2248 Vivo,Y36m,PD2318,V2318A Vivo,Y36s,PD2318,V2318A +Vivo,Y36t,PD2327,V2327A +Vivo,Y37 Pro,PD2354M,V2354A Vivo,Y38 5G,V2343,V2343 Vivo,Y51,Y51,vivo Y51 Vivo,Y51A,PD1510,vivo Y51A @@ -38186,6 +39772,7 @@ Vivo,Y55s,PD2164,V2164A Vivo,Y55t,PD2279,V2279A Vivo,Y56 5G,V2225,V2225 Vivo,Y56 5G,V2225,V2311 +Vivo,Y58 5G,V2355,V2355 Vivo,Y66,PD1621,vivo Y66 Vivo,Y67,PD1612,vivo Y67 Vivo,Y71,1801,vivo 1801 @@ -38231,8 +39818,12 @@ Vivo,iQOO Neo8 Pro,PD2302,V2302A Vivo,iQOO Neo9,PD2338,V2338A Vivo,iQOO Neo9 Pro,I2304,I2304 Vivo,iQOO Neo9 Pro,PD2339,V2339A +Vivo,iQOO Neo9S Pro,PD2339,V2339FA +Vivo,iQOO Neo9S Pro+,PD2403,V2403A Vivo,iQOO Pad,DPD2307,iPA2375 Vivo,iQOO Pad Air,DPD2305,iPA2451 +Vivo,iQOO Pad2,DPD2345,iPA2453 +Vivo,iQOO Pad2 Pro,DPD2329,iPA2475 Vivo,iQOO Z5,2018,I2018 Vivo,iQOO Z5 6000mAh,PD2188,V2188A Vivo,iQOO Z6,I2203,I2203 @@ -38254,6 +39845,8 @@ Vivo,iQOO Z9,PD2361,V2361A Vivo,iQOO Z9 5G,I2218,I2218 Vivo,iQOO Z9 5G,I2302,I2302 Vivo,iQOO Z9 Turbo,PD2352,V2352A +Vivo,iQOO Z9s 5G,I2403,I2403 +Vivo,iQOO Z9s Pro 5G,I2305,I2305 Vivo,vivo 1907,1907,vivo 1907 Vivo,vivo X21i A,PD1801,vivo X21i A Vivo,vivo Y75s,PD1708C,vivo Y75s @@ -38326,6 +39919,7 @@ Vivo,vivo NEX A,PD1806,vivo NEX A Vivo,vivo NEX S,PD1805,vivo NEX S Vivo,vivo Pad Air,DPD2305,PA2353 Vivo,vivo Pad2,DPD2221,PA2373 +Vivo,vivo Pad3,DPD2345,PA2455 Vivo,vivo Pad3 Pro,DPD2329,PA2473 Vivo,vivo S1,PD1831,V1831A Vivo,vivo S15 Pro,PD2207,V2207A @@ -38336,7 +39930,9 @@ Vivo,vivo S16e,PD2239,V2239A Vivo,vivo S17e,PD2285,V2285A Vivo,vivo S18,PD2323,V2323A Vivo,vivo S18e,PD2334,V2334A +Vivo,vivo S19,PD2364,V2364A Vivo,vivo T2,PD2199,V2199GA +Vivo,vivo T3 Pro 5G,V2404,V2404 Vivo,vivo X Fold,PD2178,V2178A Vivo,vivo X Fold+,PD2229,V2229A Vivo,vivo X Fold2,PD2266,V2266A @@ -38369,6 +39965,9 @@ Vivo,vivo Y22,V2207,V2207 Vivo,vivo Y22,V2207,V2238 Vivo,vivo Y22,Y22,vivo Y22 Vivo,vivo Y28,Y28,vivo Y28 +Vivo,vivo Y36c,PD2357,V2357A +Vivo,vivo Y37,PD2357,V2357A +Vivo,vivo Y37m,PD2357,V2357EA Vivo,vivo Y65,1719,vivo 1719 Vivo,vivo Y66i A,PD1621B,vivo Y66i A Vivo,vivo Y69A,PD1705,vivo Y69A @@ -38413,6 +40012,8 @@ Vmobile,A11_Y,A11_Y,A11_Y Vmobile,A13,A13,A13 Vmobile,A13_Y,A13_Y,A13_Y Vmobile,A15,A15,A15 +Vocal,V01,V01,VOCAL V01 +Vocal,V0Core,V0Core,VOCAL V0Core Vocal,v0,v0,VOCAL V0 Vocal,v1,v1,VOCAL V1 Vodafone,785,Vodafone_785,Vodafone 785 @@ -38478,6 +40079,7 @@ Volt Mobile,VOLT_SV451_Vision,VOLT_SV451_Vision,VOLT_SV451_Vision Volt Mobile,v7,v7,v7 Volvo,EX30,habanero,EX30 Volvo,Volvo,ihu_abl_car,Volvo +Volvo,Volvo,moose,Volvo Volvo,Volvo XC40 Emulator,ihu_emulator,Volvo XC40 Vonino,Druid_L10,Druid_L10,Druid_L10 Vonino,Epic E8,Epic_E8,Epic E8 @@ -38550,30 +40152,46 @@ Vorago,PAD-7,PAD-7,PAD-7 Vorago,PAD-7-KIDS,PAD-7-KIDS,PAD-7-KIDS Vorago,PAD-7-V5,PAD-7-V5,PAD-7-V5 Vorago,PAD-7-V6,PAD-7-V6,PAD-7-V6 +Vorago,PAD-8,PAD-8,PAD-8 +Vortex,A24,A24,A24 Vortex,B55,B55,B55 Vortex,Beat 8,BEAT8,BEAT 8 +Vortex,C24,C24,C24 +Vortex,C24L,C24L,C24L +Vortex,CG65_Pro,CG65_Pro,CG65 Pro Vortex,G8,G8,G8 Vortex,HD60,HD60,HD60 Vortex,HD60L,HD60L,HD60L Vortex,HD60i,HD60i,HD60i Vortex,HD65,HD65,HD65 +Vortex,HD67,HD67,HD67 Vortex,MUV,MUV,MUV +Vortex,PG65,PG65,PG65 Vortex,SYNQ,SYNQ,SYNQ Vortex,Sync,Sync,Sync +Vortex,T101,T101,T101 Vortex,T10M_Pro,T10M_Pro,T10M_Pro Vortex,T10U,T10U,T10 +Vortex,T8,T8,T8 Vortex,TAB8,TAB8,TAB8 Vortex,TAB8V,TAB8V,TAB8V Vortex,V22,V22,V22 Vortex,V22S,V22S,V22S Vortex,V50LTE,V50LTE,V50LTE +Vortex,V65,V65,V65 Vortex,VORTEX BTAB10,BTAB10,BTAB10 +Vortex,VORTEX BTAB8U,VORTEX_BTAB8U,VORTEX BTAB8U Vortex,VORTEX CM62,CM62,VORTEX CM62 Vortex,VORTEX HD65 Choice,VORTEX_HD65_Choice,VORTEX HD65 Choice +Vortex,VORTEX_HD55_Choice,VORTEX_HD55_Choice,VORTEX_HD55_Choice Vortex,VORTEX_K65,VORTEX_K65,VORTEX K65 +Vortex,Vortex N55,N55,N55 Vortex,Vortex Z22,Z22,Z22 Vortex,Vortex Z23,Z23,Z23 Vortex,VortexV20,VortexV20,V20 +Vortex,Z67,Z67,Z67 +Vortex,ZG55,ZG55,ZG55 +Vortex,ZG65 Pro,ZG65_Pro,ZG65 Pro Voto,V9,VOTO_V9,V9 Voto,VOTO V2,VOTO_V2,VOTO V2 Voto,VOTO V2i`,VOTO_V2i,VOTO V2i @@ -38620,6 +40238,7 @@ Vu Televisions,50CLED/55CLED/65CLED,songshan,VU TV FFM Vu Televisions,55QMP,hengshan,VU TV FFM Vu Televisions,Android TV,longshan,AI PONT Vu Televisions,ULED,wuyishan,VU TV FFM +Vu Televisions,VU 4K,lushan,VU 4K Vu Televisions,VU 4K Google TV,keoneae,VU 4K Google TV Vu Televisions,fushan_vu,hamamatsucho,Smart 2K ATV4 Vu Televisions,huangshan_emV,huangshan,VU TV @@ -38671,14 +40290,21 @@ WONGKUO,T10,T10,T10 WONGKUO,T20,T20,T20 WOZIFAN,3W_EEA,W3_EEA,3W_EEA WOZIFAN,3W_US,W3_US,3W_US +WOZIFAN,W10_EEA,W10_EEA,W10_EEA +WOZIFAN,W10_T_US,W10_T_US,W10_T_US +WOZIFAN,W10_US,W10_US,W10_US +WOZIFAN,W11_EEA,W11_EEA,W11_EEA +WOZIFAN,W11_US,W11_US,W11_US WOZIFAN,W500 _EEA,W500_EEA,W500_EEA WOZIFAN,W500_M_US,W500_M_US,W500_M_US WOZIFAN,W500_US,W500_US,W500_US WS(SZ),TD-TP010G-2,TD-TP010G-2,TD-TP010G-2 +WS(SZ),WS-T01,WS-T01,WS-T01 Wacom,Cintiq Companion Hybrid 13HD,CintiqCompanionHybrid13HD,Cintiq Companion Hybrid 13HD Waf,F803YM,F803YM,F803YM Waf,F808NM,F808NM,F808NM Waf,THMTKAW01216_eea,THMTKAW01216,Surftab WAF +Wainyok,P10S_EEA,P10S,P10S Wainyok,P10X,P10X,P10X Walton,4K Smart TV,pioneer,4K PA Smart TV Walton,Bangladesh and EU,tamachi,WALTON Android TV @@ -38691,10 +40317,13 @@ Walton,NEXG N71,NEXG_N71,NEXG N71 Walton,NEXG N71 Plus,NEXG_N71_Plus,NEXG N71 Plus Walton,NEXG N72,NEXG_N72,NEXG N72 Walton,NEXG N73,NEXG_N73,NEXG N73 +Walton,NEXG N74,NEXG_N74,NEXG N74 Walton,NEXG N8,NEXG_N8,NEXG N8 +Walton,NEXG N9,NEXG_N9,NEXG N9 Walton,NEXG_N25,NEXG_N25,NEXG N25 Walton,ORBIT Y12,ORBIT_Y12,ORBIT Y12 Walton,ORBIT Y70,ORBIT_Y70,ORBIT Y70 +Walton,ORBIT Y70c,ORBIT_Y70,ORBIT Y70c Walton,Orbit M20,OrbitM20,Orbit M20 Walton,Orbit Y11,Orbit_Y11,Orbit Y11 Walton,Orbit Y20,OrbitY20,Orbit Y20 @@ -38813,8 +40442,10 @@ Walton,WALTON GSMART 4KTV,SW6H,WALTON GSMART 4KTV Walton,WALTON GSMART 4KTV FF,SW6H,WALTON GSMART 4KTV FF Walton,WALTON GSMART 4KTV FF,anaheim,WALTON GSMART 4KTV FF Walton,WAS2KA11,IAD,WAS2KA11 +Walton,Walpad10HProMax,Walpad10HProMax,Walpad10HProMax Walton,Walton Primo X5,Primo_X5,Walton Primo X5 Walton,XANON X20,XANON_X20,XANON X20 +Walton,XANON_X90,XANON_X90,XANON X90 Wansa,Smart TV,longshan,AI PONT Wansa,Smart TV,redwood,AI PONT Wansa,WUD55JOA63S,samseong,AI PONT @@ -38846,6 +40477,7 @@ Webfleet Solutions,PRO 8475,triton,PRO 8475 Weimei,WEIMEI NEON2,WEIMEI_NEON2,WEIMEI_NEON2 Weimei,weplus 3,weplus_3,weplus_3 Welgate,WA-U420D,WA-U420D,WA-U420D +Welio,wPad_Aura,wPad_Aura,wPad_Aura Welwitcha,P20,P20,P20 Wenu,Kate,Wenu,Kate Westgate,Westgate_T801,Westgate-T801,T801 @@ -39053,6 +40685,7 @@ Wiko,WAX,s8515,WAX Wiko,WC300,WC300,WC300 Wiko,WC300SN,WC300SN,WC300SN Wiko,WIKO 10,VHEM,VHEM +Wiko,WIKO T40,T40,ArkF-AF00 Wiko,WIKO VOIX,U616AT,U616AT Wiko,WIM,T9051AC,WIM Wiko,WIM,i9051,WIM @@ -39133,6 +40766,7 @@ Win (VE),N4,N4,N4 Win (VE),N4plus,N4plus,N4plus Win (VE),Q7,Q7,Q7 Win (VE),Q9,Q9,Q9 +WinRo,Voni10Pro,Voni10Pro,Voni 10 Pro Winds Mobile,MT7001,MT7001,MT7001 Winds Mobile,WINDS-T3,WINDS-T3,T3 Wings, W7 Q,W7_Q,W7 @@ -39181,6 +40815,9 @@ Winnovo,WinnovoT5,WinnovoT5,WinnovoT5 Wintec,T730,T730,Clear Wintec,T730,T730,T730 Wintec,T750,T750,Clear +Wintouch,A20,A20,A20 +Wintouch,A50,A50,A50 +Wintouch,A60_EEA,A60_EEA,A60 Wintouch,K19,K19,K19 Wintouch,K72P,K72P,K72P Wintouch,Q705,Q705,Q705 @@ -39321,8 +40958,13 @@ X-TIGI,X_TIGI_V16,X_TIGI_V16,X_TIGI_V16 X-TIGI,X_TIGI_V16_LTE,X_TIGI_V16_LTE,X_TIGI_V16_LTE X-TIGI,Y10,Y10,Y10 X-View,AMBER_KIDS,AMBER_KIDS,AMBER_KIDS +X-View,Bears,Bears,Bears +X-View,FTB13,FTB13,FTB13 +X-View,Kids10,Kids10,Kids10 X-View,PROTON_AMBER_HD,Proton_Amber_HD,Proton_Amber_HD X-View,PRO_BOOK,PRO_BOOK,PRO_BOOK +X-View,Probook_E_L-10,Probook_E_L-10,Probook_E_L-10 +X-View,Probook_E_M-10,Probook_E_M-10,Probook_E_M-10 X-View,Proton_Helium_Max,Proton_Helium_Max,Proton_Helium_Max X-View,Proton_Neon,Proton_Neon,Proton_Neon X-View,Proton_Tungsten_Max,Proton_Tungsten_Max,Proton_Tungsten_Max @@ -39335,17 +40977,27 @@ X-View,Tablet7_X_View,Tablet7_X_View,Tablet7_X_View X-View,X-View,X-ViewTablet7,X-ViewTablet7 X-View,X-ViewGamer10,X-ViewGamer10,X-ViewGamer10 X-View,X-ViewTablet10,X-ViewTablet10,X-ViewTablet10 +X-View,XRB15,XRB15,XRB15 X-View,X_ViewTablet10,X_ViewTablet10,X-ViewTablet +X-View,Xview_tablet_7,Xview_tablet_7,Xview_tablet_7 +X-View,ZPB17,ZPB17,ZPB17 +X-View,ZPB18,ZPB18,ZPB18 X-mobile,X-mobile SmartWiFi,XM-SW1,XM-SW1 X-mobile,X4,X4,X4 X-mobile,X63Pro,X_63_B_ProB,X63Pro X-mobile,XW,XW,XW XD-DML,ITALY,guandu,XD 4K Andriod TV XD-DML,XD,martin,XD 2K Andriod TV +XD-Enjoy,XDDGM10,XDDGM10,XDDGM10 +XD-Enjoy,XDDGM11BS,XDDGM11BS,XDDGM11BS +XD-Enjoy,XDDGM99PM,XDDGM99PM,XDDGM99PM XENON,PHILIPPINES,marina,XENON ANDROID TV XENON,XENON ANDROID TV,nagata,XENON ANDROID TV XGIMI,Halo,xgimiapollo,Halo +XGIMI,Halo+,altai,H0030 XGIMI,MoGo,xgimiapollo,MoGo +XGIMI,MoGo 2 Plus,altai,H0031 +XGIMI,MoGo 3 Pro,altai,G0035 XGIMI,MoGo Pro,xgimiapollo,MoGo Pro XGIMI,P_FHD_2020,xgimiapollo,Mogo Pro Plus XGIMI,P_FHD_2020,xgimiapollo,P_FHD_2020 @@ -39359,13 +41011,20 @@ XORO,Megapad_1333,XORO,Megapad_1333 XPLORE,XPLORE X7U,X7U,XPLORE X7U XPPen,XPPen_Magic_Drawing_Pad,Titan_XPPen,MagicDrawingPad XPPen,XPPen_Magic_Drawing_Pad_RU,Titan_XPPen,MagicDrawingPad +XREAL,Beam Pro,X4000,X4000 XTRATECH_IGUANAPAD,X8MT16,X8MT16,X8MT16 +X_View,Protab10,Protab10,Protab10 +X_View,X_View_Q7,X_View_Q7,X_View_Q7 Xcell,Enia,Xcell_Enia,Enia Xcell,View,View,View Xcell,Zoom,Xcell_Zoom,Zoom Xelex,Gama_Tab_X8,Gama_Tab_X8,Gama_Tab_X8 Xgody,N02,N02,N02 Xgody,N02_A,N02_A,N02_A +Xgody,N02_ProA,N02_ProA,N02_ProA +Xgody,P60Pro,P60Pro,P60Pro +Xgody,Q16,Q16,Q16 +Xgody,R15_EEA,R15_EEA,R15_EEA Xgody,T702,T702,T702 Xgody,T702A,T702A,T702A Xgody,T702E_EEA,T702E_EEA,T702E_EEA @@ -39553,11 +41212,13 @@ Xiaomi,MiTV,irobot,MiTV-MOOR1 Xiaomi,MiTV,irobot,MiTV-MOSR2 Xiaomi,MiTV,irobot,MiTV-MOSR3 Xiaomi,MiTV,irobot,MiTV-MOSR4 +Xiaomi,MiTV,ladybird,MiTV-MOEU0 Xiaomi,MiTV,machuca,MiTV-MSSP3 Xiaomi,MiTV,magnolia,MiTV4I Xiaomi,MiTV,martian,MiTV-MSOR0 Xiaomi,MiTV,nino,MiTV-MSSP1 Xiaomi,MiTV,rango,MiTV-AXFR1 +Xiaomi,MiTV,river,MiTV-MZTU0 Xiaomi,MiTV,tarzan,MiTV-MOOQ1 Xiaomi,MiTV,venom,MiTV-MOOR0 Xiaomi,MiTV,venom,MiTV-MOOR2 @@ -39651,17 +41312,24 @@ Xiaomi,Xiaomi 13T Pro,corot,23088PND5R Xiaomi,Xiaomi 13T Pro,corot,A301XM Xiaomi,Xiaomi 14,houji,23127PN0CC Xiaomi,Xiaomi 14,houji,23127PN0CG +Xiaomi,Xiaomi 14 Civi,chenfeng,24053PY09I Xiaomi,Xiaomi 14 Pro,shennong,23116PN5BC Xiaomi,Xiaomi 14 Pro,shennong,2311BPN23C Xiaomi,Xiaomi 14 Ultra,aurora,24030PN60G Xiaomi,Xiaomi 14 Ultra,aurora,24031PN0DC Xiaomi,Xiaomi 14 Ultra,aurora,Xiaomi for arm64 +Xiaomi,Xiaomi 14T,degas,2406APNFAG +Xiaomi,Xiaomi 14T Pro,rothko,2407FPN8EG Xiaomi,Xiaomi Civi,mona,2109119BC Xiaomi,Xiaomi Civi 1S,zijin,2109119BC Xiaomi,Xiaomi Civi 4,chenfeng,24053PY09C +Xiaomi,Xiaomi MIX Flip,ruyi,2405CPX3DC +Xiaomi,Xiaomi MIX Flip,ruyi,2405CPX3DG Xiaomi,Xiaomi MIX Fold,cetus,M2011J18C Xiaomi,Xiaomi MIX Fold 2,zizhan,22061218C Xiaomi,Xiaomi MIX Fold 3,babylon,2308CPXD0C +Xiaomi,Xiaomi MIX Fold 4,goku,24072PX77C +Xiaomi,Xiaomi MIX Fold 4,goku,Xiaomi for arm64 Xiaomi,Xiaomi Pad 5,nabu,21051182C Xiaomi,Xiaomi Pad 5,nabu,21051182G Xiaomi,Xiaomi Pad 5 Pro,dagu,22081281AC @@ -39671,6 +41339,7 @@ Xiaomi,Xiaomi Pad 6,pipa,23043RP34C Xiaomi,Xiaomi Pad 6,pipa,23043RP34G Xiaomi,Xiaomi Pad 6,pipa,23043RP34I Xiaomi,Xiaomi Pad 6 Max 14,yudi,2307BRPDCC +Xiaomi,Xiaomi Pad 6S Pro 12.4,sheng,24018RPACG Xiaomi,Xiaomi TV Box S (2nd Gen),jaws,MiTV-AFKR0 Xiaomi,Xiaomi TV stick 4K,soul,MiTV-AYFR0 Xiaomi,Xiaomi Watch 2,axolotlaxie,Xiaomi Watch 2 @@ -39716,7 +41385,11 @@ Xplore Technologies,XP8776,XP8776,XP8776 Xplore Technologies,XSLATE_D10,XSLATE_D10,iX101B1 Xplore Technologies,XSLATE_D10,XSLATE_D10,iX101D1 Xplore Technologies,XSLATE_D10,XSLATE_D10,iX101D1-FIOS +Xsmart,CORE_X,CORE_X,CORE_X +Xsmart,Mate 20,XsmartMate20,Mate 20 Xsmart,Mate_10,Mate_10,Mate 10 +Xsmart,Nova 10,Xsmart_Nova_10,Nova_10 +Xsmart,Nova_8,Xsmart_Nova_8,Xsmart Nova 8 Xstar,S2,S2,S2 Xstar,T20,T20,T20 Xtratech,BRIO_X31,BRIO_X31,BRIO_X31 @@ -39742,6 +41415,7 @@ YCQ_SZ,YCQ_Q88,YCQ_Q88,YCQ_Q88 YELLYOUTH,TAB_101,TAB_101,TAB_101 YETRUE,yetruepad21,yetruepad21_EEA,yetruepad21 YIKEMI,Pad6_Plus_EEA,Pad6_Plus_EEA,Pad6 PLUS +YINOCHE,R8,R8,R8 YOBANSE,T88,T88,T88 YOBANSE,Y101,Y101,Y101 YOBANSE,Z-T10,Z-T10,Z-T10 @@ -39754,6 +41428,7 @@ YOTOPT,M60_EEA,M60_EEA,M60_EEA YOTOPT,Q11-EEA,Q11-EEA,Q11-EEA YOTOPT,X109,X109,X109 YOTOPT,Y103_EEA,Y103_EEA,Y103_EEA +YOTOPT,Y121-EEA,Y121-EEA,Y121-EEA YOTOPT,Y3-EEA,Y3-EEA,Y3-EEA YOTOPT,Y5-EEA,Y5-EEA,Y5-EEA YOTOPT,Y61,Y61,Y61 @@ -39793,6 +41468,7 @@ YUMKEM,N10-EEA,N10-EEA,N10-EEA YUMKEM,U221,U221,U221 YUMKEM,U221-EEA,U221-EEA,U221-EEA YUMKEM,U320,U320,U320 +YUMKEM,U320-EEA,U320-EEA,U320-EEA YUNTAB,D107,D107,D107 YUNTAB,YUNTAB-K107,YUNTAB-K107,YUNTAB-K107 YUNTAB,YUNTAB-K107_EEA,YUNTAB-K107_EEA,YUNTAB-K107_EEA @@ -39819,7 +41495,11 @@ YesTeL,Note_30_pro,Note_30_pro,Note 30 pro YesTeL,T13-EEA,T13-EEA,T13-EEA YesTeL,T13-US,T13-US,T13-US YesTeL,T13_EEA,T13_EEA,T13_EEA +YesTeL,T13_T_EEA,T13_T_EEA,T13_T_EEA +YesTeL,T13_T_US,T13_T_US,T13_T_US YesTeL,T13_US,T13_US,T13_US +YesTeL,T15_EEA,T15_EEA,T15_EEA +YesTeL,T15_US,T15_US,T15_US YesTeL,T15_U_EEA,T15_U_EEA,T15_U_EEA YesTeL,T15_U_US,T15_U_US,T15_U_US YesTeL,T5,T5,T5 @@ -39830,6 +41510,8 @@ YesTeL,T5_EEA,T5_EEA,T5_EEA YesTeL,T5_EEA_0,T5_EEA_0,T5_EEA_0 YesTeL,X11_EEA,X11_EEA,X11_EEA YesTeL,X2_EEA,X2_EEA,X2_EEA +YesTeL,X2_T_EEA,X2_T_EEA,X2_T_EEA +YesTeL,X2_T_US,X2_T_US,X2_T_US YesTeL,X2_US,X2_US,X2_US YesTeL,X2_U_EEA,X2_U_EEA,X2_U_EEA YesTeL,X2_U_US,X2_U_US,X2_U_US @@ -39918,11 +41600,26 @@ ZETATV,Zeta TV TATU,DV8545-C-KUT,Zeta TV TATU ZIFFLER,ABMS Android TV,shinagawa,ABMS Android TV ZIK (kz),ZIK_W1027,ZIK_W1027,ZIK_W1027 ZIOVO,Z118-EEA,Z118-EEA,Z118-EEA +ZIOVO,Z118-T-EEA,Z118-T-EEA,Z118-T-EEA +ZIOVO,Z118-T-US,Z118-T-US,Z118-T-US ZIOVO,Z118-US,Z118-US,Z118-US +ZIOVO,Z128_EEA,Z128_EEA,Z128_EEA +ZIOVO,Z128_T_EEA,Z128_T_EEA,Z128_EEA +ZIOVO,Z128_T_EEA,Z128_T_EEA,Z128_T_EEA +ZIOVO,Z128_T_US,Z128_T_US,Z128_T_US +ZIOVO,Z128_T_US,Z128_T_US,Z128_US +ZIOVO,Z128_US,Z128_US,Z128_US +ZIOVO,Z138_EEA,Z138_EEA,Z138_EEA +ZIOVO,Z138_US,Z138_US,Z138_US +ZIOVO,Z168_EEA,Z168_EEA,Z168_EEA +ZIOVO,Z168_US,Z168_US,Z168_US +ZIOVO,Z168_U_US,Z168_U_US,Z168_U_US ZLINE,ZLINE_Z_742,ZLINE_Z_742,Z_742 ZMBIZI,ZMBIZI,ZMBIZI_Z1,ZMBIZI Z1 ZMBIZI,ZMBIZI Z2,ZMBIZI_Z2,ZMBIZI Z2 ZMOOTH,ZMOOTH ZTAB020,Zkai-study-Tab,ZTAB020 +ZOFYWNAS,D10,D10,D10 +ZOFYWNAS,D10_EEA,D10,D10 ZOLON,L16XX,L16XX,L16XX ZOLON,M30,M30,M30 ZOLON,M50,M50,M50 @@ -40788,7 +42485,6 @@ ZTE,Nubia 4010,P963F60,Nubia 4010 ZTE,Nubia 6010,P963F07,Nubia 6010 ZTE,Nubia 8011,P963F05,Nubia 8011 ZTE,Nubia 8031,P963F06,Nubia 8031 -ZTE,Nubia Flip 5G,P745F01,NX724J ZTE,Nubia N11,P731F50,Nubia N11 ZTE,Nubia N40,P963F50_A,Nubia N40 ZTE,Nubia N40,P963F50_A,ZTE Blade A51 Lite @@ -40797,6 +42493,8 @@ ZTE,OWN FUN 5(4G),VFD511,ZTE BLADE A321 ZTE,OWN One Plus,ZTE_Blade_V580,OWN One Plus ZTE,Optimus Barcelona,blade2,Optimus Barcelona ZTE,Optus X Max,P606F05,Blade A72s +ZTE,Optus X Pro 5G,P720F02,A73 Pro 5G +ZTE,Optus X Tap 3,P606F10,P660 ZTE,Orange Hi 4G,Orange_Hi_4G,Orange Hi 4G ZTE,Orange Hi 4G,msm8226,Orange Hi 4G ZTE,Orange Monte Carlo,skate,Orange Monte Carlo @@ -40988,6 +42686,7 @@ ZTE,TURKCELL T60,P839T60,TURKCELL T60 ZTE,TURKCELL T60,msm8916_32,TURKCELL T60 ZTE,TURKCELL T70,P809T70,TURKCELL T70 ZTE,TURKCELL T80,P840F14,TURKCELL T80 +ZTE,TV Stick 4K,YEV,TV Stick 4K ZTE,Telenor Touch Plus,blade2,Telenor Touch Plus ZTE,Telstra Tough Max 3,T86,T86 ZTE,Tempo,xray45,N9131 @@ -41196,6 +42895,9 @@ ZTE,Z-01K,Z-01K,Z-01K ZTE,Z10,P817E52,ZTE Z10 ZTE,Z2020N3,Z8850K,A2020N3 ZTE,Z2351N,P720F08,Z2351N +ZTE,Z2359,P606F13,Z2359 +ZTE,Z2450,P963F65,Z2450 +ZTE,Z2459,P616F05,Z2459 ZTE,Z3153V,Z3153,Z3153V ZTE,Z3351S,Z3351,Z3351S ZTE,Z3352CA,Z3352CA,Z3352CA @@ -41396,6 +43098,7 @@ ZTE,ZTE Axon 20 5G,P725A02,ZTE A2121G ZTE,ZTE Axon 30 Pro 5G,P875A12,ZTE A2022P ZTE,ZTE Axon 30 Ultra 5G,P875A11,ZTE A2022PG ZTE,ZTE Axon 60,P616F02,Z2356 +ZTE,ZTE Axon 60 Lite,P606F10,Z2350 ZTE,ZTE B2017,msm8952_64,ZTE B2017 ZTE,ZTE BLADE A0605,P809F15,ZTE BLADE A0605 ZTE,ZTE BLADE A0605,P809F15,ZTE BLADE A6 MAX @@ -41473,6 +43176,7 @@ ZTE,ZTE Blade A33+ Core,P963F92,ZTE Blade A33+ Core ZTE,ZTE Blade A33s,P963F93,ZTE Blade A33s ZTE,ZTE Blade A34,P963F94,ZTE Blade A34 ZTE,ZTE Blade A34,P963F94_A,ZTE Blade A34 +ZTE,ZTE Blade A35 Core,P963F10,ZTE Blade A35 Core ZTE,ZTE Blade A35 Lite,P963F10,ZTE Blade A35 Lite ZTE,ZTE Blade A3v,Z5157,Z5157V ZTE,ZTE Blade A3v,Z5157,Z5157Y @@ -41512,6 +43216,8 @@ ZTE,ZTE Blade A7 2020RU,P662F02D,ZTE Blade A7 2020RU ZTE,ZTE Blade A7 2020RU,P662F02_D1,ZTE Blade A7 2020RU ZTE,ZTE Blade A72s,P606F05,ZTE A7050 ZTE,ZTE Blade A73,P606F07,ZTE 7060 +ZTE,ZTE Blade A75 5G,P720F09,Z2357N +ZTE,ZTE Blade A75 5G S,P720F09,Z2357N ZTE,ZTE Blade A7s,P662F02,ZTE Blade A7s ZTE,ZTE Blade A7s 2020,P963F03,ZTE A7020 ZTE,ZTE Blade A7s 2020,P963F03,ZTE A7020RU @@ -41542,14 +43248,19 @@ ZTE,ZTE Blade V50 Design,P606F08,ZTE 8050 ZTE,ZTE Blade V50 Design,P606F08,nubia 8050 ZTE,ZTE Blade V50 Design 5G,P720F03,ZTE 8150N ZTE,ZTE Blade V50 Vita,P606F09,ZTE 8550 +ZTE,ZTE Blade V60 Design,P606F10,Z2350 +ZTE,ZTE Blade V60 Vita,P606F10,Z2350 ZTE,ZTE Blade V770,P852F52,ZTE Blade V770 ZTE,ZTE Blade V8 Arc,P840V80,ZTE Blade V8 Arc ZTE,ZTE Blade V9,P450S10,ZTE V0900 ZTE,ZTE Blade X10,P963T01C,ZTE T1002 +ZTE,ZTE Blade X10 II,P616T03C,YURATAB YT110 ZTE,ZTE Blade X10 II,P616T03_AC,ZTE T1006 ZTE,ZTE Blade X10 II Pro+,P618T01C,ZTE T1004 ZTE,ZTE Blade X10 Pro,P963T02C,ZTE T1003 ZTE,ZTE Blade X10s,P963T01C,ZTE T1002 +ZTE,ZTE Blade X8 II,P616T02C,ZTE T0805 +ZTE,ZTE Blade X8 II,P616T02_BC,YURATAB YT108 ZTE,ZTE Blade X8 II Pro,P616T02_AC,ZTE T0805 ZTE,ZTE Blade X8 Pro,P616T01C,ZTE T0802 ZTE,ZTE C2017,alice,ZTE C2017 @@ -41602,27 +43313,37 @@ ZTE,dtac phone M1,P635A50,dtac phone M1 ZTE,myPad P5,K78,Amazing_P5 ZTE,myPad P5,K78,myPad P5 ZTE,nubia Z30 Pro,P875N02,NX667J +ZTE,nubia 8046,P616F01,nubia 8046 ZTE,nubia Blade A72,Z6255,Z6255CA +ZTE,nubia Flip 5G,P745F01,NX724J ZTE,nubia Flip 5G,Z8888S,NX724J +ZTE,nubia Flip 5G S,P745F01,NX724J ZTE,nubia Music,P963F11,Z2353 ZTE,nubia Neo 2 5G,P820F03,Z2352N ZTE,nubia Neo 5G,P720F03_A,nubia 8150N ZTE,nubia Pad 3D,LumePad,LPD-20W ZTE,nubia Play,NX651J,NX651J ZTE,nubia V50 Vita,P606F09,nubia 8550 +ZTE,nubia V60,P616F02,Z2356 +ZTE,nubia V60 Design,P606F10,Z2350 +ZTE,nubia V70 Design,P606F17,Z2458 ZTE,nubia Z5,NX501,nubia Z5 ZTE,nubia Z50 Ultra,PQ82A11,NX712J ZTE,nubia Z50S Pro,PQ82A02,NX713J ZTE,nubia Z60 Ultra,PQ83A01,NX721J ZTE,nubia Z60 Ultra,PQ83F01,NX721J +ZTE,nubia Z60S Pro,PQ82A04,NX725J ZTE,sapphire lte,sapphire4g,Z3001S ZTE,tmn smart a15,atlas40,tmn smart a15 ZTE,tmn smart a60,kiska,tmn smart a60 ZTE,tmn smart a7,sailboat,tmn smart a7 +ZTE,zBOX 2,YMA,zBOX 2 ZTE,zBox 1,YXE,zBox 1 ZTE,中兴Axon 50 Ultra 5G,P898A25,ZTE A2024H ZTE,中兴畅行40,P963S71,ZTE 1020L ZTE,中兴远航41,P720S11,ZTE 7541N +ZTLEKE,P10MAX,P10MAX,P10MAX +ZTLEKE,P10PRO,P10PRO,P10PRO ZTLEKE,S8Plus,S8Plus,S8Plus ZUKU,A151,A155,A151 ZUKU,DV8330-T2,DV8330-T2,DV8330-T2 @@ -41712,6 +43433,7 @@ Zebra,TC53E,TC53E,TC53E Zebra,TC55,TC55,TC55 Zebra,TC56,TC56,TC56 Zebra,TC58,TC58,TC58 +Zebra,TC58E,TC58E,TC58E Zebra,TC70x,TC70x,TC70x Zebra,TC73,TC73,TC73 Zebra,TC73,TC73T,TC73 @@ -41722,7 +43444,9 @@ Zebra,TC78,TC78T,TC78 Zebra,TC8000,TC8000,TC8000 Zebra,TN28,TN28,TN28 Zebra,VC80x,VC80x,VC80x +Zebra,WT5400,WT5400,WT5400 Zebra,WT6000,WT6000,WT6000 +Zebra,WT6400,WT6400,WT6400 Zebra,Zebra Technologies ET51,ET51L,ET51 Zebra,Zebra Technologies ET51,ET51S,ET51 Zebra,Zebra Technologies ET56,ET56L,ET56 @@ -41834,7 +43558,10 @@ Zonda,AWM533,AWM533,AWM533 Zong 4G,Z1,Z1,Z1 Zong 4G,Z2,Z2,Z2 Zonko,D105,D105,D105 +Zonko,D105_EEA,D105_EEA,D105_EEA Zonko,D106,D106,D106 +Zonko,D110,D110,D110 +Zonko,D115_EEA,D115_EEA,D115_EEA Zonko,D118,D118,D118 Zonko,D136,D136,D136 Zonko,K100,K100,K100 @@ -41874,6 +43601,7 @@ Zopo,ZOPO_Flash_X3,ZOPO_Flash_X3,ZOPO Flash X3 Zpad,ZKIDS,ZKIDS,ZKIDS Zpad,ZpadX7,ZpadX7,ZpadX7 Zpad,Zpad_X7,Zpad_X7,Zpad X7 +Zucchetti,Zpad 608,Zpad_608,Zpad 608 Zuk,Lenovo Z2 Plus,z2_plus_hw,ZUK Z2132 Zuk,Z1,Z1,Z1 Zuk,Z1,Z1,ZUK Z1 @@ -41891,6 +43619,7 @@ Zuum,AURA PRO,AURA_PRO,AURA PRO Zuum,AURA PRO JLO,AURA_PRO_JLO,AURA PRO JLO Zuum,AURA X,AURA_X,AURA X Zuum,AURA Z,AURA_Z,AURA_Z +Zuum,AURA Z1,Aura_Z1,AURA Z1 Zuum,Aura M1,Aura_M1,AURA M1 Zuum,COVET,COVET,COVET Zuum,COVET PLUS,COVET_PLUS,COVET PLUS @@ -41904,6 +43633,7 @@ Zuum,GRAVITY M,GRAVITY_M,GRAVITY M Zuum,GRAVITY Z,GRAVITY_Z,GRAVITY Z Zuum,Gravity,Gravity,Gravity Zuum,Gravity Life,Gravity_Life,Gravity Life +Zuum,Hidra Max,Hidra_Max,Hidra Max Zuum,Hidra Plus,Hidra_Plus,Hidra Plus Zuum,LIMIT,LIMIT,LIMIT Zuum,MAGNO,ZUUM_MAGNO,MAGNO @@ -41914,6 +43644,7 @@ Zuum,MAGNO C1,MAGNO_C1,MAGNO C1 Zuum,MAGNO C2,MAGNO_C2,MAGNO C2 Zuum,MAGNO MINI,MAGNO_MINI,MAGNO MINI Zuum,Magno Pro,Magno_Pro,Magno Pro +Zuum,NOVA_10,NOVA_10,NOVA_10 Zuum,ONIX,ONIX,ONIX Zuum,ONIX S,ONIX_S,ONIX S Zuum,ROCKET II,ROCKET_II,ROCKET II @@ -41960,6 +43691,7 @@ aoson,R103,R103,R103 aoson,aoson,M815,M815 ascon,AT14,AT14,AT14P464 axs+,AXS B866V2FA,B866V2FA_AXS,AXS B866V2FA +bbox,bbox,IMTM741,IMTM741 bbox,bbox,bbox-M752A,bbox-M752A beafon,Class_C250,Class_C250,Class_C250 beafon,M5,M5,M5 @@ -41976,6 +43708,7 @@ benco,AE9240,AE9240,AE9240 benco,AE9310,AE9310,AE9310 benco,AE9950,AE9950,AE9950 benco,AEOP519,AEOP519,AEOP519 +benco,AEOP520,AEOP520,AEOP520 benco,AF9010_F,AF9010_F,AF9010_F benco,AF9020,AF9020,AF9020 benco,AF9030,AF9030,AF9030 @@ -42051,9 +43784,11 @@ bq,Edison_3_mini,Edison_3_mini,Edison 3 mini bq,M8,Aquaris_M8,Aquaris M8 care.ai,AIM H1,AIM-H1,AIM H1 care.ai,AMS-R2O,AMS_R2O,AMS-R2O +care.ai,AMS_R2C,AMS_R2C,AMS-R2C carp(IN),carp 2K Android TV,lasalle,carp 2K Android TV carp(IN),carp 4K Android TV,kenton,carp 4K Android TV carrozzeria,SDA-700TAB,SDA_700TAB,SDA-700TAB +chocoZAP,RZ2408,RZ2408,RZ2408 cosmos,Aries_8in,Aries_8in,Aries_8in cosmos,Lynx_10in,Lynx_10in,Lynx_10in cosmos,Nova_10in,Nova_10in,Nova_10in @@ -42066,6 +43801,7 @@ d.light,M200A,M200,M200 dazen,DAZN,m393gena_dazn,DAZN dazen,dazen 6A,dazen_6A,dazen 6A dazen,dazen 6E,dazen_6E,dazen 6E +denver,TIO_80,TIO_80,TIO-80 digITS,T1,T1,T1 du (UAE),IPBS9520,IPBS9520,IPBS9520 du (UAE),du TV,f515,VIP7802 @@ -42105,7 +43841,12 @@ efioo,efiootabn7a,efiootabn7a,Tab N7a elactron,R3,R3,R3 elactron,R4,R4,R4 elevn,elevn_eTab,elevn_eTab,elevn_eTab +enGo,SmartPad,SmartPad,SmartPad_01 eroc,F1,BOS,TV Stick +fezawio,F10_EEA,F10_EEA,F10_EEA +fezawio,F10_US,F10_US,F10_US +fezawio,F11_EEA,F11_EEA,F11_EEA +fezawio,F11_US,F11_US,F11_US fplus,H166,H166,H166 fplus,Life Tab Plus,lifetabplus,LifeTabPlus fplus,P670,P670,P670 @@ -42127,6 +43868,8 @@ geaneePro,JT70-X,JT07-X,JT07-X generaltouch,ERGO22,ERGO22,ERGO22 generaltouch,ERGO22,ERGO22,ERGO22_eea halotel,H8502,H8502,H8502 +hitabt,K30A,K30A,K30A +hitabt,T30A_SY07PC01,T30A_SY07PC01,SY07-PC01 homez,Smart TV,redwood,AI PONT i-Buddie,TA10CA1,TA10CA1,TA10CA1 i-Buddie,TA10CA2,TA10CA2,TA10CA2 @@ -42249,6 +43992,7 @@ iData,K3S,K3S,K3S iData,K8,K8,K8 iData,iData 50,iData_50_EEA,iData 50 iData,iData K1,iData_K1_EEA,iData K1 +iData,iData K3 Pro,K3Pro,K3Pro iData,iData P1,iData_P1,iData P1 iData,iData P1 mini,iData_P1_mini,iData P1 mini iData,iData T1,T1,iData T1 @@ -42273,6 +44017,7 @@ iGet,SMART_G81H,SMART_G81H,SMART_G81H iGet,SMART_L102,iGET_SMART_L102,SMART_L102 iGet,SMART_L103_eea,SMART_L103,SMART_L103_eea iGet,SMART_L104_eea,SMART_L104_eea,SMART_L104_eea +iGet,SMART_L11,SMART_L11,SMART L11 iGet,SMART_L206,SMART_L206,SMART_L206 iGet,SMART_L20X,SMART_L20X,SMART_L20X iGet,SMART_L30,SMART_L30,SMART L30 @@ -42284,7 +44029,12 @@ iGet,SMART_W10X_EEA,SMART_W10X_EEA,SMART_W10X_EEA iGet,SMART_W202,SMART_W202,SMART_W202 iGet,SMART_W203,SMART_W203,SMART_W203 iGet,SMART_W20X,SMART_W20X,SMART_W20X +iGet,SMART_W30_EEA,SMART_W30_EEA,SMART_W30 +iGet,SMART_W31_EEA,SMART_W31_EEA,SMART_W31 +iGet,SMART_W32,SMART_W32,SMART W32 +iGet,SMART_W84_EEA,SMART_W84_EEA,SMART_W84 iGet,SMART_W8X,SMART_W8X,SMART_W8X +iGet,SMART_W8_Kids,SMART_W8_Kids,SMART W8 Kids iHunt,Alien X,Alien_X,Alien_X iHunt,Alien X Apex 2020,Alien_X_Apex_2020,Alien_X_Apex_2020 iHunt,Alien X Lite,Alien_X_Lite,Alien X Lite @@ -42299,6 +44049,8 @@ iHunt,Like 8,Like_8,Like_8 iHunt,Like_7,Like_7,Like_7 iHunt,Like_Hi10_2021,Like_Hi10_2021,Like_Hi10_2021 iHunt,Like_Hi5,Like_Hi5,Like Hi5 +iHunt,P11000 Pro,P11000_Pro,P11000 Pro +iHunt,P22000 Ultra,P22000_Ultra,P22000 Ultra iHunt,P25000 Pro,P25000_Pro,iHunt Titan P25000 Xtreme iHunt,P32000_Ultra_EEA,P32000_Ultra,Strong Tablet P32000 Ultra 5G iHunt,P8000_Ultra_EEA,P8000_Ultra,Titan P8000 Ultra Carbon @@ -42312,6 +44064,7 @@ iHunt,S30 ULTRA APEX 2021,S30_ULTRA_APEX_2021,S30 ULTRA APEX 2021 iHunt,S60 Discovery Plus,S60_Discovery_Plus,S60 Discovery Plus iHunt,S60_Discovery_2019,S60_Discovery_2019,S60_Discovery_2019 iHunt,Strong Tablet P15000 Pro,Tablet_P15000,Strong Tablet P15000 Pro +iHunt,Strong Tablet P15000 Ultra,P15000_Ultra,Strong Tablet P15000 Ultra iHunt,TITAN P11000 PRO,TITAN_P11000_PRO,TITAN_P11000_PRO iHunt,TITAN P15000 PRO 5G,P15000PRO_5G,TITAN P15000 PRO 5G iHunt,Tablet PC 10 PRO,Tablet_PC_10_PRO_EEA,Tablet PC 10 PRO @@ -42330,6 +44083,7 @@ iHunt,iHunt S24 PLUS,iHunt_S24_PLUS,iHunt S24 PLUS iHunt,iHunt S24 ULTRA,iHunt_S24_ULTRA,iHunt S24 ULTRA iHunt,iHunt S90 Apex,S90_Apex,S90_Apex iHunt,iHunt Tablet PC 11 Ultra,Tablet_PC_11_Ultra,iHunt Tablet PC 11 Ultra +iHunt,iHunt Titan P10000 Pro,P10000_Pro,iHunt Titan P10000 Pro iHunt,iHuntLike12PRO,iHuntLike12PRO,iHunt Like 12 PRO iHunt,iHuntS22PLUS,iHuntS22PLUS,iHunt S22 PLUS iHunt,iHunt_Like_12_EEA,iHunt_Like_12,iHunt Like 12 @@ -42364,20 +44118,25 @@ iMACHINE,iMACHINE AP02 PLUS,AP02_PLUS,AP02 PLUS iMACHINE,iMachine AP12,AP12,AP12 iMACHINE,iMachine i2,i2,i2 iMESH,IM-560,IM-560,IM-560 -iMin,Crane1-16,Crane1,Crane1-16 +iMin,Crane 1,Crane1,Crane1-21_27_32 +iMin,Crane1,Crane1,Crane1-16 iMin,D4 Pro,D4Pro,I23D01 iMin,Falcon 1,I22T01,I22T01 +iMin,I24T01,Falcon2,I24T01 +iMin,I24T02,Falcon2,I24T02 iMin,Swan 1 Pro,Swan1Pro,I23D02 iMin,Swift 1,I22M01,I22M01 iMin,Swift 1,I22M01,Swift_1 +iMin,Swift 1 Pro,Swift1Pro,I23M03 +iMin,Swift 2,Swift2,I23M01_GL iMin,Swift 2 Pro,Swift2Pro,I23M02 -iMin,Swift1Pro,Swift1Pro,I23M03 -iMin,Swift2_GL,Swift2,I23M01_GL +iMin,Swift2_EEA,Swift2,I23M01_EEA iMuz,4K Smart TV,pioneer,4K SA Smart TV iMuz,EG104,EG104,EG104 iMuz,"Foryou Digital Co.,Ltd",EG125,EG125 iMuz,G10,G10,G10 iMuz,G10E,G10,G10 +iMuz,IM-H261,IM-H261,IM-H261 iMuz,IMH101,IMH101,IMH101 iMuz,L101,G10,L101 iMuz,M101,G10,M101 @@ -42463,7 +44222,6 @@ iSWAG,ODIN,ODIN,ODIN iSWAG,STREAM7,STREAM7,STREAM7 iSWAG,STREAM7Plus,STREAM7Plus,STREAM7 iSWAG,iSWAG ACTIV,iSWAG_ACTIV,iSWAG ACTIV -iSolution,OPS_RK3588_B,AKMEI14,ACER_ALTOS_EZB iTab XPLUS,ITAB_X38T,ITAB_X38T,ITAB_X38T iTab XPLUS,iTAB-A1,iTAB-A1,iTAB-A1 iTab XPLUS,iTab_XPLUS_10_1,iTab_XPLUS_10_1,iTab_XPLUS_10_1 @@ -42494,6 +44252,7 @@ iWaylink,TC603B_P,TC603B_GWL,TC603B_GWL iYOU,A10,A10,A10 iYOU,iYOU_M1,iYOU_M1,iYOU_M1 ibowin,M10ES11,M10ES11,M130s +iiyama,TEXX14MIS-B2AG,rk3588_t,TEXX14MIS-B2AG imiia,4K Smart TV,gangbyeon,imiia 4K AI Smart TV imiia,4K Smart TV,pioneer,4K PA Smart TV imiia,Smart TV,mateo,2K PA Smart TV @@ -42508,8 +44267,12 @@ imose,Omotab2,Omotab2,Omotab2 imose,Omotab_2s,Omotab_2s,Omotab 2s imose,SEMPE,SEMPE,SEMPE imozen,TC605AN,TC605,TC605 +imozen,TC605AW,TC605,TC605 +incar,E38_RU,E38,E38 indigi,G4i,G4i,G4i +inefi,Android_G17,Android_G17,Android_G17 inefi,SlimPOS319,SlimPOS319,SlimPOS319 +innex,Meeting_hub_EU,EU_3588,EU innos,Android TV,R2,ATV R2 innos,Innos,shilin,Innos4KAndroidTV innos,innos,bruno,Innos2KAndroidTV @@ -42525,6 +44288,7 @@ ioutdoor,Polar3,Polar3,Polar3 ioutdoor,Polar3_EEA,Polar3,Polar3 jAC-EG,43JB822,beaudry,jAC AndroidTV jAC-EG,55JB832,barking,jAC AndroidTV +jHon,H800,H800,H800 jetfon,MT1,MT1,MS4GSA02 kiddoboo,KB101,KB101,KB101 kiddoboo,KB101B,KB101B,KB101B @@ -42542,6 +44306,7 @@ koobee,S19,Koobee_S19,S19 koobee,koobee_K10,koobee_K10,K10 koobee,koobee_S12,koobee_S12,S12 kozen,D1,D1,D1 +kozen,P18,P18,P18 kozen,T5,T05,T5 leaderhub,S19_EEA,S19_EEA,S19 mMax,mMax M55,M55,M55 @@ -42549,6 +44314,8 @@ memetech,P30,P30,P30 menfop,HaierP8B,HaierP8B,HaierP8B mipo,mipo_M17,mipo_M17,mipo_M17 mipo,mipo_M59,mipo_M59,mipo_M59 +miracle_tap,miracle_tap_10,miracle_tap_10,miracle_tap_10 +mirarel,16MBTW+,ksr,mirarel JTB Google TV moderness.online,TK807,TK807,TK807 mytel,M9501,M9501,M9501 mytel,M9502,M9502,M9502 @@ -42557,6 +44324,7 @@ mytel,M9602,M9602,M9602 mytel,Msuper,Msuper,Msuper mytel,Mytel M9601,Mytel_M9601,M9601 naomicase,N4MAX,N4MAX,N4MAX +neocore,NEOCORE-E2S,NEOCORE-E2S,NEOCORE-E2S neocore,NEOCORE_E2,NEOCORE_E2,NEOCORE_E2 neocore,neocore_E1_2,neocore_E1_2_eea,neocore E1-2 neocore,neocore_N1G1,neocore_N1G1,neocore_N1G1 @@ -42569,6 +44337,7 @@ novo,Bonvi Pro,t596_dp_n_37m35,Bonvi Pro okayseamedia,TK706,TK706,TK706 okayseamedia,TK708,TK708,TK708 okayseamedia,TK708_EEA,TK708_EEA,TK708_EEA +okulaku,K10,K10,K10 okulaku,UKD30,UKD30,UKD30 okulaku,ZIDS701,ZIDS701,ZIDS701 onn., onn_100003561,mid8011,100003561 @@ -42587,15 +44356,19 @@ onn.,100092980,100092980,100092980 onn.,100092988,mid7019_mr_32,100092988 onn.,M17QF21W,M17QF21W,M17QF21W onn.,MID8016,mid8016_mk_32,MID8016 +onn.,PM1042T-W,PM1042T-W,PM1042T-W onn.,PM82T,PM82T,PM82T onn.,Tablet Gen 4,100135923,100135923 onn.,Tablet Gen 4,100135925,100135925 +onn.,onn. 11 Tablet Pro,onn11TabletPro,100146660 +onn.,onn. 12 Tablet Pro,onn12TabletPro,100146663 onn.,onn. 4K Streaming Box,YOC,onn. 4K Streaming Box onn.,onn. 4k TV,sti6140d360,sti6140d360 +onn.,onn. Full HD Streaming Device,XNA,onn. Full HD Streaming Device onn.,onn. Streaming Device 4K pro,SNA,onn. Streaming Device 4K pro -onn.,onn_2k_gtv,XNA,onn. Full HD Streaming Device pendo,PNDPP44QC10,PNDPP44QC10,PNDPP44QC10 pendo,PNDPP44QC7,PNDPP44QC7,PNDPP44QC7 +predia,Odin Groep,rk3588_t,general_en_bytello_edla preo,PTABP10,PTABP10,PTABP10 preo,PTAB_P8,PTAB_P8,PTAB_P8 prowise,Prowise Touchscreen Ten,ifpd,prowise @@ -42610,6 +44383,7 @@ qunyiCO,Y7,Y7_0_EEA,Y7 qunyiCO,Y7_EEA,Y7_EEA,Y7 realme,4K Google TV Stick,YYT,4K Google TV Stick realme,4K Smart TV,gangbyeon,4K AI Smart TV +realme,NARZO 70 5G,RE5C86L1,RMX3869 realme,NARZO 70 Pro 5G,RE5C86L1,RMX3868 realme,RMX3268,RED8D7,RMX3268 realme,RMX3612,RE588DL1,RMX3612 @@ -42618,6 +44392,9 @@ realme,RMX3710,REE2ADL1,RMX3710 realme,RMX3771,RE58B8L1,RMX3771 realme,RMX3782,RE5C6CL1,RMX3782 realme,RMX3834,RE5C9F,RMX3834 +realme,RMX3871,RE6063L1,RMX3871 +realme,RMX3933,RE6054,RMX3933 +realme,RMX3939,RE6054,RMX3939 realme,RMX3997,RE5C9AL1,RMX3997 realme,RMX3998,RE5C94L1,RMX3998 realme,Smart TV,mateo,2K PA Smart TV @@ -42649,12 +44426,18 @@ realme,realme 11 Pro 5G,RE58B8L1,RMX3771 realme,realme 11 Pro+,RE5865,RMX3740 realme,realme 11 Pro+ 5G,RE58B6L1,RMX3741 realme,realme 11x 5G,RE5C6CL1,RMX3785 +realme,realme 12,RE6063L1,RMX3871 realme,realme 12 5G,RE5C94L1,RMX3999 realme,realme 12 Lite,RE5C91L1,RMX3890 realme,realme 12 Pro 5G,RE5C84L1,RMX3842 realme,realme 12 Pro+ 5G,RE5C82L1,RMX3840 realme,realme 12+ 5G,RE5C86L1,RMX3867 realme,realme 12x 5G,RE5C9AL1,RMX3997 +realme,realme 13 5G,RE6070L1,RMX3951 +realme,realme 13 Pro 5G,RE5CA3L1,RMX3988 +realme,realme 13 Pro 5G,RE5CA3L1,RMX3990 +realme,realme 13 Pro+ 5G,RE5CA3L1,RMX3921 +realme,realme 13+ 5G,RE6066L1,RMX5000 realme,realme 4K G Smart TV,SW6H,realme 4K G Smart TV realme,realme 4K G Smart TV FF,SW6H,realme 4K G Smart TV FF realme,realme 6,RMX2001L1,RMX2001 @@ -42714,11 +44497,16 @@ realme,realme C51s,RE5C51,RMX3765 realme,realme C53,RE58C2,RMX3760 realme,realme C53,RE58CE,RMX3762 realme,realme C55,REE2ADL1,RMX3710 +realme,realme C61,RE6054,RMX3930 +realme,realme C63,RE6054,RMX3939 +realme,realme C63 5G,RE6070L1,RMX3950 realme,realme C65,RE5C42,RMX3910 realme,realme C67,RE5C91L1,RMX3890 realme,realme GT 2 ,RE58B2L1,RMX3312 realme,realme GT 2 Pro ,RED8ACL1,RMX3301 realme,realme GT 5G,RMX2202L1,RMX2202 +realme,realme GT 6,RE5CA6L1,RMX3851 +realme,realme GT 6T,RE606FL1,RMX3853 realme,realme GT Master Edition,RE507C,RMX3361 realme,realme GT Master Edition ,RE54ABL1,RMX3360 realme,realme GT NEO 3,RED8BEL1,RMX3561 @@ -42735,6 +44523,7 @@ realme,realme Narzo 30 Pro 5G,RMX2117L1,RMX2117 realme,realme Note 50,RE5C9F,RMX3834 realme,realme P1 5G,RE5C86L1,RMX3870 realme,realme P1 Pro 5G,RE5C84L1,RMX3844 +realme,realme P2 Pro 5G,RE5CA3L1,RMX3987 realme,realme Pad 2,RE5C6EL1,RMP2204 realme,realme Pad 2,RE5C70L1,RMP2205 realme,realme Pad X,RE5496,RMP2108 @@ -42779,6 +44568,7 @@ realme,realme narzo 50i,RED8FA,RMX3235 realme,realme narzo 50i Prime,RE588E,RMX3506 realme,realme narzo 60 5G,RE58B1L1,RMX3750 realme,realme narzo N53,RE58C6,RMX3761 +realme,realme note 50,RE5C9F,RMX3834 realme,realme pad,RE54C1L1,RMP2102 realme,realme pad,RE54C1L1,RMP2103 realme,realme  X7 Pro ,RMX2121CN,RMX2121 @@ -42791,14 +44581,19 @@ realme,真我 Q3 Pro 5G,RMX2205CN,RMX2205 realme,真我 V20,RE584B,RMX3610 realme,真我 V20,RE584B,RMX3611 realme,真我11 Pro,RE5869,RMX3770 +realme,真我12,RE5C3F,RMX3992 realme,真我12 Pro,RE5C3C,RMX3843 realme,真我12 Pro+,RE5C3B,RMX3841 realme,真我12x,RE5C3F,RMX3993 +realme,真我13 Pro+,RE5C49L1,RMX3920 +realme,真我13 Pro至尊版,RE5C49L1,RMX3989 realme,真我GT 2 ,RE5471,RMX3310 realme,真我GT 2 ,RE58B2L1,RMX3311 realme,真我GT 2 Pro ,RE547F,RMX3300 realme,真我GT Neo,RMX3031CN,RMX3031 +realme,真我GT Neo6,RE5C46L1,RMX3852 realme,真我GT Neo6 SE,RE5C39L1,RMX3850 +realme,真我GT6,RE5C4FL1,RMX3800 realme,真我Q3s ,RE548B,RMX3461 realme,真我Q3s ,RE548B,RMX3462 realme,真我V13 5G,RE5081,RMX3041 @@ -42806,6 +44601,13 @@ realme,真我V13 5G,RE5081,RMX3042 realme,真我V13 5G,RE5081,RMX3043 realme,真我V50,RE5C34,RMX3783 realme,真我V50s,RE5C34,RMX3781 +realme,真我V60,RE5C44,RMX3995 +realme,真我V60s,RE5C44,RMX3996 +redbeat,D5,D5,D5 +redbeat,E3,E3,E3 +redbeat,redbeatA2,redbeatA2,redbeatA2 +redbeat,redbeatM2,redbeatM2,M2 +redbeat,redbeatM2,redbeatM2,redbeatM2 redfox,Valuer_V8,Valuer_V8,Valuer_V8 redfox,Wizpad_Valuer_R10S,R10S,Wizpad Valuer R10S redfox,Wizpad_Valuer_V8,wvv832,Wizpad_Valuer_V8 @@ -42822,6 +44624,8 @@ sf-express,HHT7AX_HK1,HHT7AX_HK1,HHT7AX_HK1 sf-express,HHT7AX_TW1,HHT7AX_TW1,HHT7AX_TW1 sf-express,HHT7A_HK1,HHT7A_HK1,HHT7A_HK1 sf-express,HHT7A_TW1,HHT7A_TW1,HHT7A_TW1 +shoudum,X50,X50,X50 +shoudum,X_50,X_50,X_50 simfer,simfer 2K Android TV,lasalle,simfer 2K Android TV simfer,simfer 4K Android TV,kenton,simfer 4K Android TV simpliTV,Strong-SRT4150,HY43X,Strong-SRT4150 @@ -42830,6 +44634,7 @@ sincoole,PAD-A7,Rugged_Tablet-A7,PAD-A7 sincoole,ST11-A5,ST11-A5,ST11-A5 sky HCN,KSTB1157,K1100UA,KSTB1157 sky HCN,skyhcn Android UHD STB,IMT-H6300,IMT-H6300 +skywooo,DDT_002,DDT_002,DDT_002 stc myhome,myHome,SEI560STC,myHome sugar_aums,QPOINT,QPI-1,QPI-1 teXet,TM-4510,TM-4510,TM-4510 @@ -42851,6 +44656,7 @@ teXet,Texet TM-5581,tm5581,TM-5581 teXet,Texet TM-5584,TM-5584,TM-5584 techBITE,Flix TV Box,DV8219,Flix TV Box techBITE,SmartBoard 10 LTE,SmartBoard_10_LTE,SmartBoard_10_LTE +techBITE,Smartboard_III_12_EEA,TT2401x,Smartboard III 12 tecmobile,OmnisOne,OmnisOne,Omnis One thehaam,THEHAAM,hongkong,4K SMART TV trueslim,5516D,5516D,5516D @@ -42866,6 +44672,9 @@ truvii,Truvii,sugamo,Truvii 2K Android TV uLesson,uLesson_Education_Tab,uLesson_Education_Tab,uLesson_Education_Tab uLesson,uLesson_Education_Tab_V2,uLesson_Tab_V2,uLesson_Education_Tab_V2 ucall,EASY1,EASY1,EASY1 +ugee,UT1Lite_NOEEA,ugeeUT1Lite_NOEEA,UT2 +ugee,UT2,ugeeUT1Lite_EEA,UT2 +ugee,UT2,ugeeUT1Lite_RU,UT2 unitel,P45,P45,P45 unitel,U901,U901,U901 unitel,U902,U902,U902 @@ -42884,6 +44693,8 @@ videocon,Metal Pro 2,V505920,V505920 videocon,Starr 100,V406018,V406018 waiputv,Hybrid Stick,SEI730WP,Hybrid Stick waiputv,waipu tv stick,SEI700WP,waipu tv stick +weelikeit,C19W,C19W,C19W +weelikeit,C19W_EEA,C19W_EEA,C19W_EEA weelikeit,C72W,C72W,C72W weelikeit,C72W_EEA,C72W_EEA,C72W_EEA weelikeit,C74W_EEA,C74W_EEA,C74W_EEA @@ -42897,8 +44708,18 @@ weelikeit,C85W_EEA,C85W_EEA,C85W_EEA weelikeit,F11W,F11W,F11W weelikeit,F11W_EEA,F11W,F11W_EEA weelikeit,F83W,F83W,F83W +weelikeit,P10W,P10W,P10W +weelikeit,P10W_EEA,P10W_EEA,P10W_EEA +weelikeit,P11W,P11W,P11W +weelikeit,P11W_EEA,P11W_EEA,P11W_EEA weelikeit,P16W,P16W,P16W weelikeit,P16W_EEA,P16W_EEA,P16W_EEA +weelikeit,P26W,P26W,P26W +weelikeit,P26W_EEA,P26W_EEA,P26W_EEA +weelikeit,P39W,P39W,P39W +weelikeit,P39W_EEA,P39W_EEA,P39W_EEA +weelikeit,P51L,P51L,P51L +weelikeit,P51L_EEA,P51L_EEA,P51L_EEA weelikeit,P82L,P82L,P82L xTouch,A4,XTOUCH_A4,A4 xTouch,A5,A5,XTOUCH_A5 diff --git a/bin/scripts/drill_index.js b/bin/scripts/drill_index.js index ba6830c1aeb..1806421f2a0 100644 --- a/bin/scripts/drill_index.js +++ b/bin/scripts/drill_index.js @@ -32,75 +32,77 @@ Promise.all([plugins.dbConnection("countly"), plugins.dbConnection("countly_dril countlyDb.close(); console.log("Error occured:", error); } - var cnt = 0; - results = results.filter(collection => collection && collection.collectionName && collection.collectionName.startsWith("drill_events")); - async.eachSeries(results, function(collection, done) { - cnt++; - console.log("Processing", cnt, "of", results.length, collection.collectionName); - var col = db.collection(collection.collectionName); - col.createIndex({uid: 1}, {background: true}, function() { - console.log("Done", {uid: 1}); - if (hashes[collection.collectionName] === "[CLY]_session") { - col.createIndex({ts: 1, "up.cc": 1, uid: 1}, {background: true}, function() { - console.log("Done", "[CLY]_session", {ts: 1, "up.cc": 1, uid: 1}); - done(); - }); - } - else if (hashes[collection.collectionName] === "[CLY]_view") { - col.createIndex({ts: 1, "sg.name": 1}, {background: true}, function() { - console.log("Done", "[CLY]_view", {ts: 1, "sg.name": 1}); - done(); - }); - } - else if (hashes[collection.collectionName] === "[CLY]_crash") { - col.createIndex({ts: 1, "sg.crash": 1}, {background: true}, function() { - console.log("Done", "[CLY]_crash", {ts: 1, "sg.crash": 1}); - done(); - }); - } - else if (hashes[collection.collectionName] === "[CLY]_push_action") { - col.createIndex({ts: 1, "sg.i": 1, uid: 1}, {background: true}, function() { - console.log("Done", "[CLY]_push_action", {ts: 1, "sg.i": 1}); - done(); - }); - } - else if (hashes[collection.collectionName] === "[CLY]_star_rating") { - col.createIndex({ts: 1, "sg.widget_id": 1, "sg.rating": 1, uid: 1}, {background: true}, function() { - console.log("Done", "[CLY]_star_rating", {ts: 1, "sg.widget_id": 1, "sg.rating": 1}); - done(); - }); - } - else if (hashes[collection.collectionName] === "[CLY]_nps") { - col.createIndex({ts: 1, "sg.widget_id": 1, "sg.rating": 1, uid: 1}, {background: true}, function() { - console.log("Done", "[CLY]_nps", {ts: 1, "sg.widget_id": 1, "sg.rating": 1}); - done(); - }); - } - else if (hashes[collection.collectionName] === "[CLY]_survey") { - col.createIndex({ts: 1, "sg.widget_id": 1, uid: 1}, {background: true}, function() { - console.log("Done", "[CLY]_survey", {ts: 1, "sg.widget_id": 1}); - done(); - }); - } - else { - col.createIndex({ts: 1}, {background: true}, function() { - console.log("Done", {ts: 1}); + else { + var cnt = 0; + results = results.filter(collection => collection && collection.collectionName && collection.collectionName.startsWith("drill_events")); + async.eachSeries(results, function(collection, done) { + cnt++; + console.log("Processing", cnt, "of", results.length, collection.collectionName); + var col = db.collection(collection.collectionName); + col.createIndex({uid: 1}, {background: true}, function() { + console.log("Done", {uid: 1}); + if (hashes[collection.collectionName] === "[CLY]_session") { + col.createIndex({ts: 1, "up.cc": 1, uid: 1}, {background: true}, function() { + console.log("Done", "[CLY]_session", {ts: 1, "up.cc": 1, uid: 1}); + done(); + }); + } + else if (hashes[collection.collectionName] === "[CLY]_view") { + col.createIndex({ts: 1, "sg.name": 1}, {background: true}, function() { + console.log("Done", "[CLY]_view", {ts: 1, "sg.name": 1}); + done(); + }); + } + else if (hashes[collection.collectionName] === "[CLY]_crash") { + col.createIndex({ts: 1, "sg.crash": 1}, {background: true}, function() { + console.log("Done", "[CLY]_crash", {ts: 1, "sg.crash": 1}); + done(); + }); + } + else if (hashes[collection.collectionName] === "[CLY]_push_action") { + col.createIndex({ts: 1, "sg.i": 1, uid: 1}, {background: true}, function() { + console.log("Done", "[CLY]_push_action", {ts: 1, "sg.i": 1}); + done(); + }); + } + else if (hashes[collection.collectionName] === "[CLY]_star_rating") { + col.createIndex({ts: 1, "sg.widget_id": 1, "sg.rating": 1, uid: 1}, {background: true}, function() { + console.log("Done", "[CLY]_star_rating", {ts: 1, "sg.widget_id": 1, "sg.rating": 1}); + done(); + }); + } + else if (hashes[collection.collectionName] === "[CLY]_nps") { + col.createIndex({ts: 1, "sg.widget_id": 1, "sg.rating": 1, uid: 1}, {background: true}, function() { + console.log("Done", "[CLY]_nps", {ts: 1, "sg.widget_id": 1, "sg.rating": 1}); + done(); + }); + } + else if (hashes[collection.collectionName] === "[CLY]_survey") { + col.createIndex({ts: 1, "sg.widget_id": 1, uid: 1}, {background: true}, function() { + console.log("Done", "[CLY]_survey", {ts: 1, "sg.widget_id": 1}); + done(); + }); + } + else { + col.createIndex({ts: 1}, {background: true}, function() { + console.log("Done", {ts: 1}); + done(); + }); + } + }); + }, function() { + console.log("Fixing indexes on eventTimes collections"); + async.eachSeries(apps, function(app, done) { + countlyDb.collection('eventTimes' + app._id).ensureIndex({"uid": 1}, function() { done(); }); - } - }); - }, function() { - console.log("Fixing indexes on eventTimes collections"); - async.eachSeries(apps, function(app, done) { - countlyDb.collection('eventTimes' + app._id).ensureIndex({"uid": 1}, function() { - done(); + }, function() { + db.close(); + countlyDb.close(); + console.log("Drill index finished"); }); - }, function() { - db.close(); - countlyDb.close(); - console.log("Drill index finished"); }); - }); + } }); }); }); \ No newline at end of file diff --git a/bin/scripts/expire-data/countly_multi_app_expireData.js b/bin/scripts/expire-data/countly_multi_app_expireData.js index 911a790e90d..4a696396e24 100644 --- a/bin/scripts/expire-data/countly_multi_app_expireData.js +++ b/bin/scripts/expire-data/countly_multi_app_expireData.js @@ -8,73 +8,71 @@ var EXPIRE_AFTER = 60 * 60 * 24 * 365; //1 year in seconds var INDEX_NAME = "cd_1"; -var async = require('async'), - Promise = require("bluebird"), +var Promise = require("bluebird"), plugins = require('../../../plugins/pluginManager.js'); //var db = plugins.dbConnection("countly"); //var db_drill = plugins.dbConnection("countly_drill"); Promise.all([plugins.dbConnection("countly"), plugins.dbConnection("countly_drill")]).spread(function(db, db_drill) { - db_drill.collections(function(err, collections) { - collections = collections || []; - function eventIterator(coll, done) { - var collection = coll.collectionName; - console.log("processing", collection); - db_drill.collection(collection).indexes(function(err, indexes) { - if (err) { - console.log(err); - } - if (!err && indexes) { - var hasIndex = false; - var dropIndex = false; - for (var i = 0; i < indexes.length; i++) { - if (indexes[i].name == INDEX_NAME) { - if (indexes[i].expireAfterSeconds == EXPIRE_AFTER) { - //print("skipping", c) - hasIndex = true; - } - //has index but incorrect expire time, need to be reindexed - else { - dropIndex = true; - } - break; - } - } - if (dropIndex) { - console.log("modifying index", collection); - db_drill.command({ - "collMod": collection, - "index": { - "keyPattern": {"cd": 1}, - expireAfterSeconds: EXPIRE_AFTER - } - }, function(err) { - if (err) { - console.log(err); - } - done(); - }); + var collection = "drill_events"; + console.log("processing", collection); + db_drill.collection(collection).indexes(function(err, indexes) { + if (err) { + console.log(err); + } + if (!err && indexes) { + var hasIndex = false; + var dropIndex = false; + for (var i = 0; i < indexes.length; i++) { + if (indexes[i].name == INDEX_NAME) { + if (indexes[i].expireAfterSeconds == EXPIRE_AFTER) { + //print("skipping", c) + hasIndex = true; } - else if (!hasIndex) { - console.log("creating index", collection); - db_drill.collection(collection).createIndex({"cd": 1}, {expireAfterSeconds: EXPIRE_AFTER, "background": true}, function() { - done(); - }); - } + //has index but incorrect expire time, need to be reindexed else { - done(); + dropIndex = true; } + break; } - else { + } + if (dropIndex) { + console.log("modifying index", collection); + db_drill.command({ + "collMod": collection, + "index": { + "keyPattern": {"cd": 1}, + expireAfterSeconds: EXPIRE_AFTER + } + }, function(err) { + if (err) { + console.log(err); + } done(); - } - }); + }); + + } + else if (!hasIndex) { + console.log("creating index", collection); + db_drill.collection(collection).createIndex({"cd": 1}, {expireAfterSeconds: EXPIRE_AFTER, "background": true}, function() { + done(); + }); + } + else { + done(); + } + } + else { + done(); } - async.eachSeries(collections, eventIterator, function() { - db.close(); - db_drill.close(); - }); }); + + + function done() { + db.close(); + db_drill.close(); + } + }); \ No newline at end of file diff --git a/bin/scripts/expire-data/countly_single_app_expireDataBatches.js b/bin/scripts/expire-data/countly_single_app_expireDataBatches.js index dce96d10082..3d32be5ffbb 100644 --- a/bin/scripts/expire-data/countly_single_app_expireDataBatches.js +++ b/bin/scripts/expire-data/countly_single_app_expireDataBatches.js @@ -39,7 +39,6 @@ var timeout = 500; //timeout in miliseconds between deletion. (One second ==== var async = require('async'), - crypto = require('crypto'), Promise = require("bluebird"), plugins = require('../../../plugins/pluginManager.js'); @@ -109,6 +108,9 @@ function eventIterator(fr, done) { console.log('Processing range: ' + JSON.stringify({"ts": {"$gte": fr.start, "$lt": fr.end}}) + ' for ' + fr.collection); var query = {}; query["ts"] = {"$gte": fr.start, "$lt": fr.end}; + if (collection === 'drill_events') { + query["a"] = APP_ID; + } if (fr.query) { for (var key in fr.query) { query[key] = fr.query.key; @@ -171,32 +173,84 @@ function prepareIterationList(collections, seconds) { return listed; } -function processDrillCollections(db, drill_db, callback) { - if (process && process.drill_events) { - var collections = []; - collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_session" + APP_ID).digest('hex')}); - collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_crash" + APP_ID).digest('hex')}); - collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_view" + APP_ID).digest('hex')}); - collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_action" + APP_ID).digest('hex')}); - collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_apm_device" + APP_ID).digest('hex')}); - collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_apm_network" + APP_ID).digest('hex')}); - collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_nps" + APP_ID).digest('hex')}); - collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_survey" + APP_ID).digest('hex')}); - collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_push_action" + APP_ID).digest('hex')}); - collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_star_rating" + APP_ID).digest('hex')}); - collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_push_sent" + APP_ID).digest('hex')}); - collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_consent" + APP_ID).digest('hex')}); - db.collection("events").findOne({'_id': db.ObjectID(APP_ID)}, {list: 1}, function(err, eventData) { - if (eventData && eventData.list) { - for (var i = 0; i < eventData.list.length; i++) { - collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update(eventData.list[i] + APP_ID).digest('hex')}); + +function processDrillCollection(collection, seconds, callback) { + var listed = []; + + if (start === 0) { + getMinTs(function(err, minTs) { + if (err) { + console.log("ERROR: Could not fetch min ts for collection " + collection.collection); + callback(err); + } + else { + console.log("Min ts for collection " + collection.collection + ": " + minTs); + generateIterationList(minTs); + processCollection(); + } + }); + } + else { + generateIterationList(start); + processCollection(); + } + + function getMinTs(cb) { + collection.db.collection(collection.collection).findOne({}, { sort: { ts: 1 }, projection: { ts: 1 } }, function(err, doc) { + if (err) { + return callback(err); + } + if (doc && doc.ts) { + cb(null, doc.ts); + } + else { + cb(null, end); + } + }); + } + + function generateIterationList(z) { + z = (start === 0 && z) ? z : start; + if (timeSpan === 0 && z === 0) { + listed.push({"collection": collection.collection, "db": collection.db, "start": 0, "end": end, "query": {"ts": {"$lt": end}}}); + } + else if (timeSpan === 0) { + listed.push({"collection": collection.collection, "db": collection.db, "start": z, "end": end, "query": {"ts": {"$gte": z, "$lt": end}}}); + } + else { + if (seconds) { + z = Math.floor(z / 1000); + for (; z <= Math.floor(end / 1000); z += timeSpan) { + listed.push({"collection": collection.collection, "db": collection.db, "start": z, "end": Math.min(z + timeSpan, end), "seconds": true}); } } - var iteratorList = prepareIterationList(collections); - async.eachLimit(iteratorList, paralelCn, eventIterator, function() { - console.log('Drill collections processed'); - callback(); - }); + else { + for (; z <= end; z += timeSpan * 1000) { + listed.push({"collection": collection.collection, "db": collection.db, "start": z, "end": Math.min(z + timeSpan * 1000, end)}); + } + } + } + } + + function processCollection() { + async.eachLimit(listed, paralelCn, eventIterator, function(err) { + if (err) { + console.log("ERROR: Error while processing drill collection: " + collection.collection); + return callback(err); + } + console.log('Finished processing collection ' + collection.collection); + callback(); + }); + } +} + +function processDrillCollections(drill_db, callback) { + if (process && process.drill_events) { + processDrillCollection({"collection": "drill_events", db: drill_db}, false, function(err) { + if (err) { + console.log("ERROR: Error while processing drill collection: drill_events"); + } + callback(err); }); } else { @@ -212,7 +266,7 @@ Promise.all([plugins.dbConnection("countly"), plugins.dbConnection("countly_dril db_drill.close(); } else { - processDrillCollections(db, db_drill, function() { + processDrillCollections(db_drill, function() { var processCols = []; for (var key in process) { if (key !== 'drill_events') { @@ -224,15 +278,22 @@ Promise.all([plugins.dbConnection("countly"), plugins.dbConnection("countly_dril } } } - var iteratorList = prepareIterationList(processCols, true); - async.eachLimit(iteratorList, paralelCn, eventIterator, function() { - if (errorCn > 0) { - console.log("There were errors. Please recheck logs for those."); - } - console.log('finished'); + if (processCols.length === 0) { + console.log("Finished"); db.close(); db_drill.close(); - }); + } + else { + var iteratorList = prepareIterationList(processCols, true); + async.eachLimit(iteratorList, paralelCn, eventIterator, function() { + if (errorCn > 0) { + console.log("There were errors. Please recheck logs for those."); + } + console.log('finished'); + db.close(); + db_drill.close(); + }); + } }); } }); \ No newline at end of file diff --git a/bin/scripts/expire-data/db_free_storage_calculation.js b/bin/scripts/expire-data/db_free_storage_calculation.js index 1506325dd9c..5e84a48a50c 100644 --- a/bin/scripts/expire-data/db_free_storage_calculation.js +++ b/bin/scripts/expire-data/db_free_storage_calculation.js @@ -75,8 +75,32 @@ Promise.all([plugins.dbConnection("countly"), plugins.dbConnection("countly_dril done(); }); }, function() { - console.log(result); - close(); + //checking aggregated data collection: + drill.collection("drill_events").stats({scale: SCALE}, function(err, stats) { + if (stats.count > 0) { + var avg = stats.storageSize / stats.count; + result.available_for_reuse += stats.freeStorageSize || 0; + drill.collection("drill_events").find({cd: {$lt: new Date(Date.now() - (DATA_RETENTION_IN_SECONDS * 1000))}}).count(function(err, count) { + if (err) { + console.log(err); + } + if (count > 0) { + result.count += count; + result.total_will_be_free += Math.round(avg * count); + result.drill_events = {}; + result.drill_events.available_for_reuse = stats.freeStorageSize || 0; + result.drill_events.total_will_be_free = Math.round(avg * count); + result.drill_events.count = count; + } + console.log("Result: ", result); + close(); + }); + } + else { + console.log(result); + close(); + } + }); }); }); }); diff --git a/bin/scripts/expire-data/delete_custom_events.js b/bin/scripts/expire-data/delete_custom_events.js index 43c0b08e1a0..b429d5dacbf 100644 --- a/bin/scripts/expire-data/delete_custom_events.js +++ b/bin/scripts/expire-data/delete_custom_events.js @@ -12,7 +12,7 @@ const common = require('../../../api/utils/common.js'); const drillCommon = require('../../../plugins/drill/api/common.js'); const APP_ID = ""; -const EVENTS = []; //leave empty to delete all custom events +const EVENTS = []; //If empty, no events will be deleted Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection("countly_drill")]).then(async function([countlyDb, drillDb]) { console.log("Connected to databases..."); @@ -28,11 +28,7 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" //GET EVENTS var events = EVENTS; if (!events.length) { - events = await countlyDb.collection("events").findOne({_id: app._id}, {_id: 0, list: 1}); - events = (events && events.list) || []; - } - if (!events.length) { - close("No events found"); + close("No events to delete"); } else { //DELETE EVENTS @@ -65,6 +61,9 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" await drillDb.collection(collectionName).drop(); console.log("Dropped collection:", collectionName); } + //delete from aggregated drill event collection + await drillDb.collection('drill_events').remove({'a': appId + "", 'e': {$in: events}}); + console.log("Cleared from drill_events"); await drillDb.collection('drill_bookmarks').remove({'app_id': appId, 'event_key': {$in: events}}); console.log("Cleared drill_bookmarks"); await drillDb.collection("drill_meta").remove({'app_id': (appId + ""), "type": "e", "e": {$in: events}}); @@ -76,6 +75,10 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" var collectionName = 'events' + drillCommon.getEventHash(events[i], appId); await countlyDb.collection(collectionName).drop(); console.log("Dropped collection:", collectionName); + + //clear from merged collection + await countlyDb.collection("events_data").remove({'_id': {"$regex": "^" + appId + "_" + drillCommon.getEventHash(events[i], appId) + "_.*"}}); + console.log("Cleared from agregated collection"); } } diff --git a/bin/scripts/expire-data/delete_custom_events_regex.js b/bin/scripts/expire-data/delete_custom_events_regex.js new file mode 100755 index 00000000000..b5e75b1fe2d --- /dev/null +++ b/bin/scripts/expire-data/delete_custom_events_regex.js @@ -0,0 +1,147 @@ +/** + * Description: Deletes custom events from countly and drill databases using a regular expression + * Server: countly + * Path: $(countly dir)/bin/scripts/expire-data + * Command: node delete_custom_events_regex.js + */ + + +const { ObjectId } = require('mongodb'); +const pluginManager = require('../../../plugins/pluginManager.js'); +const common = require('../../../api/utils/common.js'); +const drillCommon = require('../../../plugins/drill/api/common.js'); + +const DRY_RUN = true; +const APP_ID = ""; +const EVENTS_REGEX = ""; // If empty, no events will be deleted +const CASE_INSENSITIVE = true; + +Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection("countly_drill")]).then(async function([countlyDb, drillDb]) { + console.log("Connected to databases..."); + + //SET COMMON DB AND DRILL DB + common.db = countlyDb; + common.drillDb = drillDb; + + //GET APP + try { + const app = await countlyDb.collection("apps").findOne({_id: ObjectId(APP_ID)}, {_id: 1, name: 1}); + console.log("App:", app.name); + //GET EVENTS + var events = []; + if (EVENTS_REGEX && EVENTS_REGEX.length) { + try { + const regex = new RegExp(EVENTS_REGEX); + console.log("Regular expression:", regex); + events = await countlyDb.collection("events").aggregate([ + { + $match: {_id: app._id} + }, + { + $project: { + _id: 0, + list: { + $filter: { + input: "$list", + as: "item", + cond: {$regexMatch: {input: "$$item", regex: regex, options: CASE_INSENSITIVE ? "i" : ""}} + } + } + } + } + ]).toArray(); + events = events.length ? events[0].list : []; + } + catch (err) { + close("Invalid regex"); + } + } + + console.log("Events to delete:", events); + if (DRY_RUN) { + close(); + } + else { + //DELETE EVENTS + try { + console.log(1 + ") Deleting drill events:"); + await deleteDrillEvents(app._id, events); + console.log(2 + ") Deleting countly events:"); + await deleteCountlyEvents(app._id, events); + console.log(3 + ") Deleting event times:"); + await deleteEventTimes(app._id, events); + console.log(4 + ") Deleting event groups:"); + await deleteEventGroups(app._id, events); + console.log(5 + ") Deleting event keys:"); + await deleteEventKeys(app._id, events); + close(); + } + catch (err) { + close(err); + } + } + } + catch (err) { + console.log("App not found"); + close(err); + } + + async function deleteDrillEvents(appId, events) { + for (let i = 0; i < events.length; i++) { + var collectionName = drillCommon.getCollectionName(events[i], appId); + await drillDb.collection(collectionName).drop(); + console.log("Dropped collection:", collectionName); + } + await drillDb.collection('drill_events').remove({'a': appId + "", 'e': {$in: events}}); + console.log("Cleared from drill_events"); + await drillDb.collection('drill_bookmarks').remove({'app_id': appId, 'event_key': {$in: events}}); + console.log("Cleared drill_bookmarks"); + await drillDb.collection("drill_meta").remove({'app_id': (appId + ""), "type": "e", "e": {$in: events}}); + console.log("Cleared drill_meta"); + } + + async function deleteCountlyEvents(appId, events) { + for (let i = 0; i < events.length; i++) { + var collectionName = 'events' + drillCommon.getEventHash(events[i], appId); + await countlyDb.collection(collectionName).drop(); + console.log("Dropped collection:", collectionName); + //clear from merged collection + await countlyDb.collection("events_data").remove({'_id': {"$regex": "^" + appId + "_" + drillCommon.getEventHash(events[i], appId) + "_.*"}}); + console.log("Cleared from agregated collection"); + } + } + + async function deleteEventTimes(appId, events) { + await countlyDb.collection("eventTimes" + appId).update({}, {"$pull": {"e": {"e": {$in: events}}}}, {"multi": true}); + console.log("Cleared eventTimes"); + await countlyDb.collection("timelineStatus").remove({'app_id': (appId + ""), "event": {$in: events}}); + console.log("Cleared timelineStatus"); + } + + async function deleteEventKeys(appId, events) { + const unsetQuery = {}; + for (let i = 0; i < events.length; i++) { + unsetQuery[`segments.${events[i]}`] = 1; + unsetQuery[`map.${events[i]}`] = 1; + unsetQuery[`omitted_segments.${events[i]}`] = 1; + } + await countlyDb.collection("events").updateOne({_id: appId}, {$pull: {list: {$in: events}}, $unset: unsetQuery}, {$pull: {"overview": {eventKey: {$in: events}}}}); + console.log("Cleared events:", events); + } + + async function deleteEventGroups(appId, events) { + await countlyDb.collection("event_groups").update({'app_id': (appId + "")}, {"$pull": {"source_events": {$in: events}}}, {"multi": true}); + console.log("Cleared event_groups"); + } + + function close(err) { + if (err) { + console.log("Finished with errors:", err); + } + else { + console.log("Finished successfully."); + } + countlyDb.close(); + drillDb.close(); + } +}); \ No newline at end of file diff --git a/bin/scripts/expire-data/mongo_expireDataPeriod.js b/bin/scripts/expire-data/mongo_expireDataPeriod.js new file mode 100644 index 00000000000..174cdc7ea0c --- /dev/null +++ b/bin/scripts/expire-data/mongo_expireDataPeriod.js @@ -0,0 +1,51 @@ +/** + * Deletes data in drill based on period + * Modify start and end before running script. + * Path: any + * Command: mongo < mongo_expireDataPeriod.js + */ + +var COUNTLY_DRILL = 'countly_drill', + start = 1157738337000, //min timestamp + end = 1657738337000; //max timestamp + +var PROCESS = [ + /^drill_events\.*/ +]; + +/* global Mongo, print*/ + +var conn = new Mongo(); + +var query = {"ts": {"$gte": start, "$lt": end}}; +/** + // Enable for auth + +var authDB = conn.getDB('admin'); +authDB.auth('', ''); + + **/ + +var drill = conn.getDB(COUNTLY_DRILL); + +var collections = drill.getCollectionNames(); + +collections.forEach(function(c) { + var process = false; + PROCESS.forEach(function(r) { + if (typeof r === 'string' && r === c) { + process = true; + } + else if (typeof r === 'object' && r.test(c)) { + process = true; + } + }); + if (process) { + print('clearing data from collection:' + c); + var rr = drill.getCollection(c).remove(query); + print(JSON.stringify(rr)); + } +}); + +print('Done with cleanup'); + diff --git a/bin/scripts/expire-data/old_scripts/countly_multi_app_expireData.js b/bin/scripts/expire-data/old_scripts/countly_multi_app_expireData.js new file mode 100644 index 00000000000..911a790e90d --- /dev/null +++ b/bin/scripts/expire-data/old_scripts/countly_multi_app_expireData.js @@ -0,0 +1,80 @@ +/** + * Setup TTL indexes to delete older data for one specific app. This script should be run periodically, to create TTL indexes on new collections too, like new events, etc for specific app + * Server: countly + * Path: countly dir/bin/scripts/expire-data + * Command: node countly_multi_app_expireData.js + */ + +var EXPIRE_AFTER = 60 * 60 * 24 * 365; //1 year in seconds +var INDEX_NAME = "cd_1"; + +var async = require('async'), + Promise = require("bluebird"), + plugins = require('../../../plugins/pluginManager.js'); + +//var db = plugins.dbConnection("countly"); +//var db_drill = plugins.dbConnection("countly_drill"); + +Promise.all([plugins.dbConnection("countly"), plugins.dbConnection("countly_drill")]).spread(function(db, db_drill) { + db_drill.collections(function(err, collections) { + collections = collections || []; + function eventIterator(coll, done) { + var collection = coll.collectionName; + console.log("processing", collection); + db_drill.collection(collection).indexes(function(err, indexes) { + if (err) { + console.log(err); + } + if (!err && indexes) { + var hasIndex = false; + var dropIndex = false; + for (var i = 0; i < indexes.length; i++) { + if (indexes[i].name == INDEX_NAME) { + if (indexes[i].expireAfterSeconds == EXPIRE_AFTER) { + //print("skipping", c) + hasIndex = true; + } + //has index but incorrect expire time, need to be reindexed + else { + dropIndex = true; + } + break; + } + } + if (dropIndex) { + console.log("modifying index", collection); + db_drill.command({ + "collMod": collection, + "index": { + "keyPattern": {"cd": 1}, + expireAfterSeconds: EXPIRE_AFTER + } + }, function(err) { + if (err) { + console.log(err); + } + done(); + }); + + } + else if (!hasIndex) { + console.log("creating index", collection); + db_drill.collection(collection).createIndex({"cd": 1}, {expireAfterSeconds: EXPIRE_AFTER, "background": true}, function() { + done(); + }); + } + else { + done(); + } + } + else { + done(); + } + }); + } + async.eachSeries(collections, eventIterator, function() { + db.close(); + db_drill.close(); + }); + }); +}); \ No newline at end of file diff --git a/bin/scripts/expire-data/countly_single_app_expireData.js b/bin/scripts/expire-data/old_scripts/countly_single_app_expireData.js similarity index 100% rename from bin/scripts/expire-data/countly_single_app_expireData.js rename to bin/scripts/expire-data/old_scripts/countly_single_app_expireData.js diff --git a/bin/scripts/expire-data/old_scripts/countly_single_app_expireDataBatches.js b/bin/scripts/expire-data/old_scripts/countly_single_app_expireDataBatches.js new file mode 100644 index 00000000000..7c5305340f5 --- /dev/null +++ b/bin/scripts/expire-data/old_scripts/countly_single_app_expireDataBatches.js @@ -0,0 +1,325 @@ +/** +Script for gradual deletion from drill collections. +Script must be placed in : +{countly dir}/bin/scripts/expire-data/ + +to run: +node countly_single_app_expireDataBatches.js + +Best would be to push output in some log file. +At the end there will be text if there is any error: +"There were errors. Please recheck logs for those." +Searching for ERROR in document should show failures. +If something is unclear - showing output would help with determining issues. + +Script can be run multiple times on same input parameters. + */ + +//[1612144800000,1614477599999] +var APP_ID = ""; +var start = 1627786800000; //min timestamp for data deletion +var end = 1641002399999; //max timestamp for data deletion +var timeSpan = 60 * 60 * 24 * 30; //How big timefrimes delete in seconds. 60*60*24 = 1 day + +var paralelCn = 10;//How many ops should be run in paralel + + +//Using batchSize is not very optimal. It relies on find query before deletion. (So twice as many operations) +//Best would be NOT to use it as there are no existing operations, that could make it optimal. +var batchSize = 0; //up to how many documents should be delete in single batch. If set to 0 - will delete all documents that matches current time span. + +var timeout = 500; //timeout in miliseconds between deletion. (One second ==== 1000 ms) + +//!!!!!!If there is incoming data and deletion is happening based in batchSize - it would keep on deleting from same timeframe as long as new data appear !!!!!!! +/*If you want to use only batch size choose time span to be greather that span between min and max timestamp + start: A, + end: B, + timeSpan: ((B-A)/1000) - at least. +*/ + + +var async = require('async'), + crypto = require('crypto'), + Promise = require("bluebird"), + plugins = require('../../../plugins/pluginManager.js'); + +var errorCn = 0; + + +var process = { + drill_events: true, + /*app_crashes:true, + metric_changes:true, + consent_history:true, + feedback:true, + symbolication_jobs:true, + systemlogs:true */ +}; + +var deleteOptions = {"writeConcern": {"w": "majority"}, "multi": true}; + +function removeInBatches(db_target, collection, query, callback) { + db_target.collection(collection).aggregate([{"$match": query}, {"$project": {"_id": 1}}, {"$limit": batchSize}], {"allowDiskUse": true}, function(err, res) { + if (err) { + errorCn += 1; + console.log("ERROR: Error while finding data for: " + collection); + console.log(err); + callback(); + } + else { + res = res || []; + if (res.length > 0) { + var ids = []; + for (var i = 0; i < res.length; i++) { + ids.push(res[i]._id); + } + //calls deleteMany from our wrapper. + db_target.collection(collection).remove({"_id": {"$in": ids}}, deleteOptions, function(err, res) { + if (err) { + console.log("ERROR: Error while deleting data for: " + collection); + console.log(err); + callback(); + } + else { + console.log(JSON.stringify(res)); + if (timeout) { + setTimeout(function() { + removeInBatches(db_target, collection, query, callback); + }, timeout); + } + else { + removeInBatches(db_target, collection, query, callback);//call for next batch. + } + } + }); + } + else { + console.log('Nothing left to delete'); + callback(); + } + } + }); +} + + +function eventIterator(fr, done) { + var collection = fr.collection; + var db_target = fr.db; + + console.log('Processing range: ' + JSON.stringify({"ts": {"$gte": fr.start, "$lt": fr.end}}) + ' for ' + fr.collection); + var query = {}; + query["ts"] = {"$gte": fr.start, "$lt": fr.end}; + if (fr.query) { + for (var key in fr.query) { + query[key] = fr.query.key; + } + } + if (batchSize) { + removeInBatches(db_target, collection, query, function() { + done(); + }); + } + else { //removing all matching timestamps in one go + console.log(JSON.stringify(query)); + //calls deleteMany from our wrapper. + db_target.collection(collection).remove(query, deleteOptions, function(err, res) { + if (err) { + console.log("ERROR: Error while removing data"); + console.log(err); + if (timeout) { + setTimeout(function() { + done(); + }, timeout); + } + else { + done(); + } + } + else { + console.log(JSON.stringify(res)); + if (timeout) { + setTimeout(function() { + done(); + }, timeout); + } + else { + done(); + } + } + }); + } +} + +function prepareIterationList(collections, seconds) { + var listed = []; + var z = start; + if (seconds) { + z = Math.floor(start / 1000); + for (; z <= Math.floor(end / 1000); z += timeSpan) { + for (var k = 0; k < collections.length; k++) { + listed.push({"collection": collections[k].collection, "db": collections[k].db, "start": z, "end": Math.min(z + timeSpan, end), "seconds": true}); + } + } + } + else { + for (; z <= end; z += timeSpan * 1000) { + for (var k1 = 0; k1 < collections.length; k1++) { + listed.push({"collection": collections[k1].collection, "db": collections[k1].db, "start": z, "end": Math.min(z + timeSpan * 1000, end)}); + } + } + } + return listed; + +} + +function processDrillCollection(collection, seconds, callback) { + var listed = []; + + if (start === 0) { + getMinTs(function(err, minTs) { + if (err) { + console.log("ERROR: Could not fetch min ts for collection " + collection.collection); + callback(err); + } + else { + console.log("Min ts for collection " + collection.collection + ": " + minTs); + generateIterationList(minTs); + processCollection(); + } + }); + } + else { + generateIterationList(start); + processCollection(); + } + + function getMinTs(cb) { + collection.db.collection(collection.collection).findOne({}, { sort: { ts: 1 }, projection: { ts: 1 } }, function(err, doc) { + if (err) { + return callback(err); + } + if (doc && doc.ts) { + cb(null, doc.ts); + } + else { + cb(null, end); + } + }); + } + + function generateIterationList(z) { + z = (start === 0 && z) ? z : start; + if (timeSpan === 0 && z === 0) { + listed.push({"collection": collection.collection, "db": collection.db, "start": 0, "end": end, "query": {"ts": {"$lt": end}}}); + } + else if (timeSpan === 0) { + listed.push({"collection": collection.collection, "db": collection.db, "start": z, "end": end, "query": {"ts": {"$gte": z, "$lt": end}}}); + } + else { + if (seconds) { + z = Math.floor(z / 1000); + for (; z <= Math.floor(end / 1000); z += timeSpan) { + listed.push({"collection": collection.collection, "db": collection.db, "start": z, "end": Math.min(z + timeSpan, end), "seconds": true}); + } + } + else { + for (; z <= end; z += timeSpan * 1000) { + listed.push({"collection": collection.collection, "db": collection.db, "start": z, "end": Math.min(z + timeSpan * 1000, end)}); + } + } + } + } + + function processCollection() { + async.eachLimit(listed, paralelCn, eventIterator, function(err) { + if (err) { + console.log("ERROR: Error while processing drill collection: " + collection.collection); + return callback(err); + } + console.log('Finished processing collection ' + collection.collection); + callback(); + }); + } +} + +function processDrillCollections(db, drill_db, callback) { + if (process && process.drill_events) { + var collections = []; + collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_session" + APP_ID).digest('hex')}); + collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_crash" + APP_ID).digest('hex')}); + collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_view" + APP_ID).digest('hex')}); + collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_action" + APP_ID).digest('hex')}); + collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_apm_device" + APP_ID).digest('hex')}); + collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_apm_network" + APP_ID).digest('hex')}); + collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_nps" + APP_ID).digest('hex')}); + collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_survey" + APP_ID).digest('hex')}); + collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_push_action" + APP_ID).digest('hex')}); + collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_star_rating" + APP_ID).digest('hex')}); + collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_push_sent" + APP_ID).digest('hex')}); + collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update("[CLY]_consent" + APP_ID).digest('hex')}); + db.collection("events").findOne({'_id': db.ObjectID(APP_ID)}, {list: 1}, function(err, eventData) { + if (eventData && eventData.list) { + for (var i = 0; i < eventData.list.length; i++) { + collections.push({'db': drill_db, 'collection': "drill_events" + crypto.createHash('sha1').update(eventData.list[i] + APP_ID).digest('hex')}); + } + } + + async.eachSeries(collections, function(collection, done) { + processDrillCollection(collection, false, function(err) { + if (err) { + console.log("ERROR: Error while processing drill collection: " + collection.collection); + } + done(err); + }); + }, function(err) { + if (err) { + console.log("ERROR: Error processing collections."); + } + callback(err); + }); + }); + } + else { + callback('Skipping drill collections'); + } +} + +Promise.all([plugins.dbConnection("countly"), plugins.dbConnection("countly_drill")]).spread(function(db, db_drill) { + if (!APP_ID) { + console.log("APP ID is missing"); + console.log('exited'); + db.close(); + db_drill.close(); + } + else { + processDrillCollections(db, db_drill, function() { + var processCols = []; + for (var key in process) { + if (key !== 'drill_events') { + if (key === 'symbolication_jobs' || key === 'systemlogs') { + processCols.push({'collection': key, db: db, seconds: true}); + } + else { + processCols.push({'collection': key + APP_ID, db: db, seconds: true}); + } + } + } + if (processCols.length === 0) { + console.log("Finished"); + db.close(); + db_drill.close(); + } + else { + var iteratorList = prepareIterationList(processCols, true); + async.eachLimit(iteratorList, paralelCn, eventIterator, function() { + if (errorCn > 0) { + console.log("There were errors. Please recheck logs for those."); + } + console.log('finished'); + db.close(); + db_drill.close(); + }); + } + }); + } +}); \ No newline at end of file diff --git a/bin/scripts/expire-data/readme.txt b/bin/scripts/expire-data/readme.txt new file mode 100644 index 00000000000..d47c5dc6735 --- /dev/null +++ b/bin/scripts/expire-data/readme.txt @@ -0,0 +1,8 @@ +Starting version 24.10 we are writing all drill events in single collection: drill_events. + +Data collected before upgrade are collected in collections drill_events+HASH. +If there is still data present, it is advised to run also those scripts from old_scripts subfolder when running same named script from this folder: + +/county_multi_app_expireData.js +/county_single_app_expireData.js +/county_single_app_expireDataBatches.js \ No newline at end of file diff --git a/bin/scripts/export-data/setting_limits_and_real_values.js b/bin/scripts/export-data/setting_limits_and_real_values.js new file mode 100644 index 00000000000..116e97c1744 --- /dev/null +++ b/bin/scripts/export-data/setting_limits_and_real_values.js @@ -0,0 +1,349 @@ +/** + * Description: Creates JSON file of events, views, and custom user properties, their segments, and segment values. + * Server: countly + * Path: $(countly dir)/bin/scripts/export-data + * Command: node setting_limits_and_real_values.js + */ + +const fs = require('fs'); +const crypto = require('crypto'); +const common = require('../../../api/utils/common.js'); +const pathToFile = './'; // path to save json files +const WriteStream = fs.createWriteStream(pathToFile + `setting_limits_and_values.json`); +const pluginManager = require('../../../plugins/pluginManager.js'); +const app_list = []; // valid app_ids here. If empty array passed, script will process all apps. +const DEFAULT_LIMITS = { + event_limit: 500, + event_segment_limit: 100, + event_segment_value_limit: 1000, + view_limit: 50000, + view_name_limit: 128, + view_segment_limit: 100, + view_segment_value_limit: 10, + custom_prop_limit: 20, + custom_prop_value_limit: 50, +}; + +Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection("countly_drill")]).then(async function([countlyDb, drillDb]) { + console.log("Connected to databases..."); + common.db = countlyDb; + common.drillDb = drillDb; + try { + const apps = await getAppList({db: countlyDb}); + if (!apps || !apps.length) { + return close(); + } + else { + // WRITE START OF ARRAY + WriteStream.write('[\n', 'utf8'); + + // GETTING DATA FOR SET LIMITS FOR EVENTS, VIEWS, AND CUSTOM PROPERTIES + var pluginsCollectionPlugins = await countlyDb.collection("plugins").findOne({"_id": 'plugins'}); + + // LOOP APPS FOR EACH REQUIREMENT + for (let i = 0; i < apps.length; i++) { + var app = apps[i]; + console.log(i + 1, ") Processing app:", app.name); + + try { + var app_results = { "App Name": app.name }, + defaultVal, + realVal, + currentVal; + + // SETTING UP CURRENT SET LIMITS PER APP + var appsCollectionPerApp = await countlyDb.collection("apps").findOne({"_id": common.db.ObjectID(app._id)}); + var CURRENT_LIMITS = { + event_limit: appsCollectionPerApp?.plugins?.api?.event_limit || pluginsCollectionPlugins?.api?.event_limit || DEFAULT_LIMITS.event_limit, + event_segment_limit: appsCollectionPerApp?.plugins?.api?.event_segmentation_limit || pluginsCollectionPlugins?.api?.event_segmentation_limit || DEFAULT_LIMITS.event_segment_limit, + event_segment_value_limit: appsCollectionPerApp?.plugins?.api?.event_segmentation_value_limit || pluginsCollectionPlugins?.api?.event_segmentation_value_limit || DEFAULT_LIMITS.event_segmentation_value_limit, + view_limit: pluginsCollectionPlugins?.views?.view_limit || DEFAULT_LIMITS.view_limit, + view_name_limit: pluginsCollectionPlugins?.views?.view_name_limit || DEFAULT_LIMITS.view_name_limit, + view_segment_limit: pluginsCollectionPlugins?.views?.segment_limit || DEFAULT_LIMITS.view_segment_limit, + view_segment_value_limit: pluginsCollectionPlugins?.views?.segment_value_limit || DEFAULT_LIMITS.view_segment_value_limit, + custom_prop_limit: pluginsCollectionPlugins?.users?.custom_prop_limit || DEFAULT_LIMITS.custom_prop_limit, + custom_prop_value_limit: pluginsCollectionPlugins?.users?.custom_set_limit || DEFAULT_LIMITS.custom_prop_value_limit, + }; + + // GETTING REAL DATA PER APP + var eventsCollectionPerApp = await countlyDb.collection("events").findOne({"_id": common.db.ObjectID(app._id)}); + var viewsCountsPerApp = await countlyDb.collection("app_viewsmeta" + app._id).countDocuments(); + var viewsCollectionPerApp = await countlyDb.collection("app_viewsmeta" + app._id).aggregate([ + { + $addFields: { + max_length: { $strLenCP: {$convert: {input: "$view", to: "string", onError: "", onNull: ""} }} + } + }, + { + $sort: { + max_length: -1 + } + }, + { + $limit: 1 + } + ]).toArray(); + var viewsSegmentsPerApp = await countlyDb.collection("views").aggregate([ + { + $match: { "_id": common.db.ObjectID(app._id) } + }, + { + "$project": { + "_id": 0, + "segments": { + "$arrayToObject": { + "$map": { + "input": { "$objectToArray": "$segments" }, + "as": "field", + "in": { + "k": "$$field.k", + "v": { "$size": { "$ifNull": [{"$objectToArray": "$$field.v" }, []] }} + } + } + } + }, + "numberOfSegments": { "$size": {"$ifNull": [{ "$objectToArray": "$segments" }, []]}} + } + } + ]).toArray(); + var customPropsPerApp = await drillDb.collection("drill_meta").aggregate([ + { + $match: { "_id": app._id + "_meta_up" } + }, + { + $project: { + customPropertiesCount: { + $size: { + $ifNull: [{ $objectToArray: "$custom" }, []] + } + } + } + }, + ]).toArray(); + var valueFieldCounts = await drillDb.collection("drill_meta").aggregate([ + { + $match: { "_id": { $regex: "^" + app._id + "_meta_up_custom.*" } } + }, + { + $project: { + _id: 0, + field: { $arrayElemAt: [{ $split: ["$_id", "."] }, -1] }, + valueFieldCount: { $size: {"$ifNull": [{ $objectToArray: "$values" }, []] }} + } + }, + ]).toArray(); + valueFieldCounts = valueFieldCounts.reduce((acc, item) => { + acc[item.field] = item.valueFieldCount; + return acc; + }, {}); + } + catch (err) { + console.log("Mongodb operation failed for app: ", app.name, err); + } + + // EVENT KEYS + defaultVal = DEFAULT_LIMITS.event_limit; + + currentVal = CURRENT_LIMITS.event_limit; + + let realEvents = eventsCollectionPerApp?.list || []; + realVal = realEvents.length; + + app_results['Event Keys'] = {"default": defaultVal, "set": currentVal, "real": realVal}; + + // SEGMENTS IN ONE EVENT + defaultVal = DEFAULT_LIMITS.event_segment_limit; + + currentVal = CURRENT_LIMITS.event_segment_limit; + + let eventSegments = eventsCollectionPerApp && eventsCollectionPerApp.segments || {}; + realVal = Object.entries(eventSegments) + .sort((a, b) => b[1].length - a[1].length) + .reduce((acc, [key, value]) => { + acc[key] = value.length; + return acc; + }, {}); + + app_results['Event Segments'] = {"default": defaultVal, "set": currentVal, "real": realVal}; + + // UNIQUE EVENT SEGMENT VALUES FOR 1 SEGMENT + defaultVal = DEFAULT_LIMITS.event_segment_value_limit; + + currentVal = CURRENT_LIMITS.event_segment_value_limit; + + realVal = {}; + await Promise.all(realEvents.map(async(event) => { + var shortEventName = common.fixEventKey(event); + var eventCollectionName = "events" + crypto.createHash('sha1').update(shortEventName + app._id).digest('hex'); + + try { + var regexes = [ + "^no-segment_2023:0.*", + "^no-segment_2024:0.*" + ]; + var eventsSegmentsValues = await countlyDb.collection(eventCollectionName).aggregate([ + { + "$match": { + "_id": { + "$in": regexes.map(pattern => new RegExp(pattern)) + } + } + }, + { + "$project": { + "_id": 0, + "meta_v2": { + "$map": { + "input": { + "$objectToArray": "$meta_v2" + }, + "in": { + "k": "$$this.k", + "v": { + "$size": { + "$ifNull": [{"$objectToArray": "$$this.v"}, []] + } + } + } + } + } + } + }, + { + "$unwind": "$meta_v2" + }, + { + "$match": { + "meta_v2.k": { "$ne": "segments" } + } + } + ]).toArray(); + + // Use reduce to transform array + eventsSegmentsValues = eventsSegmentsValues.reduce((acc, item) => { + const key = item.meta_v2.k; + if (!acc[key]) { + acc[key] = 0; + } + acc[key] += item.meta_v2.v; + return acc; + }, {}); + + if (Object.keys(eventsSegmentsValues).length > 0) { + realVal[event] = eventsSegmentsValues; + } + } + catch (err) { + console.log("Unique event segment values aggregation failed with error: " + err); + } + })); + app_results['Unique Event Segment Values'] = {"default": defaultVal, "set": currentVal, "real": realVal}; + + // UNIQUE VIEV NAMES + defaultVal = DEFAULT_LIMITS.view_limit; + + currentVal = CURRENT_LIMITS.view_limit; + + realVal = viewsCountsPerApp; + + app_results['Unique View Names'] = {"default": defaultVal, "set": currentVal, "real": realVal}; + + // VIEW NAME LENGTH LIMIT + defaultVal = DEFAULT_LIMITS.view_name_limit; + + currentVal = CURRENT_LIMITS.view_name_limit; + + realVal = {longestViewName: "", longestViewLength: 0}; + realVal.longestViewName = viewsCollectionPerApp && viewsCollectionPerApp[0] && viewsCollectionPerApp[0]?.view; + realVal.longestViewLength = viewsCollectionPerApp && viewsCollectionPerApp[0] && viewsCollectionPerApp[0]?.max_length; + + app_results['View Name Length Limit'] = {"default": defaultVal, "set": currentVal, "real": realVal}; + + // SEGMENTS IN ONE VIEW + defaultVal = DEFAULT_LIMITS.view_segment_limit; + + currentVal = CURRENT_LIMITS.view_segment_limit; + + realVal = viewsSegmentsPerApp && viewsSegmentsPerApp[0]?.numberOfSegments || 0; + + app_results['View Segments'] = {"default": defaultVal, "set": currentVal, "real": realVal}; + + // VIEW SEGMENT'S UNIQUE VALUES + defaultVal = DEFAULT_LIMITS.view_segment_value_limit; + + currentVal = CURRENT_LIMITS.view_segment_value_limit; + + realVal = viewsSegmentsPerApp && viewsSegmentsPerApp[0]?.segments || 0; + Object.keys(realVal).forEach(key => { + if (realVal[key] === 0) { + delete realVal[key]; + } + }); + app_results['View Segments Unique Values'] = {"default": defaultVal, "set": currentVal, "real": realVal}; + + // USER PROPERTIES + defaultVal = DEFAULT_LIMITS.custom_prop_limit; + + currentVal = CURRENT_LIMITS.custom_prop_limit; + + realVal = customPropsPerApp && customPropsPerApp[0]?.customPropertiesCount || 0; + app_results['Custom User Properties'] = {"default": defaultVal, "set": currentVal, "real": realVal}; + + // VALUES IN AN ARRAY FOR ONE USER PROPERTY + defaultVal = DEFAULT_LIMITS.custom_prop_value_limit; + + currentVal = CURRENT_LIMITS.custom_prop_value_limit; + + realVal = valueFieldCounts || undefined; + app_results['Values In Array For One User Property'] = {"default": defaultVal, "set": currentVal, "real": realVal}; + + // WRITE RESULTS PER APP TO FILE + WriteStream.write(JSON.stringify(app_results, null, 2), 'utf8'); + if (i + 1 < apps.length) { + WriteStream.write(',\n', 'utf8'); + } + } + // WRITE AND CLOSE ARRAY + WriteStream.write('\n]', 'utf8', () => { + console.log('Data has been written to the file.'); + }); + } + } + catch (err) { + close(err); + } + finally { + close(); + } + + async function getAppList(options) { + var query = {}; + if (app_list && app_list.length > 0) { + var listed = []; + for (var z = 0; z < app_list.length; z++) { + listed.push(common.db.ObjectID(app_list[z])); + } + query = {_id: {$in: listed}}; + } + + try { + let apps = await options.db.collection("apps").find(query).toArray(); + return apps; + } + catch (err) { + console.log("Error getting apps: ", err); + return []; + } + + } + + function close(err) { + if (err) { + console.log("Error: ", err); + } + countlyDb.close(); + drillDb.close(); + WriteStream.end(); + console.log("Done."); + } +}); diff --git a/bin/scripts/fix-data/fix_drill_custom_props.js b/bin/scripts/fix-data/fix_drill_custom_props.js index ecbd6ad3e1d..07ace592ec8 100644 --- a/bin/scripts/fix-data/fix_drill_custom_props.js +++ b/bin/scripts/fix-data/fix_drill_custom_props.js @@ -34,39 +34,65 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" //PROCESS COLLECTIONS FOR EACH APP for (let i = 0; i < apps.length; i++) { console.log("Processing app: " + apps[i].name); - var collectionName = drillCommon.getCollectionName("[CLY]_session", apps[i]._id + ""); - console.log("Processing collection: " + collectionName); + var collectionName0 = drillCommon.getCollectionName("[CLY]_session", apps[i]._id + ""); - const cursor = drillDb.collection(collectionName).find(query_drill, {"_id": 1, "custom": 1}); - //FOR EACH DOCUMENT - var updates = []; - while (await cursor.hasNext()) { - var doc = await cursor.next(); - if (doc.custom) { - var updateDoc = {}; - let updateMe = false; - for (var key in doc.custom) { - if (doc.custom[key] && typeof doc.custom[key] === "object") { - var specialKeys = ["$set", "$addToSet", "$push", "$pull", "$inc", "$min", "$max", "$setOnce"]; - for (var z = 0; z < specialKeys.length; z++) { - if (doc.custom[key][specialKeys[z]]) { - updateDoc["custom." + key] = doc.custom[key][specialKeys[z]]; - updateMe = true; + var collections = ["drill_events", collectionName0]; + + for (var z1 = 0; z1 < collections.length; z1++) { + var collectionName = collections[z1]; + console.log("Processing collection: " + collectionName); + + if (collectionName === "drill_events") { + query_drill.a = apps[i]._id + ""; + query_drill.e = "[CLY]_session"; + } + else { + delete query_drill.a; + delete query_drill.e; + } + + const cursor = drillDb.collection(collectionName).find(query_drill, {"_id": 1, "custom": 1}); + //FOR EACH DOCUMENT + var updates = []; + while (await cursor.hasNext()) { + var doc = await cursor.next(); + if (doc.custom) { + var updateDoc = {}; + let updateMe = false; + for (var key in doc.custom) { + if (doc.custom[key] && typeof doc.custom[key] === "object") { + var specialKeys = ["$set", "$addToSet", "$push", "$pull", "$inc", "$min", "$max", "$setOnce"]; + for (var z = 0; z < specialKeys.length; z++) { + if (doc.custom[key][specialKeys[z]]) { + updateDoc["custom." + key] = doc.custom[key][specialKeys[z]]; + updateMe = true; + } } } } + if (updateMe) { + updates.push({ + 'updateOne': { + 'filter': { '_id': doc._id }, + 'update': { '$set': updateDoc }, + 'upsert': false + } + }); + } } - if (updateMe) { - updates.push({ - 'updateOne': { - 'filter': { '_id': doc._id }, - 'update': { '$set': updateDoc }, - 'upsert': false - } - }); + if (updates.length === 500) { + if (dry_run) { + console.log("DRY RUN: Would update " + updates.length + " docs in " + collectionName); + console.log(JSON.stringify(updates)); + } + else { + console.log("updating"); + await drillDb.collection(collectionName).bulkWrite(updates, {"ordered": false}); + } + updates = []; } } - if (updates.length === 500) { + if (updates.length > 0) { if (dry_run) { console.log("DRY RUN: Would update " + updates.length + " docs in " + collectionName); console.log(JSON.stringify(updates)); @@ -78,16 +104,6 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" updates = []; } } - if (updates.length > 0) { - if (dry_run) { - console.log("DRY RUN: Would update " + updates.length + " docs in " + collectionName); - console.log(JSON.stringify(updates)); - } - else { - await drillDb.collection(collectionName).bulkWrite(updates, {"ordered": false}); - } - updates = []; - } } } catch (err) { diff --git a/bin/scripts/fix-data/fix_null_uids.js b/bin/scripts/fix-data/fix_null_uids.js index 4d24be6a0a6..fc1435e9070 100644 --- a/bin/scripts/fix-data/fix_null_uids.js +++ b/bin/scripts/fix-data/fix_null_uids.js @@ -42,7 +42,7 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" Promise.each(users, function(user) { return new Promise(function(resolve) { var device_id; - var events = []; + var events = [{"key": ""}]; if (user.did) { device_id = user.did; } @@ -91,7 +91,12 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" } else { var collection = "drill_events" + crypto.createHash('sha1').update(event.key + app._id).digest('hex'); - drillDb.collection(collection).aggregate([{$match: {did: device_id, uid: {"$exists": true}}}, {"$sort": {"ts": -1}}, {$limit: 1}, {$project: {did: 1, uid: 1}}], {"allowDiskUse": true}, function(err, res) { + var query = {did: device_id, uid: {"$exists": true}}; + if (event.key === "") { + collection = "drill_events"; + query.a = app._id + ""; + } + drillDb.collection(collection).aggregate([{$match: query}, {"$sort": {"ts": -1}}, {$limit: 1}, {$project: {did: 1, uid: 1}}], {"allowDiskUse": true}, function(err, res) { if (err) { console.log(err); resolve1(); diff --git a/bin/scripts/fix-data/merge_consent_histories.js b/bin/scripts/fix-data/merge_consent_histories.js new file mode 100755 index 00000000000..11e0fe126eb --- /dev/null +++ b/bin/scripts/fix-data/merge_consent_histories.js @@ -0,0 +1,76 @@ +// Script to merge consent_history data +// Merges app-specific consent_historyAPPID collections into a single consent_history collection + +const pluginManager = require('../../../../plugins/pluginManager.js'); + +const APPS_TO_EXCLUDE = []; +const APPS_TO_MERGE = []; + +const TARGET_COLLECTION_NAME = 'consent_history'; + +function mergeConsentHistoryCollections(collections, db) { + let processes = []; + + console.log(`Merging consent_historyAPPID collections to ${TARGET_COLLECTION_NAME}...`); + for (const collectionName of collections) { + const appId = collectionName.split(TARGET_COLLECTION_NAME)[1]; + const pipeline = []; + + pipeline.push({ + $addFields: { + 'app_id': appId, + } + }); + + pipeline.push({ + $merge: { + into: TARGET_COLLECTION_NAME, + whenMatched: 'keepExisting' + } + }); + processes.push(db.collection(collectionName).aggregate(pipeline).toArray()); + } + return Promise.allSettled(processes); +} + +pluginManager.dbConnection().then(async(countlyDb) => { + try { + countlyDb.collection(TARGET_COLLECTION_NAME).ensureIndex({device_id: 1}, function() {}); + countlyDb.collection(TARGET_COLLECTION_NAME).ensureIndex({uid: 1}, function() {}); + countlyDb.collection(TARGET_COLLECTION_NAME).ensureIndex({type: 1}, function() {}); + countlyDb.collection(TARGET_COLLECTION_NAME).ensureIndex({ts: 1}, function() {}); + + let consentCollections = await countlyDb.listCollections().toArray(); + let collectionNames = consentCollections.map(o => o.name); + var consentHistoryCollections = collectionNames.filter(x => (x.startsWith('consent_history') && !x.endsWith('consent_history'))); + + //If list of apps to exclude is provided, filter out those collections + if (APPS_TO_EXCLUDE.length) { + consentHistoryCollections = consentHistoryCollections.filter(x => !APPS_TO_EXCLUDE.some(appId => x.endsWith(appId))); + } + //If list of apps to merge is provided, filter out only those collections + else if (APPS_TO_MERGE.length) { + consentHistoryCollections = consentHistoryCollections.filter(x => APPS_TO_MERGE.some(appId => x.endsWith(appId))); + } + //If no list of apps to exclude or merge is provided, merge all collections + console.log("Merging the following consent_historyAPPID collections: " + consentHistoryCollections.join(', ')); + + try { + const result = await mergeConsentHistoryCollections(consentHistoryCollections, countlyDb); + const faileds = result.filter(x=>x.status === 'rejected'); + if (faileds.length) { + throw new Error(faileds.map(x=>x.reason).join('\n')); + } + console.log("Finished merging consent_historyAPPID collections to the new " + TARGET_COLLECTION_NAME + " collection."); + } + catch (error) { + console.log(`Error merging consent_historyAPPID collections: ${error}`); + } + } + catch (error) { + console.log(`Error merging consent_historyAPPID collections: ${error}`); + } + finally { + countlyDb.close(); + } +}); diff --git a/bin/scripts/fix-data/recheck_merges.js b/bin/scripts/fix-data/recheck_merges.js index 736efc38479..39d881a91f2 100755 --- a/bin/scripts/fix-data/recheck_merges.js +++ b/bin/scripts/fix-data/recheck_merges.js @@ -69,7 +69,7 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" } async function getDrillCollections(app_id) { - var collections = []; + var collections = ["drill_events"]; try { var events = await countlyDb.collection("events").findOne({_id: common.db.ObjectID(app_id)}); var list = ["[CLY]_session", "[CLY]_crash", "[CLY]_view", "[CLY]_action", "[CLY]_push_action", "[CLY]_push_sent", "[CLY]_star_rating", "[CLY]_nps", "[CLY]_survey", "[CLY]_apm_network", "[CLY]_apm_device", "[CLY]_consent"]; @@ -97,7 +97,11 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" for (let i = 0; i < collections.length; i++) { const collection = collections[i].collectionName; try { - const events = await drillDb.collection(collection).find({uid: old_uid}, {uid: 1, _id: 0}).limit(1).toArray(); + var query = {uid: old_uid}; + if (collection === "drill_events") { + query = {uid: old_uid, 'a': app._id + ""}; + } + const events = await drillDb.collection(collection).find(query, {uid: 1, _id: 0}).limit(1).toArray(); if (!events || !events.length) { continue; } @@ -105,7 +109,7 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" console.log("Found at least one event with old uid ", old_uid, "in collection ", collection, "for app ", app.name, "updating to new uid", new_uid); try { if (!DRY_RUN) { - await drillDb.collection(collection).update({uid: old_uid}, {'$set': {uid: new_uid}}, {multi: true}); + await drillDb.collection(collection).update(query, {'$set': {uid: new_uid}}, {multi: true}); } } catch (err) { diff --git a/bin/scripts/fix-data/recheck_merges_new.js b/bin/scripts/fix-data/recheck_merges_new.js index ad9d130487a..1d44abdceac 100644 --- a/bin/scripts/fix-data/recheck_merges_new.js +++ b/bin/scripts/fix-data/recheck_merges_new.js @@ -51,7 +51,7 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" } async function getDrillCollections(app_id) { - var collections = []; + var collections = ["drill_events"]; try { var events = await countlyDb.collection("events").findOne({_id: common.db.ObjectID(app_id)}); var list = ["[CLY]_session", "[CLY]_crash", "[CLY]_view", "[CLY]_action", "[CLY]_push_action", "[CLY]_push_sent", "[CLY]_star_rating", "[CLY]_nps", "[CLY]_survey", "[CLY]_apm_network", "[CLY]_apm_device", "[CLY]_consent"]; @@ -80,7 +80,11 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" for (let i = 0; i < collections.length; i++) { const collection = collections[i].collectionName; try { - const events = await drillDb.collection(collection).find({uid: old_uid}, {uid: 1, _id: 0}).limit(1).toArray(); + var query = {uid: old_uid}; + if (collection === "drill_events") { + query = {uid: old_uid, 'a': app._id + ""}; + } + const events = await drillDb.collection(collection).find(query, {uid: 1, _id: 0}).limit(1).toArray(); if (!events || !events.length) { continue; } @@ -88,7 +92,7 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" console.log("Found at least one event with old uid ", old_uid, "in collection ", collection, "for app ", app.name, "updating to new uid", new_uid); try { if (!DRY_RUN) { - await drillDb.collection(collection).update({uid: old_uid}, {'$set': {uid: new_uid}}, {multi: true}); + await drillDb.collection(collection).update(query, {'$set': {uid: new_uid}}, {multi: true}); } } catch (err) { @@ -168,7 +172,9 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" } totalProcessedUsers[app._id]++; } - await addRecheckedFlag(app._id, user.uid); + if (user && user.uid) { + await addRecheckedFlag(app._id, user.uid); + } } console.log("Processed users for app", app.name, ": ", totalProcessedUsers[app._id]); } diff --git a/bin/scripts/fix-data/regenerate_aggregated_data.js b/bin/scripts/fix-data/regenerate_aggregated_data.js new file mode 100644 index 00000000000..2e7aaa1b98c --- /dev/null +++ b/bin/scripts/fix-data/regenerate_aggregated_data.js @@ -0,0 +1,161 @@ +/* +* Scrript triggers data regeneration for events and sessions. +* It stores progress in county.data_regeneration_progress collection. +* Collection can be dropped once regeneration is complete. Data in there ensures that if script dies unexpectedly, then upon staring again it will not regenerate collections again. +* mongosh countly +* db.data_regeneration_progress.drop(); +* +* script path: {countly}/bin/scripts/fix-data/ +* +* To run script: +* node regenerate_aggregated_data.js +*/ +//Adjust settings below before running script +var regenerate_events = true; //if true will regenerate all custom events aggregated data +var regenerate_sessions = false; +var period = "732days"; //any valid period + +//Each app IDis listed as string, for example var appList = ["6075f94b7e5e0d392902520c",6075f94b7e5e0d392902520d] +var appList = [];//If left empty, will run for all apps. +//For each app defined there only listed events will be regenerated. If left empty, all events will be regenerated. +//Example var eventMap = {"6075f94b7e5e0d392902520c":["Logout","Login"],"6075f94b7e5e0d392902520d":["Logout","Login","Buy"]}; +var eventMap = {}; //If left empty will run for all alls/events. + + +//End of adjustable settings + +const common = require("../../../api/utils/common.js"); +const pluginManager = require('../../../plugins/pluginManager.js'); +const asyncjs = require('async'); +const drill = require('../../../plugins/drill/api/parts/data/drill.js'); + +Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection("countly_drill")]).then(async function([countlyDb, drillDb]) { + console.log("Connected to databases..."); + common.db = countlyDb; + common.drillDb = drillDb; + //get all apps + try { + var query = {}; + if (appList && appList.length) { + query._id = {$in: appList.map(app_id=>common.db.ObjectID(app_id))}; + } + const apps = await countlyDb.collection("apps").find(query, {_id: 1, name: 1, timezone: 1}).toArray(); + if (!apps || !apps.length) { + return close(); + } + try { + //for each app serially process users + asyncjs.eachSeries(apps, async function(app) { + console.log("Processing app: ", app.name); + //get all drill collections for this app + var skipped_ec = 0; + if (regenerate_events) { + var events = await countlyDb.collection("events").findOne({_id: app._id}, {'list': 1}); + if (events && events.list && events.list.length) { + events.list = events.list.filter(function(ee) { + if (ee.indexOf("[CLY]_") === 0) { + return false; + } + else if (eventMap && eventMap[app._id + ""]) { + return eventMap[app._id + ""].indexOf(ee) > -1; + } + else { + return true; + } + }); + for (var z = 0; z < events.list.length; z++) { + var qq = {_id: app._id + ""}; + qq[events.list[z]] = {$exists: true}; + var doc = await countlyDb.collection("data_regeneration_progress").findOne(qq); + if (!doc) { + var event = events.list[z]; + console.log(" Processing event: ", event); + var params = { + appTimezone: app.timezone, + time: common.initTimeObj(app.timezone), + qstring: { + app_id: app._id + "", + event: event, + period: period + } + }; + try { + await new Promise((resolve)=>{ + drill.calculateEvents(params, function() { + resolve(); + }); + }); + var update = {}; + update[event] = Date.now(); + await countlyDb.collection("data_regeneration_progress").updateOne({_id: app._id + ""}, {"$set": update}, {"upsert": true}); + + } + catch (err) { + console.log(err); + } + } + else { + skipped_ec++; + } + } + } + else { + console.log(" No events found for app: ", app.name); + } + if (skipped_ec) { + console.log(" Skipped ", skipped_ec, " events as they are marked as recalculated"); + } + } + if (regenerate_sessions) { + var doc2 = await countlyDb.collection("data_regeneration_progress").findOne({_id: app._id + "", "[CLY]_session": {$exists: true}}); + if (!doc2) { + console.log(" Processing sessions"); + var params2 = { + appTimezone: app.timezone, + time: common.initTimeObj(app.timezone), + qstring: { + app_id: app._id + "", + period: period + } + }; + try { + await new Promise((resolve)=>{ + drill.calculateSessions(params2, function() { + resolve(); + }); + }); + await countlyDb.collection("data_regeneration_progress").updateOne({_id: app._id + ""}, {"$set": { "[CLY]_session": Date.now()}}, {"upsert": true}); + } + catch (err) { + console.log(err); + } + } + else { + console.log(" Sessions already processed for app: ", app.name); + } + } + + }, function(err) { + return close(err); + }); + } + catch (err) { + return close(err); + } + } + catch (err) { + return close(err); + } + + function close(err) { + if (err) { + console.log(err); + console.log('EXITED WITH ERROR'); + } + console.log("Closing connections..."); + countlyDb.close(); + drillDb.close(); + console.log("DONE"); + } + +}); \ No newline at end of file diff --git a/bin/scripts/fix-data/user-merge.js b/bin/scripts/fix-data/user-merge.js new file mode 100644 index 00000000000..78187b52109 --- /dev/null +++ b/bin/scripts/fix-data/user-merge.js @@ -0,0 +1,152 @@ +/** + * Description: This script is used to merge users based on username. + * Server: countly + * Path: $(countly dir)/bin/scripts/fix-data + * Command: node user-merge.js + */ +var pluginManager = require("../../../plugins/pluginManager.js"); +var appUsers = require("../../../api/parts/mgmt/app_users.js"); +var common = require("../../../api/utils/common.js"); + +console.log("Merging app users"); + +var APP_ID = ""; +var COLLECTION_NAME = "app_users" + APP_ID; + +var RETRY_LIMIT = 3; +var UPDATE_COUNTER = 0; + +//Number of requests to be made before checking record count in app_user_merges +var UPDATE_LIMIT = 100; +//Number of records in app_user_merges after which script will sleep +var RECORD_COUNT_LIMIT = 10; +//Cooldown period if record count exceeds limit +var RECORD_OVERLOAD_SLEEP = 2000; +//Cooldown period between requests +var COOLDOWN_PERIOD = 1000; + +const sleep = m => new Promise((r) => { + //console.log("Cooling period for " + m + " seconds!"); + setTimeout(r, m); +}); + +pluginManager.dbConnection("countly").then(async(countlyDb) => { + try { + + common.db = countlyDb; + + await cursor(); + + console.log("Total updates on the server - ", UPDATE_COUNTER); + console.log("Script ran successfully!"); + common.db.close(); + process.exit(1); + } + catch (e) { + console.log("Error while running script ", e); + common.db.close(); + process.exit(1); + } + + async function cursor() { + + const duplicates = await common.db.collection(COLLECTION_NAME).aggregate([ + { + $group: { + _id: "$username", + count: { $sum: 1 } + } + }, + { + $match: { + count: { $gt: 1 }, + _id: { $ne: null } + } + } + ]).toArray(); + + console.log("Found", duplicates.length, "duplicate username groups."); + + for (var i = 0; i < duplicates.length; i++) { + + var mainUser = null; + var mergedUsersUIDs = []; + + var query = { + username: duplicates[i]._id + }; + + var projections = {}; + + var sort = { ls: -1 }; + + var cursor = common.db.collection(COLLECTION_NAME).find(query).project(projections).sort(sort); + + while (await cursor.hasNext()) { + var doc = await cursor.next(); + + if (doc.uid && doc.uid !== "") { + if (!mainUser) { + mainUser = doc; + } + else { + await mergeUsers(mainUser, doc); + mergedUsersUIDs.push(doc.uid); + } + } + } + + if (mergedUsersUIDs.length > 0) { + console.log("Total", mergedUsersUIDs.length, "users merged into user", mainUser.uid, ": (", mergedUsersUIDs.join(", "), ")"); + } + } + } + + async function mergeUsers(mainUser, user) { + var retryCounter = 1; + var success = false; + + while (!success && retryCounter < RETRY_LIMIT) { + await new Promise(function(resolve) { + var newUser = JSON.parse(JSON.stringify(mainUser)); + + appUsers.merge(APP_ID, newUser, newUser._id, user._id, newUser.did, user.did, function(err) { + if (err) { + console.log("Error while merging - ", err); + retryCounter += 1; + } + else { + success = true; + } + + resolve(); + }); + }); + await sleep(COOLDOWN_PERIOD); + } + + if (success) { + if (retryCounter > 1) { + console.log("User ", user.uid, " merged successfully after ", retryCounter, " retries."); + } + UPDATE_COUNTER += 1; + if (UPDATE_COUNTER % UPDATE_LIMIT === 0) { + await checkRecordCount(); + } + } + else { + console.log("Retry limit exceeded for users ", mainUser.uid, " and ", user.uid); + } + } + + async function checkRecordCount() { + var recordCount = await common.db.collection("app_user_merges").countDocuments(); + console.log("Record count in app_user_merges: ", recordCount); + + while (recordCount > RECORD_COUNT_LIMIT) { + console.log("Record count exceeds limit. Sleeping for " + RECORD_OVERLOAD_SLEEP / 1000 + "seconds."); + await sleep(RECORD_OVERLOAD_SLEEP); + recordCount = await common.db.collection("app_user_merges").countDocuments(); + } + } +}); \ No newline at end of file diff --git a/bin/scripts/modify-data/delete/delete_user_properties.js b/bin/scripts/modify-data/delete/delete_user_properties.js index cd2a6a392cb..ac6ffa96318 100644 --- a/bin/scripts/modify-data/delete/delete_user_properties.js +++ b/bin/scripts/modify-data/delete/delete_user_properties.js @@ -42,9 +42,23 @@ Promise.all([plugins.dbConnection("countly"), plugins.dbConnection("countly_dril done(); } }, function() { - db.close(); - dbDrill.close(); - console.log("done"); + //delete property from merged drill events collection + var unset = {}; + if (PROPERTY.startsWith("custom") || PROPERTY.startsWith("cmp")) { + unset[PROPERTY] = ""; + } + else { + unset["up." + PROPERTY] = ""; + } + + dbDrill.collection("drill_events").updateMany({"a": (APP_ID + "")}, {$unset: unset}, function(err) { + if (err) { + console.log("Error", err); + } + db.close(); + dbDrill.close(); + console.log("done"); + }); }); } }); diff --git a/bin/scripts/mongodb.install.sh b/bin/scripts/mongodb.install.sh index 0d324baaa3b..d2a23cdd20c 100644 --- a/bin/scripts/mongodb.install.sh +++ b/bin/scripts/mongodb.install.sh @@ -341,12 +341,12 @@ if [ $# -eq 0 ]; then exit 1 fi - echo "[mongodb-org-6.0] + echo "[mongodb-org-8.0] name=MongoDB Repository -baseurl=https://repo.mongodb.org/yum/redhat/${CENTOS_MAJOR}/mongodb-org/6.0/x86_64/ +baseurl=https://repo.mongodb.org/yum/redhat/${CENTOS_MAJOR}/mongodb-org/8.0/x86_64/ gpgcheck=1 enabled=1 -gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc" > /etc/yum.repos.d/mongodb-org-6.0.repo +gpgkey=https://pgp.mongodb.com/server-8.0.asc" > /etc/yum.repos.d/mongodb-org-8.0.repo yum install -y mongodb-org elif [ -f /etc/lsb-release ]; then @@ -359,12 +359,12 @@ gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc" > /etc/yum.repos.d/mon exit 1 fi - wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add - - echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu ${UBUNTU_RELEASE}/mongodb-org/6.0 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-6.0.list ; + curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor + echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu ${UBUNTU_RELEASE}/mongodb-org/8.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list apt-get update DEBIAN_FRONTEND="noninteractive" apt-get install -y mongodb-org || (echo "Failed to install mongodb." ; exit) else - echo "Unsupported OS or version, only CentOS/RHEL 8 or 9 and Ubuntu 20 or 22." + echo "Unsupported OS or version, only CentOS/RHEL 8 or 9 and Ubuntu 20 or 22 or 24." exit 1 fi diff --git a/bin/scripts/performance-monitoring/apm_events_delete.js b/bin/scripts/performance-monitoring/apm_events_delete.js index 123c959b556..559a8fde72f 100644 --- a/bin/scripts/performance-monitoring/apm_events_delete.js +++ b/bin/scripts/performance-monitoring/apm_events_delete.js @@ -17,13 +17,19 @@ if (dry_run) { Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection("countly_drill")]).then(async function([countlyDb, drillDb]) { try { - console.log('Deleting APM events for app_id: ' + APP_ID); - await Promise.all([ - countlyDb.collection("apm").remove({app_id: APP_ID}), - drillDb.collection("drill_events" + crypto.createHash('sha1').update("[CLY]_apm_network" + APP_ID).digest('hex')).drop(), - drillDb.collection("drill_events" + crypto.createHash('sha1').update("[CLY]_apm_device" + APP_ID).digest('hex')).drop(), - ]); - console.log("All done"); + if (!APP_ID) { + console.log("Please set APP_ID"); + } + else { + console.log('Deleting APM events for app_id: ' + APP_ID); + await Promise.all([ + countlyDb.collection("apm").remove({app_id: APP_ID}), + drillDb.collection("drill_events" + crypto.createHash('sha1').update("[CLY]_apm_network" + APP_ID).digest('hex')).drop(), + drillDb.collection("drill_events" + crypto.createHash('sha1').update("[CLY]_apm_device" + APP_ID).digest('hex')).drop(), + drillDb.collection("drill_events").remove({"a": APP_ID, "e": {$in: ["[CLY]_apm_device", "[CLY]_apm_network"]}}) + ]); + console.log("All done"); + } } catch (error) { console.log("ERROR: "); diff --git a/bin/scripts/testEventMergingScript.js b/bin/scripts/testEventMergingScript.js new file mode 100644 index 00000000000..e4f6b65209b --- /dev/null +++ b/bin/scripts/testEventMergingScript.js @@ -0,0 +1,279 @@ +/* Script validates merging of aggregated events collections using merge_events_collections.js script +Correct app_ID and collection name(just hash of event name) should be provided +Script will delete documents matching selected event. +Do not run on real event data, as it will delete it. +*/ +const pluginManager = require('../../plugins/pluginManager.js'); +var Promise = require("bluebird"); + +//Change these values to correct ones. +var collectionName = 'fe55f384d642312c76f6164a4f8ea40ffcc80795'; +var app_ID = '6075f94b7e5e0d392902520c'; +var EventKey = 'bumba'; + +var pathToScript = '/opt/countly/bin/upgrade/DEV/scripts/merge_events_collections.js'; +Promise.all( + [ + pluginManager.dbConnection("countly") + ]) + .spread(async function(countlyDB) { + //insert some documents in collection + await countlyDB.collection("events" + collectionName).drop();//cleanup in case + await countlyDB.collection("events_data").deleteMany({'_id': {"$regex": "^" + app_ID + "_" + collectionName + "_.*"}}); + var docs = [{ + "_id": "no-segment_2023:0_z", + "m": "2023:0", + "meta_v2": { + "Method": { + "Mobile app": true + }, + "segments": { + "Method": true + } + }, + "s": "no-segment" + }, + { + "_id": "no-segment_2023:11", + "d": { + "1": { + "0": { + "c": 1, + "dur": 8 + }, + "4": { + "c": 2, + "dur": 11 + }, + "11": { + "c": 2, + "dur": 7 + }, + "13": { + "c": 1, + "dur": 1 + }, + "14": { + "c": 1, + "dur": 6 + }, + "18": { + "c": 1, + "dur": 10 + }, + "c": 8, + "dur": 43 + } + }, + "m": "2023:11", + "s": "no-segment" + }, + { + "_id": "Method_2023:11_z", + "d": { + "1": { + "Mobile app": { + "c": 8, + "dur": 43 + } + }, + "2": { + "Mobile app": { + "c": 6, + "dur": 43 + } + }, + }, + "m": "2023:11", + "s": "Method" + } + ]; + + await countlyDB.collection("events" + collectionName).insertMany(docs); + //run node.js script and wait for it to finish + var exec = require('child_process').exec; + exec('node ' + pathToScript, async function(error, stdout) { + if (error) { + console.log(error); + } + console.log(stdout); + //run query to check current state in database + + var result = await countlyDB.collection("events_data").find({'_id': {"$regex": "^" + app_ID + "_" + collectionName + "_.*"}}).toArray(); + var mapped = {}; + for (var ii = 0; ii < result.length; ii++) { + mapped[result[ii]._id] = result[ii]; + } + + for (var i = 0; i < docs.length; i++) { + var coppied = JSON.parse(JSON.stringify(docs[i])); + coppied._id = app_ID + "_" + collectionName + "_" + docs[i]._id; + if (!mapped[coppied._id]) { + console.log("Document not found in database: " + coppied._id); + } + else { + coppied.a = app_ID; + coppied.e = "bumba"; + + if (!compareObjects(coppied, mapped[coppied._id], "", true)) { + console.log("Document not same as original: " + coppied._id); + } + + + } + } + + // + await countlyDB.collection("events" + collectionName).drop(); + + //insertng new docs(should clash) + var docs2 = [{ + "_id": "no-segment_2023:0_z", + "m": "2023:0", + "meta_v2": { + "Method": { + "Mobile app": true, + "Desktop app": true + }, + "segments": { + "Method": true, + "Test": true + } + }, + "s": "no-segment" + }, + { + "_id": "no-segment_2023:11", + "d": { + "1": { + "0": { + "c": 1, + "dur": 8 + }, + "c": 1, + "dur": 8 + }, + "2": { + "0": { + "c": 1, + "dur": 8 + }, + "4": { + "c": 2, + "dur": 11 + }, + "11": { + "c": 2, + "dur": 7 + }, + "13": { + "c": 1, + "dur": 1 + }, + "14": { + "c": 1, + "dur": 6 + }, + "18": { + "c": 1, + "dur": 10 + }, + "c": 8, + "dur": 43 + } + }, + "m": "2023:11", + "s": "no-segment" + }, + + ]; + + docs[0].meta_v2.Method["Desktop app"] = true; + docs[0].meta_v2.segments["Test"] = true; + + docs[1].d["2"] = JSON.parse(JSON.stringify(docs2[1].d["2"])); + docs[1].d["1"]["0"]["c"] = 2; + docs[1].d["1"]["0"]["dur"] = 16; + docs[1].d["1"]["c"] += 1; + docs[1].d["1"]["dur"] += 8; + + await countlyDB.collection("events" + collectionName).insertMany(docs2); + + //run script again and compare again + exec('node ' + pathToScript, async function(error, stdout) { + if (error) { + console.log(error); + } + console.log(stdout); + //run query to check current state in database + + var result = await countlyDB.collection("events_data").find({'_id': {"$regex": "^" + app_ID + "_" + collectionName + "_.*"}}).toArray(); + var mapped = {}; + for (var ij = 0; ij < result.length; ij++) { + mapped[result[ij]._id] = result[ij]; + } + + for (var i = 0; i < docs.length; i++) { + var coppied = JSON.parse(JSON.stringify(docs[i])); + coppied._id = app_ID + "_" + collectionName + "_" + docs[i]._id; + if (!mapped[coppied._id]) { + console.log("Document not found in database: " + coppied._id); + } + else { + coppied.a = app_ID; + coppied.e = EventKey; + + if (!compareObjects(coppied, mapped[coppied._id], "", true)) { + console.log("Document not same as original: " + coppied._id); + } + + } + } + + //delete all records from selected databases + //await countlyDB.collection("events"+collectionName).drop(); + // await countlyDB.collection("events_data").deleteMany({'_id':{"$regex":"^"+app_ID+"_"+collectionName+"_.*"}}); + console.log("Done"); + countlyDB.close(); + }); + }); + + + }); + + + +function compareObjects(correct, ob, tree, segmented) { + var good = true; + tree = tree || ""; + if (typeof ob === 'undefined') { + console.log("missing param:" + tree); + return false; + } + else if (typeof correct === "undefined") { + console.log("extra param:" + tree); + return false; + } + else { + for (var c in correct) { + if (typeof correct[c] === 'object') { + if (c === "ds") { + console.log(tree + "." + c + " " + ob[c] + " " + correct[c]); + } + var zz = compareObjects(correct[c], ob[c], tree + "." + c, segmented); + if (zz === false) { + good = false; + } + } + else if (ob[c] != correct[c]) { + console.log(tree + "." + c + " " + ob[c] + " (need:)" + correct[c]); + good = false; + } + + + } + return good; + } +} + + diff --git a/bin/upgrade/23.06/scripts/cleanup_crashgroup_custom_field.js b/bin/upgrade/23.06/scripts/cleanup_crashgroup_custom_field.js index aa0ccf5f55a..ba29b4efc2b 100644 --- a/bin/upgrade/23.06/scripts/cleanup_crashgroup_custom_field.js +++ b/bin/upgrade/23.06/scripts/cleanup_crashgroup_custom_field.js @@ -4,9 +4,13 @@ const { cleanupCustomField, DEFAULT_MAX_CUSTOM_FIELD_KEYS } = require('../../../ console.log('Cleaning up crashgroup custom fields'); pluginManager.dbConnection().then(async(countlyDb) => { - const maxCustomFieldKeys = pluginManager.getConfig('crashes').max_custom_field_keys || DEFAULT_MAX_CUSTOM_FIELD_KEYS; - await cleanupCustomField(countlyDb, maxCustomFieldKeys); + pluginManager.loadConfigs(countlyDb, async() => { + const maxCustomFieldKeys = pluginManager.getConfig('crashes').max_custom_field_keys || DEFAULT_MAX_CUSTOM_FIELD_KEYS; + await cleanupCustomField(countlyDb, maxCustomFieldKeys); - countlyDb.close(); - console.log('Crashgroup cleanup done'); + pluginManager.setConfigs('crashes', { activate_custom_field_cleanup_job: true }); + + countlyDb.close(); + console.log('Crashgroup cleanup done'); + }); }); diff --git a/bin/upgrade/24.10/scripts/merge_events_collections.js b/bin/upgrade/24.10/scripts/merge_events_collections.js new file mode 100644 index 00000000000..0cd6779b2a0 --- /dev/null +++ b/bin/upgrade/24.10/scripts/merge_events_collections.js @@ -0,0 +1,211 @@ +/*Script to merge all drill meta */ +const pluginManager = require('../../../../plugins/pluginManager.js'); +var Promise = require("bluebird"); +var crypto = require('crypto'); + +console.log("Merging all events collections into single collection"); + +var maxActionCount = 10000;//limiting action count to avoid 16MB update operation limit + +var reports = { + "listed": 0, + "skipped": 0, + "merged": [], + "failed": [], + "mergedOneByOne": [] +}; + +function load_event_hashmap(countlyDB, callback) { + var mapped = {}; + countlyDB.collection('events').find({}, {'list': 1}).toArray(function(err, events) { + if (err) { + callback(err, null); + } + else { + events = events || []; + for (let h = 0; h < events.length; h++) { + if (events[h].list) { + for (let i = 0; i < events[h].list.length; i++) { + mapped["events" + crypto.createHash('sha1').update(events[h].list[i] + events[h]._id + "").digest('hex')] = {"a": events[h]._id + "", "e": events[h].list[i]}; + } + } + } + callback(null, mapped); + } + }); +} + +async function merge_data_from_collection(countlyDB, collection, mapped, resolve) { + if (!mapped[collection]) { + console.log("Skipping collection " + collection + " as it is not found in events list"); + reports.skipped += 1; + resolve(); + return; + } + else { + var app_id = mapped[collection].a; + var prefix = app_id + "_" + collection.replace("events", ""); + var tscheck = Date.now().valueOf(); + countlyDB.collection(collection).aggregate([{"$match": {"merged": {"$ne": true}}}, {"$addFields": {"_id": {"$concat": [prefix, "_", "$_id"]}, "tscheck": tscheck, "a": app_id, "e": mapped[collection].e}}, {"$merge": {"into": "events_data", "on": "_id", "whenMatched": "fail"}}], {ignore_errors: [11000]}, async function(err) { + if (err) { + console.log("Failed to merge with database $merge operation. Doing each document one by one"); + + console.log('Removing inserted with tscheck param'); + await countlyDB.collection(collection).deleteMany({"_id": {"$regex": "^" + prefix + "_.*"}, "tscheck": tscheck}); + console.log('Processing data...'); + + //As it field there are already some incoming data. Process all of them one by one. + var cursor = await countlyDB.collection(collection).find({"merged": {"$ne": true}}); + var doc; + try { + while ((doc = await cursor.next())) { + var original_id = doc._id; + doc._id = prefix + "_" + doc._id; + doc.a = app_id; + doc.e = mapped[collection].e; + var actionCounter = 0; + + var update = {"$set": {"m": doc.m, "a": doc.a, "e": doc.e, "s": doc.s || "no-segment"}}; + if (doc.meta_v2) { + for (var key0 in doc.meta_v2) { + for (var value in doc.meta_v2[key0]) { + update["$set"]["meta_v2." + key0 + "." + value] = doc.meta_v2[key0][value]; + actionCounter++; + if (actionCounter > maxActionCount) { + await countlyDB.collection("events_data").updateOne({"_id": doc._id}, update, {upsert: true}); + update = {"$set": {"m": doc.m, "a": doc.a, "e": doc.e, "s": doc.s || "no-segment"}}; + actionCounter = 0; + } + } + } + } + if (doc.d) { + for (var day in doc.d) { + for (var key in doc.d[day]) { + //if is Object + if (typeof doc.d[day][key] === 'object') { + for (var prop in doc.d[day][key]) { + update["$inc"] = update["$inc"] || {}; + update["$inc"]["d." + day + "." + key + "." + prop] = doc.d[day][key][prop]; + actionCounter++; + if (actionCounter > maxActionCount) { + await countlyDB.collection("events_data").updateOne({"_id": doc._id}, update, {upsert: true}); + update = {"$set": {"m": doc.m, "a": doc.a, "e": doc.e, "s": doc.s}}; + actionCounter = 0; + } + } + } + else { + update["$inc"] = update["$inc"] || {}; + update["$inc"]["d." + day + "." + key] = doc.d[day][key]; + } + } + } + } + if (actionCounter > 0) { //we are splitting updates to make sure update operation do not reach 16MB + await countlyDB.collection("events_data").updateOne({"_id": doc._id}, update, {upsert: true}); + } + await countlyDB.collection(collection).updateOne({"_id": original_id}, {"$set": {"merged": true}}); + } + } + catch (error) { + console.log(error); + reports.failed.push(collection); + resolve(error); + return; + } + reports.mergedOneByOne.push(collection); + var endTime = Date.now().valueOf(); + console.log("Merged collection " + collection + " in " + (endTime - tscheck) + "ms"); + resolve(); + } + else { + reports.merged.push(collection); + console.log('Removing inserted with tscheck param'); + countlyDB.collection(collection).updateMany({}, {"$set": {"merged": true}}, function(err) { + if (err) { + console.log(err); + } + countlyDB.collection("events_data").updateMany({"_id": {"$regex": "^" + prefix + "_.*"}}, {"$unset": {"tscheck": ""}}, function(ee) { + if (ee) { + console.log(ee); + } + //mark documents as coppied + var endTime = Date.now().valueOf(); + console.log("Merged collection " + collection + " in " + (endTime - tscheck) + "ms"); + resolve(); + }); + }); + } + }); + } + +} + +Promise.all( + [ + pluginManager.dbConnection("countly") + ]) + .spread(function(countlyDB) { + countlyDB.collections(function(err, colls) { + if (err) { + console.log('Script failed. Exiting'); + countlyDB.close(); + } + else { + //filter out list with only drill_meta collections. but not outr merged collection + for (var z = 0; z < colls.length; z++) { + colls[z] = colls[z].collectionName; + } + var collections = colls.filter(function(coll) { + return (coll.indexOf("events") === 0 && coll.length > 11); + }); + //load all + reports.listed = collections.length; + load_event_hashmap(countlyDB, function(err, mapped) { + if (err) { + console.log(err); + console.log('Script failed. Exiting'); + countlyDB.close(); + } + else { + Promise.each(collections, function(coll) { + return new Promise(function(resolve, reject) { + merge_data_from_collection(countlyDB, coll, mapped, function(error) { + if (error) { + reject(); + } + else { + resolve(); + } + }); + }); + }).then(function() { + console.log("All events collections merged"); + console.log("collections containing events data: ", reports.listed); + console.log("Skipped collections: ", reports.skipped); + console.log("Moved collections: ", reports.merged.length); + console.log("Failed to merge collections: ", reports.failed.length); + if (reports.failed.length > 0) { + console.log(JSON.stringify(reports.failed)); + } + console.log("Merged collections: ", reports.mergedOneByOne.length); + countlyDB.close(); + }).catch(function(err5) { + console.log(err5); + console.log("All events collections merged"); + console.log("collections containing events data: ", reports.listed); + console.log("Moved collections: ", reports.merged.length); + console.log("Failed to merge collections: ", reports.failed.length); + if (reports.failed.length > 0) { + console.log(JSON.stringify(reports.failed)); + } + console.log("Merged collections: ", reports.mergedOneByOne.length); + console.log('Script failed. Exiting. PLEASE RERUN SCRIPT TO MIGRATE ALL DATA.'); + countlyDB.close(); + }); + } + }); + } + }); + }); \ No newline at end of file diff --git a/bin/upgrade/24.10/upgrade.mongo.70.sh b/bin/upgrade/24.10/upgrade.mongo.70.sh new file mode 100644 index 00000000000..0374efbc243 --- /dev/null +++ b/bin/upgrade/24.10/upgrade.mongo.70.sh @@ -0,0 +1,137 @@ +#!/bin/bash + +#we have to check since we cannot continue unless +if [ -f /etc/redhat-release ]; then + CENTOS_MAJOR="$(cat /etc/redhat-release |awk -F'[^0-9]+' '{ print $2 }')" + + if [[ "$CENTOS_MAJOR" != "8" && "$CENTOS_MAJOR" != "9" ]]; then + echo "Unsupported OS version, only support CentOS/RHEL 8 and 9." + exit 1 + fi +fi + +if [ -f /etc/lsb-release ]; then + UBUNTU_YEAR="$(lsb_release -sr | cut -d '.' -f 1)"; + UBUNTU_RELEASE="$(lsb_release -cs)" + + if [[ "$UBUNTU_YEAR" != "20" && "$UBUNTU_YEAR" != "22" ]]; then + echo "Unsupported OS version, only support Ubuntu 20 and 22." + exit 1 + fi +fi + +#check if authentication is required +isAuth=0 +if grep -Eq '^\s*authorization\s*:\s*enabled' /etc/mongod.conf; then + isAuth=1 +fi + +#check if we have previous upgrade needed +FEATVER=$(mongosh admin --eval "printjson(db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } ).featureCompatibilityVersion)" --quiet); +VER=$(mongod -version | grep "db version" | cut -d ' ' -f 3 | cut -d 'v' -f 2) + +if [ "$isAuth" -eq "1" ]; then + echo "Since authentication is enabled, we cannot verify if you need to run this upgrade script" + echo "" + echo "Please run this command with authentication parameters:" + echo "" + echo "mongosh admin --eval \"db.adminCommand({ getParameter: 1, featureCompatibilityVersion: 1 } )\"" + echo "" + echo "and continue only if \"featureCompatibilityVersion\" is 6.0 " + echo "" + read -r -p "Is your \"featureCompatibilityVersion\" version is 6.0? [y/N] " response + if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]] + then + echo "Continue upgrading" + else + echo "Stopping script" + exit 0; + fi + +fi + +if [ -x "$(command -v mongosh)" ]; then + if echo "$VER" | grep -q -i "7.0" ; then + if echo "$FEATVER" | grep -q -i "6.0" ; then + echo "run this command to upgrade to 7.0"; + echo "mongosh admin --eval \"db.adminCommand( { setFeatureCompatibilityVersion: \\\"7.0\\\" } )\""; + else + echo "We already have version 7.0"; + fi + exit 0; + elif echo "$VER" | grep -q -i "6.0" ; then + if echo "$FEATVER" | grep -q -i "5.0" ; then + echo "run this command before upgrading to 7.0"; + echo "mongosh admin --eval \"db.adminCommand( { setFeatureCompatibilityVersion: \\\"6.0\\\" } )\""; + exit 0; + else + echo "Upgrading to MongoDB 7.0"; + fi + else + echo "Unsupported MongodB version $VER"; + echo "Upgrade to MongoDB 6.0 first and then run this script"; + exit 1; + fi + + if [ -f /etc/redhat-release ]; then + #backup of systemd unit file and mongod.conf file + \cp /usr/lib/systemd/system/mongod.service /usr/lib/systemd/system/mongod.service.bak + \cp -f /etc/mongod.conf /etc/mongod.conf.bak + #uninstall mognodb + yum erase -y mongodb-org mongodb-org-mongos mongodb-org-server mongodb-org-shell mongodb-org-tools + fi + + if [ -f /etc/lsb-release ]; then + #uninstall mognodb + apt-get remove -y mongodb-org mongodb-org-mongos mongodb-org-server mongodb-org-shell mongodb-org-tools + fi +fi + +if [ -f /etc/redhat-release ]; then + #install latest mongodb + #select source based on release + echo "[mongodb-org-7.0] +name=MongoDB Repository +baseurl=https://repo.mongodb.org/yum/redhat/${CENTOS_MAJOR}/mongodb-org/7.0/x86_64/ +gpgcheck=1 +enabled=1 +gpgkey=https://www.mongodb.org/static/pgp/server-7.0.asc" > /etc/yum.repos.d/mongodb-org-7.0.repo + + yum install -y mongodb-org + \cp -f /etc/mongod.conf.bak /etc/mongod.conf +fi + +if [ -f /etc/lsb-release ]; then + #install latest mongodb + wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo apt-key add - + + echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu ${UBUNTU_RELEASE}/mongodb-org/7.0 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-7.0.list ; + apt-get update + #install mongodb + apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" install -y mongodb-org --force-yes || (echo "Failed to install mongodb." ; exit) +fi + +if [ -f /etc/redhat-release ]; then + #Restoring systemd unit file + \cp -f /usr/lib/systemd/system/mongod.service.bak /usr/lib/systemd/system/mongod.service + systemctl daemon-reload +fi + +#mongodb might need to be started +systemctl restart mongod || echo "mongodb systemctl job does not exist" + +#nc not available on latest centos +#until nc -z localhost 27017; do echo Waiting for MongoDB; sleep 1; done +mongosh --nodb --eval 'var conn; print("Waiting for MongoDB connection on port 27017. Exit if incorrect port"); var cnt = 0; while(!conn && cnt <= 300){try{conn = new Mongo("localhost:27017");}catch(Error){}sleep(1000);cnt++;}' + +if [ "$isAuth" -eq "1" ]; then + echo "run this command with authentication to upgrade to 7.0" + echo "mongosh admin --eval \"db.adminCommand( { setFeatureCompatibilityVersion: \\\"7.0\\\" } )\"" +elif ! mongosh admin --eval "printjson(db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } ))" ; then + echo "Could not connect to MongodB, run this command when Mongo is up and running" + echo "mongosh admin --eval \"db.adminCommand( { setFeatureCompatibilityVersion: \\\"7.0\\\" } )\"" +else + mongosh admin --eval "printjson(db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } ))" + mongosh admin --eval "db.adminCommand( { setFeatureCompatibilityVersion: \"7.0\", confirm: true } )" + echo "Finished upgrading script" +fi \ No newline at end of file diff --git a/bin/upgrade/24.10/upgrade.nodejs.20.sh b/bin/upgrade/24.10/upgrade.nodejs.20.sh new file mode 100644 index 00000000000..43a253282fa --- /dev/null +++ b/bin/upgrade/24.10/upgrade.nodejs.20.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +#we have to check since we cannot continue unless +if [ -f /etc/redhat-release ]; then + CENTOS_MAJOR="$(cat /etc/redhat-release |awk -F'[^0-9]+' '{ print $2 }')" + + if [[ "$CENTOS_MAJOR" != "8" && "$CENTOS_MAJOR" != "9" ]]; then + echo "Unsupported OS version, only support CentOS/RHEL 8 and 9." + exit 1 + fi +fi + +if [ -f /etc/lsb-release ]; then + UBUNTU_YEAR="$(lsb_release -sr | cut -d '.' -f 1)"; + + if [[ "$UBUNTU_YEAR" != "20" && "$UBUNTU_YEAR" != "22" ]]; then + echo "Unsupported OS version, only support Ubuntu 20 and 22." + exit 1 + fi +fi + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." && pwd )" + +sudo npm install -g npm@latest; + +if [[ -f /usr/local/bin/npm && -f /usr/bin/npm ]]; then + rm /usr/local/bin/npm + ln -s /usr/bin/npm /usr/local/bin/npm +fi + +#upgrade nodejs +if [ -f /etc/redhat-release ]; then + curl -sL https://rpm.nodesource.com/setup_20.x | bash - + yum clean all + yum remove -y nodejs + yum install -y nodejs +fi + +if [ -f /etc/lsb-release ]; then + wget -qO- https://deb.nodesource.com/setup_20.x | bash - + apt-get -y --force-yes install nodejs || (echo "Failed to install nodejs." ; exit) +fi + +#remove previous dependencies, as they need to be rebuild for new nodejs version +rm -rf "$DIR/../node_modules" +rm -rf "$DIR/../plugins/hooks/node_modules" + +(cd "$DIR/.." && sudo npm install --unsafe-perm && sudo npm install argon2 --build-from-source) +(cd "$DIR/../plugins/hooks" && sudo npm install --unsafe-perm) \ No newline at end of file diff --git a/bin/upgrade/24.10/upgrade.sh b/bin/upgrade/24.10/upgrade.sh new file mode 100644 index 00000000000..54565dd038e --- /dev/null +++ b/bin/upgrade/24.10/upgrade.sh @@ -0,0 +1,13 @@ +#!/bin/bash +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +DATE=$(date +%Y-%m-%d:%H:%M:%S) +VERSION="$(basename "${DIR}")" + +countly stop +if [ -f "$DIR/upgrade_fs.sh" ]; then + bash "$DIR/upgrade_fs.sh" combined 2>&1 | tee -a "$DIR/../../../log/countly-upgrade-fs-$VERSION-$DATE.log" +fi +if [ -f "$DIR/upgrade_db.sh" ]; then + bash "$DIR/upgrade_db.sh" combined 2>&1 | tee -a "$DIR/../../../log/countly-upgrade-db-$VERSION-$DATE.log" +fi +countly upgrade diff --git a/bin/upgrade/24.10/upgrade_db.sh b/bin/upgrade/24.10/upgrade_db.sh new file mode 100644 index 00000000000..8fd596a5135 --- /dev/null +++ b/bin/upgrade/24.10/upgrade_db.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +VER="24.10" + +CONTINUE="$(countly check before upgrade db "$VER")" + +if [ "$CONTINUE" != "1" ] && [ "$1" != "combined" ] +then + echo "Database is already up to date with $VER" + read -r -p "Are you sure you want to run this script? [y/N] " response + if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]] + then + CONTINUE=1 + fi +fi + +if [ "$CONTINUE" == "1" ] +then + echo "Running database modifications" + DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." && pwd )" + SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + + if [ "$1" != "combined" ]; then + #upgrade plugins + nodejs "$DIR/scripts/install_plugins.js" + fi + + #add indexes + nodejs "$DIR/scripts/add_indexes.js" + + #run upgrade scripts + nodejs "$SCRIPTS/scripts/merge_events_collections.js" + + + if [ "$1" != "combined" ]; then + countly upgrade; + fi + + #call after check + countly check after upgrade db "$VER" +elif [ "$CONTINUE" == "0" ] +then + echo "Database is already upgraded to $VER" +elif [ "$CONTINUE" == "-1" ] +then + echo "Database is upgraded to higher version" +else + echo "Unknown ugprade state: $CONTINUE" +fi diff --git a/bin/upgrade/24.10/upgrade_fs.sh b/bin/upgrade/24.10/upgrade_fs.sh new file mode 100644 index 00000000000..f1b244ccf42 --- /dev/null +++ b/bin/upgrade/24.10/upgrade_fs.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +echo "Running filesystem modifications" + +VER="24.10" + +CONTINUE="$(countly check before upgrade fs "$VER")" + +if [ "$CONTINUE" != "1" ] && [ "$1" != "combined" ] +then + echo "Filesystem is already up to date with $VER" + read -r -p "Are you sure you want to run this script? [y/N] " response + if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]] + then + CONTINUE=1 + fi +fi + +if [ "$CONTINUE" == "1" ] +then + DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." && pwd )" + + #enable command line + bash "$DIR/scripts/detect.init.sh" + + #upgrade plugins + nodejs "$DIR/scripts/install_plugins.js" + + #get web sdk + countly update sdk-web + + + if [ "$1" != "combined" ]; then + countly upgrade; + else + countly task dist-all; + fi + + #call after check + countly check after upgrade fs "$VER" +elif [ "$CONTINUE" == "0" ] +then + echo "Filesystem is already upgraded to $VER" +elif [ "$CONTINUE" == "-1" ] +then + echo "Filesystem is upgraded to higher version" +else + echo "Unknown ugprade state: $CONTINUE" +fi diff --git a/bin/upgrade/DEV/upgrade.mongo.80.sh b/bin/upgrade/DEV/upgrade.mongo.80.sh new file mode 100644 index 00000000000..46fea7095d3 --- /dev/null +++ b/bin/upgrade/DEV/upgrade.mongo.80.sh @@ -0,0 +1,137 @@ +#!/bin/bash + +#we have to check since we cannot continue unless +if [ -f /etc/redhat-release ]; then + CENTOS_MAJOR="$(cat /etc/redhat-release |awk -F'[^0-9]+' '{ print $2 }')" + + if [[ "$CENTOS_MAJOR" != "8" && "$CENTOS_MAJOR" != "9" ]]; then + echo "Unsupported OS version, only support CentOS/RHEL 8 and 9." + exit 1 + fi +fi + +if [ -f /etc/lsb-release ]; then + UBUNTU_YEAR="$(lsb_release -sr | cut -d '.' -f 1)"; + UBUNTU_RELEASE="$(lsb_release -cs)" + + if [[ "$UBUNTU_YEAR" != "20" && "$UBUNTU_YEAR" != "22" && "$UBUNTU_YEAR" != "24" ]]; then + echo "Unsupported OS version, only support Ubuntu 20 and 22 and 24." + exit 1 + fi +fi + +#check if authentication is required +isAuth=0 +if grep -Eq '^\s*authorization\s*:\s*enabled' /etc/mongod.conf; then + isAuth=1 +fi + +#check if we have previous upgrade needed +FEATVER=$(mongosh admin --eval "printjson(db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } ).featureCompatibilityVersion)" --quiet); +VER=$(mongod -version | grep "db version" | cut -d ' ' -f 3 | cut -d 'v' -f 2) + +if [ "$isAuth" -eq "1" ]; then + echo "Since authentication is enabled, we cannot verify if you need to run this upgrade script" + echo "" + echo "Please run this command with authentication parameters:" + echo "" + echo "mongosh admin --eval \"db.adminCommand({ getParameter: 1, featureCompatibilityVersion: 1 } )\"" + echo "" + echo "and continue only if \"featureCompatibilityVersion\" is 7.0 " + echo "" + read -r -p "Is your \"featureCompatibilityVersion\" version is 7.0? [y/N] " response + if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]] + then + echo "Continue upgrading" + else + echo "Stopping script" + exit 0; + fi + +fi + +if [ -x "$(command -v mongosh)" ]; then + if echo "$VER" | grep -q -i "8.0" ; then + if echo "$FEATVER" | grep -q -i "7.0" ; then + echo "run this command to upgrade to 8.0"; + echo "mongosh admin --eval \"db.adminCommand( { setFeatureCompatibilityVersion: \\\"8.0\\\", confirm: true } )\""; + else + echo "We already have version 8.0"; + fi + exit 0; + elif echo "$VER" | grep -q -i "7.0" ; then + if echo "$FEATVER" | grep -q -i "6.0" ; then + echo "run this command before upgrading to 8.0 and rerunning this script"; + echo "mongosh admin --eval \"db.adminCommand( { setFeatureCompatibilityVersion: \\\"7.0\\\", confirm: true } )\""; + exit 0; + else + echo "Upgrading to MongoDB 8.0"; + fi + else + echo "Unsupported MongodB version $VER"; + echo "Upgrade to MongoDB 7.0 first and then run this script"; + exit 1; + fi + + if [ -f /etc/redhat-release ]; then + #backup of systemd unit file and mongod.conf file + \cp /usr/lib/systemd/system/mongod.service /usr/lib/systemd/system/mongod.service.bak + \cp -f /etc/mongod.conf /etc/mongod.conf.bak + #uninstall mognodb + yum erase -y mongodb-org mongodb-org-mongos mongodb-org-server mongodb-org-shell mongodb-org-tools + fi + + if [ -f /etc/lsb-release ]; then + #uninstall mognodb + apt-get remove -y mongodb-org mongodb-org-mongos mongodb-org-server mongodb-org-shell mongodb-org-tools + fi +fi + +if [ -f /etc/redhat-release ]; then + #install latest mongodb + #select source based on release +echo "[mongodb-org-8.0] +name=MongoDB Repository +baseurl=https://repo.mongodb.org/yum/redhat/${CENTOS_MAJOR}/mongodb-org/8.0/x86_64/ +gpgcheck=1 +enabled=1 +gpgkey=https://pgp.mongodb.com/server-8.0.asc" > /etc/yum.repos.d/mongodb-org-8.0.repo + + yum install -y mongodb-org + \cp -f /etc/mongod.conf.bak /etc/mongod.conf +fi + +if [ -f /etc/lsb-release ]; then + #install latest mongodb + curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor + + echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu ${UBUNTU_RELEASE}/mongodb-org/8.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list + apt-get update + #install mongodb + apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" install -y mongodb-org --force-yes || (echo "Failed to install mongodb." ; exit) +fi + +if [ -f /etc/redhat-release ]; then + #Restoring systemd unit file + \cp -f /usr/lib/systemd/system/mongod.service.bak /usr/lib/systemd/system/mongod.service + systemctl daemon-reload +fi + +#mongodb might need to be started +systemctl restart mongod || echo "mongodb systemctl job does not exist" + +#nc not available on latest centos +#until nc -z localhost 27017; do echo Waiting for MongoDB; sleep 1; done +mongosh --nodb --eval 'var conn; print("Waiting for MongoDB connection on port 27017. Exit if incorrect port"); var cnt = 0; while(!conn && cnt <= 300){try{conn = new Mongo("localhost:27017");}catch(Error){}sleep(1000);cnt++;}' + +if [ "$isAuth" -eq "1" ]; then + echo "run this command with authentication to upgrade to 8.0" + echo "mongosh admin --eval \"db.adminCommand( { setFeatureCompatibilityVersion: \\\8.0\\\", confirm: true } )\"" +elif ! mongosh admin --eval "printjson(db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } ))" ; then + echo "Could not connect to MongodB, run this command when Mongo is up and running" + echo "mongosh admin --eval \"db.adminCommand( { setFeatureCompatibilityVersion: \\\"8.0\\\", confirm: true } )\"" +else + mongosh admin --eval "printjson(db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } ))" + mongosh admin --eval "db.adminCommand( { setFeatureCompatibilityVersion: \"8.0\", confirm: true } )" + echo "Finished upgrading script" +fi \ No newline at end of file diff --git a/frontend/express/app.js b/frontend/express/app.js index b4ecef4c685..06f9b736362 100644 --- a/frontend/express/app.js +++ b/frontend/express/app.js @@ -486,12 +486,12 @@ Promise.all([plugins.dbConnection(countlyConfig), plugins.dbConnection("countly_ res.sendFile(__dirname + '/public/images/default_app_icon.png'); } else { - countlyFs.getStats("appimages", __dirname + '/public/' + req.path, {id: req.params[0]}, function(err, stats) { + countlyFs.getStats("appimages", __dirname + '/public/appimages/' + req.params[0], {id: req.params[0]}, function(err, stats) { if (err || !stats || !stats.size) { res.sendFile(__dirname + '/public/images/default_app_icon.png'); } else { - countlyFs.getStream("appimages", __dirname + '/public/' + req.path, {id: req.params[0]}, function(err2, stream) { + countlyFs.getStream("appimages", __dirname + '/public/appimages/' + req.params[0], {id: req.params[0]}, function(err2, stream) { if (err2 || !stream) { res.sendFile(__dirname + '/public/images/default_app_icon.png'); } diff --git a/frontend/express/public/core/app-management/javascripts/countly.views.js b/frontend/express/public/core/app-management/javascripts/countly.views.js index e5d284f13c8..af100602e21 100755 --- a/frontend/express/public/core/app-management/javascripts/countly.views.js +++ b/frontend/express/public/core/app-management/javascripts/countly.views.js @@ -381,26 +381,28 @@ }, dataType: "json", success: function(data) { - data.locked = false; - countlyGlobal.apps[data._id] = data; - countlyGlobal.admin_apps[data._id] = data; - Backbone.history.appIds.push(data._id + ""); - countlyGlobal.apps[data._id].image = "appimages/" + data._id + ".png?" + Date.now().toString(); - self.appList.push({ - value: data._id + "", - label: data.name - }); - self.$store.dispatch("countlyCommon/addToAllApps", data); - if (self.firstApp) { - countlyCommon.ACTIVE_APP_ID = data._id + ""; - app.onAppManagementSwitch(data._id + "", data && data.type || "mobile"); - self.$store.dispatch("countlyCommon/updateActiveApp", data._id + ""); - app.initSidebar(); + if (data && data._id) { + data.locked = false; + countlyGlobal.apps[data._id] = data; + countlyGlobal.admin_apps[data._id] = data; + Backbone.history.appIds.push(data._id + ""); + countlyGlobal.apps[data._id].image = "appimages/" + data._id + ".png?" + Date.now().toString(); + self.appList.push({ + value: data._id + "", + label: data.name + }); + self.$store.dispatch("countlyCommon/addToAllApps", data); + if (self.firstApp) { + countlyCommon.ACTIVE_APP_ID = data._id + ""; + app.onAppManagementSwitch(data._id + "", data && data.type || "mobile"); + self.$store.dispatch("countlyCommon/updateActiveApp", data._id + ""); + app.initSidebar(); + } + self.firstApp = self.checkIfFirst(); + setTimeout(function() { + self.selectedSearchBar = data._id + ""; + }, 1); } - self.firstApp = self.checkIfFirst(); - setTimeout(function() { - self.selectedSearchBar = data._id + ""; - }, 1); }, error: function(xhr, status, error) { CountlyHelpers.notify({ diff --git a/frontend/express/public/core/app-management/templates/app-management.html b/frontend/express/public/core/app-management/templates/app-management.html index 50e04aefc5e..90f82ff8230 100644 --- a/frontend/express/public/core/app-management/templates/app-management.html +++ b/frontend/express/public/core/app-management/templates/app-management.html @@ -202,7 +202,29 @@

{{apps[selectedApp] @discard="discardForm()" @save="save(formScope.editedObject)" :disabled="isSaveDisabled(formScope.editedObject)" + :isModal="true" > + @@ -364,7 +386,29 @@

{{i18n('management-appli - + + + diff --git a/frontend/express/public/core/app-resolution/templates/app-resolution.html b/frontend/express/public/core/app-resolution/templates/app-resolution.html index a7bc646e600..58bda7277a9 100644 --- a/frontend/express/public/core/app-resolution/templates/app-resolution.html +++ b/frontend/express/public/core/app-resolution/templates/app-resolution.html @@ -25,12 +25,36 @@ - + diff --git a/frontend/express/public/core/app-version/templates/app-version.html b/frontend/express/public/core/app-version/templates/app-version.html index 3fadc8f740b..e6b198adb1b 100644 --- a/frontend/express/public/core/app-version/templates/app-version.html +++ b/frontend/express/public/core/app-version/templates/app-version.html @@ -29,15 +29,39 @@

  as

- + - + diff --git a/frontend/express/public/core/carrier/javascripts/countly.models.js b/frontend/express/public/core/carrier/javascripts/countly.models.js index 012ea18a413..13798b4ec6a 100644 --- a/frontend/express/public/core/carrier/javascripts/countly.models.js +++ b/frontend/express/public/core/carrier/javascripts/countly.models.js @@ -55,6 +55,25 @@ ], metric); tableData = tableData.chartData || []; + + var unknownCarriers = ["--", "null", "unknown", ""], + newTableData = [], + unknownOb = {carriers: "Unknown", n: 0, t: 0, u: 0}; + for (let index = 0; index < tableData.length; index++) { + if (unknownCarriers.includes(tableData[index].carriers.trim().toLowerCase())) { + unknownOb.n += tableData[index].n; + unknownOb.t += tableData[index].t; + unknownOb.u += tableData[index].u; + } + else { + newTableData.push(tableData[index]); + } + } + if (unknownOb.n !== 0 || unknownOb.t !== 0 || unknownOb.u !== 0) { + newTableData.push(unknownOb); + } + tableData = newTableData; + var graphs = {"newUsers": [], "totalSessions": []}; var totals = {"totalSessions": 0, "newUsers": 0, "totalUsers": 0}; for (var k = 0; k < tableData.length; k++) { diff --git a/frontend/express/public/core/carrier/templates/carrier.html b/frontend/express/public/core/carrier/templates/carrier.html index 9d925726b34..ce0108ff4ee 100644 --- a/frontend/express/public/core/carrier/templates/carrier.html +++ b/frontend/express/public/core/carrier/templates/carrier.html @@ -26,12 +26,36 @@ - + diff --git a/frontend/express/public/core/date-presets/stylesheets/_main.scss b/frontend/express/public/core/date-presets/stylesheets/_main.scss index a2457032c00..07c90c49a76 100755 --- a/frontend/express/public/core/date-presets/stylesheets/_main.scss +++ b/frontend/express/public/core/date-presets/stylesheets/_main.scss @@ -1,98 +1,3 @@ - -.preset-table { - - .el-table { - background-color: unset; - - &__body { - border-collapse: separate; - border-spacing: 0 8px; - } - - &__row { - cursor: pointer; - - td { - cursor: pointer; - height: 56px; - border-top: 1px solid #ECECEC !important; - border-bottom: 2px solid #ECECEC !important; - background-color: #FFF !important; - padding: 18px 0px; - - &:first-child { - border-left: 1px solid #ECECEC !important; - border-radius: 4px 0 0 4px !important; - } - - &:last-child { - border-right: 1px solid #ECECEC !important; - border-radius: 0 4px 4px 0 !important; - } - - .cell { - line-height: 20px; - } - - &.drag-icon { - .cell { - text-overflow: unset !important; - } - } - } - } - - // tr:hover { - // td { - // border-top: 1px solid #0166D6 !important; - // border-bottom: 2px solid #0166D6 !important; - // background-color: #FFF !important; - - // &:first-child { - // border-left: 1px solid #0166D6 !important; - // } - - // &:last-child { - // border-right: 1px solid #0166D6 !important; - // } - // } - // } - - // .cly-vue-more-options { - // position: absolute; - // top: calc(50% - 16px); - // right: calc(50% - 20px); - - // .el-select-dropdown { - // //display: block !important; - // } - // } - - .sortable-chosen { - .cly-vue-more-options { - display: none !important; - } - } - - thead { - tr { - background-color: unset !important; - } - } - - th { - background-color: unset !important; - border: none !important; - padding: 0 !important; - color: #81868D !important; - } - - &__fixed-right::before { - height: 0 !important; - } - } -} - .preset-list { display: inline-block; diff --git a/frontend/express/public/core/date-presets/templates/preset-management.html b/frontend/express/public/core/date-presets/templates/preset-management.html index 0b867e380ab..eed12a91b2d 100755 --- a/frontend/express/public/core/date-presets/templates/preset-management.html +++ b/frontend/express/public/core/date-presets/templates/preset-management.html @@ -8,7 +8,7 @@ - + diff --git a/frontend/express/public/core/device-and-type/templates/devices-tab.html b/frontend/express/public/core/device-and-type/templates/devices-tab.html index ae61eb98aaa..4469e5b5017 100644 --- a/frontend/express/public/core/device-and-type/templates/devices-tab.html +++ b/frontend/express/public/core/device-and-type/templates/devices-tab.html @@ -14,8 +14,8 @@
- {{item.title}} - + {{item.title}} +
@@ -25,10 +25,10 @@
-
{{item2.name}}
-
{{item2.percent}}%
+
{{item2.name}}
+
{{item2.percent}}%
- +
@@ -37,12 +37,36 @@
- + diff --git a/frontend/express/public/core/device-and-type/templates/types-tab.html b/frontend/express/public/core/device-and-type/templates/types-tab.html index 4bcf45790b2..ab744d952c4 100644 --- a/frontend/express/public/core/device-and-type/templates/types-tab.html +++ b/frontend/express/public/core/device-and-type/templates/types-tab.html @@ -11,13 +11,34 @@
- +