From 82a6525b5519aeca6842f82790d237fe2c6824fe Mon Sep 17 00:00:00 2001 From: ivan deng Date: Fri, 21 Jul 2023 18:56:03 +0800 Subject: [PATCH] update --- app_common/__init__.py | 7 + app_common/__manifest__.py | 89 + app_common/controllers/__init__.py | 3 + app_common/controllers/main.py | 116 + app_common/hooks.py | 32 + app_common/i18n/zh_CN.po | 29 + app_common/lib/ua_parser/__init__.py | 1 + app_common/lib/ua_parser/_regexes.py | 7406 +++++++++++++++++ app_common/lib/ua_parser/user_agent_parser.py | 544 ++ .../lib/ua_parser/user_agent_parser_test.py | 290 + app_common/lib/user_agents/__init__.py | 3 + app_common/lib/user_agents/compat.py | 14 + app_common/lib/user_agents/parsers.py | 268 + app_common/lib/user_agents/tests.py | 268 + app_common/models/__init__.py | 32 + app_common/models/base.py | 110 + app_common/models/fields.py | 49 + app_common/models/ir_cron.py | 15 + app_common/models/ir_ui_view.py | 66 + app_common/models/res_users.py | 10 + app_common/models/view_validation.py | 63 + app_common/report/__init__.py | 2 + app_common/rng/activity_view.rng | 29 + app_common/rng/calendar_view.rng | 48 + app_common/rng/common.rng | 448 + app_common/rng/graph_view.rng | 39 + app_common/rng/pivot_view.rng | 28 + app_common/rng/search_view.rng | 57 + app_common/rng/search_view_new.rng | 54 + app_common/rng/tree_view.rng | 105 + app_common/static/description/banner.png | Bin 0 -> 180099 bytes app_common/static/description/icon.png | Bin 0 -> 71282 bytes app_common/static/description/index.html | 103 + app_common/static/img/icon_sunpop.png | Bin 0 -> 28105 bytes app_common/static/img/logo_sunpop.png | Bin 0 -> 30835 bytes app_common/static/src/css/iconfont.css | 19 + app_common/static/src/css/iconfont.ttf | Bin 0 -> 1808 bytes app_common/static/src/css/iconfont.woff | Bin 0 -> 1160 bytes app_common/static/src/css/iconfont.woff2 | Bin 0 -> 792 bytes app_common/static/src/js/sunpop.cn | 0 app_common/static/src/xml/sunpop.cn | 0 app_common/views/ir_cron_views.xml | 13 + app_common/views/webclient_templates.xml | 8 + app_common/wizard/sunpop.cn | 0 44 files changed, 10368 insertions(+) create mode 100644 app_common/__init__.py create mode 100644 app_common/__manifest__.py create mode 100644 app_common/controllers/__init__.py create mode 100644 app_common/controllers/main.py create mode 100644 app_common/hooks.py create mode 100644 app_common/i18n/zh_CN.po create mode 100644 app_common/lib/ua_parser/__init__.py create mode 100644 app_common/lib/ua_parser/_regexes.py create mode 100644 app_common/lib/ua_parser/user_agent_parser.py create mode 100644 app_common/lib/ua_parser/user_agent_parser_test.py create mode 100644 app_common/lib/user_agents/__init__.py create mode 100644 app_common/lib/user_agents/compat.py create mode 100644 app_common/lib/user_agents/parsers.py create mode 100644 app_common/lib/user_agents/tests.py create mode 100644 app_common/models/__init__.py create mode 100644 app_common/models/base.py create mode 100644 app_common/models/fields.py create mode 100644 app_common/models/ir_cron.py create mode 100644 app_common/models/ir_ui_view.py create mode 100644 app_common/models/res_users.py create mode 100644 app_common/models/view_validation.py create mode 100644 app_common/report/__init__.py create mode 100644 app_common/rng/activity_view.rng create mode 100644 app_common/rng/calendar_view.rng create mode 100644 app_common/rng/common.rng create mode 100644 app_common/rng/graph_view.rng create mode 100644 app_common/rng/pivot_view.rng create mode 100644 app_common/rng/search_view.rng create mode 100644 app_common/rng/search_view_new.rng create mode 100644 app_common/rng/tree_view.rng create mode 100644 app_common/static/description/banner.png create mode 100644 app_common/static/description/icon.png create mode 100644 app_common/static/description/index.html create mode 100644 app_common/static/img/icon_sunpop.png create mode 100644 app_common/static/img/logo_sunpop.png create mode 100644 app_common/static/src/css/iconfont.css create mode 100644 app_common/static/src/css/iconfont.ttf create mode 100644 app_common/static/src/css/iconfont.woff create mode 100644 app_common/static/src/css/iconfont.woff2 create mode 100644 app_common/static/src/js/sunpop.cn create mode 100644 app_common/static/src/xml/sunpop.cn create mode 100644 app_common/views/ir_cron_views.xml create mode 100644 app_common/views/webclient_templates.xml create mode 100644 app_common/wizard/sunpop.cn diff --git a/app_common/__init__.py b/app_common/__init__.py new file mode 100644 index 00000000..7f49029b --- /dev/null +++ b/app_common/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- + +from . import controllers +from . import models +from .hooks import pre_init_hook +from .hooks import post_init_hook +from .hooks import uninstall_hook diff --git a/app_common/__manifest__.py b/app_common/__manifest__.py new file mode 100644 index 00000000..50facc85 --- /dev/null +++ b/app_common/__manifest__.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- + +# Created on 20120-01-05 +# author: 欧度智能,https://www.odooai.cn +# email: 300883@qq.com +# resource of odooai +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +# Odoo12在线用户手册(长期更新) +# https://www.odooai.cn/documentation/user/12.0/zh_CN/index.html + +# Odoo12在线开发者手册(长期更新) +# https://www.odooai.cn/documentation/12.0/index.html + +# Odoo10在线中文用户手册(长期更新) +# https://www.odooai.cn/documentation/user/10.0/zh_CN/index.html + +# Odoo10离线中文用户手册下载 +# https://www.odooai.cn/odoo10_user_manual_document_offline/ +# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) +# https://www.odooai.cn/odoo10_developer_document_offline/ + +############################################################################## +# Copyright (C) 2009-TODAY odooai.cn Ltd. https://www.odooai.cn +# Author: Ivan Deng,300883@qq.com +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# See . +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +############################################################################## + +{ + 'name': "odooai Odooapp Common Func", + 'version': '12.22.08.21', + 'author': 'odooai.cn', + 'category': 'Base', + 'website': 'https://www.odooai.cn', + 'license': 'LGPL-3', + 'sequence': 2, + 'price': 0.00, + 'currency': 'EUR', + 'images': ['static/description/banner.png'], + 'summary': ''' + Core for common use odooai apps. + 基础核心,必须没有要被依赖字段及视图等,实现auto_install + ''', + 'description': ''' + Support Odoo 13,12, Enterprise and Community Edition + 1. Base function add timezone convert + 2. Remove select add warning + 3. Cron add user log + 4. Rng file add extra function + 5. User add index + 6. Add bg-xxx class like bg-danger + 7. Add ali iconfont support, more icon + 11. Multi-language Support. + 12. Multi-Company Support. + 13. Support Odoo 13,12, Enterprise and Community Edition + ========== + 1. + 2. + 3. 多语言支持 + 4. 多公司支持 + 5. Odoo 13, 12, 企业版,社区版,多版本支持 + ''', + 'depends': [ + 'web', + ], + 'data': [ + # 'security/*.xml', + # 'security/ir.model.access.csv', + # 'data/.xml', + 'views/ir_cron_views.xml', + 'views/webclient_templates.xml', + # 'report/.xml', + ], + 'qweb': [ + 'static/src/xml/*.xml', + ], + 'demo': [], + # 'pre_init_hook': 'pre_init_hook', + # 'post_init_hook': 'post_init_hook', + # 'uninstall_hook': 'uninstall_hook', + 'installable': True, + 'application': True, + 'auto_install': True, +} diff --git a/app_common/controllers/__init__.py b/app_common/controllers/__init__.py new file mode 100644 index 00000000..6920e202 --- /dev/null +++ b/app_common/controllers/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import main \ No newline at end of file diff --git a/app_common/controllers/main.py b/app_common/controllers/main.py new file mode 100644 index 00000000..ac0b29cd --- /dev/null +++ b/app_common/controllers/main.py @@ -0,0 +1,116 @@ +# -*- coding: utf-8 -*- + +import base64 +from io import BytesIO +import requests +from math import radians, cos, sin, asin, sqrt + +from ..lib.user_agents import parse + +from odoo import api, http, SUPERUSER_ID, _ +from odoo import http, exceptions +from odoo.http import request + +import logging +_logger = logging.getLogger(__name__) + +class AppController(http.Controller): + + def get_image_from_url(self, url): + if not url: + return None + try: + # 将这个图片保存在内存 + response = requests.get(url) + except Exception as e: + return None + # 返回这个图片的base64编码 + return base64.b64encode(BytesIO(response.content).read()) + + @http.route('/web/ua/show', auth='public', methods=['GET']) + def app_ua_show(self): + # https://github.com/selwin/python-user-agents + ua_string = request.httprequest.headers.get('User-Agent') + user_agent = parse(ua_string) + ua_type = self.get_ua_type() + ustr = "Request UA:
%s
Parse UA:
%s
UA Type:
%s
" % (ua_string, str(user_agent), ua_type) + return request.make_response(ustr, [('Content-Type', 'text/html')]) + + def get_ua_type(self): + ua = request.httprequest.headers.get('User-Agent') + # 临时用 agent 处理,后续要前端中正确处理或者都从后台来 + # 微信浏览器 + # MicroMessenger: Mozilla/5.0 (Linux; Android 10; ELE-AL00 Build/HUAWEIELE-AL00; wv) + # AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 + # MQQBrowser/6.2 TBS/045525 Mobile Safari/537.36 MMWEBID/3135 MicroMessenger/8.0.2.1860(0x2800023B) Process/tools WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 + # 微信浏览器,开发工具,网页 iphone + # ,Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1 + # wechatdevtools/1.03.2011120 MicroMessenger/7.0.4 Language/zh_CN webview/16178807094901773 + # webdebugger port/27772 token/b91f4a234b918f4e2a5d1a835a09c31e + + # 微信小程序 + # MicroMessenger: Mozilla/5.0 (Linux; Android 10; ELE-AL00 Build/HUAWEIELE-AL00; wv) + # AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.62 XWEB/2767 MMWEBSDK/20210302 Mobile Safari/537.36 MMWEBID/6689 MicroMessenger/8.0.2.1860(0x2800023B) Process/appbrand2 WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 + # MiniProgramEnv/android + # 微信浏览器,开发工具,小程序,iphone + # Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1 + # wechatdevtools/1.03.2011120 MicroMessenger/7.0.4 Language/zh_CN webview/ + # 微信内,iphone web + # Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 + # MicroMessenger/8.0.3(0x1800032a) NetType/WIFI Language/zh_CN + # 安卓app,h5 + # ELE-AL00(Android/10) (cn.erpapp.o20sticks.App/13.20.12.09) Weex/0.26.0 1080x2265 + + utype = 'web' + # todo: 引入现成 py lib,处理企业微信 + if 'MicroMessenger' in ua and 'webdebugger' not in ua and ('MiniProgramEnv' in ua or 'wechatdevtools' in ua): + # 微信小程序及开发者工具 + utype = 'wxapp' + elif 'MicroMessenger' in ua: + # 微信浏览器 + utype = 'wxweb' + elif 'cn.erpapp.o20sticks.App' in ua: + # 安卓app + utype = 'native_android' + # _logger.warning('=========get ua %s,%s' % (utype, ua)) + return utype + + def app_get_client_ip(request): + """ + 获取请求IP + """ + ip = '' + try: + # HTTP_X_FORWARDED_FOR: 浏览当前页面的用户计算机的网关. + x_forwarded_for = request.META.get('X-Forwarded-For') + x_real_ip = request.META.get('X-Real-IP') + if x_forwarded_for: + ip = x_forwarded_for.split(',')[0] + elif x_real_ip: + # REMOTE_ADDR: 浏览当前页面的用户计算机的ip地址 + ip = x_real_ip + else: + ip = request.META.get('REMOTE_ADDR') + except Exception as e: + logging.info(_("Request user IP address failed. error msg:{}").format(e)) + return ip + +def haversine(lon1, lat1, lon2, lat2): + # 计算地图上两点的距离 + # in:经度1,纬度1,经度2,纬度2 (十进制度数) + # out: 距离(米) + """ + Calculate the great circle distance between two points + on the earth (specified in decimal degrees) + """ + # 将十进制度数转化为弧度 + lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) + + # haversine公式 + dlon = lon2 - lon1 + dlat = lat2 - lat1 + a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2 + c = 2 * asin(sqrt(a)) + # 地球平均半径,单位为公里 + r = 6371 + return c * r * 1000 diff --git a/app_common/hooks.py b/app_common/hooks.py new file mode 100644 index 00000000..40a5ccf5 --- /dev/null +++ b/app_common/hooks.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- + +# Created on 2018-10-12 +# author: 欧度智能,https://www.odooai.cn +# email: 300883@qq.com +# resource of odooai +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +# Odoo在线中文用户手册(长期更新) +# https://www.odooai.cn/documentation/user/10.0/zh_CN/index.html + +# Odoo10离线中文用户手册下载 +# https://www.odooai.cn/odoo10_user_manual_document_offline/ +# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) +# https://www.odooai.cn/odoo10_developer_document_offline/ +# description: + +from odoo import api, SUPERUSER_ID, _ + + +def pre_init_hook(cr): + pass + # cr.execute("") + +def post_init_hook(cr, registry): + pass + # cr.execute("") + +def uninstall_hook(cr, registry): + pass + # cr.execute("") + diff --git a/app_common/i18n/zh_CN.po b/app_common/i18n/zh_CN.po new file mode 100644 index 00000000..9552e39e --- /dev/null +++ b/app_common/i18n/zh_CN.po @@ -0,0 +1,29 @@ +# Translation of Odoo Server. +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-01-08 14:28+0000\n" +"PO-Revision-Date: 2018-01-08 14:28+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: app_common +#: model:ir.model.fields,field_description:app_common.field_ir_cron__trigger_user_id +msgid "Last Trigger User" +msgstr "手动运行用户" + +#. module: app_common +#: model:ir.model,name:app_common.model_ir_cron +msgid "Scheduled Actions" +msgstr "安排的动作" + +#. module: app_common +#: model:ir.model,name:app_common.model_ir_ui_view +msgid "View" +msgstr "查看" diff --git a/app_common/lib/ua_parser/__init__.py b/app_common/lib/ua_parser/__init__.py new file mode 100644 index 00000000..ca04bbe6 --- /dev/null +++ b/app_common/lib/ua_parser/__init__.py @@ -0,0 +1 @@ +VERSION = (0, 10, 0) diff --git a/app_common/lib/ua_parser/_regexes.py b/app_common/lib/ua_parser/_regexes.py new file mode 100644 index 00000000..2e626e16 --- /dev/null +++ b/app_common/lib/ua_parser/_regexes.py @@ -0,0 +1,7406 @@ +# -*- coding: utf-8 -*- +############################################ +# NOTICE: This file is autogenerated from # +# regexes.yaml. Do not edit by hand, # +# instead, re-run `setup.py build_regexes` # +############################################ + +from __future__ import absolute_import, unicode_literals +from .user_agent_parser import ( + UserAgentParser, DeviceParser, OSParser, +) + +__all__ = ( + 'USER_AGENT_PARSERS', 'DEVICE_PARSERS', 'OS_PARSERS', +) + +USER_AGENT_PARSERS = [ + UserAgentParser( + '^(Luminary)[Stage]+/(\\d+) CFNetwork', + None, + None, + None, + ), + UserAgentParser( + '(ESPN)[%20| ]+Radio/(\\d+)\\.(\\d+)\\.(\\d+) CFNetwork', + None, + None, + None, + ), + UserAgentParser( + '(Antenna)/(\\d+) CFNetwork', + 'AntennaPod', + None, + None, + ), + UserAgentParser( + '(TopPodcasts)Pro/(\\d+) CFNetwork', + None, + None, + None, + ), + UserAgentParser( + '(MusicDownloader)Lite/(\\d+)\\.(\\d+)\\.(\\d+) CFNetwork', + None, + None, + None, + ), + UserAgentParser( + '^(.*)-iPad\\/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|) CFNetwork', + None, + None, + None, + ), + UserAgentParser( + '^(.*)-iPhone/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|) CFNetwork', + None, + None, + None, + ), + UserAgentParser( + '^(.*)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|) CFNetwork', + None, + None, + None, + ), + UserAgentParser( + '^(Luminary)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(espn\\.go)', + 'ESPN', + None, + None, + ), + UserAgentParser( + '(espnradio\\.com)', + 'ESPN', + None, + None, + ), + UserAgentParser( + 'ESPN APP$', + 'ESPN', + None, + None, + ), + UserAgentParser( + '(audioboom\\.com)', + 'AudioBoom', + None, + None, + ), + UserAgentParser( + ' (Rivo) RHYTHM', + None, + None, + None, + ), + UserAgentParser( + '(CFNetwork)(?:/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)', + 'CFNetwork', + None, + None, + ), + UserAgentParser( + '(Pingdom\\.com_bot_version_)(\\d+)\\.(\\d+)', + 'PingdomBot', + None, + None, + ), + UserAgentParser( + '(PingdomTMS)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'PingdomBot', + None, + None, + ), + UserAgentParser( + ' (PTST)/(\\d+)(?:\\.(\\d+)|)$', + 'WebPageTest.org bot', + None, + None, + ), + UserAgentParser( + 'X11; (Datanyze); Linux', + None, + None, + None, + ), + UserAgentParser( + '(NewRelicPinger)/(\\d+)\\.(\\d+)', + 'NewRelicPingerBot', + None, + None, + ), + UserAgentParser( + '(Tableau)/(\\d+)\\.(\\d+)', + 'Tableau', + None, + None, + ), + UserAgentParser( + 'AppleWebKit/\\d+\\.\\d+.* Safari.* (CreativeCloud)/(\\d+)\\.(\\d+).(\\d+)', + 'Adobe CreativeCloud', + None, + None, + ), + UserAgentParser( + '(Salesforce)(?:.)\\/(\\d+)\\.(\\d?)', + None, + None, + None, + ), + UserAgentParser( + '(\\(StatusCake\\))', + 'StatusCakeBot', + None, + None, + ), + UserAgentParser( + '(facebookexternalhit)/(\\d+)\\.(\\d+)', + 'FacebookBot', + None, + None, + ), + UserAgentParser( + 'Google.*/\\+/web/snippet', + 'GooglePlusBot', + None, + None, + ), + UserAgentParser( + 'via ggpht\\.com GoogleImageProxy', + 'GmailImageProxy', + None, + None, + ), + UserAgentParser( + 'YahooMailProxy; https://help\\.yahoo\\.com/kb/yahoo-mail-proxy-SLN28749\\.html', + 'YahooMailProxy', + None, + None, + ), + UserAgentParser( + '(Twitterbot)/(\\d+)\\.(\\d+)', + 'Twitterbot', + None, + None, + ), + UserAgentParser( + '/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \\-](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '\\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|OgScrper|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(MSIE) (\\d+)\\.(\\d+)([a-z]\\d|[a-z]|);.* MSIECrawler', + 'MSIECrawler', + None, + None, + ), + UserAgentParser( + '(DAVdroid)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest|axios|unirest-(?:java|python|ruby|nodejs|php|net))(?:[ /](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)', + None, + None, + None, + ), + UserAgentParser( + '(Pinterest(?:bot|))/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)[;\\s(]+\\+https://www.pinterest.com/bot.html', + 'Pinterestbot', + None, + None, + ), + UserAgentParser( + '(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\\/\\$BotVersion|123metaspider-Bot|1470\\.net crawler|50\\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\\b\\w{0,30}favicon\\w{0,30}\\b|\\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\\(S\\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|OgScrper|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\\.ru|Tiny Tiny RSS|Twitterbot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\\.almaden\\.ibm\\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\\.ze\\.bz|ZooShot|ZyBorg)(?:[ /]v?(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)|)', + None, + None, + None, + ), + UserAgentParser( + '\\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?|dotnet-(?:\\d{1,2}|core)))|s3fs)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '\\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)', + 'Facebook Messenger', + None, + None, + ), + UserAgentParser( + '\\[FB.*;(FBAV)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + 'Facebook', + None, + None, + ), + UserAgentParser( + '\\[FB.*;', + 'Facebook', + None, + None, + ), + UserAgentParser( + '(?:\\/[A-Za-z0-9\\.]+|) {0,5}([A-Za-z0-9 \\-_\\!\\[\\]:]{0,50}(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]{0,50}))[/ ](\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)', + None, + None, + None, + ), + UserAgentParser( + '((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\\b(?:(?:[ /]| v)(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)', + None, + None, + None, + ), + UserAgentParser( + '((?:[A-z0-9]{1,50}|[A-z\\-]{1,50} ?|)(?: the |)(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]{0,50})(?:(?:[ /]| v)(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)', + None, + None, + None, + ), + UserAgentParser( + '(HbbTV)/(\\d+)\\.(\\d+)\\.(\\d+) \\(', + None, + None, + None, + ), + UserAgentParser( + '(Chimera|SeaMonkey|Camino|Waterfox)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*|)', + None, + None, + None, + ), + UserAgentParser( + '(SailfishBrowser)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'Sailfish Browser', + None, + None, + ), + UserAgentParser( + '\\[(Pinterest)/[^\\]]+\\]', + None, + None, + None, + ), + UserAgentParser( + '(Pinterest)(?: for Android(?: Tablet|)|)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + 'Mozilla.*Mobile.*(Instagram).(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + 'Mozilla.*Mobile.*(Flipboard).(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + 'Mozilla.*Mobile.*(Flipboard-Briefing).(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + 'Mozilla.*Mobile.*(Onefootball)\\/Android.(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Snapchat)\\/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Twitter for (?:iPhone|iPad)|TwitterAndroid)(?:\\/(\\d+)\\.(\\d+)|)', + 'Twitter', + None, + None, + ), + UserAgentParser( + '(Firefox)/(\\d+)\\.(\\d+) Basilisk/(\\d+)', + 'Basilisk', + None, + None, + ), + UserAgentParser( + '(PaleMoon)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'Pale Moon', + None, + None, + ), + UserAgentParser( + '(Fennec)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*)', + 'Firefox Mobile', + None, + None, + ), + UserAgentParser( + '(Fennec)/(\\d+)\\.(\\d+)(pre)', + 'Firefox Mobile', + None, + None, + ), + UserAgentParser( + '(Fennec)/(\\d+)\\.(\\d+)', + 'Firefox Mobile', + None, + None, + ), + UserAgentParser( + '(?:Mobile|Tablet);.*(Firefox)/(\\d+)\\.(\\d+)', + 'Firefox Mobile', + None, + None, + ), + UserAgentParser( + '(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre|))', + 'Firefox ($1)', + None, + None, + ), + UserAgentParser( + '(Firefox)/(\\d+)\\.(\\d+)(a\\d+[a-z]*)', + 'Firefox Alpha', + None, + None, + ), + UserAgentParser( + '(Firefox)/(\\d+)\\.(\\d+)(b\\d+[a-z]*)', + 'Firefox Beta', + None, + None, + ), + UserAgentParser( + '(Firefox)-(?:\\d+\\.\\d+|)/(\\d+)\\.(\\d+)(a\\d+[a-z]*)', + 'Firefox Alpha', + None, + None, + ), + UserAgentParser( + '(Firefox)-(?:\\d+\\.\\d+|)/(\\d+)\\.(\\d+)(b\\d+[a-z]*)', + 'Firefox Beta', + None, + None, + ), + UserAgentParser( + '(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*|)', + 'Firefox ($1)', + None, + None, + ), + UserAgentParser( + '(Firefox).*Tablet browser (\\d+)\\.(\\d+)\\.(\\d+)', + 'MicroB', + None, + None, + ), + UserAgentParser( + '(MozillaDeveloperPreview)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*|)', + None, + None, + None, + ), + UserAgentParser( + '(FxiOS)/(\\d+)\\.(\\d+)(\\.(\\d+)|)(\\.(\\d+)|)', + 'Firefox iOS', + None, + None, + ), + UserAgentParser( + '(Flock)/(\\d+)\\.(\\d+)(b\\d+?)', + None, + None, + None, + ), + UserAgentParser( + '(RockMelt)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Navigator)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Netscape', + None, + None, + ), + UserAgentParser( + '(Navigator)/(\\d+)\\.(\\d+)([ab]\\d+)', + 'Netscape', + None, + None, + ), + UserAgentParser( + '(Netscape6)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+|)', + 'Netscape', + None, + None, + ), + UserAgentParser( + '(MyIBrow)/(\\d+)\\.(\\d+)', + 'My Internet Browser', + None, + None, + ), + UserAgentParser( + '(UC? ?Browser|UCWEB|U3)[ /]?(\\d+)\\.(\\d+)\\.(\\d+)', + 'UC Browser', + None, + None, + ), + UserAgentParser( + '(Opera Tablet).*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(Opera Mini)(?:/att|)/?(\\d+|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(Opera)/.+Opera Mobi.+Version/(\\d+)\\.(\\d+)', + 'Opera Mobile', + None, + None, + ), + UserAgentParser( + '(Opera)/(\\d+)\\.(\\d+).+Opera Mobi', + 'Opera Mobile', + None, + None, + ), + UserAgentParser( + 'Opera Mobi.+(Opera)(?:/|\\s+)(\\d+)\\.(\\d+)', + 'Opera Mobile', + None, + None, + ), + UserAgentParser( + 'Opera Mobi', + 'Opera Mobile', + None, + None, + ), + UserAgentParser( + '(Opera)/9.80.*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(?:Mobile Safari).*(OPR)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Opera Mobile', + None, + None, + ), + UserAgentParser( + '(?:Chrome).*(OPR)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Opera', + None, + None, + ), + UserAgentParser( + '(Coast)/(\\d+).(\\d+).(\\d+)', + 'Opera Coast', + None, + None, + ), + UserAgentParser( + '(OPiOS)/(\\d+).(\\d+).(\\d+)', + 'Opera Mini', + None, + None, + ), + UserAgentParser( + 'Chrome/.+( MMS)/(\\d+).(\\d+).(\\d+)', + 'Opera Neon', + None, + None, + ), + UserAgentParser( + '(hpw|web)OS/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'webOS Browser', + None, + None, + ), + UserAgentParser( + '(luakit)', + 'LuaKit', + None, + None, + ), + UserAgentParser( + '(Snowshoe)/(\\d+)\\.(\\d+).(\\d+)', + None, + None, + None, + ), + UserAgentParser( + 'Gecko/\\d+ (Lightning)/(\\d+)\\.(\\d+)\\.?((?:[ab]?\\d+[a-z]*)|(?:\\d*))', + None, + None, + None, + ), + UserAgentParser( + '(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre|)) \\(Swiftfox\\)', + 'Swiftfox', + None, + None, + ), + UserAgentParser( + '(Firefox)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*|) \\(Swiftfox\\)', + 'Swiftfox', + None, + None, + ), + UserAgentParser( + '(rekonq)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|) Safari', + 'Rekonq', + None, + None, + ), + UserAgentParser( + 'rekonq', + 'Rekonq', + None, + None, + ), + UserAgentParser( + '(conkeror|Conkeror)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'Conkeror', + None, + None, + ), + UserAgentParser( + '(konqueror)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Konqueror', + None, + None, + ), + UserAgentParser( + '(WeTab)-Browser', + None, + None, + None, + ), + UserAgentParser( + '(Comodo_Dragon)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Comodo Dragon', + None, + None, + ), + UserAgentParser( + '(Symphony) (\\d+).(\\d+)', + None, + None, + None, + ), + UserAgentParser( + 'PLAYSTATION 3.+WebKit', + 'NetFront NX', + None, + None, + ), + UserAgentParser( + 'PLAYSTATION 3', + 'NetFront', + None, + None, + ), + UserAgentParser( + '(PlayStation Portable)', + 'NetFront', + None, + None, + ), + UserAgentParser( + '(PlayStation Vita)', + 'NetFront NX', + None, + None, + ), + UserAgentParser( + 'AppleWebKit.+ (NX)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'NetFront NX', + None, + None, + ), + UserAgentParser( + '(Nintendo 3DS)', + 'NetFront NX', + None, + None, + ), + UserAgentParser( + '(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+)|)', + 'Amazon Silk', + None, + None, + ), + UserAgentParser( + '(Puffin)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + 'Windows Phone .*(Edge)/(\\d+)\\.(\\d+)', + 'Edge Mobile', + None, + None, + ), + UserAgentParser( + '(EdgA)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + 'Edge Mobile', + None, + None, + ), + UserAgentParser( + '(EdgiOS)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + 'Edge Mobile', + None, + None, + ), + UserAgentParser( + '(SamsungBrowser)/(\\d+)\\.(\\d+)', + 'Samsung Internet', + None, + None, + ), + UserAgentParser( + '(SznProhlizec)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'Seznam prohlížeč', + None, + None, + ), + UserAgentParser( + '(coc_coc_browser)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'Coc Coc', + None, + None, + ), + UserAgentParser( + '(baidubrowser)[/\\s](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + 'Baidu Browser', + None, + None, + ), + UserAgentParser( + '(FlyFlow)/(\\d+)\\.(\\d+)', + 'Baidu Explorer', + None, + None, + ), + UserAgentParser( + '(MxBrowser)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'Maxthon', + None, + None, + ), + UserAgentParser( + '(Crosswalk)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Line)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'LINE', + None, + None, + ), + UserAgentParser( + '(MiuiBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'MiuiBrowser', + None, + None, + ), + UserAgentParser( + '(Mint Browser)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Mint Browser', + None, + None, + ), + UserAgentParser( + '(TopBuzz)/(\\d+).(\\d+).(\\d+)', + 'TopBuzz', + None, + None, + ), + UserAgentParser( + 'Mozilla.+Android.+(GSA)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Google', + None, + None, + ), + UserAgentParser( + '(MQQBrowser/Mini)(?:(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)', + 'QQ Browser Mini', + None, + None, + ), + UserAgentParser( + '(MQQBrowser)(?:/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)', + 'QQ Browser Mobile', + None, + None, + ), + UserAgentParser( + '(QQBrowser)(?:/(\\d+)(?:\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)|)', + 'QQ Browser', + None, + None, + ), + UserAgentParser( + 'Version/.+(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + 'Chrome Mobile WebView', + None, + None, + ), + UserAgentParser( + '; wv\\).+(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + 'Chrome Mobile WebView', + None, + None, + ), + UserAgentParser( + '(CrMo)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + 'Chrome Mobile', + None, + None, + ), + UserAgentParser( + '(CriOS)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + 'Chrome Mobile iOS', + None, + None, + ), + UserAgentParser( + '(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) Mobile(?:[ /]|$)', + 'Chrome Mobile', + None, + None, + ), + UserAgentParser( + ' Mobile .*(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + 'Chrome Mobile', + None, + None, + ), + UserAgentParser( + '(chromeframe)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Chrome Frame', + None, + None, + ), + UserAgentParser( + '(SLP Browser)/(\\d+)\\.(\\d+)', + 'Tizen Browser', + None, + None, + ), + UserAgentParser( + '(SE 2\\.X) MetaSr (\\d+)\\.(\\d+)', + 'Sogou Explorer', + None, + None, + ), + UserAgentParser( + '(Rackspace Monitoring)/(\\d+)\\.(\\d+)', + 'RackspaceBot', + None, + None, + ), + UserAgentParser( + '(PyAMF)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(YaBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Yandex Browser', + None, + None, + ), + UserAgentParser( + '(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+).* MRCHROME', + 'Mail.ru Chromium Browser', + None, + None, + ), + UserAgentParser( + '(AOL) (\\d+)\\.(\\d+); AOLBuild (\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(PodCruncher|Downcast)[ /]?(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + ' (BoxNotes)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Whale)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) Mobile(?:[ /]|$)', + 'Whale', + None, + None, + ), + UserAgentParser( + '(Whale)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Whale', + None, + None, + ), + UserAgentParser( + '(1Password)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Ghost)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Slack_SSB)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Slack Desktop Client', + None, + None, + ), + UserAgentParser( + '(HipChat)/?(\\d+|)', + 'HipChat Desktop Client', + None, + None, + ), + UserAgentParser( + '\\b(MobileIron|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Epiphany|Shiira|Sunrise|Spotify|Flock|Netscape|Lunascape|WebPilot|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\\.Browser|Bunjalloo|Google Earth|Raven for Mac|Openwave|MacOutlook|Electron|OktaMobile)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + 'Microsoft Office Outlook 12\\.\\d+\\.\\d+|MSOffice 12', + 'Outlook', + '2007', + None, + ), + UserAgentParser( + 'Microsoft Outlook 14\\.\\d+\\.\\d+|MSOffice 14', + 'Outlook', + '2010', + None, + ), + UserAgentParser( + 'Microsoft Outlook 15\\.\\d+\\.\\d+', + 'Outlook', + '2013', + None, + ), + UserAgentParser( + 'Microsoft Outlook (?:Mail )?16\\.\\d+\\.\\d+|MSOffice 16', + 'Outlook', + '2016', + None, + ), + UserAgentParser( + 'Microsoft Office (Word) 2014', + None, + None, + None, + ), + UserAgentParser( + 'Outlook-Express\\/7\\.0.*', + 'Windows Live Mail', + None, + None, + ), + UserAgentParser( + '(Airmail) (\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(Thunderbird)/(\\d+)\\.(\\d+)(?:\\.(\\d+(?:pre|))|)', + 'Thunderbird', + None, + None, + ), + UserAgentParser( + '(Postbox)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Postbox', + None, + None, + ), + UserAgentParser( + '(Barca(?:Pro)?)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'Barca', + None, + None, + ), + UserAgentParser( + '(Lotus-Notes)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'Lotus Notes', + None, + None, + ), + UserAgentParser( + 'Superhuman', + 'Superhuman', + None, + None, + ), + UserAgentParser( + '(Vivaldi)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Edge?)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + 'Edge', + None, + None, + ), + UserAgentParser( + '(brave)/(\\d+)\\.(\\d+)\\.(\\d+) Chrome', + 'Brave', + None, + None, + ), + UserAgentParser( + '(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)[\\d.]* Iron[^/]', + 'Iron', + None, + None, + ), + UserAgentParser( + '\\b(Dolphin)(?: |HDCN/|/INT\\-)(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(HeadlessChrome)(?:/(\\d+)\\.(\\d+)\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(Evolution)/(\\d+)\\.(\\d+)\\.(\\d+\\.\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(RCM CardDAV plugin)/(\\d+)\\.(\\d+)\\.(\\d+(?:-dev|))', + None, + None, + None, + ), + UserAgentParser( + '(bingbot|Bolt|AdobeAIR|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|iTunes|MacAppStore|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser|mDolphin|qutebrowser|Otter|QupZilla|MailBar|kmail2|YahooMobileMail|ExchangeWebServices|ExchangeServicesClient|Dragon|Outlook-iOS-Android)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(Chromium|Chrome)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(IEMobile)[ /](\\d+)\\.(\\d+)', + 'IE Mobile', + None, + None, + ), + UserAgentParser( + '(BacaBerita App)\\/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '^(bPod|Pocket Casts|Player FM)$', + None, + None, + None, + ), + UserAgentParser( + '^(AlexaMediaPlayer|VLC)/(\\d+)\\.(\\d+)\\.([^.\\s]+)', + None, + None, + None, + ), + UserAgentParser( + '^(AntennaPod|WMPlayer|Zune|Podkicker|Radio|ExoPlayerDemo|Overcast|PocketTunes|NSPlayer|okhttp|DoggCatcher|QuickNews|QuickTime|Peapod|Podcasts|GoldenPod|VLC|Spotify|Miro|MediaGo|Juice|iPodder|gPodder|Banshee)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '^(Peapod|Liferea)/([^.\\s]+)\\.([^.\\s]+|)\\.?([^.\\s]+|)', + None, + None, + None, + ), + UserAgentParser( + '^(bPod|Player FM) BMID/(\\S+)', + None, + None, + None, + ), + UserAgentParser( + '^(Podcast ?Addict)/v(\\d+) ', + None, + None, + None, + ), + UserAgentParser( + '^(Podcast ?Addict) ', + 'PodcastAddict', + None, + None, + ), + UserAgentParser( + '(Replay) AV', + None, + None, + None, + ), + UserAgentParser( + '(VOX) Music Player', + None, + None, + None, + ), + UserAgentParser( + '(CITA) RSS Aggregator/(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Pocket Casts)$', + None, + None, + None, + ), + UserAgentParser( + '(Player FM)$', + None, + None, + None, + ), + UserAgentParser( + '(LG Player|Doppler|FancyMusic|MediaMonkey|Clementine) (\\d+)\\.(\\d+)\\.?([^.\\s]+|)\\.?([^.\\s]+|)', + None, + None, + None, + ), + UserAgentParser( + '(philpodder)/(\\d+)\\.(\\d+)\\.?([^.\\s]+|)\\.?([^.\\s]+|)', + None, + None, + None, + ), + UserAgentParser( + '(Player FM|Pocket Casts|DoggCatcher|Spotify|MediaMonkey|MediaGo|BashPodder)', + None, + None, + None, + ), + UserAgentParser( + '(QuickTime)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Kinoma)(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Fancy) Cloud Music (\\d+)\\.(\\d+)', + 'FancyMusic', + None, + None, + ), + UserAgentParser( + 'EspnDownloadManager', + 'ESPN', + None, + None, + ), + UserAgentParser( + '(ESPN) Radio (\\d+)\\.(\\d+)(?:\\.(\\d+)|) ?(?:rv:(\\d+)|) ', + None, + None, + None, + ), + UserAgentParser( + '(podracer|jPodder) v ?(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(ZDM)/(\\d+)\\.(\\d+)[; ]?', + None, + None, + None, + ), + UserAgentParser( + '(Zune|BeyondPod) (\\d+)(?:\\.(\\d+)|)[\\);]', + None, + None, + None, + ), + UserAgentParser( + '(WMPlayer)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '^(Lavf)', + 'WMPlayer', + None, + None, + ), + UserAgentParser( + '^(RSSRadio)[ /]?(\\d+|)', + None, + None, + None, + ), + UserAgentParser( + '(RSS_Radio) (\\d+)\\.(\\d+)', + 'RSSRadio', + None, + None, + ), + UserAgentParser( + '(Podkicker) \\S+/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Podkicker', + None, + None, + ), + UserAgentParser( + '^(HTC) Streaming Player \\S+ / \\S+ / \\S+ / (\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '^(Stitcher)/iOS', + None, + None, + None, + ), + UserAgentParser( + '^(Stitcher)/Android', + None, + None, + None, + ), + UserAgentParser( + '^(VLC) .*version (\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + ' (VLC) for', + None, + None, + None, + ), + UserAgentParser( + '(vlc)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'VLC', + None, + None, + ), + UserAgentParser( + '^(foobar)\\S+/([^.\\s]+)\\.([^.\\s]+|)\\.?([^.\\s]+|)', + None, + None, + None, + ), + UserAgentParser( + '^(Clementine)\\S+ ([^.\\s]+)\\.([^.\\s]+|)\\.?([^.\\s]+|)', + None, + None, + None, + ), + UserAgentParser( + '(amarok)/([^.\\s]+)\\.([^.\\s]+|)\\.?([^.\\s]+|)', + 'Amarok', + None, + None, + ), + UserAgentParser( + '(Custom)-Feed Reader', + None, + None, + None, + ), + UserAgentParser( + '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(Kindle)/(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Android) Donut', + None, + '1', + '2', + ), + UserAgentParser( + '(Android) Eclair', + None, + '2', + '1', + ), + UserAgentParser( + '(Android) Froyo', + None, + '2', + '2', + ), + UserAgentParser( + '(Android) Gingerbread', + None, + '2', + '3', + ), + UserAgentParser( + '(Android) Honeycomb', + None, + '3', + None, + ), + UserAgentParser( + '(MSIE) (\\d+)\\.(\\d+).*XBLWP7', + 'IE Large Screen', + None, + None, + ), + UserAgentParser( + '(Nextcloud)', + None, + None, + None, + ), + UserAgentParser( + '(mirall)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(ownCloud-android)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Owncloud', + None, + None, + ), + UserAgentParser( + '(OC)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) \\(Skype for Business\\)', + 'Skype', + None, + None, + ), + UserAgentParser( + '(Obigo)InternetBrowser', + None, + None, + None, + ), + UserAgentParser( + '(Obigo)\\-Browser', + None, + None, + None, + ), + UserAgentParser( + '(Obigo|OBIGO)[^\\d]*(\\d+)(?:.(\\d+)|)', + 'Obigo', + None, + None, + ), + UserAgentParser( + '(MAXTHON|Maxthon) (\\d+)\\.(\\d+)', + 'Maxthon', + None, + None, + ), + UserAgentParser( + '(Maxthon|MyIE2|Uzbl|Shiira)', + None, + '0', + None, + ), + UserAgentParser( + '(BrowseX) \\((\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(NCSA_Mosaic)/(\\d+)\\.(\\d+)', + 'NCSA Mosaic', + None, + None, + ), + UserAgentParser( + '(POLARIS)/(\\d+)\\.(\\d+)', + 'Polaris', + None, + None, + ), + UserAgentParser( + '(Embider)/(\\d+)\\.(\\d+)', + 'Polaris', + None, + None, + ), + UserAgentParser( + '(BonEcho)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+|)', + 'Bon Echo', + None, + None, + ), + UserAgentParser( + '(TopBuzz) com.alex.NewsMaster/(\\d+).(\\d+).(\\d+)', + 'TopBuzz', + None, + None, + ), + UserAgentParser( + '(TopBuzz) com.mobilesrepublic.newsrepublic/(\\d+).(\\d+).(\\d+)', + 'TopBuzz', + None, + None, + ), + UserAgentParser( + '(TopBuzz) com.topbuzz.videoen/(\\d+).(\\d+).(\\d+)', + 'TopBuzz', + None, + None, + ), + UserAgentParser( + '(iPod|iPhone|iPad).+GSA/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|) Mobile', + 'Google', + None, + None, + ), + UserAgentParser( + '(iPod|iPhone|iPad).+Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|).*[ +]Safari', + 'Mobile Safari', + None, + None, + ), + UserAgentParser( + '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\\d+)_(\\d+)(?:_(\\d+)|).* AppleNews\\/\\d+\\.\\d+\\.\\d+?', + 'Mobile Safari UI/WKWebView', + None, + None, + ), + UserAgentParser( + '(iPod|iPhone|iPad).+Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'Mobile Safari UI/WKWebView', + None, + None, + ), + UserAgentParser( + '(iPod|iPod touch|iPhone|iPad).* Safari', + 'Mobile Safari', + None, + None, + ), + UserAgentParser( + '(iPod|iPod touch|iPhone|iPad)', + 'Mobile Safari UI/WKWebView', + None, + None, + ), + UserAgentParser( + '(Watch)(\\d+),(\\d+)', + 'Apple $1 App', + None, + None, + ), + UserAgentParser( + '(Outlook-iOS)/\\d+\\.\\d+\\.prod\\.iphone \\((\\d+)\\.(\\d+)\\.(\\d+)\\)', + None, + None, + None, + ), + UserAgentParser( + '(AvantGo) (\\d+).(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(OneBrowser)/(\\d+).(\\d+)', + 'ONE Browser', + None, + None, + ), + UserAgentParser( + '(Avant)', + None, + '1', + None, + ), + UserAgentParser( + '(QtCarBrowser)', + None, + '1', + None, + ), + UserAgentParser( + '^(iBrowser/Mini)(\\d+).(\\d+)', + 'iBrowser Mini', + None, + None, + ), + UserAgentParser( + '^(iBrowser|iRAPP)/(\\d+).(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '^(Nokia)', + 'Nokia Services (WAP) Browser', + None, + None, + ), + UserAgentParser( + '(NokiaBrowser)/(\\d+)\\.(\\d+).(\\d+)\\.(\\d+)', + 'Nokia Browser', + None, + None, + ), + UserAgentParser( + '(NokiaBrowser)/(\\d+)\\.(\\d+).(\\d+)', + 'Nokia Browser', + None, + None, + ), + UserAgentParser( + '(NokiaBrowser)/(\\d+)\\.(\\d+)', + 'Nokia Browser', + None, + None, + ), + UserAgentParser( + '(BrowserNG)/(\\d+)\\.(\\d+).(\\d+)', + 'Nokia Browser', + None, + None, + ), + UserAgentParser( + '(Series60)/5\\.0', + 'Nokia Browser', + '7', + '0', + ), + UserAgentParser( + '(Series60)/(\\d+)\\.(\\d+)', + 'Nokia OSS Browser', + None, + None, + ), + UserAgentParser( + '(S40OviBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + 'Ovi Browser', + None, + None, + ), + UserAgentParser( + '(Nokia)[EN]?(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(PlayBook).+RIM Tablet OS (\\d+)\\.(\\d+)\\.(\\d+)', + 'BlackBerry WebKit', + None, + None, + ), + UserAgentParser( + '(Black[bB]erry|BB10).+Version/(\\d+)\\.(\\d+)\\.(\\d+)', + 'BlackBerry WebKit', + None, + None, + ), + UserAgentParser( + '(Black[bB]erry)\\s?(\\d+)', + 'BlackBerry', + None, + None, + ), + UserAgentParser( + '(OmniWeb)/v(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Blazer)/(\\d+)\\.(\\d+)', + 'Palm Blazer', + None, + None, + ), + UserAgentParser( + '(Pre)/(\\d+)\\.(\\d+)', + 'Palm Pre', + None, + None, + ), + UserAgentParser( + '(ELinks)/(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(ELinks) \\((\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Links) \\((\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(QtWeb) Internet Browser/(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(PhantomJS)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(AppleWebKit)/(\\d+)(?:\\.(\\d+)|)\\+ .* Safari', + 'WebKit Nightly', + None, + None, + ), + UserAgentParser( + '(Version)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|).*Safari/', + 'Safari', + None, + None, + ), + UserAgentParser( + '(Safari)/\\d+', + None, + None, + None, + ), + UserAgentParser( + '(OLPC)/Update(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(OLPC)/Update()\\.(\\d+)', + None, + '0', + None, + ), + UserAgentParser( + '(SEMC\\-Browser)/(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Teleca)', + 'Teleca Browser', + None, + None, + ), + UserAgentParser( + '(Phantom)/V(\\d+)\\.(\\d+)', + 'Phantom Browser', + None, + None, + ), + UserAgentParser( + '(Trident)/(7|8)\\.(0)', + 'IE', + '11', + None, + ), + UserAgentParser( + '(Trident)/(6)\\.(0)', + 'IE', + '10', + None, + ), + UserAgentParser( + '(Trident)/(5)\\.(0)', + 'IE', + '9', + None, + ), + UserAgentParser( + '(Trident)/(4)\\.(0)', + 'IE', + '8', + None, + ), + UserAgentParser( + '(Espial)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(AppleWebKit)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Apple Mail', + None, + None, + ), + UserAgentParser( + '(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Firefox)/(\\d+)\\.(\\d+)(pre|[ab]\\d+[a-z]*|)', + None, + None, + None, + ), + UserAgentParser( + '([MS]?IE) (\\d+)\\.(\\d+)', + 'IE', + None, + None, + ), + UserAgentParser( + '(python-requests)/(\\d+)\\.(\\d+)', + 'Python Requests', + None, + None, + ), + UserAgentParser( + '\\b(Windows-Update-Agent|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia|fetch libfetch|akka-http|got)(?:[ /](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)', + None, + None, + None, + ), + UserAgentParser( + '(Python/3\\.\\d{1,3} aiohttp)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Python/3\\.\\d{1,3} aiohttp)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Java)[/ ]?\\d+\\.(\\d+)\\.(\\d+)[_-]*([a-zA-Z0-9]+|)', + None, + None, + None, + ), + UserAgentParser( + '^(Cyberduck)/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.\\d+|)', + None, + None, + None, + ), + UserAgentParser( + '^(S3 Browser) (\\d+)-(\\d+)-(\\d+)(?:\\s*http://s3browser\\.com|)', + None, + None, + None, + ), + UserAgentParser( + '(S3Gof3r)', + None, + None, + None, + ), + UserAgentParser( + '\\b(ibm-cos-sdk-(?:core|java|js|python))/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '^(rusoto)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '^(rclone)/v(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '^(Roku)/DVP-(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Kurio)\\/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Kurio App', + None, + None, + ), + UserAgentParser( + '^(Box(?: Sync)?)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '^(ViaFree|Viafree)-(?:tvOS-)?[A-Z]{2}/(\\d+)\\.(\\d+)\\.(\\d+)', + 'ViaFree', + None, + None, + ), +] + +DEVICE_PARSERS = [ + DeviceParser( + '(?:(?:iPhone|Windows CE|Windows Phone|Android).*(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\\d|(?:bot|spider)\\.html)|AdsBot-Google-Mobile.*iPhone)', + 'i', + 'Spider', + 'Spider', + 'Smartphone', + ), + DeviceParser( + '(?:DoCoMo|\\bMOT\\b|\\bLG\\b|Nokia|Samsung|SonyEricsson).*(?:(?:Bot|Yeti)-Mobile|bots?/\\d|(?:bot|crawler)\\.html|(?:jump|google|Wukong)bot|ichiro/mobile|/spider|YahooSeeker)', + 'i', + 'Spider', + 'Spider', + 'Feature Phone', + ), + DeviceParser( + ' PTST/\\d+(?:\\.)?\\d+$', + None, + 'Spider', + 'Spider', + None, + ), + DeviceParser( + 'X11; Datanyze; Linux', + None, + 'Spider', + 'Spider', + None, + ), + DeviceParser( + '\\bSmartWatch {0,2}\\( {0,2}([^;]+) {0,2}; {0,2}([^;]+) {0,2};', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + 'Android Application[^\\-]+ - (Sony) ?(Ericsson|) (.+) \\w+ - ', + None, + '$1 $2', + '$1$2', + '$3', + ), + DeviceParser( + 'Android Application[^\\-]+ - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\\-](.+) \\w+ - ', + 'i', + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + 'Android Application[^\\-]+ - ([^ ]+) (.+) \\w+ - ', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *([BLRQ]C\\d{4}[A-Z]+?)(?: Build|\\) AppleWebKit)', + None, + '3Q $1', + '3Q', + '$1', + ), + DeviceParser( + '; *(?:3Q_)([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '3Q $1', + '3Q', + '$1', + ), + DeviceParser( + 'Android [34].*; *(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G|)|A701|B1-A71|A1-\\d{3}|B1-\\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Acer', + '$1', + ), + DeviceParser( + '; *Acer Iconia Tab ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Acer', + '$1', + ), + DeviceParser( + '; *(Z1[1235]0|E320[^/]*|S500|S510|Liquid[^;/]*|Iconia A\\d+)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Acer', + '$1', + ), + DeviceParser( + '; *(Acer |ACER )([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Acer', + '$2', + ), + DeviceParser( + '; *(Advent |)(Vega(?:Bean|Comb|)).*?(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Advent', + '$2', + ), + DeviceParser( + '; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Ainol', + '$2', + ), + DeviceParser( + '; *AIRIS[ _\\-]?([^/;\\)]+) *(?:;|\\)|Build)', + 'i', + '$1', + 'Airis', + '$1', + ), + DeviceParser( + '; *(OnePAD[^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1', + 'Airis', + '$1', + ), + DeviceParser( + '; *Airpad[ \\-]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Airpad $1', + 'Airpad', + '$1', + ), + DeviceParser( + '; *(one ?touch) (EVO7|T10|T20)(?: Build|\\) AppleWebKit)', + None, + 'Alcatel One Touch $2', + 'Alcatel', + 'One Touch $2', + ), + DeviceParser( + '; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \\-])([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + 'Alcatel One Touch $1', + 'Alcatel', + 'One Touch $1', + ), + DeviceParser( + '; *(TCL)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *(Vodafone Smart II|Optimus_Madrid)(?: Build|\\) AppleWebKit)', + None, + 'Alcatel $1', + 'Alcatel', + '$1', + ), + DeviceParser( + '; *BASE_Lutea_3(?: Build|\\) AppleWebKit)', + None, + 'Alcatel One Touch 998', + 'Alcatel', + 'One Touch 998', + ), + DeviceParser( + '; *BASE_Varia(?: Build|\\) AppleWebKit)', + None, + 'Alcatel One Touch 918D', + 'Alcatel', + 'One Touch 918D', + ), + DeviceParser( + '; *((?:FINE|Fine)\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Allfine', + '$1', + ), + DeviceParser( + '; *(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).*?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Allview', + '$2', + ), + DeviceParser( + '; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Allview', + '$2', + ), + DeviceParser( + '; *(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Allview', + '$2', + ), + DeviceParser( + '; *(A13-MID)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Allwinner', + '$1', + ), + DeviceParser( + '; *(Allwinner)[ _\\-]?([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Allwinner', + '$1', + ), + DeviceParser( + '; *(A651|A701B?|A702|A703|A705|A706|A707|A711|A712|A713|A717|A722|A785|A801|A802|A803|A901|A902|A1002|A1003|A1006|A1007|A9701|A9703|Q710|Q80)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Amaway', + '$1', + ), + DeviceParser( + '; *(?:AMOI|Amoi)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Amoi $1', + 'Amoi', + '$1', + ), + DeviceParser( + '^(?:AMOI|Amoi)[ _]([^;/]+?) Linux', + None, + 'Amoi $1', + 'Amoi', + '$1', + ), + DeviceParser( + '; *(MW(?:0[789]|10)[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Aoc', + '$1', + ), + DeviceParser( + '; *(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T|)|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D)(?: Build|\\) AppleWebKit)', + None, + 'Aoson $1', + 'Aoson', + '$1', + ), + DeviceParser( + '; *Aoson ([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + 'Aoson $1', + 'Aoson', + '$1', + ), + DeviceParser( + '; *[Aa]panda[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Apanda $1', + 'Apanda', + '$1', + ), + DeviceParser( + '; *(?:ARCHOS|Archos) ?(GAMEPAD.*?)(?: Build|\\) AppleWebKit)', + None, + 'Archos $1', + 'Archos', + '$1', + ), + DeviceParser( + 'ARCHOS; GOGI; ([^;]+);', + None, + 'Archos $1', + 'Archos', + '$1', + ), + DeviceParser( + '(?:ARCHOS|Archos)[ _]?(.*?)(?: Build|[;/\\(\\)\\-]|$)', + None, + 'Archos $1', + 'Archos', + '$1', + ), + DeviceParser( + '; *(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\\) AppleWebKit)', + None, + 'Archos $1', + 'Archos', + '$1', + ), + DeviceParser( + '; *(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\\) AppleWebKit)', + None, + 'Archos $1', + 'Archos', + '$1', + ), + DeviceParser( + '; *(PAD-FMD[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Arival', + '$1', + ), + DeviceParser( + '; *(BioniQ) ?([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Arival', + '$1 $2', + ), + DeviceParser( + '; *(AN\\d[^;/]+|ARCHM\\d+)(?: Build|\\) AppleWebKit)', + None, + 'Arnova $1', + 'Arnova', + '$1', + ), + DeviceParser( + '; *(?:ARNOVA|Arnova) ?([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Arnova $1', + 'Arnova', + '$1', + ), + DeviceParser( + '; *(?:ASSISTANT |)(AP)-?([1789]\\d{2}[A-Z]{0,2}|80104)(?: Build|\\) AppleWebKit)', + None, + 'Assistant $1-$2', + 'Assistant', + '$1-$2', + ), + DeviceParser( + '; *(ME17\\d[^;/]*|ME3\\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\\d{3}[^;/]*|eeepc)(?: Build|\\) AppleWebKit)', + None, + 'Asus $1', + 'Asus', + '$1', + ), + DeviceParser( + '; *ASUS[ _]*([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Asus $1', + 'Asus', + '$1', + ), + DeviceParser( + '; *Garmin-Asus ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Garmin-Asus $1', + 'Garmin-Asus', + '$1', + ), + DeviceParser( + '; *(Garminfone)(?: Build|\\) AppleWebKit)', + None, + 'Garmin $1', + 'Garmin-Asus', + '$1', + ), + DeviceParser( + '; (@TAB-[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Attab', + '$1', + ), + DeviceParser( + '; *(T-(?:07|[^0]\\d)[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Audiosonic', + '$1', + ), + DeviceParser( + '; *(?:Axioo[ _\\-]([^;/]+?)|(picopad)[ _\\-]([^;/]+?))(?: Build|\\) AppleWebKit)', + 'i', + 'Axioo $1$2 $3', + 'Axioo', + '$1$2 $3', + ), + DeviceParser( + '; *(V(?:100|700|800)[^;/]*)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Azend', + '$1', + ), + DeviceParser( + '; *(IBAK\\-[^;/]*)(?: Build|\\) AppleWebKit)', + 'i', + '$1', + 'Bak', + '$1', + ), + DeviceParser( + '; *(HY5001|HY6501|X12|X21|I5)(?: Build|\\) AppleWebKit)', + None, + 'Bedove $1', + 'Bedove', + '$1', + ), + DeviceParser( + '; *(JC-[^;/]*)(?: Build|\\) AppleWebKit)', + None, + 'Benss $1', + 'Benss', + '$1', + ), + DeviceParser( + '; *(BB) ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Blackberry', + '$2', + ), + DeviceParser( + '; *(BlackBird)[ _](I8.*?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *(BlackBird)[ _](.*?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *([0-9]+BP[EM][^;/]*|Endeavour[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Blaupunkt $1', + 'Blaupunkt', + '$1', + ), + DeviceParser( + '; *((?:BLU|Blu)[ _\\-])([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Blu', + '$2', + ), + DeviceParser( + '; *(?:BMOBILE )?(Blu|BLU|DASH [^;/]+|VIVO 4\\.3|TANK 4\\.5)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Blu', + '$1', + ), + DeviceParser( + '; *(TOUCH\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Blusens', + '$1', + ), + DeviceParser( + '; *(AX5\\d+)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Bmobile', + '$1', + ), + DeviceParser( + '; *([Bb]q) ([^;/]+?);?(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'bq', + '$2', + ), + DeviceParser( + '; *(Maxwell [^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'bq', + '$1', + ), + DeviceParser( + '; *((?:B-Tab|B-TAB) ?\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Braun', + '$1', + ), + DeviceParser( + '; *(Broncho) ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *CAPTIVA ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Captiva $1', + 'Captiva', + '$1', + ), + DeviceParser( + '; *(C771|CAL21|IS11CA)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Casio', + '$1', + ), + DeviceParser( + '; *(?:Cat|CAT) ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Cat $1', + 'Cat', + '$1', + ), + DeviceParser( + '; *(?:Cat)(Nova.*?)(?: Build|\\) AppleWebKit)', + None, + 'Cat $1', + 'Cat', + '$1', + ), + DeviceParser( + '; *(INM8002KP|ADM8000KP_[AB])(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Cat', + 'Tablet PHOENIX 8.1J0', + ), + DeviceParser( + '; *(?:[Cc]elkon[ _\\*]|CELKON[ _\\*])([^;/\\)]+) ?(?:Build|;|\\))', + None, + '$1', + 'Celkon', + '$1', + ), + DeviceParser( + 'Build/(?:[Cc]elkon)+_?([^;/_\\)]+)', + None, + '$1', + 'Celkon', + '$1', + ), + DeviceParser( + '; *(CT)-?(\\d+)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Celkon', + '$1$2', + ), + DeviceParser( + '; *(A19|A19Q|A105|A107[^;/\\)]*) ?(?:Build|;|\\))', + None, + '$1', + 'Celkon', + '$1', + ), + DeviceParser( + '; *(TPC[0-9]{4,5})(?: Build|\\) AppleWebKit)', + None, + '$1', + 'ChangJia', + '$1', + ), + DeviceParser( + '; *(Cloudfone)[ _](Excite)([^ ][^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2 $3', + 'Cloudfone', + '$1 $2 $3', + ), + DeviceParser( + '; *(Excite|ICE)[ _](\\d+[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Cloudfone $1 $2', + 'Cloudfone', + 'Cloudfone $1 $2', + ), + DeviceParser( + '; *(Cloudfone|CloudPad)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Cloudfone', + '$1 $2', + ), + DeviceParser( + '; *((?:Aquila|Clanga|Rapax)[^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1', + 'Cmx', + '$1', + ), + DeviceParser( + '; *(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\\(3G\\)-4G| GB 8K| 3G| 8K| GB)? *(?:Build|[;\\)])', + None, + 'CobyKyros $1$2', + 'CobyKyros', + '$1$2', + ), + DeviceParser( + '; *([^;/]*)Coolpad[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Coolpad', + '$1$2', + ), + DeviceParser( + '; *(CUBE[ _])?([KU][0-9]+ ?GT.*?|A5300)(?: Build|\\) AppleWebKit)', + 'i', + '$1$2', + 'Cube', + '$2', + ), + DeviceParser( + '; *CUBOT ([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1', + 'Cubot', + '$1', + ), + DeviceParser( + '; *(BOBBY)(?: Build|\\) AppleWebKit)', + 'i', + '$1', + 'Cubot', + '$1', + ), + DeviceParser( + '; *(Dslide [^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Danew', + '$1', + ), + DeviceParser( + '; *(XCD)[ _]?(28|35)(?: Build|\\) AppleWebKit)', + None, + 'Dell $1$2', + 'Dell', + '$1$2', + ), + DeviceParser( + '; *(001DL)(?: Build|\\) AppleWebKit)', + None, + 'Dell $1', + 'Dell', + 'Streak', + ), + DeviceParser( + '; *(?:Dell|DELL) (Streak)(?: Build|\\) AppleWebKit)', + None, + 'Dell $1', + 'Dell', + 'Streak', + ), + DeviceParser( + '; *(101DL|GS01|Streak Pro[^;/]*)(?: Build|\\) AppleWebKit)', + None, + 'Dell $1', + 'Dell', + 'Streak Pro', + ), + DeviceParser( + '; *([Ss]treak ?7)(?: Build|\\) AppleWebKit)', + None, + 'Dell $1', + 'Dell', + 'Streak 7', + ), + DeviceParser( + '; *(Mini-3iX)(?: Build|\\) AppleWebKit)', + None, + 'Dell $1', + 'Dell', + '$1', + ), + DeviceParser( + '; *(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.*?|Streak[ _]Pro)(?: Build|\\) AppleWebKit)', + None, + 'Dell $1', + 'Dell', + '$1', + ), + DeviceParser( + '; *Dell[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Dell $1', + 'Dell', + '$1', + ), + DeviceParser( + '; *Dell ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Dell $1', + 'Dell', + '$1', + ), + DeviceParser( + '; *(TA[CD]-\\d+[^;/]*)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Denver', + '$1', + ), + DeviceParser( + '; *(iP[789]\\d{2}(?:-3G)?|IP10\\d{2}(?:-8GB)?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Dex', + '$1', + ), + DeviceParser( + '; *(AirTab)[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'DNS', + '$1 $2', + ), + DeviceParser( + '; *(F\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Fujitsu', + '$1', + ), + DeviceParser( + '; *(HT-03A)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'HTC', + 'Magic', + ), + DeviceParser( + '; *(HT\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'HTC', + '$1', + ), + DeviceParser( + '; *(L\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'LG', + '$1', + ), + DeviceParser( + '; *(N\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Nec', + '$1', + ), + DeviceParser( + '; *(P\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Panasonic', + '$1', + ), + DeviceParser( + '; *(SC\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Samsung', + '$1', + ), + DeviceParser( + '; *(SH\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Sharp', + '$1', + ), + DeviceParser( + '; *(SO\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'SonyEricsson', + '$1', + ), + DeviceParser( + '; *(T\\-0[12][^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Toshiba', + '$1', + ), + DeviceParser( + '; *(DOOV)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'DOOV', + '$2', + ), + DeviceParser( + '; *(Enot|ENOT)[ -]?([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Enot', + '$2', + ), + DeviceParser( + '; *[^;/]+ Build/(?:CROSS|Cross)+[ _\\-]([^\\)]+)', + None, + 'CROSS $1', + 'Evercoss', + 'Cross $1', + ), + DeviceParser( + '; *(CROSS|Cross)[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Evercoss', + 'Cross $2', + ), + DeviceParser( + '; *Explay[_ ](.+?)(?:[\\)]| Build)', + None, + '$1', + 'Explay', + '$1', + ), + DeviceParser( + '; *(IQ.*?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Fly', + '$1', + ), + DeviceParser( + '; *(Fly|FLY)[ _](IQ[^;]+?|F[34]\\d+[^;]*?);?(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Fly', + '$2', + ), + DeviceParser( + '; *(M532|Q572|FJL21)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Fujitsu', + '$1', + ), + DeviceParser( + '; *(G1)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Galapad', + '$1', + ), + DeviceParser( + '; *(Geeksphone) ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *(G[^F]?FIVE) ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Gfive', + '$2', + ), + DeviceParser( + '; *(Gionee)[ _\\-]([^;/]+?)(?:/[^;/]+|)(?: Build|\\) AppleWebKit)', + 'i', + '$1 $2', + 'Gionee', + '$2', + ), + DeviceParser( + '; *(GN\\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\\) AppleWebKit)', + None, + 'Gionee $1', + 'Gionee', + '$1', + ), + DeviceParser( + '; *(E3) Build/JOP40D', + None, + 'Gionee $1', + 'Gionee', + '$1', + ), + DeviceParser( + '\\sGIONEE[-\\s_](\\w*)', + 'i', + 'Gionee $1', + 'Gionee', + '$1', + ), + DeviceParser( + '; *((?:FONE|QUANTUM|INSIGNIA) \\d+[^;/]*|PLAYTAB)(?: Build|\\) AppleWebKit)', + None, + 'GoClever $1', + 'GoClever', + '$1', + ), + DeviceParser( + '; *GOCLEVER ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'GoClever $1', + 'GoClever', + '$1', + ), + DeviceParser( + '; *(Glass \\d+)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Google', + '$1', + ), + DeviceParser( + '; *(Pixel.*?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Google', + '$1', + ), + DeviceParser( + '; *(GSmart)[ -]([^/]+)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Gigabyte', + '$1 $2', + ), + DeviceParser( + '; *(imx5[13]_[^/]+)(?: Build|\\) AppleWebKit)', + None, + 'Freescale $1', + 'Freescale', + '$1', + ), + DeviceParser( + '; *Haier[ _\\-]([^/]+)(?: Build|\\) AppleWebKit)', + None, + 'Haier $1', + 'Haier', + '$1', + ), + DeviceParser( + '; *(PAD1016)(?: Build|\\) AppleWebKit)', + None, + 'Haipad $1', + 'Haipad', + '$1', + ), + DeviceParser( + '; *(M701|M7|M8|M9)(?: Build|\\) AppleWebKit)', + None, + 'Haipad $1', + 'Haipad', + '$1', + ), + DeviceParser( + '; *(SN\\d+T[^;\\)/]*)(?: Build|[;\\)])', + None, + 'Hannspree $1', + 'Hannspree', + '$1', + ), + DeviceParser( + 'Build/HCL ME Tablet ([^;\\)]+)[\\);]', + None, + 'HCLme $1', + 'HCLme', + '$1', + ), + DeviceParser( + '; *([^;\\/]+) Build/HCL', + None, + 'HCLme $1', + 'HCLme', + '$1', + ), + DeviceParser( + '; *(MID-?\\d{4}C[EM])(?: Build|\\) AppleWebKit)', + None, + 'Hena $1', + 'Hena', + '$1', + ), + DeviceParser( + '; *(EG\\d{2,}|HS-[^;/]+|MIRA[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Hisense $1', + 'Hisense', + '$1', + ), + DeviceParser( + '; *(andromax[^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + 'Hisense $1', + 'Hisense', + '$1', + ), + DeviceParser( + '; *(?:AMAZE[ _](S\\d+)|(S\\d+)[ _]AMAZE)(?: Build|\\) AppleWebKit)', + None, + 'AMAZE $1$2', + 'hitech', + 'AMAZE $1$2', + ), + DeviceParser( + '; *(PlayBook)(?: Build|\\) AppleWebKit)', + None, + 'HP $1', + 'HP', + '$1', + ), + DeviceParser( + '; *HP ([^/]+)(?: Build|\\) AppleWebKit)', + None, + 'HP $1', + 'HP', + '$1', + ), + DeviceParser( + '; *([^/]+_tenderloin)(?: Build|\\) AppleWebKit)', + None, + 'HP TouchPad', + 'HP', + 'TouchPad', + ), + DeviceParser( + '; *(HUAWEI |Huawei-|)([UY][^;/]+) Build/(?:Huawei|HUAWEI)([UY][^\\);]+)\\)', + None, + '$1$2', + 'Huawei', + '$2', + ), + DeviceParser( + '; *([^;/]+) Build[/ ]Huawei(MT1-U06|[A-Z]+\\d+[^\\);]+)\\)', + None, + '$1', + 'Huawei', + '$2', + ), + DeviceParser( + '; *(S7|M860) Build', + None, + '$1', + 'Huawei', + '$1', + ), + DeviceParser( + '; *((?:HUAWEI|Huawei)[ \\-]?)(MediaPad) Build', + None, + '$1$2', + 'Huawei', + '$2', + ), + DeviceParser( + '; *((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]+) Build', + None, + '$1$2', + 'Huawei', + '$2', + ), + DeviceParser( + '; *((?:HUAWEI|Huawei)[ _\\-]?)((?:G700-|MT-)[^;/]+) Build', + None, + '$1$2', + 'Huawei', + '$2', + ), + DeviceParser( + '; *((?:HUAWEI|Huawei)[ _\\-]?)([^;/]+) Build', + None, + '$1$2', + 'Huawei', + '$2', + ), + DeviceParser( + '; *(MediaPad[^;]+|SpringBoard) Build/Huawei', + None, + '$1', + 'Huawei', + '$1', + ), + DeviceParser( + '; *([^;]+) Build/(?:Huawei|HUAWEI)', + None, + '$1', + 'Huawei', + '$1', + ), + DeviceParser( + '; *([Uu])([89]\\d{3}) Build', + None, + '$1$2', + 'Huawei', + 'U$2', + ), + DeviceParser( + '; *(?:Ideos |IDEOS )(S7) Build', + None, + 'Huawei Ideos$1', + 'Huawei', + 'Ideos$1', + ), + DeviceParser( + '; *(?:Ideos |IDEOS )([^;/]+\\s*|\\s*)Build', + None, + 'Huawei Ideos$1', + 'Huawei', + 'Ideos$1', + ), + DeviceParser( + '; *(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.+?) Build[/ ]', + None, + 'Huawei $1', + 'Huawei', + '$1', + ), + DeviceParser( + '; *((?:[A-Z]{3})\\-L[A-Za0-9]{2})[\\)]', + None, + 'Huawei $1', + 'Huawei', + '$1', + ), + DeviceParser( + '; *HTC[ _]([^;]+); Windows Phone', + None, + 'HTC $1', + 'HTC', + '$1', + ), + DeviceParser( + '; *(?:HTC[ _/])+([^ _/]+)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: *Build|\\))', + None, + 'HTC $1', + 'HTC', + '$1', + ), + DeviceParser( + '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: *Build|\\))', + None, + 'HTC $1 $2', + 'HTC', + '$1 $2', + ), + DeviceParser( + '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: *Build|\\))', + None, + 'HTC $1 $2 $3', + 'HTC', + '$1 $2 $3', + ), + DeviceParser( + '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: *Build|\\))', + None, + 'HTC $1 $2 $3 $4', + 'HTC', + '$1 $2 $3 $4', + ), + DeviceParser( + '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: *Build|[;\\)]| - )', + None, + 'HTC $1', + 'HTC', + '$1', + ), + DeviceParser( + '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\\)]+)|)(?: *Build|[;\\)]| - )', + None, + 'HTC $1 $2', + 'HTC', + '$1 $2', + ), + DeviceParser( + '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\\)]+)|)|)(?: *Build|[;\\)]| - )', + None, + 'HTC $1 $2 $3', + 'HTC', + '$1 $2 $3', + ), + DeviceParser( + '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: *Build|[;\\)]| - )', + None, + 'HTC $1 $2 $3 $4', + 'HTC', + '$1 $2 $3 $4', + ), + DeviceParser( + 'HTC Streaming Player [^\\/]*/[^\\/]*/ htc_([^/]+) /', + None, + 'HTC $1', + 'HTC', + '$1', + ), + DeviceParser( + '(?:[;,] *|^)(?:htccn_chs-|)HTC[ _-]?([^;]+?)(?: *Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\\(\\)]|$)', + 'i', + 'HTC $1', + 'HTC', + '$1', + ), + DeviceParser( + '; *(A6277|ADR6200|ADR6300|ADR6350|ADR6400[A-Z]*|ADR6425[A-Z]*|APX515CKT|ARIA|Desire[^_ ]*|Dream|EndeavorU|Eris|Evo|Flyer|HD2|Hero|HERO200|Hero CDMA|HTL21|Incredible|Inspire[A-Z0-9]*|Legend|Liberty|Nexus ?(?:One|HD2)|One|One S C2|One[ _]?(?:S|V|X\\+?)\\w*|PC36100|PG06100|PG86100|S31HT|Sensation|Wildfire)(?: Build|[/;\\(\\)])', + 'i', + 'HTC $1', + 'HTC', + '$1', + ), + DeviceParser( + '; *(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.+?)(?:[/;\\)]|Build|MIUI|1\\.0)', + 'i', + 'HTC $1 $2', + 'HTC', + '$1 $2', + ), + DeviceParser( + '; *HYUNDAI (T\\d[^/]*)(?: Build|\\) AppleWebKit)', + None, + 'Hyundai $1', + 'Hyundai', + '$1', + ), + DeviceParser( + '; *HYUNDAI ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Hyundai $1', + 'Hyundai', + '$1', + ), + DeviceParser( + '; *(X700|Hold X|MB-6900)(?: Build|\\) AppleWebKit)', + None, + 'Hyundai $1', + 'Hyundai', + '$1', + ), + DeviceParser( + '; *(?:iBall[ _\\-]|)(Andi)[ _]?(\\d[^;/]*)(?: Build|\\) AppleWebKit)', + 'i', + '$1 $2', + 'iBall', + '$1 $2', + ), + DeviceParser( + '; *(IBall)(?:[ _]([^;/]+?)|)(?: Build|\\) AppleWebKit)', + 'i', + '$1 $2', + 'iBall', + '$2', + ), + DeviceParser( + '; *(NT-\\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+|)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'IconBIT', + '$1', + ), + DeviceParser( + '; *(IMO)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1 $2', + 'IMO', + '$2', + ), + DeviceParser( + '; *i-?mobile[ _]([^/]+)(?: Build|\\) AppleWebKit)', + 'i', + 'i-mobile $1', + 'imobile', + '$1', + ), + DeviceParser( + '; *(i-(?:style|note)[^/]*)(?: Build|\\) AppleWebKit)', + 'i', + 'i-mobile $1', + 'imobile', + '$1', + ), + DeviceParser( + '; *(ImPAD) ?(\\d+(?:.)*?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Impression', + '$1 $2', + ), + DeviceParser( + '; *(Infinix)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Infinix', + '$2', + ), + DeviceParser( + '; *(Informer)[ \\-]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Informer', + '$2', + ), + DeviceParser( + '; *(TAB) ?([78][12]4)(?: Build|\\) AppleWebKit)', + None, + 'Intenso $1', + 'Intenso', + '$1 $2', + ), + DeviceParser( + '; *(?:Intex[ _]|)(AQUA|Aqua)([ _\\.\\-])([^;/]+?) *(?:Build|;)', + None, + '$1$2$3', + 'Intex', + '$1 $3', + ), + DeviceParser( + '; *(?:INTEX|Intex)(?:[_ ]([^\\ _;/]+))(?:[_ ]([^\\ _;/]+)|) *(?:Build|;)', + None, + '$1 $2', + 'Intex', + '$1 $2', + ), + DeviceParser( + '; *([iI]Buddy)[ _]?(Connect)(?:_|\\?_| |)([^;/]*) *(?:Build|;)', + None, + '$1 $2 $3', + 'Intex', + 'iBuddy $2 $3', + ), + DeviceParser( + '; *(I-Buddy)[ _]([^;/]+?) *(?:Build|;)', + None, + '$1 $2', + 'Intex', + 'iBuddy $2', + ), + DeviceParser( + '; *(iOCEAN) ([^/]+)(?: Build|\\) AppleWebKit)', + 'i', + '$1 $2', + 'iOCEAN', + '$2', + ), + DeviceParser( + '; *(TP\\d+(?:\\.\\d+|)\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'ionik $1', + 'ionik', + '$1', + ), + DeviceParser( + '; *(M702pro)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Iru', + '$1', + ), + DeviceParser( + '; *(DE88Plus|MD70)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Ivio', + '$1', + ), + DeviceParser( + '; *IVIO[_\\-]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Ivio', + '$1', + ), + DeviceParser( + '; *(TPC-\\d+|JAY-TECH)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Jaytech', + '$1', + ), + DeviceParser( + '; *(JY-[^;/]+|G[234]S?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Jiayu', + '$1', + ), + DeviceParser( + '; *(JXD)[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'JXD', + '$2', + ), + DeviceParser( + '; *Karbonn[ _]?([^;/]+) *(?:Build|;)', + 'i', + '$1', + 'Karbonn', + '$1', + ), + DeviceParser( + '; *([^;]+) Build/Karbonn', + None, + '$1', + 'Karbonn', + '$1', + ), + DeviceParser( + '; *(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\\d) +Build', + None, + '$1', + 'Karbonn', + '$1', + ), + DeviceParser( + '; *(IS01|IS03|IS05|IS\\d{2}SH)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Sharp', + '$1', + ), + DeviceParser( + '; *(IS04)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Regza', + '$1', + ), + DeviceParser( + '; *(IS06|IS\\d{2}PT)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Pantech', + '$1', + ), + DeviceParser( + '; *(IS11S)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'SonyEricsson', + 'Xperia Acro', + ), + DeviceParser( + '; *(IS11CA)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Casio', + 'GzOne $1', + ), + DeviceParser( + '; *(IS11LG)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'LG', + 'Optimus X', + ), + DeviceParser( + '; *(IS11N)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Medias', + '$1', + ), + DeviceParser( + '; *(IS11PT)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Pantech', + 'MIRACH', + ), + DeviceParser( + '; *(IS12F)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Fujitsu', + 'Arrows ES', + ), + DeviceParser( + '; *(IS12M)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Motorola', + 'XT909', + ), + DeviceParser( + '; *(IS12S)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'SonyEricsson', + 'Xperia Acro HD', + ), + DeviceParser( + '; *(ISW11F)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Fujitsu', + 'Arrowz Z', + ), + DeviceParser( + '; *(ISW11HT)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'HTC', + 'EVO', + ), + DeviceParser( + '; *(ISW11K)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Kyocera', + 'DIGNO', + ), + DeviceParser( + '; *(ISW11M)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Motorola', + 'Photon', + ), + DeviceParser( + '; *(ISW11SC)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Samsung', + 'GALAXY S II WiMAX', + ), + DeviceParser( + '; *(ISW12HT)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'HTC', + 'EVO 3D', + ), + DeviceParser( + '; *(ISW13HT)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'HTC', + 'J', + ), + DeviceParser( + '; *(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\\) AppleWebKit)', + None, + '$1', + 'KDDI', + '$1', + ), + DeviceParser( + '; *(INFOBAR [^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'KDDI', + '$1', + ), + DeviceParser( + '; *(JOYPAD|Joypad)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Kingcom', + '$1 $2', + ), + DeviceParser( + '; *(Vox|VOX|Arc|K080)(?: Build|\\) AppleWebKit)', + 'i', + '$1', + 'Kobo', + '$1', + ), + DeviceParser( + '\\b(Kobo Touch)\\b', + None, + '$1', + 'Kobo', + '$1', + ), + DeviceParser( + '; *(K-Touch)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1 $2', + 'Ktouch', + '$2', + ), + DeviceParser( + '; *((?:EV|KM)-S\\d+[A-Z]?)(?: Build|\\) AppleWebKit)', + 'i', + '$1', + 'KTtech', + '$1', + ), + DeviceParser( + '; *(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\\d{2})(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Kyocera', + '$1', + ), + DeviceParser( + '; *(?:LAVA[ _]|)IRIS[ _\\-]?([^/;\\)]+) *(?:;|\\)|Build)', + 'i', + 'Iris $1', + 'Lava', + 'Iris $1', + ), + DeviceParser( + '; *LAVA[ _]([^;/]+) Build', + None, + '$1', + 'Lava', + '$1', + ), + DeviceParser( + '; *(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]+))_?(?: Build|\\) AppleWebKit)', + None, + 'Lemon $1$2', + 'Lemon', + '$1$2', + ), + DeviceParser( + '; *(TAB-1012)(?: Build|\\) AppleWebKit)', + None, + 'Lenco $1', + 'Lenco', + '$1', + ), + DeviceParser( + '; Lenco ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Lenco $1', + 'Lenco', + '$1', + ), + DeviceParser( + '; *(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build', + None, + '$1', + 'Lenovo', + '$1', + ), + DeviceParser( + '; *(Idea[Tp]ab)[ _]([^;/]+);? Build', + None, + 'Lenovo $1 $2', + 'Lenovo', + '$1 $2', + ), + DeviceParser( + '; *(Idea(?:Tab|pad)) ?([^;/]+) Build', + None, + 'Lenovo $1 $2', + 'Lenovo', + '$1 $2', + ), + DeviceParser( + '; *(ThinkPad) ?(Tablet) Build/', + None, + 'Lenovo $1 $2', + 'Lenovo', + '$1 $2', + ), + DeviceParser( + '; *(?:LNV-|)(?:=?[Ll]enovo[ _\\-]?|LENOVO[ _])(.+?)(?:Build|[;/\\)])', + None, + 'Lenovo $1', + 'Lenovo', + '$1', + ), + DeviceParser( + '[;,] (?:Vodafone |)(SmartTab) ?(II) ?(\\d+) Build/', + None, + 'Lenovo $1 $2 $3', + 'Lenovo', + '$1 $2 $3', + ), + DeviceParser( + '; *(?:Ideapad |)K1 Build/', + None, + 'Lenovo Ideapad K1', + 'Lenovo', + 'Ideapad K1', + ), + DeviceParser( + '; *(3GC101|3GW10[01]|A390) Build/', + None, + '$1', + 'Lenovo', + '$1', + ), + DeviceParser( + '\\b(?:Lenovo|LENOVO)+[ _\\-]?([^,;:/ ]+)', + None, + 'Lenovo $1', + 'Lenovo', + '$1', + ), + DeviceParser( + '; *(MFC\\d+)[A-Z]{2}([^;,/]*),?(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Lexibook', + '$1$2', + ), + DeviceParser( + '; *(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]+|Nexus 4|Nexus 5X?|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) *(?:Build|;)', + None, + '$1', + 'LG', + '$1', + ), + DeviceParser( + '[;:] *(L-\\d+[A-Z]|LGL\\d+[A-Z]?)(?:/V\\d+|) *(?:Build|[;\\)])', + None, + '$1', + 'LG', + '$1', + ), + DeviceParser( + '; *(LG-)([A-Z]{1,2}\\d{2,}[^,;/\\)\\(]*?)(?:Build| V\\d+|[,;/\\)\\(]|$)', + None, + '$1$2', + 'LG', + '$2', + ), + DeviceParser( + '; *(LG[ \\-]|LG)([^;/]+)[;/]? Build', + None, + '$1$2', + 'LG', + '$2', + ), + DeviceParser( + '^(LG)-([^;/]+)/ Mozilla/.*; Android', + None, + '$1 $2', + 'LG', + '$2', + ), + DeviceParser( + '(Web0S); Linux/(SmartTV)', + None, + 'LG $1 $2', + 'LG', + '$1 $2', + ), + DeviceParser( + '; *((?:SMB|smb)[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Malata', + '$1', + ), + DeviceParser( + '; *(?:Malata|MALATA) ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Malata', + '$1', + ), + DeviceParser( + '; *(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9])(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Manta', + '$1', + ), + DeviceParser( + '; *(M1052|M806|M9000|M9100|M9701|MID100|MID120|MID125|MID130|MID135|MID140|MID701|MID710|MID713|MID727|MID728|MID731|MID732|MID733|MID735|MID736|MID737|MID760|MID800|MID810|MID820|MID830|MID833|MID835|MID860|MID900|MID930|MID933|MID960|MID980)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Match', + '$1', + ), + DeviceParser( + '; *(GenxDroid7|MSD7.*?|AX\\d.*?|Tab 701|Tab 722)(?: Build|\\) AppleWebKit)', + None, + 'Maxx $1', + 'Maxx', + '$1', + ), + DeviceParser( + '; *(M-PP[^;/]+|PhonePad ?\\d{2,}[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Mediacom $1', + 'Mediacom', + '$1', + ), + DeviceParser( + '; *(M-MP[^;/]+|SmartPad ?\\d{2,}[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Mediacom $1', + 'Mediacom', + '$1', + ), + DeviceParser( + '; *(?:MD_|)LIFETAB[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + 'Medion Lifetab $1', + 'Medion', + 'Lifetab $1', + ), + DeviceParser( + '; *MEDION ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Medion $1', + 'Medion', + '$1', + ), + DeviceParser( + '; *(M030|M031|M035|M040|M065|m9)(?: Build|\\) AppleWebKit)', + None, + 'Meizu $1', + 'Meizu', + '$1', + ), + DeviceParser( + '; *(?:meizu_|MEIZU )(.+?) *(?:Build|[;\\)])', + None, + 'Meizu $1', + 'Meizu', + '$1', + ), + DeviceParser( + '; *(?:Micromax[ _](A111|A240)|(A111|A240)) Build', + 'i', + 'Micromax $1$2', + 'Micromax', + '$1$2', + ), + DeviceParser( + '; *Micromax[ _](A\\d{2,3}[^;/]*) Build', + 'i', + 'Micromax $1', + 'Micromax', + '$1', + ), + DeviceParser( + '; *(A\\d{2}|A[12]\\d{2}|A90S|A110Q) Build', + 'i', + 'Micromax $1', + 'Micromax', + '$1', + ), + DeviceParser( + '; *Micromax[ _](P\\d{3}[^;/]*) Build', + 'i', + 'Micromax $1', + 'Micromax', + '$1', + ), + DeviceParser( + '; *(P\\d{3}|P\\d{3}\\(Funbook\\)) Build', + 'i', + 'Micromax $1', + 'Micromax', + '$1', + ), + DeviceParser( + '; *(MITO)[ _\\-]?([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1 $2', + 'Mito', + '$2', + ), + DeviceParser( + '; *(Cynus)[ _](F5|T\\d|.+?) *(?:Build|[;/\\)])', + 'i', + '$1 $2', + 'Mobistel', + '$1 $2', + ), + DeviceParser( + '; *(MODECOM |)(FreeTab) ?([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1$2 $3', + 'Modecom', + '$2 $3', + ), + DeviceParser( + '; *(MODECOM )([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1 $2', + 'Modecom', + '$2', + ), + DeviceParser( + '; *(MZ\\d{3}\\+?|MZ\\d{3} 4G|Xoom|XOOM[^;/]*) Build', + None, + 'Motorola $1', + 'Motorola', + '$1', + ), + DeviceParser( + '; *(Milestone )(XT[^;/]*) Build', + None, + 'Motorola $1$2', + 'Motorola', + '$2', + ), + DeviceParser( + '; *(Motoroi ?x|Droid X|DROIDX) Build', + 'i', + 'Motorola $1', + 'Motorola', + 'DROID X', + ), + DeviceParser( + '; *(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build', + None, + 'Motorola $1', + 'Motorola', + '$1', + ), + DeviceParser( + '; *(A555|A85[34][^;/]*|A95[356]|ME[58]\\d{2}\\+?|ME600|ME632|ME722|MB\\d{3}\\+?|MT680|MT710|MT870|MT887|MT917|WX435|WX453|WX44[25]|XT\\d{3,4}[A-Z\\+]*|CL[iI]Q|CL[iI]Q XT) Build', + None, + '$1', + 'Motorola', + '$1', + ), + DeviceParser( + '; *(Motorola MOT-|Motorola[ _\\-]|MOT\\-?)([^;/]+) Build', + None, + '$1$2', + 'Motorola', + '$2', + ), + DeviceParser( + '; *(Moto[_ ]?|MOT\\-)([^;/]+) Build', + None, + '$1$2', + 'Motorola', + '$2', + ), + DeviceParser( + '; *((?:MP[DQ]C|MPG\\d{1,4}|MP\\d{3,4}|MID(?:(?:10[234]|114|43|7[247]|8[24]|7)C|8[01]1))[^;/]*)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Mpman', + '$1', + ), + DeviceParser( + '; *(?:MSI[ _]|)(Primo\\d+|Enjoy[ _\\-][^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1', + 'Msi', + '$1', + ), + DeviceParser( + '; *Multilaser[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Multilaser', + '$1', + ), + DeviceParser( + '; *(My)[_]?(Pad)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2 $3', + 'MyPhone', + '$1$2 $3', + ), + DeviceParser( + '; *(My)\\|?(Phone)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2 $3', + 'MyPhone', + '$3', + ), + DeviceParser( + '; *(A\\d+)[ _](Duo|)(?: Build|\\) AppleWebKit)', + 'i', + '$1 $2', + 'MyPhone', + '$1 $2', + ), + DeviceParser( + '; *(myTab[^;/]*)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Mytab', + '$1', + ), + DeviceParser( + '; *(NABI2?-)([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Nabi', + '$2', + ), + DeviceParser( + '; *(N-\\d+[CDE])(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Nec', + '$1', + ), + DeviceParser( + '; ?(NEC-)(.*?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Nec', + '$2', + ), + DeviceParser( + '; *(LT-NA7)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Nec', + 'Lifetouch Note', + ), + DeviceParser( + '; *(NXM\\d+[A-Za-z0-9_]*|Next\\d[A-Za-z0-9_ \\-]*|NEXT\\d[A-Za-z0-9_ \\-]*|Nextbook [A-Za-z0-9_ ]*|DATAM803HC|M805)(?: Build|[\\);])', + None, + '$1', + 'Nextbook', + '$1', + ), + DeviceParser( + '; *(Nokia)([ _\\-]*)([^;/]*) Build', + 'i', + '$1$2$3', + 'Nokia', + '$3', + ), + DeviceParser( + '; *(Nook ?|Barnes & Noble Nook |BN )([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Nook', + '$2', + ), + DeviceParser( + '; *(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Nook', + '$2', + ), + DeviceParser( + '; Build/(Nook)', + None, + '$1', + 'Nook', + 'Tablet', + ), + DeviceParser( + '; *(OP110|OliPad[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Olivetti $1', + 'Olivetti', + '$1', + ), + DeviceParser( + '; *OMEGA[ _\\-](MID[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Omega $1', + 'Omega', + '$1', + ), + DeviceParser( + '^(MID7500|MID\\d+) Mozilla/5\\.0 \\(iPad;', + None, + 'Omega $1', + 'Omega', + '$1', + ), + DeviceParser( + '; *((?:CIUS|cius)[^;/]*)(?: Build|\\) AppleWebKit)', + None, + 'Openpeak $1', + 'Openpeak', + '$1', + ), + DeviceParser( + '; *(Find ?(?:5|7a)|R8[012]\\d{1,2}|T703\\d?|U70\\d{1,2}T?|X90\\d{1,2})(?: Build|\\) AppleWebKit)', + None, + 'Oppo $1', + 'Oppo', + '$1', + ), + DeviceParser( + '; *OPPO ?([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Oppo $1', + 'Oppo', + '$1', + ), + DeviceParser( + '; *(?:Odys\\-|ODYS\\-|ODYS )([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Odys $1', + 'Odys', + '$1', + ), + DeviceParser( + '; *(SELECT) ?(7)(?: Build|\\) AppleWebKit)', + None, + 'Odys $1 $2', + 'Odys', + '$1 $2', + ), + DeviceParser( + '; *(PEDI)_(PLUS)_(W)(?: Build|\\) AppleWebKit)', + None, + 'Odys $1 $2 $3', + 'Odys', + '$1 $2 $3', + ), + DeviceParser( + '; *(AEON|BRAVIO|FUSION|FUSION2IN1|Genio|EOS10|IEOS[^;/]*|IRON|Loox|LOOX|LOOX Plus|Motion|NOON|NOON_PRO|NEXT|OPOS|PEDI[^;/]*|PRIME[^;/]*|STUDYTAB|TABLO|Tablet-PC-4|UNO_X8|XELIO[^;/]*|Xelio ?\\d+ ?[Pp]ro|XENO10|XPRESS PRO)(?: Build|\\) AppleWebKit)', + None, + 'Odys $1', + 'Odys', + '$1', + ), + DeviceParser( + '; (ONE [a-zA-Z]\\d+)(?: Build|\\) AppleWebKit)', + None, + 'OnePlus $1', + 'OnePlus', + '$1', + ), + DeviceParser( + '; (ONEPLUS [a-zA-Z]\\d+)(?: Build|\\) AppleWebKit)', + None, + 'OnePlus $1', + 'OnePlus', + '$1', + ), + DeviceParser( + '; *(TP-\\d+)(?: Build|\\) AppleWebKit)', + None, + 'Orion $1', + 'Orion', + '$1', + ), + DeviceParser( + '; *(G100W?)(?: Build|\\) AppleWebKit)', + None, + 'PackardBell $1', + 'PackardBell', + '$1', + ), + DeviceParser( + '; *(Panasonic)[_ ]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *(FZ-A1B|JT-B1)(?: Build|\\) AppleWebKit)', + None, + 'Panasonic $1', + 'Panasonic', + '$1', + ), + DeviceParser( + '; *(dL1|DL1)(?: Build|\\) AppleWebKit)', + None, + 'Panasonic $1', + 'Panasonic', + '$1', + ), + DeviceParser( + '; *(SKY[ _]|)(IM\\-[AT]\\d{3}[^;/]+).* Build/', + None, + 'Pantech $1$2', + 'Pantech', + '$1$2', + ), + DeviceParser( + '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/', + None, + '$1', + 'Pantech', + '$1', + ), + DeviceParser( + '; *Pantech([^;/]+).* Build/', + None, + 'Pantech $1', + 'Pantech', + '$1', + ), + DeviceParser( + '; *(papyre)[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1 $2', + 'Papyre', + '$2', + ), + DeviceParser( + '; *(?:Touchlet )?(X10\\.[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Pearl $1', + 'Pearl', + '$1', + ), + DeviceParser( + '; PHICOMM (i800)(?: Build|\\) AppleWebKit)', + None, + 'Phicomm $1', + 'Phicomm', + '$1', + ), + DeviceParser( + '; PHICOMM ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Phicomm $1', + 'Phicomm', + '$1', + ), + DeviceParser( + '; *(FWS\\d{3}[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Phicomm $1', + 'Phicomm', + '$1', + ), + DeviceParser( + '; *(D633|D822|D833|T539|T939|V726|W335|W336|W337|W3568|W536|W5510|W626|W632|W6350|W6360|W6500|W732|W736|W737|W7376|W820|W832|W8355|W8500|W8510|W930)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Philips', + '$1', + ), + DeviceParser( + '; *(?:Philips|PHILIPS)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Philips $1', + 'Philips', + '$1', + ), + DeviceParser( + 'Android 4\\..*; *(M[12356789]|U[12368]|S[123])\\ ?(pro)?(?: Build|\\) AppleWebKit)', + None, + 'Pipo $1$2', + 'Pipo', + '$1$2', + ), + DeviceParser( + '; *(MOMO[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Ployer', + '$1', + ), + DeviceParser( + '; *(?:Polaroid[ _]|)((?:MIDC\\d{3,}|PMID\\d{2,}|PTAB\\d{3,})[^;/]*?)(\\/[^;/]*|)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Polaroid', + '$1', + ), + DeviceParser( + '; *(?:Polaroid )(Tablet)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Polaroid', + '$1', + ), + DeviceParser( + '; *(POMP)[ _\\-](.+?) *(?:Build|[;/\\)])', + None, + '$1 $2', + 'Pomp', + '$2', + ), + DeviceParser( + '; *(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Positivo', + '$1', + ), + DeviceParser( + '; *(?:Positivo |)((?:YPY|Ypy)[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Positivo', + '$1', + ), + DeviceParser( + '; *(MOB-[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'POV', + '$1', + ), + DeviceParser( + '; *POV[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'POV $1', + 'POV', + '$1', + ), + DeviceParser( + '; *((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\\-]|TAB-P)[^;/]*)(?: Build|\\) AppleWebKit)', + None, + 'POV $1', + 'POV', + '$1', + ), + DeviceParser( + '; *(?:Prestigio |)((?:PAP|PMP)\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Prestigio $1', + 'Prestigio', + '$1', + ), + DeviceParser( + '; *(PLT[0-9]{4}.*?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Proscan', + '$1', + ), + DeviceParser( + '; *(A2|A5|A8|A900)_?(Classic|)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Qmobile', + '$1 $2', + ), + DeviceParser( + '; *(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\\) AppleWebKit)', + None, + 'Qmobile $2 $3', + 'Qmobile', + '$2 $3', + ), + DeviceParser( + '; *(Q\\-?[Mm]obile)[_ ](A[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Qmobile $2', + 'Qmobile', + '$2', + ), + DeviceParser( + '; *(Q\\-Smart)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Qmobilevn', + '$2', + ), + DeviceParser( + '; *(Q\\-?[Mm]obile)[ _\\-](S[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Qmobilevn', + '$2', + ), + DeviceParser( + '; *(TA1013)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Quanta', + '$1', + ), + DeviceParser( + '; (RCT\\w+)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'RCA', + '$1', + ), + DeviceParser( + '; RCA (\\w+)(?: Build|\\) AppleWebKit)', + None, + 'RCA $1', + 'RCA', + '$1', + ), + DeviceParser( + '; *(RK\\d+),?(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Rockchip', + '$1', + ), + DeviceParser( + ' Build/(RK\\d+)', + None, + '$1', + 'Rockchip', + '$1', + ), + DeviceParser( + '; *(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\\d)|GT-I9082|GT-I9205|GT-N7\\d{3}|SM-N9005)[^;/]*)\\/?[^;/]* Build/', + None, + 'Samsung $1$2', + 'Samsung', + '$2', + ), + DeviceParser( + '; *(Google |)(Nexus [Ss](?: 4G|)) Build/', + None, + 'Samsung $1$2', + 'Samsung', + '$2', + ), + DeviceParser( + '; *(SAMSUNG |Samsung )([^\\/]*)\\/[^ ]* Build/', + None, + 'Samsung $2', + 'Samsung', + '$2', + ), + DeviceParser( + '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + '; *(SAMSUNG[ _\\-]|)(?:SAMSUNG[ _\\-])([^;/]+) Build', + None, + 'Samsung $2', + 'Samsung', + '$2', + ), + DeviceParser( + '; *(SAMSUNG-|)(GT\\-[BINPS]\\d{4}[^\\/]*)(\\/[^ ]*) Build', + None, + 'Samsung $1$2$3', + 'Samsung', + '$2', + ), + DeviceParser( + '(?:; *|^)((?:GT\\-[BIiNPS]\\d{4}|I9\\d{2}0[A-Za-z\\+]?\\b)[^;/\\)]*?)(?:Build|Linux|MIUI|[;/\\)])', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + '; (SAMSUNG-)([A-Za-z0-9\\-]+).* Build/', + None, + 'Samsung $1$2', + 'Samsung', + '$2', + ), + DeviceParser( + '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + '; *((?:SC)\\-[A-Za-z0-9 ]+)(/?[^ ]*|)\\)', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + ' ((?:SCH)\\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + '; *(Behold ?(?:2|II)|YP\\-G[^;/]+|EK-GC100|SCL21|I9300) Build', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\\-[A-Za-z0-9]{5,6})[\\)]', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + '; *(SH\\-?\\d\\d[^;/]+|SBM\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Sharp', + '$1', + ), + DeviceParser( + '; *(SHARP[ -])([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Sharp', + '$2', + ), + DeviceParser( + '; *(SPX[_\\-]\\d[^;/]*)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Simvalley', + '$1', + ), + DeviceParser( + '; *(SX7\\-PEARL\\.GmbH)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Simvalley', + '$1', + ), + DeviceParser( + '; *(SP[T]?\\-\\d{2}[^;/]*)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Simvalley', + '$1', + ), + DeviceParser( + '; *(SK\\-.*?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'SKtelesys', + '$1', + ), + DeviceParser( + '; *(?:SKYTEX|SX)-([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Skytex', + '$1', + ), + DeviceParser( + '; *(IMAGINE [^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Skytex', + '$1', + ), + DeviceParser( + '; *(SmartQ) ?([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *(WF7C|WF10C|SBT[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Smartbitt', + '$1', + ), + DeviceParser( + '; *(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build', + None, + '$1', + 'Sharp', + '$1', + ), + DeviceParser( + '; *(003P|101P|101P11C|102P) Build', + None, + '$1', + 'Panasonic', + '$1', + ), + DeviceParser( + '; *(00\\dZ) Build/', + None, + '$1', + 'ZTE', + '$1', + ), + DeviceParser( + '; HTC(X06HT) Build', + None, + '$1', + 'HTC', + '$1', + ), + DeviceParser( + '; *(001HT|X06HT) Build', + None, + '$1', + 'HTC', + '$1', + ), + DeviceParser( + '; *(201M) Build', + None, + '$1', + 'Motorola', + 'XT902', + ), + DeviceParser( + '; *(ST\\d{4}.*)Build/ST', + None, + 'Trekstor $1', + 'Trekstor', + '$1', + ), + DeviceParser( + '; *(ST\\d{4}.*?)(?: Build|\\) AppleWebKit)', + None, + 'Trekstor $1', + 'Trekstor', + '$1', + ), + DeviceParser( + '; *(Sony ?Ericsson ?)([^;/]+) Build', + None, + '$1$2', + 'SonyEricsson', + '$2', + ), + DeviceParser( + '; *((?:SK|ST|E|X|LT|MK|MT|WT)\\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build', + None, + '$1', + 'SonyEricsson', + '$1', + ), + DeviceParser( + '; *(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\\d+)[^;/]*) Build', + 'i', + '$1', + 'SonyEricsson', + '$1', + ), + DeviceParser( + '; Sony (Tablet[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Sony $1', + 'Sony', + '$1', + ), + DeviceParser( + '; Sony ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Sony $1', + 'Sony', + '$1', + ), + DeviceParser( + '; *(Sony)([A-Za-z0-9\\-]+)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *(Xperia [^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Sony', + '$1', + ), + DeviceParser( + '; *(C(?:1[0-9]|2[0-9]|53|55|6[0-9])[0-9]{2}|D[25]\\d{3}|D6[56]\\d{2})(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Sony', + '$1', + ), + DeviceParser( + '; *(SGP\\d{3}|SGPT\\d{2})(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Sony', + '$1', + ), + DeviceParser( + '; *(NW-Z1000Series)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Sony', + '$1', + ), + DeviceParser( + 'PLAYSTATION 3', + None, + 'PlayStation 3', + 'Sony', + 'PlayStation 3', + ), + DeviceParser( + '(PlayStation (?:Portable|Vita|\\d+))', + None, + '$1', + 'Sony', + '$1', + ), + DeviceParser( + '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\\-]?|)([Mm][Ii])([ _\\-]|)(\\d{3}[^;/]*)(?: Build|\\) AppleWebKit)', + None, + '$1$2$3$4', + 'Spice', + 'Mi$4', + ), + DeviceParser( + '; *(Sprint )(.+?) *(?:Build|[;/])', + None, + '$1$2', + 'Sprint', + '$2', + ), + DeviceParser( + '\\b(Sprint)[: ]([^;,/ ]+)', + None, + '$1$2', + 'Sprint', + '$2', + ), + DeviceParser( + '; *(TAGI[ ]?)(MID) ?([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2$3', + 'Tagi', + '$2$3', + ), + DeviceParser( + '; *(Oyster500|Opal 800)(?: Build|\\) AppleWebKit)', + None, + 'Tecmobile $1', + 'Tecmobile', + '$1', + ), + DeviceParser( + '; *(TECNO[ _])([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Tecno', + '$2', + ), + DeviceParser( + '; *Android for (Telechips|Techvision) ([^ ]+) ', + 'i', + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *(T-Hub2)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Telstra', + '$1', + ), + DeviceParser( + '; *(PAD) ?(100[12])(?: Build|\\) AppleWebKit)', + None, + 'Terra $1$2', + 'Terra', + '$1$2', + ), + DeviceParser( + '; *(T[BM]-\\d{3}[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Texet', + '$1', + ), + DeviceParser( + '; *(tolino [^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Thalia', + '$1', + ), + DeviceParser( + '; *Build/.* (TOLINO_BROWSER)', + None, + '$1', + 'Thalia', + 'Tolino Shine', + ), + DeviceParser( + '; *(?:CJ[ -])?(ThL|THL)[ -]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Thl', + '$2', + ), + DeviceParser( + '; *(T100|T200|T5|W100|W200|W8s)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Thl', + '$1', + ), + DeviceParser( + '; *(T-Mobile[ _]G2[ _]Touch) Build', + None, + '$1', + 'HTC', + 'Hero', + ), + DeviceParser( + '; *(T-Mobile[ _]G2) Build', + None, + '$1', + 'HTC', + 'Desire Z', + ), + DeviceParser( + '; *(T-Mobile myTouch Q) Build', + None, + '$1', + 'Huawei', + 'U8730', + ), + DeviceParser( + '; *(T-Mobile myTouch) Build', + None, + '$1', + 'Huawei', + 'U8680', + ), + DeviceParser( + '; *(T-Mobile_Espresso) Build', + None, + '$1', + 'HTC', + 'Espresso', + ), + DeviceParser( + '; *(T-Mobile G1) Build', + None, + '$1', + 'HTC', + 'Dream', + ), + DeviceParser( + '\\b(T-Mobile ?|)(myTouch)[ _]?([34]G)[ _]?([^\\/]*) (?:Mozilla|Build)', + None, + '$1$2 $3 $4', + 'HTC', + '$2 $3 $4', + ), + DeviceParser( + '\\b(T-Mobile)_([^_]+)_(.*) Build', + None, + '$1 $2 $3', + 'Tmobile', + '$2 $3', + ), + DeviceParser( + '\\b(T-Mobile)[_ ]?(.*?)Build', + None, + '$1 $2', + 'Tmobile', + '$2', + ), + DeviceParser( + ' (ATP[0-9]{4})(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Tomtec', + '$1', + ), + DeviceParser( + ' *(TOOKY)[ _\\-]([^;/]+?) ?(?:Build|;)', + 'i', + '$1 $2', + 'Tooky', + '$2', + ), + DeviceParser( + '\\b(TOSHIBA_AC_AND_AZ|TOSHIBA_FOLIO_AND_A|FOLIO_AND_A)', + None, + '$1', + 'Toshiba', + 'Folio 100', + ), + DeviceParser( + '; *([Ff]olio ?100)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Toshiba', + 'Folio 100', + ), + DeviceParser( + '; *(AT[0-9]{2,3}(?:\\-A|LE\\-A|PE\\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive)(?: Build|\\) AppleWebKit)', + None, + 'Toshiba $1', + 'Toshiba', + '$1', + ), + DeviceParser( + '; *(TM-MID\\d+[^;/]+|TOUCHMATE|MID-750)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Touchmate', + '$1', + ), + DeviceParser( + '; *(TM-SM\\d+[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Touchmate', + '$1', + ), + DeviceParser( + '; *(A10 [Bb]asic2?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Treq', + '$1', + ), + DeviceParser( + '; *(TREQ[ _\\-])([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1$2', + 'Treq', + '$2', + ), + DeviceParser( + '; *(X-?5|X-?3)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Umeox', + '$1', + ), + DeviceParser( + '; *(A502\\+?|A936|A603|X1|X2)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Umeox', + '$1', + ), + DeviceParser( + '(TOUCH(?:TAB|PAD).+?)(?: Build|\\) AppleWebKit)', + 'i', + 'Versus $1', + 'Versus', + '$1', + ), + DeviceParser( + '(VERTU) ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Vertu', + '$2', + ), + DeviceParser( + '; *(Videocon)[ _\\-]([^;/]+?) *(?:Build|;)', + None, + '$1 $2', + 'Videocon', + '$2', + ), + DeviceParser( + ' (VT\\d{2}[A-Za-z]*)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Videocon', + '$1', + ), + DeviceParser( + '; *((?:ViewPad|ViewPhone|VSD)[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Viewsonic', + '$1', + ), + DeviceParser( + '; *(ViewSonic-)([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Viewsonic', + '$2', + ), + DeviceParser( + '; *(GTablet.*?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Viewsonic', + '$1', + ), + DeviceParser( + '; *([Vv]ivo)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'vivo', + '$2', + ), + DeviceParser( + '(Vodafone) (.*?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *(?:Walton[ _\\-]|)(Primo[ _\\-][^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + 'Walton $1', + 'Walton', + '$1', + ), + DeviceParser( + '; *(?:WIKO[ \\-]|)(CINK\\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + 'Wiko $1', + 'Wiko', + '$1', + ), + DeviceParser( + '; *WellcoM-([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Wellcom $1', + 'Wellcom', + '$1', + ), + DeviceParser( + '(?:(WeTab)-Browser|; (wetab) Build)', + None, + '$1', + 'WeTab', + 'WeTab', + ), + DeviceParser( + '; *(AT-AS[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Wolfgang $1', + 'Wolfgang', + '$1', + ), + DeviceParser( + '; *(?:Woxter|Wxt) ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Woxter $1', + 'Woxter', + '$1', + ), + DeviceParser( + '; *(?:Xenta |Luna |)(TAB[234][0-9]{2}|TAB0[78]-\\d{3}|TAB0?9-\\d{3}|TAB1[03]-\\d{3}|SMP\\d{2}-\\d{3})(?: Build|\\) AppleWebKit)', + None, + 'Yarvik $1', + 'Yarvik', + '$1', + ), + DeviceParser( + '; *([A-Z]{2,4})(M\\d{3,}[A-Z]{2})([^;\\)\\/]*)(?: Build|[;\\)])', + None, + 'Yifang $1$2$3', + 'Yifang', + '$2', + ), + DeviceParser( + '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/', + None, + 'XiaoMi $1', + 'XiaoMi', + '$1', + ), + DeviceParser( + '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\\)]*)', + None, + 'XiaoMi $1', + 'XiaoMi', + '$1', + ), + DeviceParser( + '; *(MIX) (Build|MIUI)/', + None, + 'XiaoMi $1', + 'XiaoMi', + '$1', + ), + DeviceParser( + '; *((MIX) ([^;/]*)) (Build|MIUI)/', + None, + 'XiaoMi $1', + 'XiaoMi', + '$1', + ), + DeviceParser( + '; *XOLO[ _]([^;/]*tab.*)(?: Build|\\) AppleWebKit)', + 'i', + 'Xolo $1', + 'Xolo', + '$1', + ), + DeviceParser( + '; *XOLO[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + 'Xolo $1', + 'Xolo', + '$1', + ), + DeviceParser( + '; *(q\\d0{2,3}[a-z]?)(?: Build|\\) AppleWebKit)', + 'i', + 'Xolo $1', + 'Xolo', + '$1', + ), + DeviceParser( + '; *(PAD ?[79]\\d+[^;/]*|TelePAD\\d+[^;/])(?: Build|\\) AppleWebKit)', + None, + 'Xoro $1', + 'Xoro', + '$1', + ), + DeviceParser( + '; *(?:(?:ZOPO|Zopo)[ _]([^;/]+?)|(ZP ?(?:\\d{2}[^;/]+|C2))|(C[2379]))(?: Build|\\) AppleWebKit)', + None, + '$1$2$3', + 'Zopo', + '$1$2$3', + ), + DeviceParser( + '; *(ZiiLABS) (Zii[^;/]*)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'ZiiLabs', + '$2', + ), + DeviceParser( + '; *(Zii)_([^;/]*)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'ZiiLabs', + '$2', + ), + DeviceParser( + '; *(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]*?|Era|Memo[^;]*?)|JOE|(?:Kis|KIS)\\b[^;]*?|Libra|Light [^;]*?|N8[056][01]|N850L|N8000|N9[15]\\d{2}|N9810|NX501|Optik|(?:Vip )Racer[^;]*?|RacerII|RACERII|San Francisco[^;]*?|V9[AC]|V55|V881|Z[679][0-9]{2}[A-z]?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'ZTE', + '$1', + ), + DeviceParser( + '; *([A-Z]\\d+)_USA_[^;]*(?: Build|\\) AppleWebKit)', + None, + '$1', + 'ZTE', + '$1', + ), + DeviceParser( + '; *(SmartTab\\d+)[^;]*(?: Build|\\) AppleWebKit)', + None, + '$1', + 'ZTE', + '$1', + ), + DeviceParser( + '; *(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\\) AppleWebKit)', + None, + 'ZTE Blade$1', + 'ZTE', + 'Blade$1', + ), + DeviceParser( + '; *(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\\) AppleWebKit)', + None, + 'ZTE Skate$1', + 'ZTE', + 'Skate$1', + ), + DeviceParser( + '; *(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'ZTE', + '$1$2', + ), + DeviceParser( + '; *(?:ZXY-ZTE_|ZTE\\-U |ZTE[\\- _]|ZTE-C[_ ])([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'ZTE $1', + 'ZTE', + '$1', + ), + DeviceParser( + '; (BASE) (lutea|Lutea 2|Tab[^;]*?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'ZTE', + '$1 $2', + ), + DeviceParser( + '; (Avea inTouch 2|soft stone|tmn smart a7|Movistar[ _]Link)(?: Build|\\) AppleWebKit)', + 'i', + '$1', + 'ZTE', + '$1', + ), + DeviceParser( + '; *(vp9plus)\\)', + None, + '$1', + 'ZTE', + '$1', + ), + DeviceParser( + '; ?(Cloud[ _]Z5|z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Zync', + '$1', + ), + DeviceParser( + '; ?(KFOT|Kindle Fire) Build\\b', + None, + 'Kindle Fire', + 'Amazon', + 'Kindle Fire', + ), + DeviceParser( + '; ?(KFOTE|Amazon Kindle Fire2) Build\\b', + None, + 'Kindle Fire 2', + 'Amazon', + 'Kindle Fire 2', + ), + DeviceParser( + '; ?(KFTT) Build\\b', + None, + 'Kindle Fire HD', + 'Amazon', + 'Kindle Fire HD 7"', + ), + DeviceParser( + '; ?(KFJWI) Build\\b', + None, + 'Kindle Fire HD 8.9" WiFi', + 'Amazon', + 'Kindle Fire HD 8.9" WiFi', + ), + DeviceParser( + '; ?(KFJWA) Build\\b', + None, + 'Kindle Fire HD 8.9" 4G', + 'Amazon', + 'Kindle Fire HD 8.9" 4G', + ), + DeviceParser( + '; ?(KFSOWI) Build\\b', + None, + 'Kindle Fire HD 7" WiFi', + 'Amazon', + 'Kindle Fire HD 7" WiFi', + ), + DeviceParser( + '; ?(KFTHWI) Build\\b', + None, + 'Kindle Fire HDX 7" WiFi', + 'Amazon', + 'Kindle Fire HDX 7" WiFi', + ), + DeviceParser( + '; ?(KFTHWA) Build\\b', + None, + 'Kindle Fire HDX 7" 4G', + 'Amazon', + 'Kindle Fire HDX 7" 4G', + ), + DeviceParser( + '; ?(KFAPWI) Build\\b', + None, + 'Kindle Fire HDX 8.9" WiFi', + 'Amazon', + 'Kindle Fire HDX 8.9" WiFi', + ), + DeviceParser( + '; ?(KFAPWA) Build\\b', + None, + 'Kindle Fire HDX 8.9" 4G', + 'Amazon', + 'Kindle Fire HDX 8.9" 4G', + ), + DeviceParser( + '; ?Amazon ([^;/]+) Build\\b', + None, + '$1', + 'Amazon', + '$1', + ), + DeviceParser( + '; ?(Kindle) Build\\b', + None, + 'Kindle', + 'Amazon', + 'Kindle', + ), + DeviceParser( + '; ?(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+)|) Build\\b', + None, + 'Kindle Fire', + 'Amazon', + 'Kindle Fire$2', + ), + DeviceParser( + ' (Kindle)/(\\d+\\.\\d+)', + None, + 'Kindle', + 'Amazon', + '$1 $2', + ), + DeviceParser( + ' (Silk|Kindle)/(\\d+)\\.', + None, + 'Kindle', + 'Amazon', + 'Kindle', + ), + DeviceParser( + '(sprd)\\-([^/]+)/', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *(H\\d{2}00\\+?) Build', + None, + '$1', + 'Hero', + '$1', + ), + DeviceParser( + '; *(iphone|iPhone5) Build/', + None, + 'Xianghe $1', + 'Xianghe', + '$1', + ), + DeviceParser( + '; *(e\\d{4}[a-z]?_?v\\d+|v89_[^;/]+)[^;/]+ Build/', + None, + 'Xianghe $1', + 'Xianghe', + '$1', + ), + DeviceParser( + '\\bUSCC[_\\-]?([^ ;/\\)]+)', + None, + '$1', + 'Cellular', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]*; *([^;,\\)]+)', + None, + 'Alcatel $1', + 'Alcatel', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\\)]+)', + None, + 'Asus $1', + 'Asus', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]*; *([^;,\\)]+)', + None, + 'Dell $1', + 'Dell', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]*)[^;]*; *(?:HTC|)([^;,\\)]+)', + None, + 'HTC $1', + 'HTC', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]*; *(?:HUAWEI |)([^;,\\)]+)', + None, + 'Huawei $1', + 'Huawei', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]*; *(?:LG[ \\-]|)([^;,\\)]+)', + None, + 'LG $1', + 'LG', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\\d{3,10}[^;\\)]*)', + None, + 'Lumia $1', + 'Nokia', + 'Lumia $1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(RM-\\d{3,})', + None, + 'Nokia $1', + 'Nokia', + '$1', + ), + DeviceParser( + '(?:Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\\)]+)', + None, + 'Nokia $1', + 'Nokia', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]*; *([^;,\\)]+)', + None, + 'Microsoft $1', + 'Microsoft', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]*; *(?:SAMSUNG |)([^;,\\.\\)]+)', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*; *([^;,\\)]+)', + None, + 'Toshiba $1', + 'Toshiba', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]+); *([^;,\\)]+)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '(?:^|; )SAMSUNG\\-([A-Za-z0-9\\-]+).* Bada/', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + '\\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+?)(?:/[^;]+|); rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/', + None, + 'Alcatel $1 $2 $3', + 'Alcatel', + 'One Touch $3', + ), + DeviceParser( + '\\(Mobile; (?:ZTE([^;]+)|(OpenC)); rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/', + None, + 'ZTE $1$2', + 'ZTE', + '$1$2', + ), + DeviceParser( + '\\(Mobile; ALCATEL([A-Za-z0-9\\-]+); rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/[^\\/]+ KaiOS/', + None, + 'Alcatel $1', + 'Alcatel', + '$1', + ), + DeviceParser( + '\\(Mobile; LYF\\/([A-Za-z0-9\\-]+)\\/.+;.+rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/[^\\/]+ KAIOS/', + None, + 'LYF $1', + 'LYF', + '$1', + ), + DeviceParser( + '\\(Mobile; Nokia_([A-Za-z0-9\\-]+)_.+; rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/[^\\/]+ KAIOS/', + None, + 'Nokia $1', + 'Nokia', + '$1', + ), + DeviceParser( + 'Nokia(N[0-9]+)([A-Za-z_\\-][A-Za-z0-9_\\-]*)', + None, + 'Nokia $1', + 'Nokia', + '$1$2', + ), + DeviceParser( + '(?:NOKIA|Nokia)(?:\\-| *)(?:([A-Za-z0-9]+)\\-[0-9a-f]{32}|([A-Za-z0-9\\-]+)(?:UCBrowser)|([A-Za-z0-9\\-]+))', + None, + 'Nokia $1$2$3', + 'Nokia', + '$1$2$3', + ), + DeviceParser( + 'Lumia ([A-Za-z0-9\\-]+)', + None, + 'Lumia $1', + 'Nokia', + 'Lumia $1', + ), + DeviceParser( + '\\(Symbian; U; S60 V5; [A-z]{2}\\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]+?)\\)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '\\(Symbian(?:/3|); U; ([^;]+);', + None, + 'Nokia $1', + 'Nokia', + '$1', + ), + DeviceParser( + 'BB10; ([A-Za-z0-9\\- ]+)\\)', + None, + 'BlackBerry $1', + 'BlackBerry', + '$1', + ), + DeviceParser( + 'Play[Bb]ook.+RIM Tablet OS', + None, + 'BlackBerry Playbook', + 'BlackBerry', + 'Playbook', + ), + DeviceParser( + 'Black[Bb]erry ([0-9]+);', + None, + 'BlackBerry $1', + 'BlackBerry', + '$1', + ), + DeviceParser( + 'Black[Bb]erry([0-9]+)', + None, + 'BlackBerry $1', + 'BlackBerry', + '$1', + ), + DeviceParser( + 'Black[Bb]erry;', + None, + 'BlackBerry', + 'BlackBerry', + None, + ), + DeviceParser( + '(Pre|Pixi)/\\d+\\.\\d+', + None, + 'Palm $1', + 'Palm', + '$1', + ), + DeviceParser( + 'Palm([0-9]+)', + None, + 'Palm $1', + 'Palm', + '$1', + ), + DeviceParser( + 'Treo([A-Za-z0-9]+)', + None, + 'Palm Treo $1', + 'Palm', + 'Treo $1', + ), + DeviceParser( + 'webOS.*(P160U(?:NA|))/(\\d+).(\\d+)', + None, + 'HP Veer', + 'HP', + 'Veer', + ), + DeviceParser( + '(Touch[Pp]ad)/\\d+\\.\\d+', + None, + 'HP TouchPad', + 'HP', + 'TouchPad', + ), + DeviceParser( + 'HPiPAQ([A-Za-z0-9]+)/\\d+.\\d+', + None, + 'HP iPAQ $1', + 'HP', + 'iPAQ $1', + ), + DeviceParser( + 'PDA; (PalmOS)/sony/model ([a-z]+)/Revision', + None, + '$1', + 'Sony', + '$1 $2', + ), + DeviceParser( + '(Apple\\s?TV)', + None, + 'AppleTV', + 'Apple', + 'AppleTV', + ), + DeviceParser( + '(QtCarBrowser)', + None, + 'Tesla Model S', + 'Tesla', + 'Model S', + ), + DeviceParser( + '(iPhone|iPad|iPod)(\\d+,\\d+)', + None, + '$1', + 'Apple', + '$1$2', + ), + DeviceParser( + '(iPad)(?:;| Simulator;)', + None, + '$1', + 'Apple', + '$1', + ), + DeviceParser( + '(iPod)(?:;| touch;| Simulator;)', + None, + '$1', + 'Apple', + '$1', + ), + DeviceParser( + '(iPhone)(?:;| Simulator;)', + None, + '$1', + 'Apple', + '$1', + ), + DeviceParser( + '(Watch)(\\d+,\\d+)', + None, + 'Apple $1', + 'Apple', + '$1$2', + ), + DeviceParser( + '(Apple Watch)(?:;| Simulator;)', + None, + '$1', + 'Apple', + '$1', + ), + DeviceParser( + '(HomePod)(?:;| Simulator;)', + None, + '$1', + 'Apple', + '$1', + ), + DeviceParser( + 'iPhone', + None, + 'iPhone', + 'Apple', + 'iPhone', + ), + DeviceParser( + 'CFNetwork/.* Darwin/\\d.*\\(((?:Mac|iMac|PowerMac|PowerBook)[^\\d]*)(\\d+)(?:,|%2C)(\\d+)', + None, + '$1$2,$3', + 'Apple', + '$1$2,$3', + ), + DeviceParser( + 'CFNetwork/.* Darwin/\\d+\\.\\d+\\.\\d+ \\(x86_64\\)', + None, + 'Mac', + 'Apple', + 'Mac', + ), + DeviceParser( + 'CFNetwork/.* Darwin/\\d', + None, + 'iOS-Device', + 'Apple', + 'iOS-Device', + ), + DeviceParser( + 'Outlook-(iOS)/\\d+\\.\\d+\\.prod\\.iphone', + None, + 'iPhone', + 'Apple', + 'iPhone', + ), + DeviceParser( + 'acer_([A-Za-z0-9]+)_', + None, + 'Acer $1', + 'Acer', + '$1', + ), + DeviceParser( + '(?:ALCATEL|Alcatel)-([A-Za-z0-9\\-]+)', + None, + 'Alcatel $1', + 'Alcatel', + '$1', + ), + DeviceParser( + '(?:Amoi|AMOI)\\-([A-Za-z0-9]+)', + None, + 'Amoi $1', + 'Amoi', + '$1', + ), + DeviceParser( + '(?:; |\\/|^)((?:Transformer (?:Pad|Prime) |Transformer |PadFone[ _]?)[A-Za-z0-9]*)', + None, + 'Asus $1', + 'Asus', + '$1', + ), + DeviceParser( + '(?:asus.*?ASUS|Asus|ASUS|asus)[\\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)', + None, + 'Asus $1', + 'Asus', + '$1', + ), + DeviceParser( + '(?:ASUS)_([A-Za-z0-9\\-]+)', + None, + 'Asus $1', + 'Asus', + '$1', + ), + DeviceParser( + '\\bBIRD[ \\-\\.]([A-Za-z0-9]+)', + None, + 'Bird $1', + 'Bird', + '$1', + ), + DeviceParser( + '\\bDell ([A-Za-z0-9]+)', + None, + 'Dell $1', + 'Dell', + '$1', + ), + DeviceParser( + 'DoCoMo/2\\.0 ([A-Za-z0-9]+)', + None, + 'DoCoMo $1', + 'DoCoMo', + '$1', + ), + DeviceParser( + '([A-Za-z0-9]+)_W;FOMA', + None, + 'DoCoMo $1', + 'DoCoMo', + '$1', + ), + DeviceParser( + '([A-Za-z0-9]+);FOMA', + None, + 'DoCoMo $1', + 'DoCoMo', + '$1', + ), + DeviceParser( + '\\b(?:HTC/|HTC/[a-z0-9]+/|)HTC[ _\\-;]? *(.*?)(?:-?Mozilla|fingerPrint|[;/\\(\\)]|$)', + None, + 'HTC $1', + 'HTC', + '$1', + ), + DeviceParser( + 'Huawei([A-Za-z0-9]+)', + None, + 'Huawei $1', + 'Huawei', + '$1', + ), + DeviceParser( + 'HUAWEI-([A-Za-z0-9]+)', + None, + 'Huawei $1', + 'Huawei', + '$1', + ), + DeviceParser( + 'HUAWEI ([A-Za-z0-9\\-]+)', + None, + 'Huawei $1', + 'Huawei', + '$1', + ), + DeviceParser( + 'vodafone([A-Za-z0-9]+)', + None, + 'Huawei Vodafone $1', + 'Huawei', + 'Vodafone $1', + ), + DeviceParser( + 'i\\-mate ([A-Za-z0-9]+)', + None, + 'i-mate $1', + 'i-mate', + '$1', + ), + DeviceParser( + 'Kyocera\\-([A-Za-z0-9]+)', + None, + 'Kyocera $1', + 'Kyocera', + '$1', + ), + DeviceParser( + 'KWC\\-([A-Za-z0-9]+)', + None, + 'Kyocera $1', + 'Kyocera', + '$1', + ), + DeviceParser( + 'Lenovo[_\\-]([A-Za-z0-9]+)', + None, + 'Lenovo $1', + 'Lenovo', + '$1', + ), + DeviceParser( + '(HbbTV)/[0-9]+\\.[0-9]+\\.[0-9]+ \\( ?;(LG)E ?;([^;]{0,30})', + None, + '$1', + '$2', + '$3', + ), + DeviceParser( + '(HbbTV)/1\\.1\\.1.*CE-HTML/1\\.\\d;(Vendor/|)(THOM[^;]*?)[;\\s].{0,30}(LF[^;]+);?', + None, + '$1', + 'Thomson', + '$4', + ), + DeviceParser( + '(HbbTV)(?:/1\\.1\\.1|) ?(?: \\(;;;;;\\)|); *CE-HTML(?:/1\\.\\d|); *([^ ]+) ([^;]+);', + None, + '$1', + '$2', + '$3', + ), + DeviceParser( + '(HbbTV)/1\\.1\\.1 \\(;;;;;\\) Maple_2011', + None, + '$1', + 'Samsung', + None, + ), + DeviceParser( + '(HbbTV)/[0-9]+\\.[0-9]+\\.[0-9]+ \\([^;]{0,30}; ?(?:CUS:([^;]*)|([^;]+)) ?; ?([^;]{0,30})', + None, + '$1', + '$2$3', + '$4', + ), + DeviceParser( + '(HbbTV)/[0-9]+\\.[0-9]+\\.[0-9]+', + None, + '$1', + None, + None, + ), + DeviceParser( + 'LGE; (?:Media\\/|)([^;]*);[^;]*;[^;]*;?\\); "?LG NetCast(\\.TV|\\.Media|)-\\d+', + None, + 'NetCast$2', + 'LG', + '$1', + ), + DeviceParser( + 'InettvBrowser/[0-9]+\\.[0-9A-Z]+ \\([^;]*;(Sony)([^;]*);[^;]*;[^\\)]*\\)', + None, + 'Inettv', + '$1', + '$2', + ), + DeviceParser( + 'InettvBrowser/[0-9]+\\.[0-9A-Z]+ \\([^;]*;([^;]*);[^;]*;[^\\)]*\\)', + None, + 'Inettv', + 'Generic_Inettv', + '$1', + ), + DeviceParser( + '(?:InettvBrowser|TSBNetTV|NETTV|HBBTV)', + None, + 'Inettv', + 'Generic_Inettv', + None, + ), + DeviceParser( + 'Series60/\\d\\.\\d (LG)[\\-]?([A-Za-z0-9 \\-]+)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '\\b(?:LGE[ \\-]LG\\-(?:AX|)|LGE |LGE?-LG|LGE?[ \\-]|LG[ /\\-]|lg[\\-])([A-Za-z0-9]+)\\b', + None, + 'LG $1', + 'LG', + '$1', + ), + DeviceParser( + '(?:^LG[\\-]?|^LGE[\\-/]?)([A-Za-z]+[0-9]+[A-Za-z]*)', + None, + 'LG $1', + 'LG', + '$1', + ), + DeviceParser( + '^LG([0-9]+[A-Za-z]*)', + None, + 'LG $1', + 'LG', + '$1', + ), + DeviceParser( + '(KIN\\.[^ ]+) (\\d+)\\.(\\d+)', + None, + 'Microsoft $1', + 'Microsoft', + '$1', + ), + DeviceParser( + '(?:MSIE|XBMC).*\\b(Xbox)\\b', + None, + '$1', + 'Microsoft', + '$1', + ), + DeviceParser( + '; ARM; Trident/6\\.0; Touch[\\);]', + None, + 'Microsoft Surface RT', + 'Microsoft', + 'Surface RT', + ), + DeviceParser( + 'Motorola\\-([A-Za-z0-9]+)', + None, + 'Motorola $1', + 'Motorola', + '$1', + ), + DeviceParser( + 'MOTO\\-([A-Za-z0-9]+)', + None, + 'Motorola $1', + 'Motorola', + '$1', + ), + DeviceParser( + 'MOT\\-([A-z0-9][A-z0-9\\-]*)', + None, + 'Motorola $1', + 'Motorola', + '$1', + ), + DeviceParser( + 'Nintendo WiiU', + None, + 'Nintendo Wii U', + 'Nintendo', + 'Wii U', + ), + DeviceParser( + 'Nintendo (DS|3DS|DSi|Wii);', + None, + 'Nintendo $1', + 'Nintendo', + '$1', + ), + DeviceParser( + '(?:Pantech|PANTECH)[ _-]?([A-Za-z0-9\\-]+)', + None, + 'Pantech $1', + 'Pantech', + '$1', + ), + DeviceParser( + 'Philips([A-Za-z0-9]+)', + None, + 'Philips $1', + 'Philips', + '$1', + ), + DeviceParser( + 'Philips ([A-Za-z0-9]+)', + None, + 'Philips $1', + 'Philips', + '$1', + ), + DeviceParser( + '(SMART-TV); .* Tizen ', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + 'SymbianOS/9\\.\\d.* Samsung[/\\-]([A-Za-z0-9 \\-]+)', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + '(Samsung)(SGH)(i[0-9]+)', + None, + '$1 $2$3', + '$1', + '$2-$3', + ), + DeviceParser( + 'SAMSUNG-ANDROID-MMS/([^;/]+)', + None, + '$1', + 'Samsung', + '$1', + ), + DeviceParser( + 'SAMSUNG(?:; |[ -/])([A-Za-z0-9\\-]+)', + 'i', + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + '(Dreamcast)', + None, + 'Sega $1', + 'Sega', + '$1', + ), + DeviceParser( + '^SIE-([A-Za-z0-9]+)', + None, + 'Siemens $1', + 'Siemens', + '$1', + ), + DeviceParser( + 'Softbank/[12]\\.0/([A-Za-z0-9]+)', + None, + 'Softbank $1', + 'Softbank', + '$1', + ), + DeviceParser( + 'SonyEricsson ?([A-Za-z0-9\\-]+)', + None, + 'Ericsson $1', + 'SonyEricsson', + '$1', + ), + DeviceParser( + 'Android [^;]+; ([^ ]+) (Sony)/', + None, + '$2 $1', + '$2', + '$1', + ), + DeviceParser( + '(Sony)(?:BDP\\/|\\/|)([^ /;\\)]+)[ /;\\)]', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + 'Puffin/[\\d\\.]+IT', + None, + 'iPad', + 'Apple', + 'iPad', + ), + DeviceParser( + 'Puffin/[\\d\\.]+IP', + None, + 'iPhone', + 'Apple', + 'iPhone', + ), + DeviceParser( + 'Puffin/[\\d\\.]+AT', + None, + 'Generic Tablet', + 'Generic', + 'Tablet', + ), + DeviceParser( + 'Puffin/[\\d\\.]+AP', + None, + 'Generic Smartphone', + 'Generic', + 'Smartphone', + ), + DeviceParser( + 'Android[\\- ][\\d]+\\.[\\d]+; [A-Za-z]{2}\\-[A-Za-z]{0,2}; WOWMobile (.+)( Build[/ ]|\\))', + None, + None, + 'Generic_Android', + '$1', + ), + DeviceParser( + 'Android[\\- ][\\d]+\\.[\\d]+\\-update1; [A-Za-z]{2}\\-[A-Za-z]{0,2} *; *(.+?)( Build[/ ]|\\))', + None, + None, + 'Generic_Android', + '$1', + ), + DeviceParser( + 'Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); *[A-Za-z]{2}[_\\-][A-Za-z]{0,2}\\-? *; *(.+?)( Build[/ ]|\\))', + None, + None, + 'Generic_Android', + '$1', + ), + DeviceParser( + 'Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); *[A-Za-z]{0,2}\\- *; *(.+?)( Build[/ ]|\\))', + None, + None, + 'Generic_Android', + '$1', + ), + DeviceParser( + 'Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); *[a-z]{0,2}[_\\-]?[A-Za-z]{0,2};?( Build[/ ]|\\))', + None, + 'Generic Smartphone', + 'Generic', + 'Smartphone', + ), + DeviceParser( + 'Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); *\\-?[A-Za-z]{2}; *(.+?)( Build[/ ]|\\))', + None, + None, + 'Generic_Android', + '$1', + ), + DeviceParser( + 'Android \\d+?(?:\\.\\d+|)(?:\\.\\d+|); ([^;]+?)(?: Build|\\) AppleWebKit).+? Mobile Safari', + None, + None, + 'Generic_Android', + '$1', + ), + DeviceParser( + 'Android \\d+?(?:\\.\\d+|)(?:\\.\\d+|); ([^;]+?)(?: Build|\\) AppleWebKit).+? Safari', + None, + None, + 'Generic_Android_Tablet', + '$1', + ), + DeviceParser( + 'Android \\d+?(?:\\.\\d+|)(?:\\.\\d+|); ([^;]+?)(?: Build|\\))', + None, + None, + 'Generic_Android', + '$1', + ), + DeviceParser( + '(GoogleTV)', + None, + None, + 'Generic_Inettv', + '$1', + ), + DeviceParser( + '(WebTV)/\\d+.\\d+', + None, + None, + 'Generic_Inettv', + '$1', + ), + DeviceParser( + '^(Roku)/DVP-\\d+\\.\\d+', + None, + None, + 'Generic_Inettv', + '$1', + ), + DeviceParser( + '(Android 3\\.\\d|Opera Tablet|Tablet; .+Firefox/|Android.*(?:Tab|Pad))', + 'i', + 'Generic Tablet', + 'Generic', + 'Tablet', + ), + DeviceParser( + '(Symbian|\\bS60(Version|V\\d)|\\bS60\\b|\\((Series 60|Windows Mobile|Palm OS|Bada); Opera Mini|Windows CE|Opera Mobi|BREW|Brew|Mobile; .+Firefox/|iPhone OS|Android|MobileSafari|Windows *Phone|\\(webOS/|PalmOS)', + None, + 'Generic Smartphone', + 'Generic', + 'Smartphone', + ), + DeviceParser( + '(hiptop|avantgo|plucker|xiino|blazer|elaine)', + 'i', + 'Generic Smartphone', + 'Generic', + 'Smartphone', + ), + DeviceParser( + '(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.*/\\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti|OgScrper)', + 'i', + 'Spider', + 'Spider', + 'Desktop', + ), + DeviceParser( + '^(1207|3gso|4thp|501i|502i|503i|504i|505i|506i|6310|6590|770s|802s|a wa|acer|acs\\-|airn|alav|asus|attw|au\\-m|aur |aus |abac|acoo|aiko|alco|alca|amoi|anex|anny|anyw|aptu|arch|argo|bmobile|bell|bird|bw\\-n|bw\\-u|beck|benq|bilb|blac|c55/|cdm\\-|chtm|capi|comp|cond|dall|dbte|dc\\-s|dica|ds\\-d|ds12|dait|devi|dmob|doco|dopo|dorado|el(?:38|39|48|49|50|55|58|68)|el[3456]\\d{2}dual|erk0|esl8|ex300|ez40|ez60|ez70|ezos|ezze|elai|emul|eric|ezwa|fake|fly\\-|fly_|g\\-mo|g1 u|g560|gf\\-5|grun|gene|go.w|good|grad|hcit|hd\\-m|hd\\-p|hd\\-t|hei\\-|hp i|hpip|hs\\-c|htc |htc\\-|htca|htcg)', + 'i', + 'Generic Feature Phone', + 'Generic', + 'Feature Phone', + ), + DeviceParser( + '^(htcp|htcs|htct|htc_|haie|hita|huaw|hutc|i\\-20|i\\-go|i\\-ma|i\\-mobile|i230|iac|iac\\-|iac/|ig01|im1k|inno|iris|jata|kddi|kgt|kgt/|kpt |kwc\\-|klon|lexi|lg g|lg\\-a|lg\\-b|lg\\-c|lg\\-d|lg\\-f|lg\\-g|lg\\-k|lg\\-l|lg\\-m|lg\\-o|lg\\-p|lg\\-s|lg\\-t|lg\\-u|lg\\-w|lg/k|lg/l|lg/u|lg50|lg54|lge\\-|lge/|leno|m1\\-w|m3ga|m50/|maui|mc01|mc21|mcca|medi|meri|mio8|mioa|mo01|mo02|mode|modo|mot |mot\\-|mt50|mtp1|mtv |mate|maxo|merc|mits|mobi|motv|mozz|n100|n101|n102|n202|n203|n300|n302|n500|n502|n505|n700|n701|n710|nec\\-|nem\\-|newg|neon)', + 'i', + 'Generic Feature Phone', + 'Generic', + 'Feature Phone', + ), + DeviceParser( + '^(netf|noki|nzph|o2 x|o2\\-x|opwv|owg1|opti|oran|ot\\-s|p800|pand|pg\\-1|pg\\-2|pg\\-3|pg\\-6|pg\\-8|pg\\-c|pg13|phil|pn\\-2|pt\\-g|palm|pana|pire|pock|pose|psio|qa\\-a|qc\\-2|qc\\-3|qc\\-5|qc\\-7|qc07|qc12|qc21|qc32|qc60|qci\\-|qwap|qtek|r380|r600|raks|rim9|rove|s55/|sage|sams|sc01|sch\\-|scp\\-|sdk/|se47|sec\\-|sec0|sec1|semc|sgh\\-|shar|sie\\-|sk\\-0|sl45|slid|smb3|smt5|sp01|sph\\-|spv |spv\\-|sy01|samm|sany|sava|scoo|send|siem|smar|smit|soft|sony|t\\-mo|t218|t250|t600|t610|t618|tcl\\-|tdg\\-|telm|tim\\-|ts70|tsm\\-|tsm3|tsm5|tx\\-9|tagt)', + 'i', + 'Generic Feature Phone', + 'Generic', + 'Feature Phone', + ), + DeviceParser( + '^(talk|teli|topl|tosh|up.b|upg1|utst|v400|v750|veri|vk\\-v|vk40|vk50|vk52|vk53|vm40|vx98|virg|vertu|vite|voda|vulc|w3c |w3c\\-|wapj|wapp|wapu|wapm|wig |wapi|wapr|wapv|wapy|wapa|waps|wapt|winc|winw|wonu|x700|xda2|xdag|yas\\-|your|zte\\-|zeto|aste|audi|avan|blaz|brew|brvw|bumb|ccwa|cell|cldc|cmd\\-|dang|eml2|fetc|hipt|http|ibro|idea|ikom|ipaq|jbro|jemu|jigs|keji|kyoc|kyok|libw|m\\-cr|midp|mmef|moto|mwbp|mywa|newt|nok6|o2im|pant|pdxg|play|pluc|port|prox|rozo|sama|seri|smal|symb|treo|upsi|vx52|vx53|vx60|vx61|vx70|vx80|vx81|vx83|vx85|wap\\-|webc|whit|wmlb|xda\\-|xda_)', + 'i', + 'Generic Feature Phone', + 'Generic', + 'Feature Phone', + ), + DeviceParser( + '^(Ice)$', + None, + 'Generic Feature Phone', + 'Generic', + 'Feature Phone', + ), + DeviceParser( + '(wap[\\-\\ ]browser|maui|netfront|obigo|teleca|up\\.browser|midp|Opera Mini)', + 'i', + 'Generic Feature Phone', + 'Generic', + 'Feature Phone', + ), + DeviceParser( + 'Mac OS', + None, + 'Mac', + 'Apple', + 'Mac', + ), +] + +OS_PARSERS = [ + OSParser( + 'HbbTV/\\d+\\.\\d+\\.\\d+ \\( ;(LG)E ;NetCast 4.0', + None, + '2013', + None, + None, + None, + ), + OSParser( + 'HbbTV/\\d+\\.\\d+\\.\\d+ \\( ;(LG)E ;NetCast 3.0', + None, + '2012', + None, + None, + None, + ), + OSParser( + 'HbbTV/1.1.1 \\(;;;;;\\) Maple_2011', + 'Samsung', + '2011', + None, + None, + None, + ), + OSParser( + 'HbbTV/\\d+\\.\\d+\\.\\d+ \\(;(Samsung);SmartTV([0-9]{4});.*FXPDEUC', + None, + None, + 'UE40F7000', + None, + None, + ), + OSParser( + 'HbbTV/\\d+\\.\\d+\\.\\d+ \\(;(Samsung);SmartTV([0-9]{4});.*MST12DEUC', + None, + None, + 'UE32F4500', + None, + None, + ), + OSParser( + 'HbbTV/1\\.1\\.1 \\(; (Philips);.*NETTV/4', + None, + '2013', + None, + None, + None, + ), + OSParser( + 'HbbTV/1\\.1\\.1 \\(; (Philips);.*NETTV/3', + None, + '2012', + None, + None, + None, + ), + OSParser( + 'HbbTV/1\\.1\\.1 \\(; (Philips);.*NETTV/2', + None, + '2011', + None, + None, + None, + ), + OSParser( + 'HbbTV/\\d+\\.\\d+\\.\\d+.*(firetv)-firefox-plugin (\\d+).(\\d+).(\\d+)', + 'FireHbbTV', + None, + None, + None, + None, + ), + OSParser( + 'HbbTV/\\d+\\.\\d+\\.\\d+ \\(.*; ?([a-zA-Z]+) ?;.*(201[1-9]).*\\)', + None, + None, + None, + None, + None, + ), + OSParser( + '(Windows Phone) (?:OS[ /])?(\\d+)\\.(\\d+)', + None, + None, + None, + None, + None, + ), + OSParser( + '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\\d+)[_\\.](\\d+)(?:[_\\.](\\d+)|).*Outlook-iOS-Android', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(Android)[ \\-/](\\d+)(?:\\.(\\d+)|)(?:[.\\-]([a-z0-9]+)|)', + None, + None, + None, + None, + None, + ), + OSParser( + '(Android) Donut', + None, + '1', + '2', + None, + None, + ), + OSParser( + '(Android) Eclair', + None, + '2', + '1', + None, + None, + ), + OSParser( + '(Android) Froyo', + None, + '2', + '2', + None, + None, + ), + OSParser( + '(Android) Gingerbread', + None, + '2', + '3', + None, + None, + ), + OSParser( + '(Android) Honeycomb', + None, + '3', + None, + None, + None, + ), + OSParser( + '(Android) (\\d+);', + None, + None, + None, + None, + None, + ), + OSParser( + '^UCWEB.*; (Adr) (\\d+)\\.(\\d+)(?:[.\\-]([a-z0-9]+)|);', + 'Android', + None, + None, + None, + None, + ), + OSParser( + '^UCWEB.*; (iPad|iPh|iPd) OS (\\d+)_(\\d+)(?:_(\\d+)|);', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '^UCWEB.*; (wds) (\\d+)\\.(\\d+)(?:\\.(\\d+)|);', + 'Windows Phone', + None, + None, + None, + None, + ), + OSParser( + '^(JUC).*; ?U; ?(?:Android|)(\\d+)\\.(\\d+)(?:[\\.\\-]([a-z0-9]+)|)', + 'Android', + None, + None, + None, + None, + ), + OSParser( + '(android)\\s(?:mobile\\/)(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)', + 'Android', + None, + None, + None, + None, + ), + OSParser( + '(Silk-Accelerated=[a-z]{4,5})', + 'Android', + None, + None, + None, + None, + ), + OSParser( + '(x86_64|aarch64)\\ (\\d+)\\.(\\d+)\\.(\\d+).*Chrome.*(?:CitrixChromeApp)$', + 'Chrome OS', + None, + None, + None, + None, + ), + OSParser( + '(XBLWP7)', + 'Windows Phone', + None, + None, + None, + None, + ), + OSParser( + '(Windows ?Mobile)', + 'Windows Mobile', + None, + None, + None, + None, + ), + OSParser( + '(Windows 10)', + 'Windows', + '10', + None, + None, + None, + ), + OSParser( + '(Windows (?:NT 5\\.2|NT 5\\.1))', + 'Windows', + 'XP', + None, + None, + None, + ), + OSParser( + '(Windows NT 6\\.1)', + 'Windows', + '7', + None, + None, + None, + ), + OSParser( + '(Windows NT 6\\.0)', + 'Windows', + 'Vista', + None, + None, + None, + ), + OSParser( + '(Win 9x 4\\.90)', + 'Windows', + 'ME', + None, + None, + None, + ), + OSParser( + '(Windows NT 6\\.2; ARM;)', + 'Windows', + 'RT', + None, + None, + None, + ), + OSParser( + '(Windows NT 6\\.2)', + 'Windows', + '8', + None, + None, + None, + ), + OSParser( + '(Windows NT 6\\.3; ARM;)', + 'Windows', + 'RT 8', + '1', + None, + None, + ), + OSParser( + '(Windows NT 6\\.3)', + 'Windows', + '8', + '1', + None, + None, + ), + OSParser( + '(Windows NT 6\\.4)', + 'Windows', + '10', + None, + None, + None, + ), + OSParser( + '(Windows NT 10\\.0)', + 'Windows', + '10', + None, + None, + None, + ), + OSParser( + '(Windows NT 5\\.0)', + 'Windows', + '2000', + None, + None, + None, + ), + OSParser( + '(WinNT4.0)', + 'Windows', + 'NT 4.0', + None, + None, + None, + ), + OSParser( + '(Windows ?CE)', + 'Windows', + 'CE', + None, + None, + None, + ), + OSParser( + 'Win(?:dows)? ?(95|98|3.1|NT|ME|2000|XP|Vista|7|CE)', + 'Windows', + '$1', + None, + None, + None, + ), + OSParser( + 'Win16', + 'Windows', + '3.1', + None, + None, + None, + ), + OSParser( + 'Win32', + 'Windows', + '95', + None, + None, + None, + ), + OSParser( + '^Box.*Windows/([\\d.]+);', + 'Windows', + '$1', + None, + None, + None, + ), + OSParser( + '(Tizen)[/ ](\\d+)\\.(\\d+)', + None, + None, + None, + None, + None, + ), + OSParser( + '((?:Mac[ +]?|; )OS[ +]X)[\\s+/](?:(\\d+)[_.](\\d+)(?:[_.](\\d+)|)|Mach-O)', + 'Mac OS X', + None, + None, + None, + None, + ), + OSParser( + '\\w+\\s+Mac OS X\\s+\\w+\\s+(\\d+).(\\d+).(\\d+).*', + 'Mac OS X', + '$1', + '$2', + '$3', + None, + ), + OSParser( + ' (Dar)(win)/(9).(\\d+).*\\((?:i386|x86_64|Power Macintosh)\\)', + 'Mac OS X', + '10', + '5', + None, + None, + ), + OSParser( + ' (Dar)(win)/(10).(\\d+).*\\((?:i386|x86_64)\\)', + 'Mac OS X', + '10', + '6', + None, + None, + ), + OSParser( + ' (Dar)(win)/(11).(\\d+).*\\((?:i386|x86_64)\\)', + 'Mac OS X', + '10', + '7', + None, + None, + ), + OSParser( + ' (Dar)(win)/(12).(\\d+).*\\((?:i386|x86_64)\\)', + 'Mac OS X', + '10', + '8', + None, + None, + ), + OSParser( + ' (Dar)(win)/(13).(\\d+).*\\((?:i386|x86_64)\\)', + 'Mac OS X', + '10', + '9', + None, + None, + ), + OSParser( + 'Mac_PowerPC', + 'Mac OS', + None, + None, + None, + None, + ), + OSParser( + '(?:PPC|Intel) (Mac OS X)', + None, + None, + None, + None, + None, + ), + OSParser( + '^Box.*;(Darwin)/(10)\\.(1\\d)(?:\\.(\\d+)|)', + 'Mac OS X', + None, + None, + None, + None, + ), + OSParser( + '(Apple\\s?TV)(?:/(\\d+)\\.(\\d+)|)', + 'ATV OS X', + None, + None, + None, + None, + ), + OSParser( + '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(\\d+)[_\\.](\\d+)(?:[_\\.](\\d+)|)', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(iPhone|iPad|iPod); Opera', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(iPhone|iPad|iPod).*Mac OS X.*Version/(\\d+)\\.(\\d+)', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(CFNetwork)/(5)48\\.0\\.3.* Darwin/11\\.0\\.0', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(CFNetwork)/(5)48\\.(0)\\.4.* Darwin/(1)1\\.0\\.0', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(CFNetwork)/(5)48\\.(1)\\.4', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(CFNetwork)/(4)85\\.1(3)\\.9', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(CFNetwork)/(6)09\\.(1)\\.4', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(CFNetwork)/(6)(0)9', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(CFNetwork)/6(7)2\\.(1)\\.13', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(CFNetwork)/6(7)2\\.(1)\\.(1)4', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(CF)(Network)/6(7)(2)\\.1\\.15', + 'iOS', + '7', + '1', + None, + None, + ), + OSParser( + '(CFNetwork)/6(7)2\\.(0)\\.(?:2|8)', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(CFNetwork)/709\\.1', + 'iOS', + '8', + '0.b5', + None, + None, + ), + OSParser( + '(CF)(Network)/711\\.(\\d)', + 'iOS', + '8', + None, + None, + None, + ), + OSParser( + '(CF)(Network)/(720)\\.(\\d)', + 'Mac OS X', + '10', + '10', + None, + None, + ), + OSParser( + '(CF)(Network)/(760)\\.(\\d)', + 'Mac OS X', + '10', + '11', + None, + None, + ), + OSParser( + 'CFNetwork/7.* Darwin/15\\.4\\.\\d+', + 'iOS', + '9', + '3', + '1', + None, + ), + OSParser( + 'CFNetwork/7.* Darwin/15\\.5\\.\\d+', + 'iOS', + '9', + '3', + '2', + None, + ), + OSParser( + 'CFNetwork/7.* Darwin/15\\.6\\.\\d+', + 'iOS', + '9', + '3', + '5', + None, + ), + OSParser( + '(CF)(Network)/758\\.(\\d)', + 'iOS', + '9', + None, + None, + None, + ), + OSParser( + 'CFNetwork/808\\.3 Darwin/16\\.3\\.\\d+', + 'iOS', + '10', + '2', + '1', + None, + ), + OSParser( + '(CF)(Network)/808\\.(\\d)', + 'iOS', + '10', + None, + None, + None, + ), + OSParser( + 'CFNetwork/.* Darwin/17\\.\\d+.*\\(x86_64\\)', + 'Mac OS X', + '10', + '13', + None, + None, + ), + OSParser( + 'CFNetwork/.* Darwin/16\\.\\d+.*\\(x86_64\\)', + 'Mac OS X', + '10', + '12', + None, + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/15\\.\\d+.*\\(x86_64\\)', + 'Mac OS X', + '10', + '11', + None, + None, + ), + OSParser( + 'CFNetwork/.* Darwin/(9)\\.\\d+', + 'iOS', + '1', + None, + None, + None, + ), + OSParser( + 'CFNetwork/.* Darwin/(10)\\.\\d+', + 'iOS', + '4', + None, + None, + None, + ), + OSParser( + 'CFNetwork/.* Darwin/(11)\\.\\d+', + 'iOS', + '5', + None, + None, + None, + ), + OSParser( + 'CFNetwork/.* Darwin/(13)\\.\\d+', + 'iOS', + '6', + None, + None, + None, + ), + OSParser( + 'CFNetwork/6.* Darwin/(14)\\.\\d+', + 'iOS', + '7', + None, + None, + None, + ), + OSParser( + 'CFNetwork/7.* Darwin/(14)\\.\\d+', + 'iOS', + '8', + '0', + None, + None, + ), + OSParser( + 'CFNetwork/7.* Darwin/(15)\\.\\d+', + 'iOS', + '9', + '0', + None, + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/16\\.5\\.\\d+', + 'iOS', + '10', + '3', + None, + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/16\\.6\\.\\d+', + 'iOS', + '10', + '3', + '2', + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/16\\.7\\.\\d+', + 'iOS', + '10', + '3', + '3', + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/(16)\\.\\d+', + 'iOS', + '10', + None, + None, + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/17\\.0\\.\\d+', + 'iOS', + '11', + '0', + None, + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/17\\.2\\.\\d+', + 'iOS', + '11', + '1', + None, + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/17\\.3\\.\\d+', + 'iOS', + '11', + '2', + None, + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/17\\.4\\.\\d+', + 'iOS', + '11', + '2', + '6', + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/17\\.5\\.\\d+', + 'iOS', + '11', + '3', + None, + None, + ), + OSParser( + 'CFNetwork/9.* Darwin/17\\.6\\.\\d+', + 'iOS', + '11', + '4', + None, + None, + ), + OSParser( + 'CFNetwork/9.* Darwin/17\\.7\\.\\d+', + 'iOS', + '11', + '4', + '1', + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/(17)\\.\\d+', + 'iOS', + '11', + None, + None, + None, + ), + OSParser( + 'CFNetwork/9.* Darwin/18\\.0\\.\\d+', + 'iOS', + '12', + '0', + None, + None, + ), + OSParser( + 'CFNetwork/9.* Darwin/(18)\\.\\d+', + 'iOS', + '12', + None, + None, + None, + ), + OSParser( + 'CFNetwork/.* Darwin/', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '\\b(iOS[ /]|iOS; |iPhone(?:/| v|[ _]OS[/,]|; | OS : |\\d,\\d/|\\d,\\d; )|iPad/)(\\d{1,2})[_\\.](\\d{1,2})(?:[_\\.](\\d+)|)', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '\\((iOS);', + None, + None, + None, + None, + None, + ), + OSParser( + '(watchOS)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'WatchOS', + None, + None, + None, + None, + ), + OSParser( + 'Outlook-(iOS)/\\d+\\.\\d+\\.prod\\.iphone', + None, + None, + None, + None, + None, + ), + OSParser( + '(iPod|iPhone|iPad)', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(tvOS)[/ ](\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'tvOS', + None, + None, + None, + None, + ), + OSParser( + '(CrOS) [a-z0-9_]+ (\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'Chrome OS', + None, + None, + None, + None, + ), + OSParser( + '([Dd]ebian)', + 'Debian', + None, + None, + None, + None, + ), + OSParser( + '(Linux Mint)(?:/(\\d+)|)', + None, + None, + None, + None, + None, + ), + OSParser( + '(Mandriva)(?: Linux|)/(?:[\\d.-]+m[a-z]{2}(\\d+).(\\d)|)', + None, + None, + None, + None, + None, + ), + OSParser( + '(Symbian[Oo][Ss])[/ ](\\d+)\\.(\\d+)', + 'Symbian OS', + None, + None, + None, + None, + ), + OSParser( + '(Symbian/3).+NokiaBrowser/7\\.3', + 'Symbian^3 Anna', + None, + None, + None, + None, + ), + OSParser( + '(Symbian/3).+NokiaBrowser/7\\.4', + 'Symbian^3 Belle', + None, + None, + None, + None, + ), + OSParser( + '(Symbian/3)', + 'Symbian^3', + None, + None, + None, + None, + ), + OSParser( + '\\b(Series 60|SymbOS|S60Version|S60V\\d|S60\\b)', + 'Symbian OS', + None, + None, + None, + None, + ), + OSParser( + '(MeeGo)', + None, + None, + None, + None, + None, + ), + OSParser( + 'Symbian [Oo][Ss]', + 'Symbian OS', + None, + None, + None, + None, + ), + OSParser( + 'Series40;', + 'Nokia Series 40', + None, + None, + None, + None, + ), + OSParser( + 'Series30Plus;', + 'Nokia Series 30 Plus', + None, + None, + None, + None, + ), + OSParser( + '(BB10);.+Version/(\\d+)\\.(\\d+)\\.(\\d+)', + 'BlackBerry OS', + None, + None, + None, + None, + ), + OSParser( + '(Black[Bb]erry)[0-9a-z]+/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'BlackBerry OS', + None, + None, + None, + None, + ), + OSParser( + '(Black[Bb]erry).+Version/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'BlackBerry OS', + None, + None, + None, + None, + ), + OSParser( + '(RIM Tablet OS) (\\d+)\\.(\\d+)\\.(\\d+)', + 'BlackBerry Tablet OS', + None, + None, + None, + None, + ), + OSParser( + '(Play[Bb]ook)', + 'BlackBerry Tablet OS', + None, + None, + None, + None, + ), + OSParser( + '(Black[Bb]erry)', + 'BlackBerry OS', + None, + None, + None, + None, + ), + OSParser( + '(K[Aa][Ii]OS)\\/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'KaiOS', + None, + None, + None, + None, + ), + OSParser( + '\\((?:Mobile|Tablet);.+Gecko/18.0 Firefox/\\d+\\.\\d+', + 'Firefox OS', + '1', + '0', + '1', + None, + ), + OSParser( + '\\((?:Mobile|Tablet);.+Gecko/18.1 Firefox/\\d+\\.\\d+', + 'Firefox OS', + '1', + '1', + None, + None, + ), + OSParser( + '\\((?:Mobile|Tablet);.+Gecko/26.0 Firefox/\\d+\\.\\d+', + 'Firefox OS', + '1', + '2', + None, + None, + ), + OSParser( + '\\((?:Mobile|Tablet);.+Gecko/28.0 Firefox/\\d+\\.\\d+', + 'Firefox OS', + '1', + '3', + None, + None, + ), + OSParser( + '\\((?:Mobile|Tablet);.+Gecko/30.0 Firefox/\\d+\\.\\d+', + 'Firefox OS', + '1', + '4', + None, + None, + ), + OSParser( + '\\((?:Mobile|Tablet);.+Gecko/32.0 Firefox/\\d+\\.\\d+', + 'Firefox OS', + '2', + '0', + None, + None, + ), + OSParser( + '\\((?:Mobile|Tablet);.+Gecko/34.0 Firefox/\\d+\\.\\d+', + 'Firefox OS', + '2', + '1', + None, + None, + ), + OSParser( + '\\((?:Mobile|Tablet);.+Firefox/\\d+\\.\\d+', + 'Firefox OS', + None, + None, + None, + None, + ), + OSParser( + '(BREW)[ /](\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + None, + None, + ), + OSParser( + '(BREW);', + None, + None, + None, + None, + None, + ), + OSParser( + '(Brew MP|BMP)[ /](\\d+)\\.(\\d+)\\.(\\d+)', + 'Brew MP', + None, + None, + None, + None, + ), + OSParser( + 'BMP;', + 'Brew MP', + None, + None, + None, + None, + ), + OSParser( + '(GoogleTV)(?: (\\d+)\\.(\\d+)(?:\\.(\\d+)|)|/[\\da-z]+)', + None, + None, + None, + None, + None, + ), + OSParser( + '(WebTV)/(\\d+).(\\d+)', + None, + None, + None, + None, + None, + ), + OSParser( + '(CrKey)(?:[/](\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)', + 'Chromecast', + None, + None, + None, + None, + ), + OSParser( + '(hpw|web)OS/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'webOS', + None, + None, + None, + None, + ), + OSParser( + '(VRE);', + None, + None, + None, + None, + None, + ), + OSParser( + '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Sailfish|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\\b)BSD)[/ ](\\d+)\\.(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + None, + None, + None, + None, + None, + ), + OSParser( + '(Linux)[ /](\\d+)\\.(\\d+)(?:\\.(\\d+)|).*gentoo', + 'Gentoo', + None, + None, + None, + None, + ), + OSParser( + '\\((Bada);', + None, + None, + None, + None, + None, + ), + OSParser( + '(Windows|Android|WeTab|Maemo|Web0S)', + None, + None, + None, + None, + None, + ), + OSParser( + '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|(?:Free|Open|Net|\\b)BSD)', + None, + None, + None, + None, + None, + ), + OSParser( + '(Linux)(?:[ /](\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)', + None, + None, + None, + None, + None, + ), + OSParser( + 'SunOS', + 'Solaris', + None, + None, + None, + None, + ), + OSParser( + '\\(linux-gnu\\)', + 'Linux', + None, + None, + None, + None, + ), + OSParser( + '\\(x86_64-redhat-linux-gnu\\)', + 'Red Hat', + None, + None, + None, + None, + ), + OSParser( + '\\((freebsd)(\\d+)\\.(\\d+)\\)', + 'FreeBSD', + None, + None, + None, + None, + ), + OSParser( + 'linux', + 'Linux', + None, + None, + None, + None, + ), + OSParser( + '^(Roku)/DVP-(\\d+)\\.(\\d+)', + None, + None, + None, + None, + None, + ), +] diff --git a/app_common/lib/ua_parser/user_agent_parser.py b/app_common/lib/ua_parser/user_agent_parser.py new file mode 100644 index 00000000..45f5a063 --- /dev/null +++ b/app_common/lib/ua_parser/user_agent_parser.py @@ -0,0 +1,544 @@ +# Copyright 2009 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the 'License') +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an 'AS IS' BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Python implementation of the UA parser.""" + +from __future__ import absolute_import + +import os +import re + +__author__ = "Lindsey Simon " + + +class UserAgentParser(object): + def __init__( + self, pattern, family_replacement=None, v1_replacement=None, v2_replacement=None + ): + """Initialize UserAgentParser. + + Args: + pattern: a regular expression string + family_replacement: a string to override the matched family (optional) + v1_replacement: a string to override the matched v1 (optional) + v2_replacement: a string to override the matched v2 (optional) + """ + self.pattern = pattern + self.user_agent_re = re.compile(self.pattern) + self.family_replacement = family_replacement + self.v1_replacement = v1_replacement + self.v2_replacement = v2_replacement + + def MatchSpans(self, user_agent_string): + match_spans = [] + match = self.user_agent_re.search(user_agent_string) + if match: + match_spans = [ + match.span(group_index) for group_index in range(1, match.lastindex + 1) + ] + return match_spans + + def Parse(self, user_agent_string): + family, v1, v2, v3 = None, None, None, None + match = self.user_agent_re.search(user_agent_string) + if match: + if self.family_replacement: + if re.search(r"\$1", self.family_replacement): + family = re.sub(r"\$1", match.group(1), self.family_replacement) + else: + family = self.family_replacement + else: + family = match.group(1) + + if self.v1_replacement: + v1 = self.v1_replacement + elif match.lastindex and match.lastindex >= 2: + v1 = match.group(2) or None + + if self.v2_replacement: + v2 = self.v2_replacement + elif match.lastindex and match.lastindex >= 3: + v2 = match.group(3) or None + + if match.lastindex and match.lastindex >= 4: + v3 = match.group(4) or None + + return family, v1, v2, v3 + + +class OSParser(object): + def __init__( + self, + pattern, + os_replacement=None, + os_v1_replacement=None, + os_v2_replacement=None, + os_v3_replacement=None, + os_v4_replacement=None, + ): + """Initialize UserAgentParser. + + Args: + pattern: a regular expression string + os_replacement: a string to override the matched os (optional) + os_v1_replacement: a string to override the matched v1 (optional) + os_v2_replacement: a string to override the matched v2 (optional) + os_v3_replacement: a string to override the matched v3 (optional) + os_v4_replacement: a string to override the matched v4 (optional) + """ + self.pattern = pattern + self.user_agent_re = re.compile(self.pattern) + self.os_replacement = os_replacement + self.os_v1_replacement = os_v1_replacement + self.os_v2_replacement = os_v2_replacement + self.os_v3_replacement = os_v3_replacement + self.os_v4_replacement = os_v4_replacement + + def MatchSpans(self, user_agent_string): + match_spans = [] + match = self.user_agent_re.search(user_agent_string) + if match: + match_spans = [ + match.span(group_index) for group_index in range(1, match.lastindex + 1) + ] + return match_spans + + def Parse(self, user_agent_string): + os, os_v1, os_v2, os_v3, os_v4 = None, None, None, None, None + match = self.user_agent_re.search(user_agent_string) + if match: + if self.os_replacement: + os = MultiReplace(self.os_replacement, match) + elif match.lastindex: + os = match.group(1) + + if self.os_v1_replacement: + os_v1 = MultiReplace(self.os_v1_replacement, match) + elif match.lastindex and match.lastindex >= 2: + os_v1 = match.group(2) + + if self.os_v2_replacement: + os_v2 = MultiReplace(self.os_v2_replacement, match) + elif match.lastindex and match.lastindex >= 3: + os_v2 = match.group(3) + + if self.os_v3_replacement: + os_v3 = MultiReplace(self.os_v3_replacement, match) + elif match.lastindex and match.lastindex >= 4: + os_v3 = match.group(4) + + if self.os_v4_replacement: + os_v4 = MultiReplace(self.os_v4_replacement, match) + elif match.lastindex and match.lastindex >= 5: + os_v4 = match.group(5) + + return os, os_v1, os_v2, os_v3, os_v4 + + +def MultiReplace(string, match): + def _repl(m): + index = int(m.group(1)) - 1 + group = match.groups() + if index < len(group): + return group[index] + return "" + + _string = re.sub(r"\$(\d)", _repl, string) + _string = re.sub(r"^\s+|\s+$", "", _string) + if _string == "": + return None + return _string + + +class DeviceParser(object): + def __init__( + self, + pattern, + regex_flag=None, + device_replacement=None, + brand_replacement=None, + model_replacement=None, + ): + """Initialize UserAgentParser. + + Args: + pattern: a regular expression string + device_replacement: a string to override the matched device (optional) + """ + self.pattern = pattern + if regex_flag == "i": + self.user_agent_re = re.compile(self.pattern, re.IGNORECASE) + else: + self.user_agent_re = re.compile(self.pattern) + self.device_replacement = device_replacement + self.brand_replacement = brand_replacement + self.model_replacement = model_replacement + + def MatchSpans(self, user_agent_string): + match_spans = [] + match = self.user_agent_re.search(user_agent_string) + if match: + match_spans = [ + match.span(group_index) for group_index in range(1, match.lastindex + 1) + ] + return match_spans + + def Parse(self, user_agent_string): + device, brand, model = None, None, None + match = self.user_agent_re.search(user_agent_string) + if match: + if self.device_replacement: + device = MultiReplace(self.device_replacement, match) + else: + device = match.group(1) + + if self.brand_replacement: + brand = MultiReplace(self.brand_replacement, match) + + if self.model_replacement: + model = MultiReplace(self.model_replacement, match) + elif len(match.groups()) > 0: + model = match.group(1) + + return device, brand, model + + +MAX_CACHE_SIZE = 20 +_parse_cache = {} + + +def Parse(user_agent_string, **jsParseBits): + """ Parse all the things + Args: + user_agent_string: the full user agent string + jsParseBits: javascript override bits + Returns: + A dictionary containing all parsed bits + """ + jsParseBits = jsParseBits or {} + key = (user_agent_string, repr(jsParseBits)) + cached = _parse_cache.get(key) + if cached is not None: + return cached + if len(_parse_cache) > MAX_CACHE_SIZE: + _parse_cache.clear() + v = { + "user_agent": ParseUserAgent(user_agent_string, **jsParseBits), + "os": ParseOS(user_agent_string, **jsParseBits), + "device": ParseDevice(user_agent_string, **jsParseBits), + "string": user_agent_string, + } + _parse_cache[key] = v + return v + + +def ParseUserAgent(user_agent_string, **jsParseBits): + """ Parses the user-agent string for user agent (browser) info. + Args: + user_agent_string: The full user-agent string. + jsParseBits: javascript override bits. + Returns: + A dictionary containing parsed bits. + """ + if ( + "js_user_agent_family" in jsParseBits + and jsParseBits["js_user_agent_family"] != "" + ): + family = jsParseBits["js_user_agent_family"] + v1 = jsParseBits.get("js_user_agent_v1") or None + v2 = jsParseBits.get("js_user_agent_v2") or None + v3 = jsParseBits.get("js_user_agent_v3") or None + else: + for uaParser in USER_AGENT_PARSERS: + family, v1, v2, v3 = uaParser.Parse(user_agent_string) + if family: + break + + # Override for Chrome Frame IFF Chrome is enabled. + if "js_user_agent_string" in jsParseBits: + js_user_agent_string = jsParseBits["js_user_agent_string"] + if ( + js_user_agent_string + and js_user_agent_string.find("Chrome/") > -1 + and user_agent_string.find("chromeframe") > -1 + ): + jsOverride = {} + jsOverride = ParseUserAgent(js_user_agent_string) + family = "Chrome Frame (%s %s)" % (family, v1) + v1 = jsOverride["major"] + v2 = jsOverride["minor"] + v3 = jsOverride["patch"] + + family = family or "Other" + return { + "family": family, + "major": v1 or None, + "minor": v2 or None, + "patch": v3 or None, + } + + +def ParseOS(user_agent_string, **jsParseBits): + """ Parses the user-agent string for operating system info + Args: + user_agent_string: The full user-agent string. + jsParseBits: javascript override bits. + Returns: + A dictionary containing parsed bits. + """ + for osParser in OS_PARSERS: + os, os_v1, os_v2, os_v3, os_v4 = osParser.Parse(user_agent_string) + if os: + break + os = os or "Other" + return { + "family": os, + "major": os_v1, + "minor": os_v2, + "patch": os_v3, + "patch_minor": os_v4, + } + + +def ParseDevice(user_agent_string): + """ Parses the user-agent string for device info. + Args: + user_agent_string: The full user-agent string. + ua_family: The parsed user agent family name. + Returns: + A dictionary containing parsed bits. + """ + for deviceParser in DEVICE_PARSERS: + device, brand, model = deviceParser.Parse(user_agent_string) + if device: + break + + if device is None: + device = "Other" + + return {"family": device, "brand": brand, "model": model} + + +def PrettyUserAgent(family, v1=None, v2=None, v3=None): + """Pretty user agent string.""" + if v3: + if v3[0].isdigit(): + return "%s %s.%s.%s" % (family, v1, v2, v3) + else: + return "%s %s.%s%s" % (family, v1, v2, v3) + elif v2: + return "%s %s.%s" % (family, v1, v2) + elif v1: + return "%s %s" % (family, v1) + return family + + +def PrettyOS(os, os_v1=None, os_v2=None, os_v3=None, os_v4=None): + """Pretty os string.""" + if os_v4: + return "%s %s.%s.%s.%s" % (os, os_v1, os_v2, os_v3, os_v4) + if os_v3: + if os_v3[0].isdigit(): + return "%s %s.%s.%s" % (os, os_v1, os_v2, os_v3) + else: + return "%s %s.%s%s" % (os, os_v1, os_v2, os_v3) + elif os_v2: + return "%s %s.%s" % (os, os_v1, os_v2) + elif os_v1: + return "%s %s" % (os, os_v1) + return os + + +def ParseWithJSOverrides( + user_agent_string, + js_user_agent_string=None, + js_user_agent_family=None, + js_user_agent_v1=None, + js_user_agent_v2=None, + js_user_agent_v3=None, +): + """ backwards compatible. use one of the other Parse methods instead! """ + + # Override via JS properties. + if js_user_agent_family is not None and js_user_agent_family != "": + family = js_user_agent_family + v1 = None + v2 = None + v3 = None + if js_user_agent_v1 is not None: + v1 = js_user_agent_v1 + if js_user_agent_v2 is not None: + v2 = js_user_agent_v2 + if js_user_agent_v3 is not None: + v3 = js_user_agent_v3 + else: + for parser in USER_AGENT_PARSERS: + family, v1, v2, v3 = parser.Parse(user_agent_string) + if family: + break + + # Override for Chrome Frame IFF Chrome is enabled. + if ( + js_user_agent_string + and js_user_agent_string.find("Chrome/") > -1 + and user_agent_string.find("chromeframe") > -1 + ): + family = "Chrome Frame (%s %s)" % (family, v1) + ua_dict = ParseUserAgent(js_user_agent_string) + v1 = ua_dict["major"] + v2 = ua_dict["minor"] + v3 = ua_dict["patch"] + + return family or "Other", v1, v2, v3 + + +def Pretty(family, v1=None, v2=None, v3=None): + """ backwards compatible. use PrettyUserAgent instead! """ + if v3: + if v3[0].isdigit(): + return "%s %s.%s.%s" % (family, v1, v2, v3) + else: + return "%s %s.%s%s" % (family, v1, v2, v3) + elif v2: + return "%s %s.%s" % (family, v1, v2) + elif v1: + return "%s %s" % (family, v1) + return family + + +def GetFilters( + user_agent_string, + js_user_agent_string=None, + js_user_agent_family=None, + js_user_agent_v1=None, + js_user_agent_v2=None, + js_user_agent_v3=None, +): + """Return the optional arguments that should be saved and used to query. + + js_user_agent_string is always returned if it is present. We really only need + it for Chrome Frame. However, I added it in the generally case to find other + cases when it is different. When the recording of js_user_agent_string was + added, we created new records for all new user agents. + + Since we only added js_document_mode for the IE 9 preview case, it did not + cause new user agent records the way js_user_agent_string did. + + js_document_mode has since been removed in favor of individual property + overrides. + + Args: + user_agent_string: The full user-agent string. + js_user_agent_string: JavaScript ua string from client-side + js_user_agent_family: This is an override for the family name to deal + with the fact that IE platform preview (for instance) cannot be + distinguished by user_agent_string, but only in javascript. + js_user_agent_v1: v1 override - see above. + js_user_agent_v2: v1 override - see above. + js_user_agent_v3: v1 override - see above. + Returns: + {js_user_agent_string: '[...]', js_family_name: '[...]', etc...} + """ + filters = {} + filterdict = { + "js_user_agent_string": js_user_agent_string, + "js_user_agent_family": js_user_agent_family, + "js_user_agent_v1": js_user_agent_v1, + "js_user_agent_v2": js_user_agent_v2, + "js_user_agent_v3": js_user_agent_v3, + } + for key, value in filterdict.items(): + if value is not None and value != "": + filters[key] = value + return filters + + +# Build the list of user agent parsers from YAML +UA_PARSER_YAML = os.environ.get("UA_PARSER_YAML") +if UA_PARSER_YAML: + # This will raise an ImportError if missing, obviously since it's no + # longer a requirement + import yaml + + try: + # Try and use libyaml bindings if available since faster + from yaml import CSafeLoader as SafeLoader + except ImportError: + from yaml import SafeLoader + + with open(UA_PARSER_YAML) as fp: + regexes = yaml.load(fp, Loader=SafeLoader) + + USER_AGENT_PARSERS = [] + for _ua_parser in regexes["user_agent_parsers"]: + _regex = _ua_parser["regex"] + + _family_replacement = _ua_parser.get("family_replacement") + _v1_replacement = _ua_parser.get("v1_replacement") + _v2_replacement = _ua_parser.get("v2_replacement") + + USER_AGENT_PARSERS.append( + UserAgentParser( + _regex, _family_replacement, _v1_replacement, _v2_replacement + ) + ) + + OS_PARSERS = [] + for _os_parser in regexes["os_parsers"]: + _regex = _os_parser["regex"] + + _os_replacement = _os_parser.get("os_replacement") + _os_v1_replacement = _os_parser.get("os_v1_replacement") + _os_v2_replacement = _os_parser.get("os_v2_replacement") + _os_v3_replacement = _os_parser.get("os_v3_replacement") + _os_v4_replacement = _os_parser.get("os_v4_replacement") + + OS_PARSERS.append( + OSParser( + _regex, + _os_replacement, + _os_v1_replacement, + _os_v2_replacement, + _os_v3_replacement, + _os_v4_replacement, + ) + ) + + DEVICE_PARSERS = [] + for _device_parser in regexes["device_parsers"]: + _regex = _device_parser["regex"] + + _regex_flag = _device_parser.get("regex_flag") + _device_replacement = _device_parser.get("device_replacement") + _brand_replacement = _device_parser.get("brand_replacement") + _model_replacement = _device_parser.get("model_replacement") + + DEVICE_PARSERS.append( + DeviceParser( + _regex, + _regex_flag, + _device_replacement, + _brand_replacement, + _model_replacement, + ) + ) + + # Clean our our temporary vars explicitly + # so they can't be reused or imported + del regexes + del yaml + del SafeLoader +else: + # Just load our pre-compiled versions + from ._regexes import USER_AGENT_PARSERS, DEVICE_PARSERS, OS_PARSERS diff --git a/app_common/lib/ua_parser/user_agent_parser_test.py b/app_common/lib/ua_parser/user_agent_parser_test.py new file mode 100644 index 00000000..c73d742b --- /dev/null +++ b/app_common/lib/ua_parser/user_agent_parser_test.py @@ -0,0 +1,290 @@ +#!/usr/bin/python2.5 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the 'License') +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an 'AS IS' BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +"""User Agent Parser Unit Tests. +Run: +# python -m user_agent_parser_test (runs all the tests, takes awhile) +or like: +# python -m user_agent_parser_test ParseTest.testBrowserscopeStrings +""" + + +from __future__ import unicode_literals, absolute_import + +__author__ = "slamm@google.com (Stephen Lamm)" + +import os +import re +import unittest +import yaml + +try: + # Try and use libyaml bindings if available since faster + from yaml import CSafeLoader as SafeLoader +except ImportError: + from yaml import SafeLoader + +from ua_parser import user_agent_parser + +TEST_RESOURCES_DIR = os.path.join( + os.path.abspath(os.path.dirname(__file__)), "../uap-core" +) + + +class ParseTest(unittest.TestCase): + def testBrowserscopeStrings(self): + self.runUserAgentTestsFromYAML( + os.path.join(TEST_RESOURCES_DIR, "tests/test_ua.yaml") + ) + + def testBrowserscopeStringsOS(self): + self.runOSTestsFromYAML(os.path.join(TEST_RESOURCES_DIR, "tests/test_os.yaml")) + + def testStringsOS(self): + self.runOSTestsFromYAML( + os.path.join(TEST_RESOURCES_DIR, "test_resources/additional_os_tests.yaml") + ) + + def testStringsDevice(self): + self.runDeviceTestsFromYAML( + os.path.join(TEST_RESOURCES_DIR, "tests/test_device.yaml") + ) + + def testMozillaStrings(self): + self.runUserAgentTestsFromYAML( + os.path.join( + TEST_RESOURCES_DIR, "test_resources/firefox_user_agent_strings.yaml" + ) + ) + + # NOTE: The YAML file used here is one output by makePGTSComparisonYAML() + # below, as opposed to the pgts_browser_list-orig.yaml file. The -orig + # file is by no means perfect, but identifies many browsers that we + # classify as "Other". This test itself is mostly useful to know when + # somthing in UA parsing changes. An effort should be made to try and + # reconcile the differences between the two YAML files. + def testPGTSStrings(self): + self.runUserAgentTestsFromYAML( + os.path.join(TEST_RESOURCES_DIR, "test_resources/pgts_browser_list.yaml") + ) + + def testParseAll(self): + user_agent_string = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; fr; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5,gzip(gfe),gzip(gfe)" + expected = { + "device": {"family": "Mac", "brand": "Apple", "model": "Mac"}, + "os": { + "family": "Mac OS X", + "major": "10", + "minor": "4", + "patch": None, + "patch_minor": None, + }, + "user_agent": { + "family": "Firefox", + "major": "3", + "minor": "5", + "patch": "5", + }, + "string": user_agent_string, + } + + result = user_agent_parser.Parse(user_agent_string) + self.assertEqual( + result, + expected, + "UA: {0}\n expected<{1}> != actual<{2}>".format( + user_agent_string, expected, result + ), + ) + + # Make a YAML file for manual comparsion with pgts_browser_list-orig.yaml + def makePGTSComparisonYAML(self): + import codecs + + outfile = codecs.open("outfile.yaml", "w", "utf-8") + print >> outfile, "test_cases:" + + yamlFile = open(os.path.join(TEST_RESOURCES_DIR, "pgts_browser_list.yaml")) + yamlContents = yaml.load(yamlFile, Loader=SafeLoader) + yamlFile.close() + + for test_case in yamlContents["test_cases"]: + user_agent_string = test_case["user_agent_string"] + kwds = {} + if "js_ua" in test_case: + kwds = eval(test_case["js_ua"]) + + (family, major, minor, patch) = user_agent_parser.ParseUserAgent( + user_agent_string, **kwds + ) + + # Escape any double-quotes in the UA string + user_agent_string = re.sub(r'"', '\\"', user_agent_string) + print >> outfile, ' - user_agent_string: "' + user_agent_string + '"' + "\n" + ' family: "' + family + '"\n' + " major: " + ( + "" if (major is None) else "'" + major + "'" + ) + "\n" + " minor: " + ( + "" if (minor is None) else "'" + minor + "'" + ) + "\n" + " patch: " + ( + "" if (patch is None) else "'" + patch + "'" + ) + outfile.close() + + # Run a set of test cases from a YAML file + def runUserAgentTestsFromYAML(self, file_name): + yamlFile = open(os.path.join(TEST_RESOURCES_DIR, file_name)) + yamlContents = yaml.load(yamlFile, Loader=SafeLoader) + yamlFile.close() + + for test_case in yamlContents["test_cases"]: + # Inputs to Parse() + user_agent_string = test_case["user_agent_string"] + kwds = {} + if "js_ua" in test_case: + kwds = eval(test_case["js_ua"]) + + # The expected results + expected = { + "family": test_case["family"], + "major": test_case["major"], + "minor": test_case["minor"], + "patch": test_case["patch"], + } + + result = {} + result = user_agent_parser.ParseUserAgent(user_agent_string, **kwds) + self.assertEqual( + result, + expected, + "UA: {0}\n expected<{1}, {2}, {3}, {4}> != actual<{5}, {6}, {7}, {8}>".format( + user_agent_string, + expected["family"], + expected["major"], + expected["minor"], + expected["patch"], + result["family"], + result["major"], + result["minor"], + result["patch"], + ), + ) + + def runOSTestsFromYAML(self, file_name): + yamlFile = open(os.path.join(TEST_RESOURCES_DIR, file_name)) + yamlContents = yaml.load(yamlFile, Loader=SafeLoader) + yamlFile.close() + + for test_case in yamlContents["test_cases"]: + # Inputs to Parse() + user_agent_string = test_case["user_agent_string"] + kwds = {} + if "js_ua" in test_case: + kwds = eval(test_case["js_ua"]) + + # The expected results + expected = { + "family": test_case["family"], + "major": test_case["major"], + "minor": test_case["minor"], + "patch": test_case["patch"], + "patch_minor": test_case["patch_minor"], + } + + result = user_agent_parser.ParseOS(user_agent_string, **kwds) + self.assertEqual( + result, + expected, + "UA: {0}\n expected<{1} {2} {3} {4} {5}> != actual<{6} {7} {8} {9} {10}>".format( + user_agent_string, + expected["family"], + expected["major"], + expected["minor"], + expected["patch"], + expected["patch_minor"], + result["family"], + result["major"], + result["minor"], + result["patch"], + result["patch_minor"], + ), + ) + + def runDeviceTestsFromYAML(self, file_name): + yamlFile = open(os.path.join(TEST_RESOURCES_DIR, file_name)) + yamlContents = yaml.load(yamlFile, Loader=SafeLoader) + yamlFile.close() + + for test_case in yamlContents["test_cases"]: + # Inputs to Parse() + user_agent_string = test_case["user_agent_string"] + kwds = {} + if "js_ua" in test_case: + kwds = eval(test_case["js_ua"]) + + # The expected results + expected = { + "family": test_case["family"], + "brand": test_case["brand"], + "model": test_case["model"], + } + + result = user_agent_parser.ParseDevice(user_agent_string, **kwds) + self.assertEqual( + result, + expected, + "UA: {0}\n expected<{1} {2} {3}> != actual<{4} {5} {6}>".format( + user_agent_string, + expected["family"], + expected["brand"], + expected["model"], + result["family"], + result["brand"], + result["model"], + ), + ) + + +class GetFiltersTest(unittest.TestCase): + def testGetFiltersNoMatchesGiveEmptyDict(self): + user_agent_string = "foo" + filters = user_agent_parser.GetFilters( + user_agent_string, js_user_agent_string=None + ) + self.assertEqual({}, filters) + + def testGetFiltersJsUaPassedThrough(self): + user_agent_string = "foo" + filters = user_agent_parser.GetFilters( + user_agent_string, js_user_agent_string="bar" + ) + self.assertEqual({"js_user_agent_string": "bar"}, filters) + + def testGetFiltersJsUserAgentFamilyAndVersions(self): + user_agent_string = ( + "Mozilla/4.0 (compatible; MSIE 8.0; " + "Windows NT 5.1; Trident/4.0; GTB6; .NET CLR 2.0.50727; " + ".NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)" + ) + filters = user_agent_parser.GetFilters( + user_agent_string, js_user_agent_string="bar", js_user_agent_family="foo" + ) + self.assertEqual( + {"js_user_agent_string": "bar", "js_user_agent_family": "foo"}, filters + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/app_common/lib/user_agents/__init__.py b/app_common/lib/user_agents/__init__.py new file mode 100644 index 00000000..e47740f2 --- /dev/null +++ b/app_common/lib/user_agents/__init__.py @@ -0,0 +1,3 @@ +VERSION = (2, 2, 0) + +from .parsers import parse diff --git a/app_common/lib/user_agents/compat.py b/app_common/lib/user_agents/compat.py new file mode 100644 index 00000000..c4d1a247 --- /dev/null +++ b/app_common/lib/user_agents/compat.py @@ -0,0 +1,14 @@ +import sys + +PY3 = sys.version_info[0] == 3 + +if PY3: + string_types = str + + def iteritems(d, **kw): + return iter(d.items(**kw)) +else: + string_types = basestring + + def iteritems(d, **kw): + return iter(d.iteritems(**kw)) diff --git a/app_common/lib/user_agents/parsers.py b/app_common/lib/user_agents/parsers.py new file mode 100644 index 00000000..7c309697 --- /dev/null +++ b/app_common/lib/user_agents/parsers.py @@ -0,0 +1,268 @@ +from collections import namedtuple + +from ..ua_parser import user_agent_parser +from .compat import string_types + + +MOBILE_DEVICE_FAMILIES = ( + 'iPhone', + 'iPod', + 'Generic Smartphone', + 'Generic Feature Phone', + 'PlayStation Vita', + 'iOS-Device' +) + +PC_OS_FAMILIES = ( + 'Windows 95', + 'Windows 98', + 'Solaris', +) + +MOBILE_OS_FAMILIES = ( + 'Windows Phone', + 'Windows Phone OS', # Earlier versions of ua-parser returns Windows Phone OS + 'Symbian OS', + 'Bada', + 'Windows CE', + 'Windows Mobile', + 'Maemo', +) + +MOBILE_BROWSER_FAMILIES = ( + 'IE Mobile', + 'Opera Mobile', + 'Opera Mini', + 'Chrome Mobile', + 'Chrome Mobile WebView', + 'Chrome Mobile iOS', +) + +TABLET_DEVICE_FAMILIES = ( + 'iPad', + 'BlackBerry Playbook', + 'Blackberry Playbook', # Earlier versions of ua-parser returns "Blackberry" instead of "BlackBerry" + 'Kindle', + 'Kindle Fire', + 'Kindle Fire HD', + 'Galaxy Tab', + 'Xoom', + 'Dell Streak', +) + +TOUCH_CAPABLE_OS_FAMILIES = ( + 'iOS', + 'Android', + 'Windows Phone', + 'Windows CE', + 'Windows Mobile', + 'Firefox OS', + 'MeeGo', +) + +TOUCH_CAPABLE_DEVICE_FAMILIES = ( + 'BlackBerry Playbook', + 'Blackberry Playbook', + 'Kindle Fire', +) + +EMAIL_PROGRAM_FAMILIES = set(( + 'Outlook', + 'Windows Live Mail', + 'AirMail', + 'Apple Mail', + 'Outlook', + 'Thunderbird', + 'Lightning', + 'ThunderBrowse', + 'Windows Live Mail', + 'The Bat!', + 'Lotus Notes', + 'IBM Notes', + 'Barca', + 'MailBar', + 'kmail2', + 'YahooMobileMail' +)) + +def verify_attribute(attribute): + if isinstance(attribute, string_types) and attribute.isdigit(): + return int(attribute) + + return attribute + + +def parse_version(major=None, minor=None, patch=None, patch_minor=None): + # Returns version number tuple, attributes will be integer if they're numbers + major = verify_attribute(major) + minor = verify_attribute(minor) + patch = verify_attribute(patch) + patch_minor = verify_attribute(patch_minor) + + return tuple( + filter(lambda x: x is not None, (major, minor, patch, patch_minor)) + ) + + +Browser = namedtuple('Browser', ['family', 'version', 'version_string']) + + +def parse_browser(family, major=None, minor=None, patch=None, patch_minor=None): + # Returns a browser object + version = parse_version(major, minor, patch) + version_string = '.'.join([str(v) for v in version]) + return Browser(family, version, version_string) + + +OperatingSystem = namedtuple('OperatingSystem', ['family', 'version', 'version_string']) + + +def parse_operating_system(family, major=None, minor=None, patch=None, patch_minor=None): + version = parse_version(major, minor, patch) + version_string = '.'.join([str(v) for v in version]) + return OperatingSystem(family, version, version_string) + + +Device = namedtuple('Device', ['family', 'brand', 'model']) + + +def parse_device(family, brand, model): + return Device(family, brand, model) + + +class UserAgent(object): + + def __init__(self, user_agent_string): + ua_dict = user_agent_parser.Parse(user_agent_string) + self.ua_string = user_agent_string + self.os = parse_operating_system(**ua_dict['os']) + self.browser = parse_browser(**ua_dict['user_agent']) + self.device = parse_device(**ua_dict['device']) + + def __str__(self): + return "{device} / {os} / {browser}".format( + device=self.get_device(), + os=self.get_os(), + browser=self.get_browser() + ) + + def __unicode__(self): + return unicode(str(self)) + + def _is_android_tablet(self): + # Newer Android tablets don't have "Mobile" in their user agent string, + # older ones like Galaxy Tab still have "Mobile" though they're not + if ('Mobile Safari' not in self.ua_string and + self.browser.family != "Firefox Mobile"): + return True + return False + + def _is_blackberry_touch_capable_device(self): + # A helper to determine whether a BB phone has touch capabilities + # Blackberry Bold Touch series begins with 99XX + if 'Blackberry 99' in self.device.family: + return True + if 'Blackberry 95' in self.device.family: # BB Storm devices + return True + return False + + def get_device(self): + return self.is_pc and "PC" or self.device.family + + def get_os(self): + return ("%s %s" % (self.os.family, self.os.version_string)).strip() + + def get_browser(self): + return ("%s %s" % (self.browser.family, self.browser.version_string)).strip() + + @property + def is_tablet(self): + if self.device.family in TABLET_DEVICE_FAMILIES: + return True + if (self.os.family == 'Android' and self._is_android_tablet()): + return True + if self.os.family == 'Windows' and self.os.version_string.startswith('RT'): + return True + if self.os.family == 'Firefox OS' and 'Mobile' not in self.browser.family: + return True + return False + + @property + def is_mobile(self): + # First check for mobile device and mobile browser families + if self.device.family in MOBILE_DEVICE_FAMILIES: + return True + if self.browser.family in MOBILE_BROWSER_FAMILIES: + return True + # Device is considered Mobile OS is Android and not tablet + # This is not fool proof but would have to suffice for now + if ((self.os.family == 'Android' or self.os.family == 'Firefox OS') + and not self.is_tablet): + return True + if self.os.family == 'BlackBerry OS' and self.device.family != 'Blackberry Playbook': + return True + if self.os.family in MOBILE_OS_FAMILIES: + return True + # TODO: remove after https://github.com/tobie/ua-parser/issues/126 is closed + if 'J2ME' in self.ua_string or 'MIDP' in self.ua_string: + return True + # This is here mainly to detect Google's Mobile Spider + if 'iPhone;' in self.ua_string: + return True + if 'Googlebot-Mobile' in self.ua_string: + return True + # Mobile Spiders should be identified as mobile + if self.device.family == 'Spider' and 'Mobile' in self.browser.family: + return True + # Nokia mobile + if 'NokiaBrowser' in self.ua_string and 'Mobile' in self.ua_string: + return True + return False + + @property + def is_touch_capable(self): + # TODO: detect touch capable Nokia devices + if self.os.family in TOUCH_CAPABLE_OS_FAMILIES: + return True + if self.device.family in TOUCH_CAPABLE_DEVICE_FAMILIES: + return True + if self.os.family == 'Windows': + if self.os.version_string.startswith(('RT', 'CE')): + return True + if self.os.version_string.startswith('8') and 'Touch' in self.ua_string: + return True + if 'BlackBerry' in self.os.family and self._is_blackberry_touch_capable_device(): + return True + return False + + @property + def is_pc(self): + # Returns True for "PC" devices (Windows, Mac and Linux) + if 'Windows NT' in self.ua_string or self.os.family in PC_OS_FAMILIES or \ + self.os.family == 'Windows' and self.os.version_string == 'ME': + return True + # TODO: remove after https://github.com/tobie/ua-parser/issues/127 is closed + if self.os.family == 'Mac OS X' and 'Silk' not in self.ua_string: + return True + # Maemo has 'Linux' and 'X11' in UA, but it is not for PC + if 'Maemo' in self.ua_string: + return False + if 'Chrome OS' in self.os.family: + return True + if 'Linux' in self.ua_string and 'X11' in self.ua_string: + return True + return False + + @property + def is_bot(self): + return True if self.device.family == 'Spider' else False + + @property + def is_email_client(self): + if self.browser.family in EMAIL_PROGRAM_FAMILIES: + return True + return False + + +def parse(user_agent_string): + return UserAgent(user_agent_string) diff --git a/app_common/lib/user_agents/tests.py b/app_common/lib/user_agents/tests.py new file mode 100644 index 00000000..345cf827 --- /dev/null +++ b/app_common/lib/user_agents/tests.py @@ -0,0 +1,268 @@ +import json +import os +import unittest + +from ua_parser import user_agent_parser +from . import compat +from .parsers import parse + + +iphone_ua_string = 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B179 Safari/7534.48.3' +ipad_ua_string = 'Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10' +galaxy_tab_ua_string = 'Mozilla/5.0 (Linux; U; Android 2.2; en-us; SCH-I800 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' +galaxy_s3_ua_string = 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' +kindle_fire_ua_string = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.1.0-80) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true' +playbook_ua_string = 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.0.1; en-US) AppleWebKit/535.8+ (KHTML, like Gecko) Version/7.2.0.1 Safari/535.8+' +nexus_7_ua_string = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' +windows_phone_ua_string = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SGH-i917)' +blackberry_torch_ua_string = 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; zh-TW) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.448 Mobile Safari/534.8+' +blackberry_bold_ua_string = 'BlackBerry9700/5.0.0.862 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/331 UNTRUSTED/1.0 3gpp-gba' +blackberry_bold_touch_ua_string = 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9930; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.241 Mobile Safari/534.11+' +windows_rt_ua_string = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)' +j2me_opera_ua_string = 'Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (J2ME/22.478; U; en) Presto/2.5.25 Version/10.54' +ie_ua_string = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)' +ie_touch_ua_string = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0; Touch)' +mac_safari_ua_string = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.13+ (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2' +windows_ie_ua_string = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)' +ubuntu_firefox_ua_string = 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1' +google_bot_ua_string = 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)' +nokia_n97_ua_string = 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/12.0.024; Profile/MIDP-2.1 Configuration/CLDC-1.1; en-us) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.12344' +android_firefox_aurora_ua_string = 'Mozilla/5.0 (Android; Mobile; rv:27.0) Gecko/27.0 Firefox/27.0' +thunderbird_ua_string = 'Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.2.0 Lightning/4.0.2' +outlook_usa_string = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0; Microsoft Outlook 15.0.4420)' +chromebook_ua_string = 'Mozilla/5.0 (X11; CrOS i686 0.12.433) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.77 Safari/534.30' + +iphone_ua = parse(iphone_ua_string) +ipad_ua = parse(ipad_ua_string) +galaxy_tab = parse(galaxy_tab_ua_string) +galaxy_s3_ua = parse(galaxy_s3_ua_string) +kindle_fire_ua = parse(kindle_fire_ua_string) +playbook_ua = parse(playbook_ua_string) +nexus_7_ua = parse(nexus_7_ua_string) +windows_phone_ua = parse(windows_phone_ua_string) +windows_rt_ua = parse(windows_rt_ua_string) +blackberry_torch_ua = parse(blackberry_torch_ua_string) +blackberry_bold_ua = parse(blackberry_bold_ua_string) +blackberry_bold_touch_ua = parse(blackberry_bold_touch_ua_string) +j2me_opera_ua = parse(j2me_opera_ua_string) +ie_ua = parse(ie_ua_string) +ie_touch_ua = parse(ie_touch_ua_string) +mac_safari_ua = parse(mac_safari_ua_string) +windows_ie_ua = parse(windows_ie_ua_string) +ubuntu_firefox_ua = parse(ubuntu_firefox_ua_string) +google_bot_ua = parse(google_bot_ua_string) +nokia_n97_ua = parse(nokia_n97_ua_string) +android_firefox_aurora_ua = parse(android_firefox_aurora_ua_string) +thunderbird_ua = parse(thunderbird_ua_string) +outlook_ua = parse(outlook_usa_string) +chromebook_ua = parse(chromebook_ua_string) + + +class UserAgentsTest(unittest.TestCase): + + def test_user_agent_object_assignments(self): + ua_dict = user_agent_parser.Parse(devices['iphone']['ua_string']) + iphone_ua = devices['iphone']['user_agent'] + + # Ensure browser attributes are assigned correctly + self.assertEqual(iphone_ua.browser.family, + ua_dict['user_agent']['family']) + self.assertEqual( + iphone_ua.browser.version, + (int(ua_dict['user_agent']['major']), + int(ua_dict['user_agent']['minor'])) + ) + + # Ensure os attributes are assigned correctly + self.assertEqual(iphone_ua.os.family, ua_dict['os']['family']) + self.assertEqual( + iphone_ua.os.version, + (int(ua_dict['os']['major']), int(ua_dict['os']['minor'])) + ) + + # Ensure device attributes are assigned correctly + self.assertEqual(iphone_ua.device.family, + ua_dict['device']['family']) + + def test_is_tablet_property(self): + self.assertFalse(iphone_ua.is_tablet) + self.assertFalse(galaxy_s3_ua.is_tablet) + self.assertFalse(blackberry_torch_ua.is_tablet) + self.assertFalse(blackberry_bold_ua.is_tablet) + self.assertFalse(windows_phone_ua.is_tablet) + self.assertFalse(ie_ua.is_tablet) + self.assertFalse(ie_touch_ua.is_tablet) + self.assertFalse(mac_safari_ua.is_tablet) + self.assertFalse(windows_ie_ua.is_tablet) + self.assertFalse(ubuntu_firefox_ua.is_tablet) + self.assertFalse(j2me_opera_ua.is_tablet) + self.assertFalse(google_bot_ua.is_tablet) + self.assertFalse(nokia_n97_ua.is_tablet) + self.assertTrue(windows_rt_ua.is_tablet) + self.assertTrue(ipad_ua.is_tablet) + self.assertTrue(playbook_ua.is_tablet) + self.assertTrue(kindle_fire_ua.is_tablet) + self.assertTrue(nexus_7_ua.is_tablet) + self.assertFalse(android_firefox_aurora_ua.is_tablet) + + def test_is_mobile_property(self): + self.assertTrue(iphone_ua.is_mobile) + self.assertTrue(galaxy_s3_ua.is_mobile) + self.assertTrue(blackberry_torch_ua.is_mobile) + self.assertTrue(blackberry_bold_ua.is_mobile) + self.assertTrue(windows_phone_ua.is_mobile) + self.assertTrue(j2me_opera_ua.is_mobile) + self.assertTrue(nokia_n97_ua.is_mobile) + self.assertFalse(windows_rt_ua.is_mobile) + self.assertFalse(ipad_ua.is_mobile) + self.assertFalse(playbook_ua.is_mobile) + self.assertFalse(kindle_fire_ua.is_mobile) + self.assertFalse(nexus_7_ua.is_mobile) + self.assertFalse(ie_ua.is_mobile) + self.assertFalse(ie_touch_ua.is_mobile) + self.assertFalse(mac_safari_ua.is_mobile) + self.assertFalse(windows_ie_ua.is_mobile) + self.assertFalse(ubuntu_firefox_ua.is_mobile) + self.assertFalse(google_bot_ua.is_mobile) + self.assertTrue(android_firefox_aurora_ua.is_mobile) + + def test_is_touch_property(self): + self.assertTrue(iphone_ua.is_touch_capable) + self.assertTrue(galaxy_s3_ua.is_touch_capable) + self.assertTrue(ipad_ua.is_touch_capable) + self.assertTrue(playbook_ua.is_touch_capable) + self.assertTrue(kindle_fire_ua.is_touch_capable) + self.assertTrue(nexus_7_ua.is_touch_capable) + self.assertTrue(windows_phone_ua.is_touch_capable) + self.assertTrue(ie_touch_ua.is_touch_capable) + self.assertTrue(blackberry_bold_touch_ua.is_mobile) + self.assertTrue(blackberry_torch_ua.is_mobile) + self.assertFalse(j2me_opera_ua.is_touch_capable) + self.assertFalse(ie_ua.is_touch_capable) + self.assertFalse(blackberry_bold_ua.is_touch_capable) + self.assertFalse(mac_safari_ua.is_touch_capable) + self.assertFalse(windows_ie_ua.is_touch_capable) + self.assertFalse(ubuntu_firefox_ua.is_touch_capable) + self.assertFalse(google_bot_ua.is_touch_capable) + self.assertFalse(nokia_n97_ua.is_touch_capable) + self.assertTrue(android_firefox_aurora_ua.is_touch_capable) + + def test_is_pc(self): + self.assertFalse(iphone_ua.is_pc) + self.assertFalse(galaxy_s3_ua.is_pc) + self.assertFalse(ipad_ua.is_pc) + self.assertFalse(playbook_ua.is_pc) + self.assertFalse(kindle_fire_ua.is_pc) + self.assertFalse(nexus_7_ua.is_pc) + self.assertFalse(windows_phone_ua.is_pc) + self.assertFalse(blackberry_bold_touch_ua.is_pc) + self.assertFalse(blackberry_torch_ua.is_pc) + self.assertFalse(blackberry_bold_ua.is_pc) + self.assertFalse(j2me_opera_ua.is_pc) + self.assertFalse(google_bot_ua.is_pc) + self.assertFalse(nokia_n97_ua.is_pc) + self.assertTrue(mac_safari_ua.is_pc) + self.assertTrue(windows_ie_ua.is_pc) + self.assertTrue(ubuntu_firefox_ua.is_pc) + self.assertTrue(ie_touch_ua.is_pc) + self.assertTrue(ie_ua.is_pc) + self.assertFalse(android_firefox_aurora_ua.is_pc) + self.assertTrue(chromebook_ua.is_pc) + + def test_is_bot(self): + self.assertTrue(google_bot_ua.is_bot) + self.assertFalse(iphone_ua.is_bot) + self.assertFalse(galaxy_s3_ua.is_bot) + self.assertFalse(ipad_ua.is_bot) + self.assertFalse(playbook_ua.is_bot) + self.assertFalse(kindle_fire_ua.is_bot) + self.assertFalse(nexus_7_ua.is_bot) + self.assertFalse(windows_phone_ua.is_bot) + self.assertFalse(blackberry_bold_touch_ua.is_bot) + self.assertFalse(blackberry_torch_ua.is_bot) + self.assertFalse(blackberry_bold_ua.is_bot) + self.assertFalse(j2me_opera_ua.is_bot) + self.assertFalse(mac_safari_ua.is_bot) + self.assertFalse(windows_ie_ua.is_bot) + self.assertFalse(ubuntu_firefox_ua.is_bot) + self.assertFalse(ie_touch_ua.is_bot) + self.assertFalse(ie_ua.is_bot) + self.assertFalse(nokia_n97_ua.is_bot) + self.assertFalse(android_firefox_aurora_ua.is_bot) + + def test_is_email_client(self): + self.assertTrue(thunderbird_ua.is_email_client) + self.assertTrue(outlook_ua.is_email_client) + self.assertFalse(playbook_ua.is_email_client) + self.assertFalse(kindle_fire_ua.is_email_client) + self.assertFalse(nexus_7_ua.is_email_client) + self.assertFalse(windows_phone_ua.is_email_client) + self.assertFalse(blackberry_bold_touch_ua.is_email_client) + self.assertFalse(blackberry_torch_ua.is_email_client) + self.assertFalse(blackberry_bold_ua.is_email_client) + self.assertFalse(j2me_opera_ua.is_email_client) + self.assertFalse(mac_safari_ua.is_email_client) + self.assertFalse(windows_ie_ua.is_email_client) + self.assertFalse(ubuntu_firefox_ua.is_email_client) + self.assertFalse(ie_touch_ua.is_email_client) + self.assertFalse(ie_ua.is_email_client) + self.assertFalse(nokia_n97_ua.is_email_client) + self.assertFalse(android_firefox_aurora_ua.is_email_client) + + + def test_strings(self): + self.assertEqual(str(iphone_ua), "iPhone / iOS 5.1 / Mobile Safari 5.1") + self.assertEqual(str(ipad_ua), "iPad / iOS 3.2 / Mobile Safari 4.0.4") + self.assertEqual(str(galaxy_tab), "Samsung SCH-I800 / Android 2.2 / Android 2.2") + self.assertEqual(str(galaxy_s3_ua), "Samsung GT-I9300 / Android 4.0.4 / Android 4.0.4") + self.assertEqual(str(kindle_fire_ua), "Kindle / Android / Amazon Silk 1.1.0-80") + self.assertEqual(str(playbook_ua), "BlackBerry Playbook / BlackBerry Tablet OS 2.0.1 / BlackBerry WebKit 2.0.1") + self.assertEqual(str(nexus_7_ua), "Asus Nexus 7 / Android 4.1.1 / Chrome 18.0.1025") + self.assertEqual(str(windows_phone_ua), "Samsung SGH-i917 / Windows Phone 7.5 / IE Mobile 9.0") + self.assertEqual(str(windows_rt_ua), "PC / Windows RT / IE 10.0") + self.assertEqual(str(blackberry_torch_ua), "BlackBerry 9800 / BlackBerry OS 6.0.0 / BlackBerry WebKit 6.0.0") + self.assertEqual(str(blackberry_bold_ua), "BlackBerry 9700 / BlackBerry OS 5.0.0 / BlackBerry 9700") + self.assertEqual(str(blackberry_bold_touch_ua), "BlackBerry 9930 / BlackBerry OS 7.0.0 / BlackBerry WebKit 7.0.0") + self.assertEqual(str(j2me_opera_ua), "Generic Feature Phone / Other / Opera Mini 9.80") + self.assertEqual(str(ie_ua), "PC / Windows 8 / IE 10.0") + self.assertEqual(str(ie_touch_ua), "PC / Windows 8 / IE 10.0") + self.assertEqual(str(mac_safari_ua), "PC / Mac OS X 10.6.8 / WebKit Nightly 537.13") + self.assertEqual(str(windows_ie_ua), "PC / Windows 7 / IE 9.0") + self.assertEqual(str(ubuntu_firefox_ua), "PC / Ubuntu / Firefox 15.0.1") + self.assertEqual(str(google_bot_ua), "Spider / Other / Googlebot 2.1") + self.assertEqual(str(nokia_n97_ua), "Nokia N97 / Symbian OS 9.4 / Nokia Browser 7.1.12344") + self.assertEqual(str(android_firefox_aurora_ua), "Generic Smartphone / Android / Firefox Mobile 27.0") + + def test_unicode_strings(self): + try: + # Python 2 + unicode_ua_str = unicode(devices['iphone']['user_agent']) + self.assertEqual(unicode_ua_str, + u"iPhone / iOS 5.1 / Mobile Safari 5.1") + self.assertTrue(isinstance(unicode_ua_str, unicode)) + except NameError: + # Python 3 + unicode_ua_str = str(devices['iphone']['user_agent']) + self.assertEqual(unicode_ua_str, + "iPhone / iOS 5.1 / Mobile Safari 5.1") + + +with open(os.path.join(os.path.dirname(__file__), 'devices.json')) as f: + devices = json.load(f) + + +def test_wrapper(items): + def test_func(self): + attrs = ('is_bot', 'is_mobile', + 'is_pc', 'is_tablet', 'is_touch_capable') + for attr in attrs: + self.assertEqual( + getattr(items['user_agent'], attr), items[attr], msg=attr) + # Temporarily commenting this out since UserAgent.device + # may return different string depending ua-parser version + # self.assertEqual(str(items['user_agent']), items['str']) + return test_func + +for device, items in compat.iteritems(devices): + items['user_agent'] = parse(items['ua_string']) + setattr(UserAgentsTest, 'test_' + device, test_wrapper(items)) diff --git a/app_common/models/__init__.py b/app_common/models/__init__.py new file mode 100644 index 00000000..2d8fa496 --- /dev/null +++ b/app_common/models/__init__.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# Part of odooai.cn. See LICENSE file for full copyright and licensing details. + +# Created on 2019-04-20 +# author: 欧度智能,http://www.odooai.cn +# email: 300883@qq.com +# resource of odooai +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +# Odoo12在线用户手册(长期更新) +# http://www.odooai.cn/documentation/user/12.0/en/index.html + +# Odoo12在线开发者手册(长期更新) +# http://www.odooai.cn/documentation/12.0/index.html + +# Odoo10在线中文用户手册(长期更新) +# http://www.odooai.cn/documentation/user/10.0/zh_CN/index.html + +# Odoo10离线中文用户手册下载 +# http://www.odooai.cn/odoo10_user_manual_document_offline/ +# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) +# http://www.odooai.cn/odoo10_developer_document_offline/ +# description: + +from . import base +from . import fields +from . import view_validation +from . import ir_ui_view +from . import ir_cron +from . import res_users + + diff --git a/app_common/models/base.py b/app_common/models/base.py new file mode 100644 index 00000000..d997d8c9 --- /dev/null +++ b/app_common/models/base.py @@ -0,0 +1,110 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api, _ +from odoo.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT + +import requests +import base64 +from io import BytesIO + +from datetime import date, datetime, time +import pytz + +import logging + +_logger = logging.getLogger(__name__) + +# 常规的排除的fields +EXCLU_FIELDS = [ + '__last_update', + 'access_token', + 'access_url', + 'access_warning', + 'activity_date_deadline', + 'activity_exception_decoration', + 'activity_exception_icon', + 'activity_ids', + 'activity_state', + 'activity_summary', + 'activity_type_id', + 'activity_user_id', + 'display_name', + 'message_attachment_count', + 'message_channel_ids', + 'message_follower_ids', + 'message_has_error', + 'message_has_error_counter', + 'message_has_sms_error', + 'message_ids', + 'message_is_follower', + 'message_main_attachment_id', + 'message_needaction', + 'message_needaction_counter', + 'message_partner_ids', + 'message_unread', + 'message_unread_counter', + 'website_message_ids', + 'write_date', + 'write_uid', +] + + +class Base(models.AbstractModel): + _inherit = 'base' + + @api.model + def _get_normal_fields(self): + f_list = [] + for k, v in self._fields.items(): + if k not in EXCLU_FIELDS: + f_list.append(k) + return f_list + + @api.model + def _app_get_m2o_default(self, fieldname, domain=[]): + if hasattr(self, fieldname) and self._fields[fieldname].type == 'many2one': + if self._context.get(fieldname) or self._context.get('default_%s' % fieldname): + return self._context.get(fieldname) or self._context.get('default_%s' % fieldname) + else: + rec = self.env[self._fields[fieldname].comodel_name].sudo().search(domain, limit=1) + return rec.id if rec else False + return False + + def _app_dt2local(self, value, return_format=DEFAULT_SERVER_DATETIME_FORMAT): + """ + 将value中时间,按格式转为用户本地时间.如果处理当天,是时间类型直接用 datetime.now(tz) + 输入:str或日期时间类型 + 输出: str + """ + if not value: + return value + if isinstance(value, datetime): + value = value.strftime(DEFAULT_SERVER_DATETIME_FORMAT) + dt = datetime.strptime(value, DEFAULT_SERVER_DATETIME_FORMAT) + user_tz = pytz.timezone(self.env.user.tz or 'Etc/GMT-8') + # _logger.warning('============= user2 tz: %s' % user_tz) + dt = dt.replace(tzinfo=pytz.timezone('UTC')) + return dt.astimezone(user_tz).strftime(return_format) + + def _app_dt2utc(self, value, return_format=DEFAULT_SERVER_DATETIME_FORMAT): + """ + 将value中用户本地时间,按格式转为UTC时间,输出 str + """ + if not value: + return value + if isinstance(value, datetime): + value = value.strftime(DEFAULT_SERVER_DATETIME_FORMAT) + dt = datetime.strptime(value, DEFAULT_SERVER_DATETIME_FORMAT) + pytz_timezone = pytz.timezone('Etc/GMT+8') + dt = dt.replace(tzinfo=pytz.timezone('UTC')) + return dt.astimezone(pytz_timezone).strftime(return_format) + + @api.model + def get_image_from_url(self, url): + if not url: + return None + try: + response = requests.get(url) # 将这个图片保存在内存 + except Exception as e: + return None + # 返回这个图片的base64编码 + return base64.b64encode(BytesIO(response.content).read()) diff --git a/app_common/models/fields.py b/app_common/models/fields.py new file mode 100644 index 00000000..d0149013 --- /dev/null +++ b/app_common/models/fields.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- + +from odoo.fields import Field, resolve_mro +from odoo.fields import Selection as oldSelection +from odoo.tools import merge_sequences +import logging + +_logger = logging.getLogger(__name__) + +# 此处用猴子补丁,热更新,不影响后续继承 +class Selection(Field): + def _setup_attrs_app(self, model, name): + Field._setup_attrs(self, model, name) + + # determine selection (applying 'selection_add' extensions) + values = None + labels = {} + + for field in reversed(resolve_mro(model, name, self._can_setup_from)): + # We cannot use field.selection or field.selection_add here + # because those attributes are overridden by ``_setup_attrs``. + if 'selection' in field.args: + selection = field.args['selection'] + if isinstance(selection, list): + if ( + values is not None + and values != [kv[0] for kv in selection] + ): + _logger.debug("%s: selection=%r overrides existing selection; use selection_add instead", self, selection) + values = [kv[0] for kv in selection] + labels = dict(selection) + else: + self.selection = selection + values = None + labels = {} + + if 'selection_add' in field.args: + selection_add = field.args['selection_add'] + assert isinstance(selection_add, list), \ + "%s: selection_add=%r must be a list" % (self, selection_add) + assert values is not None, \ + "%s: selection_add=%r on non-list selection %r" % (self, selection_add, self.selection) + values = merge_sequences(values, [kv[0] for kv in selection_add]) + labels.update(kv for kv in selection_add if len(kv) == 2) + + if values is not None: + self.selection = [(value, labels[value]) for value in values] + +oldSelection._setup_attrs = Selection._setup_attrs_app \ No newline at end of file diff --git a/app_common/models/ir_cron.py b/app_common/models/ir_cron.py new file mode 100644 index 00000000..0d5955ad --- /dev/null +++ b/app_common/models/ir_cron.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +import logging +from odoo import api, fields, models, modules, tools, _ + +_logger = logging.getLogger(__name__) + +class IrCron(models.Model): + _inherit = "ir.cron" + + trigger_user_id = fields.Many2one('res.users', string='Last Trigger User') + + def method_direct_trigger(self): + self.write({'trigger_user_id': self.env.user.id}) + return super(IrCron, self).method_direct_trigger() diff --git a/app_common/models/ir_ui_view.py b/app_common/models/ir_ui_view.py new file mode 100644 index 00000000..a864de21 --- /dev/null +++ b/app_common/models/ir_ui_view.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- + +from odoo import api, models, tools, SUPERUSER_ID +from odoo.modules.module import get_resource_path +from odoo.tools import view_validation +from odoo.tools.view_validation import _relaxng_cache, validate, _validators +from odoo.tools.safe_eval import safe_eval + +from lxml import etree +import logging +_logger = logging.getLogger(__name__) + +@validate('tree') +def app_valid_field_in_tree(arch, **kwargs): + # 增加 header + return all( + child.tag in ('field', 'button', 'control', 'groupby', 'header') + for child in arch.xpath('/tree/*') + ) + +def app_relaxng(view_type): + """ Return a validator for the given view type, or None. """ + if view_type not in _relaxng_cache: + # tree, search 特殊 + if view_type in ['tree', 'search', 'pivot']: + _file = get_resource_path('app_common', 'rng', '%s_view.rng' % view_type) + else: + _file = get_resource_path('base', 'rng', '%s_view.rng' % view_type) + with tools.file_open(_file) as frng: + try: + relaxng_doc = etree.parse(frng) + _relaxng_cache[view_type] = etree.RelaxNG(relaxng_doc) + except Exception: + _logger.error('Failed to load RelaxNG XML schema for views validation') + _relaxng_cache[view_type] = None + return _relaxng_cache[view_type] + +def app_reset_valid_view(view_type): + _relaxng_cache = view_validation._relaxng_cache + for pred in _validators[view_type]: + # 要pop掉函数 valid_field_in_tree + if pred.__name__ == 'valid_field_in_tree': + _validators[view_type].remove(pred) + try: + _relaxng_cache.pop(view_type, None) + _relaxng_cache[view_type] = None + except Exception: + pass + _relaxng_cache[view_type] = app_relaxng(view_type) + +app_reset_valid_view('tree') +view_validation.valid_field_in_tree = app_valid_field_in_tree +view_validation.relaxng = app_relaxng + +class View(models.Model): + _inherit = 'ir.ui.view' + + def __init__(self, *args, **kwargs): + super(View, self).__init__(*args, **kwargs) + view_validation.relaxng = app_relaxng + # 重置 tree + app_reset_valid_view('tree') + + # todo: 有可能需要处理增加的 header等标签 + # 直接重写原生方法 + # def transfer_node_to_modifiers(node, modifiers, context=None, in_tree_view=False): diff --git a/app_common/models/res_users.py b/app_common/models/res_users.py new file mode 100644 index 00000000..1c18b7ad --- /dev/null +++ b/app_common/models/res_users.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models, tools, _ + + +class ResUsers(models.Model): + _inherit = 'res.users' + + login = fields.Char(index=True) diff --git a/app_common/models/view_validation.py b/app_common/models/view_validation.py new file mode 100644 index 00000000..e6bac36e --- /dev/null +++ b/app_common/models/view_validation.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- + +import ast +from odoo.tools import view_validation +from odoo.tools.view_validation import get_attrs_field_names as old_gafn +from odoo.tools.view_validation import _get_attrs_symbols +import logging + +_logger = logging.getLogger(__name__) + +ATTRS_WITH_FIELD_NAMES2 = { + 'context', + 'domain', + 'decoration-bf', + 'decoration-it', + 'decoration-danger', + 'decoration-info', + 'decoration-muted', + 'decoration-primary', + 'decoration-success', + 'decoration-warning', + 'decoration-black', + 'decoration-white', + 'bg-danger', + 'bg-info', + 'bg-muted', + 'bg-primary', + 'bg-success', + 'bg-warning', + 'bg-black', + 'bg-white', +} + +def app_get_attrs_field_names(env, arch, model, editable): + symbols = _get_attrs_symbols() | {None} + result = [] + + def get_name(node): + """ return the name from an AST node, or None """ + if isinstance(node, ast.Name): + return node.id + + def process_expr(expr, get, key, val): + """ parse `expr` and collect triples """ + for node in ast.walk(ast.parse(expr.strip(), mode='eval')): + name = get(node) + if name not in symbols: + result.append((name, key, val)) + + def add_bg(node, model, editable, get=get_name): + for key, val in node.items(): + if not val: + continue + if key in ATTRS_WITH_FIELD_NAMES2: + process_expr(val, get, key, val) + + res = old_gafn(env, arch, model, editable) + add_bg(arch, model, editable) + res += result + return res + +# 使用猴子补丁方式更新 +view_validation.get_attrs_field_names = app_get_attrs_field_names diff --git a/app_common/report/__init__.py b/app_common/report/__init__.py new file mode 100644 index 00000000..633f8661 --- /dev/null +++ b/app_common/report/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- + diff --git a/app_common/rng/activity_view.rng b/app_common/rng/activity_view.rng new file mode 100644 index 00000000..4560d035 --- /dev/null +++ b/app_common/rng/activity_view.rng @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app_common/rng/calendar_view.rng b/app_common/rng/calendar_view.rng new file mode 100644 index 00000000..ee51acbd --- /dev/null +++ b/app_common/rng/calendar_view.rng @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + year + month + week + day + + + + + + + + + + + + + + diff --git a/app_common/rng/common.rng b/app_common/rng/common.rng new file mode 100644 index 00000000..5aff83fc --- /dev/null +++ b/app_common/rng/common.rng @@ -0,0 +1,448 @@ + + + + + + + + + + + + before + + after + + inside + + replace + + + + + + attributes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app_common/rng/graph_view.rng b/app_common/rng/graph_view.rng new file mode 100644 index 00000000..47f547f0 --- /dev/null +++ b/app_common/rng/graph_view.rng @@ -0,0 +1,39 @@ + + + + + + + + + + + bar + pie + line + pivot + + + + + + + + + + + + + + + + + + + + + diff --git a/app_common/rng/pivot_view.rng b/app_common/rng/pivot_view.rng new file mode 100644 index 00000000..23a77407 --- /dev/null +++ b/app_common/rng/pivot_view.rng @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app_common/rng/search_view.rng b/app_common/rng/search_view.rng new file mode 100644 index 00000000..69a03bfc --- /dev/null +++ b/app_common/rng/search_view.rng @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app_common/rng/search_view_new.rng b/app_common/rng/search_view_new.rng new file mode 100644 index 00000000..cb8ff88d --- /dev/null +++ b/app_common/rng/search_view_new.rng @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app_common/rng/tree_view.rng b/app_common/rng/tree_view.rng new file mode 100644 index 00000000..fd800c55 --- /dev/null +++ b/app_common/rng/tree_view.rng @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + top + bottom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app_common/static/description/banner.png b/app_common/static/description/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..3b9dc5f3bea5a655622bb16802b81a45b7ed96ea GIT binary patch literal 180099 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%0AxAq5vMbh(;R`+0cgpS7 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

rkGg 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ⅆWod&naGQb}63ycP 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 z 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 xe!mqcq^qDs3KcG5@PlDKpwYfu;HS^){Xr zG}!8O(O?|C`q~aZ2hjDqWoD^S#O8ARiKDu+@b$SAXS#RIBJ?l@=fyv*mEp0CRY`rP ztU3DDYDV36dD~baQc&_U{X^ou%ZDo=3JJxKQ26(6T+j}Mo9YvqCPzmr>1C$g^`Kv} zZFWOdNAvwpq`QM6v(W-&)ave)?|5dTRGYO1vC4luyI9z=s_E-)PbWt1jt#|Fa~e!* z{!vGoL~60TnY}tcE5c9UUX>i9BtT;6jPf>ch#niF)#y_$D^JZRlk9C4shaw!tC&kt zT!yE_oy@h_|H)_-WYh=?p9BdusCU*x!6j2l;D*GD>rZM|)Eu6sf3F>2Z4fHl2miEb zqINP)P0u*K!c&j@EAg6%IM=C`6)tq{X}xehBWJ)<(ne9^jL?W{1#hI{sfP6k)JzQm zh-N`(OOs6eZ>DIE;!nXY=KA*^SZ&J)&8310Re_|X?H{MVHK4(+9^=`})E1tW>Q|3{ zx1HR}K9-#SUW@)ZgVWgqwd7y?=3|88G9Id-Pqc=##u3E~NlRJ0(h7-5{(4(|AX06b zMx1nBiA`ba9a`~Q0~)4h7gZ&<9p@k@4S~nnE$RYBb1M^aGaB`v@FNVSm&3Cz8;xT& zhq&jRJWBY`!KrrZ*Ip)GcF8RLb?CTHKeUtPV(9`WDvQVwg0%A^JdCT8_1=EKT+F>m z9`Sd^seacMF0_!qdffuu*O0K8b87%9iqD6o>U*a~dW_4>i9=tw@yW9bMZj>TDZIhl zV4A^1@Nbo@Rnkp3ygopqEiTS5fg!Q%=8P>+MvB9IqI@`HA9fV=`q)PC*p-+fYN#U# zso4_?YlL})8A?)kgiyk(Nrz^VDa9%htdkqAn9*y{B*y(!%9=#tvJZ@GKd^yFWu$3< zAu6MaawOk{n^A5TLy=$P+gV{5(=wS7#qGt@ad59}&S|?`xM$@_5HJXZ_8|CS4u5okc>>(l~V zGk=U1r=}bl;|;@p)qW+eB$R0Ssp*H^B9;9S7^d_fms;Z zw0PiCi-ji^s9>77>tC9bjo}u+(m(`Q4ENe)meR=f@8Saa$??$+ioEgKzw!>d+<`Nq zL`E2y$|Xrs5&FYB&LRzE4qvoS$k zAyR~Ug&x}5j+mmE<^3eLz#2ez{ZzXGJ)isaKRM;h3kIps&o`q=>`2tDEGj<(be zW$7oIo4ms}#C|9^aX~~-;WiE(4oR_KuLrcU3M>?q0KVf{pvRi(T5M+i7{NszcJxQS zsFgFJcVh43HlWH+KnGQ3?f<}vF+upk%cDzBfUET86d03@0mx?)7UxpXC2VGLix{d4 z+(Tlk4IB~-wup);&gpwkcCY^WtHyim_V?Yt{la1WFh2i3Ml|__0D{It6Gk9np)g5l zmo4Q!M_jtJ-!2$%01V8|(dnB_Uj=f+6=)!6D?yVhiewEk+~EE6BJa_Ul4d(xabw?t zzZZP|#Q|U>!v5_po&VSE_Ln&5B*iJha(~pnlxfqjfD6ssP>hY8oXL(!b&L>W4Y1d8 z&)>74afN2L_SLY`L~%id7wRgIs}*oI9RgwY#EN~oHHjvaZ#CqI{}(C>37iYm?UYmu zYdg@a%Fxspae{maE+N{ys>JO%J>`DP-@LuQU@eI5q>V+Scb(hXigHuObre@NlwqjT z)5R1Tn|t8qpohj{Zm_-M?@dHECUyM1EFh6jN)r65fuy2VRVT_JiVZ*2LH2w?|M}8b zu(|94ZGnCX6ys;J6QdrQDYHXK$Y{jGfz+Lc=faSmZ>yX?`P+jq{<$Ljo48PJ?dRvk zrsuW#G8TokRR{g&G3?*#S)+Wq-;3LO& y?B(7}`U1<{K2SrYtk}d1_nMq%5KD!C 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 D?4hA2 literal 0 HcmV?d00001 diff --git a/app_common/static/description/icon.png b/app_common/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2565562f7cc3eab7fa74aa27602987a89d21009e GIT binary patch literal 71282 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 M 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 $H}byG-Ay23WLG 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 Qy8r+H07*qoM6N<$f}9N?cK`qY literal 0 HcmV?d00001 diff --git a/app_common/static/description/index.html b/app_common/static/description/index.html new file mode 100644 index 00000000..30ad856a --- /dev/null +++ b/app_common/static/description/index.html @@ -0,0 +1,103 @@ +

+
+
+

+

+
+

Lastest update: v13.20.01.01

+
+ +
+
+
+ Key features: +
    +
  • + + Put key function here. +
  • +
  • + + 3. Multi-language Support. +
  • +
  • + + 4. Multi-Company Support. +
  • +
  • + + 5. Support Odoo 13,12, 11, Enterprise and Community Edition. +
  • +
+
+
+
+
+
+
+ +
+
+

Setup, please run the follow command to install the lib.

+

pip install pyyaml ua-parser user-agents

+
+ +
+
+
+ + +
+
+

So Easy to navigator and search any data.

+

+
+ +
+
+
+ +
+
+

Multi-language Support..

+

+
+ +
+
+
+ +
+
+
+

Technical Help & Support

+
+
+
+

+ For any type of technical help & support requests, Feel free to contact us

+
+ guohuadeng@hotmail.com +

+ Via QQ: 300883 (App user would not get QQ or any other IM support. Only for odoo project customize.)

+ + 300883@qq.com +
+
+

+ Visit our website for more support.

+

https://www.odooai.cn

+
+
+
+
+

More Powerful addons, Make your odoo very easy to use, easy customize: + odooai.cn Odoo Addons +

+
+
+ diff --git a/app_common/static/img/icon_sunpop.png b/app_common/static/img/icon_sunpop.png new file mode 100644 index 0000000000000000000000000000000000000000..aa4909543851be8a86cf0ca0c66b97176ff75d7b GIT binary patch literal 28105 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≻7D=D05!r7VW+P`?SDvq_QGF4+rZbAM`ninc?`I=dBq{EHRoZ zSEw1+;9d{}p8c)*lr%|c9DE$#NR$ow9pIJtsKeX`yer5Fkd-uW8TPmo$wM={?OI>4 zHWy%30-&-teVGYKnlNO5A2K$u^TpE0)7x;{&Hz4aCAu4vhn}bXGxTh>e)i-C0P&!6 zT>wqBc(FThu4D(oodj~vB@nbH13)a!x4u&N80lc8^q7EBLjPT{hHMk>mi`>>GqGzOANQKUQ|SI;?Uny@IOINauk7DD zQ$Rv6U0cy!E`uQo;(IdGmbBtCDGT0f09T$N-<{#UB%q8}Q_gtZ`O{^=&F9knM^cX_ zCPUg{b0XO=;N|^V-12_6Oxygjq7yE5^_e^NI-mjHqqbk`z>Vbf@NbVYp6e)BZMo}| zk%=VJNx9p;1U@G~j-rFt5>(E+Bo>2y892?@2(Hi3nL8<8zv-5%|JAw&zARANJ$=o3 z07EYp_K$U>0Awg63S0+-4yhscElhA0T!3R2uLf%u=%BpJuKN$14z?xkeaiL2k$X~2 zvJgrs*W!fPde^78Uoz52$hs7~M|1=riP{;dMtGu;2iUd$Ij#aX{U&0wOosp)(d)NI zpPBt2ZL+UGF+H?wIFWqt=5@gS$ZSGZn03EdS#wj7AG!I>k#i)xr!b9TX5{5#&?i(Q zP9lW0plo7(xx^gbxzK@P$Q2^O@VdUak~ZI91Q^n8DoM2}>w|TT&p7G6f+UODPI{Dr zXEFU3dR96iKB#hRiFqedk4#fc^W|ZXBsWS2c=*?F6AqGH`gFqDf}26MamkK&#AhH4 zLV$umw;>H|`f|beUumF&eT@T!*u;OVhGatEu*Jx=F|Z4ja*XH|)a9ok&IGrviVepk zhD>|%?NF`|_~*{z5?#WCm)kVgPEM(V-m>6oZP58}-7_?>i~f3dxz$ ze+=ue7*`8QOGxsWrhT%pCIE?FQ120a=ycDvz?N5VBqp4< z*KpupZMd<{s1BsqDV}}|ctoKgyB8uUA+0Kvak>h|7V$#8@Xot_C;Mx>*8Z;yR&GWWyzbwYR#B_!=6zb%Vtp&rPl3DgVVJ{Zu$$x6a7k5QiS zkTsj^5Eh^FO^x=P$ai@VF)ltMNHrt3kHoyctt8@Fd?L6k98JrgQb~vBSi>UrE6XXX=+*zpgOfVelcdC!osbSSW$wBikK)StErQMFmlra5g zQZWnN?>TTKO&9NL;1U$O@64J+*Bom;O`-e(>Y2ITSAb1(Ip1jc89nY%pB*5wiE zbw(ifvXHF$P3uMWr@V{Gyt@pRRjK3|A1z?eZ2fTBb>+>CCuU|x01wZLK ziC&gNp?BE)7x1W_PFmY)b7fl4rT{ZD-+Z z>Zw2>qXIT*q~L8gnO6Sly_^y7Ojg*Q_Qm45sz~&F67yaIi+r)H;_o|%Psrz*Ifz6cxAo6tT=4J3Y zCgDgF=Dv=3-pAG~8!#i9e)x92a>{{r^z>>(7XBW+M?WQ2_jE@Hs%fDWJX3)0eR+E1 zMh|AnX3075zJ3;IUH%zHRB=UCjS(6A5u-#yVgM?lvIZ@r_%Y_d+=M@6E?A>%HHlhCmzlFM(Ei*rR3Yf<^bt zgkP1@bq5{WE~ihchuf;{xTdS%ta_#a?PwEJi_)9DMd`=p<=h_L=jg!JK?yP1c( zZOwB@KPn;p+5GF`>BTtq_lYh|TJyY7DM72O$0xWQ7B|k4{rJ`(H^XyryjP!T*%kHY zlB+;}nH6S;V%wvV#!V`Yu3-RG1iHCb3{~~x=b1t$Z z)}8_(lE2>CA5WiurAu6X)lYrow#ks{TOXwJiMH-`ZD7726~JAvc*xn@J}pU4+X9_b z#NVT7ZjqGmdvJTaG&X|V=H!pk)R`vrZ#veyN%@C*!HsEKf^klLTOkhLx>QJ#oswNv zy!5Fmw$A*2c=P`6z9>}gSMMiInR+}`YL7ivnXwR-r6iG1R~DoFIvyku#LCb&kPL8l zo3*Cjck#vg&1Kdty-=MNDD}&=M$MU)tq+KmB*BchqJFr&>#E+)TDksaA|FBzbLh=O zMhC(&5R-4pgz^s&Du4^|h!Oi{xG#L%W^&FO)No%NJ>ta;N8f%e6lzFM&QSQ7pzKE12X#Hm}@xVE3{?K+aT)IB5`I}zW!X>l6kaYeNMqHW+Le%2qwsQq1 zWTuC)n1De~nGjVtrwub){XW192Wt9H-y4p&(0E>%h^+#zpu=nK3c*-b9>QX?%f2bx%K@973^PiC*8)Pr*7I6XmPC08JnO&)DAWk}NIw@GAU}~?M z?#pyIDj%O7EwksnXW(CJQ!`#uS3hSH!1OQka2>3f${L9OR4PfH0I{;-1Gn!Ob>Ff~ zE=YXE%mLp~+f`p#_t{CskWO9+ayNB^!j=~>IF4h3R_aF4-h6l0rGmhGVvhrF$TQy# zsX1LI#57+P3&OO}<40Pb>mH-#=I!Z%j2<*0^KpoEB%7{m$vJo3alZf6X<&~Q>K9J} zk9nTEA~V0?(5;Vn7vEx~-Qz8gQ1HoU$Mzk~4=4aMfh@$8eaBvpctc5;yc}}<(&9GU z(>2H-Sl8}_pSkrhB85ls1QXsif}(C1oUQF3hgTz7xp$&Tr3S`vY}~>8J9@t2Z>P2G zEr8>vyR$*vLPAd|T+%&E#q?gsx*UOD1`f^Uea_43^RZpqyW=}^XmVR~<5z!7u2gZ_ zI(gF{4>rSr8)fYzFL@xY;JIFc6*ph;F0;DkIZzt59tgGqAaSFx9od@^P5r|jX;g>t zvc<*pFpl}QgstDl7A?DV;L|y+VPP6-}S(^AMV|;F>=25x0YY zG$Fe4*~|wnYCEI{)jK|V!_!zZ^KOS0jV_9fy$%EBH&@+kEl9ukkgyAjX_9lBt zp=L^PYhUwW{t-v%8khM}QB%KpJ+%JZeMQ=ZQrbUA?E-%7GgNJh{=RC8$@CbF&J)IO zEf`^yj?Xy{G&t(GSr?eQy(P?(lwNP&gZnY996$biE9oXDbCZ)gnt4d1Yx*Z1!_6Y! zm_j7Yb(%F+9hBLxbf(Iz*&#o^M_^!vN~iXV7vO8oI&Ceacx|CjFwkjiOVkeMyJIoEy%e1D$Yy(QO zn8-h!28E4duLbx1FiSeM9=@u>;k%rRZQai*|@TC!rgT z3F}8)r|iaYCLtCR^)`o#b?raSo4E6G7tax$lfGulII;g;LjV>&b7niI?NiAt<@ zVjs6{`Fpc!%G2q^uc!EKZ_E=Q4KPV*CGDbS*<8FsA836e&7!0fk_O@bwf%`3O~P{x zm;fWBB}!TXT>1g__xTxqzIQ>1RLjT{sTbAg{v#o^YX8Ubl^t~av?$^95+;ukP6z2$ zEEj*!bi8?@*@RZ7#!Q}od%RNTy|_|enZeG$y|gV-DaESGi;KAF0ex(NN0VT$>+*)P z8*V9XseB};(WT8Tr|k~Mw!0Oy_M~_|W&-AsXK4$79@&0s#8D?4h~9riT;Uv$T;Ta; z!=kCDnyvvxG3O`NxCm`8;ezP}$H8i~>)0>oxqCbM{~X&zyhn5E)Cr4pYn7Gw!L%?@ zhZ&O}A#d%3`7VzU1M1KP6UQ>L^J+f8J&8AM*o$BViT2THi)vRU?!Z~BH*QcGT7S`h zwB}LRoP%_qO6i+yHj|OTP1wu^({cA+qk(%2LGOFQFSj=@UtQt41<=@kR8&~FGp0S- zHnbg4hl;n82(JTmowr5j@&Oz^Ro-X5&-ELVYg`#pW_`Bc zFPl7?x_;q0>O|sC1uJ`_bR-QrV#aY!u@*qJSzzi#t@vAh;`M<%d(?pfaG{VjgCpkk zk*_R3O>)jp0`A9n)^%4Z9U3IpMzLz${2SO?M;%#?(!bgC-yWtW?za9b#N<}f<8@ek zr^Me9Go``Z>jq&sv)d9{>4ZZ;VuW+T+j(12{b1WGWM@={wBPB%X<0|U{hRcD@eSNjNx`YH@X7u1Fqj*W^^UoDbRKQR;PmofN%ue zSaNXcp;XS`={2C%&+G zucwrdC+C&W`hM$QeQa0DhcfLvKu5Q;TDWiE_%frY;#`UJi_qT*7>1r2)gCqE; zptr@3tGF7R_)>lP-eG~GTfS`f3S*NKU}NIl%{3U@Sabz&>50H#e2M?aAO^{yY;}df zm8%mppv!gzi5jTpYLTX-6s`v6nTPhz$bl983C_V^$?0?Y9vpHL3u{~mYE@5;IOPzh zm)E7m))m#baaWia&Q-o17XSzgAU8bPMl?~WumVe!4nPpx#M1@~`* zO6MAZ{w*3S7QveJFk28Rbw8|lN)Ax7d7Kpw5DXAActHZbVn}4ONntBEzwnt zu7U*at$TkN#~z8{y9mTkA7p8nfj=1JvFbw@1#flg;`ai~fTaNibDpeun53~)kkHJK znGb{}30AeX?&mv~k64#j$&gv`kN&&rMduVz&mD`8eS2yCc}f1iCT^zH|4%0FO5kVR z1!m&2ZeOwG9?=~2XADp8!9|4!h%2eX8RQ)A6B2~mKlx$hC(oXJ|G|sGyZ(PFwNGM< zR}aN^beT<@@_Za67u$rw+jJC-XWJH!VC%g(yDz>Jw$O=V@;%+QMVXhVNpccTSqlUd zJ38}EPtnuXB_vNe*pme3!XfMAzbj0HX<_U|p};d@G(mkNtf_H+I|vPA^4cKV4z0QiO){UP(^V zC6MzgR}0aWg#c^dOmD83_dVL9HcDgC(;8?NkBhxa_*P&M>et3qpzd>T#y+GSx_w0J zam=}0WP8nPYu+E*(%IHBYF*jO$m&`;aJU_vwY2Gnj+dtS=Rr0h#^wGw2AOKw-;7Qk zWg>m9oDu~*+-~oz5j^N>fQ9i2h^~U2xqV z8BnbD1+V@3=}{BIxm~V=y+W^Lo;b5vDUR%T1bWc)ZIS2*;2G=C2c{PadL~7>40s`L z2_yB?s(R%%(o;XsWAO#5FWK8?-kx}StE9O0bnu?-^!O*2k2PvTmDj*=egY*uffb%r`sV&fa;Gdtcsp_mp?;x#!(??g{%Vfco4zBEb2@D7Pml z*)!FdC)na+WJW!D4iYV-%8tCH1P&;5Wc`+H6^9g8__|1t5 z=o9bqxvQ7_RY`WUD|k1X-0UDn2B$ld0~(x^Dt%{FZw%{Vf&dRczYJ2v7mK+~V8`Hg znAi0m*$Hu`=OO9O7@lDGY^l%k{_a zqcqW_OLMfqifo@^O_WAf{{_deB~d*|Xoq5&ETVpao^1tg(pBjG>=UbqNZ{HX4&_MC z;*0#92*o?wy(AS~DY!OQX)36G&f!$&eU-$H5Xz#23;))DHf<(a#)c$6+> zPaVir;D7Ue=l-=%4TfIczLdpGp9o~Q>OL#J_G2s>!PuL!jwoFQdNG{==On;+Ihcxy z&UDae?kfRg%>G-AWzy+6x#jtNYSsbtuDmYGLiMK&ee8tLeuebRr(jb9Dv~#Z8def; znr$q{hFW#xi3s~>t7Q#g)U2DmEid04zWOQ`A7!W{#04X{$+-=_0qdh5j-fr<;9?^f zooo#BvO>}2Bb*g4^mWz5*~n9PzyTH-s^z@6uu{T?S#^PZ_3nO zQkoX{tCq>ybAmQ5GZ1I;T9vv+^_1%s>*R5cz^fQGQYQ{%*Yz+0YzIffMbGk_M`C4~ ze9z()w-T0tmT#duO{hc+#pW&Jnffws*!NGE4qQRE^*iU2PWY@_%Lt z0-lJzHqTNRu^vMrt*8DFL8ku@Kak)JvcY=nOoUkHkfY!L#rJ9)81FC?xzuG4hF%j*FzVtDWFx zLwZSe_@g9vev9sem^7k32;M;z^qU~BXtd&{p#J8Q$0Vs(M4e4BwCv5<~HiA&HDWXV{A18D~y?6 z$GfDL7`MTrSG3#U41JaD;&LdVW9t6lN`5&A-2XNhINJ(6Ch}P_nUiRnf)fn}efs{E zleA-Lm+PUaKK1n+K|%SQZL1Xr=4pks#0E>&KSaxWqYA$Vt#fhCw;lkv@Z_As50ra} zkA5z~+oJCbtA6i;o?kQBI+hK+$idlywcTcH;Fv8hK zJnxGih7_ZInpM|$Dq-f|`|{6iXsi5xSw5izD`}GjLNpY0v1uRz|I_#SF8)8{du4v| zI1su|VEMnr$HXXzU)jsLYs}R;TxAlGy-QrL9aiRST;VH9d7<_A-_IQkiA16g4&1ap ztVGqZrRkuk_pFUxkZX0U#WY!YaO4zaHNY(@9r!W1X)veMcng8*b`-^_c!D{4g<) z9}?CA{rGJ1#u&46n{;RGt9_yh#C(Fb#0dIik6ai2im_hLbk_c6VhO9w%@|dE&30z* zK6K7+UYz$b`!%yh`^zpYI*O*OYs}Hn(MfzvXh1QtUxzDHDT}@1?|Sy7`faW;>##&e zT9OqqR6hC5-`uu3fgP5sU3A`?ZOoxeXs(XdRn4L45l{ciAp@ky-OFXJ>Wh_9R%cAr zi53tzbL~#S&gQsz#|xMHJaeV+VKm)yZ|C}L_))Fx<-uXrMQ4ZvV;tSJeCC}(f8xcf z)Q7_|<#6hR@0GU+f~Ovrjk$VY!QBnb_{KS;)4AbH)NN4kz^Uw{!^ocaodMLMlTm8SDRIX9l{Lbh* zxTE0pOv(X!T8(We^Jtgb4RXr5@iMScp+agZbI^S>DDE#N)PoChuD)`s?Z#1&b#dAzq~G_fjVEBO=j5UH8gd0g}? zukbj{-Lnu4HDhjaQs{CMy)@}q>=)SOsyMGCRxlPkOtZJbG;<(1?gumZjx-K6yeghM ze=ygKp;5}7xJ$yQJIbqvq7`~EOyEm&qThOUCsX{D2xicfCd{?-COa({_bTXR$%Rt0 zz7_OrsAfW*23fBF$_Y#u3aM&30k5b(&NC>M6%?Kk4tth5kqi5n_d@U&qr_DLfO)d( zKF9+J27-JN&eAd0V9xVL2-Fg${#jnRJsR4|DsvI`)mH#<`ZzQS5;H8@^y*5u-I=jz z^G`>l{fcqc+ROCNQh>po`mm0R=waR4X0S$4YM`a4p?js8eT zn?BOh5(Z-F2W1xbLk}76_>ohczVyR&vR3^<|;`xDa#xz~a^G}=r04ksV6mR(iwga61 zUMK%G6!sIcMP+?O%VZcvoST~IOKj{P&ZMN;q=A8fSq*OLFD!#u=zCsoJ?Oq>SR?8i z+mUQedZ+KCbI>C;4NS3n?N#RS8!>7)eP=tBN-cObjD@5(Qlo)?D>Ig6eLa*OQSye& z;tl!lkrL!#qbe|=Qg*q+=9yN$C(8$lEGbs;injkD+t`gaNIw8KlvWpQSJpeM+}#}BuD8G!yUnfQ0hqozDp;SV$bZOsno*Q{N6kh>7h*3h-H`I(;`7#qGj9@c4n2mR{XgF2$P!Ln?k zURE|kK-wQ5k^=< z|9OPRQC5;HnqK&D0UHlj8Ih=#P;)Q;FFAJxA6Xby71|=wLd{Po7sBx`{0?g>1#U1U z03r34dPos1mXiTbDeZUMq0(p%s!t$mFq*Cm?RUbOl+fa}4Ib-eyV_7Ux%7CK5SC}` zd#6BiXWH|2Z*u&dH5{|_!g!D&D_3&V5zkpcwjZ^5DcGP|=I^|h?$&6YYA5cb_w}(T zgWMmAfAVk@KD=Gxm{2mh?f2`P#fa47>~$$d+mqA4^p}0aA3jj&H-)WI+5h3hIY-=j zGxcZ>2umM^yAN7nT9MK6jUkPQ)I}wxw-YH2$(_b!|0ObTL(q$-yPo9 zZ(aaeV$RAiCu9w<)F&9 z9O*A3HA?Mf3w<|H_JBKevQ{9ePL){4l;OoN3DJLY z6n9FqF9tY{=GvL|39*9zr3%`;(eu^W=t8Fuc84SwVKi?(CgH7pidt{JmRtKSwen_n zc*N5bDEw}|64SXKCom@RI2w};A$#8a4`4kHb3gNP@@j40q#lAUA@ur~Ey~`aC@zd9 z!K8Ov1R~Y(2pe#iE6d~*Ud1T|GtiSp<9i*`BDrqurP|iLw@@TfWY!<;c0Qjiu%sT{ zrU-Q944yxW{Atib)Z1%Muei`2Sd??dcaSH9f72qevh?H$i1Ufm4Q-P~xWMeW>ANN8 z)sTk@q0w_R7f*JqO)go;l6(`t&(?}xl;B%~xHa3y&5rSI=?o3`hSe^Vp_)C^2idJ4y*x#f&L`3@ z+80>6%nmLpJ}RB2*hu^HVL5Zo@$8?@X?p~D*x2^++?HgEk(tq zJUMNzkCQ|uTOl)d>kA9UTIVW(r!+5r-!PqTyKSG=kDr zH}h;)N?Mg`IY;>#QR7Pu08VU;kstYbAa;0rU7wDBUR`MHJ(7}xY=qC;_xDxssoFif z{QX?=k|ceeh5oXE=a!s`<|CH$$aNp_!&Qyg5rHdh7eLL$N_~>K8&$`F!9APPk10}c z?;>?k)Be2Gl|o-_oS@wM=UdS6cnz);DSn`LoA|FD6V^ZNZo*U*oQSM=t$!Wj`qiyQ z>P=nzKwq5n74LbZBOh{OL$G5CIinwslpmP9#5Y$f<8AORoW)wL@pX#6#iPphY4?62 z@l$aFyw#%n<3uXjmC~U|B1P2^FOo4(?=E&ItZtPYI_t{?6C}T~HUFj96W(TW&;K~_ z#gs^hU6%5|<64}W#YdOeC-!K)3ZcSeVbzrSc?D48qa2=MvP84EH?^l~kKItfmi^KDD4j`#lR}wcsDQgdy zml!evpyhCY(L}U3exC?0%0Bhp3g~%mS~H?1=Ff#gem=|pPi1UYmL)xHW~zA5^yL!S zhxNnK%3A#oni3o~rOfTN>(&$TGvXn$>+4JZfHzwVVe{gaqj9U#l5|l_hQzZQYN6cwW`)~Xb*UqIUlayT~9a9<~Ef0%cdQh zv8OYL7(1oni_S1{p#tLkPXPC-Pw`P~Ssl;T z@_#N_HgoGA$HBv7^#H?PtiwtkQ2{H-E%|PV!eN% zywa1#LGpQ#0D+Zm=`z<{Q{f-Tnjw86Ndnk{F1#nZ-(ENYc!kRgH3g6a^)~)qxp&=d z9Rp?&7fyt(D57v52|ek(r39NSK5x2j!^R$I33fbFkk`ckxDaPn z*vaLsr6H^9=a>f%=j+`lBJ;~0Nu`|QpL48$(bLBivy}pSL37(Yp+iAoPVpx^+0lQ# zhiT*P&OZ^WBOH4FGeh~0ie{wY^YpNL2Ur0%pjm_cJn-TTtj?UoS~|#6TjZcV--W(5 zztdFw(q$;jEJXGR%&$p|>Pz=I1Fd6F*$s6cg9xhiAh)BDF9-aa!`3lz5Ue?$g1GKlLp2lShot{f-Y% zz?=^P?WZn$F0$P6HeaI%v${Eti^cI8n2zuL9P2uE(V=(3`6BW|Xs_1u;rC}28hel~ zOnX70yw4@6WZ~8s>o?4)XViL4iLfk@&PI=bqyE~1n5Y!IS|bF@kS5j(c_qU-+s6=} z4_KHZ$3t0La|!*FEfeTs>kk_R{QR}or;sTUcY?Tu_NdnF->)~UUg^t;=UV{#T&$&L zch`><%*rzO@R#SUdbvOi+k$}cGuBYd1B=Z$0+;O!hSCFq!;N9t)%@xaH5D|@y0xpn zWi4It9*fmAEV)XZ<#4p@IDjCr42fp(J|!ItI7D#=aw;!(ALz%r_Wne8@vPIi?| z*n5p5JaG9AYlK#x!8|G2Zr6t*X1=eKNrNatyeX%g#Sd{Nryu#s#{UsoXSsjx1nUFY zOY=(CR1|sQ+K_uq{(&(u%GuiaXSw{T1wdG#ZA^DBt9$uZ-|S+C3I4`WBf(!M=%8_F z(3vA)zw5yr8%={h+-T)h8M)|(L%cNItCD^G*fFfJeqJ&az#QT~zsT*S*+=Qy;AWQ4 z3MmyQU-p0IqfI8EG9!3w4aEF@tgGB}fs2<GnN{iF$@6m_mqFgudOVTuKMbW8tXDlf$-$Z1?5&glmk__5H5#{^ zK=|E>Gf%D$Az}m$ou8|%{&F3Jwv<>Vym=nHyh!lotp>Raf7r2eRMv4x&n+EbsldNH zmjZ#*#cGC6zX*qJKr*n||7)~}orSDDCBJ5OUJf;P#M@#^A4Eb<-1^$Vfx_}!O(fwD zMyFS@60ek5bMgNiI?1$Uka7iCm8{J?HoQv46U#YB7|vtZWw=43JUe7$$wbYj(|WOy zOb*!AM%3IL*sO2&)HBjtbF&n z6}`dpCX8T!b(=T0^w zC1d}%y4_3H!*{SPK5--Tr>gqLyj_e*3I6<^-sbwuRt;XYIzrKp!{4xZUwyydNG{@DTZ%@SshG{{WpT z_G~)GYQj1Qi=O>wM4Sw3TP+3Jbz=Ol>OSDT!j9al9_3&IW%1OR}| zuQJrNy+5c;YPmro6r1Ngu;$5;hfBha+glHmPnXfP)PY0*`CaogW=OOMS}R=)1Y-lC zPNXEJy`yC|%p$uk)3V$gOu5UqZ2cf2)wz$X5U0roZ(srt7i&JoiESm`GT> zEtsl0RC|Hc;Ti_UEZo*-_n#?z(^*fyxeUk|x+K(nMl?fnF1bL-FMv4=vxH-V%+PZo zi@Zmur0jJopMCk%CA{KXsjl)Cr)6~gZPt%a_iFJOPd&7DC?R9{b^ST;7#_M(E2osQ zw6n9Ruo#@1(<|Zt1srKC%@pY+3_%1yHZ*50P8G02xnEPV%XD)xA0N7CkJdZa6!4q| zR>4v9^JCWOn5h8!kH0bUzSqGyHzD@0+K0>wc+-J;ox{U3Yh35hOQikNrGBK&SzaEv zLe~PDDjMN?lXQ)&^PiqeUl+4PBhM8QrW{|@ee#v}gMe4gc5kCkS-u8(JwBR~*F(1! z2ZI@&l^lB@PlLOi-P%v#?EkM;`>v!Rfc#6`swd*SlmGx}vZjjCORU~ydBj@0V(JG& zJN>Pi+K;+~irR;932;8dsB$HiMx3!J<#%Y_Bk?GFL`WOU4`isgMkW*BJKXpJ4br{d#>Agi;G7YpuF?! zmC!LMsFVoZtD=H=M^<+tG;9h$Z%A%KHT_>zV?BQPrgK(1UaLW?z;64WVMz91(N`b} zMlYfhavR>0XF~4`Iv@YFVELLSic}sED-mUg*cw^F+nxzy>1c&0Pd3bE2m(sqSjdLl1tzaAK8NTjsi0(){(}zZP$2_YCIy`C4cy4u_df%Oj0+*AtJFiZuas}itqp(GHBJt0`E$X@Prot# zke--dQ8BUs!S()#1YXu3d`!{gTa74tN;qfbjC10@YHB2kpPjMqk6|qco_yDx1%C-a zEx1=tlH8Ip;^kJo1YdnEF63WO$V$hkmTT(w7SKeC*TzcF$F$y0w#VkqjUFxaWyB0F zyI^!f#S3nI*Fu+@p6MPDg%Mp)xo--}8JG&;Q5hRF!CG0bOv+X)O>XDBkW}<}OMyQn z(bIMZOn>f-Syb)hCE11V%e4F&FV?boaKG z;dQwandxH>1+l$xYHY5x&ZHJ_-Je^)3muNCm_iM*8gkKSKz@hBt3QcBj1mQ)WM>Ghllwp=E~k3)`qi zMqJpaWX+MbnYl*I=l5ZGj4>Ng5p>~aNiCe-B;!^|l6c0EzDMO9$ifD(%g+MKW_sr! zi^9OJvZn&l6q^-Gn_HKv2|LD6mz{K5n+1IrncVmCI$xnQCfrr4_~9{uO7DB`*vstP zd)7*7oo1Srw&H*;3&0SVe1xooTP|HDjd{Poz-zaMI~EX^-?>cMrOsrtP4)|8U%B04 z+!!fNW@;%_g6dtOTc|F^!%aOtl>CtXHieNihVQFr_qwzc_l7+6B!_p0pkNR` z#_wUUOqGU(@*+I>JvfCsl8)Ayb3d zTDEFIQ;aOL;1`j~-7u6v{L|}Ky_=Bp?$25^fHQ`URx|fb4pUmPionk!CKdEGW<6$# zCvYcV`RgR^`x_)BOV;%pkq(Ul%jA#1O0+4H-YxaHValB)bmA*&Ej2Zoxld?naj(w4 zj3H3DKOJ1J7E{Yd_1HBe*4Z_CU0)n-15zhR{P;}Il`^BC50$*;EVSw|QCc4F{!}1UyLz)|GCJiaMG-=gBiSVEH}mKmy!k|dxANh~h%(m{=IGKZD7 zCxzP^r0?V)x-?fSdK-dm)eJ1#*;m)ZdJ@hsz(}VRh)vnbAZ(1ggR!xxKOu~!PPYPA z5-zz+Wq+ZL+pb(!uX_|9Lxzg!`sS4K#a?!l@rwLSJ3eH@*Q5NFXRD|uJd@0np}~#C zHB1~9W1__u^o$En^=O4O0O3VLTm?whJ!x?)zEcYN4FT#88FHZxLKbZX2`U)OHE$Jh9(g^96rqSnq5 zn-EG_)lu7)^TF?&S(1h<=U-+{$DyiQ_T40_WFR2ljjRRu^@OuTR#Vf*A+z5g(5Qm{ z{$T8)x!aPNI}@+#r&tb9o*%WX+H=O^hU?Lh<}77|**~7KOdM!8G%}f53}*OHiJSgv z-TFp0TKCrOhNUrMkIObcKv<}JL(#BPE9*!iU7l5UmY;ZpzofUoVp#UVyX@tkG#!a2 zDX{O+zuxE+y{elnc)0fMkli(wot()|I;O}m_wmzex>cUfxJ7?inp#!n?6feL-lmgh z3ZxH2ksOgK&Eso`Zm2RsPv75<>^+D#8TtX#_Y1VuP-ajP5THzKWMIW6FhBM?>*fhtZ?M&@;MvZd!bV*!Q`xky9!jh@iCK`v8oT|` zxuhwf1oD>pkT`E|={?_nwV|CDvnWb{kl;yhCm~p{;1XaUxCeI#!QEX3NPr+ggL|;R;O+xK26q@FxD4(v z$jHsV@80L$r~7iw!|kuS>s#HcYgJoy)vE63PwEPUc+_|p7#M^~in3b&aO1zo^&ID4 z`m9*G?H|JS{HUb!{9g!qZuR}&Gp?JWp(n-@cG>^LCs*Y4*#9yayyOhLv|Vkyd@Vez zG1M$9JzSlwt?Vrr}LEhFtCQ*JoNPaa!%4z(u#ygrJicotCTXw z%_<#NV-hrB-zJv4pYT~!B~L7}Ur2holamPVrS#P>pe8MRiYVnAINp_^g1&wm9LH)t-A6#GO9MU*PKfMBjU28=*cYRb_2uOJx={?W{oo zLVG^@oEec)cf}&5zKqD%ge+8Ynxy{&--^%%_q!LCyFjGfBQV$&vje*SXKCj~hzU$k>O;gn(_~3?aS%O$AKp2n6Q${pkI^{YmnB z- zF{f-n)U)J>uf>C}nU179Fh8kjL5IqU?wPH#i>0}a*P{Oc&;}-6U^G7LpG48j(7QCkYAeT!fNF*Qj>g1Kv!7m{)0+$a< zGFR%zj#K<);;rk;61EtvZYLl-4U6~qqal%j#`r;uT-dD@i}6-M;gcxl&`};*Hv?{F zR;sNnYw(?7r($?FXY7{tg;vaw70_|nb9`MaGgK1W$3CDfR{nkGheV-8r)vq6?J?eno?72lEJZ0c@uqxYv9!6?l#j1JfBL%48anG4Kcf~uL)oRY{~3&R z{*yD3xC!E*G4Seq`e_he>Gw}(ah_vV&oc>L$G*1W{Z^^jasN%JX*H5qor37N)}nFc zgBK%VWQ#~7T}B|7ILim~#J!>Ra|Nk0U!r`fjJ;1T=_fHV9A-Lz@cVHGzW1)~?`bfm zCDlfWdLE442<22vHp1q*CztZ&lGbX62AmMw1>j`~lozr0> z7hw}!XlP-lN9kuXZL>iZM^9T`IAkgk9$ay)z2V=dKMqq2nKcz7IV^f^e$%;$A08pX z^6ZG{8EArx+vvt>{~e|mwgRW$K*%ez&d;kL|3(89QTMYuA)4&gM-+Bi9aho{zer2I zbAsGL{oQ>s4$OduZ-VLMd*2o};dx9x(!WpLe(OmE--?n(o!<*$T(V66IdV51u%Nst zv${J<88h;%z!)BtH40tZ#R$fv_7YFJBW#)$8n)?Ec^Wk4_jJUmk-0C5g`qkxrY#-2 z=05ae*SE=M%e}G_m!J6YhH=eXW@^&qa(m@H$-+EO%9-HU_H$M^&$%-V>l~#W(`y3- z-NmTq4<;a^Q!SO>Zk`{nJjr8bv?3D)`7+;lh{}rf4P{zw{IcmUlEt^dV7>nMf^`Pu znVC@^aF65iqHl$^PXj~P=;reohMQREjfQL@m1X?xmo0<<$2&U9X1N@Yt^kQ+W)yuL z`dy34tM+FO2)uU)Wo8@(m#6spLet58twdGLK6rRpf2J?1Vy#{#kV*waa*2|Cw<=7h zRVu3aSpTYiQv9hb+wh1SXXe0Ou-(b~pT=B#Rm)Z0%NkMc)ZpITqwgFzPu;`@w^q1v z!N}6V1s!{KPue`U8>axG3|RD2-k@~L)~{AWnjL36y-}ehYK5ahiTje9v_cWqZ=I!e zbCnS>W9|ZvNTqKFiv&t3ua(kT3jWPC`@obp^7_)#RC#1Xb`h@+-Mqb9yTwc_mUQ5f zjp6%voKjh%l5>8Df~Bpbr#d!bGY(Oi`phvAp=>yxKQnxN!J>dVZaj6RrsH=JP!WQz)`f`Q@9V5P z@l<%Z%)hcyr~X2bd(+D{`H{|V9i{ap7CVPEe|tMCThjb$^H*}fw^%z?-D&u|g$(^? z)zZe@IOS}%FP6NOrpA05qBlmS(zaZw6KR}+`UM0p9GA)MI3iyjV7+mC!_?9$c@;co z*{4A`KK1_S>>aZH#dlOp&k;BnW>b2s}aKcFmX7R4jj#lusnIG}@>@P_1`&4Jb)DvG1o{Db{GamZhm2oe5PB#t-sB@+J zB)CuA4wUWmh5!LF_r%lR9eOV)c>A?qUbgN$i@0iCvZ#BTKU{ep3YdS*C_wp!Ktc0O zC;FX!&bvvNhju}~b67I7LQSU|hyjN&-7A-N$Le#b3WlPO?yrh)D=N~afwO^PwgPV= z7J#8HePUI?$=NeQ30WqB8avq(_wE$>DT1qoKK{ylTnw%Zk{Ci|6Tu>ZS$N?WHz&-# zu5gXb7tw{m7*$xcNJ}~`-mY}2VI@bI7^BxO2b34)`QyfTK#9|7jn*Oo1dj|otg0Em zPy+$Vvja};H@e#W$K4DpTZYW^P=dVjcerozc|F3&u9Tt)5~4>z&vh>E+}{-ZO3B^% zq9xWyt~@3ub11s!7-AL@8aZ+=&b9HD2d1KH@@|*E6=KEDc!Ddc@h%pZG+o{%K?1{A zd@Qh_>nDb6Zcs^^fzG!p{ig+*jg+CxybbncicV=iqb-?7>vmt`kNbmaz84IWoHue! zrOAb;h|_SE@fAtaC`LE9sJCExKeQ)|(wA zK1@M^FVGmcB0@F3IGK&2G=*hycjH+a3+USajus%$HN1LDS}(ZK#K^gsO*9J;m}Z3r zeQ#2Vu77DyPC?|Le}JLluduuPDwQtw^0L2^NMCLwK~5aM9{*FcY z5wIg|(|?pxlmn4Bmx~;X_}IK}{C<-CCMHA?pi}X#PjAF%;mcc|D!9rzUdc6mO?pN& zKNeJ?!BxWPc0k$}LflCkiWOCu&ipRqLrha4Auo=yjY|w`Q_y(B)=AIU8aH(S?u+72 zVcL4%@b>G7#WsS^-*IK-;JSb3B%~>j7j2?seLBh2p92s53-j7_KYZ57g7=1$n1c-z zTR~PQHKBW1+ODV)vo7NB>XV^ty)8fYk8Kvs+S3TV09mk!)xJu#rPetOhA_EXS(Vxt zM#!7nl8-+yZky}JX1CYhlJVB_R_vHh`Z(N^MOtXH6V0qV(Ua!C7VXIl(=N>eY{UZP z?!}4IQlI@?RMj>nZA#`XDyO^U+BBd_#Y zSL^HZax2LvStpY?^pNuv~ufc0_BAa^)fj@ZJZ5bfA&OvZ=@gk@vAwlna^ zoA-2%G2;0C&@TlZ5)>r7<<~r|v-tVly_FKbp^KaSJlnd@j_sxi_}9r)`p+PN>>OGa zR@QWFa_|;OfMOv-mhSd;$4f|q5@@n`ezGKW9KUh+xgWEVH)aMeD92E2B`~IS>D51Xso5eO7>rpr z@)+yZ)FLWAyKPtJ;T#z~_+uTtO-})NH;?=@7|(a-sFRGZKQOMT%_9;}oJ_Oou(U7F z-ZtH00-`M0@mZh#!NyFyzL*&J(=I-wr~_!I><*|c&h0TwD1RIG?x551NfX<1OIqJw zpzLM=Ys5u|1Vz@sU`0>~XU`Sl*JvJ)evT{P7c+(*=~T$GiuN_ZBKb3QK7yYOJDuG- z^%&hG2CnV0u8`|DZw+Hpj|+|>@QgGZe5Sk`9MX#xpS<80hNiKY8s)i_zlO8DYzzJm z2YBx39N5|RC@~5Jr|D(-47~PuG*d^_tH1ui!`6MVsrt`!6oV>H&RZ-cVtu2>DqJW) zFRirn_!g*6Jq;QCC5z73l1BeUVus%&e05hqeZv@7mmi>7kjZv=oJ}J##GsKfmm88wN&WWzr}#e)oRiClHdor z!!nT(xrYu3h4;h1&VQCP<85Pt(#^(XCRqFH0!)HKmg;xTa!BDx9Qq z?Pl5HksLc6=(O8c4{P((-;DAJrexyRh)lpWUDJyk)aK!<-cr;)&mrOUs}WZ%OP1kg zVEW)1^fmzLyP3U*^{^cFp)>w?R{T03|4T1&D)Z@qDoViCu6qdHNz)1=*EOQQf-@7b ztsR?ME9%!pkzmtnI_MHleHst%z|^8)biPFlhk{KKRyW03Y#s|8m(2B_1Y_bZ34G8| zEsh2JF+H97dX(?!E0i@J?wh!D+?~KbTh=!u`mvRXtL*bm#Cs-3n~7mjR#=WWNsiNQ zPSCE%Jq~OKC(usVc01>Xr%)cQP}=0!lHcvpVyt1KMI+)Kos;A#KSAZsLb)_Vbw9#; z8E7HD2h*kk4VoS2d3sGuiz-ZFDrAc)n2Y|i;3&BQLRlv-cb#$?E}UxJd2P2jAcJNE zMNgkI>U~$47!qZI#fjs`nT$~R%TpPKS()Lc^LtDTQS=QZFcg2W64lGm|I?)w_b=Ve z$??2A_V6&n^}P`ht@$>(Bx1X5Xtmw>>h!SA{lDuqj12iR|DCto>3qcv+s`SgAyR;) zy6GnrT`9NzS99cqCO9^$>1qDu{@15L{~3DilT9#VoEU2gzJc?*uaK! z-X;vB1y%T&)rXl^WIY8)NP+pt%*68jeX1UjW%)`oL|;gli!SH9yrl0WZ&`*eoa$LB znJu_EFnk7Zef6y}v>dWv(eBlfMK-B#g+>JNt4OcHy+9s??cPyGdWlKaqnD+whRXtj zhP52K-?d$ICn9y(RZg61-_-yf?(>1D%XwlHf1N42g7%d|1jtgq)WT{k>Iuh$EYjdV zeK$$Ogx=BwkTH!;s_n$(?g$8!YtmlOUq8a zpEpSf=w5-@i5Y?yM`sB6#;|JpMm!R>!6qK}uHTf~-}(Ck8#BKF1s@5x<*MZb7}%KP zw_reZ18|@diACju7r5|@gva-_jOaKo1t&`8386iF2m`keA3AY`+=sAKg$%93Wz#R= z!CCI%)%FZq2_Lt&yh=g3(uYI{d6nN9sk*;*QM{cSHHVm_B? z9^qOMrq^1`@3aSqm}ZzchBRGzE&^@^@k(xY&i>Of zZr}WN+wuLxFRyqK%jr>7AMGQx7#CdXy5~j899c5-?-K^#-8&W}a#x>hOCyhFVPPS2LXTpUx5Vj`aEbtW^hz)qAIYA(k*|+s%M**4-d( z*O6=Mb_~c<9y7!x)-8aKh!I@&gnT__#Cj);1jFdJ<1E%9Z zJELZf=uzlnIkZX&!FUx%Ui7?_L5{7PS@WA{93z{p2ff13_H%#Q*9lDDE5)Cge4W&R z2h(>$EV0+F=2gVoI|w9#f7GD}D&s((pM(?*SdnmisBL1aV6fVKV;z>Pt2p+GV-nbP z=G6jJkm6M*!k>GV2E1_Ks_&mSt@tplgvq^mthHyAlQ4@Lcs)|H72}6oLVJPl9&F7~ zG2iaI0nov7`ZL?!#ZaMio5o!jw>bFz(3lR|{pbk1)8M_E2z;CZakYE4hKO*@>={R0 z|AnHvs=D@Bdmi(earE;N0fGgp>&ZM}2L{k~S5u0$SJ$qHUEmEcW|4#Q*mb&srhlbD zipZX0tsNM#6K|ONW|+>lMkVwu;c6ao}>Dq|_serPG ztBxH7F*PHV3#w}Fai5*9uXY351!hf0FfvJL&mLAOn3>y7}$Z#TdE zu2s`2q?;VLwn7Iq#**uEYF(XTc%&@D8fF`Qy4fCY0e`v}>b|(`hR? zp|5p$Q%FnjQ~rp`q*awHiD$tT z^R`SP#q%`&z=Jrgf1_u@;#jV%#gnwIO;)_d3}}6)NQdt5I^_)PSNhatV(OQ$we9Lx zvq*yPy3sID66SpXGEoTEFfBy)=P8Vy3hJ}Hnkl22I6lOaQxEs?j;^PE8WX?a+U%Mn zIo|A|`jNjQZg2SXgVl|9I!iV^UAF1c?@wdgDIHolbuwK&D6_nv82+xT!PoCb4ueN% zh*~w4BT)o*tU;&HQqB_tBVow>AI~%ms$#9u42#S!QFk4(j@C()MN6p~lrl?E)~>cM z^5d@7z>VtUC%punKVGi{Qm7OV9-pFuU`AI4md;a_&ZdYOj zixrCI`wndVZX{H@3MGs38X4}WYR8^;f8c{#0 zhSryDfC;+-&dK)es?Uc;@we=ukFMku!fbEhb(eknnJ8 zjr;~Y`)j2)wRH)^GdoTb=!WIo*kzqdv`Mic@$1K^5YEc}3{EqlIKy12$S=a7FW!Mq zTXJ{R9@_UHXSjhX*z?bL49stWH;qP8twb?G!eC0f+}SAJ`4@3F@|j9@{V!w%GbozHDB3V z^~!3@KmaS%2(*PO-F!QWH{?V;d*8aOOI7&_ZA|HEaDv&&_Rq`O`p@zD&q->kK8pAC z{R`3uCM33H^m5Ul{(Jk_QXLf@qvty&L)J?`*Ix@VFuuOyF~0h7E*(04DYqA@GT*nA ziOuZ3+r<&;Q!Bo*(7&Y?hx=}0`kxpDV8v(}yjZe(?RvD7dzO3tmirQ`cQf@FB(&g| zA_bSiro^>&fuU$PQ7FB8=udOJ3@=Bk52)pc3Qgu`&e9skw@GpVMF;*E_ZXsN~5Y5jRdjqK2 z$LR8Xjzm_X?G+UEktI_=x+CCn?*kereQ%_WCn%PBvHqjGnDiQ|SI%~Z7a3j`jtZTa zU6;5!#$JX@y}S$6Zk+9Pm)w6*7Hs?Jg)_%P0(1heU9v9-Y>@r^@$FIBbHA|BISPAz zno7)Etzwd!t9f=xbb3KPq^F-{j?@Z-yP-CP(MXv`-fZ}NGIwK}(kE26$GP4@EIvI< zW4jSeU0Kk~NZ3ix46&z3aNfEyoJKQl+SY-~@nAkn`>q`4U!RsrDo3dI2NtN|HNHUt zo<8=PGDa|Ei50j zB{y7b7zzY;V5*bX7EGR`xL`Pawoi0CI;|RQu3ZVx#94_{z3oQ6-8)^_1eLfrl+5vn zYg21!GZTU`nF#SGpFve*99$E*tGdkIRb}!tRb;X*9VA?K+?3kh)8?!w0*l)oy#G<0 zK4CIOvj5DMoNOKyFT16B zwc1n{OFLHG%GZ7pGYL#74%g_B52}d-=xm&I^zr9C$D2`FgG+c*}wXJ!Qm+7pi#24@T+end7W z8TUGC$yl{*uP2ekPaf)vHOuK8=6AgD6{CLR`#isu>V#sWy=`V?({RS5KXJi9Zp1VG z)xhsvk|jI0IEng;;BlTxwDf!4J<;~f$2IH|_*ZtJYamzYB#fpI?benb*dWfPp&gP6 zV(;@T2u>^2`+Th7Xrd3^h#4Wb-#9Qg-$nYhA8MykwDTn zO#FAaVLxtsm5(-a2)w;2Oy0Lzuo@P%1}+pi^j3{ zJb6=&x7}^Kn%jKY!M4iFI`(bdsd!PE_pP{$*l%^EK*ijQ(>~gicMJxfEts+xR+^-c z?5?Xeg=j092QY}zF_jd{_8nv)KY0mcTRV4^^>?&rIK5TSpYfWfs4k%ufa4C-YA;ov zhasvm&dQ*iKZ9;mG?d{aL4^K)tmg0-7=d$h2j4l!>|G-VZG6&4J+%sfJOe|Sua@jJ z@#pd{A2m3yTS(CBT5(MkTpNi8ovBqg*s)jO=RT9rowX@6-#);gA9Yz-bS1fWD7d+# zg*zBhF~~MeB`Dn_h9&7n=n;!cweqp3{^6beu27Tt%swvuhZD{Cfnlo$NHtn>Js}Sh ziLYG%IPshk|00ZLpgcZaB}59Eq9v!mfI$?Q|K1|-`9&L^yAdA1sl3ZELD)4^Opdxx zJ$-~%KMn&1(ssTZRft#ic36HA!#@R#;uGlLLDZB>O10fQ!8aZ!^%++Eg~lJb@O*dB zE|iHX5WNPf?4vbk9?W0Znb)!|)=4oTcRdS{1D`PlLiT}Vm)+Bb&vCOdeJG@JI=w;gn=kL*seaN>!i4wd2W`EE& zLnlX6HD?T#&*zP>3^bN;45D3~_VX9w9w2MN3qmKDRad^)6P#0+#lUF&l)#UVv5LTi zLiGFK)BNYiDyJZ-!K1XP;_G}nwGBJd+Wzu+F0#K{#aT7oKJnKd3FiYzIFX+@JwlmA zzB{S4@%hGzzpttKJGny2P>^#E!EXMQ^`JVi2T-q@ETkiik&# zNge%3$E*s@ss`Hb1BtEy8gb|_g&XkG2je9lH#@&m`Vr!fzwz1A%a*z8|CZ0MA5Bry z3lvz2>9;H@p)R_`)EsKm>nram63;YIVbor^LFFCn59Wn$&9n;Ikt;ds}NeifC}T&Fq**?J*)CLc9V zkE(z2TrbXd{GbH>%;(aL3lK@FQbeEr5rVNVJVrE1Dh6viH;w%%vqO4k?DLmpUY8j~ z94f}RGQ5M_7DaD`uISSYMcozyJ2EabE`SBbNi|~}a;Ws7!Gm=lc0UvPkQ(8U_CzW3cD2uVV`tR21QtrOUl(y#x|6AIE3Wj=sPUuUimJb*buW(`9Z zNQUXBmzgCt*!^f992IWL?$(C|&@|h?JQEu#&&T1f;?KO15NkV!5?+|XX()==V(gJ_ zxiFn>Il+}`iZ|Esx6i(_-3jpxYGLXw?#+%r?pZ?zu)~lvwg8>>_orsVvY!EQWrc{BkY`##+1$6gtbPs;CoCC^TepW%c z&U#A+5&aN8(5M3n4n79hp<-kn4}#ArXkEimA_~AFp-9xs7?vYjZZ;N0jPX(Z)UwH=Qo&t!(NvV*(7Ba zhx&=mKba4g=p;phc0&Bs`&VUe)lxn*Bk8JM%H9xbK%rlo+E;QPDA6d~ek29&tvSEQ z_idzzLS5MMC*!7>lGl^w#RLszM=7KD?`}lPDS`^#0(EOsxR5Q&Qx1-_A2bOl2~jK0 zPY$R96d;H^HbYvV(^XjK&(8w()Y9|KmbvQ+SjdVe6RvG4hvQLDmybbj>cuU;Dt0#=7=={wY=< zVcz(6O**{2XA^9-4(n@Q2&VHms#f*`0l3!*4^nL&UkJ$(T*)kJB-S1uiu zB74+Ev3Gy|nEyJ%ShKwl-vL~#QJE7Wkz%4f+gCC`V8IJgvPv1kyP#SSd~2gk$+Oa{ zZAw_?^dwmG^z33(fA>yidltEApUlwI1$L?1QHX~r(4Ip9jIAq$`5@D`_kEtsU0i!V z2rsApYG$m{1;*m1tX{nlU(xRUa#kw!7@nkbUDhNXps~k&9ys6!hJ_4#Ka#`siaGL) zxd78#1D`aaWSZtC!wbF~H<;H@o>?j3J`@M8R#Be0J*rJTFrG*g$F*@2ucyb_3bmM* zQJ&G5b1o<7#7VFN3B2-|8964dS_`_QiO%m#rq-V#P5&#Yt>d>V8cYtBRO;@@W`SR| z?i7kvPqljK`&H~zWOB6~x+I%W!m1xqi6{m;d-0+|h?>A0;tDe>Z{R92$c>-RmMe~O z{e&p4HNK)I-aZ^XS2MvB^BJs*rrS4)c_tw2`{J&@O}0Hdzt6fCcarq#Z}jqq0pxbm zbbfgfIMsqO^8Yumm%afUEycxL`fyYH@62$||6>F8{j&-G_rpIMaK-Sqt}ZRa-L++A zER2t)i(S(qLQSVX`1guT$x8tWyD4#r>lYCpH9iu{y&!v;`cnF4Mpok6OF1Da&om+F zPtr>GDTy@)5|6!Lj;}y4< zCj(WIXnoBwcL|L6pd)ZJ>;myKY4LWh%8uqnUUyOgqB-j?2JLTc@F?*q~!{jf#E#t4`k}}|tar~!g%0NLdNL3!+(Lc1?x1=&j{m0pkp6J`zTTZ&i z;)1G>_0e&@bjJdBRI?m+YA*kcxEaKZRzWX+xXr~^YK8xLX=U54;fPQ)=0ES4#*#GA z&cX_%)q$geSj&0klWX=?+sH*>B8`;6ck=3wWRB=D*ns%pn|)QWAv zGvN22xwDlkU?fSxuqhR7Bl_L3AQfRwG@mmDNvBu+mZC*N9A8a07X7uDsChgw&!Mh$~g5y3oXtm&g? znE@YKET7E<0fTRy)bxn^uS#t$(Ml6X_UqdSSAJ*7|FCrC-vM3D8=G5RH%u&tJJCIg z>ujT>VPJ~K^g>ls_D*}=`XYyp=kQ-o>p-aIFDe~{niE=je&zW9Iq9nO$U~~ULreAV z&c%D^kX!SYH7_RtXQ==_U|H1AKR#9y=(!kJ50C3^t)Dje0K1r{2lF@Ad3%gAQE1Ey z#MP1Nsj13;7*r|zMM77IM_wveuZ4G?Jid*`2&KLWqzkN`p4fgh3(G_bRaHTOaz z4V6_-nyp|%Xmd@WT4v`&_3%1$;@-nU`nD$O!B_3~BsyeCSA5~&-K_7r)~6$UnFs$9 z*dO-7ZnQ7T^67m-Qt&n+KXIupzV9^v6$plPu-8Oh->pLz5NW4q$Kh^Gl-af+`Pu!N zrLXO&Is8e2&EYA$ySxru6^D!~*#oY^(Du>WHN#XE=YeuRFQ_M9*3X7g2RPeWvdEaz zOhz59o{nXdJZ?gETe1Rg2k!#;`R;w8K>6)_a1w0i_R~0>{16hj>$sJfMSBwUX`HOf zrM7zG(a~D(w>kP`0xeN}6?8rI=|s?yc(Hk#7x56Ts^TBwuB#E!hLG^3Y_!E#SzzYc z1Lmu~M&k}Va=O~R4m{(}SxaZV*C3!@@vm(4&shrW`n(*<>G_C8Ai!A&U&=L_!(eC| zJRI3c(R0+2LLwS)c7NF41|AHt4McZbm``{}cb0Xr_H6@euKc>sL|3v41N3439gtI* zOack=bJR;TLnxU9{m;Oix0ma@5f0-$!Qp2X;G;~Miu=rbvOd8!cng2dr@8-JbNW9J zKL2@q7DimTny?1=jDdmI^uJ^oQ2+mwEX)0ov?4+vudPU}^qT$ckK#nqWO*$`m&9z} zt5bZ%VZ$1_6+iyG`NOE<=dXTYBtG1G{=a3tpHepvjaoT_Bru@qI#_k%1JgH`?$0;- zT){QwU{nQsx!V@0FIqv+_ZZeWxpjM3gu!N3r90z?3_g`0y4mVS10H26HWrGf6-Wb#t!poUAXGq+hl$ zY-z4YjjV?VF?a&lgQF)n+Zbt_x{qNw*Z7OJ28>L{K2KqqutwsPTiX`8WdiueyiD@T z)8nN~vypZ0>)+d9)o3hlyRMCHXFz;#plRF`cgRril#e+at^DE059T^%t9*NOZD^Xj z)^G%rYCgc?J_fO8Zo0YyWzrDf6hQF0q!i@QAirl~J>!y<3xTmSJB()Q(oX_R-acg4 z*LB8T53EqY9@Y+UuA^6Q+XvbyeNclx!IMWj8aX4G*IK9?=zSl`=h#>UU@RS60^maW z-k$6>%{focCn1By6^1N#RlcQyd4s=qmU-`9`0c3%td-K!>!SMJ6Z{80SsEW_Bg7@a zwk8s{p;VS&hUVal2DR>3{4O$JAEM9J)^_#~v9W-=PXze}``dHP_0jC;%F)~wFm_o` zBM-yk1JIvVzqH;;9e z?Qu<_9<}q5w1<=+oHW8o|{LlM~~vZU3OPB}~db*iHWrk=(h-)w_IKjGagD=t!Mv z;11xw`sFAt zlpWp3FV1fUeYQf=-1f)uywb|)-V)f$(&C`Pk)5;a3VdUI`5?}{J(Bl1yZ6wHjXz-Q za`JZH8!x}N)M+dq3q8+y#YQ zW_<&l;U_7KtRKbK;bcMk1H2Mnwwn2@@9?n$0Uz|82R&{Ca}ji|JC?T$4f!agfMdWz zcSb^z#wk3&4;~lT#{TtDW8p z1zRZkB#>h!0jnh$2&H#=^c8=Cln7Q>?K)nTAN-wY_Q1|?lN;829H2z!wxjTG-^Z`n zRyoF~T*#RS91mO?Ubh}P!+*?DNChVG@*O}{s%j?PYsxb1y`60+(o-bC+~9fCYH(%s z_|aufbx5AY@&AliZI-cjBRHGmT=-7g$Gx)e?09dX>ehcE0)|J|1y~DD0wx4gHW%*Z zP#fICd`||Nla_tP0PDN8>*eQg*>iMQ!oAT-$~l)iPa0so;X(p@DE@MEETlOuJBkUp zzO+|`UfS!BY@S_`cSOgnym3d}1=K$Ar~+&5yW)xt_Is3a-hDr)Dm3!I>-Td&F1o;fL7edv&?`O~z!ev_}Vb0*5Le~MTr01vmO z040gV@?CoQ56ED6=Ei9AcfccOuUbpz<31V59rt3iHmdQ5YRcUU$aC>}0PK~x%ddp# z8kg7TKavt~*sAztrw|1A;eHzey7olC_fdcUmuV8X;WrwWX)*v@i&=d>CB(1LmE8+QSFkm-cXua;ob(uVp%KO(b-L#L?A&Vp3pDF_=0)aJepEf&I%UphLw zRAlzVslc9izy&5qEn3r1PLZb%nG9($`9Qh?@Ikr6r=N7(!jgro$2>~br;*?*-7nf9 zKKEs)BC|HQE`f%y2HQc<2abE~$peLJgg_8r(dLAq5j_QOeg}Yf#HYjcLniqqT?f=r zX-oMd|D=I7N)!zZv5L0*8A zDnY3UNj?)4jB9^+Ve#{7okA}hpIhf!bMZm4&mIKt^F`CI=m08a@pA3OAoapp9O21Kv6E;*MCU75>PcR6ChdI9B$LLZZUD!AuPz$!;S@=7?->vKYn2s3 z?{l%C-jW?9n+p?u$887$(Qx>P&H7t^xV{q^4K58iK(7WxwA6F-C9OrMqeOv48>>CR zsevB{^O(GFY7R1>ey54s^HrV+2E$;-nmFxB2ECJP1kXII!&_Ox^^iaT2|gE(o$pX( zMHkgysa9T!5%0*F)(ic0sI@p6F&s?W#_c&jbxmK$-gu0i8 zZ0;L(&;};>$95J~Uyl1z<61r)3XleutzCCqC#`*$J@q~N2C55%h^AMP1Ppry=!1Vg zDpu!Q9bf51S@`jzF$%&T7&pMoMHm=F(Emq)O%D4%pdVxWGsgcZu(a$15p>^4+!=}b zqeWgk+mfXnGCMewgm%~}Nli|o3~C%4Y&+~3pgZH8}5AI`7{6T0Ga(A{&MpaA(Q4b1&Ok{w z2N)>e=$K*GaoxME(KV1hi`f5Z1**p1`X>G{9{@zb1NXURkari`@Gif|_TN1CvSMBI z2mG?AJeJGvooy7>ATvb@=#BqjfjtwCh63Gn0OH4F1sbycADuho6i@8YQ_Xt%l1c67 zB)?%klLVaav4cP}Z{>M5WPK{LH2N&g*u+ypjym^Bq%l}dvRHv)sQf_Z^sWGZxqgHW zs>4uW%awl-3`ISRkyRpqdNvE_17L1v*cj^2^|!X3?=fwFUhp*c)>ob>$=@Mi;(8uF z?NX8>uK{o}-CX2-;^gQ$75a>qqICeZFaE%EbGlQ4N<{|KZS^!SN}%M88UHmgB(m~a zb2;|oRiSz&_jwC9$4OF~nKjUA4%UTGb>%QN8Q{7tqjT&y+aa{N)dxnMjX$sjuObr; zg-+d9k#D=18UO)PLTLvdXUoU!DTdB&A%IIgpiaP{kL{$mYu&ETp0C*C(_hptrX zv|03-2gVN)c_qYNjwM5}k9TT4=%m53*Q~)jST}=FR_#+BeD}lV5SfQ4^jZCHgjjm{ z^+7w`|4b7x5qSD4aQxD>SEBVBhX~h|K=8my-XF`|{t|;pEBCO#FS@A1C9?bl_l$%; zD>hhl7E*$JiIRuflWvMS8?wh)KnDh zjS@Q2MS2&cBLdR9NKtx6T2PwwPUr!pC`ywi9YK2U2vU{aYiLrX20|y0kmQT^e)qfc z-n>8F%)2u$b0+6ZX3yDct-aQ7ueI0SE83HJ(FT3evGMN^-Rh|%mhDzjbJY@ zDLOO<@6|!oOymGxc`<_ieQZpZ z);RmB7_V8$$MM_=jTvFfqCuMFWcV(Obegg(dECxj3FMnDvBS)7xpp2XV8+ykR#D&z zyvfQh;0!^_Z%maN>X+gDK?ItWR@xci|3UDC-b`%K=eLxX5_x}`yAv4mu8oOGue)gv zJvW$ALA9Yqj`TIi)!y0sRIp(F!U2C{>x3L5ebdpHI$(#cu}MxgkQ@nJ93F&k@r!)W zGnya`YJi#`QvOjdwl?8_H^Oh~AkGV_N!?3!(s0U5P&j#suCe()wt4S&*N5Ajcm5o% zUrmH6v}k-+SkZfIi^&oZ9&E36YlPs0dvDA^A!J~JE%vHz&;rjN#8oDeQM|?gk{WrV zTXkyS5CCB(Nwg*^s~u=`2+2xxTZvhBSI%M18lvpw(B_ovd;uzASdiy}p$T)~W@Gv%G5R7$VROBRFv z{LPCY4Lh_&M#Ww3xz#|$*dZd}=Wk|{0h+3#_1so`>#>Kxvxc#2oaHXu% zGnpa7-1wo(lTZz_@U#pV1jJY=Rtc3mcMO(S8B9!Gk8?UY0v>?(+^BC6rK9vgQ>cW= z8FXI%R^z!sZEjR$;X3{+xMPEiC?CgNaE!|X!$>+3AmDhG%PV%2f z$F9W$8`>gZOYVE@P#lGr<~YUeNVP$WMdYKA}V*n_O>oRuS`lWPo)0hHevV{I5~3icRI8~T%42AJ>ADj z%0%X~`{6oYNdI)MS8irkfWztzE@A-WURtugEMN=|ZDLVF(T zGo5(Lo*?OV>zc+HNE*6!a{Ub$jv0b&Do4+_qUP0WT&7Fs#TTuI>PbJEhJ2 zfFBdOK(hf%Zes#%#Z|Y@+AHk{=(49=0@ZC@{)A|wQ-h3`sZE+jbGTxrB@o-bO;@kg z2+qowPb>akbKy^L&))v>i9y?!)-KC!wv#T%Vh>4x16a@Mfvb%)&O&Np8D4-q0BZ3j zxV^Svg~$q!u=#*V@5rk-p_bqcU6%)UINfPjRTsse=YDXSIK$cWS8{i)ZPNY9?EsU3 z3AD9MhjWu|JLTF=n;EOhbq7}yJTL*8T6ut*yz8<);`jUNh=tUfG`>-msHl5VO<{^W z_|Zc2y7w)=s@>WAD?qbaKQ_?v&TOg~2{P0`34asxC*z~kvZ6%3t{vf+TLiSmR*JdkA>O5=r;^Hf$uWTy^&Js>o;n!}#zVN{o1W@`jSKZoi;E*^l@Y6Npk_E3{Wk9s=j=Syc1=L@*YG3uD~PP`~fq3du7`NBgtWt zN8OehJNRd}te~=-eAr++F6+wWc8KuSd(X>GmQ^EGdq^5^H1A{r@_qz;BepZgD(7s> zlMfPDp8z3ZTQgH+3FipgO9uy?Ak{4?Mrgfn+eE%&M{6#Le-7JE9$Ca&h66`y?GF}e zTECw)2JoG))wZs@e=@P~?gZee zVw1R62a{9KF#Oi2l!J2+a8z4Qw;(4Er@IV#*UI5Zm&mOP6J_3O`k)}YUaSu@-KGWP z`R5nOHw|*g^Hkn-ABt;L2GOXNw=sy&-#$$*V(}T|cUEXd3y6eHB-kWbj~e{YoyryU zPSE&49A6Al{PiPbCvB5dUcKV#;v#;c*A$)a(;(LAv9#vqiCK(aEFBE3cW?2`Zo%c< z@_utveOx&EX%yy@YwG|$I&^TX$IvG3OWu1zROS}^CEr(N4cPFrlA#VpITI*Vzi`xA zBmgrBi-%Pk);zjk6zpv4R;{6_y6av6?vb=E=ZC+rLK$2`!s}hZcZ5OZlU%@7jEg5x z`12r>9m<{>n+imptpuhh&+BtL(GDHb^#?50vsp>@JInlN4Qg0*kfQkq474;%1g^Qu zAB8F^&1wZq?#QaNpfAGIWLt+OfR!FBf+5prf6On1quPt^!&RSx#%#FvcuLn;qqU+U zX4HNe+Rs|z za`SA>AaEh^QN3-Y%Fbkfbw(F~l?+lp@&*D6AGfS4a@E5SBh7A|k2LIP!w2}ciCKRO z%jZ#mN`5{@C5n5Gg{4t$=Ye?xD*R7D+@|$ksyvudrUN$5`5Js0+WRnVH4+IYV&$D5 zjO5JPK8;{pKLaPVrYBP`s->Ta5dG=ReS5pFHaTCwp27P`<`AR=){>hElsyk*K5ZwE zPd^G(ZlPSUYy3UgSwkCJdTWZ<2-+H;CF-!lf|&A3dV&!fXk7Xk5lh;+cg-&t#u`~f zuaI~kMs(?x_-xie(lpHB8vf%$UUlWUA&Rec@!;3!<{F79dfj2<+QOLS8#LViGJvV=!>aE4Xi6Fid}spHX9fXMd@;A}quL5+O@iBtF{b;$G*@-n$MoCZ^M-Pt%e zv+hi7>#2Pm6s73zS^jI?*~4)+XND3fl{ah@;4d?-0Y5$~KdSAv>+9mW zUOG^06`FMMJgq(lg>7VFw%>)={pDc zE}nTx9m~uOuHd!N=ZKs2_4;quVE3OfC=`fjPVw>=#SvFcL0I|9C>`XgRZX_)NN?qv zo}4_U3ger57nG3=`!*Mr4Oq_Za{U+`!WA$urX$des2v4v5JDBK-2KbepyfIP`+eL;J&(u!_HR&z`!}Mxl z4v^c_-Q>=d#On>zsh{>nj*(=(x2-DXc+7>x5!ED~&NX_lT89k+=0!;{2gjPnwP^o?Mq0uX5MXwsN?i2J^(7Y&QM$qio=fjw=>EQ+%APsP$wNW-yHPcA#S1M|4@jV_0b*rgo?oW|B|Empd@)? zC-0`YRBwNiMMUP8v{gT<`mlLjusGH5CI7!K6a)^3qoGjOm(lC*8`v_mk@pXPMke`x zJfwCmE_^Wv1j09b)W4L?WI@=Z3mghZDeI`z&x~Xnc$i{}^GsfQgYX{9 z%|1Hcc^7je7nY~}@}};{{FrCZctjsAjxt{3s=Zt| zh+DW(iXQ*!d9Ziu5pi7q`Wkwaec2f*#Sl+>tC)pS8ce!0Nq;mdS9x+jv9S6sQRK}1 zx;al5EV94-BB6N+?s#Fa@cu41WavzO)_&|j^1wdR<5q6Jc6kI-++fg!m+p=X34u!- zbEA5Y_|DTMfx8bdPVxiX=MTqix*jPU-qrrcNaY!2Eboo`oj8cxE~G*^GU{H3F^_k- zBH(kt=Ifwlr7D@ZtYNqD;P@F#m^)YZg~s}wmMdpf_T_~u->A%?#@)7PM|bMlesDTO zsM?^L2j({JY`WVWhiX_wase0Q&vUN(#D7fWxpTv9WSqz|LS%UAK#e>x_Yv#y#7g>nMUa%FYO1sS?jHHr?NuVW%vI!$p5fPYaKc2 z|M5?<++X(Cj0Be@xr7`X9Dvb(gHUnw{}2c*Y&yTUeGp?nm;N%el zN(esJ=}$M>fZb{Ggbdsj>vz&%mloFeI-q(Ssn86bm+D5x!+nV}g2I=TAV-)mhm~L$dZfj{_ZM#l)Ryfcq5<#Qi6Q!%04Dc=1tzHWtNTq z=^9j-CDkTD`RP<3rO4MNPRf@nv*A8Pgo#nHp z^(@t}j;swSE}z}kE~WdP&vOU8!BVpC=N26<9)76qm>yu02-wdCq=mk~Q|y&^JQh4p z7IOO|Rs^`x4fVn}J>~9K{?|iw-qV@}Opm%`40+hAA;pP0M0Bcx?q=DWt87Ai+wBD2 z_g5ZWqy>|WkBmt2!?M?DWF3eMFGQtX$+WN~ehy!|uRJ4_dJ#d?R-%TxQw}tkZj}2; zUb?y8;bX5|!3!vZVR_a^-EjiQ0;2G;@%4x3d*0VPQAtVPR7sSqaqsAY^QHaLo1kON za*=HxfK|>{0S^C(sb44l-UaVLs1VJIf}gTKyIl2g#P5?|;=ltfe~ZUFpkaRDOHw2L z_wlsk;rcE-YHNm;#!;0*lzy~RcB}RbrLoNDsJ=bKhI6mr6fyvP1EnL##>bBU8V91I zXOsRh-d+{#rt?jrun1J;thIkkJGl6iEU+n$4Tr@oY+Z7IZrq&bCW1*5r@hr4{ff0K zzZ(_$@JHC@`SL>fPmHY~iidSx&t9+g4%$EzKU|SR)X&OhfRi3|<6T9$i)DZzebTf= zuZlw}NOfe`aLufbQLQs`R#!=5TiM;ZwZ348isv1dj(DO?}*x zy884d&9!2vQ*AYEF)93sJ!%1<%}tTh@06YwA-K1PY&KWEA*e9H3Gz0jcz>oPdQm?v zp`Qc3R9t_gQ!fhCXoA9mNInrk-fC$LAy=?_WU&R7&JXcKHZ9(SuJ$(y)L3ut)^y+( zeA>x(95uD=!DGkwA`El>&08Wci*24%IdA#&R-6G6Id~E2ew>{wkERnnTEXUIt0R-t z6YGczX2`iS12?Z+x>nBxVXCWX6)_s9c%R2pVw#k`3i|1IrfWl z`!4bK$jJ7=@K$fB%jr;de^@uhXmu6mQdlk2%a7IrkNc?*A964|8|UV$9$junre4Ci ziFxQB=(idrVrBYV1mX@v5x9UngwUoa{uq90=XXS<*SZ?6u&XHZ*W6lB5^)N=7a7>d zpc&DP)w-POtDP&EH=Z)kZlS;9o@UFwiVLCbHyOW(dc_`v7NqvM%$1*4UO+DPXjvnb z7*Ajo2;+
lpVt1qyx77lIF%J-BNm8Dy9y4KL5xtbmdKjmt`cfY0rT%xX^Rz-^nlc$@J9tS(B^zq-gQ$-+i`=A6_8)?XgI`qywt&XNQf1DpPKJJ zLf2n=y9=F4*b|y)gn5C8Nygj!_hHIsQ(ox^ zD$YF@gyuiNN3@Br{}B-IeJCJl)aex+|B9#y|ooqW-IADZ*SS2tf7sr`}klh!2`mpQ=2CC6p+6x$iUqt~*Q ztPxt3f~Gom<*bEHo6KMbuH>YZwY zAJZ8BLNH$Jy6&FWs}UF+65aTQPkJ884rh=EcCwyehD2ExBI$D%>hQrWeYU&Y>SK{( zR?0-wLHggY5(m&z`hu7d0Y^75nWdmpTbhK%oOP!su9i72lnw909S?I2tc<#ulX=1RX zzuWSWJlfFwJSKdj^%ke@a=kIx(v|urRG--PEGAXv#JgDIsrg|3#(I&z79co}>SAYd zDnXMgRYr*2yIr!c*NpXdhpQ-c)x)dogqQzbh#Szb@lJQ{@;mzSbfDzG{VV(tH+CD) zhoXnE{9~0+Gh=*9^$Ol5@1jL4YE5lX46Ghkcg(vD5=ov(>f>z`Q%w;)*Q%BcgA*yM zjd|Uh@a^Bnn!?6T>5-G3LI^>M$!p6#<=%*PGhz@d$#70Q^i8(v5Pv`mb;O**r-s$`^wjky%V6 zDvIF87&q<+YNl-~uaDZwl9DI++R*Own;R(vyA04B;w1r(#Cd5C#k{y`b10mSD9$m z@G}#-7q_KT%>c42X+0jlF;A(Xb4^Qx z8*^Z|Xh|s-*#D!Z-g@MK{W@zoLa(QhcA3p}B&pA~W7_ybXD|tNO2vP=z{rIRj0c_K z5Z9jJBg6fg8_dw}EESqmw{)h?;Ofh&!E50kzyc?qalOnyf>P1?I<^G~Uwy?2U3+=g z8cY`-x}t`feJ_i3Z}0Fi4TevyqDmL6uGnAAU3tn?99UGi3yuZJXyU{NK3PVc?s>5w zXE-MMHQc+p(A6;#^J|c?HId|qYs%OkUTg>qcfh2~ws^UU-~LkL9YU|rmaWX&H3D$o8H!tg}#4 zS}e6q6`L?*gbKI5y#r0LWp6}9apUABFx>A&P__XNFICrjGdSerCYYfg=#7K z-Mwi*mvk=?Y(*Qwf|iOcsyp#P2% zY_|HWh02zVQxdlHsNgo^wYDO8nZc1R7=>=#W@lGo*NRHedwFGq<27(euKTMVhlhm% zTB&EheIM^yp1vdhjRl9@CEkTz^U?G)2cEgF*X0nn2(T#X_}0VPfYl}L1Jk4BMpue= z1r>ZUsTcScoaI>hI?- z-Wfdm8cqzw3a|;y8WP}+m!NNR?kLgrlRUjmVbZ7Y$(L5Y7s{Wy3`CiqkbML*`zK~T zeBgXTj-h1s&pJ3-*{zQzPVGntcs|AZ+Lm@v$3yh6S4c`XPLhh_UA-oY1R57Zz7RO# zv@Ut_x(?vPYY%gkVG-L{38KcQ;stXQloF#2EPNGFee4^QBeF-{(#VDKGhRla6G?MS ze0u<%E%TVn%JTGCX&foZ?8EqvP{ZGiERD0r49@~!P$YY9v~b7STfw*T+={ke-Vg09SkUCiN~K_-A(qYH5^hk8q}^2{w@)`-OZ#ggAyEVkIHWp)Q+h?M+3HiE+FfA+L8knn_FDE`{VByenIxY zdVAr_hvZ5R{*qs@WjnA+a}yf!)d~x*A*-0#?sAsoH`qkIH#sAM)=*dw+7N?yQncS~ zjYKXKu2;zVQiOU_&N)dQ0cPj<{N)pVKiOiTB0k0XKz6dcvUOF(p18K;UbDX;j0_5| z-+;2;{;tRAW}R$jL>bri3vD>>W6cDA`?#54#&L4kv@H1CfpE|TiejT_0-YGGn^cfL zjXuK5(77o+6#6`Y1?y*}bAimEpygF=uNMQ9{!OkHi9fo_B+1u6Vm?}AQqLDeU_f@v zFMb`>PV+{l%j%JD9!6Bm)?WZd80ZvcI^anpd;2+YYi~7>BQy-H;a$9K{$y|S@WEm= zIgdt8qC)YOE8W*eQ$;s~6r5AX-we)kW+9MnMu04~K zE7+!VbAjLBCIwF-7n(SlPrpx(KqEbW%E^;GwV2Q7$7a*)xp9tf5aQ-;Wk)@Lw;PY^ zq*pD~T$ruU+miM6mi>w=3--t+j3f&2+yLlz#Rmz+)vG&jMRjK_ix(U00u zQ7m7ly=XD%&#os=DakaW{%*}5ck!0eQcO=K&)N4MpJEYo<6xloDD@oyCgF3B`7F38 z6Vtgt#uQ$guNH@coEA9}X;28ndK@wL5FUnDAO& zZcu?t^PAPw>ziQo{)j>Kud1nLeJAMvu&MmLjCmDPvX!V^i`Oc@d?-Dc6ht+xs$ zP6^++;ylUTPk{KwY=?8Z;TcAaPAR#I&m=On%Lzfz=@Me|xi-_lU~Kms<&p7ntnKv_ zXqV}QV<$AStx)MFtm}QwHEGVu`h5SPcBdK;OnILxRJ^nRK)-P-%h(DFhozm z#82PNH3;M2+{b%s}*QA?;@wsCXAmUj@fTpQv{+nBpoW%ng3dT<|$yjv6I{bkzb)I?t;X>Gs&*MdE2wy@Qif@~8cRea|!jRrUE%18g6O z8C({>=N){}H7XTAbs{w|QFQ31X&gU$-*EF5uX}m!5_s`^mSA(gAo02dzg5Y}7Ij=5 zzKe1O@iy7921HgA+9RzD zaC=|$VA|6%GK*;i!tuXDtqi3&z7b{@!UMBQIZ7KMj}YgR1YLwV@9zJ8LkIAU4CL=v;+WZ-S^B%FumNgP3N51#tg(;fI{O5bTdzNH!*%wkKa~*yGcybZsmk=L3 zp7l4{1Z;#QI6zz*Tt!w*R;+{z@z0?A{XFVmUJZEMwjCnaw zY0ZI@ytKJWf0q_O+Jk@e{oL;#a+XIK#Z9nZxIsN;z1M}{oRcjS1QSFxszEhd(sGCn z>cGXuY9gIM>umiNx~~*0K!eK7oc$A?4T{MYHgQ%^;<<3kw^o4X^F1IAY`B%7*uu5I z4FJROz-24$USOiSrQ7D)U<)QVGO<1}C#F`jo+hk+)rW$1C>1(D8fJktQ1f;S0w{5nQB{>q_V^?|C@c!lOLA;pB_9n8TqpzA@()-59OTDAhGlT<0A$>X=9SVc|aqj}9TVzrp;De5u0d)L78tE3y!*pMLl z%&uvQF(Kx$zj6c*aZ;1kuqk);;3{isb6Anrt$P_Z*Gu4aW%JmA`M@AtE@+O(xKe_wxP!AoP#zo3;FfIE)ri+P*6*ApWiB+sJsjJLSY4wXdc3!eE}S6 zWmw0d!@DY@ZP)!w{?l7swVGwg_g#AO;A?y%HDL|X+>dXyl}ky;t!E8LpCknFf0&J9dLk=}0osO3?$xf2>Pi7<4A<5ve!jCPdqDRaDaXNW z0Q(VOyzZ)htouwu=b$#Dyp_n|LW{$)4jkTia)w`2KvxXk1N-YC8Y=I9t}XgdUT=2Cd4F@7 zAp+2c<446v#YAk~sa~M919s=J%_39ASMISWIUU)(MT{1vm^CEg+Zf0Np9>FI&C%a! zOYU`BJ5tRI;cywQb&vb4vOn*dC&_cCW$Q=1pg-j}WpSB1)Nh=Po`xEdjga#7ytL&U zkqBV&3Nr?=4B`~YuN(q)Gs-~{E|M4y7o`2h!;Pxc$vcTtwK-Y7c-;-aocU8cOoWd) z_u10i<+R%b&^);MYHVP-a3DXrxA^UtGSO!$F-{9Yd%_{U*9#AO)hS!Qot0Dh;V9sW ziP?W8ZWaQ>H^dHOFGC*_^HI|5-9x=$-TLoKXBP%?0XSx<2ceJfzwf2~B(atC;H{fz ztPZ~JRwn9!mTaR-ym}j}=lO(#0=0v3{l-lS=KWTAi!Pjs)aJ}+Mi#!wQ-U=Rzs^H8 zTxPv9=&eK68mmhqIt(aZvyk^>7~tkQ4j{_vZ$xk=TTBb0LP8BY@emCbdh9^}i_<4e z@FH+Hdu&PS_Y2|244bK@!;8qCvL^Ehs7;P7c_gV>hnPpBOIpd0(W>}tK`~1O` z(CLepOKisLle{vjK3rZ7AD`f185JD)R+s))GzYe1N^?-7&bpH)SO;*Be8eg6^3+oy zd`?q+2>dOkmP983Tc3!E^V!t1sK+KcFUzc7Z;UXlv4v^X6@Ebg6gyuj*`$O%P91wL zrWJKA&-g)n`Ej|7T7WC*AgaMvIk`$2i>a`s1ybcI)dy`4c2?Z}KtjmHcA{GDCu-wp zVi5w*DXA(~MM1vEfb=)F)vPy7H*nTlDx~EKr!L~AMGv1RI{_&-+43dI2KSFa;GNLM zn;ATfm63awG27~>;xY#SlQ_S5YVe0C?)_-IsUV`ChacQI!kgB6hr%)ctjtl~wz$CXL0x+(j@2x;O+?pB;{3|Qgc z3Zt(09Uz5tMK2_;JvOTE!ETv1fHa5B&*P=IUC*eBla=t~pWO}}#+LI8#uQ~wD9^HK zBu2f;n4Y>u)4nVKe;&vYZ6*42t^V~BW9O4a(d(KG60*k{DKcbK?eb=`eHuS6G(tUq zhY9B7cMo?^P_2^Pr*SE@akb=C*3%RG@2?3u%8gu5Yt$d- z&vid*FcMEICb^R|D3D@V3gi(`*^7D?P8BWvmGGJ7)METVXu{@zD2VW5%RxR9^JUBE zrTFshp}5reEXHwGKFo221tsn*%p3wbE#0l`%cdGrO_7T{7&Nx zi{EuWH-l!vFfu(g6HU|CjeP%Zsws^h^4`Zf;ES6Q#PF3@#Ri>bp_PXo=SlIGx2Mpa zkb0g$#4mL{nyeOLYuyJH=BJz*v7hlR18^D#6&dct4k#=q-c}vU_(7Vl=n3gRkflVa zbWW+f0R(A zi`T%MQ#4B|REYc4uZXOdpSqu@IIN6O*w>ZhaBZj<^Q>upA@IN#$k^UJXh|8Atgj(mC=P}*k14Gs)wYT+o&tI8kAaudXi^rkD>TEJsM(WFor<{8r5h>}?^5jFzO!*uRblYxe23TwA=e z2W`#%@ZS9(VmmZgMm|aR%U+!su*~;S(y&mfqUh9uEJJ7RwbA647OnW-d~0o`a$uDq zsiKw~9fmcFl9ZiOO*CVyY|m%0Z8UFjg7bqNagF3!XZ{`1O$1&&vXkS1H)T%jNF1{L zpe-9v_!}doIRVLw8>#)+-&jr1bHGgsb=fH5LyC^aP-rfk*8;>NLrCcn;onreWMmt! ziGA~f4YFRv@seD2q{z+$!-n`Rbi8VZ@M)SYK9=EC+dNd){QYF7h%iZk3ic%`f|#Ih zPw3#nb1mpsjadFVE!6eFvktR9Kl}`?%-P_XGN}QP6||S3W!#yYtB`<5F`;?ld3_0q zDW@2M+J*XolelA~XGn`b^TbP*3-$P^Pt9I<*SKK%*nR%g75pf`1ozM2T$=qx)H!4uROJl@t@ z=bD0Qu=zZYRl>hSYq2_jG^2RA*O}o*6N@Z=6M5q&?0I4#--hj;yAw-rxI8MVN_ z;n#nEuT@u##C7>4SkC2C`Sv?l!}CoLKcukfIWddMxoU%$>_!iZqqHa#0vMqMz0GW?QrJ=s zlRxOoY4}T(?5A}Wc5!*^fvfGdpW>>6yY^hxMy&LvsC?Tr!UEt zcuMs91G8Z9SOurYf0{XAY}VFXkU5uQ(g|!$9tHHme-zRb1tBuCz zSBX(37Sm^vStWTLV()`LtxzaN3@~JfdT3ApcssR19H?I=neb?FTk5gKBjCPV&*aOR zFx=IVwMVGfvQSu4{|*MkM&!W|70iZbQTVr(Q>7^77x5?jhxmO%X1vi~A|m|pmtD7k zYsp87<;Ue}V(+Mkqbj)cuj`L+mq=8IZY<}iVfeE1AvX`(Yq=43i}4aE_vs&O{}I;Y zw@LXHNY8B;*Nw98;~Y#saJ4e7O_k`OE!n<)m8xzL%)bNY9Pk!@DVITLJ9AFIRhXET zss{x=LM1+0euc{KNjpMy^;;Tb1{H_!6Uow*za{P>)jp)z7Qhzp3mJ*nyP6(OR#tmE z#dUZpaVpX0q2v7bapbBn@iONsA)3xVYK3DF(4fj8XRzR&5py)1)MdJ&@QrKUOpuy= z^Wy%9aCi=}{g?Qa6^K1tkI3cXScdPSfW2fJQFbs>*zmVF(cmDZb?`1BCc)zSfPn_M z_8CucXv`Xwk0Im!pYQc%&%*-on{lkfA`-je&iVeh$a+}$wInUjX%Ox}YZ>qs|0oT>tkra}vtzXN8d3RDnNFTY0e+~$$oqP-#hgpL z#{}AgR|+c@ad8n#d?y1hF554c^*?0*i^kH0NdkQ7U6_(`Tg^ zxb>MDldi5QPPtK_JZ8S`6Gfe?Y1Pi<#_FXWVZOv+=d!ybp-v^+MgbS7I3Lj4X_(Ap z?C~64L&Nv5hry`W$fjv!nYr2I!k@YZSAYEc y_&YzOHI8Z?3^m=cEkxMG|39p${O9rtn$iovu~MzDQuc4(%?mZ%=QYo4-~BJEr_Y%H literal 0 HcmV?d00001 diff --git a/app_common/static/src/css/iconfont.css b/app_common/static/src/css/iconfont.css new file mode 100644 index 00000000..5bd791bf --- /dev/null +++ b/app_common/static/src/css/iconfont.css @@ -0,0 +1,19 @@ +@font-face { + font-family: "iconfont"; /* Project id 3033683 */ + src: url('iconfont.woff2?t=1639985883617') format('woff2'), + url('iconfont.woff?t=1639985883617') format('woff'), + url('iconfont.ttf?t=1639985883617') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-nfc:before { + content: "\e7e7"; +} + diff --git a/app_common/static/src/css/iconfont.ttf b/app_common/static/src/css/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..39be19d245bd6bea6ff76d2bf6a3c3bc25d4364a GIT binary patch literal 1808 zcmd^9&u<$=6#iy*V;eh7LenNyQ_7NpLvV0Xw{f7f;YVpKAp}*M=2E1xwbyo=aPfr(){qx)n+E-}5TyEI@?}MM6qx~0Ozvix0 z`#<>Z3BYh^_tzb}vj0~4Q)+MWE!IgSe=;r;f6n*8dLvv-q1&bQ585f$E8BRB2u6id zqG7N4Vh7ICzlXNfv>VRQ^`jpH<|-g-zSj!9S1Ns!-lYFguy&)}ZQ~`AS-V|RDCUkK zBZlnaFJJw6Zt&>e$e5Afhu?lZtAJV=`i3ct*J-98BR5OnDzT(9DmKjrVD-^Z{xoJV z5BcoE^NSd8?XZcxh||aMo3U`0Yc})89zmV*3Niu-&6*~}yWsic+wvQ7SL0ROLP0Q6 zqR$|^%{W;-QNfoR98o`De2+F|cXmUn4OOSOa1VZQU@D>@7Pa;TvMOqdD^E+_#CW7( zX~4#YijHU6@d+SQ{r~sTA2nc~ZbQ^7)hXKXS5Uumar>8chDKgaWDkstMo%&^D8#HN z&K{n~_MQXTtX00nVwerC_Z2I8aR#s4s3*+E3kO2u5n&Q86KLbMss+VeTwQDF2ZGGaF=&$ z^b*wpTGXkW77ilMD{-r;L{&3VZmp(;OWdu%8belO@eP=%LA0Rjb6AN>Z1Dps-v#C= nQ=LaWit=#;(|mg8>FM*)IUDNIjEB0rw;NJOVZdls%aQj#ZyX60 literal 0 HcmV?d00001 diff --git a/app_common/static/src/css/iconfont.woff b/app_common/static/src/css/iconfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..b30ac3c48bd05c10d81b8740ac353e3932fb6d22 GIT binary patch literal 1160 zcmY*X3rv$&6u#w$wm^Xj8KU7es}91ew1TpNLwV~+sRCol#{ajpl#EAb%P5Pp?X=}J zNegJ&f>?$|Ivnd-6_kaP5*tt?Ls$SoWkMK;kU6qMP4VA_nJhcWmvg@Fo=5Jzr;?qT z3J3t2a}99c^d#!Pd^7&Pr5(>X3;=-)RTe~caQ&XI*~g<8P)mj!o&hw$aioV=iix0B z1Nl+tMay1&1w|!Q0vJy~Z47z}#W2kh^07hyoI0Tv4G|l-;${&-5o)uL2SV&7Jw?71 zmP({hb3nd1n@k2cUQ*73d5AOQ#4V@*D8;03E<%BPvo@IE0k~yYDIaR#aAqRxQAF*C zH;Kx{5_sPdnBxx-QC?Z-B5mcNg(y15rK2Vudg{w{S8VQnM))vK%|$UeP{%V`qCa3J zXcUMYx%acY*fUsgw#EtUWx1q-%~}jYTdmf6R_nyDM5R!)2OVbi3+UVhP{%Man5YY( zxI2_WYC{O(L7Ye=F0v?zjf!n4+kAkw!;=oSdY~vDMNuL*AXtE*CqZCP+}^{uGs^Vs$ZX@cZVl1Hkm_5*bh6ujvXI_Gz^zMJaGj&?^6Z`tiY5tr5 z1ByO&P}<-Uj^q2ybjBod+n@4rFb8O5o>%{?DSP$QN*%QQ8AQ(W+acc-B6kIb0iqCY z0L*cQy96BoaDU#-K)GZd7z_4AknL0k-9cL40jL`UxLMLxr6!@wmPl1z9#A_sha9=G zuQ)d}#CzD$oNmlATr-d?i)ptePei3p#AP<9eHO^eLUCPs)l?Fa^2?*?@+bYefMKv^ zs;>U4?~lmo!9AA7uwHA2=)#*O6Z?#BcYAG{=+c`m5fUZ!DKqozo^7(b*Oir+SI;YI z_Z;!EE$4ZG?cnQ^y(*G}JZZ$;_S0W>D_ewBzgwRh$Hg%-#vI|pp(|_BhQGN!>{Vm@ zSZskVyW;F9XXkSE46o&M-%{Lm3X9q1CIR?lck|ZS}JUB=SRRn|(;^Dvj z{pNXiBE`>h?hbXvDM%Iu4R8_O5iy~KsS&qa5g1&Wxc8ZpnAk| z!5yGc_qMX?|L1agD~tmE4f0Uu+IV2+fpnCQu`R-02q8C&UEmU45vVq!9KTlI+6zIK zMP`H$9xQ5*7RP0cN(3M7lVzB!6w3Rq%wiMDDDLoIfV<)6C%xcP1UR}t84@OTW{89BvE2kw#}ZWAJoLflEcpDd*MFWUXBF0hUKkHP z|8oVmnk?Y9`Z^3;8+9Xbc*^$dUBA=sLE8DD?LJ4ZJ*<~-*u~w9cG^3pUu-{!Kd64_ zU5>qbZ0B!nKgGTEe^@i~@J_#Tz!f=wfjo!#CJ?HrsrCJ+~lE=XqL=0_qPwWR2}gNmrY2|C&4DE7vy5 zPX5$99m3ax4|D5Y+3E%?0VON3khygImtSV>-K(Exf=gG{WbpFO`xBw4p956hlP&nc z+LL(}#NAELrpRa+2!X=kdzMt&K}sxFv#(=SEiaM^m0CtPD)gj~RO&-BV+_jFn1gba z=AqiSy7e_$m z38axtM&c-0NVglSM)V@B3io4b)xaRiO3y4N8?X`6Ddt#5RoRRYM5xJt>gjn{uQwqx zHEFTT($$Qai!(Av-CNRSlL2Z_n25m?h-3nyAu}-|J~_*OUpGu;gr11@MEhful?KvB zvZTxGfi}pDy}IsXAFEL+*%*dE2nrGgNIkb;dM##xnCpjWVKOG2dPKymScXkT`pVMR WR~SBR4^*?%Mc7qIx=LgK0002#GHNgY literal 0 HcmV?d00001 diff --git a/app_common/static/src/js/sunpop.cn b/app_common/static/src/js/sunpop.cn new file mode 100644 index 00000000..e69de29b diff --git a/app_common/static/src/xml/sunpop.cn b/app_common/static/src/xml/sunpop.cn new file mode 100644 index 00000000..e69de29b diff --git a/app_common/views/ir_cron_views.xml b/app_common/views/ir_cron_views.xml new file mode 100644 index 00000000..4ba63f0b --- /dev/null +++ b/app_common/views/ir_cron_views.xml @@ -0,0 +1,13 @@ + + + + app.ir.cron.tree + ir.cron + + + + + + + + \ No newline at end of file diff --git a/app_common/views/webclient_templates.xml b/app_common/views/webclient_templates.xml new file mode 100644 index 00000000..8bc3a651 --- /dev/null +++ b/app_common/views/webclient_templates.xml @@ -0,0 +1,8 @@ + + + + diff --git a/app_common/wizard/sunpop.cn b/app_common/wizard/sunpop.cn new file mode 100644 index 00000000..e69de29b