isdata-customer-sdk 0.1.78 → 0.1.80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.umd.js CHANGED
@@ -29580,6 +29580,7 @@ __webpack_require__.d(__webpack_exports__, {
29580
29580
  getChildrenOfficeInfosByID: function() { return /* reexport */ getChildrenOfficeInfosByID; },
29581
29581
  getCurrentUserPortalPageID: function() { return /* reexport */ getCurrentUserPortalPageID; },
29582
29582
  getDifyFileType: function() { return /* reexport */ getDifyFileType; },
29583
+ getFileSize: function() { return /* reexport */ getFileSize; },
29583
29584
  getGroupMappingsByAccount: function() { return /* reexport */ getGroupMappingsByAccount; },
29584
29585
  getIMHanlder: function() { return /* reexport */ getIMHanlder; },
29585
29586
  getIntegrateAppInfoByID: function() { return /* reexport */ getIntegrateAppInfoByID; },
@@ -29632,15 +29633,9 @@ __webpack_require__.d(__webpack_exports__, {
29632
29633
  validateSSOPageLoaded: function() { return /* reexport */ validateSSOPageLoaded; }
29633
29634
  });
29634
29635
 
29635
- // NAMESPACE OBJECT: ./src/api/utils.js
29636
- var utils_namespaceObject = {};
29637
- __webpack_require__.r(utils_namespaceObject);
29638
- __webpack_require__.d(utils_namespaceObject, {
29639
- w$: function() { return createFileFromUrl; },
29640
- KQ: function() { return extractFilenameFromUrl; },
29641
- Ie: function() { return getUrlParamValue; },
29642
- Ju: function() { return queryAssetById; }
29643
- });
29636
+ // NAMESPACE OBJECT: ./node_modules/ua-parser-js/src/main/ua-parser.mjs
29637
+ var ua_parser_namespaceObject = {};
29638
+ __webpack_require__.r(ua_parser_namespaceObject);
29644
29639
 
29645
29640
  ;// ./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js
29646
29641
  /* eslint-disable no-var */
@@ -30731,6 +30726,1494 @@ const getIntegrateAppInfoByID = async appID => {
30731
30726
  let appInfo = result.data.appInfo;
30732
30727
  return appInfo;
30733
30728
  };
30729
+ ;// ./node_modules/ua-parser-js/src/main/ua-parser.mjs
30730
+ // Generated ESM version of ua-parser-js
30731
+ // DO NOT EDIT THIS FILE!
30732
+ // Source: /src/main/ua-parser.js
30733
+
30734
+ /////////////////////////////////////////////////////////////////////////////////
30735
+ /* UAParser.js v2.0.6
30736
+ Copyright © 2012-2025 Faisal Salman <f@faisalman.com>
30737
+ AGPLv3 License *//*
30738
+ Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
30739
+ Supports browser & node.js environment.
30740
+ Demo : https://uaparser.dev
30741
+ Source : https://github.com/faisalman/ua-parser-js */
30742
+ /////////////////////////////////////////////////////////////////////////////////
30743
+
30744
+ /* jshint esversion: 6 */
30745
+ /* globals window */
30746
+
30747
+
30748
+
30749
+ //////////////
30750
+ // Constants
30751
+ /////////////
30752
+
30753
+ var LIBVERSION = '2.0.6',
30754
+ UA_MAX_LENGTH = 500,
30755
+ USER_AGENT = 'user-agent',
30756
+ EMPTY = '',
30757
+ UNKNOWN = '?',
30758
+ TYPEOF = {
30759
+ FUNCTION : 'function',
30760
+ OBJECT : 'object',
30761
+ STRING : 'string',
30762
+ UNDEFINED : 'undefined'
30763
+ },
30764
+
30765
+ // properties
30766
+ BROWSER = 'browser',
30767
+ CPU = 'cpu',
30768
+ DEVICE = 'device',
30769
+ ENGINE = 'engine',
30770
+ OS = 'os',
30771
+ RESULT = 'result',
30772
+
30773
+ NAME = 'name',
30774
+ TYPE = 'type',
30775
+ VENDOR = 'vendor',
30776
+ VERSION = 'version',
30777
+ ARCHITECTURE= 'architecture',
30778
+ MAJOR = 'major',
30779
+ MODEL = 'model',
30780
+
30781
+ // device types
30782
+ CONSOLE = 'console',
30783
+ MOBILE = 'mobile',
30784
+ TABLET = 'tablet',
30785
+ SMARTTV = 'smarttv',
30786
+ WEARABLE = 'wearable',
30787
+ XR = 'xr',
30788
+ EMBEDDED = 'embedded',
30789
+
30790
+ // browser types
30791
+ INAPP = 'inapp',
30792
+
30793
+ // client hints
30794
+ BRANDS = 'brands',
30795
+ FORMFACTORS = 'formFactors',
30796
+ FULLVERLIST = 'fullVersionList',
30797
+ PLATFORM = 'platform',
30798
+ PLATFORMVER = 'platformVersion',
30799
+ BITNESS = 'bitness',
30800
+ CH = 'sec-ch-ua',
30801
+ CH_FULL_VER_LIST= CH + '-full-version-list',
30802
+ CH_ARCH = CH + '-arch',
30803
+ CH_BITNESS = CH + '-' + BITNESS,
30804
+ CH_FORM_FACTORS = CH + '-form-factors',
30805
+ CH_MOBILE = CH + '-' + MOBILE,
30806
+ CH_MODEL = CH + '-' + MODEL,
30807
+ CH_PLATFORM = CH + '-' + PLATFORM,
30808
+ CH_PLATFORM_VER = CH_PLATFORM + '-version',
30809
+ CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS],
30810
+
30811
+ // device vendors
30812
+ AMAZON = 'Amazon',
30813
+ APPLE = 'Apple',
30814
+ ASUS = 'ASUS',
30815
+ BLACKBERRY = 'BlackBerry',
30816
+ GOOGLE = 'Google',
30817
+ HUAWEI = 'Huawei',
30818
+ LENOVO = 'Lenovo',
30819
+ HONOR = 'Honor',
30820
+ LG = 'LG',
30821
+ MICROSOFT = 'Microsoft',
30822
+ MOTOROLA = 'Motorola',
30823
+ NVIDIA = 'Nvidia',
30824
+ ONEPLUS = 'OnePlus',
30825
+ OPPO = 'OPPO',
30826
+ SAMSUNG = 'Samsung',
30827
+ SHARP = 'Sharp',
30828
+ SONY = 'Sony',
30829
+ XIAOMI = 'Xiaomi',
30830
+ ZEBRA = 'Zebra',
30831
+
30832
+ // browsers
30833
+ CHROME = 'Chrome',
30834
+ CHROMIUM = 'Chromium',
30835
+ CHROMECAST = 'Chromecast',
30836
+ EDGE = 'Edge',
30837
+ FIREFOX = 'Firefox',
30838
+ OPERA = 'Opera',
30839
+ FACEBOOK = 'Facebook',
30840
+ SOGOU = 'Sogou',
30841
+
30842
+ PREFIX_MOBILE = 'Mobile ',
30843
+ SUFFIX_BROWSER = ' Browser',
30844
+
30845
+ // os
30846
+ WINDOWS = 'Windows';
30847
+
30848
+ var isWindow = typeof window !== TYPEOF.UNDEFINED,
30849
+ NAVIGATOR = (isWindow && window.navigator) ?
30850
+ window.navigator :
30851
+ undefined,
30852
+ NAVIGATOR_UADATA = (NAVIGATOR && NAVIGATOR.userAgentData) ?
30853
+ NAVIGATOR.userAgentData :
30854
+ undefined;
30855
+
30856
+ ///////////
30857
+ // Helper
30858
+ //////////
30859
+
30860
+ var extend = function (defaultRgx, extensions) {
30861
+ var mergedRgx = {};
30862
+ var extraRgx = extensions;
30863
+ if (!isExtensions(extensions)) {
30864
+ extraRgx = {};
30865
+ for (var i in extensions) {
30866
+ for (var j in extensions[i]) {
30867
+ extraRgx[j] = extensions[i][j].concat(extraRgx[j] ? extraRgx[j] : []);
30868
+ }
30869
+ }
30870
+ }
30871
+ for (var k in defaultRgx) {
30872
+ mergedRgx[k] = extraRgx[k] && extraRgx[k].length % 2 === 0 ? extraRgx[k].concat(defaultRgx[k]) : defaultRgx[k];
30873
+ }
30874
+ return mergedRgx;
30875
+ },
30876
+ enumerize = function (arr) {
30877
+ var enums = {};
30878
+ for (var i=0; i<arr.length; i++) {
30879
+ enums[arr[i].toUpperCase()] = arr[i];
30880
+ }
30881
+ return enums;
30882
+ },
30883
+ has = function (str1, str2) {
30884
+ if (typeof str1 === TYPEOF.OBJECT && str1.length > 0) {
30885
+ for (var i in str1) {
30886
+ if (lowerize(str2) == lowerize(str1[i])) return true;
30887
+ }
30888
+ return false;
30889
+ }
30890
+ return isString(str1) ? lowerize(str2) == lowerize(str1) : false;
30891
+ },
30892
+ isExtensions = function (obj, deep) {
30893
+ for (var prop in obj) {
30894
+ return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);
30895
+ }
30896
+ },
30897
+ isString = function (val) {
30898
+ return typeof val === TYPEOF.STRING;
30899
+ },
30900
+ itemListToArray = function (header) {
30901
+ if (!header) return undefined;
30902
+ var arr = [];
30903
+ var tokens = strip(/\\?\"/g, header).split(',');
30904
+ for (var i = 0; i < tokens.length; i++) {
30905
+ if (tokens[i].indexOf(';') > -1) {
30906
+ var token = trim(tokens[i]).split(';v=');
30907
+ arr[i] = { brand : token[0], version : token[1] };
30908
+ } else {
30909
+ arr[i] = trim(tokens[i]);
30910
+ }
30911
+ }
30912
+ return arr;
30913
+ },
30914
+ lowerize = function (str) {
30915
+ return isString(str) ? str.toLowerCase() : str;
30916
+ },
30917
+ majorize = function (version) {
30918
+ return isString(version) ? strip(/[^\d\.]/g, version).split('.')[0] : undefined;
30919
+ },
30920
+ setProps = function (arr) {
30921
+ for (var i in arr) {
30922
+ if (!arr.hasOwnProperty(i)) continue;
30923
+
30924
+ var propName = arr[i];
30925
+ if (typeof propName == TYPEOF.OBJECT && propName.length == 2) {
30926
+ this[propName[0]] = propName[1];
30927
+ } else {
30928
+ this[propName] = undefined;
30929
+ }
30930
+ }
30931
+ return this;
30932
+ },
30933
+ strip = function (pattern, str) {
30934
+ return isString(str) ? str.replace(pattern, EMPTY) : str;
30935
+ },
30936
+ stripQuotes = function (str) {
30937
+ return strip(/\\?\"/g, str);
30938
+ },
30939
+ trim = function (str, len) {
30940
+ str = strip(/^\s\s*/, String(str));
30941
+ return typeof len === TYPEOF.UNDEFINED ? str : str.substring(0, len);
30942
+ };
30943
+
30944
+ ///////////////
30945
+ // Map helper
30946
+ //////////////
30947
+
30948
+ var rgxMapper = function (ua, arrays) {
30949
+
30950
+ if(!ua || !arrays) return;
30951
+
30952
+ var i = 0, j, k, p, q, matches, match;
30953
+
30954
+ // loop through all regexes maps
30955
+ while (i < arrays.length && !matches) {
30956
+
30957
+ var regex = arrays[i], // even sequence (0,2,4,..)
30958
+ props = arrays[i + 1]; // odd sequence (1,3,5,..)
30959
+ j = k = 0;
30960
+
30961
+ // try matching uastring with regexes
30962
+ while (j < regex.length && !matches) {
30963
+
30964
+ if (!regex[j]) { break; }
30965
+ matches = regex[j++].exec(ua);
30966
+
30967
+ if (!!matches) {
30968
+ for (p = 0; p < props.length; p++) {
30969
+ match = matches[++k];
30970
+ q = props[p];
30971
+ // check if given property is actually array
30972
+ if (typeof q === TYPEOF.OBJECT && q.length > 0) {
30973
+ if (q.length === 2) {
30974
+ if (typeof q[1] == TYPEOF.FUNCTION) {
30975
+ // assign modified match
30976
+ this[q[0]] = q[1].call(this, match);
30977
+ } else {
30978
+ // assign given value, ignore regex match
30979
+ this[q[0]] = q[1];
30980
+ }
30981
+ } else if (q.length >= 3) {
30982
+ // Check whether q[1] FUNCTION or REGEX
30983
+ if (typeof q[1] === TYPEOF.FUNCTION && !(q[1].exec && q[1].test)) {
30984
+ if (q.length > 3) {
30985
+ this[q[0]] = match ? q[1].apply(this, q.slice(2)) : undefined;
30986
+ } else {
30987
+ // call function (usually string mapper)
30988
+ this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
30989
+ }
30990
+ } else {
30991
+ if (q.length == 3) {
30992
+ // sanitize match using given regex
30993
+ this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
30994
+ } else if (q.length == 4) {
30995
+ this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
30996
+ } else if (q.length > 4) {
30997
+ this[q[0]] = match ? q[3].apply(this, [match.replace(q[1], q[2])].concat(q.slice(4))) : undefined;
30998
+ }
30999
+ }
31000
+ }
31001
+ } else {
31002
+ this[q] = match ? match : undefined;
31003
+ }
31004
+ }
31005
+ }
31006
+ }
31007
+ i += 2;
31008
+ }
31009
+ },
31010
+
31011
+ strMapper = function (str, map) {
31012
+
31013
+ for (var i in map) {
31014
+ // check if current value is array
31015
+ if (typeof map[i] === TYPEOF.OBJECT && map[i].length > 0) {
31016
+ for (var j = 0; j < map[i].length; j++) {
31017
+ if (has(map[i][j], str)) {
31018
+ return (i === UNKNOWN) ? undefined : i;
31019
+ }
31020
+ }
31021
+ } else if (has(map[i], str)) {
31022
+ return (i === UNKNOWN) ? undefined : i;
31023
+ }
31024
+ }
31025
+ return map.hasOwnProperty('*') ? map['*'] : str;
31026
+ };
31027
+
31028
+ ///////////////
31029
+ // String map
31030
+ //////////////
31031
+
31032
+ var windowsVersionMap = {
31033
+ 'ME' : '4.90',
31034
+ 'NT 3.51': '3.51',
31035
+ 'NT 4.0': '4.0',
31036
+ '2000' : ['5.0', '5.01'],
31037
+ 'XP' : ['5.1', '5.2'],
31038
+ 'Vista' : '6.0',
31039
+ '7' : '6.1',
31040
+ '8' : '6.2',
31041
+ '8.1' : '6.3',
31042
+ '10' : ['6.4', '10.0'],
31043
+ 'NT' : ''
31044
+ },
31045
+
31046
+ formFactorsMap = {
31047
+ 'embedded' : 'Automotive',
31048
+ 'mobile' : 'Mobile',
31049
+ 'tablet' : ['Tablet', 'EInk'],
31050
+ 'smarttv' : 'TV',
31051
+ 'wearable' : 'Watch',
31052
+ 'xr' : ['VR', 'XR'],
31053
+ '?' : ['Desktop', 'Unknown'],
31054
+ '*' : undefined
31055
+ },
31056
+
31057
+ browserHintsMap = {
31058
+ 'Chrome' : 'Google Chrome',
31059
+ 'Edge' : 'Microsoft Edge',
31060
+ 'Edge WebView2' : 'Microsoft Edge WebView2',
31061
+ 'Chrome WebView': 'Android WebView',
31062
+ 'Chrome Headless':'HeadlessChrome',
31063
+ 'Huawei Browser': 'HuaweiBrowser',
31064
+ 'MIUI Browser' : 'Miui Browser',
31065
+ 'Opera Mobi' : 'OperaMobile',
31066
+ 'Yandex' : 'YaBrowser'
31067
+ };
31068
+
31069
+ //////////////
31070
+ // Regex map
31071
+ /////////////
31072
+
31073
+ var defaultRegexes = {
31074
+
31075
+ browser : [[
31076
+
31077
+ // Most common regardless engine
31078
+ /\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
31079
+ ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [
31080
+ /webview.+edge\/([\w\.]+)/i // Microsoft Edge
31081
+ ], [VERSION, [NAME, EDGE+' WebView']], [
31082
+ /edg(?:e|ios|a)?\/([\w\.]+)/i
31083
+ ], [VERSION, [NAME, 'Edge']], [
31084
+
31085
+ // Presto based
31086
+ /(opera mini)\/([-\w\.]+)/i, // Opera Mini
31087
+ /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i, // Opera Mobi/Tablet
31088
+ /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i // Opera
31089
+ ], [NAME, VERSION], [
31090
+ /opios[\/ ]+([\w\.]+)/i // Opera mini on iphone >= 8.0
31091
+ ], [VERSION, [NAME, OPERA+' Mini']], [
31092
+ /\bop(?:rg)?x\/([\w\.]+)/i // Opera GX
31093
+ ], [VERSION, [NAME, OPERA+' GX']], [
31094
+ /\bopr\/([\w\.]+)/i // Opera Webkit
31095
+ ], [VERSION, [NAME, OPERA]], [
31096
+
31097
+ // Mixed
31098
+ /\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i // Baidu
31099
+ ], [VERSION, [NAME, 'Baidu']], [
31100
+ /\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i // Maxthon
31101
+ ], [VERSION, [NAME, 'Maxthon']], [
31102
+ /(kindle)\/([\w\.]+)/i, // Kindle
31103
+ /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,
31104
+ // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir
31105
+ // Trident based
31106
+ /(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet
31107
+ /(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
31108
+
31109
+ // Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon
31110
+ /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser|palemoon)\/([-\w\.]+)/i,
31111
+ // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
31112
+ /(heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i, // HeyTap/Ovi/115/Surf
31113
+ /(qwant)(?:ios|mobile)\/([\d\.]+)/i, // Qwant
31114
+ /(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i // Ecosia/Weibo
31115
+ ], [NAME, VERSION], [
31116
+ /quark(?:pc)?\/([-\w\.]+)/i // Quark
31117
+ ], [VERSION, [NAME, 'Quark']], [
31118
+ /\bddg\/([\w\.]+)/i // DuckDuckGo
31119
+ ], [VERSION, [NAME, 'DuckDuckGo']], [
31120
+ /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser
31121
+ ], [VERSION, [NAME, 'UCBrowser']], [
31122
+ /microm.+\bqbcore\/([\w\.]+)/i, // WeChat Desktop for Windows Built-in Browser
31123
+ /\bqbcore\/([\w\.]+).+microm/i,
31124
+ /micromessenger\/([\w\.]+)/i // WeChat
31125
+ ], [VERSION, [NAME, 'WeChat']], [
31126
+ /konqueror\/([\w\.]+)/i // Konqueror
31127
+ ], [VERSION, [NAME, 'Konqueror']], [
31128
+ /trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i // IE11
31129
+ ], [VERSION, [NAME, 'IE']], [
31130
+ /ya(?:search)?browser\/([\w\.]+)/i // Yandex
31131
+ ], [VERSION, [NAME, 'Yandex']], [
31132
+ /slbrowser\/([\w\.]+)/i // Smart Lenovo Browser
31133
+ ], [VERSION, [NAME, 'Smart ' + LENOVO + SUFFIX_BROWSER]], [
31134
+ /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
31135
+ ], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [
31136
+ /\bfocus\/([\w\.]+)/i // Firefox Focus
31137
+ ], [VERSION, [NAME, FIREFOX+' Focus']], [
31138
+ /\bopt\/([\w\.]+)/i // Opera Touch
31139
+ ], [VERSION, [NAME, OPERA+' Touch']], [
31140
+ /coc_coc\w+\/([\w\.]+)/i // Coc Coc Browser
31141
+ ], [VERSION, [NAME, 'Coc Coc']], [
31142
+ /dolfin\/([\w\.]+)/i // Dolphin
31143
+ ], [VERSION, [NAME, 'Dolphin']], [
31144
+ /coast\/([\w\.]+)/i // Opera Coast
31145
+ ], [VERSION, [NAME, OPERA+' Coast']], [
31146
+ /miuibrowser\/([\w\.]+)/i // MIUI Browser
31147
+ ], [VERSION, [NAME, 'MIUI' + SUFFIX_BROWSER]], [
31148
+ /fxios\/([\w\.-]+)/i // Firefox for iOS
31149
+ ], [VERSION, [NAME, PREFIX_MOBILE + FIREFOX]], [
31150
+ /\bqihoobrowser\/?([\w\.]*)/i // 360
31151
+ ], [VERSION, [NAME, '360']], [
31152
+ /\b(qq)\/([\w\.]+)/i // QQ
31153
+ ], [[NAME, /(.+)/, '$1Browser'], VERSION], [
31154
+ /(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i
31155
+ ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser
31156
+ /samsungbrowser\/([\w\.]+)/i // Samsung Internet
31157
+ ], [VERSION, [NAME, SAMSUNG + ' Internet']], [
31158
+ /metasr[\/ ]?([\d\.]+)/i // Sogou Explorer
31159
+ ], [VERSION, [NAME, SOGOU + ' Explorer']], [
31160
+ /(sogou)mo\w+\/([\d\.]+)/i // Sogou Mobile
31161
+ ], [[NAME, SOGOU + ' Mobile'], VERSION], [
31162
+ /(electron)\/([\w\.]+) safari/i, // Electron-based App
31163
+ /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i, // Tesla
31164
+ /m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i // QQ/2345
31165
+ ], [NAME, VERSION], [
31166
+ /(lbbrowser|rekonq)/i // LieBao Browser/Rekonq
31167
+ ], [NAME], [
31168
+ /ome\/([\w\.]+) \w* ?(iron) saf/i, // Iron
31169
+ /ome\/([\w\.]+).+qihu (360)[es]e/i // 360
31170
+ ], [VERSION, NAME], [
31171
+
31172
+ // WebView
31173
+ /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i // Facebook App for iOS & Android
31174
+ ], [[NAME, FACEBOOK], VERSION, [TYPE, INAPP]], [
31175
+ /(kakao(?:talk|story))[\/ ]([\w\.]+)/i, // Kakao App
31176
+ /(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp
31177
+ /(daum)apps[\/ ]([\w\.]+)/i, // Daum App
31178
+ /safari (line)\/([\w\.]+)/i, // Line App for iOS
31179
+ /\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
31180
+ /(alipay)client\/([\w\.]+)/i, // Alipay
31181
+ /(twitter)(?:and| f.+e\/([\w\.]+))/i, // Twitter
31182
+ /(bing)(?:web|sapphire)\/([\w\.]+)/i, // Bing
31183
+ /(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i // Instagram/Snapchat/Klarna
31184
+ ], [NAME, VERSION, [TYPE, INAPP]], [
31185
+ /\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
31186
+ ], [VERSION, [NAME, 'GSA'], [TYPE, INAPP]], [
31187
+ /musical_ly(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
31188
+ ], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [
31189
+ /\[(linkedin)app\]/i // LinkedIn App for iOS & Android
31190
+ ], [NAME, [TYPE, INAPP]], [
31191
+ /(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i // Zalo
31192
+ ], [[NAME, /(.+)/, 'Zalo'], VERSION, [TYPE, INAPP]], [
31193
+
31194
+ /(chromium)[\/ ]([-\w\.]+)/i // Chromium
31195
+ ], [NAME, VERSION], [
31196
+
31197
+ /headlesschrome(?:\/([\w\.]+)| )/i // Chrome Headless
31198
+ ], [VERSION, [NAME, CHROME+' Headless']], [
31199
+
31200
+ /wv\).+chrome\/([\w\.]+).+edgw\//i // Edge WebView2
31201
+ ], [VERSION, [NAME, EDGE+' WebView2']], [
31202
+
31203
+ / wv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
31204
+ ], [[NAME, CHROME+' WebView'], VERSION], [
31205
+
31206
+ /droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i // Android Browser
31207
+ ], [VERSION, [NAME, 'Android' + SUFFIX_BROWSER]], [
31208
+
31209
+ /chrome\/([\w\.]+) mobile/i // Chrome Mobile
31210
+ ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [
31211
+
31212
+ /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
31213
+ ], [NAME, VERSION], [
31214
+
31215
+ /version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i // Safari Mobile
31216
+ ], [VERSION, [NAME, PREFIX_MOBILE + 'Safari']], [
31217
+ /iphone .*mobile(?:\/\w+ | ?)safari/i
31218
+ ], [[NAME, PREFIX_MOBILE + 'Safari']], [
31219
+ /version\/([\w\.\,]+) .*(safari)/i // Safari
31220
+ ], [VERSION, NAME], [
31221
+ /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
31222
+ ], [NAME, [VERSION, '1']], [
31223
+
31224
+ /(webkit|khtml)\/([\w\.]+)/i
31225
+ ], [NAME, VERSION], [
31226
+
31227
+ // Gecko based
31228
+ /(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i // Firefox Mobile
31229
+ ], [[NAME, PREFIX_MOBILE + FIREFOX], VERSION], [
31230
+ /(navigator|netscape\d?)\/([-\w\.]+)/i // Netscape
31231
+ ], [[NAME, 'Netscape'], VERSION], [
31232
+ /(wolvic|librewolf)\/([\w\.]+)/i // Wolvic/LibreWolf
31233
+ ], [NAME, VERSION], [
31234
+ /mobile vr; rv:([\w\.]+)\).+firefox/i // Firefox Reality
31235
+ ], [VERSION, [NAME, FIREFOX+' Reality']], [
31236
+ /ekiohf.+(flow)\/([\w\.]+)/i, // Flow
31237
+ /(swiftfox)/i, // Swiftfox
31238
+ /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,
31239
+ // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
31240
+ /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,
31241
+ // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
31242
+ /(firefox)\/([\w\.]+)/i, // Other Firefox-based
31243
+ /(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i, // Mozilla
31244
+
31245
+ // Other
31246
+ /(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
31247
+ // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird
31248
+ /\b(links) \(([\w\.]+)/i // Links
31249
+ ], [NAME, [VERSION, /_/g, '.']], [
31250
+
31251
+ /(cobalt)\/([\w\.]+)/i // Cobalt
31252
+ ], [NAME, [VERSION, /[^\d\.]+./, EMPTY]]
31253
+ ],
31254
+
31255
+ cpu : [[
31256
+
31257
+ /\b((amd|x|x86[-_]?|wow|win)64)\b/i // AMD64 (x64)
31258
+ ], [[ARCHITECTURE, 'amd64']], [
31259
+
31260
+ /(ia32(?=;))/i, // IA32 (quicktime)
31261
+ /\b((i[346]|x)86)(pc)?\b/i // IA32 (x86)
31262
+ ], [[ARCHITECTURE, 'ia32']], [
31263
+
31264
+ /\b(aarch64|arm(v?[89]e?l?|_?64))\b/i // ARM64
31265
+ ], [[ARCHITECTURE, 'arm64']], [
31266
+
31267
+ /\b(arm(v[67])?ht?n?[fl]p?)\b/i // ARMHF
31268
+ ], [[ARCHITECTURE, 'armhf']], [
31269
+
31270
+ // PocketPC mistakenly identified as PowerPC
31271
+ /( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i
31272
+ ], [[ARCHITECTURE, 'arm']], [
31273
+
31274
+ / sun4\w[;\)]/i // SPARC
31275
+ ], [[ARCHITECTURE, 'sparc']], [
31276
+ // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
31277
+ /\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,
31278
+ /((ppc|powerpc)(64)?)( mac|;|\))/i, // PowerPC
31279
+ /(?:osf1|[freopnt]{3,4}bsd) (alpha)/i // Alpha
31280
+ ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [
31281
+ /mc680.0/i
31282
+ ], [[ARCHITECTURE, '68k']], [
31283
+ /winnt.+\[axp/i
31284
+ ], [[ARCHITECTURE, 'alpha']]
31285
+ ],
31286
+
31287
+ device : [[
31288
+
31289
+ //////////////////////////
31290
+ // MOBILES & TABLETS
31291
+ /////////////////////////
31292
+
31293
+ // Samsung
31294
+ /\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i
31295
+ ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [
31296
+ /\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
31297
+ /samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,
31298
+ /sec-(sgh\w+)/i
31299
+ ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [
31300
+
31301
+ // Apple
31302
+ /(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i // iPod/iPhone
31303
+ ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [
31304
+ /\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i, // iPad
31305
+ /\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i
31306
+ ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [
31307
+ /(macintosh);/i
31308
+ ], [MODEL, [VENDOR, APPLE]], [
31309
+
31310
+ // Sharp
31311
+ /\b(sh-?[altvz]?\d\d[a-ekm]?)/i
31312
+ ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [
31313
+
31314
+ // Honor
31315
+ /\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i
31316
+ ], [MODEL, [VENDOR, HONOR], [TYPE, TABLET]], [
31317
+ /honor([-\w ]+)[;\)]/i
31318
+ ], [MODEL, [VENDOR, HONOR], [TYPE, MOBILE]], [
31319
+
31320
+ // Huawei
31321
+ /\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i
31322
+ ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [
31323
+ /(?:huawei) ?([-\w ]+)[;\)]/i,
31324
+ /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i
31325
+ ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [
31326
+
31327
+ // Xiaomi
31328
+ /oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,
31329
+ /\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i // Mi Pad tablets
31330
+ ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
31331
+
31332
+ /\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i, // Xiaomi POCO
31333
+ /\b; (\w+) build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
31334
+ /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
31335
+ /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi
31336
+ /oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i, // Xiaomi Redmi 'numeric' models
31337
+ /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i, // Xiaomi Mi
31338
+ / ([\w ]+) miui\/v?\d/i
31339
+ ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
31340
+
31341
+ // OnePlus
31342
+ /droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-k]\w[1m]10)\b/i,
31343
+ /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
31344
+ ], [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]], [
31345
+
31346
+ // OPPO
31347
+ /; (\w+) bui.+ oppo/i,
31348
+ /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i
31349
+ ], [MODEL, [VENDOR, OPPO], [TYPE, MOBILE]], [
31350
+ /\b(opd2(\d{3}a?))(?: bui|\))/i
31351
+ ], [MODEL, [VENDOR, strMapper, { 'OnePlus' : ['203', '304', '403', '404', '413', '415'], '*' : OPPO }], [TYPE, TABLET]], [
31352
+
31353
+ // BLU
31354
+ /(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i // Vivo series
31355
+ ], [MODEL, [VENDOR, 'BLU'], [TYPE, MOBILE]], [
31356
+
31357
+ // Vivo
31358
+ /; vivo (\w+)(?: bui|\))/i,
31359
+ /\b(v[12]\d{3}\w?[at])(?: bui|;)/i
31360
+ ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
31361
+
31362
+ // Realme
31363
+ /\b(rmx[1-3]\d{3})(?: bui|;|\))/i
31364
+ ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
31365
+
31366
+ // Lenovo
31367
+ /(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,
31368
+ /lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i
31369
+ ], [MODEL, [VENDOR, LENOVO], [TYPE, TABLET]], [
31370
+ /lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i
31371
+ ], [MODEL, [VENDOR, LENOVO], [TYPE, MOBILE]], [
31372
+
31373
+ // Motorola
31374
+ /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
31375
+ /\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,
31376
+ /((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i
31377
+ ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [
31378
+ /\b(mz60\d|xoom[2 ]{0,2}) build\//i
31379
+ ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [
31380
+
31381
+ // LG
31382
+ /((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
31383
+ ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [
31384
+ /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
31385
+ /\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,
31386
+ /\blg-?([\d\w]+) bui/i
31387
+ ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [
31388
+
31389
+ // Nokia
31390
+ /(nokia) (t[12][01])/i
31391
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
31392
+ /(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,
31393
+ /nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i
31394
+ ], [[MODEL, /_/g, ' '], [TYPE, MOBILE], [VENDOR, 'Nokia']], [
31395
+
31396
+ // Google
31397
+ /(pixel (c|tablet))\b/i // Google Pixel C/Tablet
31398
+ ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [
31399
+ // Google Pixel
31400
+ /droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i
31401
+ ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [
31402
+ /(google) (pixelbook( go)?)/i
31403
+ ], [VENDOR, MODEL], [
31404
+
31405
+ // Sony
31406
+ /droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i
31407
+ ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [
31408
+ /sony tablet [ps]/i,
31409
+ /\b(?:sony)?sgp\w+(?: bui|\))/i
31410
+ ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [
31411
+
31412
+ // Amazon
31413
+ /(alexa)webm/i,
31414
+ /(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i, // Kindle Fire without Silk / Echo Show
31415
+ /(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD
31416
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [
31417
+ /((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone
31418
+ ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [
31419
+
31420
+ // BlackBerry
31421
+ /(playbook);[-\w\),; ]+(rim)/i // BlackBerry PlayBook
31422
+ ], [MODEL, VENDOR, [TYPE, TABLET]], [
31423
+ /\b((?:bb[a-f]|st[hv])100-\d)/i,
31424
+ /(?:blackberry|\(bb10;) (\w+)/i
31425
+ ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [
31426
+
31427
+ // Asus
31428
+ /(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i
31429
+ ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [
31430
+ / (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i
31431
+ ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [
31432
+
31433
+ // HTC
31434
+ /(nexus 9)/i // HTC Nexus 9
31435
+ ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
31436
+ /(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i, // HTC
31437
+
31438
+ // ZTE
31439
+ /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
31440
+ /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
31441
+ ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
31442
+
31443
+ // TCL
31444
+ /tcl (xess p17aa)/i,
31445
+ /droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i
31446
+ ], [MODEL, [VENDOR, 'TCL'], [TYPE, TABLET]], [
31447
+ /droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i
31448
+ ], [MODEL, [VENDOR, 'TCL'], [TYPE, MOBILE]], [
31449
+
31450
+ // itel
31451
+ /(itel) ((\w+))/i
31452
+ ], [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { 'tablet' : ['p10001l', 'w7001'], '*' : 'mobile' }]], [
31453
+
31454
+ // Acer
31455
+ /droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
31456
+ ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
31457
+
31458
+ // Meizu
31459
+ /droid.+; (m[1-5] note) bui/i,
31460
+ /\bmz-([-\w]{2,})/i
31461
+ ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
31462
+
31463
+ // Ulefone
31464
+ /; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
31465
+ ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [
31466
+
31467
+ // Energizer
31468
+ /; (energy ?\w+)(?: bui|\))/i,
31469
+ /; energizer ([\w ]+)(?: bui|\))/i
31470
+ ], [MODEL, [VENDOR, 'Energizer'], [TYPE, MOBILE]], [
31471
+
31472
+ // Cat
31473
+ /; cat (b35);/i,
31474
+ /; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i
31475
+ ], [MODEL, [VENDOR, 'Cat'], [TYPE, MOBILE]], [
31476
+
31477
+ // Smartfren
31478
+ /((?:new )?andromax[\w- ]+)(?: bui|\))/i
31479
+ ], [MODEL, [VENDOR, 'Smartfren'], [TYPE, MOBILE]], [
31480
+
31481
+ // Nothing
31482
+ /droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i
31483
+ ], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [
31484
+
31485
+ // Archos
31486
+ /; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,
31487
+ /archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i
31488
+ ], [MODEL, [VENDOR, 'Archos'], [TYPE, TABLET]], [
31489
+ /archos ([\w ]+)( b|\))/i,
31490
+ /; (ac[3-6]\d\w{2,8})( b|\))/i
31491
+ ], [MODEL, [VENDOR, 'Archos'], [TYPE, MOBILE]], [
31492
+
31493
+ // HMD
31494
+ /; (n159v)/i
31495
+ ], [MODEL, [VENDOR, 'HMD'], [TYPE, MOBILE]], [
31496
+
31497
+ // MIXED
31498
+ /(imo) (tab \w+)/i, // IMO
31499
+ /(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i // Infinix XPad / Tecno
31500
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
31501
+
31502
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
31503
+ // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan
31504
+ // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko
31505
+ /; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,
31506
+ /(hp) ([\w ]+\w)/i, // HP iPAQ
31507
+ /(microsoft); (lumia[\w ]+)/i, // Microsoft Lumia
31508
+ /(oppo) ?([\w ]+) bui/i, // OPPO
31509
+ /(hisense) ([ehv][\w ]+)\)/i, // Hisense
31510
+ /droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i // Philips
31511
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
31512
+
31513
+ /(kobo)\s(ereader|touch)/i, // Kobo
31514
+ /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad
31515
+ /(kindle)\/([\w\.]+)/i // Kindle
31516
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
31517
+
31518
+ /(surface duo)/i // Surface Duo
31519
+ ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [
31520
+ /droid [\d\.]+; (fp\du?)(?: b|\))/i // Fairphone
31521
+ ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [
31522
+ /((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i // Nvidia Tablets
31523
+ ], [MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]], [
31524
+ /(sprint) (\w+)/i // Sprint Phones
31525
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
31526
+ /(kin\.[onetw]{3})/i // Microsoft Kin
31527
+ ], [[MODEL, /\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [
31528
+ /droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra
31529
+ ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [
31530
+ /droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i
31531
+ ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [
31532
+
31533
+ ///////////////////
31534
+ // SMARTTVS
31535
+ ///////////////////
31536
+
31537
+ /(philips)[\w ]+tv/i, // Philips
31538
+ /smart-tv.+(samsung)/i // Samsung
31539
+ ], [VENDOR, [TYPE, SMARTTV]], [
31540
+ /hbbtv.+maple;(\d+)/i
31541
+ ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [
31542
+ /(vizio)(?: |.+model\/)(\w+-\w+)/i, // Vizio
31543
+ /tcast.+(lg)e?. ([-\w]+)/i // LG SmartTV
31544
+ ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
31545
+ /(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i
31546
+ ], [[VENDOR, LG], [TYPE, SMARTTV]], [
31547
+ /(apple) ?tv/i // Apple TV
31548
+ ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [
31549
+ /crkey.*devicetype\/chromecast/i // Google Chromecast Third Generation
31550
+ ], [[MODEL, CHROMECAST+' Third Generation'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
31551
+ /crkey.*devicetype\/([^/]*)/i // Google Chromecast with specific device type
31552
+ ], [[MODEL, /^/, 'Chromecast '], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
31553
+ /fuchsia.*crkey/i // Google Chromecast Nest Hub
31554
+ ], [[MODEL, CHROMECAST+' Nest Hub'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
31555
+ /crkey/i // Google Chromecast, Linux-based or unknown
31556
+ ], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
31557
+ /(portaltv)/i // Facebook Portal TV
31558
+ ], [MODEL, [VENDOR, FACEBOOK], [TYPE, SMARTTV]], [
31559
+ /droid.+aft(\w+)( bui|\))/i // Fire TV
31560
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
31561
+ /(shield \w+ tv)/i // Nvidia Shield TV
31562
+ ], [MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]], [
31563
+ /\(dtv[\);].+(aquos)/i,
31564
+ /(aquos-tv[\w ]+)\)/i // Sharp
31565
+ ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[
31566
+ /(bravia[\w ]+)( bui|\))/i // Sony
31567
+ ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [
31568
+ /(mi(tv|box)-?\w+) bui/i // Xiaomi
31569
+ ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [
31570
+ /Hbbtv.*(technisat) (.*);/i // TechniSAT
31571
+ ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
31572
+ /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku
31573
+ /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices
31574
+ ], [[VENDOR, /.+\/(\w+)/, '$1', strMapper, {'LG':'lge'}], [MODEL, trim], [TYPE, SMARTTV]], [
31575
+
31576
+ ///////////////////
31577
+ // CONSOLES
31578
+ ///////////////////
31579
+
31580
+ /(playstation \w+)/i // Playstation
31581
+ ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [
31582
+ /\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox
31583
+ ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [
31584
+ /(ouya)/i, // Ouya
31585
+ /(nintendo) (\w+)/i, // Nintendo
31586
+ /(retroid) (pocket ([^\)]+))/i // Retroid Pocket
31587
+ ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
31588
+ /droid.+; (shield)( bui|\))/i // Nvidia Portable
31589
+ ], [MODEL, [VENDOR, NVIDIA], [TYPE, CONSOLE]], [
31590
+
31591
+ ///////////////////
31592
+ // WEARABLES
31593
+ ///////////////////
31594
+
31595
+ /\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i // Samsung Galaxy Watch
31596
+ ], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [
31597
+ /((pebble))app/i, // Pebble
31598
+ /(asus|google|lg|oppo) ((pixel |zen)?watch[\w ]*)( bui|\))/i // Asus ZenWatch / LG Watch / Pixel Watch
31599
+ ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
31600
+ /(ow(?:19|20)?we?[1-3]{1,3})/i // Oppo Watch
31601
+ ], [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]], [
31602
+ /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
31603
+ ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [
31604
+ /(opwwe\d{3})/i // OnePlus Watch
31605
+ ], [MODEL, [VENDOR, ONEPLUS], [TYPE, WEARABLE]], [
31606
+ /(moto 360)/i // Motorola 360
31607
+ ], [MODEL, [VENDOR, MOTOROLA], [TYPE, WEARABLE]], [
31608
+ /(smartwatch 3)/i // Sony SmartWatch
31609
+ ], [MODEL, [VENDOR, SONY], [TYPE, WEARABLE]], [
31610
+ /(g watch r)/i // LG G Watch R
31611
+ ], [MODEL, [VENDOR, LG], [TYPE, WEARABLE]], [
31612
+ /droid.+; (wt63?0{2,3})\)/i
31613
+ ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [
31614
+
31615
+ ///////////////////
31616
+ // XR
31617
+ ///////////////////
31618
+
31619
+ /droid.+; (glass) \d/i // Google Glass
31620
+ ], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [
31621
+ /(pico) ([\w ]+) os\d/i // Pico
31622
+ ], [VENDOR, MODEL, [TYPE, XR]], [
31623
+ /(quest( \d| pro)?s?).+vr/i // Meta Quest
31624
+ ], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [
31625
+ /mobile vr; rv.+firefox/i // Unidentifiable VR device using Firefox Reality / Wolvic
31626
+ ], [[TYPE, XR]], [
31627
+
31628
+ ///////////////////
31629
+ // EMBEDDED
31630
+ ///////////////////
31631
+
31632
+ /(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i // Tesla
31633
+ ], [VENDOR, [TYPE, EMBEDDED]], [
31634
+ /(aeobc)\b/i // Echo Dot
31635
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [
31636
+ /(homepod).+mac os/i // Apple HomePod
31637
+ ], [MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]], [
31638
+ /windows iot/i // Unidentifiable embedded device using Windows IoT
31639
+ ], [[TYPE, EMBEDDED]], [
31640
+
31641
+ ////////////////////
31642
+ // MIXED (GENERIC)
31643
+ ///////////////////
31644
+
31645
+ /droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i // Unidentifiable SmartTV
31646
+ ], [MODEL, [TYPE, SMARTTV]], [
31647
+ /\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i
31648
+ ], [[TYPE, SMARTTV]], [
31649
+ /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i
31650
+ ], [MODEL, [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]], [
31651
+ /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet
31652
+ ], [[TYPE, TABLET]], [
31653
+ /(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile
31654
+ ], [[TYPE, MOBILE]], [
31655
+ /droid .+?; ([\w\. -]+)( bui|\))/i // Generic Android Device
31656
+ ], [MODEL, [VENDOR, 'Generic']]
31657
+ ],
31658
+
31659
+ engine : [[
31660
+
31661
+ /windows.+ edge\/([\w\.]+)/i // EdgeHTML
31662
+ ], [VERSION, [NAME, EDGE+'HTML']], [
31663
+
31664
+ /(arkweb)\/([\w\.]+)/i // ArkWeb
31665
+ ], [NAME, VERSION], [
31666
+
31667
+ /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
31668
+ ], [VERSION, [NAME, 'Blink']], [
31669
+
31670
+ /(presto)\/([\w\.]+)/i, // Presto
31671
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo
31672
+ /ekioh(flow)\/([\w\.]+)/i, // Flow
31673
+ /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links
31674
+ /(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab
31675
+
31676
+ /\b(libweb)/i // LibWeb
31677
+ ], [NAME, VERSION], [
31678
+ /ladybird\//i
31679
+ ], [[NAME, 'LibWeb']], [
31680
+
31681
+ /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
31682
+ ], [VERSION, NAME]
31683
+ ],
31684
+
31685
+ os : [[
31686
+
31687
+ // Windows
31688
+ /(windows nt) (6\.[23]); arm/i // Windows RT
31689
+ ], [[NAME, /N/, 'R'], [VERSION, strMapper, windowsVersionMap]], [
31690
+ /(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i, // Windows IoT/Mobile/Phone
31691
+ // Windows NT/3.1/95/98/ME/2000/XP/Vista/7/8/8.1/10/11
31692
+ /(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i
31693
+ ], [NAME, VERSION], [
31694
+ /windows nt ?([\d\.\)]*)(?!.+xbox)/i,
31695
+ /\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i
31696
+ ], [[VERSION, /(;|\))/g, '', strMapper, windowsVersionMap], [NAME, WINDOWS]], [
31697
+ /(windows ce)\/?([\d\.]*)/i // Windows CE
31698
+ ], [NAME, VERSION], [
31699
+
31700
+ // iOS/macOS
31701
+ /[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
31702
+ /(?:ios;fbsv|ios(?=.+ip(?:ad|hone))|ip(?:ad|hone)(?: |.+i(?:pad)?)os)[\/ ]([\w\.]+)/i,
31703
+ /cfnetwork\/.+darwin/i
31704
+ ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
31705
+ /(mac os x) ?([\w\. ]*)/i,
31706
+ /(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i // Mac OS
31707
+ ], [[NAME, 'macOS'], [VERSION, /_/g, '.']], [
31708
+
31709
+ // Google Chromecast
31710
+ /android ([\d\.]+).*crkey/i // Google Chromecast, Android-based
31711
+ ], [VERSION, [NAME, CHROMECAST + ' Android']], [
31712
+ /fuchsia.*crkey\/([\d\.]+)/i // Google Chromecast, Fuchsia-based
31713
+ ], [VERSION, [NAME, CHROMECAST + ' Fuchsia']], [
31714
+ /crkey\/([\d\.]+).*devicetype\/smartspeaker/i // Google Chromecast, Linux-based Smart Speaker
31715
+ ], [VERSION, [NAME, CHROMECAST + ' SmartSpeaker']], [
31716
+ /linux.*crkey\/([\d\.]+)/i // Google Chromecast, Legacy Linux-based
31717
+ ], [VERSION, [NAME, CHROMECAST + ' Linux']], [
31718
+ /crkey\/([\d\.]+)/i // Google Chromecast, unknown
31719
+ ], [VERSION, [NAME, CHROMECAST]], [
31720
+
31721
+ // Mobile OSes
31722
+ /droid ([\w\.]+)\b.+(android[- ]x86)/i // Android-x86
31723
+ ], [VERSION, NAME], [
31724
+ /(ubuntu) ([\w\.]+) like android/i // Ubuntu Touch
31725
+ ], [[NAME, /(.+)/, '$1 Touch'], VERSION], [
31726
+ /(harmonyos)[\/ ]?([\d\.]*)/i, // HarmonyOS
31727
+ // Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen
31728
+ /(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i
31729
+ ], [NAME, VERSION], [
31730
+ /\(bb(10);/i // BlackBerry 10
31731
+ ], [VERSION, [NAME, BLACKBERRY]], [
31732
+ /(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i // Symbian
31733
+ ], [VERSION, [NAME, 'Symbian']], [
31734
+ /mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i // Firefox OS
31735
+ ], [VERSION, [NAME, FIREFOX+' OS']], [
31736
+ /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i, // WebOS
31737
+ /webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i
31738
+ ], [VERSION, [NAME, 'webOS']], [
31739
+ /web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i
31740
+ // https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine
31741
+ ], [[VERSION, strMapper, {'25':'120','24':'108','23':'94','22':'87','6':'79','5':'68','4':'53','3':'38','2':'538','1':'537','*':'TV'}], [NAME, 'webOS']], [
31742
+ /watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i // watchOS
31743
+ ], [VERSION, [NAME, 'watchOS']], [
31744
+
31745
+ // Google ChromeOS
31746
+ /(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
31747
+ ], [[NAME, "Chrome OS"], VERSION],[
31748
+
31749
+ // Smart TVs
31750
+ /panasonic;(viera)/i, // Panasonic Viera
31751
+ /(netrange)mmh/i, // Netrange
31752
+ /(nettv)\/(\d+\.[\w\.]+)/i, // NetTV
31753
+
31754
+ // Console
31755
+ /(nintendo|playstation) (\w+)/i, // Nintendo/Playstation
31756
+ /(xbox); +xbox ([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
31757
+ /(pico) .+os([\w\.]+)/i, // Pico
31758
+
31759
+ // Other
31760
+ /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i, // Joli/Palm
31761
+ /linux.+(mint)[\/\(\) ]?([\w\.]*)/i, // Mint
31762
+ /(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i, // Mageia/VectorLinux/Fuchsia/ArcaOS/Arch
31763
+ /([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,
31764
+ // Ubuntu/Debian/SUSE/Gentoo/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire/Knoppix
31765
+ /((?:open)?solaris)[-\/ ]?([\w\.]*)/i, // Solaris
31766
+ /\b(aix)[; ]([1-9\.]{0,4})/i, // AIX
31767
+ /(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i, // Hurd/Linux/MorphOS
31768
+ /(gnu) ?([\w\.]*)/i, // GNU
31769
+ /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
31770
+ /(haiku) ?(r\d)?/i // Haiku
31771
+ ], [NAME, VERSION], [
31772
+ /(sunos) ?([\d\.]*)/i // Solaris
31773
+ ], [[NAME, 'Solaris'], VERSION], [
31774
+ /\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/OpenVMS/HP-UX/SerenityOS
31775
+ /(unix) ?([\w\.]*)/i // UNIX
31776
+ ], [NAME, VERSION]
31777
+ ]
31778
+ };
31779
+
31780
+ /////////////////
31781
+ // Factories
31782
+ ////////////////
31783
+
31784
+ var defaultProps = (function () {
31785
+ var props = { init : {}, isIgnore : {}, isIgnoreRgx : {}, toString : {}};
31786
+ setProps.call(props.init, [
31787
+ [BROWSER, [NAME, VERSION, MAJOR, TYPE]],
31788
+ [CPU, [ARCHITECTURE]],
31789
+ [DEVICE, [TYPE, MODEL, VENDOR]],
31790
+ [ENGINE, [NAME, VERSION]],
31791
+ [OS, [NAME, VERSION]]
31792
+ ]);
31793
+ setProps.call(props.isIgnore, [
31794
+ [BROWSER, [VERSION, MAJOR]],
31795
+ [ENGINE, [VERSION]],
31796
+ [OS, [VERSION]]
31797
+ ]);
31798
+ setProps.call(props.isIgnoreRgx, [
31799
+ [BROWSER, / ?browser$/i],
31800
+ [OS, / ?os$/i]
31801
+ ]);
31802
+ setProps.call(props.toString, [
31803
+ [BROWSER, [NAME, VERSION]],
31804
+ [CPU, [ARCHITECTURE]],
31805
+ [DEVICE, [VENDOR, MODEL]],
31806
+ [ENGINE, [NAME, VERSION]],
31807
+ [OS, [NAME, VERSION]]
31808
+ ]);
31809
+ return props;
31810
+ })();
31811
+
31812
+ var createIData = function (item, itemType) {
31813
+
31814
+ var init_props = defaultProps.init[itemType],
31815
+ is_ignoreProps = defaultProps.isIgnore[itemType] || 0,
31816
+ is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0,
31817
+ toString_props = defaultProps.toString[itemType] || 0;
31818
+
31819
+ function IData () {
31820
+ setProps.call(this, init_props);
31821
+ }
31822
+
31823
+ IData.prototype.getItem = function () {
31824
+ return item;
31825
+ };
31826
+
31827
+ IData.prototype.withClientHints = function () {
31828
+
31829
+ // nodejs / non-client-hints browsers
31830
+ if (!NAVIGATOR_UADATA) {
31831
+ return item
31832
+ .parseCH()
31833
+ .get();
31834
+ }
31835
+
31836
+ // browsers based on chromium 85+
31837
+ return NAVIGATOR_UADATA
31838
+ .getHighEntropyValues(CH_ALL_VALUES)
31839
+ .then(function (res) {
31840
+ return item
31841
+ .setCH(new UACHData(res, false))
31842
+ .parseCH()
31843
+ .get();
31844
+ });
31845
+ };
31846
+
31847
+ IData.prototype.withFeatureCheck = function () {
31848
+ return item.detectFeature().get();
31849
+ };
31850
+
31851
+ if (itemType != RESULT) {
31852
+ IData.prototype.is = function (strToCheck) {
31853
+ var is = false;
31854
+ for (var i in this) {
31855
+ if (this.hasOwnProperty(i) && !has(is_ignoreProps, i) && lowerize(is_ignoreRgx ? strip(is_ignoreRgx, this[i]) : this[i]) == lowerize(is_ignoreRgx ? strip(is_ignoreRgx, strToCheck) : strToCheck)) {
31856
+ is = true;
31857
+ if (strToCheck != TYPEOF.UNDEFINED) break;
31858
+ } else if (strToCheck == TYPEOF.UNDEFINED && is) {
31859
+ is = !is;
31860
+ break;
31861
+ }
31862
+ }
31863
+ return is;
31864
+ };
31865
+ IData.prototype.toString = function () {
31866
+ var str = EMPTY;
31867
+ for (var i in toString_props) {
31868
+ if (typeof(this[toString_props[i]]) !== TYPEOF.UNDEFINED) {
31869
+ str += (str ? ' ' : EMPTY) + this[toString_props[i]];
31870
+ }
31871
+ }
31872
+ return str || TYPEOF.UNDEFINED;
31873
+ };
31874
+ }
31875
+
31876
+ if (!NAVIGATOR_UADATA) {
31877
+ IData.prototype.then = function (cb) {
31878
+ var that = this;
31879
+ var IDataResolve = function () {
31880
+ for (var prop in that) {
31881
+ if (that.hasOwnProperty(prop)) {
31882
+ this[prop] = that[prop];
31883
+ }
31884
+ }
31885
+ };
31886
+ IDataResolve.prototype = {
31887
+ is : IData.prototype.is,
31888
+ toString : IData.prototype.toString
31889
+ };
31890
+ var resolveData = new IDataResolve();
31891
+ cb(resolveData);
31892
+ return resolveData;
31893
+ };
31894
+ }
31895
+
31896
+ return new IData();
31897
+ };
31898
+
31899
+ /////////////////
31900
+ // Constructor
31901
+ ////////////////
31902
+
31903
+ function UACHData (uach, isHttpUACH) {
31904
+ uach = uach || {};
31905
+ setProps.call(this, CH_ALL_VALUES);
31906
+ if (isHttpUACH) {
31907
+ setProps.call(this, [
31908
+ [BRANDS, itemListToArray(uach[CH])],
31909
+ [FULLVERLIST, itemListToArray(uach[CH_FULL_VER_LIST])],
31910
+ [MOBILE, /\?1/.test(uach[CH_MOBILE])],
31911
+ [MODEL, stripQuotes(uach[CH_MODEL])],
31912
+ [PLATFORM, stripQuotes(uach[CH_PLATFORM])],
31913
+ [PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],
31914
+ [ARCHITECTURE, stripQuotes(uach[CH_ARCH])],
31915
+ [FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],
31916
+ [BITNESS, stripQuotes(uach[CH_BITNESS])]
31917
+ ]);
31918
+ } else {
31919
+ for (var prop in uach) {
31920
+ if(this.hasOwnProperty(prop) && typeof uach[prop] !== TYPEOF.UNDEFINED) this[prop] = uach[prop];
31921
+ }
31922
+ }
31923
+ }
31924
+
31925
+ function UAItem (itemType, ua, rgxMap, uaCH) {
31926
+
31927
+ this.get = function (prop) {
31928
+ if (!prop) return this.data;
31929
+ return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined;
31930
+ };
31931
+
31932
+ this.set = function (prop, val) {
31933
+ this.data[prop] = val;
31934
+ return this;
31935
+ };
31936
+
31937
+ this.setCH = function (ch) {
31938
+ this.uaCH = ch;
31939
+ return this;
31940
+ };
31941
+
31942
+ this.detectFeature = function () {
31943
+ if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {
31944
+ switch (this.itemType) {
31945
+ case BROWSER:
31946
+ // Brave-specific detection
31947
+ if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == TYPEOF.FUNCTION) {
31948
+ this.set(NAME, 'Brave');
31949
+ }
31950
+ break;
31951
+ case DEVICE:
31952
+ // Chrome-specific detection: check for 'mobile' value of navigator.userAgentData
31953
+ if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {
31954
+ this.set(TYPE, MOBILE);
31955
+ }
31956
+ // iPadOS-specific detection: identified as Mac, but has some iOS-only properties
31957
+ if (this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== TYPEOF.UNDEFINED && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {
31958
+ this.set(MODEL, 'iPad')
31959
+ .set(TYPE, TABLET);
31960
+ }
31961
+ break;
31962
+ case OS:
31963
+ // Chrome-specific detection: check for 'platform' value of navigator.userAgentData
31964
+ if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {
31965
+ this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);
31966
+ }
31967
+ break;
31968
+ case RESULT:
31969
+ var data = this.data;
31970
+ var detect = function (itemType) {
31971
+ return data[itemType]
31972
+ .getItem()
31973
+ .detectFeature()
31974
+ .get();
31975
+ };
31976
+ this.set(BROWSER, detect(BROWSER))
31977
+ .set(CPU, detect(CPU))
31978
+ .set(DEVICE, detect(DEVICE))
31979
+ .set(ENGINE, detect(ENGINE))
31980
+ .set(OS, detect(OS));
31981
+ }
31982
+ }
31983
+ return this;
31984
+ };
31985
+
31986
+ this.parseUA = function () {
31987
+ if (this.itemType != RESULT) {
31988
+ rgxMapper.call(this.data, this.ua, this.rgxMap);
31989
+ }
31990
+ switch (this.itemType) {
31991
+ case BROWSER:
31992
+ this.set(MAJOR, majorize(this.get(VERSION)));
31993
+ break;
31994
+ case OS:
31995
+ if (this.get(NAME) == 'iOS' && this.get(VERSION) == '18.6') {
31996
+ // Based on the assumption that iOS version is tightly coupled with Safari version
31997
+ var realVersion = /\) Version\/([\d\.]+)/.exec(this.ua); // Get Safari version
31998
+ if (realVersion && parseInt(realVersion[1].substring(0,2), 10) >= 26) {
31999
+ this.set(VERSION, realVersion[1]); // Set as iOS version
32000
+ }
32001
+ }
32002
+ break;
32003
+ }
32004
+ return this;
32005
+ };
32006
+
32007
+ this.parseCH = function () {
32008
+ var uaCH = this.uaCH,
32009
+ rgxMap = this.rgxMap;
32010
+
32011
+ switch (this.itemType) {
32012
+ case BROWSER:
32013
+ case ENGINE:
32014
+ var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;
32015
+ if (brands) {
32016
+ for (var i=0; i<brands.length; i++) {
32017
+ var brandName = brands[i].brand || brands[i],
32018
+ brandVersion = brands[i].version;
32019
+ if (this.itemType == BROWSER &&
32020
+ !/not.a.brand/i.test(brandName) &&
32021
+ (!prevName ||
32022
+ (/Chrom/.test(prevName) && brandName != CHROMIUM) ||
32023
+ (prevName == EDGE && /WebView2/.test(brandName))
32024
+ )) {
32025
+ brandName = strMapper(brandName, browserHintsMap);
32026
+ prevName = this.get(NAME);
32027
+ if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) {
32028
+ this.set(NAME, brandName)
32029
+ .set(VERSION, brandVersion)
32030
+ .set(MAJOR, majorize(brandVersion));
32031
+ }
32032
+ prevName = brandName;
32033
+ }
32034
+ if (this.itemType == ENGINE && brandName == CHROMIUM) {
32035
+ this.set(VERSION, brandVersion);
32036
+ }
32037
+ }
32038
+ }
32039
+ break;
32040
+ case CPU:
32041
+ var archName = uaCH[ARCHITECTURE];
32042
+ if (archName) {
32043
+ if (archName && uaCH[BITNESS] == '64') archName += '64';
32044
+ rgxMapper.call(this.data, archName + ';', rgxMap);
32045
+ }
32046
+ break;
32047
+ case DEVICE:
32048
+ if (uaCH[MOBILE]) {
32049
+ this.set(TYPE, MOBILE);
32050
+ }
32051
+ if (uaCH[MODEL]) {
32052
+ this.set(MODEL, uaCH[MODEL]);
32053
+ if (!this.get(TYPE) || !this.get(VENDOR)) {
32054
+ var reParse = {};
32055
+ rgxMapper.call(reParse, 'droid 9; ' + uaCH[MODEL] + ')', rgxMap);
32056
+ if (!this.get(TYPE) && !!reParse.type) {
32057
+ this.set(TYPE, reParse.type);
32058
+ }
32059
+ if (!this.get(VENDOR) && !!reParse.vendor) {
32060
+ this.set(VENDOR, reParse.vendor);
32061
+ }
32062
+ }
32063
+ }
32064
+ if (uaCH[FORMFACTORS]) {
32065
+ var ff;
32066
+ if (typeof uaCH[FORMFACTORS] !== 'string') {
32067
+ var idx = 0;
32068
+ while (!ff && idx < uaCH[FORMFACTORS].length) {
32069
+ ff = strMapper(uaCH[FORMFACTORS][idx++], formFactorsMap);
32070
+ }
32071
+ } else {
32072
+ ff = strMapper(uaCH[FORMFACTORS], formFactorsMap);
32073
+ }
32074
+ this.set(TYPE, ff);
32075
+ }
32076
+ break;
32077
+ case OS:
32078
+ var osName = uaCH[PLATFORM];
32079
+ if(osName) {
32080
+ var osVersion = uaCH[PLATFORMVER];
32081
+ if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10');
32082
+ this.set(NAME, osName)
32083
+ .set(VERSION, osVersion);
32084
+ }
32085
+ // Xbox-Specific Detection
32086
+ if (this.get(NAME) == WINDOWS && uaCH[MODEL] == 'Xbox') {
32087
+ this.set(NAME, 'Xbox')
32088
+ .set(VERSION, undefined);
32089
+ }
32090
+ break;
32091
+ case RESULT:
32092
+ var data = this.data;
32093
+ var parse = function (itemType) {
32094
+ return data[itemType]
32095
+ .getItem()
32096
+ .setCH(uaCH)
32097
+ .parseCH()
32098
+ .get();
32099
+ };
32100
+ this.set(BROWSER, parse(BROWSER))
32101
+ .set(CPU, parse(CPU))
32102
+ .set(DEVICE, parse(DEVICE))
32103
+ .set(ENGINE, parse(ENGINE))
32104
+ .set(OS, parse(OS));
32105
+ }
32106
+ return this;
32107
+ };
32108
+
32109
+ setProps.call(this, [
32110
+ ['itemType', itemType],
32111
+ ['ua', ua],
32112
+ ['uaCH', uaCH],
32113
+ ['rgxMap', rgxMap],
32114
+ ['data', createIData(this, itemType)]
32115
+ ]);
32116
+
32117
+ return this;
32118
+ }
32119
+
32120
+ function UAParser (ua, extensions, headers) {
32121
+
32122
+ if (typeof ua === TYPEOF.OBJECT) {
32123
+ if (isExtensions(ua, true)) {
32124
+ if (typeof extensions === TYPEOF.OBJECT) {
32125
+ headers = extensions; // case UAParser(extensions, headers)
32126
+ }
32127
+ extensions = ua; // case UAParser(extensions)
32128
+ } else {
32129
+ headers = ua; // case UAParser(headers)
32130
+ extensions = undefined;
32131
+ }
32132
+ ua = undefined;
32133
+ } else if (typeof ua === TYPEOF.STRING && !isExtensions(extensions, true)) {
32134
+ headers = extensions; // case UAParser(ua, headers)
32135
+ extensions = undefined;
32136
+ }
32137
+
32138
+ if (headers) {
32139
+ if (typeof headers.append === TYPEOF.FUNCTION) {
32140
+ // Convert Headers object into a plain object
32141
+ var kv = {};
32142
+ headers.forEach(function (v, k) { kv[String(k).toLowerCase()] = v; });
32143
+ headers = kv;
32144
+ } else {
32145
+ // Normalize headers field name into lowercase
32146
+ var normalized = {};
32147
+ for (var header in headers) {
32148
+ if (headers.hasOwnProperty(header)) {
32149
+ normalized[String(header).toLowerCase()] = headers[header];
32150
+ }
32151
+ }
32152
+ headers = normalized;
32153
+ }
32154
+ }
32155
+
32156
+ if (!(this instanceof UAParser)) {
32157
+ return new UAParser(ua, extensions, headers).getResult();
32158
+ }
32159
+
32160
+ var userAgent = typeof ua === TYPEOF.STRING ? ua : // Passed user-agent string
32161
+ (headers && headers[USER_AGENT] ? headers[USER_AGENT] : // User-Agent from passed headers
32162
+ ((NAVIGATOR && NAVIGATOR.userAgent) ? NAVIGATOR.userAgent : // navigator.userAgent
32163
+ EMPTY)), // empty string
32164
+
32165
+ httpUACH = new UACHData(headers, true),
32166
+ regexMap = extensions ?
32167
+ extend(defaultRegexes, extensions) :
32168
+ defaultRegexes,
32169
+
32170
+ createItemFunc = function (itemType) {
32171
+ if (itemType == RESULT) {
32172
+ return function () {
32173
+ return new UAItem(itemType, userAgent, regexMap, httpUACH)
32174
+ .set('ua', userAgent)
32175
+ .set(BROWSER, this.getBrowser())
32176
+ .set(CPU, this.getCPU())
32177
+ .set(DEVICE, this.getDevice())
32178
+ .set(ENGINE, this.getEngine())
32179
+ .set(OS, this.getOS())
32180
+ .get();
32181
+ };
32182
+ } else {
32183
+ return function () {
32184
+ return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH)
32185
+ .parseUA()
32186
+ .get();
32187
+ };
32188
+ }
32189
+ };
32190
+
32191
+ // public methods
32192
+ setProps.call(this, [
32193
+ ['getBrowser', createItemFunc(BROWSER)],
32194
+ ['getCPU', createItemFunc(CPU)],
32195
+ ['getDevice', createItemFunc(DEVICE)],
32196
+ ['getEngine', createItemFunc(ENGINE)],
32197
+ ['getOS', createItemFunc(OS)],
32198
+ ['getResult', createItemFunc(RESULT)],
32199
+ ['getUA', function () { return userAgent; }],
32200
+ ['setUA', function (ua) {
32201
+ if (isString(ua)) userAgent = trim(ua, UA_MAX_LENGTH);
32202
+ return this;
32203
+ }]
32204
+ ])
32205
+ .setUA(userAgent);
32206
+
32207
+ return this;
32208
+ }
32209
+
32210
+ UAParser.VERSION = LIBVERSION;
32211
+ UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR, TYPE]);
32212
+ UAParser.CPU = enumerize([ARCHITECTURE]);
32213
+ UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);
32214
+ UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);
32215
+
32216
+
30734
32217
  // EXTERNAL MODULE: ./node_modules/crypto-js/index.js
30735
32218
  var crypto_js = __webpack_require__(1396);
30736
32219
  var crypto_js_default = /*#__PURE__*/__webpack_require__.n(crypto_js);
@@ -30738,6 +32221,7 @@ var crypto_js_default = /*#__PURE__*/__webpack_require__.n(crypto_js);
30738
32221
 
30739
32222
 
30740
32223
 
32224
+
30741
32225
  /**
30742
32226
  *
30743
32227
  * @returns 获取登录验证码图片
@@ -30843,9 +32327,16 @@ const loginAccount = async (data, appid) => {
30843
32327
  //登录平台成功
30844
32328
  if (code == 10110004) {
30845
32329
  let id = response.id;
32330
+ // 初始化解析器
32331
+ const parser = new ua_parser_namespaceObject["default"]();
32332
+ // 获取浏览器信息
32333
+ const browser = parser.getBrowser();
32334
+ let timestamp = new Date().getTime();
32335
+ let clientID = browser.name + "_" + browser.version + "_" + timestamp;
30846
32336
  window.sessionStorage.setItem("iportal_login_user_id", id);
30847
32337
  window.sessionStorage.setItem("iportal_group_id", data.groupid);
30848
32338
  window.sessionStorage.setItem("iportal_login_user_key", old_key);
32339
+ window.sessionStorage.setItem("iportal_client_id", clientID);
30849
32340
  return {
30850
32341
  code: code
30851
32342
  };
@@ -30968,20 +32459,15 @@ const getFileSize = async url => {
30968
32459
  try {
30969
32460
  // 发送HEAD请求(不下载文件内容)
30970
32461
  const response = await fetch(url, {
30971
- method: 'HEAD'
32462
+ method: 'GET',
32463
+ headers: {
32464
+ 'Range': 'bytes=0-0'
32465
+ } // 仅请求第 1 个字节
30972
32466
  });
30973
-
30974
- // 检查响应状态
30975
- if (!response.ok) {
30976
- throw new Error(`请求失败,状态码: ${response.status}`);
30977
- }
30978
-
30979
- // 获取Content-Length头部
30980
- const contentLength = response.headers.get('Content-Length');
30981
- if (!contentLength) {
30982
- throw new Error('未找到Content-Length响应头');
30983
- }
30984
- return parseInt(contentLength, 10);
32467
+ if (response.status !== 206) throw new Error('不支持 Range 请求');
32468
+ const contentRange = response.headers.get('Content-Range');
32469
+ const totalSize = contentRange?.match(/\/(\d+)$/)?.[1]; // 解析总大小(如 "bytes 0-0/1000" → 1000)
32470
+ return totalSize ? parseInt(totalSize, 10) : -1;
30985
32471
  } catch (error) {
30986
32472
  console.error('获取文件大小失败:', error);
30987
32473
  return -1; // 返回-1表示失败
@@ -31084,7 +32570,7 @@ class ChatClientMgr {
31084
32570
  this.singleChatID = params.singleChatID || "";
31085
32571
  this.customParams = params.customParams || {};
31086
32572
  this.chartOrigin = params.chartOrigin;
31087
- console.log("ChatClientMgr init:", this.actionKey);
32573
+ // console.log("ChatClientMgr init:", this.actionKey);
31088
32574
  }
31089
32575
  makeKey(key) {
31090
32576
  return `${key}-${this.actionKey}`;
@@ -31457,14 +32943,14 @@ const getIMHanlder = customerHanlder => {
31457
32943
  getPortalDocmentInfo: async data => {
31458
32944
  let kb_doc_id = data.kb_doc_id;
31459
32945
  let doc_info = await getPortalDocmentInfo(kb_doc_id);
31460
- let urlStr = doc_info.summary;
32946
+ let urlStr = doc_info?.summary;
31461
32947
  if (urlStr) {
31462
32948
  let urlObj = JSON.parse(urlStr);
31463
- if (urlObj && urlObj.url) {
32949
+ if (urlObj) {
31464
32950
  let url = urlObj[0].url;
31465
32951
  let home_page = window.smardaten_api_context_path;
31466
32952
  let finalUrl = `${home_page}/storage_area/public${url}`;
31467
- let fileSize = await (0,utils_namespaceObject.getFileSize)(finalUrl);
32953
+ let fileSize = await getFileSize(finalUrl);
31468
32954
  doc_info.fileSize = fileSize;
31469
32955
  }
31470
32956
  }