@incodetech/core 0.0.0-dev-20260402-682edb5 → 0.0.0-dev-20260402-7cf9db4

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.
Files changed (91) hide show
  1. package/dist/Actor-phIcsUhv.d.ts +2 -0
  2. package/dist/BaseWasmProvider-BFXU7jj8.esm.js +1536 -0
  3. package/dist/BrowserEnvironmentProvider-DApG6lNu.esm.js +89 -0
  4. package/dist/BrowserTimerProvider-CRhCvln7.esm.js +22 -0
  5. package/dist/Manager-BndLda4_.d.ts +19 -0
  6. package/dist/{events-Cc1xUUgF.esm.js → Manager-D_DMzMWz.esm.js} +114 -11
  7. package/dist/{warmup-CzfSiaMj.d.ts → StateMachine-CGAi8x_b.d.ts} +4 -1
  8. package/dist/StreamCanvasCapture-9VAzOfOv.esm.js +410 -0
  9. package/dist/WasmUtilProvider-DctESPCy.esm.js +114 -0
  10. package/dist/{addressSearch-DzOdaNEA.esm.js → addressSearch-CYGzuJJ3.esm.js} +3 -3
  11. package/dist/authentication.d.ts +9 -7
  12. package/dist/authentication.esm.js +12 -10
  13. package/dist/{authenticationManager-TaI12wf3.d.ts → authenticationManager-B5Yv9bDw.d.ts} +2 -2
  14. package/dist/{authenticationManager-CBSPCdJc.esm.js → authenticationManager-C9iQ1d2a.esm.js} +5 -5
  15. package/dist/{backCameraStream-BGAbuvw1.esm.js → backCameraStream-BJwEXNl4.esm.js} +2 -1
  16. package/dist/camera-D-MPXRbZ.esm.js +22 -0
  17. package/dist/camera-Dv2WEhGe.d.ts +4 -0
  18. package/dist/consent.d.ts +55 -54
  19. package/dist/consent.esm.js +2 -3
  20. package/dist/curp-validation.d.ts +5 -3
  21. package/dist/curp-validation.esm.js +2 -3
  22. package/dist/deepsightLoader-D2MKmB5z.esm.js +48 -0
  23. package/dist/{deepsightService-DxA--87N.d.ts → deepsightService-CWnhwXLw.d.ts} +223 -17
  24. package/dist/document-capture.d.ts +58 -56
  25. package/dist/document-capture.esm.js +5 -4
  26. package/dist/document-upload.d.ts +47 -45
  27. package/dist/document-upload.esm.js +5 -4
  28. package/dist/ekyb.d.ts +3 -2
  29. package/dist/ekyb.esm.js +8 -7
  30. package/dist/ekyc.d.ts +3 -2
  31. package/dist/ekyc.esm.js +133 -123
  32. package/dist/email.d.ts +3 -2
  33. package/dist/email.esm.js +4 -4
  34. package/dist/{emailManager-DN_q_zxy.d.ts → emailManager-BIq6pJa8.d.ts} +11 -4
  35. package/dist/{emailManager-DSR9gQLX.esm.js → emailManager-C5GCSw78.esm.js} +43 -23
  36. package/dist/extensibility.d.ts +45 -43
  37. package/dist/extensibility.esm.js +26 -15
  38. package/dist/face-match.d.ts +1 -1
  39. package/dist/face-match.esm.js +2 -3
  40. package/dist/{faceCaptureManagerFactory-CGpkO_S3.d.ts → faceCaptureManagerFactory-CN5-GRxP.d.ts} +89 -142
  41. package/dist/{faceCaptureSetup-Rr7LUbBm.esm.js → faceCaptureSetup-DYRykM5Y.esm.js} +413 -7
  42. package/dist/flow.d.ts +6 -5
  43. package/dist/flow.esm.js +7 -7
  44. package/dist/{flowCompletionService-Bkaerugt.esm.js → flowCompletionService-CBvXiMKa.esm.js} +1 -1
  45. package/dist/{flowServices-Bt6lMLUI.esm.js → flowServices-CQ3rTJLE.esm.js} +2 -2
  46. package/dist/geolocation.d.ts +2 -1
  47. package/dist/geolocation.esm.js +16 -3
  48. package/dist/government-validation.d.ts +2 -1
  49. package/dist/government-validation.esm.js +3 -3
  50. package/dist/id.d.ts +9 -6
  51. package/dist/id.esm.js +14 -11
  52. package/dist/{idCaptureManager-Dc2NJMy_.d.ts → idCaptureManager-B1RWflj0.d.ts} +15 -12
  53. package/dist/{idCaptureManager-QyM4nIKM.esm.js → idCaptureManager-D5rjCu9r.esm.js} +178 -8
  54. package/dist/index.d.ts +68 -21
  55. package/dist/index.esm.js +440 -11
  56. package/dist/mandatory-consent.d.ts +58 -56
  57. package/dist/mandatory-consent.esm.js +2 -3
  58. package/dist/phone.d.ts +3 -2
  59. package/dist/phone.esm.js +4 -4
  60. package/dist/{phoneManager-D2A0hXXq.d.ts → phoneManager-Ba66ysK2.d.ts} +9 -2
  61. package/dist/{phoneManager-D2nZtu-b.esm.js → phoneManager-CQJim-Ky.esm.js} +32 -21
  62. package/dist/platform-B3nGssGZ.esm.js +83 -0
  63. package/dist/redirect-to-mobile.d.ts +2 -1
  64. package/dist/redirect-to-mobile.esm.js +3 -3
  65. package/dist/selfie.d.ts +9 -7
  66. package/dist/selfie.esm.js +12 -10
  67. package/dist/{selfieManager-B4Nnp7ws.d.ts → selfieManager-BnfnTPcx.d.ts} +2 -2
  68. package/dist/{selfieManager-CvE35L72.esm.js → selfieManager-DYW1C2GP.esm.js} +4 -3
  69. package/dist/session-TBPhHmyy.esm.js +3130 -0
  70. package/dist/session.d.ts +1 -1
  71. package/dist/session.esm.js +2 -2
  72. package/dist/signature.d.ts +3 -3
  73. package/dist/signature.esm.js +3 -4
  74. package/dist/{stats-D0m3TvIg.esm.js → stats-D4C7iDy1.esm.js} +1 -1
  75. package/dist/stats.esm.js +2 -2
  76. package/dist/{types-oveF7RrS.d.ts → types-BWGxcjiZ.d.ts} +1 -1
  77. package/dist/{types-mQLzH6uw.d.ts → types-BX1ZlbSR.d.ts} +1 -1
  78. package/package.json +1 -1
  79. package/dist/deepsightLoader-B93Oa9pS.esm.js +0 -24
  80. package/dist/deepsightService-CLUMQ5ee.esm.js +0 -235
  81. package/dist/index-BTaLQSj9.d.ts +0 -219
  82. package/dist/recordingsRepository-Djt_In2b.esm.js +0 -122
  83. package/dist/session-CUy9-Yzi.esm.js +0 -250
  84. package/dist/src-8rn6DoH7.esm.js +0 -6554
  85. /package/dist/{api-G4JA8CXK.esm.js → api-3fZO5bmj.esm.js} +0 -0
  86. /package/dist/{browserSimulation-C8gNnn5p.esm.js → browserSimulation-zWJAZ1vA.esm.js} +0 -0
  87. /package/dist/{displayErrors-BgtBHbfb.d.ts → displayErrors-DzzB3fcR.d.ts} +0 -0
  88. /package/dist/{flowCompletionService-De8JDo87.d.ts → flowCompletionService-C_CShl_d.d.ts} +0 -0
  89. /package/dist/{id-B30uqGbp.esm.js → id-Dv0it9CY.esm.js} +0 -0
  90. /package/dist/{index-LKrIp3Oo.d.ts → index-CuY8tqBC.d.ts} +0 -0
  91. /package/dist/{lib-qeMam2F_.esm.js → lib-B5byelWf.esm.js} +0 -0
@@ -0,0 +1,3130 @@
1
+ import { t as isBrowserSimulation } from "./browserSimulation-zWJAZ1vA.esm.js";
2
+ import { n as getApi, t as api } from "./api-3fZO5bmj.esm.js";
3
+ import { g as addEvent } from "./Manager-D_DMzMWz.esm.js";
4
+ import { t as endpoints } from "./endpoints-CCuj1KZH.esm.js";
5
+ import { t as BrowserEnvironmentProvider } from "./BrowserEnvironmentProvider-DApG6lNu.esm.js";
6
+
7
+ //#region src/internal/session/sessionService.ts
8
+ /**
9
+ * Creates a new onboarding session.
10
+ *
11
+ * @param apiKey - The API key from the Incode dashboard
12
+ * @param options - Session creation options
13
+ * @param signal - Optional AbortSignal for request cancellation
14
+ * @returns The created session with token
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * const session = await createSession('your-api-key', {
19
+ * configurationId: 'your-flow-id',
20
+ * language: 'en-US',
21
+ * });
22
+ * console.log(session.token); // Use this token for subsequent API calls
23
+ * ```
24
+ */
25
+ async function createSession(apiKey, options, signal) {
26
+ const res = await getApi().post(endpoints.createSession, {
27
+ configurationId: options.configurationId,
28
+ externalId: options.externalId,
29
+ externalCustomerId: options.externalCustomerId,
30
+ language: options.language ?? "en-US",
31
+ customFields: options.customFields,
32
+ uuid: options.uuid ?? null,
33
+ interviewId: options.interviewId ?? null
34
+ }, {
35
+ headers: {
36
+ "x-api-key": apiKey,
37
+ "api-version": "1.0"
38
+ },
39
+ signal
40
+ });
41
+ if (!res.ok) throw new Error(`POST ${endpoints.createSession} failed: ${res.status} ${res.statusText}`);
42
+ return res.data;
43
+ }
44
+
45
+ //#endregion
46
+ //#region ../../node_modules/.pnpm/ua-parser-js@2.0.9/node_modules/ua-parser-js/src/main/ua-parser.mjs
47
+ var LIBVERSION = "2.0.9", UA_MAX_LENGTH = 500, USER_AGENT = "user-agent", EMPTY = "", UNKNOWN = "?", TYPEOF = {
48
+ FUNCTION: "function",
49
+ OBJECT: "object",
50
+ STRING: "string",
51
+ UNDEFINED: "undefined"
52
+ }, BROWSER = "browser", CPU = "cpu", DEVICE = "device", ENGINE = "engine", OS = "os", RESULT = "result", NAME = "name", TYPE = "type", VENDOR = "vendor", VERSION = "version", ARCHITECTURE = "architecture", MAJOR = "major", MODEL = "model", CONSOLE = "console", MOBILE = "mobile", TABLET = "tablet", SMARTTV = "smarttv", WEARABLE = "wearable", XR = "xr", EMBEDDED = "embedded", FETCHER = "fetcher", INAPP = "inapp", BRANDS = "brands", FORMFACTORS = "formFactors", FULLVERLIST = "fullVersionList", PLATFORM = "platform", PLATFORMVER = "platformVersion", BITNESS = "bitness", CH = "sec-ch-ua", CH_FULL_VER_LIST = CH + "-full-version-list", CH_ARCH = CH + "-arch", CH_BITNESS = CH + "-" + BITNESS, CH_FORM_FACTORS = CH + "-form-factors", CH_MOBILE = CH + "-" + MOBILE, CH_MODEL = CH + "-" + MODEL, CH_PLATFORM = CH + "-" + PLATFORM, CH_PLATFORM_VER = CH_PLATFORM + "-version", CH_ALL_VALUES = [
53
+ BRANDS,
54
+ FULLVERLIST,
55
+ MOBILE,
56
+ MODEL,
57
+ PLATFORM,
58
+ PLATFORMVER,
59
+ ARCHITECTURE,
60
+ FORMFACTORS,
61
+ BITNESS
62
+ ], AMAZON = "Amazon", APPLE = "Apple", ASUS = "ASUS", BLACKBERRY = "BlackBerry", GOOGLE = "Google", HUAWEI = "Huawei", LENOVO = "Lenovo", HONOR = "Honor", LG = "LG", MICROSOFT = "Microsoft", MOTOROLA = "Motorola", NVIDIA = "Nvidia", ONEPLUS = "OnePlus", OPPO = "OPPO", SAMSUNG = "Samsung", SHARP = "Sharp", SONY = "Sony", XIAOMI = "Xiaomi", ZEBRA = "Zebra", CHROME = "Chrome", CHROMIUM = "Chromium", CHROMECAST = "Chromecast", EDGE = "Edge", FIREFOX = "Firefox", OPERA = "Opera", FACEBOOK = "Facebook", SOGOU = "Sogou", PREFIX_MOBILE = "Mobile ", SUFFIX_BROWSER = " Browser", WINDOWS = "Windows";
63
+ var NAVIGATOR = typeof window !== TYPEOF.UNDEFINED && window.navigator ? window.navigator : void 0, NAVIGATOR_UADATA = NAVIGATOR && NAVIGATOR.userAgentData ? NAVIGATOR.userAgentData : void 0;
64
+ var extend = function(defaultRgx, extensions) {
65
+ var mergedRgx = {};
66
+ var extraRgx = extensions;
67
+ if (!isExtensions(extensions)) {
68
+ extraRgx = {};
69
+ for (var i in extensions) for (var j$1 in extensions[i]) extraRgx[j$1] = extensions[i][j$1].concat(extraRgx[j$1] ? extraRgx[j$1] : []);
70
+ }
71
+ for (var k$1 in defaultRgx) mergedRgx[k$1] = extraRgx[k$1] && extraRgx[k$1].length % 2 === 0 ? extraRgx[k$1].concat(defaultRgx[k$1]) : defaultRgx[k$1];
72
+ return mergedRgx;
73
+ }, enumerize = function(arr) {
74
+ var enums = {};
75
+ for (var i = 0; i < arr.length; i++) enums[arr[i].toUpperCase()] = arr[i];
76
+ return enums;
77
+ }, has = function(str1, str2) {
78
+ if (typeof str1 === TYPEOF.OBJECT && str1.length > 0) {
79
+ for (var i in str1) if (lowerize(str2) == lowerize(str1[i])) return true;
80
+ return false;
81
+ }
82
+ return isString(str1) ? lowerize(str2) == lowerize(str1) : false;
83
+ }, isExtensions = function(obj, deep) {
84
+ for (var prop in obj) return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);
85
+ }, isString = function(val) {
86
+ return typeof val === TYPEOF.STRING;
87
+ }, itemListToArray = function(header) {
88
+ if (!header) return void 0;
89
+ var arr = [];
90
+ var tokens = strip(/\\?\"/g, header).split(",");
91
+ for (var i = 0; i < tokens.length; i++) if (tokens[i].indexOf(";") > -1) {
92
+ var token = trim(tokens[i]).split(";v=");
93
+ arr[i] = {
94
+ brand: token[0],
95
+ version: token[1]
96
+ };
97
+ } else arr[i] = trim(tokens[i]);
98
+ return arr;
99
+ }, lowerize = function(str) {
100
+ return isString(str) ? str.toLowerCase() : str;
101
+ }, majorize = function(version) {
102
+ return isString(version) ? strip(/[^\d\.]/g, version).split(".")[0] : void 0;
103
+ }, setProps = function(arr) {
104
+ for (var i in arr) {
105
+ if (!arr.hasOwnProperty(i)) continue;
106
+ var propName = arr[i];
107
+ if (typeof propName == TYPEOF.OBJECT && propName.length == 2) this[propName[0]] = propName[1];
108
+ else this[propName] = void 0;
109
+ }
110
+ return this;
111
+ }, strip = function(pattern, str) {
112
+ return isString(str) ? str.replace(pattern, EMPTY) : str;
113
+ }, stripQuotes = function(str) {
114
+ return strip(/\\?\"/g, str);
115
+ }, trim = function(str, len) {
116
+ str = strip(/^\s\s*/, String(str));
117
+ return typeof len === TYPEOF.UNDEFINED ? str : str.substring(0, len);
118
+ };
119
+ var rgxMapper = function(ua, arrays) {
120
+ if (!ua || !arrays) return;
121
+ var i = 0, j$1, k$1, p$1, q$1, matches, match;
122
+ while (i < arrays.length && !matches) {
123
+ var regex = arrays[i], props = arrays[i + 1];
124
+ j$1 = k$1 = 0;
125
+ while (j$1 < regex.length && !matches) {
126
+ if (!regex[j$1]) break;
127
+ matches = regex[j$1++].exec(ua);
128
+ if (!!matches) for (p$1 = 0; p$1 < props.length; p$1++) {
129
+ match = matches[++k$1];
130
+ q$1 = props[p$1];
131
+ if (typeof q$1 === TYPEOF.OBJECT && q$1.length > 0) {
132
+ if (q$1.length === 2) if (typeof q$1[1] == TYPEOF.FUNCTION) this[q$1[0]] = q$1[1].call(this, match);
133
+ else this[q$1[0]] = q$1[1];
134
+ else if (q$1.length >= 3) {
135
+ if (typeof q$1[1] === TYPEOF.FUNCTION && !(q$1[1].exec && q$1[1].test)) if (q$1.length > 3) this[q$1[0]] = match ? q$1[1].apply(this, q$1.slice(2)) : void 0;
136
+ else this[q$1[0]] = match ? q$1[1].call(this, match, q$1[2]) : void 0;
137
+ else if (q$1.length == 3) this[q$1[0]] = match ? match.replace(q$1[1], q$1[2]) : void 0;
138
+ else if (q$1.length == 4) this[q$1[0]] = match ? q$1[3].call(this, match.replace(q$1[1], q$1[2])) : void 0;
139
+ else if (q$1.length > 4) this[q$1[0]] = match ? q$1[3].apply(this, [match.replace(q$1[1], q$1[2])].concat(q$1.slice(4))) : void 0;
140
+ }
141
+ } else this[q$1] = match ? match : void 0;
142
+ }
143
+ }
144
+ i += 2;
145
+ }
146
+ }, strMapper = function(str, map) {
147
+ for (var i in map) if (typeof map[i] === TYPEOF.OBJECT && map[i].length > 0) {
148
+ for (var j$1 = 0; j$1 < map[i].length; j$1++) if (has(map[i][j$1], str)) return i === UNKNOWN ? void 0 : i;
149
+ } else if (has(map[i], str)) return i === UNKNOWN ? void 0 : i;
150
+ return map.hasOwnProperty("*") ? map["*"] : str;
151
+ };
152
+ var windowsVersionMap = {
153
+ "ME": "4.90",
154
+ "NT 3.51": "3.51",
155
+ "NT 4.0": "4.0",
156
+ "2000": ["5.0", "5.01"],
157
+ "XP": ["5.1", "5.2"],
158
+ "Vista": "6.0",
159
+ "7": "6.1",
160
+ "8": "6.2",
161
+ "8.1": "6.3",
162
+ "10": ["6.4", "10.0"],
163
+ "NT": ""
164
+ }, formFactorsMap = {
165
+ "embedded": "Automotive",
166
+ "mobile": "Mobile",
167
+ "tablet": ["Tablet", "EInk"],
168
+ "smarttv": "TV",
169
+ "wearable": "Watch",
170
+ "xr": ["VR", "XR"],
171
+ "?": ["Desktop", "Unknown"],
172
+ "*": void 0
173
+ }, browserHintsMap = {
174
+ "Chrome": "Google Chrome",
175
+ "Edge": "Microsoft Edge",
176
+ "Edge WebView2": "Microsoft Edge WebView2",
177
+ "Chrome WebView": "Android WebView",
178
+ "Chrome Headless": "HeadlessChrome",
179
+ "Huawei Browser": "HuaweiBrowser",
180
+ "MIUI Browser": "Miui Browser",
181
+ "Opera Mobi": "OperaMobile",
182
+ "Yandex": "YaBrowser"
183
+ };
184
+ var defaultRegexes = {
185
+ browser: [
186
+ [/\b(?:crmo|crios)\/([\w\.]+)/i],
187
+ [VERSION, [NAME, PREFIX_MOBILE + "Chrome"]],
188
+ [/webview.+edge\/([\w\.]+)/i],
189
+ [VERSION, [NAME, EDGE + " WebView"]],
190
+ [/edg(?:e|ios|a)?\/([\w\.]+)/i],
191
+ [VERSION, [NAME, "Edge"]],
192
+ [
193
+ /(opera mini)\/([-\w\.]+)/i,
194
+ /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,
195
+ /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i
196
+ ],
197
+ [NAME, VERSION],
198
+ [/opios[\/ ]+([\w\.]+)/i],
199
+ [VERSION, [NAME, OPERA + " Mini"]],
200
+ [/\bop(?:rg)?x\/([\w\.]+)/i],
201
+ [VERSION, [NAME, OPERA + " GX"]],
202
+ [/\bopr\/([\w\.]+)/i],
203
+ [VERSION, [NAME, OPERA]],
204
+ [/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i],
205
+ [VERSION, [NAME, "Baidu"]],
206
+ [/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i],
207
+ [VERSION, [NAME, "Maxthon"]],
208
+ [
209
+ /(kindle)\/([\w\.]+)/i,
210
+ /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,
211
+ /(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,
212
+ /(?:ms|\()(ie) ([\w\.]+)/i,
213
+ /(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:hi|lg |ovi|qute)browser|palemoon)\/v?([-\w\.]+)/i,
214
+ /(brave)(?: chrome)?\/([\d\.]+)/i,
215
+ /(aloha|heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i,
216
+ /(qwant)(?:ios|mobile)\/([\d\.]+)/i,
217
+ /(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i
218
+ ],
219
+ [NAME, VERSION],
220
+ [/quark(?:pc)?\/([-\w\.]+)/i],
221
+ [VERSION, [NAME, "Quark"]],
222
+ [/\bddg\/([\w\.]+)/i],
223
+ [VERSION, [NAME, "DuckDuckGo"]],
224
+ [/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i],
225
+ [VERSION, [NAME, "UCBrowser"]],
226
+ [
227
+ /microm.+\bqbcore\/([\w\.]+)/i,
228
+ /\bqbcore\/([\w\.]+).+microm/i,
229
+ /micromessenger\/([\w\.]+)/i
230
+ ],
231
+ [VERSION, [NAME, "WeChat"]],
232
+ [/konqueror\/([\w\.]+)/i],
233
+ [VERSION, [NAME, "Konqueror"]],
234
+ [/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],
235
+ [VERSION, [NAME, "IE"]],
236
+ [/ya(?:search)?browser\/([\w\.]+)/i],
237
+ [VERSION, [NAME, "Yandex"]],
238
+ [/slbrowser\/([\w\.]+)/i],
239
+ [VERSION, [NAME, "Smart " + LENOVO + SUFFIX_BROWSER]],
240
+ [/(av(?:ast|g|ira))\/([\w\.]+)/i],
241
+ [[
242
+ NAME,
243
+ /(.+)/,
244
+ "$1 Secure" + SUFFIX_BROWSER
245
+ ], VERSION],
246
+ [/norton\/([\w\.]+)/i],
247
+ [VERSION, [NAME, "Norton Private" + SUFFIX_BROWSER]],
248
+ [/\bfocus\/([\w\.]+)/i],
249
+ [VERSION, [NAME, FIREFOX + " Focus"]],
250
+ [/ mms\/([\w\.]+)$/i],
251
+ [VERSION, [NAME, OPERA + " Neon"]],
252
+ [/ opt\/([\w\.]+)$/i],
253
+ [VERSION, [NAME, OPERA + " Touch"]],
254
+ [/coc_coc\w+\/([\w\.]+)/i],
255
+ [VERSION, [NAME, "Coc Coc"]],
256
+ [/dolfin\/([\w\.]+)/i],
257
+ [VERSION, [NAME, "Dolphin"]],
258
+ [/coast\/([\w\.]+)/i],
259
+ [VERSION, [NAME, OPERA + " Coast"]],
260
+ [/miuibrowser\/([\w\.]+)/i],
261
+ [VERSION, [NAME, "MIUI" + SUFFIX_BROWSER]],
262
+ [/fxios\/([\w\.-]+)/i],
263
+ [VERSION, [NAME, PREFIX_MOBILE + FIREFOX]],
264
+ [/\bqihoobrowser\/?([\w\.]*)/i],
265
+ [VERSION, [NAME, "360"]],
266
+ [/\b(qq)\/([\w\.]+)/i],
267
+ [[
268
+ NAME,
269
+ /(.+)/,
270
+ "$1Browser"
271
+ ], VERSION],
272
+ [/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i],
273
+ [[
274
+ NAME,
275
+ /(.+)/,
276
+ "$1" + SUFFIX_BROWSER
277
+ ], VERSION],
278
+ [/samsungbrowser\/([\w\.]+)/i],
279
+ [VERSION, [NAME, SAMSUNG + " Internet"]],
280
+ [/metasr[\/ ]?([\d\.]+)/i],
281
+ [VERSION, [NAME, SOGOU + " Explorer"]],
282
+ [/(sogou)mo\w+\/([\d\.]+)/i],
283
+ [[NAME, SOGOU + " Mobile"], VERSION],
284
+ [
285
+ /(electron)\/([\w\.]+) safari/i,
286
+ /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,
287
+ /m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i
288
+ ],
289
+ [NAME, VERSION],
290
+ [/(lbbrowser|luakit|rekonq|steam(?= (clie|tenf|gameo)))/i],
291
+ [NAME],
292
+ [/ome\/([\w\.]+).+(iron(?= saf)|360(?=[es]e$))/i],
293
+ [VERSION, NAME],
294
+ [/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],
295
+ [
296
+ [NAME, FACEBOOK],
297
+ VERSION,
298
+ [TYPE, INAPP]
299
+ ],
300
+ [
301
+ /(kakao(?:talk|story))[\/ ]([\w\.]+)/i,
302
+ /(naver)\(.*?(\d+\.[\w\.]+).*\)/i,
303
+ /(daum)apps[\/ ]([\w\.]+)/i,
304
+ /safari (line)\/([\w\.]+)/i,
305
+ /\b(line)\/([\w\.]+)\/iab/i,
306
+ /(alipay)client\/([\w\.]+)/i,
307
+ /(twitter)(?:and| f.+e\/([\w\.]+))/i,
308
+ /(bing)(?:web|sapphire)\/([\w\.]+)/i,
309
+ /(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i
310
+ ],
311
+ [
312
+ NAME,
313
+ VERSION,
314
+ [TYPE, INAPP]
315
+ ],
316
+ [/\bgsa\/([\w\.]+) .*safari\//i],
317
+ [
318
+ VERSION,
319
+ [NAME, "GSA"],
320
+ [TYPE, INAPP]
321
+ ],
322
+ [/(?:musical_ly|trill)(?:.+app_?version\/|_)([\w\.]+)/i],
323
+ [
324
+ VERSION,
325
+ [NAME, "TikTok"],
326
+ [TYPE, INAPP]
327
+ ],
328
+ [/\[(linkedin)app\]/i],
329
+ [NAME, [TYPE, INAPP]],
330
+ [/(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i],
331
+ [
332
+ [
333
+ NAME,
334
+ /(.+)/,
335
+ "Zalo"
336
+ ],
337
+ VERSION,
338
+ [TYPE, INAPP]
339
+ ],
340
+ [/(chromium)[\/ ]([-\w\.]+)/i],
341
+ [NAME, VERSION],
342
+ [/ome-(lighthouse)$/i],
343
+ [NAME, [TYPE, FETCHER]],
344
+ [/headlesschrome(?:\/([\w\.]+)| )/i],
345
+ [VERSION, [NAME, CHROME + " Headless"]],
346
+ [/wv\).+chrome\/([\w\.]+).+edgw\//i],
347
+ [VERSION, [NAME, EDGE + " WebView2"]],
348
+ [/ wv\).+(chrome)\/([\w\.]+)/i],
349
+ [[NAME, CHROME + " WebView"], VERSION],
350
+ [/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],
351
+ [VERSION, [NAME, "Android" + SUFFIX_BROWSER]],
352
+ [/chrome\/([\w\.]+) mobile/i],
353
+ [VERSION, [NAME, PREFIX_MOBILE + "Chrome"]],
354
+ [/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],
355
+ [NAME, VERSION],
356
+ [/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i],
357
+ [VERSION, [NAME, PREFIX_MOBILE + "Safari"]],
358
+ [/iphone .*mobile(?:\/\w+ | ?)safari/i],
359
+ [[NAME, PREFIX_MOBILE + "Safari"]],
360
+ [/version\/([\w\.\,]+) .*(safari)/i],
361
+ [VERSION, NAME],
362
+ [/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],
363
+ [NAME, [VERSION, "1"]],
364
+ [/(webkit|khtml)\/([\w\.]+)/i],
365
+ [NAME, VERSION],
366
+ [/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i],
367
+ [[NAME, PREFIX_MOBILE + FIREFOX], VERSION],
368
+ [/(navigator|netscape\d?)\/([-\w\.]+)/i],
369
+ [[NAME, "Netscape"], VERSION],
370
+ [/(wolvic|librewolf)\/([\w\.]+)/i],
371
+ [NAME, VERSION],
372
+ [/mobile vr; rv:([\w\.]+)\).+firefox/i],
373
+ [VERSION, [NAME, FIREFOX + " Reality"]],
374
+ [
375
+ /ekiohf.+(flow)\/([\w\.]+)/i,
376
+ /(swiftfox)/i,
377
+ /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,
378
+ /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,
379
+ /(firefox)\/([\w\.]+)/i,
380
+ /(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i,
381
+ /(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
382
+ /\b(links) \(([\w\.]+)/i
383
+ ],
384
+ [NAME, [
385
+ VERSION,
386
+ /_/g,
387
+ "."
388
+ ]],
389
+ [/(cobalt)\/([\w\.]+)/i],
390
+ [NAME, [
391
+ VERSION,
392
+ /[^\d\.]+./,
393
+ EMPTY
394
+ ]]
395
+ ],
396
+ cpu: [
397
+ [/\b((amd|x|x86[-_]?|wow|win)64)\b/i],
398
+ [[ARCHITECTURE, "amd64"]],
399
+ [/(ia32(?=;))/i, /\b((i[346]|x)86)(pc)?\b/i],
400
+ [[ARCHITECTURE, "ia32"]],
401
+ [/\b(aarch64|arm(v?[89]e?l?|_?64))\b/i],
402
+ [[ARCHITECTURE, "arm64"]],
403
+ [/\b(arm(v[67])?ht?n?[fl]p?)\b/i],
404
+ [[ARCHITECTURE, "armhf"]],
405
+ [/( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i],
406
+ [[ARCHITECTURE, "arm"]],
407
+ [/ sun4\w[;\)]/i],
408
+ [[ARCHITECTURE, "sparc"]],
409
+ [
410
+ /\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,
411
+ /((ppc|powerpc)(64)?)( mac|;|\))/i,
412
+ /(?:osf1|[freopnt]{3,4}bsd) (alpha)/i
413
+ ],
414
+ [[
415
+ ARCHITECTURE,
416
+ /ower/,
417
+ EMPTY,
418
+ lowerize
419
+ ]],
420
+ [/mc680.0/i],
421
+ [[ARCHITECTURE, "68k"]],
422
+ [/winnt.+\[axp/i],
423
+ [[ARCHITECTURE, "alpha"]]
424
+ ],
425
+ device: [
426
+ [/\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],
427
+ [
428
+ MODEL,
429
+ [VENDOR, SAMSUNG],
430
+ [TYPE, TABLET]
431
+ ],
432
+ [
433
+ /\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
434
+ /samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,
435
+ /sec-(sgh\w+)/i
436
+ ],
437
+ [
438
+ MODEL,
439
+ [VENDOR, SAMSUNG],
440
+ [TYPE, MOBILE]
441
+ ],
442
+ [/(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i],
443
+ [
444
+ MODEL,
445
+ [VENDOR, APPLE],
446
+ [TYPE, MOBILE]
447
+ ],
448
+ [/\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i, /\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i],
449
+ [
450
+ MODEL,
451
+ [VENDOR, APPLE],
452
+ [TYPE, TABLET]
453
+ ],
454
+ [/(macintosh);/i],
455
+ [MODEL, [VENDOR, APPLE]],
456
+ [/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],
457
+ [
458
+ MODEL,
459
+ [VENDOR, SHARP],
460
+ [TYPE, MOBILE]
461
+ ],
462
+ [/\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i],
463
+ [
464
+ MODEL,
465
+ [VENDOR, HONOR],
466
+ [TYPE, TABLET]
467
+ ],
468
+ [/honor([-\w ]+)[;\)]/i],
469
+ [
470
+ MODEL,
471
+ [VENDOR, HONOR],
472
+ [TYPE, MOBILE]
473
+ ],
474
+ [/\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],
475
+ [
476
+ MODEL,
477
+ [VENDOR, HUAWEI],
478
+ [TYPE, TABLET]
479
+ ],
480
+ [/(?:huawei) ?([-\w ]+)[;\)]/i, /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i],
481
+ [
482
+ MODEL,
483
+ [VENDOR, HUAWEI],
484
+ [TYPE, MOBILE]
485
+ ],
486
+ [/oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i, /\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i],
487
+ [
488
+ [
489
+ MODEL,
490
+ /_/g,
491
+ " "
492
+ ],
493
+ [VENDOR, XIAOMI],
494
+ [TYPE, TABLET]
495
+ ],
496
+ [
497
+ /\b; (\w+) build\/hm\1/i,
498
+ /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,
499
+ /oid[^\)]+; (redmi[\-_ ]?(?:note|k)?[\w_ ]+|m?[12]\d[01]\d\w{3,6}|poco[\w ]+|(shark )?\w{3}-[ah]0|qin ?[1-3](s\+|ultra| pro)?)( bui|; wv|\))/i,
500
+ /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,
501
+ / ([\w ]+) miui\/v?\d/i
502
+ ],
503
+ [
504
+ [
505
+ MODEL,
506
+ /_/g,
507
+ " "
508
+ ],
509
+ [VENDOR, XIAOMI],
510
+ [TYPE, MOBILE]
511
+ ],
512
+ [/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-l]\w[1m]10)\b/i, /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],
513
+ [
514
+ MODEL,
515
+ [VENDOR, ONEPLUS],
516
+ [TYPE, MOBILE]
517
+ ],
518
+ [/; (\w+) bui.+ oppo/i, /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],
519
+ [
520
+ MODEL,
521
+ [VENDOR, OPPO],
522
+ [TYPE, MOBILE]
523
+ ],
524
+ [/\b(opd2(\d{3}a?))(?: bui|\))/i],
525
+ [
526
+ MODEL,
527
+ [
528
+ VENDOR,
529
+ strMapper,
530
+ {
531
+ "OnePlus": [
532
+ "203",
533
+ "304",
534
+ "403",
535
+ "404",
536
+ "413",
537
+ "415"
538
+ ],
539
+ "*": OPPO
540
+ }
541
+ ],
542
+ [TYPE, TABLET]
543
+ ],
544
+ [/(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i],
545
+ [
546
+ MODEL,
547
+ [VENDOR, "BLU"],
548
+ [TYPE, MOBILE]
549
+ ],
550
+ [/; vivo (\w+)(?: bui|\))/i, /\b(v[12]\d{3}\w?[at])(?: bui|;)/i],
551
+ [
552
+ MODEL,
553
+ [VENDOR, "Vivo"],
554
+ [TYPE, MOBILE]
555
+ ],
556
+ [/\b(rmx[1-3]\d{3})(?: bui|;|\))/i],
557
+ [
558
+ MODEL,
559
+ [VENDOR, "Realme"],
560
+ [TYPE, MOBILE]
561
+ ],
562
+ [/(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, /lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i],
563
+ [
564
+ MODEL,
565
+ [VENDOR, LENOVO],
566
+ [TYPE, TABLET]
567
+ ],
568
+ [/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i],
569
+ [
570
+ MODEL,
571
+ [VENDOR, LENOVO],
572
+ [TYPE, MOBILE]
573
+ ],
574
+ [
575
+ /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
576
+ /\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,
577
+ /((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i
578
+ ],
579
+ [
580
+ MODEL,
581
+ [VENDOR, MOTOROLA],
582
+ [TYPE, MOBILE]
583
+ ],
584
+ [/\b(mz60\d|xoom[2 ]{0,2}) build\//i],
585
+ [
586
+ MODEL,
587
+ [VENDOR, MOTOROLA],
588
+ [TYPE, TABLET]
589
+ ],
590
+ [/\b(?:lg)?([vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],
591
+ [
592
+ MODEL,
593
+ [VENDOR, LG],
594
+ [TYPE, TABLET]
595
+ ],
596
+ [
597
+ /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
598
+ /\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,
599
+ /\blg-?([\d\w]+) bui/i
600
+ ],
601
+ [
602
+ MODEL,
603
+ [VENDOR, LG],
604
+ [TYPE, MOBILE]
605
+ ],
606
+ [/(nokia) (t[12][01])/i],
607
+ [
608
+ VENDOR,
609
+ MODEL,
610
+ [TYPE, TABLET]
611
+ ],
612
+ [/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i, /nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i],
613
+ [
614
+ [
615
+ MODEL,
616
+ /_/g,
617
+ " "
618
+ ],
619
+ [TYPE, MOBILE],
620
+ [VENDOR, "Nokia"]
621
+ ],
622
+ [/(pixel (c|tablet))\b/i],
623
+ [
624
+ MODEL,
625
+ [VENDOR, GOOGLE],
626
+ [TYPE, TABLET]
627
+ ],
628
+ [/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],
629
+ [
630
+ MODEL,
631
+ [VENDOR, GOOGLE],
632
+ [TYPE, MOBILE]
633
+ ],
634
+ [/(google) (pixelbook( go)?)/i],
635
+ [VENDOR, MODEL],
636
+ [/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],
637
+ [
638
+ MODEL,
639
+ [VENDOR, SONY],
640
+ [TYPE, MOBILE]
641
+ ],
642
+ [/sony tablet [ps]/i, /\b(?:sony)?sgp\w+(?: bui|\))/i],
643
+ [
644
+ [MODEL, "Xperia Tablet"],
645
+ [VENDOR, SONY],
646
+ [TYPE, TABLET]
647
+ ],
648
+ [
649
+ /(alexa)webm/i,
650
+ /(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,
651
+ /(kf[a-z]+)( bui|\)).+silk\//i
652
+ ],
653
+ [
654
+ MODEL,
655
+ [VENDOR, AMAZON],
656
+ [TYPE, TABLET]
657
+ ],
658
+ [/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],
659
+ [
660
+ [
661
+ MODEL,
662
+ /(.+)/g,
663
+ "Fire Phone $1"
664
+ ],
665
+ [VENDOR, AMAZON],
666
+ [TYPE, MOBILE]
667
+ ],
668
+ [/(playbook);[-\w\),; ]+(rim)/i],
669
+ [
670
+ MODEL,
671
+ VENDOR,
672
+ [TYPE, TABLET]
673
+ ],
674
+ [/\b((?:bb[a-f]|st[hv])100-\d)/i, /(?:blackberry|\(bb10;) (\w+)/i],
675
+ [
676
+ MODEL,
677
+ [VENDOR, BLACKBERRY],
678
+ [TYPE, MOBILE]
679
+ ],
680
+ [/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],
681
+ [
682
+ MODEL,
683
+ [VENDOR, ASUS],
684
+ [TYPE, TABLET]
685
+ ],
686
+ [/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],
687
+ [
688
+ MODEL,
689
+ [VENDOR, ASUS],
690
+ [TYPE, MOBILE]
691
+ ],
692
+ [/(nexus 9)/i],
693
+ [
694
+ MODEL,
695
+ [VENDOR, "HTC"],
696
+ [TYPE, TABLET]
697
+ ],
698
+ [
699
+ /(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,
700
+ /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
701
+ /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i
702
+ ],
703
+ [
704
+ VENDOR,
705
+ [
706
+ MODEL,
707
+ /_/g,
708
+ " "
709
+ ],
710
+ [TYPE, MOBILE]
711
+ ],
712
+ [/tcl (xess p17aa)/i, /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],
713
+ [
714
+ MODEL,
715
+ [VENDOR, "TCL"],
716
+ [TYPE, TABLET]
717
+ ],
718
+ [/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],
719
+ [
720
+ MODEL,
721
+ [VENDOR, "TCL"],
722
+ [TYPE, MOBILE]
723
+ ],
724
+ [/(itel) ((\w+))/i],
725
+ [
726
+ [VENDOR, lowerize],
727
+ MODEL,
728
+ [
729
+ TYPE,
730
+ strMapper,
731
+ {
732
+ "tablet": ["p10001l", "w7001"],
733
+ "*": "mobile"
734
+ }
735
+ ]
736
+ ],
737
+ [/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],
738
+ [
739
+ MODEL,
740
+ [VENDOR, "Acer"],
741
+ [TYPE, TABLET]
742
+ ],
743
+ [/droid.+; (m[1-5] note) bui/i, /\bmz-([-\w]{2,})/i],
744
+ [
745
+ MODEL,
746
+ [VENDOR, "Meizu"],
747
+ [TYPE, MOBILE]
748
+ ],
749
+ [/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i],
750
+ [
751
+ MODEL,
752
+ [VENDOR, "Ulefone"],
753
+ [TYPE, MOBILE]
754
+ ],
755
+ [/; (energy ?\w+)(?: bui|\))/i, /; energizer ([\w ]+)(?: bui|\))/i],
756
+ [
757
+ MODEL,
758
+ [VENDOR, "Energizer"],
759
+ [TYPE, MOBILE]
760
+ ],
761
+ [/; cat (b35);/i, /; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i],
762
+ [
763
+ MODEL,
764
+ [VENDOR, "Cat"],
765
+ [TYPE, MOBILE]
766
+ ],
767
+ [/((?:new )?andromax[\w- ]+)(?: bui|\))/i],
768
+ [
769
+ MODEL,
770
+ [VENDOR, "Smartfren"],
771
+ [TYPE, MOBILE]
772
+ ],
773
+ [/droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i],
774
+ [
775
+ MODEL,
776
+ [VENDOR, "Nothing"],
777
+ [TYPE, MOBILE]
778
+ ],
779
+ [/; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i, /archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i],
780
+ [
781
+ MODEL,
782
+ [VENDOR, "Archos"],
783
+ [TYPE, TABLET]
784
+ ],
785
+ [/archos ([\w ]+)( b|\))/i, /; (ac[3-6]\d\w{2,8})( b|\))/i],
786
+ [
787
+ MODEL,
788
+ [VENDOR, "Archos"],
789
+ [TYPE, MOBILE]
790
+ ],
791
+ [/; (n159v)/i],
792
+ [
793
+ MODEL,
794
+ [VENDOR, "HMD"],
795
+ [TYPE, MOBILE]
796
+ ],
797
+ [/(imo) (tab \w+)/i, /(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i],
798
+ [
799
+ VENDOR,
800
+ MODEL,
801
+ [TYPE, TABLET]
802
+ ],
803
+ [
804
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
805
+ /; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,
806
+ /(hp) ([\w ]+\w)/i,
807
+ /(microsoft); (lumia[\w ]+)/i,
808
+ /(oppo) ?([\w ]+) bui/i,
809
+ /(hisense) ([ehv][\w ]+)\)/i,
810
+ /droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i
811
+ ],
812
+ [
813
+ VENDOR,
814
+ MODEL,
815
+ [TYPE, MOBILE]
816
+ ],
817
+ [
818
+ /(kobo)\s(ereader|touch)/i,
819
+ /(hp).+(touchpad(?!.+tablet)|tablet)/i,
820
+ /(kindle)\/([\w\.]+)/i
821
+ ],
822
+ [
823
+ VENDOR,
824
+ MODEL,
825
+ [TYPE, TABLET]
826
+ ],
827
+ [/(surface duo)/i],
828
+ [
829
+ MODEL,
830
+ [VENDOR, MICROSOFT],
831
+ [TYPE, TABLET]
832
+ ],
833
+ [/droid [\d\.]+; (fp\du?)(?: b|\))/i],
834
+ [
835
+ MODEL,
836
+ [VENDOR, "Fairphone"],
837
+ [TYPE, MOBILE]
838
+ ],
839
+ [/((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i],
840
+ [
841
+ MODEL,
842
+ [VENDOR, NVIDIA],
843
+ [TYPE, TABLET]
844
+ ],
845
+ [/(sprint) (\w+)/i],
846
+ [
847
+ VENDOR,
848
+ MODEL,
849
+ [TYPE, MOBILE]
850
+ ],
851
+ [/(kin\.[onetw]{3})/i],
852
+ [
853
+ [
854
+ MODEL,
855
+ /\./g,
856
+ " "
857
+ ],
858
+ [VENDOR, MICROSOFT],
859
+ [TYPE, MOBILE]
860
+ ],
861
+ [/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],
862
+ [
863
+ MODEL,
864
+ [VENDOR, ZEBRA],
865
+ [TYPE, TABLET]
866
+ ],
867
+ [/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],
868
+ [
869
+ MODEL,
870
+ [VENDOR, ZEBRA],
871
+ [TYPE, MOBILE]
872
+ ],
873
+ [/(philips)[\w ]+tv/i, /smart-tv.+(samsung)/i],
874
+ [VENDOR, [TYPE, SMARTTV]],
875
+ [/hbbtv.+maple;(\d+)/i],
876
+ [
877
+ [
878
+ MODEL,
879
+ /^/,
880
+ "SmartTV"
881
+ ],
882
+ [VENDOR, SAMSUNG],
883
+ [TYPE, SMARTTV]
884
+ ],
885
+ [/(vizio)(?: |.+model\/)(\w+-\w+)/i, /tcast.+(lg)e?. ([-\w]+)/i],
886
+ [
887
+ VENDOR,
888
+ MODEL,
889
+ [TYPE, SMARTTV]
890
+ ],
891
+ [/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],
892
+ [[VENDOR, LG], [TYPE, SMARTTV]],
893
+ [/(apple) ?tv/i],
894
+ [
895
+ VENDOR,
896
+ [MODEL, APPLE + " TV"],
897
+ [TYPE, SMARTTV]
898
+ ],
899
+ [/crkey.*devicetype\/chromecast/i],
900
+ [
901
+ [MODEL, CHROMECAST + " Third Generation"],
902
+ [VENDOR, GOOGLE],
903
+ [TYPE, SMARTTV]
904
+ ],
905
+ [/crkey.*devicetype\/([^/]*)/i],
906
+ [
907
+ [
908
+ MODEL,
909
+ /^/,
910
+ "Chromecast "
911
+ ],
912
+ [VENDOR, GOOGLE],
913
+ [TYPE, SMARTTV]
914
+ ],
915
+ [/fuchsia.*crkey/i],
916
+ [
917
+ [MODEL, CHROMECAST + " Nest Hub"],
918
+ [VENDOR, GOOGLE],
919
+ [TYPE, SMARTTV]
920
+ ],
921
+ [/crkey/i],
922
+ [
923
+ [MODEL, CHROMECAST],
924
+ [VENDOR, GOOGLE],
925
+ [TYPE, SMARTTV]
926
+ ],
927
+ [/(portaltv)/i],
928
+ [
929
+ MODEL,
930
+ [VENDOR, FACEBOOK],
931
+ [TYPE, SMARTTV]
932
+ ],
933
+ [/droid.+aft(\w+)( bui|\))/i],
934
+ [
935
+ MODEL,
936
+ [VENDOR, AMAZON],
937
+ [TYPE, SMARTTV]
938
+ ],
939
+ [/(shield \w+ tv)/i],
940
+ [
941
+ MODEL,
942
+ [VENDOR, NVIDIA],
943
+ [TYPE, SMARTTV]
944
+ ],
945
+ [/\(dtv[\);].+(aquos)/i, /(aquos-tv[\w ]+)\)/i],
946
+ [
947
+ MODEL,
948
+ [VENDOR, SHARP],
949
+ [TYPE, SMARTTV]
950
+ ],
951
+ [/(bravia[\w ]+)( bui|\))/i],
952
+ [
953
+ MODEL,
954
+ [VENDOR, SONY],
955
+ [TYPE, SMARTTV]
956
+ ],
957
+ [/(mi(tv|box)-?\w+) bui/i],
958
+ [
959
+ MODEL,
960
+ [VENDOR, XIAOMI],
961
+ [TYPE, SMARTTV]
962
+ ],
963
+ [/Hbbtv.*(technisat) (.*);/i],
964
+ [
965
+ VENDOR,
966
+ MODEL,
967
+ [TYPE, SMARTTV]
968
+ ],
969
+ [/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],
970
+ [
971
+ [
972
+ VENDOR,
973
+ /.+\/(\w+)/,
974
+ "$1",
975
+ strMapper,
976
+ { "LG": "lge" }
977
+ ],
978
+ [MODEL, trim],
979
+ [TYPE, SMARTTV]
980
+ ],
981
+ [/(playstation \w+)/i],
982
+ [
983
+ MODEL,
984
+ [VENDOR, SONY],
985
+ [TYPE, CONSOLE]
986
+ ],
987
+ [/\b(xbox(?: one)?(?!; xbox))[\); ]/i],
988
+ [
989
+ MODEL,
990
+ [VENDOR, MICROSOFT],
991
+ [TYPE, CONSOLE]
992
+ ],
993
+ [
994
+ /(ouya)/i,
995
+ /(nintendo) (\w+)/i,
996
+ /(retroid) (pocket ([^\)]+))/i,
997
+ /(valve).+(steam deck)/i,
998
+ /droid.+; ((shield|rgcube|gr0006))( bui|\))/i
999
+ ],
1000
+ [
1001
+ [
1002
+ VENDOR,
1003
+ strMapper,
1004
+ {
1005
+ "Nvidia": "Shield",
1006
+ "Anbernic": "RGCUBE",
1007
+ "Logitech": "GR0006"
1008
+ }
1009
+ ],
1010
+ MODEL,
1011
+ [TYPE, CONSOLE]
1012
+ ],
1013
+ [/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i],
1014
+ [
1015
+ MODEL,
1016
+ [VENDOR, SAMSUNG],
1017
+ [TYPE, WEARABLE]
1018
+ ],
1019
+ [/((pebble))app/i, /(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\w ]*)( bui|\))/i],
1020
+ [
1021
+ VENDOR,
1022
+ MODEL,
1023
+ [TYPE, WEARABLE]
1024
+ ],
1025
+ [/(ow(?:19|20)?we?[1-3]{1,3})/i],
1026
+ [
1027
+ MODEL,
1028
+ [VENDOR, OPPO],
1029
+ [TYPE, WEARABLE]
1030
+ ],
1031
+ [/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],
1032
+ [
1033
+ MODEL,
1034
+ [VENDOR, APPLE],
1035
+ [TYPE, WEARABLE]
1036
+ ],
1037
+ [/(opwwe\d{3})/i],
1038
+ [
1039
+ MODEL,
1040
+ [VENDOR, ONEPLUS],
1041
+ [TYPE, WEARABLE]
1042
+ ],
1043
+ [/(moto 360)/i],
1044
+ [
1045
+ MODEL,
1046
+ [VENDOR, MOTOROLA],
1047
+ [TYPE, WEARABLE]
1048
+ ],
1049
+ [/(smartwatch 3)/i],
1050
+ [
1051
+ MODEL,
1052
+ [VENDOR, SONY],
1053
+ [TYPE, WEARABLE]
1054
+ ],
1055
+ [/(g watch r)/i],
1056
+ [
1057
+ MODEL,
1058
+ [VENDOR, LG],
1059
+ [TYPE, WEARABLE]
1060
+ ],
1061
+ [/droid.+; (wt63?0{2,3})\)/i],
1062
+ [
1063
+ MODEL,
1064
+ [VENDOR, ZEBRA],
1065
+ [TYPE, WEARABLE]
1066
+ ],
1067
+ [/droid.+; (glass) \d/i],
1068
+ [
1069
+ MODEL,
1070
+ [VENDOR, GOOGLE],
1071
+ [TYPE, XR]
1072
+ ],
1073
+ [/(pico) ([\w ]+) os\d/i],
1074
+ [
1075
+ VENDOR,
1076
+ MODEL,
1077
+ [TYPE, XR]
1078
+ ],
1079
+ [/(quest( \d| pro)?s?).+vr/i],
1080
+ [
1081
+ MODEL,
1082
+ [VENDOR, FACEBOOK],
1083
+ [TYPE, XR]
1084
+ ],
1085
+ [/mobile vr; rv.+firefox/i],
1086
+ [[TYPE, XR]],
1087
+ [/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],
1088
+ [VENDOR, [TYPE, EMBEDDED]],
1089
+ [/(aeobc)\b/i],
1090
+ [
1091
+ MODEL,
1092
+ [VENDOR, AMAZON],
1093
+ [TYPE, EMBEDDED]
1094
+ ],
1095
+ [/(homepod).+mac os/i],
1096
+ [
1097
+ MODEL,
1098
+ [VENDOR, APPLE],
1099
+ [TYPE, EMBEDDED]
1100
+ ],
1101
+ [/windows iot/i],
1102
+ [[TYPE, EMBEDDED]],
1103
+ [/droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i],
1104
+ [MODEL, [TYPE, SMARTTV]],
1105
+ [/\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i],
1106
+ [[TYPE, SMARTTV]],
1107
+ [/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i],
1108
+ [MODEL, [
1109
+ TYPE,
1110
+ strMapper,
1111
+ {
1112
+ "mobile": "Mobile",
1113
+ "xr": "VR",
1114
+ "*": TABLET
1115
+ }
1116
+ ]],
1117
+ [/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],
1118
+ [[TYPE, TABLET]],
1119
+ [/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],
1120
+ [[TYPE, MOBILE]],
1121
+ [/droid .+?; ([\w\. -]+)( bui|\))/i],
1122
+ [MODEL, [VENDOR, "Generic"]]
1123
+ ],
1124
+ engine: [
1125
+ [/windows.+ edge\/([\w\.]+)/i],
1126
+ [VERSION, [NAME, EDGE + "HTML"]],
1127
+ [/(arkweb)\/([\w\.]+)/i],
1128
+ [NAME, VERSION],
1129
+ [/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],
1130
+ [VERSION, [NAME, "Blink"]],
1131
+ [
1132
+ /(presto)\/([\w\.]+)/i,
1133
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,
1134
+ /ekioh(flow)\/([\w\.]+)/i,
1135
+ /(khtml|tasman|links|dillo)[\/ ]\(?([\w\.]+)/i,
1136
+ /(icab)[\/ ]([23]\.[\d\.]+)/i,
1137
+ /\b(libweb)/i
1138
+ ],
1139
+ [NAME, VERSION],
1140
+ [/ladybird\//i],
1141
+ [[NAME, "LibWeb"]],
1142
+ [/rv\:([\w\.]{1,9})\b.+(gecko)/i],
1143
+ [VERSION, NAME]
1144
+ ],
1145
+ os: [
1146
+ [/(windows nt) (6\.[23]); arm/i],
1147
+ [[
1148
+ NAME,
1149
+ /N/,
1150
+ "R"
1151
+ ], [
1152
+ VERSION,
1153
+ strMapper,
1154
+ windowsVersionMap
1155
+ ]],
1156
+ [/(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i, /(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i],
1157
+ [NAME, VERSION],
1158
+ [/windows nt ?([\d\.\)]*)(?!.+xbox)/i, /\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i],
1159
+ [[
1160
+ VERSION,
1161
+ /(;|\))/g,
1162
+ "",
1163
+ strMapper,
1164
+ windowsVersionMap
1165
+ ], [NAME, WINDOWS]],
1166
+ [/(windows ce)\/?([\d\.]*)/i],
1167
+ [NAME, VERSION],
1168
+ [
1169
+ /[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,
1170
+ /(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\/ ]([\w\.]+)/i,
1171
+ /\btvos ?([\w\.]+)/i,
1172
+ /cfnetwork\/.+darwin/i
1173
+ ],
1174
+ [[
1175
+ VERSION,
1176
+ /_/g,
1177
+ "."
1178
+ ], [NAME, "iOS"]],
1179
+ [/(mac os x) ?([\w\. ]*)/i, /(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i],
1180
+ [[NAME, "macOS"], [
1181
+ VERSION,
1182
+ /_/g,
1183
+ "."
1184
+ ]],
1185
+ [/android ([\d\.]+).*crkey/i],
1186
+ [VERSION, [NAME, CHROMECAST + " Android"]],
1187
+ [/fuchsia.*crkey\/([\d\.]+)/i],
1188
+ [VERSION, [NAME, CHROMECAST + " Fuchsia"]],
1189
+ [/crkey\/([\d\.]+).*devicetype\/smartspeaker/i],
1190
+ [VERSION, [NAME, CHROMECAST + " SmartSpeaker"]],
1191
+ [/linux.*crkey\/([\d\.]+)/i],
1192
+ [VERSION, [NAME, CHROMECAST + " Linux"]],
1193
+ [/crkey\/([\d\.]+)/i],
1194
+ [VERSION, [NAME, CHROMECAST]],
1195
+ [/droid ([\w\.]+)\b.+(android[- ]x86)/i],
1196
+ [VERSION, NAME],
1197
+ [/(ubuntu) ([\w\.]+) like android/i],
1198
+ [[
1199
+ NAME,
1200
+ /(.+)/,
1201
+ "$1 Touch"
1202
+ ], VERSION],
1203
+ [/(harmonyos)[\/ ]?([\d\.]*)/i, /(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i],
1204
+ [NAME, VERSION],
1205
+ [/\(bb(10);/i],
1206
+ [VERSION, [NAME, BLACKBERRY]],
1207
+ [/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i],
1208
+ [VERSION, [NAME, "Symbian"]],
1209
+ [/mozilla\/[\d\.]+ \((?:mobile[;\w ]*|tablet|tv|[^\)]*(?:viera|lg(?:l25|-d300)|alcatel ?o.+|y300-f1)); rv:([\w\.]+)\).+gecko\//i],
1210
+ [VERSION, [NAME, FIREFOX + " OS"]],
1211
+ [/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i, /webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i],
1212
+ [VERSION, [NAME, "webOS"]],
1213
+ [/web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i],
1214
+ [[
1215
+ VERSION,
1216
+ strMapper,
1217
+ {
1218
+ "25": "120",
1219
+ "24": "108",
1220
+ "23": "94",
1221
+ "22": "87",
1222
+ "6": "79",
1223
+ "5": "68",
1224
+ "4": "53",
1225
+ "3": "38",
1226
+ "2": "538",
1227
+ "1": "537",
1228
+ "*": "TV"
1229
+ }
1230
+ ], [NAME, "webOS"]],
1231
+ [/watch(?: ?os[,\/ ]|\d,\d\/)([\d\.]+)/i],
1232
+ [VERSION, [NAME, "watchOS"]],
1233
+ [/cros [\w]+(?:\)| ([\w\.]+)\b)/i],
1234
+ [VERSION, [NAME, "Chrome OS"]],
1235
+ [/kepler ([\w\.]+); (aft|aeo)/i],
1236
+ [VERSION, [NAME, "Vega OS"]],
1237
+ [
1238
+ /(netrange)mmh/i,
1239
+ /(nettv)\/(\d+\.[\w\.]+)/i,
1240
+ /(nintendo|playstation) (\w+)/i,
1241
+ /(xbox); +xbox ([^\);]+)/i,
1242
+ /(pico) .+os([\w\.]+)/i,
1243
+ /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,
1244
+ /linux.+(mint)[\/\(\) ]?([\w\.]*)/i,
1245
+ /(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,
1246
+ /([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,
1247
+ /((?:open)?solaris)[-\/ ]?([\w\.]*)/i,
1248
+ /\b(aix)[; ]([1-9\.]{0,4})/i,
1249
+ /(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,
1250
+ /(gnu) ?([\w\.]*)/i,
1251
+ /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,
1252
+ /(haiku) ?(r\d)?/i
1253
+ ],
1254
+ [NAME, VERSION],
1255
+ [/(sunos) ?([\d\.]*)/i],
1256
+ [[NAME, "Solaris"], VERSION],
1257
+ [/\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i, /(unix) ?([\w\.]*)/i],
1258
+ [NAME, VERSION]
1259
+ ]
1260
+ };
1261
+ var defaultProps = (function() {
1262
+ var props = {
1263
+ init: {},
1264
+ isIgnore: {},
1265
+ isIgnoreRgx: {},
1266
+ toString: {}
1267
+ };
1268
+ setProps.call(props.init, [
1269
+ [BROWSER, [
1270
+ NAME,
1271
+ VERSION,
1272
+ MAJOR,
1273
+ TYPE
1274
+ ]],
1275
+ [CPU, [ARCHITECTURE]],
1276
+ [DEVICE, [
1277
+ TYPE,
1278
+ MODEL,
1279
+ VENDOR
1280
+ ]],
1281
+ [ENGINE, [NAME, VERSION]],
1282
+ [OS, [NAME, VERSION]]
1283
+ ]);
1284
+ setProps.call(props.isIgnore, [
1285
+ [BROWSER, [VERSION, MAJOR]],
1286
+ [ENGINE, [VERSION]],
1287
+ [OS, [VERSION]]
1288
+ ]);
1289
+ setProps.call(props.isIgnoreRgx, [[BROWSER, / ?browser$/i], [OS, / ?os$/i]]);
1290
+ setProps.call(props.toString, [
1291
+ [BROWSER, [NAME, VERSION]],
1292
+ [CPU, [ARCHITECTURE]],
1293
+ [DEVICE, [VENDOR, MODEL]],
1294
+ [ENGINE, [NAME, VERSION]],
1295
+ [OS, [NAME, VERSION]]
1296
+ ]);
1297
+ return props;
1298
+ })();
1299
+ var createIData = function(item, itemType) {
1300
+ var init_props = defaultProps.init[itemType], is_ignoreProps = defaultProps.isIgnore[itemType] || 0, is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0, toString_props = defaultProps.toString[itemType] || 0;
1301
+ function IData() {
1302
+ setProps.call(this, init_props);
1303
+ }
1304
+ IData.prototype.getItem = function() {
1305
+ return item;
1306
+ };
1307
+ IData.prototype.withClientHints = function() {
1308
+ if (!NAVIGATOR_UADATA) return item.parseCH().get();
1309
+ return NAVIGATOR_UADATA.getHighEntropyValues(CH_ALL_VALUES).then(function(res) {
1310
+ return item.setCH(new UACHData(res, false)).parseCH().get();
1311
+ });
1312
+ };
1313
+ IData.prototype.withFeatureCheck = function() {
1314
+ return item.detectFeature().get();
1315
+ };
1316
+ if (itemType != RESULT) {
1317
+ IData.prototype.is = function(strToCheck) {
1318
+ var is = false;
1319
+ for (var i in this) 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)) {
1320
+ is = true;
1321
+ if (strToCheck != TYPEOF.UNDEFINED) break;
1322
+ } else if (strToCheck == TYPEOF.UNDEFINED && is) {
1323
+ is = !is;
1324
+ break;
1325
+ }
1326
+ return is;
1327
+ };
1328
+ IData.prototype.toString = function() {
1329
+ var str = EMPTY;
1330
+ for (var i in toString_props) if (typeof this[toString_props[i]] !== TYPEOF.UNDEFINED) str += (str ? " " : EMPTY) + this[toString_props[i]];
1331
+ return str || TYPEOF.UNDEFINED;
1332
+ };
1333
+ }
1334
+ IData.prototype.then = function(cb) {
1335
+ var that = this;
1336
+ var IDataResolve = function() {
1337
+ for (var prop in that) if (that.hasOwnProperty(prop)) this[prop] = that[prop];
1338
+ };
1339
+ IDataResolve.prototype = {
1340
+ is: IData.prototype.is,
1341
+ toString: IData.prototype.toString,
1342
+ withClientHints: IData.prototype.withClientHints,
1343
+ withFeatureCheck: IData.prototype.withFeatureCheck
1344
+ };
1345
+ var resolveData = new IDataResolve();
1346
+ cb(resolveData);
1347
+ return resolveData;
1348
+ };
1349
+ return new IData();
1350
+ };
1351
+ function UACHData(uach, isHttpUACH) {
1352
+ uach = uach || {};
1353
+ setProps.call(this, CH_ALL_VALUES);
1354
+ if (isHttpUACH) setProps.call(this, [
1355
+ [BRANDS, itemListToArray(uach[CH])],
1356
+ [FULLVERLIST, itemListToArray(uach[CH_FULL_VER_LIST])],
1357
+ [MOBILE, /\?1/.test(uach[CH_MOBILE])],
1358
+ [MODEL, stripQuotes(uach[CH_MODEL])],
1359
+ [PLATFORM, stripQuotes(uach[CH_PLATFORM])],
1360
+ [PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],
1361
+ [ARCHITECTURE, stripQuotes(uach[CH_ARCH])],
1362
+ [FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],
1363
+ [BITNESS, stripQuotes(uach[CH_BITNESS])]
1364
+ ]);
1365
+ else for (var prop in uach) if (this.hasOwnProperty(prop) && typeof uach[prop] !== TYPEOF.UNDEFINED) this[prop] = uach[prop];
1366
+ }
1367
+ function UAItem(itemType, ua, rgxMap, uaCH) {
1368
+ setProps.call(this, [
1369
+ ["itemType", itemType],
1370
+ ["ua", ua],
1371
+ ["uaCH", uaCH],
1372
+ ["rgxMap", rgxMap],
1373
+ ["data", createIData(this, itemType)]
1374
+ ]);
1375
+ return this;
1376
+ }
1377
+ UAItem.prototype.get = function(prop) {
1378
+ if (!prop) return this.data;
1379
+ return this.data.hasOwnProperty(prop) ? this.data[prop] : void 0;
1380
+ };
1381
+ UAItem.prototype.set = function(prop, val) {
1382
+ this.data[prop] = val;
1383
+ return this;
1384
+ };
1385
+ UAItem.prototype.setCH = function(ch) {
1386
+ this.uaCH = ch;
1387
+ return this;
1388
+ };
1389
+ UAItem.prototype.detectFeature = function() {
1390
+ if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) switch (this.itemType) {
1391
+ case BROWSER:
1392
+ if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == TYPEOF.FUNCTION) this.set(NAME, "Brave");
1393
+ break;
1394
+ case DEVICE:
1395
+ if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) this.set(TYPE, MOBILE);
1396
+ if (this.get(MODEL) == "Macintosh" && NAVIGATOR && typeof NAVIGATOR.standalone !== TYPEOF.UNDEFINED && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) this.set(MODEL, "iPad").set(TYPE, TABLET);
1397
+ break;
1398
+ case OS:
1399
+ if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);
1400
+ break;
1401
+ case RESULT:
1402
+ var data = this.data;
1403
+ var detect = function(itemType) {
1404
+ return data[itemType].getItem().detectFeature().get();
1405
+ };
1406
+ this.set(BROWSER, detect(BROWSER)).set(CPU, detect(CPU)).set(DEVICE, detect(DEVICE)).set(ENGINE, detect(ENGINE)).set(OS, detect(OS));
1407
+ }
1408
+ return this;
1409
+ };
1410
+ UAItem.prototype.parseUA = function() {
1411
+ if (this.itemType != RESULT) rgxMapper.call(this.data, this.ua, this.rgxMap);
1412
+ switch (this.itemType) {
1413
+ case BROWSER:
1414
+ this.set(MAJOR, majorize(this.get(VERSION)));
1415
+ break;
1416
+ case OS:
1417
+ if (this.get(NAME) == "iOS" && this.get(VERSION) == "18.6") {
1418
+ var realVersion = /\) Version\/([\d\.]+)/.exec(this.ua);
1419
+ if (realVersion && parseInt(realVersion[1].substring(0, 2), 10) >= 26) this.set(VERSION, realVersion[1]);
1420
+ }
1421
+ break;
1422
+ }
1423
+ return this;
1424
+ };
1425
+ UAItem.prototype.parseCH = function() {
1426
+ var uaCH = this.uaCH, rgxMap = this.rgxMap;
1427
+ switch (this.itemType) {
1428
+ case BROWSER:
1429
+ case ENGINE:
1430
+ var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;
1431
+ if (brands) for (var i = 0; i < brands.length; i++) {
1432
+ var brandName = brands[i].brand || brands[i], brandVersion = brands[i].version;
1433
+ if (this.itemType == BROWSER && !/not.a.brand/i.test(brandName) && (!prevName || /Chrom/.test(prevName) && brandName != CHROMIUM || prevName == EDGE && /WebView2/.test(brandName))) {
1434
+ brandName = strMapper(brandName, browserHintsMap);
1435
+ prevName = this.get(NAME);
1436
+ if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) this.set(NAME, brandName).set(VERSION, brandVersion).set(MAJOR, majorize(brandVersion));
1437
+ prevName = brandName;
1438
+ }
1439
+ if (this.itemType == ENGINE && brandName == CHROMIUM) this.set(VERSION, brandVersion);
1440
+ }
1441
+ break;
1442
+ case CPU:
1443
+ var archName = uaCH[ARCHITECTURE];
1444
+ if (archName) {
1445
+ if (archName && uaCH[BITNESS] == "64") archName += "64";
1446
+ rgxMapper.call(this.data, archName + ";", rgxMap);
1447
+ }
1448
+ break;
1449
+ case DEVICE:
1450
+ if (uaCH[MOBILE]) this.set(TYPE, MOBILE);
1451
+ if (uaCH[MODEL]) {
1452
+ this.set(MODEL, uaCH[MODEL]);
1453
+ if (!this.get(TYPE) || !this.get(VENDOR)) {
1454
+ var reParse = {};
1455
+ rgxMapper.call(reParse, "droid 9; " + uaCH[MODEL] + ")", rgxMap);
1456
+ if (!this.get(TYPE) && !!reParse.type) this.set(TYPE, reParse.type);
1457
+ if (!this.get(VENDOR) && !!reParse.vendor) this.set(VENDOR, reParse.vendor);
1458
+ }
1459
+ }
1460
+ if (uaCH[FORMFACTORS]) {
1461
+ var ff;
1462
+ if (typeof uaCH[FORMFACTORS] !== "string") {
1463
+ var idx = 0;
1464
+ while (!ff && idx < uaCH[FORMFACTORS].length) ff = strMapper(uaCH[FORMFACTORS][idx++], formFactorsMap);
1465
+ } else ff = strMapper(uaCH[FORMFACTORS], formFactorsMap);
1466
+ this.set(TYPE, ff);
1467
+ }
1468
+ break;
1469
+ case OS:
1470
+ var osName = uaCH[PLATFORM];
1471
+ if (osName) {
1472
+ var osVersion = uaCH[PLATFORMVER];
1473
+ if (osName == WINDOWS) osVersion = parseInt(majorize(osVersion), 10) >= 13 ? "11" : "10";
1474
+ this.set(NAME, osName).set(VERSION, osVersion);
1475
+ }
1476
+ if (this.get(NAME) == WINDOWS && uaCH[MODEL] == "Xbox") this.set(NAME, "Xbox").set(VERSION, void 0);
1477
+ break;
1478
+ case RESULT:
1479
+ var data = this.data;
1480
+ var parse = function(itemType) {
1481
+ return data[itemType].getItem().setCH(uaCH).parseCH().get();
1482
+ };
1483
+ this.set(BROWSER, parse(BROWSER)).set(CPU, parse(CPU)).set(DEVICE, parse(DEVICE)).set(ENGINE, parse(ENGINE)).set(OS, parse(OS));
1484
+ }
1485
+ return this;
1486
+ };
1487
+ function UAParser(ua, extensions, headers) {
1488
+ if (typeof ua === TYPEOF.OBJECT) {
1489
+ if (isExtensions(ua, true)) {
1490
+ if (typeof extensions === TYPEOF.OBJECT) headers = extensions;
1491
+ extensions = ua;
1492
+ } else {
1493
+ headers = ua;
1494
+ extensions = void 0;
1495
+ }
1496
+ ua = void 0;
1497
+ } else if (typeof ua === TYPEOF.STRING && !isExtensions(extensions, true)) {
1498
+ headers = extensions;
1499
+ extensions = void 0;
1500
+ }
1501
+ if (headers) if (typeof headers.append === TYPEOF.FUNCTION) {
1502
+ var kv = {};
1503
+ headers.forEach(function(v$1, k$1) {
1504
+ kv[String(k$1).toLowerCase()] = v$1;
1505
+ });
1506
+ headers = kv;
1507
+ } else {
1508
+ var normalized = {};
1509
+ for (var header in headers) if (headers.hasOwnProperty(header)) normalized[String(header).toLowerCase()] = headers[header];
1510
+ headers = normalized;
1511
+ }
1512
+ if (!(this instanceof UAParser)) return new UAParser(ua, extensions, headers).getResult();
1513
+ var userAgent = typeof ua === TYPEOF.STRING ? ua : headers && headers[USER_AGENT] ? headers[USER_AGENT] : NAVIGATOR && NAVIGATOR.userAgent ? NAVIGATOR.userAgent : EMPTY, httpUACH = new UACHData(headers, true), regexMap = extensions ? extend(defaultRegexes, extensions) : defaultRegexes, createItemFunc = function(itemType) {
1514
+ if (itemType == RESULT) return function() {
1515
+ return new UAItem(itemType, userAgent, regexMap, httpUACH).set("ua", userAgent).set(BROWSER, this.getBrowser()).set(CPU, this.getCPU()).set(DEVICE, this.getDevice()).set(ENGINE, this.getEngine()).set(OS, this.getOS()).get();
1516
+ };
1517
+ else return function() {
1518
+ return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH).parseUA().get();
1519
+ };
1520
+ };
1521
+ setProps.call(this, [
1522
+ ["getBrowser", createItemFunc(BROWSER)],
1523
+ ["getCPU", createItemFunc(CPU)],
1524
+ ["getDevice", createItemFunc(DEVICE)],
1525
+ ["getEngine", createItemFunc(ENGINE)],
1526
+ ["getOS", createItemFunc(OS)],
1527
+ ["getResult", createItemFunc(RESULT)],
1528
+ ["getUA", function() {
1529
+ return userAgent;
1530
+ }],
1531
+ ["setUA", function(ua$1) {
1532
+ if (isString(ua$1)) userAgent = trim(ua$1, UA_MAX_LENGTH);
1533
+ return this;
1534
+ }]
1535
+ ]).setUA(userAgent);
1536
+ return this;
1537
+ }
1538
+ UAParser.VERSION = LIBVERSION;
1539
+ UAParser.BROWSER = enumerize([
1540
+ NAME,
1541
+ VERSION,
1542
+ MAJOR,
1543
+ TYPE
1544
+ ]);
1545
+ UAParser.CPU = enumerize([ARCHITECTURE]);
1546
+ UAParser.DEVICE = enumerize([
1547
+ MODEL,
1548
+ VENDOR,
1549
+ TYPE,
1550
+ CONSOLE,
1551
+ MOBILE,
1552
+ SMARTTV,
1553
+ TABLET,
1554
+ WEARABLE,
1555
+ EMBEDDED
1556
+ ]);
1557
+ UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);
1558
+
1559
+ //#endregion
1560
+ //#region ../infra/src/providers/browser/BrowserInfoProvider.ts
1561
+ var BrowserInfoProvider = class {
1562
+ checkWebRtcSupport() {
1563
+ if (typeof window === "undefined") return false;
1564
+ const hasRTCPeerConnection = "RTCPeerConnection" in window || "webkitRTCPeerConnection" in window || "mozRTCPeerConnection" in window;
1565
+ const hasGetUserMedia = typeof navigator !== "undefined" && navigator.mediaDevices?.getUserMedia !== void 0;
1566
+ return hasRTCPeerConnection && hasGetUserMedia;
1567
+ }
1568
+ getBrowserInfo() {
1569
+ const userAgent = typeof navigator !== "undefined" ? navigator.userAgent : "";
1570
+ const result = new UAParser(userAgent).getResult();
1571
+ return {
1572
+ userAgent,
1573
+ isWebRtcSupported: this.checkWebRtcSupport(),
1574
+ browser: {
1575
+ name: result.browser.name,
1576
+ version: result.browser.version
1577
+ },
1578
+ os: {
1579
+ name: result.os.name,
1580
+ version: result.os.version
1581
+ },
1582
+ device: {
1583
+ model: result.device.model,
1584
+ type: result.device.type,
1585
+ vendor: result.device.vendor
1586
+ },
1587
+ engine: {
1588
+ name: result.engine.name,
1589
+ version: result.engine.version
1590
+ },
1591
+ cpu: { architecture: result.cpu.architecture }
1592
+ };
1593
+ }
1594
+ };
1595
+
1596
+ //#endregion
1597
+ //#region ../infra/src/device/getDeviceData.ts
1598
+ const HIGH_ENTROPY_HINTS = new Set([
1599
+ "model",
1600
+ "platformVersion",
1601
+ "fullVersionList",
1602
+ "brands",
1603
+ "platform"
1604
+ ]);
1605
+ function getFallbackDeviceInfo() {
1606
+ const result = new UAParser().getResult();
1607
+ return {
1608
+ device: { model: result.device.model },
1609
+ os: {
1610
+ name: result.os.name,
1611
+ version: result.os.version
1612
+ },
1613
+ browser: {
1614
+ name: result.browser.name,
1615
+ version: result.browser.version
1616
+ }
1617
+ };
1618
+ }
1619
+ function sanitizeString(value) {
1620
+ return value?.trim() || void 0;
1621
+ }
1622
+ function extractPrimaryBrandInfo(fullVersionList, brands) {
1623
+ const primaryBrand = fullVersionList?.[0] || brands?.[0];
1624
+ return {
1625
+ name: sanitizeString(primaryBrand?.brand),
1626
+ version: sanitizeString(primaryBrand?.version)
1627
+ };
1628
+ }
1629
+ async function getHighEntropyDeviceInfo(userAgentData) {
1630
+ const highEntropyValues = await userAgentData.getHighEntropyValues(Array.from(HIGH_ENTROPY_HINTS));
1631
+ const { name: browserName, version: browserVersion } = extractPrimaryBrandInfo(highEntropyValues.fullVersionList, userAgentData.brands);
1632
+ return {
1633
+ device: { model: sanitizeString(highEntropyValues.model) },
1634
+ os: {
1635
+ name: sanitizeString(highEntropyValues.platform),
1636
+ version: sanitizeString(highEntropyValues.platformVersion)
1637
+ },
1638
+ browser: {
1639
+ name: browserName,
1640
+ version: browserVersion
1641
+ }
1642
+ };
1643
+ }
1644
+ const checkForUnbrandedBrowser = (browser) => {
1645
+ const userAgent = typeof navigator !== "undefined" ? navigator.userAgent : "";
1646
+ const fallback = getFallbackDeviceInfo();
1647
+ if (!userAgent) return browser;
1648
+ try {
1649
+ return {
1650
+ ...browser,
1651
+ name: fallback.browser.name,
1652
+ version: fallback.browser.version
1653
+ };
1654
+ } catch {
1655
+ return {
1656
+ ...browser,
1657
+ name: "Unknown",
1658
+ version: "Unknown"
1659
+ };
1660
+ }
1661
+ };
1662
+ function mergeDeviceInfo(fallback, enhanced) {
1663
+ return {
1664
+ device: { model: enhanced.device?.model || fallback.device.model },
1665
+ os: {
1666
+ name: enhanced.os?.name || fallback.os.name,
1667
+ version: enhanced.os?.version || fallback.os.version
1668
+ },
1669
+ browser: checkForUnbrandedBrowser({
1670
+ name: enhanced.browser?.name || fallback.browser.name,
1671
+ version: enhanced.browser?.version || fallback.browser.version
1672
+ })
1673
+ };
1674
+ }
1675
+ function isUserAgentClientHintsSupported(navigator$1) {
1676
+ return Boolean(navigator$1.userAgentData?.getHighEntropyValues && typeof navigator$1.userAgentData.getHighEntropyValues === "function");
1677
+ }
1678
+ async function getDeviceFingerprintInfo() {
1679
+ if (typeof navigator === "undefined") return {
1680
+ device: {},
1681
+ os: {},
1682
+ browser: {}
1683
+ };
1684
+ const customNavigator = navigator;
1685
+ const fallbackInfo = getFallbackDeviceInfo();
1686
+ if (!isUserAgentClientHintsSupported(customNavigator)) return fallbackInfo;
1687
+ try {
1688
+ return mergeDeviceInfo(fallbackInfo, await getHighEntropyDeviceInfo(customNavigator.userAgentData));
1689
+ } catch {
1690
+ return fallbackInfo;
1691
+ }
1692
+ }
1693
+
1694
+ //#endregion
1695
+ //#region ../../node_modules/.pnpm/@thumbmarkjs+thumbmarkjs@1.6.4/node_modules/@thumbmarkjs/thumbmarkjs/dist/thumbmark.esm.js
1696
+ const e = 2592e5, t = "thumbmark", n = "https://api.thumbmarkjs.com", o = {
1697
+ exclude: [],
1698
+ include: [],
1699
+ stabilize: ["private", "iframe"],
1700
+ logging: !0,
1701
+ timeout: 5e3,
1702
+ cache_api_call: !0,
1703
+ cache_lifetime_in_ms: 0,
1704
+ performance: !1,
1705
+ experimental: !1,
1706
+ property_name_factory: (e$1) => `${t}_${e$1}`
1707
+ };
1708
+ let r = { ...o };
1709
+ const a = {
1710
+ private: [
1711
+ {
1712
+ exclude: ["canvas"],
1713
+ browsers: [
1714
+ "firefox",
1715
+ "safari>=17",
1716
+ "brave"
1717
+ ]
1718
+ },
1719
+ {
1720
+ exclude: ["audio"],
1721
+ browsers: ["samsungbrowser", "safari"]
1722
+ },
1723
+ {
1724
+ exclude: ["fonts"],
1725
+ browsers: ["firefox"]
1726
+ },
1727
+ {
1728
+ exclude: [
1729
+ "audio.sampleHash",
1730
+ "hardware.deviceMemory",
1731
+ "header.acceptLanguage.q",
1732
+ "system.hardwareConcurrency",
1733
+ "plugins"
1734
+ ],
1735
+ browsers: ["brave"]
1736
+ },
1737
+ {
1738
+ exclude: ["tls.extensions"],
1739
+ browsers: [
1740
+ "firefox",
1741
+ "chrome",
1742
+ "safari"
1743
+ ]
1744
+ },
1745
+ {
1746
+ exclude: ["header.acceptLanguage"],
1747
+ browsers: ["edge", "chrome"]
1748
+ }
1749
+ ],
1750
+ iframe: [{
1751
+ exclude: ["system.applePayVersion", "system.cookieEnabled"],
1752
+ browsers: ["safari"]
1753
+ }, { exclude: ["permissions"] }],
1754
+ vpn: [{ exclude: ["ip"] }]
1755
+ }, s = "undefined" != typeof window ? window.OfflineAudioContext || window.webkitOfflineAudioContext : null;
1756
+ function c(e$1) {
1757
+ let t$1 = 0;
1758
+ for (let n$1 = 0; n$1 < e$1.length; ++n$1) t$1 += Math.abs(e$1[n$1]);
1759
+ return t$1;
1760
+ }
1761
+ function l(e$1, t$1, n$1) {
1762
+ let o$1 = [];
1763
+ for (let t$2 = 0; t$2 < e$1[0].data.length; t$2++) {
1764
+ let n$2 = [];
1765
+ for (let o$2 = 0; o$2 < e$1.length; o$2++) n$2.push(e$1[o$2].data[t$2]);
1766
+ o$1.push(u(n$2));
1767
+ }
1768
+ const r$1 = new Uint8ClampedArray(o$1);
1769
+ return new ImageData(r$1, t$1, n$1);
1770
+ }
1771
+ function u(e$1) {
1772
+ if (0 === e$1.length) return 0;
1773
+ const t$1 = {};
1774
+ for (const n$2 of e$1) t$1[n$2] = (t$1[n$2] || 0) + 1;
1775
+ let n$1 = e$1[0];
1776
+ for (const e$2 in t$1) t$1[e$2] > t$1[n$1] && (n$1 = parseInt(e$2, 10));
1777
+ return n$1;
1778
+ }
1779
+ function d(e$1) {
1780
+ return e$1 ^= e$1 >>> 16, e$1 = Math.imul(e$1, 2246822507), e$1 ^= e$1 >>> 13, e$1 = Math.imul(e$1, 3266489909), (e$1 ^= e$1 >>> 16) >>> 0;
1781
+ }
1782
+ const m = new Uint32Array([
1783
+ 597399067,
1784
+ 2869860233,
1785
+ 951274213,
1786
+ 2716044179
1787
+ ]);
1788
+ function f(e$1, t$1) {
1789
+ return e$1 << t$1 | e$1 >>> 32 - t$1;
1790
+ }
1791
+ function h(e$1, t$1 = 0) {
1792
+ if (t$1 = t$1 ? 0 | t$1 : 0, "string" == typeof e$1 && (e$1 = function(e$2) {
1793
+ if ("undefined" != typeof TextEncoder) return new TextEncoder().encode(e$2).buffer;
1794
+ const t$2 = [];
1795
+ for (let n$2 = 0; n$2 < e$2.length; n$2++) {
1796
+ let o$2 = e$2.charCodeAt(n$2);
1797
+ o$2 < 128 ? t$2.push(o$2) : o$2 < 2048 ? t$2.push(192 | o$2 >> 6, 128 | 63 & o$2) : o$2 < 55296 || o$2 >= 57344 ? t$2.push(224 | o$2 >> 12, 128 | o$2 >> 6 & 63, 128 | 63 & o$2) : (n$2++, o$2 = 65536 + ((1023 & o$2) << 10 | 1023 & e$2.charCodeAt(n$2)), t$2.push(240 | o$2 >> 18, 128 | o$2 >> 12 & 63, 128 | o$2 >> 6 & 63, 128 | 63 & o$2));
1798
+ }
1799
+ return new Uint8Array(t$2).buffer;
1800
+ }(e$1)), !(e$1 instanceof ArrayBuffer)) throw new TypeError("Expected key to be ArrayBuffer or string");
1801
+ const n$1 = new Uint32Array([
1802
+ t$1,
1803
+ t$1,
1804
+ t$1,
1805
+ t$1
1806
+ ]);
1807
+ (function(e$2, t$2) {
1808
+ const n$2 = e$2.byteLength / 16 | 0, o$2 = new Uint32Array(e$2, 0, 4 * n$2);
1809
+ for (let e$3 = 0; e$3 < n$2; e$3++) {
1810
+ const n$3 = o$2.subarray(4 * e$3, 4 * (e$3 + 1));
1811
+ n$3[0] = Math.imul(n$3[0], m[0]), n$3[0] = f(n$3[0], 15), n$3[0] = Math.imul(n$3[0], m[1]), t$2[0] = t$2[0] ^ n$3[0], t$2[0] = f(t$2[0], 19), t$2[0] = t$2[0] + t$2[1], t$2[0] = Math.imul(t$2[0], 5) + 1444728091, n$3[1] = Math.imul(n$3[1], m[1]), n$3[1] = f(n$3[1], 16), n$3[1] = Math.imul(n$3[1], m[2]), t$2[1] = t$2[1] ^ n$3[1], t$2[1] = f(t$2[1], 17), t$2[1] = t$2[1] + t$2[2], t$2[1] = Math.imul(t$2[1], 5) + 197830471, n$3[2] = Math.imul(n$3[2], m[2]), n$3[2] = f(n$3[2], 17), n$3[2] = Math.imul(n$3[2], m[3]), t$2[2] = t$2[2] ^ n$3[2], t$2[2] = f(t$2[2], 15), t$2[2] = t$2[2] + t$2[3], t$2[2] = Math.imul(t$2[2], 5) + 2530024501, n$3[3] = Math.imul(n$3[3], m[3]), n$3[3] = f(n$3[3], 18), n$3[3] = Math.imul(n$3[3], m[0]), t$2[3] = t$2[3] ^ n$3[3], t$2[3] = f(t$2[3], 13), t$2[3] = t$2[3] + t$2[0], t$2[3] = Math.imul(t$2[3], 5) + 850148119;
1812
+ }
1813
+ })(e$1, n$1), function(e$2, t$2) {
1814
+ const n$2 = e$2.byteLength / 16 | 0, o$2 = e$2.byteLength % 16, r$1 = new Uint32Array(4), i = new Uint8Array(e$2, 16 * n$2, o$2);
1815
+ switch (o$2) {
1816
+ case 15: r$1[3] = r$1[3] ^ i[14] << 16;
1817
+ case 14: r$1[3] = r$1[3] ^ i[13] << 8;
1818
+ case 13: r$1[3] = r$1[3] ^ i[12], r$1[3] = Math.imul(r$1[3], m[3]), r$1[3] = f(r$1[3], 18), r$1[3] = Math.imul(r$1[3], m[0]), t$2[3] = t$2[3] ^ r$1[3];
1819
+ case 12: r$1[2] = r$1[2] ^ i[11] << 24;
1820
+ case 11: r$1[2] = r$1[2] ^ i[10] << 16;
1821
+ case 10: r$1[2] = r$1[2] ^ i[9] << 8;
1822
+ case 9: r$1[2] = r$1[2] ^ i[8], r$1[2] = Math.imul(r$1[2], m[2]), r$1[2] = f(r$1[2], 17), r$1[2] = Math.imul(r$1[2], m[3]), t$2[2] = t$2[2] ^ r$1[2];
1823
+ case 8: r$1[1] = r$1[1] ^ i[7] << 24;
1824
+ case 7: r$1[1] = r$1[1] ^ i[6] << 16;
1825
+ case 6: r$1[1] = r$1[1] ^ i[5] << 8;
1826
+ case 5: r$1[1] = r$1[1] ^ i[4], r$1[1] = Math.imul(r$1[1], m[1]), r$1[1] = f(r$1[1], 16), r$1[1] = Math.imul(r$1[1], m[2]), t$2[1] = t$2[1] ^ r$1[1];
1827
+ case 4: r$1[0] = r$1[0] ^ i[3] << 24;
1828
+ case 3: r$1[0] = r$1[0] ^ i[2] << 16;
1829
+ case 2: r$1[0] = r$1[0] ^ i[1] << 8;
1830
+ case 1: r$1[0] = r$1[0] ^ i[0], r$1[0] = Math.imul(r$1[0], m[0]), r$1[0] = f(r$1[0], 15), r$1[0] = Math.imul(r$1[0], m[1]), t$2[0] = t$2[0] ^ r$1[0];
1831
+ }
1832
+ }(e$1, n$1), function(e$2, t$2) {
1833
+ t$2[0] = t$2[0] ^ e$2.byteLength, t$2[1] = t$2[1] ^ e$2.byteLength, t$2[2] = t$2[2] ^ e$2.byteLength, t$2[3] = t$2[3] ^ e$2.byteLength, t$2[0] = t$2[0] + t$2[1] | 0, t$2[0] = t$2[0] + t$2[2] | 0, t$2[0] = t$2[0] + t$2[3] | 0, t$2[1] = t$2[1] + t$2[0] | 0, t$2[2] = t$2[2] + t$2[0] | 0, t$2[3] = t$2[3] + t$2[0] | 0, t$2[0] = d(t$2[0]), t$2[1] = d(t$2[1]), t$2[2] = d(t$2[2]), t$2[3] = d(t$2[3]), t$2[0] = t$2[0] + t$2[1] | 0, t$2[0] = t$2[0] + t$2[2] | 0, t$2[0] = t$2[0] + t$2[3] | 0, t$2[1] = t$2[1] + t$2[0] | 0, t$2[2] = t$2[2] + t$2[0] | 0, t$2[3] = t$2[3] + t$2[0] | 0;
1834
+ }(e$1, n$1);
1835
+ const o$1 = new Uint8Array(n$1.buffer);
1836
+ return Array.from(o$1).map(((e$2) => e$2.toString(16).padStart(2, "0"))).join("");
1837
+ }
1838
+ const p = 280;
1839
+ async function g(e$1) {
1840
+ for (var t$1; !document.body;) await w(50);
1841
+ const n$1 = document.createElement("iframe");
1842
+ n$1.setAttribute("frameBorder", "0");
1843
+ const o$1 = n$1.style;
1844
+ o$1.setProperty("position", "fixed"), o$1.setProperty("display", "block", "important"), o$1.setProperty("visibility", "visible"), o$1.setProperty("border", "0"), o$1.setProperty("opacity", "0"), n$1.src = "about:blank", document.body.appendChild(n$1);
1845
+ const r$1 = n$1.contentDocument || (null === (t$1 = n$1.contentWindow) || void 0 === t$1 ? void 0 : t$1.document);
1846
+ if (!r$1) throw new Error("Iframe document is not accessible");
1847
+ e$1({ iframe: r$1 }), setTimeout((() => {
1848
+ document.body.removeChild(n$1);
1849
+ }), 0);
1850
+ }
1851
+ function w(e$1, t$1) {
1852
+ return new Promise(((n$1) => setTimeout(n$1, e$1, t$1)));
1853
+ }
1854
+ const v = [
1855
+ "Arial",
1856
+ "Arial Black",
1857
+ "Arial Narrow",
1858
+ "Arial Rounded MT",
1859
+ "Arimo",
1860
+ "Archivo",
1861
+ "Barlow",
1862
+ "Bebas Neue",
1863
+ "Bitter",
1864
+ "Bookman",
1865
+ "Calibri",
1866
+ "Cabin",
1867
+ "Candara",
1868
+ "Century",
1869
+ "Century Gothic",
1870
+ "Comic Sans MS",
1871
+ "Constantia",
1872
+ "Courier",
1873
+ "Courier New",
1874
+ "Crimson Text",
1875
+ "DM Mono",
1876
+ "DM Sans",
1877
+ "DM Serif Display",
1878
+ "DM Serif Text",
1879
+ "Dosis",
1880
+ "Droid Sans",
1881
+ "Exo",
1882
+ "Fira Code",
1883
+ "Fira Sans",
1884
+ "Franklin Gothic Medium",
1885
+ "Garamond",
1886
+ "Geneva",
1887
+ "Georgia",
1888
+ "Gill Sans",
1889
+ "Helvetica",
1890
+ "Impact",
1891
+ "Inconsolata",
1892
+ "Indie Flower",
1893
+ "Inter",
1894
+ "Josefin Sans",
1895
+ "Karla",
1896
+ "Lato",
1897
+ "Lexend",
1898
+ "Lucida Bright",
1899
+ "Lucida Console",
1900
+ "Lucida Sans Unicode",
1901
+ "Manrope",
1902
+ "Merriweather",
1903
+ "Merriweather Sans",
1904
+ "Montserrat",
1905
+ "Myriad",
1906
+ "Noto Sans",
1907
+ "Nunito",
1908
+ "Nunito Sans",
1909
+ "Open Sans",
1910
+ "Optima",
1911
+ "Orbitron",
1912
+ "Oswald",
1913
+ "Pacifico",
1914
+ "Palatino",
1915
+ "Perpetua",
1916
+ "PT Sans",
1917
+ "PT Serif",
1918
+ "Poppins",
1919
+ "Prompt",
1920
+ "Public Sans",
1921
+ "Quicksand",
1922
+ "Rajdhani",
1923
+ "Recursive",
1924
+ "Roboto",
1925
+ "Roboto Condensed",
1926
+ "Rockwell",
1927
+ "Rubik",
1928
+ "Segoe Print",
1929
+ "Segoe Script",
1930
+ "Segoe UI",
1931
+ "Sora",
1932
+ "Source Sans Pro",
1933
+ "Space Mono",
1934
+ "Tahoma",
1935
+ "Taviraj",
1936
+ "Times",
1937
+ "Times New Roman",
1938
+ "Titillium Web",
1939
+ "Trebuchet MS",
1940
+ "Ubuntu",
1941
+ "Varela Round",
1942
+ "Verdana",
1943
+ "Work Sans"
1944
+ ], y = [
1945
+ "monospace",
1946
+ "sans-serif",
1947
+ "serif"
1948
+ ];
1949
+ function S(e$1, t$1) {
1950
+ return e$1.font = `72px ${t$1}`, e$1.measureText("WwMmLli0Oo").width;
1951
+ }
1952
+ function b() {
1953
+ var e$1;
1954
+ const t$1 = document.createElement("canvas"), n$1 = null !== (e$1 = t$1.getContext("webgl")) && void 0 !== e$1 ? e$1 : t$1.getContext("experimental-webgl");
1955
+ if (n$1 && "getParameter" in n$1) try {
1956
+ const e$2 = (n$1.getParameter(n$1.VENDOR) || "").toString(), t$2 = (n$1.getParameter(n$1.RENDERER) || "").toString();
1957
+ let o$1 = {
1958
+ vendor: e$2,
1959
+ renderer: t$2,
1960
+ version: (n$1.getParameter(n$1.VERSION) || "").toString(),
1961
+ shadingLanguageVersion: (n$1.getParameter(n$1.SHADING_LANGUAGE_VERSION) || "").toString()
1962
+ };
1963
+ if (!t$2.length || !e$2.length) {
1964
+ const e$3 = n$1.getExtension("WEBGL_debug_renderer_info");
1965
+ if (e$3) {
1966
+ const t$3 = (n$1.getParameter(e$3.UNMASKED_VENDOR_WEBGL) || "").toString(), r$1 = (n$1.getParameter(e$3.UNMASKED_RENDERER_WEBGL) || "").toString();
1967
+ t$3 && (o$1.vendorUnmasked = t$3), r$1 && (o$1.rendererUnmasked = r$1);
1968
+ }
1969
+ }
1970
+ return o$1;
1971
+ } catch (e$2) {}
1972
+ return "undefined";
1973
+ }
1974
+ function E() {
1975
+ const e$1 = new Float32Array(1), t$1 = new Uint8Array(e$1.buffer);
1976
+ return e$1[0] = Infinity, e$1[0] = e$1[0] - e$1[0], t$1[3];
1977
+ }
1978
+ const M = (e$1, t$1, n$1, o$1) => {
1979
+ const r$1 = (n$1 - t$1) / o$1;
1980
+ let i = 0;
1981
+ for (let n$2 = 0; n$2 < o$1; n$2++) i += e$1(t$1 + (n$2 + .5) * r$1);
1982
+ return i * r$1;
1983
+ };
1984
+ function P(e$1, t$1) {
1985
+ const n$1 = {};
1986
+ return t$1.forEach(((t$2) => {
1987
+ const o$1 = function(e$2) {
1988
+ if (0 === e$2.length) return null;
1989
+ const t$3 = {};
1990
+ e$2.forEach(((e$3) => {
1991
+ const n$3 = String(e$3);
1992
+ t$3[n$3] = (t$3[n$3] || 0) + 1;
1993
+ }));
1994
+ let n$2 = e$2[0], o$2 = 1;
1995
+ return Object.keys(t$3).forEach(((e$3) => {
1996
+ t$3[e$3] > o$2 && (n$2 = e$3, o$2 = t$3[e$3]);
1997
+ })), n$2;
1998
+ }(e$1.map(((e$2) => t$2 in e$2 ? e$2[t$2] : void 0)).filter(((e$2) => void 0 !== e$2)));
1999
+ o$1 && (n$1[t$2] = o$1);
2000
+ })), n$1;
2001
+ }
2002
+ const A = [
2003
+ "accelerometer",
2004
+ "accessibility",
2005
+ "accessibility-events",
2006
+ "ambient-light-sensor",
2007
+ "background-fetch",
2008
+ "background-sync",
2009
+ "bluetooth",
2010
+ "camera",
2011
+ "clipboard-read",
2012
+ "clipboard-write",
2013
+ "device-info",
2014
+ "display-capture",
2015
+ "gyroscope",
2016
+ "geolocation",
2017
+ "local-fonts",
2018
+ "magnetometer",
2019
+ "microphone",
2020
+ "midi",
2021
+ "nfc",
2022
+ "notifications",
2023
+ "payment-handler",
2024
+ "persistent-storage",
2025
+ "push",
2026
+ "speaker",
2027
+ "storage-access",
2028
+ "top-level-storage-access",
2029
+ "window-management",
2030
+ "query"
2031
+ ];
2032
+ function x() {
2033
+ var e$1, t$1, n$1, o$1, r$1, i;
2034
+ if ("undefined" == typeof navigator) return {
2035
+ name: "unknown",
2036
+ version: "unknown"
2037
+ };
2038
+ const a$1 = navigator.userAgent, s$1 = [
2039
+ /(?<name>SamsungBrowser)\/(?<version>\d+(?:\.\d+)+)/,
2040
+ /(?<name>EdgA|EdgiOS|Edg)\/(?<version>\d+(?:\.\d+)+)/,
2041
+ /(?<name>OPR|OPX)\/(?<version>\d+(?:\.\d+)+)/,
2042
+ /Opera[\s\/](?<version>\d+(?:\.\d+)+)/,
2043
+ /Opera Mini\/(?<version>\d+(?:\.\d+)+)/,
2044
+ /Opera Mobi\/(?<version>\d+(?:\.\d+)+)/,
2045
+ /(?<name>Vivaldi)\/(?<version>\d+(?:\.\d+)+)/,
2046
+ /(?<name>Brave)\/(?<version>\d+(?:\.\d+)+)/,
2047
+ /(?<name>CriOS)\/(?<version>\d+(?:\.\d+)+)/,
2048
+ /(?<name>FxiOS)\/(?<version>\d+(?:\.\d+)+)/,
2049
+ /(?<name>Chrome|Chromium)\/(?<version>\d+(?:\.\d+)+)/,
2050
+ /(?<name>Firefox|Waterfox|Iceweasel|IceCat)\/(?<version>\d+(?:\.\d+)+)/,
2051
+ /Version\/(?<version1>[\d.]+).*Safari\/[\d.]+|(?<name>Safari)\/(?<version2>[\d.]+)/,
2052
+ /(?<name>MSIE|Trident|IEMobile).+?(?<version>\d+(?:\.\d+)+)/,
2053
+ /(?<name>[A-Za-z]+)\/(?<version>\d+(?:\.\d+)+)/
2054
+ ], c$1 = {
2055
+ edg: "Edge",
2056
+ edga: "Edge",
2057
+ edgios: "Edge",
2058
+ opr: "Opera",
2059
+ opx: "Opera",
2060
+ crios: "Chrome",
2061
+ fxios: "Firefox",
2062
+ samsung: "SamsungBrowser",
2063
+ vivaldi: "Vivaldi",
2064
+ brave: "Brave"
2065
+ };
2066
+ for (const l$1 of s$1) {
2067
+ const s$2 = a$1.match(l$1);
2068
+ if (s$2) {
2069
+ let a$2 = null === (e$1 = s$2.groups) || void 0 === e$1 ? void 0 : e$1.name, u$1 = (null === (t$1 = s$2.groups) || void 0 === t$1 ? void 0 : t$1.version) || (null === (n$1 = s$2.groups) || void 0 === n$1 ? void 0 : n$1.version1) || (null === (o$1 = s$2.groups) || void 0 === o$1 ? void 0 : o$1.version2);
2070
+ if (a$2 || !(null === (r$1 = s$2.groups) || void 0 === r$1 ? void 0 : r$1.version1) && !(null === (i = s$2.groups) || void 0 === i ? void 0 : i.version2) || (a$2 = "Safari"), !a$2 && l$1.source.includes("Opera Mini") && (a$2 = "Opera Mini"), !a$2 && l$1.source.includes("Opera Mobi") && (a$2 = "Opera Mobi"), !a$2 && l$1.source.includes("Opera") && (a$2 = "Opera"), !a$2 && s$2[1] && (a$2 = s$2[1]), !u$1 && s$2[2] && (u$1 = s$2[2]), a$2) return {
2071
+ name: c$1[a$2.toLowerCase()] || a$2,
2072
+ version: u$1 || "unknown"
2073
+ };
2074
+ }
2075
+ }
2076
+ return {
2077
+ name: "unknown",
2078
+ version: "unknown"
2079
+ };
2080
+ }
2081
+ function C() {
2082
+ if ("undefined" == typeof navigator || !navigator.userAgent) return !1;
2083
+ const e$1 = navigator.userAgent;
2084
+ return /Mobi|Android|iPhone|iPod|IEMobile|Opera Mini|Opera Mobi|webOS|BlackBerry|Windows Phone/i.test(e$1) && !/iPad/i.test(e$1);
2085
+ }
2086
+ function _() {
2087
+ let e$1 = [];
2088
+ const t$1 = {
2089
+ "prefers-contrast": [
2090
+ "high",
2091
+ "more",
2092
+ "low",
2093
+ "less",
2094
+ "forced",
2095
+ "no-preference"
2096
+ ],
2097
+ "any-hover": ["hover", "none"],
2098
+ "any-pointer": [
2099
+ "none",
2100
+ "coarse",
2101
+ "fine"
2102
+ ],
2103
+ pointer: [
2104
+ "none",
2105
+ "coarse",
2106
+ "fine"
2107
+ ],
2108
+ hover: ["hover", "none"],
2109
+ update: ["fast", "slow"],
2110
+ "inverted-colors": ["inverted", "none"],
2111
+ "prefers-reduced-motion": ["reduce", "no-preference"],
2112
+ "prefers-reduced-transparency": ["reduce", "no-preference"],
2113
+ scripting: [
2114
+ "none",
2115
+ "initial-only",
2116
+ "enabled"
2117
+ ],
2118
+ "forced-colors": ["active", "none"]
2119
+ };
2120
+ return Object.keys(t$1).forEach(((n$1) => {
2121
+ t$1[n$1].forEach(((t$2) => {
2122
+ matchMedia(`(${n$1}: ${t$2})`).matches && e$1.push(`${n$1}: ${t$2}`);
2123
+ }));
2124
+ })), e$1;
2125
+ }
2126
+ function I() {
2127
+ if ("https:" === window.location.protocol && "function" == typeof window.ApplePaySession) try {
2128
+ const e$1 = window.ApplePaySession.supportsVersion;
2129
+ for (let t$1 = 15; t$1 > 0; t$1--) if (e$1(t$1)) return t$1;
2130
+ } catch (e$1) {
2131
+ return 0;
2132
+ }
2133
+ return 0;
2134
+ }
2135
+ const T = "SamsungBrowser" !== x().name ? 1 : 3;
2136
+ let R, k = null;
2137
+ function O(e$1) {
2138
+ const t$1 = [];
2139
+ return function e$2(n$1) {
2140
+ if (n$1 && n$1.toJSON && "function" == typeof n$1.toJSON && (n$1 = n$1.toJSON()), void 0 === n$1) return;
2141
+ if ("number" == typeof n$1) return isFinite(n$1) ? "" + n$1 : "null";
2142
+ if ("object" != typeof n$1) return JSON.stringify(n$1);
2143
+ let o$1, r$1;
2144
+ if (Array.isArray(n$1)) {
2145
+ for (r$1 = "[", o$1 = 0; o$1 < n$1.length; o$1++) o$1 && (r$1 += ","), r$1 += e$2(n$1[o$1]) || "null";
2146
+ return r$1 + "]";
2147
+ }
2148
+ if (null === n$1) return "null";
2149
+ if (-1 !== t$1.indexOf(n$1)) throw new TypeError("Converting circular structure to JSON");
2150
+ const i = t$1.push(n$1) - 1, a$1 = Object.keys(n$1).sort();
2151
+ for (r$1 = "", o$1 = 0; o$1 < a$1.length; o$1++) {
2152
+ const t$2 = a$1[o$1], i$1 = e$2(n$1[t$2]);
2153
+ i$1 && (r$1 && (r$1 += ","), r$1 += JSON.stringify(t$2) + ":" + i$1);
2154
+ }
2155
+ return t$1.splice(i, 1), "{" + r$1 + "}";
2156
+ }(e$1) || "";
2157
+ }
2158
+ const L = [
2159
+ "𝔄",
2160
+ "𝔅",
2161
+ "ℭ",
2162
+ "𝔇",
2163
+ "𝔈",
2164
+ "𝔉",
2165
+ "𝔸",
2166
+ "𝔹",
2167
+ "ℂ",
2168
+ "𝔻",
2169
+ "𝔼",
2170
+ "𝔽"
2171
+ ], B = [
2172
+ "β",
2173
+ "ψ",
2174
+ "λ",
2175
+ "ε",
2176
+ "ζ",
2177
+ "α",
2178
+ "ξ",
2179
+ "μ",
2180
+ "ρ",
2181
+ "φ",
2182
+ "κ",
2183
+ "τ",
2184
+ "η",
2185
+ "σ",
2186
+ "ι",
2187
+ "ω",
2188
+ "γ",
2189
+ "ν",
2190
+ "χ",
2191
+ "δ",
2192
+ "θ",
2193
+ "π",
2194
+ "υ",
2195
+ "ο"
2196
+ ];
2197
+ function D(e$1, t$1) {
2198
+ return `<math><mrow>${t$1}</mrow></math>`;
2199
+ }
2200
+ function N() {
2201
+ let e$1 = "<mo>∏</mo>";
2202
+ return L.forEach(((t$1, n$1) => {
2203
+ const o$1 = 2 * n$1, r$1 = B.slice(o$1, o$1 + 2);
2204
+ 2 === r$1.length && (e$1 += `<mmultiscripts><mi>${t$1}</mi><none/><mi>${r$1[1]}</mi><mprescripts></mprescripts><mi>${r$1[0]}</mi><none/></mmultiscripts>`);
2205
+ })), D(0, `<munderover><mmultiscripts>${e$1}</mmultiscripts></munderover>`);
2206
+ }
2207
+ function $() {
2208
+ const e$1 = [];
2209
+ return L.forEach(((t$1, n$1) => {
2210
+ const o$1 = 2 * n$1, r$1 = B.slice(o$1, o$1 + 2);
2211
+ 2 === r$1.length && e$1.push(D(0, `<mmultiscripts><mi>${t$1}</mi><none/><mi>${r$1[1]}</mi><mprescripts></mprescripts><mi>${r$1[0]}</mi><none/></mmultiscripts>`));
2212
+ })), e$1;
2213
+ }
2214
+ const V = {
2215
+ audio: async function() {
2216
+ return s ? async function() {
2217
+ return new Promise(((e$1, t$1) => {
2218
+ try {
2219
+ const t$2 = new s(1, 5e3, 44100), n$1 = t$2.createBufferSource(), o$1 = t$2.createOscillator();
2220
+ o$1.frequency.value = 1e3;
2221
+ const r$1 = t$2.createDynamicsCompressor();
2222
+ let i;
2223
+ r$1.threshold.value = -50, r$1.knee.value = 40, r$1.ratio.value = 12, r$1.attack.value = 0, r$1.release.value = .2, o$1.connect(r$1), r$1.connect(t$2.destination), o$1.start(), t$2.oncomplete = (o$2) => {
2224
+ i = o$2.renderedBuffer.getChannelData(0), e$1({
2225
+ sampleHash: c(i),
2226
+ maxChannels: t$2.destination.maxChannelCount,
2227
+ channelCountMode: n$1.channelCountMode
2228
+ });
2229
+ }, t$2.startRendering();
2230
+ } catch (e$2) {
2231
+ console.error("Error creating audio fingerprint:", e$2), t$1(e$2);
2232
+ }
2233
+ }));
2234
+ }() : null;
2235
+ },
2236
+ canvas: async function() {
2237
+ return new Promise(((e$1) => {
2238
+ const t$1 = Array.from({ length: 3 }, (() => function() {
2239
+ const e$2 = document.createElement("canvas"), t$2 = e$2.getContext("2d");
2240
+ if (!t$2) return null;
2241
+ e$2.width = p, e$2.height = 20;
2242
+ const n$1 = t$2.createLinearGradient(0, 0, e$2.width, e$2.height);
2243
+ n$1.addColorStop(0, "red"), n$1.addColorStop(1 / 6, "orange"), n$1.addColorStop(2 / 6, "yellow"), n$1.addColorStop(.5, "green"), n$1.addColorStop(4 / 6, "blue"), n$1.addColorStop(5 / 6, "indigo"), n$1.addColorStop(1, "violet"), t$2.fillStyle = n$1, t$2.fillRect(0, 0, e$2.width, e$2.height);
2244
+ const o$1 = "Random Text WMwmil10Oo";
2245
+ t$2.font = "23.123px Arial", t$2.fillStyle = "black", t$2.fillText(o$1, -5, 15), t$2.fillStyle = "rgba(0, 0, 255, 0.5)", t$2.fillText(o$1, -3.3, 17.7), t$2.beginPath(), t$2.moveTo(0, 0), t$2.lineTo(2 * e$2.width / 7, e$2.height), t$2.strokeStyle = "white", t$2.lineWidth = 2, t$2.stroke();
2246
+ return t$2.getImageData(0, 0, e$2.width, e$2.height);
2247
+ }())).filter(((e$2) => null !== e$2));
2248
+ 0 !== t$1.length ? e$1({ commonPixelsHash: h(l(t$1, p, 20).data.toString()).toString() }) : e$1(null);
2249
+ }));
2250
+ },
2251
+ fonts: async function(e$1) {
2252
+ return new Promise(((e$2) => {
2253
+ try {
2254
+ g((async ({ iframe: t$1 }) => {
2255
+ const n$1 = t$1.createElement("canvas").getContext("2d");
2256
+ if (!n$1) return void e$2(null);
2257
+ const o$1 = y.map(((e$3) => S(n$1, e$3)));
2258
+ let r$1 = {};
2259
+ v.forEach(((e$3) => {
2260
+ const t$2 = S(n$1, e$3);
2261
+ o$1.includes(t$2) || (r$1[e$3] = t$2);
2262
+ })), e$2(r$1);
2263
+ }));
2264
+ } catch (t$1) {
2265
+ e$2(null);
2266
+ }
2267
+ }));
2268
+ },
2269
+ hardware: function() {
2270
+ return new Promise(((e$1, t$1) => {
2271
+ const n$1 = void 0 !== navigator.deviceMemory ? navigator.deviceMemory : 0, o$1 = window.performance && window.performance.memory ? window.performance.memory : 0;
2272
+ e$1({
2273
+ videocard: b(),
2274
+ architecture: E(),
2275
+ deviceMemory: n$1.toString() || "undefined",
2276
+ jsHeapSizeLimit: o$1.jsHeapSizeLimit || 0
2277
+ });
2278
+ }));
2279
+ },
2280
+ locales: function() {
2281
+ return new Promise(((e$1) => {
2282
+ e$1({
2283
+ languages: navigator.language,
2284
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
2285
+ });
2286
+ }));
2287
+ },
2288
+ math: function() {
2289
+ return new Promise(((e$1) => {
2290
+ e$1({
2291
+ acos: Math.acos(.5),
2292
+ asin: M(Math.asin, -1, 1, 97),
2293
+ cos: M(Math.cos, 0, Math.PI, 97),
2294
+ largeCos: Math.cos(0x56bc75e2d63100000),
2295
+ largeSin: Math.sin(0x56bc75e2d63100000),
2296
+ largeTan: Math.tan(0x56bc75e2d63100000),
2297
+ sin: M(Math.sin, -Math.PI, Math.PI, 97),
2298
+ tan: M(Math.tan, 0, 2 * Math.PI, 97)
2299
+ });
2300
+ }));
2301
+ },
2302
+ permissions: async function(e$1) {
2303
+ const t$1 = (null == e$1 ? void 0 : e$1.permissions_to_check) || A;
2304
+ return P(await Promise.all(Array.from({ length: 3 }, (() => async function(e$2) {
2305
+ const t$2 = {};
2306
+ for (const n$1 of e$2) try {
2307
+ t$2[n$1] = (await navigator.permissions.query({ name: n$1 })).state.toString();
2308
+ } catch (e$3) {}
2309
+ return t$2;
2310
+ }(t$1)))), t$1);
2311
+ },
2312
+ plugins: async function() {
2313
+ const e$1 = [];
2314
+ if (navigator.plugins) for (let t$1 = 0; t$1 < navigator.plugins.length; t$1++) {
2315
+ const n$1 = navigator.plugins[t$1];
2316
+ e$1.push([
2317
+ n$1.name,
2318
+ n$1.filename,
2319
+ n$1.description
2320
+ ].join("|"));
2321
+ }
2322
+ return new Promise(((t$1) => {
2323
+ t$1({ plugins: e$1 });
2324
+ }));
2325
+ },
2326
+ screen: function() {
2327
+ return new Promise(((e$1) => {
2328
+ if ("undefined" == typeof matchMedia || "undefined" == typeof screen) return void e$1(null);
2329
+ const t$1 = {
2330
+ is_touchscreen: navigator.maxTouchPoints > 0,
2331
+ maxTouchPoints: navigator.maxTouchPoints,
2332
+ colorDepth: screen.colorDepth,
2333
+ mediaMatches: _()
2334
+ };
2335
+ C() && navigator.maxTouchPoints > 0 && (t$1.resolution = function() {
2336
+ const e$2 = window.screen.width, t$2 = window.screen.height;
2337
+ return `${Math.max(e$2, t$2).toString()}x${Math.min(e$2, t$2).toString()}`;
2338
+ }()), e$1(t$1);
2339
+ }));
2340
+ },
2341
+ system: function() {
2342
+ return new Promise(((e$1) => {
2343
+ const t$1 = x();
2344
+ e$1({
2345
+ platform: window.navigator.platform,
2346
+ productSub: navigator.productSub,
2347
+ product: navigator.product,
2348
+ useragent: navigator.userAgent,
2349
+ hardwareConcurrency: navigator.hardwareConcurrency,
2350
+ browser: {
2351
+ name: t$1.name,
2352
+ version: t$1.version
2353
+ },
2354
+ mobile: C(),
2355
+ applePayVersion: I(),
2356
+ cookieEnabled: window.navigator.cookieEnabled
2357
+ });
2358
+ }));
2359
+ },
2360
+ webgl: async function() {
2361
+ "undefined" != typeof document && (R = document.createElement("canvas"), R.width = 200, R.height = 100, k = R.getContext("webgl"));
2362
+ try {
2363
+ if (!k) throw new Error("WebGL not supported");
2364
+ return { commonPixelsHash: h(l(Array.from({ length: T }, (() => function() {
2365
+ try {
2366
+ if (!k) throw new Error("WebGL not supported");
2367
+ const e$1 = "\n attribute vec2 position;\n void main() {\n gl_Position = vec4(position, 0.0, 1.0);\n }\n ", t$1 = "\n precision mediump float;\n void main() {\n gl_FragColor = vec4(0.812, 0.195, 0.553, 0.921); // Set line color\n }\n ", n$1 = k.createShader(k.VERTEX_SHADER), o$1 = k.createShader(k.FRAGMENT_SHADER);
2368
+ if (!n$1 || !o$1) throw new Error("Failed to create shaders");
2369
+ if (k.shaderSource(n$1, e$1), k.shaderSource(o$1, t$1), k.compileShader(n$1), !k.getShaderParameter(n$1, k.COMPILE_STATUS)) throw new Error("Vertex shader compilation failed: " + k.getShaderInfoLog(n$1));
2370
+ if (k.compileShader(o$1), !k.getShaderParameter(o$1, k.COMPILE_STATUS)) throw new Error("Fragment shader compilation failed: " + k.getShaderInfoLog(o$1));
2371
+ const r$1 = k.createProgram();
2372
+ if (!r$1) throw new Error("Failed to create shader program");
2373
+ if (k.attachShader(r$1, n$1), k.attachShader(r$1, o$1), k.linkProgram(r$1), !k.getProgramParameter(r$1, k.LINK_STATUS)) throw new Error("Shader program linking failed: " + k.getProgramInfoLog(r$1));
2374
+ k.useProgram(r$1);
2375
+ const i = 137, a$1 = new Float32Array(4 * i), s$1 = 2 * Math.PI / i;
2376
+ for (let e$2 = 0; e$2 < i; e$2++) {
2377
+ const t$2 = e$2 * s$1;
2378
+ a$1[4 * e$2] = 0, a$1[4 * e$2 + 1] = 0, a$1[4 * e$2 + 2] = Math.cos(t$2) * (R.width / 2), a$1[4 * e$2 + 3] = Math.sin(t$2) * (R.height / 2);
2379
+ }
2380
+ const c$1 = k.createBuffer();
2381
+ k.bindBuffer(k.ARRAY_BUFFER, c$1), k.bufferData(k.ARRAY_BUFFER, a$1, k.STATIC_DRAW);
2382
+ const l$1 = k.getAttribLocation(r$1, "position");
2383
+ k.enableVertexAttribArray(l$1), k.vertexAttribPointer(l$1, 2, k.FLOAT, !1, 0, 0), k.viewport(0, 0, R.width, R.height), k.clearColor(0, 0, 0, 1), k.clear(k.COLOR_BUFFER_BIT), k.drawArrays(k.LINES, 0, 2 * i);
2384
+ const u$1 = new Uint8ClampedArray(R.width * R.height * 4);
2385
+ k.readPixels(0, 0, R.width, R.height, k.RGBA, k.UNSIGNED_BYTE, u$1);
2386
+ return new ImageData(u$1, R.width, R.height);
2387
+ } catch (e$1) {
2388
+ return new ImageData(1, 1);
2389
+ } finally {
2390
+ k && (k.bindBuffer(k.ARRAY_BUFFER, null), k.useProgram(null), k.viewport(0, 0, k.drawingBufferWidth, k.drawingBufferHeight), k.clearColor(0, 0, 0, 0));
2391
+ }
2392
+ }())), R.width, R.height).data.toString()).toString() };
2393
+ } catch (e$1) {
2394
+ return { webgl: "unsupported" };
2395
+ }
2396
+ }
2397
+ }, F = {
2398
+ webrtc: async function() {
2399
+ return new Promise(((e$1) => {
2400
+ try {
2401
+ const t$1 = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
2402
+ if (!t$1) return void e$1({
2403
+ supported: !1,
2404
+ error: "WebRTC not supported"
2405
+ });
2406
+ const n$1 = new t$1({
2407
+ iceCandidatePoolSize: 1,
2408
+ iceServers: []
2409
+ });
2410
+ n$1.createDataChannel("");
2411
+ (async () => {
2412
+ try {
2413
+ const o$1 = await n$1.createOffer({
2414
+ offerToReceiveAudio: !0,
2415
+ offerToReceiveVideo: !0
2416
+ });
2417
+ await n$1.setLocalDescription(o$1);
2418
+ const r$1 = o$1.sdp || "", i = [...new Set((r$1.match(/extmap:\d+ [^\n\r]+/g) || []).map(((e$2) => e$2.replace(/extmap:\d+ /, ""))))].sort(), a$1 = (e$2) => {
2419
+ const t$2 = r$1.match(/* @__PURE__ */ new RegExp(`m=${e$2} [^\\s]+ [^\\s]+ ([^\\n\\r]+)`));
2420
+ return t$2 ? t$2[1].split(" ") : [];
2421
+ }, s$1 = (e$2, t$2) => t$2.map(((t$3) => {
2422
+ const n$2 = new RegExp(`(rtpmap|fmtp|rtcp-fb):${t$3} (.+)`, "g"), o$2 = [...r$1.matchAll(n$2)];
2423
+ if (!o$2.length) return null;
2424
+ const i$1 = {};
2425
+ return o$2.forEach(((t$4) => {
2426
+ const [n$3, o$3, r$2] = t$4, a$2 = r$2.split("/");
2427
+ "rtpmap" === o$3 ? (i$1.mimeType = `${e$2}/${a$2[0]}`, i$1.clockRate = +a$2[1], "audio" === e$2 && (i$1.channels = +a$2[2] || 1)) : "rtcp-fb" === o$3 ? (i$1.feedbackSupport = i$1.feedbackSupport || [], i$1.feedbackSupport.push(r$2)) : "fmtp" === o$3 && (i$1.sdpFmtpLine = r$2);
2428
+ })), i$1;
2429
+ })).filter(Boolean), c$1 = s$1("audio", a$1("audio")), l$1 = s$1("video", a$1("video")), u$1 = {
2430
+ audio: {
2431
+ count: c$1.length,
2432
+ hash: h(O(c$1))
2433
+ },
2434
+ video: {
2435
+ count: l$1.length,
2436
+ hash: h(O(l$1))
2437
+ },
2438
+ extensionsHash: h(O(i))
2439
+ }, d$1 = await new Promise(((e$2) => {
2440
+ const t$2 = setTimeout((() => {
2441
+ n$1.removeEventListener("icecandidate", o$2), n$1.close(), e$2({
2442
+ supported: !0,
2443
+ ...u$1,
2444
+ timeout: !0
2445
+ });
2446
+ }), 3e3), o$2 = (r$2) => {
2447
+ const i$1 = r$2.candidate;
2448
+ i$1 && i$1.candidate && (clearTimeout(t$2), n$1.removeEventListener("icecandidate", o$2), n$1.close(), e$2({
2449
+ supported: !0,
2450
+ ...u$1,
2451
+ candidateType: i$1.type || ""
2452
+ }));
2453
+ };
2454
+ n$1.addEventListener("icecandidate", o$2);
2455
+ }));
2456
+ e$1({
2457
+ details: d$1,
2458
+ hash: h(O(d$1))
2459
+ });
2460
+ } catch (t$2) {
2461
+ n$1.close(), e$1({
2462
+ supported: !0,
2463
+ error: `WebRTC offer failed: ${t$2.message}`
2464
+ });
2465
+ }
2466
+ })();
2467
+ } catch (t$1) {
2468
+ e$1({
2469
+ supported: !1,
2470
+ error: `WebRTC error: ${t$1.message}`
2471
+ });
2472
+ }
2473
+ }));
2474
+ },
2475
+ mathml: async function() {
2476
+ return new Promise(((e$1) => {
2477
+ try {
2478
+ g((async ({ iframe: t$1 }) => {
2479
+ try {
2480
+ if (!function(e$2) {
2481
+ try {
2482
+ const t$2 = e$2.createElement("math");
2483
+ t$2.innerHTML = "<mrow><mi>x</mi></mrow>", t$2.style.position = "absolute", t$2.style.visibility = "hidden", e$2.body.appendChild(t$2);
2484
+ const n$2 = t$2.getBoundingClientRect();
2485
+ return e$2.body.removeChild(t$2), n$2.width > 0 && n$2.height > 0;
2486
+ } catch (e$3) {
2487
+ return !1;
2488
+ }
2489
+ }(t$1)) return void e$1({
2490
+ supported: !1,
2491
+ error: "MathML not supported"
2492
+ });
2493
+ const n$1 = [
2494
+ D("integral", "<msubsup><mo>∫</mo><mi>a</mi><mi>b</mi></msubsup><mfrac><mrow><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mrow><mi>g</mi><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mfrac><mi>dx</mi>"),
2495
+ D("fraction", "<mfrac><mrow><mi>π</mi><mo>×</mo><msup><mi>r</mi><mn>2</mn></msup></mrow><mrow><mn>2</mn><mi>σ</mi></mrow></mfrac>"),
2496
+ D("matrix", "<mo>[</mo><mtable><mtr><mtd><mi>α</mi></mtd><mtd><mi>β</mi></mtd></mtr><mtr><mtd><mi>γ</mi></mtd><mtd><mi>δ</mi></mtd></mtr></mtable><mo>]</mo>"),
2497
+ N(),
2498
+ ...$()
2499
+ ], o$1 = [];
2500
+ let r$1 = "";
2501
+ n$1.forEach(((e$2, n$2) => {
2502
+ const i$1 = function(e$3, t$2) {
2503
+ try {
2504
+ const n$3 = t$2.createElement("math");
2505
+ n$3.innerHTML = e$3.replace(/<\/?math>/g, ""), n$3.style.whiteSpace = "nowrap", n$3.style.position = "absolute", n$3.style.visibility = "hidden", n$3.style.top = "-9999px", t$2.body.appendChild(n$3);
2506
+ const o$2 = n$3.getBoundingClientRect(), r$2 = (t$2.defaultView || window).getComputedStyle(n$3), i$2 = {
2507
+ dimensions: {
2508
+ width: o$2.width,
2509
+ height: o$2.height
2510
+ },
2511
+ fontInfo: {
2512
+ fontFamily: r$2.fontFamily,
2513
+ fontSize: r$2.fontSize,
2514
+ fontWeight: r$2.fontWeight,
2515
+ fontStyle: r$2.fontStyle,
2516
+ lineHeight: r$2.lineHeight,
2517
+ fontVariant: r$2.fontVariant || "normal",
2518
+ fontStretch: r$2.fontStretch || "normal",
2519
+ fontSizeAdjust: r$2.fontSizeAdjust || "none",
2520
+ textRendering: r$2.textRendering || "auto",
2521
+ fontFeatureSettings: r$2.fontFeatureSettings || "normal",
2522
+ fontVariantNumeric: r$2.fontVariantNumeric || "normal",
2523
+ fontKerning: r$2.fontKerning || "auto"
2524
+ }
2525
+ };
2526
+ return t$2.body.removeChild(n$3), i$2;
2527
+ } catch (e$4) {
2528
+ return { error: e$4.message };
2529
+ }
2530
+ }(e$2, t$1);
2531
+ o$1.push({
2532
+ width: i$1.dimensions.width,
2533
+ height: i$1.dimensions.height
2534
+ }), 0 === n$2 && i$1.fontInfo && (r$1 = h(O(i$1.fontInfo)));
2535
+ }));
2536
+ const i = {
2537
+ fontStyleHash: r$1,
2538
+ dimensions: o$1
2539
+ };
2540
+ e$1({
2541
+ details: i,
2542
+ hash: h(O(i))
2543
+ });
2544
+ } catch (t$2) {
2545
+ e$1({
2546
+ supported: !1,
2547
+ error: `MathML error: ${t$2.message}`
2548
+ });
2549
+ }
2550
+ }));
2551
+ } catch (t$1) {
2552
+ e$1({
2553
+ supported: !1,
2554
+ error: `MathML error: ${t$1.message}`
2555
+ });
2556
+ }
2557
+ }));
2558
+ },
2559
+ speech: async function() {
2560
+ return new Promise(((e$1) => {
2561
+ try {
2562
+ if ("undefined" == typeof window || !window.speechSynthesis || "function" != typeof window.speechSynthesis.getVoices) return void e$1({
2563
+ supported: !1,
2564
+ error: "Speech Synthesis API not supported"
2565
+ });
2566
+ let t$1 = !1, n$1 = null;
2567
+ const o$1 = (o$2) => {
2568
+ if (!t$1) {
2569
+ t$1 = !0, n$1 && clearTimeout(n$1);
2570
+ try {
2571
+ const t$2 = o$2.map(((e$2) => {
2572
+ const t$3 = (e$3) => e$3.replace(/\\/g, "\\\\").replace(/,/g, "\\,");
2573
+ return [
2574
+ t$3(e$2.voiceURI || ""),
2575
+ t$3(e$2.name || ""),
2576
+ t$3(e$2.lang || ""),
2577
+ e$2.localService ? "1" : "0",
2578
+ e$2.default ? "1" : "0"
2579
+ ].join(",");
2580
+ }));
2581
+ t$2.sort();
2582
+ const n$2 = {
2583
+ voiceCount: o$2.length,
2584
+ voicesHash: h(O(t$2))
2585
+ };
2586
+ e$1({
2587
+ details: n$2,
2588
+ hash: h(O(n$2))
2589
+ });
2590
+ } catch (t$2) {
2591
+ e$1({
2592
+ supported: !0,
2593
+ error: `Voice processing failed: ${t$2.message}`
2594
+ });
2595
+ }
2596
+ }
2597
+ }, r$1 = window.speechSynthesis.getVoices();
2598
+ if (r$1.length > 0) return void o$1(r$1);
2599
+ n$1 = setTimeout((() => {
2600
+ o$1(window.speechSynthesis.getVoices());
2601
+ }), 800);
2602
+ const i = () => {
2603
+ window.speechSynthesis.removeEventListener("voiceschanged", i);
2604
+ o$1(window.speechSynthesis.getVoices());
2605
+ };
2606
+ window.speechSynthesis.addEventListener("voiceschanged", i);
2607
+ } catch (t$1) {
2608
+ e$1({
2609
+ supported: !1,
2610
+ error: `Speech Synthesis error: ${t$1.message}`
2611
+ });
2612
+ }
2613
+ }));
2614
+ }
2615
+ }, U = {}, j = { timeout: "true" }, W = (e$1, t$1, n$1) => {
2616
+ U[e$1] = t$1;
2617
+ };
2618
+ function G(e$1, t$1) {
2619
+ var n$1;
2620
+ let o$1 = x();
2621
+ if ("unknown" === o$1.name && e$1.system && "object" == typeof e$1.system && !Array.isArray(e$1.system)) {
2622
+ const t$2 = e$1.system.browser;
2623
+ if (t$2 && "object" == typeof t$2 && !Array.isArray(t$2)) {
2624
+ const e$2 = t$2;
2625
+ o$1 = {
2626
+ name: e$2.name || "unknown",
2627
+ version: e$2.version || "unknown"
2628
+ };
2629
+ }
2630
+ }
2631
+ const r$1 = o$1.name.toLowerCase(), i = o$1.version.split(".")[0] || "0", s$1 = parseInt(i, 10), c$1 = [...(null == t$1 ? void 0 : t$1.exclude) || []], l$1 = (null == t$1 ? void 0 : t$1.stabilize) || [], u$1 = (null == t$1 ? void 0 : t$1.include) || [];
2632
+ for (const e$2 of l$1) {
2633
+ const t$2 = a[e$2];
2634
+ if (t$2) for (const e$3 of t$2) {
2635
+ const t$3 = !("browsers" in e$3), o$2 = !t$3 && (null === (n$1 = e$3.browsers) || void 0 === n$1 ? void 0 : n$1.some(((e$4) => {
2636
+ const t$4 = e$4.match(/(.+?)(>=)(\d+)/);
2637
+ if (t$4) {
2638
+ const [, e$5, , n$2] = t$4;
2639
+ return r$1 === e$5 && s$1 >= parseInt(n$2, 10);
2640
+ }
2641
+ return r$1 === e$4;
2642
+ })));
2643
+ (t$3 || o$2) && c$1.push(...e$3.exclude);
2644
+ }
2645
+ }
2646
+ return function e$2(t$2, n$2 = "") {
2647
+ const o$2 = {};
2648
+ for (const [r$2, i$1] of Object.entries(t$2)) {
2649
+ const t$3 = n$2 ? `${n$2}.${r$2}` : r$2;
2650
+ if ("object" != typeof i$1 || Array.isArray(i$1) || null === i$1) {
2651
+ const e$3 = c$1.some(((e$4) => t$3.startsWith(e$4))), n$3 = u$1.some(((e$4) => t$3.startsWith(e$4)));
2652
+ e$3 && !n$3 || (o$2[r$2] = i$1);
2653
+ } else {
2654
+ const n$3 = e$2(i$1, t$3);
2655
+ Object.keys(n$3).length > 0 && (o$2[r$2] = n$3);
2656
+ }
2657
+ }
2658
+ return o$2;
2659
+ }(e$1);
2660
+ }
2661
+ const z = "visitor_id";
2662
+ function J(e$1) {
2663
+ return e$1.storage_property_name ? e$1.storage_property_name : e$1.property_name_factory(z);
2664
+ }
2665
+ const q = `${t}_${z}`;
2666
+ function K(e$1, t$1) {
2667
+ try {
2668
+ localStorage.setItem(J(t$1), e$1);
2669
+ } catch (e$2) {}
2670
+ }
2671
+ const Y = "cache";
2672
+ function X(e$1) {
2673
+ try {
2674
+ const t$1 = localStorage.getItem(e$1.property_name_factory(Y));
2675
+ return JSON.parse(t$1) || {};
2676
+ } catch (e$2) {}
2677
+ return {};
2678
+ }
2679
+ function Z(t$1) {
2680
+ return t$1.cache_lifetime_in_ms > e ? Date.now() + e : Date.now() + t$1.cache_lifetime_in_ms;
2681
+ }
2682
+ let Q = null, ee = null;
2683
+ const te = (e$1, t$1) => {
2684
+ if (e$1.cache_api_call) {
2685
+ if (ee) return Promise.resolve(ee);
2686
+ const t$2 = function(e$2) {
2687
+ const t$3 = X(e$2);
2688
+ if (t$3 && t$3.apiResponse && t$3.apiResponseExpiry && Date.now() <= t$3.apiResponseExpiry) return t$3.apiResponse;
2689
+ }(e$1);
2690
+ if (t$2) return Promise.resolve(t$2);
2691
+ if (Q) return Q;
2692
+ }
2693
+ const o$1 = `${e$1.api_endpoint || n}/thumbmark`, r$1 = function(e$2) {
2694
+ try {
2695
+ const t$2 = J(e$2);
2696
+ let n$1 = localStorage.getItem(t$2);
2697
+ return n$1 || t$2 === q || (n$1 = localStorage.getItem(q), n$1 && K(n$1, e$2)), n$1;
2698
+ } catch (e$3) {
2699
+ return null;
2700
+ }
2701
+ }(e$1), i = {
2702
+ components: t$1,
2703
+ options: e$1,
2704
+ clientHash: h(O(t$1)),
2705
+ version: "1.6.3"
2706
+ };
2707
+ r$1 && (i.visitorId = r$1);
2708
+ const a$1 = fetch(o$1, {
2709
+ method: "POST",
2710
+ headers: {
2711
+ "x-api-key": e$1.api_key,
2712
+ Authorization: "custom-authorized",
2713
+ "Content-Type": "application/json"
2714
+ },
2715
+ body: JSON.stringify(i)
2716
+ }).then(((e$2) => {
2717
+ if (!e$2.ok) {
2718
+ if (403 === e$2.status) throw new Error("INVALID_API_KEY");
2719
+ throw new Error(`HTTP error! status: ${e$2.status}`);
2720
+ }
2721
+ return e$2.json();
2722
+ })).then(((t$2) => (t$2.visitorId && t$2.visitorId !== r$1 && K(t$2.visitorId, e$1), ee = t$2, function(e$2, t$3) {
2723
+ if (!e$2.cache_api_call || !e$2.cache_lifetime_in_ms) return;
2724
+ (function(e$3, t$4) {
2725
+ const n$1 = {
2726
+ ...X(e$3),
2727
+ ...t$4
2728
+ };
2729
+ try {
2730
+ localStorage.setItem(e$3.property_name_factory(Y), JSON.stringify(n$1));
2731
+ } catch (e$4) {}
2732
+ })(e$2, {
2733
+ apiResponseExpiry: Z(e$2),
2734
+ apiResponse: t$3
2735
+ });
2736
+ }(e$1, t$2), Q = null, t$2))).catch(((e$2) => {
2737
+ if (console.error("Error fetching pro data", e$2), Q = null, "INVALID_API_KEY" === e$2.message) throw e$2;
2738
+ return null;
2739
+ })), s$1 = e$1.timeout || 5e3, c$1 = new Promise(((t$2) => {
2740
+ setTimeout((() => {
2741
+ const n$1 = X(e$1);
2742
+ n$1 && n$1.apiResponse ? t$2(n$1.apiResponse) : t$2({
2743
+ info: { timed_out: !0 },
2744
+ ...r$1 && { visitorId: r$1 }
2745
+ });
2746
+ }), s$1);
2747
+ }));
2748
+ return Q = Promise.race([a$1, c$1]), Q;
2749
+ };
2750
+ async function ne(e$1) {
2751
+ var t$1;
2752
+ if ("undefined" == typeof document || "undefined" == typeof window) return {
2753
+ thumbmark: "",
2754
+ components: {},
2755
+ info: {},
2756
+ version: "1.6.3",
2757
+ error: "Browser environment required"
2758
+ };
2759
+ const r$1 = {
2760
+ ...o,
2761
+ ...e$1
2762
+ }, i = r$1.logging && !sessionStorage.getItem("_tmjs_l") && Math.random() < 1e-4, { elapsed: s$1, resolvedComponents: c$1 } = await oe({
2763
+ ...V,
2764
+ ...U
2765
+ }, r$1);
2766
+ let l$1 = {}, u$1 = {};
2767
+ if (i || r$1.experimental) {
2768
+ const { elapsed: e$2, resolvedComponents: t$2 } = await oe(F, r$1);
2769
+ l$1 = t$2, u$1 = e$2;
2770
+ }
2771
+ const d$1 = r$1.api_key ? te(r$1, c$1) : null;
2772
+ let m$1 = null;
2773
+ if (d$1) try {
2774
+ m$1 = await d$1;
2775
+ } catch (e$2) {
2776
+ if (e$2 instanceof Error && "INVALID_API_KEY" === e$2.message) return {
2777
+ error: "Invalid API key or quota exceeded",
2778
+ components: {},
2779
+ info: {},
2780
+ version: "1.6.3",
2781
+ thumbmark: ""
2782
+ };
2783
+ throw e$2;
2784
+ }
2785
+ const f$1 = {
2786
+ ...s$1,
2787
+ ...u$1
2788
+ }, p$1 = r$1.performance ? { elapsed: f$1 } : {}, g$1 = G((null == m$1 ? void 0 : m$1.components) || {}, r$1), w$1 = {
2789
+ ...c$1,
2790
+ ...g$1
2791
+ }, v$1 = (null == m$1 ? void 0 : m$1.info) || { uniqueness: { score: "api only" } }, y$1 = null !== (t$1 = null == m$1 ? void 0 : m$1.thumbmark) && void 0 !== t$1 ? t$1 : h(O(w$1));
2792
+ i && async function(e$2, t$2, o$1, r$2 = {}) {
2793
+ var i$1;
2794
+ const a$1 = `${n}/log`, s$2 = {
2795
+ thumbmark: e$2,
2796
+ components: t$2,
2797
+ experimental: r$2,
2798
+ version: "1.6.3",
2799
+ options: o$1,
2800
+ path: null === (i$1 = null === window || void 0 === window ? void 0 : window.location) || void 0 === i$1 ? void 0 : i$1.pathname
2801
+ };
2802
+ sessionStorage.setItem("_tmjs_l", "1");
2803
+ try {
2804
+ await fetch(a$1, {
2805
+ method: "POST",
2806
+ headers: { "Content-Type": "application/json" },
2807
+ body: JSON.stringify(s$2)
2808
+ });
2809
+ } catch (e$3) {}
2810
+ }(y$1, w$1, r$1, l$1).catch((() => {}));
2811
+ return {
2812
+ ...(null == m$1 ? void 0 : m$1.visitorId) && { visitorId: m$1.visitorId },
2813
+ thumbmark: y$1,
2814
+ components: w$1,
2815
+ info: v$1,
2816
+ version: "1.6.3",
2817
+ ...p$1,
2818
+ ...Object.keys(l$1).length > 0 && r$1.experimental && { experimental: l$1 },
2819
+ ...(null == m$1 ? void 0 : m$1.requestId) && { requestId: m$1.requestId }
2820
+ };
2821
+ }
2822
+ async function oe(e$1, t$1) {
2823
+ const n$1 = {
2824
+ ...o,
2825
+ ...t$1
2826
+ }, r$1 = Object.entries(e$1).filter((([e$2]) => {
2827
+ var t$2;
2828
+ return !(null === (t$2 = null == n$1 ? void 0 : n$1.exclude) || void 0 === t$2 ? void 0 : t$2.includes(e$2));
2829
+ })).filter((([e$2]) => {
2830
+ var t$2, o$1, r$2, i$1;
2831
+ return (null === (t$2 = null == n$1 ? void 0 : n$1.include) || void 0 === t$2 ? void 0 : t$2.some(((e$3) => e$3.includes(".")))) ? null === (o$1 = null == n$1 ? void 0 : n$1.include) || void 0 === o$1 ? void 0 : o$1.some(((t$3) => t$3.startsWith(e$2))) : 0 === (null === (r$2 = null == n$1 ? void 0 : n$1.include) || void 0 === r$2 ? void 0 : r$2.length) || (null === (i$1 = null == n$1 ? void 0 : n$1.include) || void 0 === i$1 ? void 0 : i$1.includes(e$2));
2832
+ })), i = r$1.map((([e$2]) => e$2)), s$1 = await function(e$2, t$2, n$2) {
2833
+ return Promise.all(e$2.map(((e$3) => {
2834
+ const o$1 = performance.now();
2835
+ return Promise.race([e$3.then(((e$4) => ({
2836
+ value: e$4,
2837
+ elapsed: performance.now() - o$1
2838
+ }))), (r$2 = t$2, i$1 = n$2, new Promise(((e$4) => {
2839
+ setTimeout((() => e$4(i$1)), r$2);
2840
+ }))).then(((e$4) => ({
2841
+ value: e$4,
2842
+ elapsed: performance.now() - o$1
2843
+ })))]);
2844
+ var r$2, i$1;
2845
+ })));
2846
+ }(r$1.map((([e$2, n$2]) => n$2(t$1))), (null == n$1 ? void 0 : n$1.timeout) || 5e3, j), c$1 = {}, l$1 = {};
2847
+ s$1.forEach(((e$2, t$2) => {
2848
+ var n$2;
2849
+ null != e$2.value && (l$1[i[t$2]] = e$2.value, c$1[i[t$2]] = null !== (n$2 = e$2.elapsed) && void 0 !== n$2 ? n$2 : 0);
2850
+ }));
2851
+ return {
2852
+ elapsed: c$1,
2853
+ resolvedComponents: G(l$1, n$1)
2854
+ };
2855
+ }
2856
+ var se = class {
2857
+ constructor(e$1) {
2858
+ this.options = {
2859
+ ...o,
2860
+ ...e$1
2861
+ };
2862
+ }
2863
+ async get(e$1) {
2864
+ return ne({
2865
+ ...this.options,
2866
+ ...e$1
2867
+ });
2868
+ }
2869
+ getVersion() {
2870
+ return "1.6.3";
2871
+ }
2872
+ includeComponent(e$1, t$1) {
2873
+ W(e$1, t$1);
2874
+ }
2875
+ };
2876
+
2877
+ //#endregion
2878
+ //#region ../infra/src/providers/browser/thumbmarkAdapter.ts
2879
+ /**
2880
+ * Adapter for @thumbmarkjs/thumbmarkjs. Single point of dependency so bundlers
2881
+ * resolve it from infra's node_modules when building apps that depend on core → infra.
2882
+ */
2883
+ async function getThumbmarkId() {
2884
+ return (await new se().get()).thumbmark;
2885
+ }
2886
+
2887
+ //#endregion
2888
+ //#region ../infra/src/providers/browser/FingerprintProvider.ts
2889
+ var FingerprintProvider = class {
2890
+ constructor(ipLookup) {
2891
+ this.ipLookup = ipLookup;
2892
+ }
2893
+ async getFingerprint(disableIpify = false) {
2894
+ const visitorId = await getThumbmarkId();
2895
+ const [deviceInfo, ip] = await Promise.all([getDeviceFingerprintInfo(), disableIpify ? Promise.resolve("") : this.ipLookup.getIp()]);
2896
+ return {
2897
+ visitorId,
2898
+ ip,
2899
+ deviceInfo
2900
+ };
2901
+ }
2902
+ };
2903
+
2904
+ //#endregion
2905
+ //#region ../infra/src/providers/browser/IpifyProvider.ts
2906
+ var IpifyProvider = class {
2907
+ async getIp() {
2908
+ try {
2909
+ if (typeof fetch === "undefined") return "";
2910
+ let timeoutId = 0;
2911
+ const controller = new AbortController();
2912
+ if (AbortSignal.timeout) {
2913
+ const signal = AbortSignal.timeout(3e3);
2914
+ return (await (await fetch("https://api.ipify.org?format=json", { signal })).json()).ip;
2915
+ }
2916
+ const timeoutPromise = new Promise((_$1, reject) => {
2917
+ timeoutId = setTimeout(() => {
2918
+ controller.abort();
2919
+ reject(/* @__PURE__ */ new Error("Request timeout"));
2920
+ }, 3e3);
2921
+ });
2922
+ const fetchPromise = fetch("https://api.ipify.org?format=json", { signal: controller.signal }).then((res) => res.json()).then((data) => data.ip);
2923
+ const result = await Promise.race([fetchPromise, timeoutPromise]);
2924
+ clearTimeout(timeoutId);
2925
+ return result;
2926
+ } catch {
2927
+ return "";
2928
+ }
2929
+ }
2930
+ };
2931
+
2932
+ //#endregion
2933
+ //#region src/internal/featureConfig/featureConfigService.ts
2934
+ let cachedFeatures$1 = null;
2935
+ /**
2936
+ * Checks if a feature is enabled in the feature config.
2937
+ */
2938
+ function isFeatureEnabled(feature, features) {
2939
+ return features?.find((f$1) => f$1.feature === feature)?.enabled ?? false;
2940
+ }
2941
+ /**
2942
+ * Fetches feature configuration from the backend.
2943
+ * Results are cached for the session lifetime.
2944
+ */
2945
+ async function fetchFeatureConfig(signal) {
2946
+ if (cachedFeatures$1) return cachedFeatures$1;
2947
+ const response = await api.get(endpoints.featureConfig, { signal });
2948
+ if (!response.ok) throw new Error(`Failed to fetch feature config: ${response.status} ${response.statusText}`);
2949
+ cachedFeatures$1 = response.data;
2950
+ return cachedFeatures$1;
2951
+ }
2952
+ /**
2953
+ * Resets the cached feature config (useful for testing).
2954
+ */
2955
+ function resetFeatureConfigCache() {
2956
+ cachedFeatures$1 = null;
2957
+ }
2958
+
2959
+ //#endregion
2960
+ //#region src/internal/fingerprint/fingerprintService.ts
2961
+ const SDK_VERSION = "2.0.0";
2962
+ function formatOsVersion(os) {
2963
+ return `${os.name || "Unknown"} ${os.version || ""}`.trim();
2964
+ }
2965
+ function formatBrowser(browser) {
2966
+ if (!browser.name || !browser.version) return "Unknown";
2967
+ return `${browser.name} ${browser.version}`;
2968
+ }
2969
+ async function submitDeviceFingerprint(options = {}, dependencies) {
2970
+ const { disableIpify = false, hostingApp, signal } = options;
2971
+ const fingerprint = await dependencies.fingerprintProvider.getFingerprint(disableIpify);
2972
+ const hasLiedBrowser = isBrowserSimulation(dependencies.browserEnv);
2973
+ const payload = {
2974
+ hash: fingerprint.visitorId || "",
2975
+ ip: fingerprint.ip || "",
2976
+ deviceType: "WEBAPP",
2977
+ data: JSON.stringify(fingerprint),
2978
+ osVersion: formatOsVersion(fingerprint.deviceInfo.os),
2979
+ deviceModel: fingerprint.deviceInfo.device.model || "",
2980
+ browser: formatBrowser(fingerprint.deviceInfo.browser),
2981
+ hasLiedBrowser,
2982
+ sdkVersion: SDK_VERSION,
2983
+ hostingApp: hostingApp ?? "Web SDK"
2984
+ };
2985
+ const response = await api.post(endpoints.deviceFingerprint, payload, { signal });
2986
+ if (!response.ok) throw new Error(`Failed to submit fingerprint: ${response.status} ${response.statusText}`);
2987
+ return response.data;
2988
+ }
2989
+
2990
+ //#endregion
2991
+ //#region src/internal/session/sessionInitializer.ts
2992
+ let sessionInitialized = false;
2993
+ let cachedFeatures = null;
2994
+ let cachedDisableIpify = false;
2995
+ let cachedFingerprintSuccess = false;
2996
+ let cachedFingerprintResult;
2997
+ let sessionInitPromise = null;
2998
+ /**
2999
+ * Initializes session-level services after the token is set.
3000
+ * This should be called once after createSession() or setToken().
3001
+ *
3002
+ * Performs:
3003
+ * 1. Fetches feature configuration from backend
3004
+ * 2. Submits device fingerprint
3005
+ *
3006
+ * Results are cached for the session lifetime.
3007
+ *
3008
+ * @param options - Optional configuration
3009
+ * @returns Session initialization result with feature config
3010
+ *
3011
+ * @example
3012
+ * ```ts
3013
+ * // After creating a session
3014
+ * const session = await createSession('api-key', options);
3015
+ * setup({ apiURL, token: session.token });
3016
+ * const { features } = await initializeSession();
3017
+ *
3018
+ * // Check feature flags
3019
+ * if (isFeatureEnabled('DISABLE_IPIFY', features.features)) {
3020
+ * // Handle disabled ipify
3021
+ * }
3022
+ * ```
3023
+ */
3024
+ async function initializeSession(options = {}) {
3025
+ const { hostingApp, signal } = options;
3026
+ if (sessionInitialized && cachedFeatures) return {
3027
+ features: cachedFeatures,
3028
+ disableIpify: cachedDisableIpify,
3029
+ fingerprintSuccess: cachedFingerprintSuccess,
3030
+ fingerprintResult: cachedFingerprintResult
3031
+ };
3032
+ if (sessionInitPromise) return sessionInitPromise;
3033
+ sessionInitPromise = (async () => {
3034
+ let features;
3035
+ let disableIpify = false;
3036
+ try {
3037
+ features = await fetchFeatureConfig(signal);
3038
+ disableIpify = isFeatureEnabled("DISABLE_IPIFY", features.features);
3039
+ } catch {
3040
+ features = { sessionIdentifier: "" };
3041
+ }
3042
+ let fingerprintSuccess = false;
3043
+ let fingerprintResult;
3044
+ try {
3045
+ const fingerprintProvider = new FingerprintProvider(new IpifyProvider());
3046
+ const browserEnv = new BrowserEnvironmentProvider();
3047
+ fingerprintResult = await submitDeviceFingerprint({
3048
+ disableIpify,
3049
+ hostingApp,
3050
+ signal
3051
+ }, {
3052
+ fingerprintProvider,
3053
+ browserEnv
3054
+ });
3055
+ fingerprintSuccess = true;
3056
+ } catch (error) {
3057
+ console.warn("Failed to submit device fingerprint:", error);
3058
+ }
3059
+ try {
3060
+ const browserInfo = new BrowserInfoProvider().getBrowserInfo();
3061
+ addEvent({
3062
+ code: "browser",
3063
+ payload: {
3064
+ userAgent: browserInfo.userAgent,
3065
+ isWebRtcSupported: browserInfo.isWebRtcSupported,
3066
+ browser: browserInfo.browser,
3067
+ os: browserInfo.os,
3068
+ device: browserInfo.device,
3069
+ engine: browserInfo.engine,
3070
+ cpu: browserInfo.cpu
3071
+ }
3072
+ });
3073
+ } catch (error) {
3074
+ console.warn("Failed to send browser info event:", error);
3075
+ }
3076
+ sessionInitialized = true;
3077
+ cachedFeatures = features;
3078
+ cachedDisableIpify = disableIpify;
3079
+ cachedFingerprintSuccess = fingerprintSuccess;
3080
+ cachedFingerprintResult = fingerprintResult;
3081
+ return {
3082
+ features,
3083
+ disableIpify,
3084
+ fingerprintSuccess,
3085
+ fingerprintResult
3086
+ };
3087
+ })().finally(() => {
3088
+ sessionInitPromise = null;
3089
+ });
3090
+ return sessionInitPromise;
3091
+ }
3092
+ /**
3093
+ * Gets the cached feature configuration.
3094
+ * Returns undefined if session hasn't been initialized.
3095
+ */
3096
+ function getSessionFeatures() {
3097
+ return cachedFeatures ?? void 0;
3098
+ }
3099
+ /**
3100
+ * Gets the cached disableIpify flag.
3101
+ * Returns false if session hasn't been initialized.
3102
+ */
3103
+ function getDisableIpify() {
3104
+ return cachedDisableIpify;
3105
+ }
3106
+ function getSessionFingerprintResult() {
3107
+ return cachedFingerprintResult;
3108
+ }
3109
+ /**
3110
+ * Checks if the session has been initialized.
3111
+ */
3112
+ function isSessionInitialized() {
3113
+ return sessionInitialized;
3114
+ }
3115
+ /**
3116
+ * Resets session initialization state.
3117
+ * Useful for testing or when starting a new session.
3118
+ */
3119
+ function resetSessionInit() {
3120
+ sessionInitialized = false;
3121
+ cachedFeatures = null;
3122
+ cachedDisableIpify = false;
3123
+ cachedFingerprintSuccess = false;
3124
+ cachedFingerprintResult = void 0;
3125
+ sessionInitPromise = null;
3126
+ resetFeatureConfigCache();
3127
+ }
3128
+
3129
+ //#endregion
3130
+ export { isSessionInitialized as a, FingerprintProvider as c, initializeSession as i, getDeviceFingerprintInfo as l, getSessionFeatures as n, resetSessionInit as o, getSessionFingerprintResult as r, IpifyProvider as s, getDisableIpify as t, createSession as u };