@spotify-confidence/session-recording 0.18.6 → 0.18.8

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.
@@ -0,0 +1,2063 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
+ key = keys[i];
12
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
13
+ get: ((k) => from[k]).bind(null, key),
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
20
+ value: mod,
21
+ enumerable: true
22
+ }) : target, mod));
23
+ //#endregion
24
+ //#region ../csr-common/src/uploader/client-context.ts
25
+ var import_es5 = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMin(((exports, module) => {
26
+ (function(e, t) {
27
+ "object" == typeof exports && "object" == typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define([], t) : "object" == typeof exports ? exports.bowser = t() : e.bowser = t();
28
+ })(exports, (function() {
29
+ return function(e) {
30
+ var t = {};
31
+ function r(i) {
32
+ if (t[i]) return t[i].exports;
33
+ var n = t[i] = {
34
+ i,
35
+ l: !1,
36
+ exports: {}
37
+ };
38
+ return e[i].call(n.exports, n, n.exports, r), n.l = !0, n.exports;
39
+ }
40
+ return r.m = e, r.c = t, r.d = function(e, t, i) {
41
+ r.o(e, t) || Object.defineProperty(e, t, {
42
+ enumerable: !0,
43
+ get: i
44
+ });
45
+ }, r.r = function(e) {
46
+ "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }), Object.defineProperty(e, "__esModule", { value: !0 });
47
+ }, r.t = function(e, t) {
48
+ if (1 & t && (e = r(e)), 8 & t) return e;
49
+ if (4 & t && "object" == typeof e && e && e.__esModule) return e;
50
+ var i = Object.create(null);
51
+ if (r.r(i), Object.defineProperty(i, "default", {
52
+ enumerable: !0,
53
+ value: e
54
+ }), 2 & t && "string" != typeof e) for (var n in e) r.d(i, n, function(t) {
55
+ return e[t];
56
+ }.bind(null, n));
57
+ return i;
58
+ }, r.n = function(e) {
59
+ var t = e && e.__esModule ? function() {
60
+ return e.default;
61
+ } : function() {
62
+ return e;
63
+ };
64
+ return r.d(t, "a", t), t;
65
+ }, r.o = function(e, t) {
66
+ return Object.prototype.hasOwnProperty.call(e, t);
67
+ }, r.p = "", r(r.s = 90);
68
+ }({
69
+ 17: function(e, t, r) {
70
+ "use strict";
71
+ t.__esModule = !0, t.default = void 0;
72
+ var i = r(18);
73
+ t.default = function() {
74
+ function e() {}
75
+ return e.getFirstMatch = function(e, t) {
76
+ var r = t.match(e);
77
+ return r && r.length > 0 && r[1] || "";
78
+ }, e.getSecondMatch = function(e, t) {
79
+ var r = t.match(e);
80
+ return r && r.length > 1 && r[2] || "";
81
+ }, e.matchAndReturnConst = function(e, t, r) {
82
+ if (e.test(t)) return r;
83
+ }, e.getWindowsVersionName = function(e) {
84
+ switch (e) {
85
+ case "NT": return "NT";
86
+ case "XP": return "XP";
87
+ case "NT 5.0": return "2000";
88
+ case "NT 5.1": return "XP";
89
+ case "NT 5.2": return "2003";
90
+ case "NT 6.0": return "Vista";
91
+ case "NT 6.1": return "7";
92
+ case "NT 6.2": return "8";
93
+ case "NT 6.3": return "8.1";
94
+ case "NT 10.0": return "10";
95
+ default: return;
96
+ }
97
+ }, e.getMacOSVersionName = function(e) {
98
+ var t = e.split(".").splice(0, 2).map((function(e) {
99
+ return parseInt(e, 10) || 0;
100
+ }));
101
+ t.push(0);
102
+ var r = t[0], i = t[1];
103
+ if (10 === r) switch (i) {
104
+ case 5: return "Leopard";
105
+ case 6: return "Snow Leopard";
106
+ case 7: return "Lion";
107
+ case 8: return "Mountain Lion";
108
+ case 9: return "Mavericks";
109
+ case 10: return "Yosemite";
110
+ case 11: return "El Capitan";
111
+ case 12: return "Sierra";
112
+ case 13: return "High Sierra";
113
+ case 14: return "Mojave";
114
+ case 15: return "Catalina";
115
+ default: return;
116
+ }
117
+ switch (r) {
118
+ case 11: return "Big Sur";
119
+ case 12: return "Monterey";
120
+ case 13: return "Ventura";
121
+ case 14: return "Sonoma";
122
+ case 15: return "Sequoia";
123
+ default: return;
124
+ }
125
+ }, e.getAndroidVersionName = function(e) {
126
+ var t = e.split(".").splice(0, 2).map((function(e) {
127
+ return parseInt(e, 10) || 0;
128
+ }));
129
+ if (t.push(0), !(1 === t[0] && t[1] < 5)) return 1 === t[0] && t[1] < 6 ? "Cupcake" : 1 === t[0] && t[1] >= 6 ? "Donut" : 2 === t[0] && t[1] < 2 ? "Eclair" : 2 === t[0] && 2 === t[1] ? "Froyo" : 2 === t[0] && t[1] > 2 ? "Gingerbread" : 3 === t[0] ? "Honeycomb" : 4 === t[0] && t[1] < 1 ? "Ice Cream Sandwich" : 4 === t[0] && t[1] < 4 ? "Jelly Bean" : 4 === t[0] && t[1] >= 4 ? "KitKat" : 5 === t[0] ? "Lollipop" : 6 === t[0] ? "Marshmallow" : 7 === t[0] ? "Nougat" : 8 === t[0] ? "Oreo" : 9 === t[0] ? "Pie" : void 0;
130
+ }, e.getVersionPrecision = function(e) {
131
+ return e.split(".").length;
132
+ }, e.compareVersions = function(t, r, i) {
133
+ void 0 === i && (i = !1);
134
+ var n = e.getVersionPrecision(t), a = e.getVersionPrecision(r), o = Math.max(n, a), s = 0, u = e.map([t, r], (function(t) {
135
+ var r = o - e.getVersionPrecision(t), i = t + new Array(r + 1).join(".0");
136
+ return e.map(i.split("."), (function(e) {
137
+ return new Array(20 - e.length).join("0") + e;
138
+ })).reverse();
139
+ }));
140
+ for (i && (s = o - Math.min(n, a)), o -= 1; o >= s;) {
141
+ if (u[0][o] > u[1][o]) return 1;
142
+ if (u[0][o] === u[1][o]) {
143
+ if (o === s) return 0;
144
+ o -= 1;
145
+ } else if (u[0][o] < u[1][o]) return -1;
146
+ }
147
+ }, e.map = function(e, t) {
148
+ var r, i = [];
149
+ if (Array.prototype.map) return Array.prototype.map.call(e, t);
150
+ for (r = 0; r < e.length; r += 1) i.push(t(e[r]));
151
+ return i;
152
+ }, e.find = function(e, t) {
153
+ var r, i;
154
+ if (Array.prototype.find) return Array.prototype.find.call(e, t);
155
+ for (r = 0, i = e.length; r < i; r += 1) {
156
+ var n = e[r];
157
+ if (t(n, r)) return n;
158
+ }
159
+ }, e.assign = function(e) {
160
+ for (var t, r, i = e, n = arguments.length, a = new Array(n > 1 ? n - 1 : 0), o = 1; o < n; o++) a[o - 1] = arguments[o];
161
+ if (Object.assign) return Object.assign.apply(Object, [e].concat(a));
162
+ var s = function() {
163
+ var e = a[t];
164
+ "object" == typeof e && null !== e && Object.keys(e).forEach((function(t) {
165
+ i[t] = e[t];
166
+ }));
167
+ };
168
+ for (t = 0, r = a.length; t < r; t += 1) s();
169
+ return e;
170
+ }, e.getBrowserAlias = function(e) {
171
+ return i.BROWSER_ALIASES_MAP[e];
172
+ }, e.getBrowserTypeByAlias = function(e) {
173
+ return i.BROWSER_MAP[e] || "";
174
+ }, e;
175
+ }(), e.exports = t.default;
176
+ },
177
+ 18: function(e, t, r) {
178
+ "use strict";
179
+ t.__esModule = !0, t.ENGINE_MAP = t.OS_MAP = t.PLATFORMS_MAP = t.BROWSER_MAP = t.BROWSER_ALIASES_MAP = void 0;
180
+ t.BROWSER_ALIASES_MAP = {
181
+ AmazonBot: "amazonbot",
182
+ "Amazon Silk": "amazon_silk",
183
+ "Android Browser": "android",
184
+ BaiduSpider: "baiduspider",
185
+ Bada: "bada",
186
+ BingCrawler: "bingcrawler",
187
+ Brave: "brave",
188
+ BlackBerry: "blackberry",
189
+ "ChatGPT-User": "chatgpt_user",
190
+ Chrome: "chrome",
191
+ ClaudeBot: "claudebot",
192
+ Chromium: "chromium",
193
+ Diffbot: "diffbot",
194
+ DuckDuckBot: "duckduckbot",
195
+ DuckDuckGo: "duckduckgo",
196
+ Electron: "electron",
197
+ Epiphany: "epiphany",
198
+ FacebookExternalHit: "facebookexternalhit",
199
+ Firefox: "firefox",
200
+ Focus: "focus",
201
+ Generic: "generic",
202
+ "Google Search": "google_search",
203
+ Googlebot: "googlebot",
204
+ GPTBot: "gptbot",
205
+ "Internet Explorer": "ie",
206
+ InternetArchiveCrawler: "internetarchivecrawler",
207
+ "K-Meleon": "k_meleon",
208
+ LibreWolf: "librewolf",
209
+ Linespider: "linespider",
210
+ Maxthon: "maxthon",
211
+ "Meta-ExternalAds": "meta_externalads",
212
+ "Meta-ExternalAgent": "meta_externalagent",
213
+ "Meta-ExternalFetcher": "meta_externalfetcher",
214
+ "Meta-WebIndexer": "meta_webindexer",
215
+ "Microsoft Edge": "edge",
216
+ "MZ Browser": "mz",
217
+ "NAVER Whale Browser": "naver",
218
+ "OAI-SearchBot": "oai_searchbot",
219
+ Omgilibot: "omgilibot",
220
+ Opera: "opera",
221
+ "Opera Coast": "opera_coast",
222
+ "Pale Moon": "pale_moon",
223
+ PerplexityBot: "perplexitybot",
224
+ "Perplexity-User": "perplexity_user",
225
+ PhantomJS: "phantomjs",
226
+ PingdomBot: "pingdombot",
227
+ Puffin: "puffin",
228
+ QQ: "qq",
229
+ QQLite: "qqlite",
230
+ QupZilla: "qupzilla",
231
+ Roku: "roku",
232
+ Safari: "safari",
233
+ Sailfish: "sailfish",
234
+ "Samsung Internet for Android": "samsung_internet",
235
+ SlackBot: "slackbot",
236
+ SeaMonkey: "seamonkey",
237
+ Sleipnir: "sleipnir",
238
+ "Sogou Browser": "sogou",
239
+ Swing: "swing",
240
+ Tizen: "tizen",
241
+ "UC Browser": "uc",
242
+ Vivaldi: "vivaldi",
243
+ "WebOS Browser": "webos",
244
+ WeChat: "wechat",
245
+ YahooSlurp: "yahooslurp",
246
+ "Yandex Browser": "yandex",
247
+ YandexBot: "yandexbot",
248
+ YouBot: "youbot"
249
+ };
250
+ t.BROWSER_MAP = {
251
+ amazonbot: "AmazonBot",
252
+ amazon_silk: "Amazon Silk",
253
+ android: "Android Browser",
254
+ baiduspider: "BaiduSpider",
255
+ bada: "Bada",
256
+ bingcrawler: "BingCrawler",
257
+ blackberry: "BlackBerry",
258
+ brave: "Brave",
259
+ chatgpt_user: "ChatGPT-User",
260
+ chrome: "Chrome",
261
+ claudebot: "ClaudeBot",
262
+ chromium: "Chromium",
263
+ diffbot: "Diffbot",
264
+ duckduckbot: "DuckDuckBot",
265
+ duckduckgo: "DuckDuckGo",
266
+ edge: "Microsoft Edge",
267
+ electron: "Electron",
268
+ epiphany: "Epiphany",
269
+ facebookexternalhit: "FacebookExternalHit",
270
+ firefox: "Firefox",
271
+ focus: "Focus",
272
+ generic: "Generic",
273
+ google_search: "Google Search",
274
+ googlebot: "Googlebot",
275
+ gptbot: "GPTBot",
276
+ ie: "Internet Explorer",
277
+ internetarchivecrawler: "InternetArchiveCrawler",
278
+ k_meleon: "K-Meleon",
279
+ librewolf: "LibreWolf",
280
+ linespider: "Linespider",
281
+ maxthon: "Maxthon",
282
+ meta_externalads: "Meta-ExternalAds",
283
+ meta_externalagent: "Meta-ExternalAgent",
284
+ meta_externalfetcher: "Meta-ExternalFetcher",
285
+ meta_webindexer: "Meta-WebIndexer",
286
+ mz: "MZ Browser",
287
+ naver: "NAVER Whale Browser",
288
+ oai_searchbot: "OAI-SearchBot",
289
+ omgilibot: "Omgilibot",
290
+ opera: "Opera",
291
+ opera_coast: "Opera Coast",
292
+ pale_moon: "Pale Moon",
293
+ perplexitybot: "PerplexityBot",
294
+ perplexity_user: "Perplexity-User",
295
+ phantomjs: "PhantomJS",
296
+ pingdombot: "PingdomBot",
297
+ puffin: "Puffin",
298
+ qq: "QQ Browser",
299
+ qqlite: "QQ Browser Lite",
300
+ qupzilla: "QupZilla",
301
+ roku: "Roku",
302
+ safari: "Safari",
303
+ sailfish: "Sailfish",
304
+ samsung_internet: "Samsung Internet for Android",
305
+ seamonkey: "SeaMonkey",
306
+ slackbot: "SlackBot",
307
+ sleipnir: "Sleipnir",
308
+ sogou: "Sogou Browser",
309
+ swing: "Swing",
310
+ tizen: "Tizen",
311
+ uc: "UC Browser",
312
+ vivaldi: "Vivaldi",
313
+ webos: "WebOS Browser",
314
+ wechat: "WeChat",
315
+ yahooslurp: "YahooSlurp",
316
+ yandex: "Yandex Browser",
317
+ yandexbot: "YandexBot",
318
+ youbot: "YouBot"
319
+ };
320
+ t.PLATFORMS_MAP = {
321
+ bot: "bot",
322
+ desktop: "desktop",
323
+ mobile: "mobile",
324
+ tablet: "tablet",
325
+ tv: "tv"
326
+ };
327
+ t.OS_MAP = {
328
+ Android: "Android",
329
+ Bada: "Bada",
330
+ BlackBerry: "BlackBerry",
331
+ ChromeOS: "Chrome OS",
332
+ HarmonyOS: "HarmonyOS",
333
+ iOS: "iOS",
334
+ Linux: "Linux",
335
+ MacOS: "macOS",
336
+ PlayStation4: "PlayStation 4",
337
+ Roku: "Roku",
338
+ Tizen: "Tizen",
339
+ WebOS: "WebOS",
340
+ Windows: "Windows",
341
+ WindowsPhone: "Windows Phone"
342
+ };
343
+ t.ENGINE_MAP = {
344
+ Blink: "Blink",
345
+ EdgeHTML: "EdgeHTML",
346
+ Gecko: "Gecko",
347
+ Presto: "Presto",
348
+ Trident: "Trident",
349
+ WebKit: "WebKit"
350
+ };
351
+ },
352
+ 90: function(e, t, r) {
353
+ "use strict";
354
+ t.__esModule = !0, t.default = void 0;
355
+ var i, n = (i = r(91)) && i.__esModule ? i : { default: i }, a = r(18);
356
+ function o(e, t) {
357
+ for (var r = 0; r < t.length; r++) {
358
+ var i = t[r];
359
+ i.enumerable = i.enumerable || !1, i.configurable = !0, "value" in i && (i.writable = !0), Object.defineProperty(e, i.key, i);
360
+ }
361
+ }
362
+ t.default = function() {
363
+ function e() {}
364
+ var t, r, i;
365
+ return e.getParser = function(e, t, r) {
366
+ if (void 0 === t && (t = !1), void 0 === r && (r = null), "string" != typeof e) throw new Error("UserAgent should be a string");
367
+ return new n.default(e, t, r);
368
+ }, e.parse = function(e, t) {
369
+ return void 0 === t && (t = null), new n.default(e, t).getResult();
370
+ }, t = e, i = [
371
+ {
372
+ key: "BROWSER_MAP",
373
+ get: function() {
374
+ return a.BROWSER_MAP;
375
+ }
376
+ },
377
+ {
378
+ key: "ENGINE_MAP",
379
+ get: function() {
380
+ return a.ENGINE_MAP;
381
+ }
382
+ },
383
+ {
384
+ key: "OS_MAP",
385
+ get: function() {
386
+ return a.OS_MAP;
387
+ }
388
+ },
389
+ {
390
+ key: "PLATFORMS_MAP",
391
+ get: function() {
392
+ return a.PLATFORMS_MAP;
393
+ }
394
+ }
395
+ ], (r = null) && o(t.prototype, r), i && o(t, i), e;
396
+ }(), e.exports = t.default;
397
+ },
398
+ 91: function(e, t, r) {
399
+ "use strict";
400
+ t.__esModule = !0, t.default = void 0;
401
+ var i = u(r(92)), n = u(r(93)), a = u(r(94)), o = u(r(95)), s = u(r(17));
402
+ function u(e) {
403
+ return e && e.__esModule ? e : { default: e };
404
+ }
405
+ t.default = function() {
406
+ function e(e, t, r) {
407
+ if (void 0 === t && (t = !1), void 0 === r && (r = null), null == e || "" === e) throw new Error("UserAgent parameter can't be empty");
408
+ this._ua = e;
409
+ var i = !1;
410
+ "boolean" == typeof t ? (i = t, this._hints = r) : this._hints = null != t && "object" == typeof t ? t : null, this.parsedResult = {}, !0 !== i && this.parse();
411
+ }
412
+ var t = e.prototype;
413
+ return t.getHints = function() {
414
+ return this._hints;
415
+ }, t.hasBrand = function(e) {
416
+ if (!this._hints || !Array.isArray(this._hints.brands)) return !1;
417
+ var t = e.toLowerCase();
418
+ return this._hints.brands.some((function(e) {
419
+ return e.brand && e.brand.toLowerCase() === t;
420
+ }));
421
+ }, t.getBrandVersion = function(e) {
422
+ if (this._hints && Array.isArray(this._hints.brands)) {
423
+ var t = e.toLowerCase(), r = this._hints.brands.find((function(e) {
424
+ return e.brand && e.brand.toLowerCase() === t;
425
+ }));
426
+ return r ? r.version : void 0;
427
+ }
428
+ }, t.getUA = function() {
429
+ return this._ua;
430
+ }, t.test = function(e) {
431
+ return e.test(this._ua);
432
+ }, t.parseBrowser = function() {
433
+ var e = this;
434
+ this.parsedResult.browser = {};
435
+ var t = s.default.find(i.default, (function(t) {
436
+ if ("function" == typeof t.test) return t.test(e);
437
+ if (Array.isArray(t.test)) return t.test.some((function(t) {
438
+ return e.test(t);
439
+ }));
440
+ throw new Error("Browser's test function is not valid");
441
+ }));
442
+ return t && (this.parsedResult.browser = t.describe(this.getUA(), this)), this.parsedResult.browser;
443
+ }, t.getBrowser = function() {
444
+ return this.parsedResult.browser ? this.parsedResult.browser : this.parseBrowser();
445
+ }, t.getBrowserName = function(e) {
446
+ return e ? String(this.getBrowser().name).toLowerCase() || "" : this.getBrowser().name || "";
447
+ }, t.getBrowserVersion = function() {
448
+ return this.getBrowser().version;
449
+ }, t.getOS = function() {
450
+ return this.parsedResult.os ? this.parsedResult.os : this.parseOS();
451
+ }, t.parseOS = function() {
452
+ var e = this;
453
+ this.parsedResult.os = {};
454
+ var t = s.default.find(n.default, (function(t) {
455
+ if ("function" == typeof t.test) return t.test(e);
456
+ if (Array.isArray(t.test)) return t.test.some((function(t) {
457
+ return e.test(t);
458
+ }));
459
+ throw new Error("Browser's test function is not valid");
460
+ }));
461
+ return t && (this.parsedResult.os = t.describe(this.getUA())), this.parsedResult.os;
462
+ }, t.getOSName = function(e) {
463
+ var t = this.getOS().name;
464
+ return e ? String(t).toLowerCase() || "" : t || "";
465
+ }, t.getOSVersion = function() {
466
+ return this.getOS().version;
467
+ }, t.getPlatform = function() {
468
+ return this.parsedResult.platform ? this.parsedResult.platform : this.parsePlatform();
469
+ }, t.getPlatformType = function(e) {
470
+ void 0 === e && (e = !1);
471
+ var t = this.getPlatform().type;
472
+ return e ? String(t).toLowerCase() || "" : t || "";
473
+ }, t.parsePlatform = function() {
474
+ var e = this;
475
+ this.parsedResult.platform = {};
476
+ var t = s.default.find(a.default, (function(t) {
477
+ if ("function" == typeof t.test) return t.test(e);
478
+ if (Array.isArray(t.test)) return t.test.some((function(t) {
479
+ return e.test(t);
480
+ }));
481
+ throw new Error("Browser's test function is not valid");
482
+ }));
483
+ return t && (this.parsedResult.platform = t.describe(this.getUA())), this.parsedResult.platform;
484
+ }, t.getEngine = function() {
485
+ return this.parsedResult.engine ? this.parsedResult.engine : this.parseEngine();
486
+ }, t.getEngineName = function(e) {
487
+ return e ? String(this.getEngine().name).toLowerCase() || "" : this.getEngine().name || "";
488
+ }, t.parseEngine = function() {
489
+ var e = this;
490
+ this.parsedResult.engine = {};
491
+ var t = s.default.find(o.default, (function(t) {
492
+ if ("function" == typeof t.test) return t.test(e);
493
+ if (Array.isArray(t.test)) return t.test.some((function(t) {
494
+ return e.test(t);
495
+ }));
496
+ throw new Error("Browser's test function is not valid");
497
+ }));
498
+ return t && (this.parsedResult.engine = t.describe(this.getUA())), this.parsedResult.engine;
499
+ }, t.parse = function() {
500
+ return this.parseBrowser(), this.parseOS(), this.parsePlatform(), this.parseEngine(), this;
501
+ }, t.getResult = function() {
502
+ return s.default.assign({}, this.parsedResult);
503
+ }, t.satisfies = function(e) {
504
+ var t = this, r = {}, i = 0, n = {}, a = 0;
505
+ if (Object.keys(e).forEach((function(t) {
506
+ var o = e[t];
507
+ "string" == typeof o ? (n[t] = o, a += 1) : "object" == typeof o && (r[t] = o, i += 1);
508
+ })), i > 0) {
509
+ var o = Object.keys(r), u = s.default.find(o, (function(e) {
510
+ return t.isOS(e);
511
+ }));
512
+ if (u) {
513
+ var d = this.satisfies(r[u]);
514
+ if (void 0 !== d) return d;
515
+ }
516
+ var c = s.default.find(o, (function(e) {
517
+ return t.isPlatform(e);
518
+ }));
519
+ if (c) {
520
+ var f = this.satisfies(r[c]);
521
+ if (void 0 !== f) return f;
522
+ }
523
+ }
524
+ if (a > 0) {
525
+ var l = Object.keys(n), b = s.default.find(l, (function(e) {
526
+ return t.isBrowser(e, !0);
527
+ }));
528
+ if (void 0 !== b) return this.compareVersion(n[b]);
529
+ }
530
+ }, t.isBrowser = function(e, t) {
531
+ void 0 === t && (t = !1);
532
+ var r = this.getBrowserName().toLowerCase(), i = e.toLowerCase(), n = s.default.getBrowserTypeByAlias(i);
533
+ return t && n && (i = n.toLowerCase()), i === r;
534
+ }, t.compareVersion = function(e) {
535
+ var t = [0], r = e, i = !1, n = this.getBrowserVersion();
536
+ if ("string" == typeof n) return ">" === e[0] || "<" === e[0] ? (r = e.substr(1), "=" === e[1] ? (i = !0, r = e.substr(2)) : t = [], ">" === e[0] ? t.push(1) : t.push(-1)) : "=" === e[0] ? r = e.substr(1) : "~" === e[0] && (i = !0, r = e.substr(1)), t.indexOf(s.default.compareVersions(n, r, i)) > -1;
537
+ }, t.isOS = function(e) {
538
+ return this.getOSName(!0) === String(e).toLowerCase();
539
+ }, t.isPlatform = function(e) {
540
+ return this.getPlatformType(!0) === String(e).toLowerCase();
541
+ }, t.isEngine = function(e) {
542
+ return this.getEngineName(!0) === String(e).toLowerCase();
543
+ }, t.is = function(e, t) {
544
+ return void 0 === t && (t = !1), this.isBrowser(e, t) || this.isOS(e) || this.isPlatform(e);
545
+ }, t.some = function(e) {
546
+ var t = this;
547
+ return void 0 === e && (e = []), e.some((function(e) {
548
+ return t.is(e);
549
+ }));
550
+ }, e;
551
+ }(), e.exports = t.default;
552
+ },
553
+ 92: function(e, t, r) {
554
+ "use strict";
555
+ t.__esModule = !0, t.default = void 0;
556
+ var i, n = (i = r(17)) && i.__esModule ? i : { default: i };
557
+ var a = /version\/(\d+(\.?_?\d+)+)/i;
558
+ t.default = [
559
+ {
560
+ test: [/gptbot/i],
561
+ describe: function(e) {
562
+ var t = { name: "GPTBot" }, r = n.default.getFirstMatch(/gptbot\/(\d+(\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
563
+ return r && (t.version = r), t;
564
+ }
565
+ },
566
+ {
567
+ test: [/chatgpt-user/i],
568
+ describe: function(e) {
569
+ var t = { name: "ChatGPT-User" }, r = n.default.getFirstMatch(/chatgpt-user\/(\d+(\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
570
+ return r && (t.version = r), t;
571
+ }
572
+ },
573
+ {
574
+ test: [/oai-searchbot/i],
575
+ describe: function(e) {
576
+ var t = { name: "OAI-SearchBot" }, r = n.default.getFirstMatch(/oai-searchbot\/(\d+(\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
577
+ return r && (t.version = r), t;
578
+ }
579
+ },
580
+ {
581
+ test: [
582
+ /claudebot/i,
583
+ /claude-web/i,
584
+ /claude-user/i,
585
+ /claude-searchbot/i
586
+ ],
587
+ describe: function(e) {
588
+ var t = { name: "ClaudeBot" }, r = n.default.getFirstMatch(/(?:claudebot|claude-web|claude-user|claude-searchbot)\/(\d+(\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
589
+ return r && (t.version = r), t;
590
+ }
591
+ },
592
+ {
593
+ test: [/omgilibot/i, /webzio-extended/i],
594
+ describe: function(e) {
595
+ var t = { name: "Omgilibot" }, r = n.default.getFirstMatch(/(?:omgilibot|webzio-extended)\/(\d+(\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
596
+ return r && (t.version = r), t;
597
+ }
598
+ },
599
+ {
600
+ test: [/diffbot/i],
601
+ describe: function(e) {
602
+ var t = { name: "Diffbot" }, r = n.default.getFirstMatch(/diffbot\/(\d+(\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
603
+ return r && (t.version = r), t;
604
+ }
605
+ },
606
+ {
607
+ test: [/perplexitybot/i],
608
+ describe: function(e) {
609
+ var t = { name: "PerplexityBot" }, r = n.default.getFirstMatch(/perplexitybot\/(\d+(\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
610
+ return r && (t.version = r), t;
611
+ }
612
+ },
613
+ {
614
+ test: [/perplexity-user/i],
615
+ describe: function(e) {
616
+ var t = { name: "Perplexity-User" }, r = n.default.getFirstMatch(/perplexity-user\/(\d+(\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
617
+ return r && (t.version = r), t;
618
+ }
619
+ },
620
+ {
621
+ test: [/youbot/i],
622
+ describe: function(e) {
623
+ var t = { name: "YouBot" }, r = n.default.getFirstMatch(/youbot\/(\d+(\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
624
+ return r && (t.version = r), t;
625
+ }
626
+ },
627
+ {
628
+ test: [/meta-webindexer/i],
629
+ describe: function(e) {
630
+ var t = { name: "Meta-WebIndexer" }, r = n.default.getFirstMatch(/meta-webindexer\/(\d+(\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
631
+ return r && (t.version = r), t;
632
+ }
633
+ },
634
+ {
635
+ test: [/meta-externalads/i],
636
+ describe: function(e) {
637
+ var t = { name: "Meta-ExternalAds" }, r = n.default.getFirstMatch(/meta-externalads\/(\d+(\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
638
+ return r && (t.version = r), t;
639
+ }
640
+ },
641
+ {
642
+ test: [/meta-externalagent/i],
643
+ describe: function(e) {
644
+ var t = { name: "Meta-ExternalAgent" }, r = n.default.getFirstMatch(/meta-externalagent\/(\d+(\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
645
+ return r && (t.version = r), t;
646
+ }
647
+ },
648
+ {
649
+ test: [/meta-externalfetcher/i],
650
+ describe: function(e) {
651
+ var t = { name: "Meta-ExternalFetcher" }, r = n.default.getFirstMatch(/meta-externalfetcher\/(\d+(\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
652
+ return r && (t.version = r), t;
653
+ }
654
+ },
655
+ {
656
+ test: [/googlebot/i],
657
+ describe: function(e) {
658
+ var t = { name: "Googlebot" }, r = n.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i, e) || n.default.getFirstMatch(a, e);
659
+ return r && (t.version = r), t;
660
+ }
661
+ },
662
+ {
663
+ test: [/linespider/i],
664
+ describe: function(e) {
665
+ var t = { name: "Linespider" }, r = n.default.getFirstMatch(/(?:linespider)(?:-[-\w]+)?[\s/](\d+(\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
666
+ return r && (t.version = r), t;
667
+ }
668
+ },
669
+ {
670
+ test: [/amazonbot/i],
671
+ describe: function(e) {
672
+ var t = { name: "AmazonBot" }, r = n.default.getFirstMatch(/amazonbot\/(\d+(\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
673
+ return r && (t.version = r), t;
674
+ }
675
+ },
676
+ {
677
+ test: [/bingbot/i],
678
+ describe: function(e) {
679
+ var t = { name: "BingCrawler" }, r = n.default.getFirstMatch(/bingbot\/(\d+(\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
680
+ return r && (t.version = r), t;
681
+ }
682
+ },
683
+ {
684
+ test: [/baiduspider/i],
685
+ describe: function(e) {
686
+ var t = { name: "BaiduSpider" }, r = n.default.getFirstMatch(/baiduspider\/(\d+(\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
687
+ return r && (t.version = r), t;
688
+ }
689
+ },
690
+ {
691
+ test: [/duckduckbot/i],
692
+ describe: function(e) {
693
+ var t = { name: "DuckDuckBot" }, r = n.default.getFirstMatch(/duckduckbot\/(\d+(\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
694
+ return r && (t.version = r), t;
695
+ }
696
+ },
697
+ {
698
+ test: [/ia_archiver/i],
699
+ describe: function(e) {
700
+ var t = { name: "InternetArchiveCrawler" }, r = n.default.getFirstMatch(/ia_archiver\/(\d+(\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
701
+ return r && (t.version = r), t;
702
+ }
703
+ },
704
+ {
705
+ test: [/facebookexternalhit/i, /facebookcatalog/i],
706
+ describe: function() {
707
+ return { name: "FacebookExternalHit" };
708
+ }
709
+ },
710
+ {
711
+ test: [/slackbot/i, /slack-imgProxy/i],
712
+ describe: function(e) {
713
+ var t = { name: "SlackBot" }, r = n.default.getFirstMatch(/(?:slackbot|slack-imgproxy)(?:-[-\w]+)?[\s/](\d+(\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
714
+ return r && (t.version = r), t;
715
+ }
716
+ },
717
+ {
718
+ test: [/yahoo!?[\s/]*slurp/i],
719
+ describe: function() {
720
+ return { name: "YahooSlurp" };
721
+ }
722
+ },
723
+ {
724
+ test: [/yandexbot/i, /yandexmobilebot/i],
725
+ describe: function() {
726
+ return { name: "YandexBot" };
727
+ }
728
+ },
729
+ {
730
+ test: [/pingdom/i],
731
+ describe: function() {
732
+ return { name: "PingdomBot" };
733
+ }
734
+ },
735
+ {
736
+ test: [/opera/i],
737
+ describe: function(e) {
738
+ var t = { name: "Opera" }, r = n.default.getFirstMatch(a, e) || n.default.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i, e);
739
+ return r && (t.version = r), t;
740
+ }
741
+ },
742
+ {
743
+ test: [/opr\/|opios/i],
744
+ describe: function(e) {
745
+ var t = { name: "Opera" }, r = n.default.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i, e) || n.default.getFirstMatch(a, e);
746
+ return r && (t.version = r), t;
747
+ }
748
+ },
749
+ {
750
+ test: [/SamsungBrowser/i],
751
+ describe: function(e) {
752
+ var t = { name: "Samsung Internet for Android" }, r = n.default.getFirstMatch(a, e) || n.default.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i, e);
753
+ return r && (t.version = r), t;
754
+ }
755
+ },
756
+ {
757
+ test: [/Whale/i],
758
+ describe: function(e) {
759
+ var t = { name: "NAVER Whale Browser" }, r = n.default.getFirstMatch(a, e) || n.default.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i, e);
760
+ return r && (t.version = r), t;
761
+ }
762
+ },
763
+ {
764
+ test: [/PaleMoon/i],
765
+ describe: function(e) {
766
+ var t = { name: "Pale Moon" }, r = n.default.getFirstMatch(a, e) || n.default.getFirstMatch(/(?:PaleMoon)[\s/](\d+(?:\.\d+)+)/i, e);
767
+ return r && (t.version = r), t;
768
+ }
769
+ },
770
+ {
771
+ test: [/MZBrowser/i],
772
+ describe: function(e) {
773
+ var t = { name: "MZ Browser" }, r = n.default.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
774
+ return r && (t.version = r), t;
775
+ }
776
+ },
777
+ {
778
+ test: [/focus/i],
779
+ describe: function(e) {
780
+ var t = { name: "Focus" }, r = n.default.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
781
+ return r && (t.version = r), t;
782
+ }
783
+ },
784
+ {
785
+ test: [/swing/i],
786
+ describe: function(e) {
787
+ var t = { name: "Swing" }, r = n.default.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i, e) || n.default.getFirstMatch(a, e);
788
+ return r && (t.version = r), t;
789
+ }
790
+ },
791
+ {
792
+ test: [/coast/i],
793
+ describe: function(e) {
794
+ var t = { name: "Opera Coast" }, r = n.default.getFirstMatch(a, e) || n.default.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i, e);
795
+ return r && (t.version = r), t;
796
+ }
797
+ },
798
+ {
799
+ test: [/opt\/\d+(?:.?_?\d+)+/i],
800
+ describe: function(e) {
801
+ var t = { name: "Opera Touch" }, r = n.default.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i, e) || n.default.getFirstMatch(a, e);
802
+ return r && (t.version = r), t;
803
+ }
804
+ },
805
+ {
806
+ test: [/yabrowser/i],
807
+ describe: function(e) {
808
+ var t = { name: "Yandex Browser" }, r = n.default.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i, e) || n.default.getFirstMatch(a, e);
809
+ return r && (t.version = r), t;
810
+ }
811
+ },
812
+ {
813
+ test: [/ucbrowser/i],
814
+ describe: function(e) {
815
+ var t = { name: "UC Browser" }, r = n.default.getFirstMatch(a, e) || n.default.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i, e);
816
+ return r && (t.version = r), t;
817
+ }
818
+ },
819
+ {
820
+ test: [/Maxthon|mxios/i],
821
+ describe: function(e) {
822
+ var t = { name: "Maxthon" }, r = n.default.getFirstMatch(a, e) || n.default.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i, e);
823
+ return r && (t.version = r), t;
824
+ }
825
+ },
826
+ {
827
+ test: [/epiphany/i],
828
+ describe: function(e) {
829
+ var t = { name: "Epiphany" }, r = n.default.getFirstMatch(a, e) || n.default.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i, e);
830
+ return r && (t.version = r), t;
831
+ }
832
+ },
833
+ {
834
+ test: [/puffin/i],
835
+ describe: function(e) {
836
+ var t = { name: "Puffin" }, r = n.default.getFirstMatch(a, e) || n.default.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i, e);
837
+ return r && (t.version = r), t;
838
+ }
839
+ },
840
+ {
841
+ test: [/sleipnir/i],
842
+ describe: function(e) {
843
+ var t = { name: "Sleipnir" }, r = n.default.getFirstMatch(a, e) || n.default.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i, e);
844
+ return r && (t.version = r), t;
845
+ }
846
+ },
847
+ {
848
+ test: [/k-meleon/i],
849
+ describe: function(e) {
850
+ var t = { name: "K-Meleon" }, r = n.default.getFirstMatch(a, e) || n.default.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i, e);
851
+ return r && (t.version = r), t;
852
+ }
853
+ },
854
+ {
855
+ test: [/micromessenger/i],
856
+ describe: function(e) {
857
+ var t = { name: "WeChat" }, r = n.default.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i, e) || n.default.getFirstMatch(a, e);
858
+ return r && (t.version = r), t;
859
+ }
860
+ },
861
+ {
862
+ test: [/qqbrowser/i],
863
+ describe: function(e) {
864
+ var t = { name: /qqbrowserlite/i.test(e) ? "QQ Browser Lite" : "QQ Browser" }, r = n.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i, e) || n.default.getFirstMatch(a, e);
865
+ return r && (t.version = r), t;
866
+ }
867
+ },
868
+ {
869
+ test: [/msie|trident/i],
870
+ describe: function(e) {
871
+ var t = { name: "Internet Explorer" }, r = n.default.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i, e);
872
+ return r && (t.version = r), t;
873
+ }
874
+ },
875
+ {
876
+ test: [/\sedg\//i],
877
+ describe: function(e) {
878
+ var t = { name: "Microsoft Edge" }, r = n.default.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i, e);
879
+ return r && (t.version = r), t;
880
+ }
881
+ },
882
+ {
883
+ test: [/edg([ea]|ios)/i],
884
+ describe: function(e) {
885
+ var t = { name: "Microsoft Edge" }, r = n.default.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i, e);
886
+ return r && (t.version = r), t;
887
+ }
888
+ },
889
+ {
890
+ test: [/vivaldi/i],
891
+ describe: function(e) {
892
+ var t = { name: "Vivaldi" }, r = n.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i, e);
893
+ return r && (t.version = r), t;
894
+ }
895
+ },
896
+ {
897
+ test: [/seamonkey/i],
898
+ describe: function(e) {
899
+ var t = { name: "SeaMonkey" }, r = n.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i, e);
900
+ return r && (t.version = r), t;
901
+ }
902
+ },
903
+ {
904
+ test: [/sailfish/i],
905
+ describe: function(e) {
906
+ var t = { name: "Sailfish" }, r = n.default.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i, e);
907
+ return r && (t.version = r), t;
908
+ }
909
+ },
910
+ {
911
+ test: [/silk/i],
912
+ describe: function(e) {
913
+ var t = { name: "Amazon Silk" }, r = n.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i, e);
914
+ return r && (t.version = r), t;
915
+ }
916
+ },
917
+ {
918
+ test: [/phantom/i],
919
+ describe: function(e) {
920
+ var t = { name: "PhantomJS" }, r = n.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i, e);
921
+ return r && (t.version = r), t;
922
+ }
923
+ },
924
+ {
925
+ test: [/slimerjs/i],
926
+ describe: function(e) {
927
+ var t = { name: "SlimerJS" }, r = n.default.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i, e);
928
+ return r && (t.version = r), t;
929
+ }
930
+ },
931
+ {
932
+ test: [/blackberry|\bbb\d+/i, /rim\stablet/i],
933
+ describe: function(e) {
934
+ var t = { name: "BlackBerry" }, r = n.default.getFirstMatch(a, e) || n.default.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i, e);
935
+ return r && (t.version = r), t;
936
+ }
937
+ },
938
+ {
939
+ test: [/(web|hpw)[o0]s/i],
940
+ describe: function(e) {
941
+ var t = { name: "WebOS Browser" }, r = n.default.getFirstMatch(a, e) || n.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i, e);
942
+ return r && (t.version = r), t;
943
+ }
944
+ },
945
+ {
946
+ test: [/bada/i],
947
+ describe: function(e) {
948
+ var t = { name: "Bada" }, r = n.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i, e);
949
+ return r && (t.version = r), t;
950
+ }
951
+ },
952
+ {
953
+ test: [/tizen/i],
954
+ describe: function(e) {
955
+ var t = { name: "Tizen" }, r = n.default.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i, e) || n.default.getFirstMatch(a, e);
956
+ return r && (t.version = r), t;
957
+ }
958
+ },
959
+ {
960
+ test: [/qupzilla/i],
961
+ describe: function(e) {
962
+ var t = { name: "QupZilla" }, r = n.default.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i, e) || n.default.getFirstMatch(a, e);
963
+ return r && (t.version = r), t;
964
+ }
965
+ },
966
+ {
967
+ test: [/librewolf/i],
968
+ describe: function(e) {
969
+ var t = { name: "LibreWolf" }, r = n.default.getFirstMatch(/(?:librewolf)[\s/](\d+(\.?_?\d+)+)/i, e);
970
+ return r && (t.version = r), t;
971
+ }
972
+ },
973
+ {
974
+ test: [/firefox|iceweasel|fxios/i],
975
+ describe: function(e) {
976
+ var t = { name: "Firefox" }, r = n.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i, e);
977
+ return r && (t.version = r), t;
978
+ }
979
+ },
980
+ {
981
+ test: [/electron/i],
982
+ describe: function(e) {
983
+ var t = { name: "Electron" }, r = n.default.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i, e);
984
+ return r && (t.version = r), t;
985
+ }
986
+ },
987
+ {
988
+ test: [
989
+ /sogoumobilebrowser/i,
990
+ /metasr/i,
991
+ /se 2\.[x]/i
992
+ ],
993
+ describe: function(e) {
994
+ var t = { name: "Sogou Browser" }, r = n.default.getFirstMatch(/(?:sogoumobilebrowser)[\s/](\d+(\.?_?\d+)+)/i, e), i = n.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i, e), a = n.default.getFirstMatch(/se ([\d.]+)x/i, e), o = r || i || a;
995
+ return o && (t.version = o), t;
996
+ }
997
+ },
998
+ {
999
+ test: [/MiuiBrowser/i],
1000
+ describe: function(e) {
1001
+ var t = { name: "Miui" }, r = n.default.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i, e);
1002
+ return r && (t.version = r), t;
1003
+ }
1004
+ },
1005
+ {
1006
+ test: function(e) {
1007
+ return !!e.hasBrand("DuckDuckGo") || e.test(/\sDdg\/[\d.]+$/i);
1008
+ },
1009
+ describe: function(e, t) {
1010
+ var r = { name: "DuckDuckGo" };
1011
+ if (t) {
1012
+ var i = t.getBrandVersion("DuckDuckGo");
1013
+ if (i) return r.version = i, r;
1014
+ }
1015
+ var a = n.default.getFirstMatch(/\sDdg\/([\d.]+)$/i, e);
1016
+ return a && (r.version = a), r;
1017
+ }
1018
+ },
1019
+ {
1020
+ test: function(e) {
1021
+ return e.hasBrand("Brave");
1022
+ },
1023
+ describe: function(e, t) {
1024
+ var r = { name: "Brave" };
1025
+ if (t) {
1026
+ var i = t.getBrandVersion("Brave");
1027
+ if (i) return r.version = i, r;
1028
+ }
1029
+ return r;
1030
+ }
1031
+ },
1032
+ {
1033
+ test: [/chromium/i],
1034
+ describe: function(e) {
1035
+ var t = { name: "Chromium" }, r = n.default.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i, e) || n.default.getFirstMatch(a, e);
1036
+ return r && (t.version = r), t;
1037
+ }
1038
+ },
1039
+ {
1040
+ test: [/chrome|crios|crmo/i],
1041
+ describe: function(e) {
1042
+ var t = { name: "Chrome" }, r = n.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i, e);
1043
+ return r && (t.version = r), t;
1044
+ }
1045
+ },
1046
+ {
1047
+ test: [/GSA/i],
1048
+ describe: function(e) {
1049
+ var t = { name: "Google Search" }, r = n.default.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i, e);
1050
+ return r && (t.version = r), t;
1051
+ }
1052
+ },
1053
+ {
1054
+ test: function(e) {
1055
+ var t = !e.test(/like android/i), r = e.test(/android/i);
1056
+ return t && r;
1057
+ },
1058
+ describe: function(e) {
1059
+ var t = { name: "Android Browser" }, r = n.default.getFirstMatch(a, e);
1060
+ return r && (t.version = r), t;
1061
+ }
1062
+ },
1063
+ {
1064
+ test: [/playstation 4/i],
1065
+ describe: function(e) {
1066
+ var t = { name: "PlayStation 4" }, r = n.default.getFirstMatch(a, e);
1067
+ return r && (t.version = r), t;
1068
+ }
1069
+ },
1070
+ {
1071
+ test: [/safari|applewebkit/i],
1072
+ describe: function(e) {
1073
+ var t = { name: "Safari" }, r = n.default.getFirstMatch(a, e);
1074
+ return r && (t.version = r), t;
1075
+ }
1076
+ },
1077
+ {
1078
+ test: [/.*/i],
1079
+ describe: function(e) {
1080
+ var t = -1 !== e.search("\\(") ? /^(.*)\/(.*)[ \t]\((.*)/ : /^(.*)\/(.*) /;
1081
+ return {
1082
+ name: n.default.getFirstMatch(t, e),
1083
+ version: n.default.getSecondMatch(t, e)
1084
+ };
1085
+ }
1086
+ }
1087
+ ], e.exports = t.default;
1088
+ },
1089
+ 93: function(e, t, r) {
1090
+ "use strict";
1091
+ t.__esModule = !0, t.default = void 0;
1092
+ var i, n = (i = r(17)) && i.__esModule ? i : { default: i }, a = r(18);
1093
+ t.default = [
1094
+ {
1095
+ test: [/Roku\/DVP/],
1096
+ describe: function(e) {
1097
+ var t = n.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i, e);
1098
+ return {
1099
+ name: a.OS_MAP.Roku,
1100
+ version: t
1101
+ };
1102
+ }
1103
+ },
1104
+ {
1105
+ test: [/windows phone/i],
1106
+ describe: function(e) {
1107
+ var t = n.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i, e);
1108
+ return {
1109
+ name: a.OS_MAP.WindowsPhone,
1110
+ version: t
1111
+ };
1112
+ }
1113
+ },
1114
+ {
1115
+ test: [/windows /i],
1116
+ describe: function(e) {
1117
+ var t = n.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i, e), r = n.default.getWindowsVersionName(t);
1118
+ return {
1119
+ name: a.OS_MAP.Windows,
1120
+ version: t,
1121
+ versionName: r
1122
+ };
1123
+ }
1124
+ },
1125
+ {
1126
+ test: [/Macintosh(.*?) FxiOS(.*?)\//],
1127
+ describe: function(e) {
1128
+ var t = { name: a.OS_MAP.iOS }, r = n.default.getSecondMatch(/(Version\/)(\d[\d.]+)/, e);
1129
+ return r && (t.version = r), t;
1130
+ }
1131
+ },
1132
+ {
1133
+ test: [/macintosh/i],
1134
+ describe: function(e) {
1135
+ var t = n.default.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i, e).replace(/[_\s]/g, "."), r = n.default.getMacOSVersionName(t), i = {
1136
+ name: a.OS_MAP.MacOS,
1137
+ version: t
1138
+ };
1139
+ return r && (i.versionName = r), i;
1140
+ }
1141
+ },
1142
+ {
1143
+ test: [/(ipod|iphone|ipad)/i],
1144
+ describe: function(e) {
1145
+ var t = n.default.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i, e).replace(/[_\s]/g, ".");
1146
+ return {
1147
+ name: a.OS_MAP.iOS,
1148
+ version: t
1149
+ };
1150
+ }
1151
+ },
1152
+ {
1153
+ test: [/OpenHarmony/i],
1154
+ describe: function(e) {
1155
+ var t = n.default.getFirstMatch(/OpenHarmony\s+(\d+(\.\d+)*)/i, e);
1156
+ return {
1157
+ name: a.OS_MAP.HarmonyOS,
1158
+ version: t
1159
+ };
1160
+ }
1161
+ },
1162
+ {
1163
+ test: function(e) {
1164
+ var t = !e.test(/like android/i), r = e.test(/android/i);
1165
+ return t && r;
1166
+ },
1167
+ describe: function(e) {
1168
+ var t = n.default.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i, e), r = n.default.getAndroidVersionName(t), i = {
1169
+ name: a.OS_MAP.Android,
1170
+ version: t
1171
+ };
1172
+ return r && (i.versionName = r), i;
1173
+ }
1174
+ },
1175
+ {
1176
+ test: [/(web|hpw)[o0]s/i],
1177
+ describe: function(e) {
1178
+ var t = n.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i, e), r = { name: a.OS_MAP.WebOS };
1179
+ return t && t.length && (r.version = t), r;
1180
+ }
1181
+ },
1182
+ {
1183
+ test: [/blackberry|\bbb\d+/i, /rim\stablet/i],
1184
+ describe: function(e) {
1185
+ var t = n.default.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i, e) || n.default.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i, e) || n.default.getFirstMatch(/\bbb(\d+)/i, e);
1186
+ return {
1187
+ name: a.OS_MAP.BlackBerry,
1188
+ version: t
1189
+ };
1190
+ }
1191
+ },
1192
+ {
1193
+ test: [/bada/i],
1194
+ describe: function(e) {
1195
+ var t = n.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i, e);
1196
+ return {
1197
+ name: a.OS_MAP.Bada,
1198
+ version: t
1199
+ };
1200
+ }
1201
+ },
1202
+ {
1203
+ test: [/tizen/i],
1204
+ describe: function(e) {
1205
+ var t = n.default.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i, e);
1206
+ return {
1207
+ name: a.OS_MAP.Tizen,
1208
+ version: t
1209
+ };
1210
+ }
1211
+ },
1212
+ {
1213
+ test: [/linux/i],
1214
+ describe: function() {
1215
+ return { name: a.OS_MAP.Linux };
1216
+ }
1217
+ },
1218
+ {
1219
+ test: [/CrOS/],
1220
+ describe: function() {
1221
+ return { name: a.OS_MAP.ChromeOS };
1222
+ }
1223
+ },
1224
+ {
1225
+ test: [/PlayStation 4/],
1226
+ describe: function(e) {
1227
+ var t = n.default.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i, e);
1228
+ return {
1229
+ name: a.OS_MAP.PlayStation4,
1230
+ version: t
1231
+ };
1232
+ }
1233
+ }
1234
+ ], e.exports = t.default;
1235
+ },
1236
+ 94: function(e, t, r) {
1237
+ "use strict";
1238
+ t.__esModule = !0, t.default = void 0;
1239
+ var i, n = (i = r(17)) && i.__esModule ? i : { default: i }, a = r(18);
1240
+ t.default = [
1241
+ {
1242
+ test: [/googlebot/i],
1243
+ describe: function() {
1244
+ return {
1245
+ type: a.PLATFORMS_MAP.bot,
1246
+ vendor: "Google"
1247
+ };
1248
+ }
1249
+ },
1250
+ {
1251
+ test: [/linespider/i],
1252
+ describe: function() {
1253
+ return {
1254
+ type: a.PLATFORMS_MAP.bot,
1255
+ vendor: "Line"
1256
+ };
1257
+ }
1258
+ },
1259
+ {
1260
+ test: [/amazonbot/i],
1261
+ describe: function() {
1262
+ return {
1263
+ type: a.PLATFORMS_MAP.bot,
1264
+ vendor: "Amazon"
1265
+ };
1266
+ }
1267
+ },
1268
+ {
1269
+ test: [/gptbot/i],
1270
+ describe: function() {
1271
+ return {
1272
+ type: a.PLATFORMS_MAP.bot,
1273
+ vendor: "OpenAI"
1274
+ };
1275
+ }
1276
+ },
1277
+ {
1278
+ test: [/chatgpt-user/i],
1279
+ describe: function() {
1280
+ return {
1281
+ type: a.PLATFORMS_MAP.bot,
1282
+ vendor: "OpenAI"
1283
+ };
1284
+ }
1285
+ },
1286
+ {
1287
+ test: [/oai-searchbot/i],
1288
+ describe: function() {
1289
+ return {
1290
+ type: a.PLATFORMS_MAP.bot,
1291
+ vendor: "OpenAI"
1292
+ };
1293
+ }
1294
+ },
1295
+ {
1296
+ test: [/baiduspider/i],
1297
+ describe: function() {
1298
+ return {
1299
+ type: a.PLATFORMS_MAP.bot,
1300
+ vendor: "Baidu"
1301
+ };
1302
+ }
1303
+ },
1304
+ {
1305
+ test: [/bingbot/i],
1306
+ describe: function() {
1307
+ return {
1308
+ type: a.PLATFORMS_MAP.bot,
1309
+ vendor: "Bing"
1310
+ };
1311
+ }
1312
+ },
1313
+ {
1314
+ test: [/duckduckbot/i],
1315
+ describe: function() {
1316
+ return {
1317
+ type: a.PLATFORMS_MAP.bot,
1318
+ vendor: "DuckDuckGo"
1319
+ };
1320
+ }
1321
+ },
1322
+ {
1323
+ test: [
1324
+ /claudebot/i,
1325
+ /claude-web/i,
1326
+ /claude-user/i,
1327
+ /claude-searchbot/i
1328
+ ],
1329
+ describe: function() {
1330
+ return {
1331
+ type: a.PLATFORMS_MAP.bot,
1332
+ vendor: "Anthropic"
1333
+ };
1334
+ }
1335
+ },
1336
+ {
1337
+ test: [/omgilibot/i, /webzio-extended/i],
1338
+ describe: function() {
1339
+ return {
1340
+ type: a.PLATFORMS_MAP.bot,
1341
+ vendor: "Webz.io"
1342
+ };
1343
+ }
1344
+ },
1345
+ {
1346
+ test: [/diffbot/i],
1347
+ describe: function() {
1348
+ return {
1349
+ type: a.PLATFORMS_MAP.bot,
1350
+ vendor: "Diffbot"
1351
+ };
1352
+ }
1353
+ },
1354
+ {
1355
+ test: [/perplexitybot/i],
1356
+ describe: function() {
1357
+ return {
1358
+ type: a.PLATFORMS_MAP.bot,
1359
+ vendor: "Perplexity AI"
1360
+ };
1361
+ }
1362
+ },
1363
+ {
1364
+ test: [/perplexity-user/i],
1365
+ describe: function() {
1366
+ return {
1367
+ type: a.PLATFORMS_MAP.bot,
1368
+ vendor: "Perplexity AI"
1369
+ };
1370
+ }
1371
+ },
1372
+ {
1373
+ test: [/youbot/i],
1374
+ describe: function() {
1375
+ return {
1376
+ type: a.PLATFORMS_MAP.bot,
1377
+ vendor: "You.com"
1378
+ };
1379
+ }
1380
+ },
1381
+ {
1382
+ test: [/ia_archiver/i],
1383
+ describe: function() {
1384
+ return {
1385
+ type: a.PLATFORMS_MAP.bot,
1386
+ vendor: "Internet Archive"
1387
+ };
1388
+ }
1389
+ },
1390
+ {
1391
+ test: [/meta-webindexer/i],
1392
+ describe: function() {
1393
+ return {
1394
+ type: a.PLATFORMS_MAP.bot,
1395
+ vendor: "Meta"
1396
+ };
1397
+ }
1398
+ },
1399
+ {
1400
+ test: [/meta-externalads/i],
1401
+ describe: function() {
1402
+ return {
1403
+ type: a.PLATFORMS_MAP.bot,
1404
+ vendor: "Meta"
1405
+ };
1406
+ }
1407
+ },
1408
+ {
1409
+ test: [/meta-externalagent/i],
1410
+ describe: function() {
1411
+ return {
1412
+ type: a.PLATFORMS_MAP.bot,
1413
+ vendor: "Meta"
1414
+ };
1415
+ }
1416
+ },
1417
+ {
1418
+ test: [/meta-externalfetcher/i],
1419
+ describe: function() {
1420
+ return {
1421
+ type: a.PLATFORMS_MAP.bot,
1422
+ vendor: "Meta"
1423
+ };
1424
+ }
1425
+ },
1426
+ {
1427
+ test: [/facebookexternalhit/i, /facebookcatalog/i],
1428
+ describe: function() {
1429
+ return {
1430
+ type: a.PLATFORMS_MAP.bot,
1431
+ vendor: "Meta"
1432
+ };
1433
+ }
1434
+ },
1435
+ {
1436
+ test: [/slackbot/i, /slack-imgProxy/i],
1437
+ describe: function() {
1438
+ return {
1439
+ type: a.PLATFORMS_MAP.bot,
1440
+ vendor: "Slack"
1441
+ };
1442
+ }
1443
+ },
1444
+ {
1445
+ test: [/yahoo/i],
1446
+ describe: function() {
1447
+ return {
1448
+ type: a.PLATFORMS_MAP.bot,
1449
+ vendor: "Yahoo"
1450
+ };
1451
+ }
1452
+ },
1453
+ {
1454
+ test: [/yandexbot/i, /yandexmobilebot/i],
1455
+ describe: function() {
1456
+ return {
1457
+ type: a.PLATFORMS_MAP.bot,
1458
+ vendor: "Yandex"
1459
+ };
1460
+ }
1461
+ },
1462
+ {
1463
+ test: [/pingdom/i],
1464
+ describe: function() {
1465
+ return {
1466
+ type: a.PLATFORMS_MAP.bot,
1467
+ vendor: "Pingdom"
1468
+ };
1469
+ }
1470
+ },
1471
+ {
1472
+ test: [/huawei/i],
1473
+ describe: function(e) {
1474
+ var t = n.default.getFirstMatch(/(can-l01)/i, e) && "Nova", r = {
1475
+ type: a.PLATFORMS_MAP.mobile,
1476
+ vendor: "Huawei"
1477
+ };
1478
+ return t && (r.model = t), r;
1479
+ }
1480
+ },
1481
+ {
1482
+ test: [/nexus\s*(?:7|8|9|10).*/i],
1483
+ describe: function() {
1484
+ return {
1485
+ type: a.PLATFORMS_MAP.tablet,
1486
+ vendor: "Nexus"
1487
+ };
1488
+ }
1489
+ },
1490
+ {
1491
+ test: [/ipad/i],
1492
+ describe: function() {
1493
+ return {
1494
+ type: a.PLATFORMS_MAP.tablet,
1495
+ vendor: "Apple",
1496
+ model: "iPad"
1497
+ };
1498
+ }
1499
+ },
1500
+ {
1501
+ test: [/Macintosh(.*?) FxiOS(.*?)\//],
1502
+ describe: function() {
1503
+ return {
1504
+ type: a.PLATFORMS_MAP.tablet,
1505
+ vendor: "Apple",
1506
+ model: "iPad"
1507
+ };
1508
+ }
1509
+ },
1510
+ {
1511
+ test: [/kftt build/i],
1512
+ describe: function() {
1513
+ return {
1514
+ type: a.PLATFORMS_MAP.tablet,
1515
+ vendor: "Amazon",
1516
+ model: "Kindle Fire HD 7"
1517
+ };
1518
+ }
1519
+ },
1520
+ {
1521
+ test: [/silk/i],
1522
+ describe: function() {
1523
+ return {
1524
+ type: a.PLATFORMS_MAP.tablet,
1525
+ vendor: "Amazon"
1526
+ };
1527
+ }
1528
+ },
1529
+ {
1530
+ test: [/tablet(?! pc)/i],
1531
+ describe: function() {
1532
+ return { type: a.PLATFORMS_MAP.tablet };
1533
+ }
1534
+ },
1535
+ {
1536
+ test: function(e) {
1537
+ var t = e.test(/ipod|iphone/i), r = e.test(/like (ipod|iphone)/i);
1538
+ return t && !r;
1539
+ },
1540
+ describe: function(e) {
1541
+ var t = n.default.getFirstMatch(/(ipod|iphone)/i, e);
1542
+ return {
1543
+ type: a.PLATFORMS_MAP.mobile,
1544
+ vendor: "Apple",
1545
+ model: t
1546
+ };
1547
+ }
1548
+ },
1549
+ {
1550
+ test: [/nexus\s*[0-6].*/i, /galaxy nexus/i],
1551
+ describe: function() {
1552
+ return {
1553
+ type: a.PLATFORMS_MAP.mobile,
1554
+ vendor: "Nexus"
1555
+ };
1556
+ }
1557
+ },
1558
+ {
1559
+ test: [/Nokia/i],
1560
+ describe: function(e) {
1561
+ var t = n.default.getFirstMatch(/Nokia\s+([0-9]+(\.[0-9]+)?)/i, e), r = {
1562
+ type: a.PLATFORMS_MAP.mobile,
1563
+ vendor: "Nokia"
1564
+ };
1565
+ return t && (r.model = t), r;
1566
+ }
1567
+ },
1568
+ {
1569
+ test: [/[^-]mobi/i],
1570
+ describe: function() {
1571
+ return { type: a.PLATFORMS_MAP.mobile };
1572
+ }
1573
+ },
1574
+ {
1575
+ test: function(e) {
1576
+ return "blackberry" === e.getBrowserName(!0);
1577
+ },
1578
+ describe: function() {
1579
+ return {
1580
+ type: a.PLATFORMS_MAP.mobile,
1581
+ vendor: "BlackBerry"
1582
+ };
1583
+ }
1584
+ },
1585
+ {
1586
+ test: function(e) {
1587
+ return "bada" === e.getBrowserName(!0);
1588
+ },
1589
+ describe: function() {
1590
+ return { type: a.PLATFORMS_MAP.mobile };
1591
+ }
1592
+ },
1593
+ {
1594
+ test: function(e) {
1595
+ return "windows phone" === e.getBrowserName();
1596
+ },
1597
+ describe: function() {
1598
+ return {
1599
+ type: a.PLATFORMS_MAP.mobile,
1600
+ vendor: "Microsoft"
1601
+ };
1602
+ }
1603
+ },
1604
+ {
1605
+ test: function(e) {
1606
+ var t = Number(String(e.getOSVersion()).split(".")[0]);
1607
+ return "android" === e.getOSName(!0) && t >= 3;
1608
+ },
1609
+ describe: function() {
1610
+ return { type: a.PLATFORMS_MAP.tablet };
1611
+ }
1612
+ },
1613
+ {
1614
+ test: function(e) {
1615
+ return "android" === e.getOSName(!0);
1616
+ },
1617
+ describe: function() {
1618
+ return { type: a.PLATFORMS_MAP.mobile };
1619
+ }
1620
+ },
1621
+ {
1622
+ test: [/smart-?tv|smarttv/i],
1623
+ describe: function() {
1624
+ return { type: a.PLATFORMS_MAP.tv };
1625
+ }
1626
+ },
1627
+ {
1628
+ test: [/netcast/i],
1629
+ describe: function() {
1630
+ return { type: a.PLATFORMS_MAP.tv };
1631
+ }
1632
+ },
1633
+ {
1634
+ test: function(e) {
1635
+ return "macos" === e.getOSName(!0);
1636
+ },
1637
+ describe: function() {
1638
+ return {
1639
+ type: a.PLATFORMS_MAP.desktop,
1640
+ vendor: "Apple"
1641
+ };
1642
+ }
1643
+ },
1644
+ {
1645
+ test: function(e) {
1646
+ return "windows" === e.getOSName(!0);
1647
+ },
1648
+ describe: function() {
1649
+ return { type: a.PLATFORMS_MAP.desktop };
1650
+ }
1651
+ },
1652
+ {
1653
+ test: function(e) {
1654
+ return "linux" === e.getOSName(!0);
1655
+ },
1656
+ describe: function() {
1657
+ return { type: a.PLATFORMS_MAP.desktop };
1658
+ }
1659
+ },
1660
+ {
1661
+ test: function(e) {
1662
+ return "playstation 4" === e.getOSName(!0);
1663
+ },
1664
+ describe: function() {
1665
+ return { type: a.PLATFORMS_MAP.tv };
1666
+ }
1667
+ },
1668
+ {
1669
+ test: function(e) {
1670
+ return "roku" === e.getOSName(!0);
1671
+ },
1672
+ describe: function() {
1673
+ return { type: a.PLATFORMS_MAP.tv };
1674
+ }
1675
+ }
1676
+ ], e.exports = t.default;
1677
+ },
1678
+ 95: function(e, t, r) {
1679
+ "use strict";
1680
+ t.__esModule = !0, t.default = void 0;
1681
+ var i, n = (i = r(17)) && i.__esModule ? i : { default: i }, a = r(18);
1682
+ t.default = [
1683
+ {
1684
+ test: function(e) {
1685
+ return "microsoft edge" === e.getBrowserName(!0);
1686
+ },
1687
+ describe: function(e) {
1688
+ if (/\sedg\//i.test(e)) return { name: a.ENGINE_MAP.Blink };
1689
+ var t = n.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i, e);
1690
+ return {
1691
+ name: a.ENGINE_MAP.EdgeHTML,
1692
+ version: t
1693
+ };
1694
+ }
1695
+ },
1696
+ {
1697
+ test: [/trident/i],
1698
+ describe: function(e) {
1699
+ var t = { name: a.ENGINE_MAP.Trident }, r = n.default.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i, e);
1700
+ return r && (t.version = r), t;
1701
+ }
1702
+ },
1703
+ {
1704
+ test: function(e) {
1705
+ return e.test(/presto/i);
1706
+ },
1707
+ describe: function(e) {
1708
+ var t = { name: a.ENGINE_MAP.Presto }, r = n.default.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i, e);
1709
+ return r && (t.version = r), t;
1710
+ }
1711
+ },
1712
+ {
1713
+ test: function(e) {
1714
+ var t = e.test(/gecko/i), r = e.test(/like gecko/i);
1715
+ return t && !r;
1716
+ },
1717
+ describe: function(e) {
1718
+ var t = { name: a.ENGINE_MAP.Gecko }, r = n.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i, e);
1719
+ return r && (t.version = r), t;
1720
+ }
1721
+ },
1722
+ {
1723
+ test: [/(apple)?webkit\/537\.36/i],
1724
+ describe: function() {
1725
+ return { name: a.ENGINE_MAP.Blink };
1726
+ }
1727
+ },
1728
+ {
1729
+ test: [/(apple)?webkit/i],
1730
+ describe: function(e) {
1731
+ var t = { name: a.ENGINE_MAP.WebKit }, r = n.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i, e);
1732
+ return r && (t.version = r), t;
1733
+ }
1734
+ }
1735
+ ], e.exports = t.default;
1736
+ }
1737
+ });
1738
+ }));
1739
+ })))(), 1);
1740
+ function collectUserAgentContext() {
1741
+ if (typeof window === "undefined" || typeof navigator === "undefined") return void 0;
1742
+ const parsed = import_es5.default.parse(navigator.userAgent);
1743
+ let timeZone;
1744
+ try {
1745
+ timeZone = new Intl.DateTimeFormat().resolvedOptions().timeZone;
1746
+ } catch (_e) {}
1747
+ return {
1748
+ userAgent: navigator.userAgent,
1749
+ os: parsed.os.name?.toLowerCase().replace(/\s+/g, ""),
1750
+ browser: parsed.browser.name?.toLowerCase().replace(/\s+/g, ""),
1751
+ browserVersion: parsed.browser.version?.split(".")[0],
1752
+ mobile: parsed.platform.type ? parsed.platform.type === "mobile" || parsed.platform.type === "tablet" : void 0,
1753
+ languageCode: navigator.language,
1754
+ timeZone,
1755
+ viewportWidth: window.innerWidth,
1756
+ viewportHeight: window.innerHeight,
1757
+ screenWidth: window.screen.width,
1758
+ screenHeight: window.screen.height,
1759
+ devicePixelRatio: window.devicePixelRatio,
1760
+ uri: `${window.location.origin}${window.location.pathname}`,
1761
+ referrer: document.referrer
1762
+ };
1763
+ }
1764
+ //#endregion
1765
+ //#region ../csr-common/src/uploader/worker/worker-script.ts
1766
+ const workerScript = "//#region src/uploader/worker/web-socket-transport.ts\n/**\n* WebSocket-backed Transport. Internal retry policy: clean server-initiated close after the\n* first successful open → reconnect and resume; abrupt close (or any close before the first\n* open) → fire `onClose` and stop. Frames received while a (re)connect is in progress are\n* buffered and flushed on open.\n*\n* `ready()` resolves on the first successful open and rejects on close-before-open. Callers\n* should await it before treating the Transport as live, so a failure to open can be caught\n* (e.g. 4404 unknown session) and recovered from.\n*/\nvar WebSocketTransport = class {\n url;\n ws = null;\n onCloseCb = null;\n onStateChangeCb = null;\n intentionallyClosed = false;\n dead = false;\n /** Frames buffered while a (re)connect is in progress. */\n pending = [];\n readyPromise;\n constructor(url) {\n this.url = url;\n this.readyPromise = new Promise((resolve, reject) => {\n this.connect(false, resolve, reject);\n });\n this.readyPromise.catch(() => {});\n }\n ready() {\n return this.readyPromise;\n }\n send(frame) {\n if (this.dead || this.intentionallyClosed) return;\n if (this.ws?.readyState === WebSocket.OPEN) this.ws.send(JSON.stringify(frame));\n else this.pending.push(frame);\n }\n close(reason = \"transport-close\") {\n this.intentionallyClosed = true;\n this.ws?.close(1e3, reason);\n }\n onClose(cb) {\n this.onCloseCb = cb;\n }\n onStateChange(cb) {\n this.onStateChangeCb = cb;\n }\n connect(isReconnect, onReady, onReadyFail) {\n const ws = new WebSocket(this.url);\n this.ws = ws;\n let opened = false;\n ws.onopen = () => {\n opened = true;\n onReady?.();\n if (isReconnect) this.onStateChangeCb?.({ connected: true });\n while (this.pending.length > 0) {\n const f = this.pending.shift();\n ws.send(JSON.stringify(f));\n }\n };\n ws.onclose = (event) => {\n if (this.intentionallyClosed) return;\n if (!opened) {\n const reason = `${isReconnect ? \"reconnect\" : \"initial\"}-failed code=${event.code}`;\n if (onReadyFail) {\n onReadyFail(new Error(reason));\n this.dead = true;\n } else this.die(reason);\n return;\n }\n if (event.wasClean && (event.code === 1e3 || event.code === 1001)) {\n this.onStateChangeCb?.({ connected: false });\n this.connect(true);\n } else this.die(`close code=${event.code} wasClean=${event.wasClean}`);\n };\n }\n die(reason) {\n this.dead = true;\n this.onCloseCb?.({ reason });\n }\n};\n//#endregion\n//#region src/uploader/worker/csr-client.ts\n/**\n* Single Client implementation that talks to the recording backend's REST + WS protocol.\n* Both dev-server and prod implement the same protocol, so we don't need polymorphism here yet.\n*/\nvar CsrClient = class {\n apiUrl;\n clientSecret;\n context;\n websocketUrl;\n log;\n forceRecord;\n constructor(apiUrl, clientSecret, context, websocketUrl, log = () => {}, forceRecord) {\n this.apiUrl = apiUrl;\n this.clientSecret = clientSecret;\n this.context = context;\n this.websocketUrl = websocketUrl;\n this.log = log;\n this.forceRecord = forceRecord;\n }\n async initSession() {\n const url = `${this.trimSlash(this.apiUrl)}/v1/sessions:initSession`;\n this.log(`fetch POST ${url}`);\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n clientSecret: this.clientSecret,\n ...this.context && Object.keys(this.context).length > 0 ? { context: this.context } : {},\n ...this.forceRecord ? { forceRecord: true } : {}\n })\n });\n if (!res.ok) throw new Error(`init-session failed: HTTP ${res.status}`);\n const data = await res.json();\n if (data.skipRecording) return { skipRecording: true };\n if (!data.sessionId || !data.sessionToken) throw new Error(\"init-session response missing sessionId or sessionToken\");\n return {\n sessionId: data.sessionId,\n sessionToken: data.sessionToken\n };\n }\n async openTransport(sessionToken) {\n const wsBase = this.websocketUrl ?? `${this.toWsScheme(this.trimSlash(this.apiUrl))}/sessions/stream`;\n const url = `${wsBase}${wsBase.includes(\"?\") ? \"&\" : \"?\"}session_token=${encodeURIComponent(sessionToken)}`;\n this.log(`WebSocket connect ${url.replace(/session_token=[^&]*/, \"session_token=[REDACTED]\")}`);\n const transport = new WebSocketTransport(url);\n await transport.ready();\n return transport;\n }\n trimSlash(s) {\n return s.endsWith(\"/\") ? s.slice(0, -1) : s;\n }\n toWsScheme(base) {\n if (base.startsWith(\"https://\")) return `wss://${base.slice(8)}`;\n if (base.startsWith(\"http://\")) return `ws://${base.slice(7)}`;\n return base;\n }\n};\n//#endregion\n//#region src/uploader/worker/core.ts\nconst IDLE_GRACE_MS = 5e3;\nlet state = { phase: \"init\" };\nconst ports = [];\nlet idleTimer = null;\nfunction cancelIdleTimer() {\n if (idleTimer !== null) {\n clearTimeout(idleTimer);\n idleTimer = null;\n }\n}\nfunction log(msg) {\n for (const handle of ports) if (handle.debugLogs) handle.port.postMessage({\n type: \"log\",\n msg\n });\n}\n/**\n* The first hello \"locks in\" the session's apiUrl/clientSecret. Any later tab arriving\n* with different values is misconfigured — we reject it rather than silently using the\n* locked values. In SharedWorker mode the `name = hash(clientSecret)` scoping already\n* prevents secret-mismatch from sharing a worker, but this defends against the dedicated\n* path and against future bugs.\n*/\nlet lockedConfig = null;\nfunction registerPort(adapter) {\n cancelIdleTimer();\n const handle = {\n port: adapter,\n hello: null,\n debugLogs: false\n };\n ports.push(handle);\n adapter.onmessage((data) => {\n handleMessage(handle, data);\n });\n}\nfunction handleMessage(handle, message) {\n switch (message.type) {\n case \"hello\":\n handle.hello = message;\n handle.debugLogs = message.debugLogs ?? false;\n if (rejectIfIncompatible(handle)) return;\n if (state.phase !== \"dead\" && state.phase !== \"skipping\") detectDuplicateTab(handle);\n onHello(handle);\n return;\n case \"frame\":\n onFrame(message.frame);\n return;\n case \"bye\":\n onBye(handle);\n return;\n default: break;\n }\n}\n/**\n* Reject hellos whose `apiUrl`/`clientSecret` don't match the values established by the\n* first hello. Returns true if the port was rejected (caller should not continue\n* processing this hello).\n*/\nfunction rejectIfIncompatible(handle) {\n if (lockedConfig === null) return false;\n const incoming = handle.hello;\n if (incoming.apiUrl === lockedConfig.apiUrl && incoming.websocketUrl === lockedConfig.websocketUrl && incoming.clientSecret === lockedConfig.clientSecret) return false;\n handle.port.postMessage({\n type: \"dead\",\n reason: \"incompatible-options: apiUrl/websocketUrl/clientSecret differ from the worker session\"\n });\n const idx = ports.indexOf(handle);\n if (idx >= 0) ports.splice(idx, 1);\n return true;\n}\n/**\n* If another already-connected port has the same `tabId`, this hello is from a duplicate\n* tab (browser \"Duplicate\" command clones sessionStorage). Mint a fresh `tabId` so the two\n* tabs don't collide on the same `(sessionId, tabId)` Recording. The new tabId is returned\n* to the tab in `welcome` so it can update its own state and sessionStorage.\n*/\nfunction detectDuplicateTab(handle) {\n const tabId = handle.hello.tabId;\n if (!ports.some((p) => p !== handle && p.hello?.tabId === tabId)) return;\n const fresh = crypto.randomUUID();\n handle.newTabId = fresh;\n handle.hello.tabId = fresh;\n}\nfunction onHello(handle) {\n switch (state.phase) {\n case \"init\":\n lockedConfig = {\n apiUrl: handle.hello.apiUrl,\n websocketUrl: handle.hello.websocketUrl,\n clientSecret: handle.hello.clientSecret\n };\n log(`hello received apiUrl=${handle.hello.apiUrl} websocketUrl=${handle.hello.websocketUrl ?? \"(derive)\"} sessionIdHint=${handle.hello.sessionIdHint ?? \"(none)\"}`);\n state = { phase: \"initializing\" };\n initializeSession(handle.hello).then(flushPendingWelcomes);\n return;\n case \"initializing\": return;\n case \"active\":\n sendActiveWelcome(handle, state.sessionId, state.sessionToken);\n return;\n case \"idle\": {\n const { client, sessionId, sessionToken } = state;\n state = { phase: \"initializing\" };\n resumeTransport(client, sessionId, sessionToken).then(flushPendingWelcomes);\n return;\n }\n case \"skipping\":\n if (handle.hello.forceRecord) {\n log(\"forceRecord set; re-initializing from skipping state\");\n state = { phase: \"initializing\" };\n initializeSession(handle.hello).then(flushPendingWelcomes);\n return;\n }\n handle.port.postMessage({\n type: \"welcome\",\n result: { skipRecording: true }\n });\n return;\n case \"dead\":\n handle.port.postMessage({\n type: \"dead\",\n reason: state.reason\n });\n return;\n default: break;\n }\n}\nasync function initializeSession(firstHello) {\n const client = new CsrClient(firstHello.apiUrl, firstHello.clientSecret, firstHello.context, firstHello.websocketUrl, log, firstHello.forceRecord);\n if (firstHello.sessionIdHint && firstHello.sessionTokenHint) {\n log(`adopting sessionIdHint=${firstHello.sessionIdHint}`);\n try {\n const transport = await client.openTransport(firstHello.sessionTokenHint);\n wireTransport(transport);\n state = {\n phase: \"active\",\n client,\n transport,\n sessionId: firstHello.sessionIdHint,\n sessionToken: firstHello.sessionTokenHint\n };\n log(\"hint adopted; transport open\");\n if (ports.length === 0) idleTimer = setTimeout(enterIdle, IDLE_GRACE_MS);\n return;\n } catch (err) {\n log(`hint rejected (${String(err)}); falling back to fresh init`);\n }\n }\n let result;\n try {\n result = await client.initSession();\n } catch (err) {\n log(`init-session threw: ${String(err)}`);\n transitionToDead(`init-session-failed: ${String(err)}`);\n return;\n }\n if (\"skipRecording\" in result) {\n log(\"init-session: skipRecording\");\n state = { phase: \"skipping\" };\n return;\n }\n log(`init-session ok sessionId=${result.sessionId}`);\n let transport;\n try {\n transport = await client.openTransport(result.sessionToken);\n } catch (err) {\n log(`openTransport threw: ${String(err)}`);\n transitionToDead(`open-transport-failed: ${String(err)}`);\n return;\n }\n wireTransport(transport);\n log(\"transport open; session active\");\n state = {\n phase: \"active\",\n client,\n transport,\n sessionId: result.sessionId,\n sessionToken: result.sessionToken\n };\n if (ports.length === 0) idleTimer = setTimeout(enterIdle, IDLE_GRACE_MS);\n}\nasync function resumeTransport(client, sessionId, sessionToken) {\n log(\"resuming transport from idle\");\n let transport;\n try {\n transport = await client.openTransport(sessionToken);\n } catch (err) {\n log(`resume-transport threw: ${String(err)}`);\n transitionToDead(`resume-transport-failed: ${String(err)}`);\n return;\n }\n wireTransport(transport);\n log(\"transport resumed\");\n state = {\n phase: \"active\",\n client,\n transport,\n sessionId,\n sessionToken\n };\n if (ports.length === 0) idleTimer = setTimeout(enterIdle, IDLE_GRACE_MS);\n}\nfunction wireTransport(transport) {\n transport.onClose((info) => {\n if (state.phase !== \"active\") return;\n transitionToDead(info.reason);\n });\n transport.onStateChange((info) => {\n if (state.phase !== \"active\") return;\n for (const handle of ports) handle.port.postMessage({\n type: \"state\",\n connected: info.connected\n });\n });\n}\nfunction transitionToDead(reason) {\n state = {\n phase: \"dead\",\n reason\n };\n for (const handle of ports) handle.port.postMessage({\n type: \"dead\",\n reason\n });\n}\nfunction flushPendingWelcomes() {\n for (const handle of ports) {\n if (handle.hello === null) continue;\n if (state.phase === \"active\") sendActiveWelcome(handle, state.sessionId, state.sessionToken);\n else if (state.phase === \"skipping\") handle.port.postMessage({\n type: \"welcome\",\n result: { skipRecording: true }\n });\n else if (state.phase === \"dead\") handle.port.postMessage({\n type: \"dead\",\n reason: state.reason\n });\n }\n}\nfunction sendActiveWelcome(handle, currentSessionId, currentSessionToken) {\n const hint = handle.hello?.sessionIdHint;\n const adopted = hint !== void 0 && hint !== currentSessionId;\n const newTabId = handle.newTabId;\n handle.port.postMessage({\n type: \"welcome\",\n result: {\n sessionId: currentSessionId,\n sessionToken: currentSessionToken\n },\n adoptedFromSessionId: adopted ? hint : void 0,\n newTabId,\n resetCounter: adopted || newTabId !== void 0\n });\n}\nfunction onFrame(frame) {\n if (state.phase !== \"active\") return;\n state.transport.send(frame);\n}\nfunction onBye(handle) {\n const idx = ports.indexOf(handle);\n if (idx >= 0) ports.splice(idx, 1);\n if (ports.length === 0 && state.phase === \"active\") {\n log(`last tab disconnected; closing transport in ${IDLE_GRACE_MS}ms`);\n idleTimer = setTimeout(enterIdle, IDLE_GRACE_MS);\n }\n}\nfunction enterIdle() {\n idleTimer = null;\n if (state.phase !== \"active\" || ports.length > 0) return;\n log(\"idle timeout; closing transport\");\n state.transport.close(\"idle\");\n state = {\n phase: \"idle\",\n client: state.client,\n sessionId: state.sessionId,\n sessionToken: state.sessionToken\n };\n}\n//#endregion\n//#region src/uploader/worker/entry.ts\nconst SharedWorkerScopeCtor = globalThis.SharedWorkerGlobalScope;\nif (typeof SharedWorkerScopeCtor === \"function\" && self instanceof SharedWorkerScopeCtor) self.onconnect = (event) => {\n const port = event.ports[0];\n port.start();\n registerPort(adaptMessagePort(port));\n};\nelse registerPort(adaptDedicatedSelf());\nfunction adaptMessagePort(port) {\n return {\n postMessage: (message) => port.postMessage(message),\n onmessage: (cb) => {\n port.onmessage = (e) => cb(e.data);\n }\n };\n}\nfunction adaptDedicatedSelf() {\n const ws = self;\n return {\n postMessage: (message) => ws.postMessage(message),\n onmessage: (cb) => {\n ws.onmessage = (e) => cb(e.data);\n }\n };\n}\n//#endregion\n";
1767
+ //#endregion
1768
+ //#region ../csr-common/src/uploader/create-uploader.ts
1769
+ const STORAGE_TAB_ID = "csr:tabId";
1770
+ const STORAGE_SESSION = "csr:session";
1771
+ const STORAGE_COUNTER = "csr:counter";
1772
+ const DEFAULT_SESSION_TTL_MS = 1800 * 1e3;
1773
+ const WELCOME_TIMEOUT_MS = 1e4;
1774
+ async function createUploader(opts) {
1775
+ const log = opts.debugLogger;
1776
+ const sessionTtlMs = opts.sessionTtlMs ?? DEFAULT_SESSION_TTL_MS;
1777
+ const tabId = readOrMintTabId();
1778
+ const sessionHint = readSessionHint(sessionTtlMs);
1779
+ const counterHint = readCounter();
1780
+ const mode = resolveMode(opts.workerMode ?? "auto");
1781
+ log?.(`tab: createUploader mode=${mode} tabId=${tabId} sessionHint=${sessionHint?.id ?? "(none)"} counterHint=${counterHint}`);
1782
+ const workerName = mode === "shared" ? await hashSecret(opts.clientSecret) : void 0;
1783
+ const { port, urlScheme } = await openWorkerPort(mode, opts.workerUrl, workerName, log);
1784
+ log?.(`tab: worker loaded via ${urlScheme}${urlScheme === "blob" ? " (fallback — cross-tab sharing unavailable)" : ""}`);
1785
+ let phase = "awaiting-welcome";
1786
+ let sessionId = null;
1787
+ let sessionToken = null;
1788
+ let effectiveTabId = tabId;
1789
+ let resolveWelcome;
1790
+ const welcomePromise = new Promise((res) => {
1791
+ resolveWelcome = res;
1792
+ });
1793
+ port.setHandler((data) => {
1794
+ const msg = data;
1795
+ if (msg.type === "log") {
1796
+ log?.(`worker: ${msg.msg}`);
1797
+ return;
1798
+ }
1799
+ if (phase === "awaiting-welcome") {
1800
+ if (msg.type === "welcome" || msg.type === "dead") {
1801
+ phase = msg.type === "welcome" ? "active" : "dead";
1802
+ resolveWelcome(msg);
1803
+ }
1804
+ return;
1805
+ }
1806
+ if (msg.type === "state" && sessionId !== null) {
1807
+ opts.onStateChange?.({
1808
+ sessionId,
1809
+ tabId: effectiveTabId,
1810
+ connected: msg.connected,
1811
+ sessionToken
1812
+ });
1813
+ return;
1814
+ }
1815
+ if (msg.type === "dead") {
1816
+ phase = "dead";
1817
+ if (sessionId !== null) opts.onStateChange?.({
1818
+ sessionId,
1819
+ tabId: effectiveTabId,
1820
+ connected: false,
1821
+ sessionToken
1822
+ });
1823
+ opts.onTerminate?.({ reason: msg.reason });
1824
+ }
1825
+ });
1826
+ const autoUA = collectUserAgentContext();
1827
+ const context = {
1828
+ ...autoUA ? { userAgent: autoUA } : {},
1829
+ ...opts.context ?? {}
1830
+ };
1831
+ port.postMessage({
1832
+ type: "hello",
1833
+ apiUrl: opts.apiUrl,
1834
+ websocketUrl: opts.websocketUrl,
1835
+ clientSecret: opts.clientSecret,
1836
+ context,
1837
+ forceRecord: opts.forceRecord,
1838
+ sessionIdHint: sessionHint?.id,
1839
+ sessionTokenHint: sessionHint?.token,
1840
+ tabId,
1841
+ debugLogs: log !== void 0
1842
+ });
1843
+ log?.("tab: hello sent, awaiting welcome");
1844
+ const timeoutMs = opts._welcomeTimeoutMs ?? WELCOME_TIMEOUT_MS;
1845
+ let welcomeTimer;
1846
+ const welcomeDeadline = new Promise((_, reject) => {
1847
+ port.onError((err) => reject(err));
1848
+ welcomeTimer = setTimeout(() => reject(/* @__PURE__ */ new Error(`uploader: welcome timeout. The worker did not respond within ${timeoutMs / 1e3}s. This may indicate a CSP policy blocking the worker script from loading. Check your browser console for errors.`)), timeoutMs);
1849
+ });
1850
+ welcomeDeadline.catch(() => {});
1851
+ const welcome = await Promise.race([welcomePromise.then((msg) => {
1852
+ clearTimeout(welcomeTimer);
1853
+ return msg;
1854
+ }), welcomeDeadline]);
1855
+ log?.(welcome.type === "welcome" ? `tab: welcome (${"sessionId" in welcome.result ? `sessionId=${welcome.result.sessionId}` : "skipRecording"})` : `tab: dead reason=${welcome.reason}`);
1856
+ if (welcome.type === "dead") throw new Error(`uploader: ${welcome.reason}`);
1857
+ if ("skipRecording" in welcome.result) {
1858
+ if (opts.forceRecord) log?.("tab: forceRecord was set but backend still skipped — backend may not support forceRecord yet");
1859
+ return null;
1860
+ }
1861
+ sessionId = welcome.result.sessionId;
1862
+ sessionToken = welcome.result.sessionToken;
1863
+ writeSession(welcome.result.sessionId, welcome.result.sessionToken);
1864
+ if (welcome.newTabId !== void 0) {
1865
+ effectiveTabId = welcome.newTabId;
1866
+ sessionStorage.setItem(STORAGE_TAB_ID, effectiveTabId);
1867
+ }
1868
+ let counter = welcome.resetCounter ? 0 : counterHint;
1869
+ let nextAdoptionMeta = welcome.adoptedFromSessionId !== void 0 ? {
1870
+ adoptedFromSessionId: welcome.adoptedFromSessionId,
1871
+ adoptedAt: Date.now()
1872
+ } : void 0;
1873
+ opts.onStateChange?.({
1874
+ sessionId,
1875
+ tabId: effectiveTabId,
1876
+ connected: true,
1877
+ sessionToken
1878
+ });
1879
+ const flush = () => {
1880
+ writeCounter(counter);
1881
+ };
1882
+ window.addEventListener("pagehide", () => {
1883
+ flush();
1884
+ try {
1885
+ port.postMessage({
1886
+ type: "bye",
1887
+ reason: "pagehide"
1888
+ });
1889
+ } catch (_e) {}
1890
+ });
1891
+ document.addEventListener("visibilitychange", () => {
1892
+ if (document.visibilityState === "hidden") flush();
1893
+ });
1894
+ const uploader = ((event) => {
1895
+ if (phase === "dead") throw new Error("uploader: terminated");
1896
+ const frame = {
1897
+ tabId: effectiveTabId,
1898
+ eventCounter: counter,
1899
+ data: event,
1900
+ ...nextAdoptionMeta ?? {}
1901
+ };
1902
+ counter += 1;
1903
+ nextAdoptionMeta = void 0;
1904
+ port.postMessage({
1905
+ type: "frame",
1906
+ frame
1907
+ });
1908
+ });
1909
+ uploader.close = () => {
1910
+ flush();
1911
+ try {
1912
+ port.postMessage({
1913
+ type: "bye",
1914
+ reason: "stop"
1915
+ });
1916
+ } catch (_e) {}
1917
+ };
1918
+ return uploader;
1919
+ }
1920
+ function resolveMode(mode) {
1921
+ if (mode === "auto") return typeof SharedWorker !== "undefined" ? "shared" : "dedicated";
1922
+ return mode;
1923
+ }
1924
+ async function openWorkerPort(mode, workerUrl, workerName, log) {
1925
+ if (workerUrl) return {
1926
+ port: createWorker(mode, workerUrl, workerName),
1927
+ urlScheme: "custom"
1928
+ };
1929
+ const dataUrl = toDataUrl(workerScript);
1930
+ try {
1931
+ const port = createWorker(mode, dataUrl, workerName);
1932
+ await new Promise((resolve) => setTimeout(resolve, 0));
1933
+ const asyncErr = port.getBufferedError();
1934
+ if (asyncErr) throw asyncErr;
1935
+ return {
1936
+ port,
1937
+ urlScheme: "data"
1938
+ };
1939
+ } catch (_dataErr) {
1940
+ log?.("tab: data: worker blocked, falling back to blob: URL (dedicated mode)");
1941
+ const blobUrl = toBlobUrl(workerScript);
1942
+ try {
1943
+ return {
1944
+ port: createDedicatedWorker(blobUrl),
1945
+ urlScheme: "blob"
1946
+ };
1947
+ } catch (blobErr) {
1948
+ const hint = "Your Content Security Policy blocks both `data:` and `blob:` in `worker-src`. To fix this, either add `blob:` to your `worker-src` directive, or use the `workerUrl` option to serve the worker script from your own origin.";
1949
+ log?.(`tab: worker-load-failed: ${hint}`);
1950
+ throw new Error(`worker-load-failed: ${hint}`, blobErr instanceof Error ? { cause: blobErr } : void 0);
1951
+ }
1952
+ }
1953
+ }
1954
+ function createWorker(mode, url, workerName) {
1955
+ if (mode === "shared") return createSharedWorker(url, workerName);
1956
+ return createDedicatedWorker(url);
1957
+ }
1958
+ function createSharedWorker(url, name) {
1959
+ const options = {
1960
+ name,
1961
+ type: "module",
1962
+ extendedLifetime: true
1963
+ };
1964
+ const worker = new SharedWorker(url, options);
1965
+ let errorCb = null;
1966
+ let bufferedError = null;
1967
+ worker.onerror = (e) => {
1968
+ const err = workerLoadError(e, url);
1969
+ if (errorCb) errorCb(err);
1970
+ else bufferedError = err;
1971
+ };
1972
+ worker.port.start();
1973
+ return {
1974
+ postMessage: (m) => worker.port.postMessage(m),
1975
+ setHandler: (cb) => {
1976
+ worker.port.onmessage = (e) => cb(e.data);
1977
+ },
1978
+ onError: (cb) => {
1979
+ errorCb = cb;
1980
+ if (bufferedError) cb(bufferedError);
1981
+ },
1982
+ getBufferedError: () => bufferedError
1983
+ };
1984
+ }
1985
+ function createDedicatedWorker(url) {
1986
+ const worker = new Worker(url, { type: "module" });
1987
+ let errorCb = null;
1988
+ let bufferedError = null;
1989
+ worker.onerror = (e) => {
1990
+ const err = workerLoadError(e, url);
1991
+ if (errorCb) errorCb(err);
1992
+ else bufferedError = err;
1993
+ };
1994
+ return {
1995
+ postMessage: (m) => worker.postMessage(m),
1996
+ setHandler: (cb) => {
1997
+ worker.onmessage = (e) => cb(e.data);
1998
+ },
1999
+ onError: (cb) => {
2000
+ errorCb = cb;
2001
+ if (bufferedError) cb(bufferedError);
2002
+ },
2003
+ getBufferedError: () => bufferedError
2004
+ };
2005
+ }
2006
+ function workerLoadError(cause, url) {
2007
+ const msg = `worker-load-failed: ${url.startsWith("data:") ? "This is likely caused by a Content Security Policy (CSP) that blocks `data:` in `worker-src`. To fix this, either add `data:` to your `worker-src` directive, or use the `workerUrl` option to serve the worker script from your own origin." : `Failed to load the worker script from ${url}. Check that the URL is reachable and that your CSP \`worker-src\` directive allows it.`}`;
2008
+ return new Error(msg, cause instanceof Error ? { cause } : void 0);
2009
+ }
2010
+ function toDataUrl(script) {
2011
+ const bytes = new TextEncoder().encode(script);
2012
+ let binary = "";
2013
+ for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]);
2014
+ return `data:application/javascript;base64,${btoa(binary)}`;
2015
+ }
2016
+ function toBlobUrl(script) {
2017
+ return URL.createObjectURL(new Blob([script], { type: "application/javascript" }));
2018
+ }
2019
+ async function hashSecret(secret) {
2020
+ const buf = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(secret));
2021
+ return Array.from(new Uint8Array(buf)).slice(0, 8).map((b) => b.toString(16).padStart(2, "0")).join("");
2022
+ }
2023
+ function readOrMintTabId() {
2024
+ let id = sessionStorage.getItem(STORAGE_TAB_ID);
2025
+ if (!id) {
2026
+ id = crypto.randomUUID();
2027
+ sessionStorage.setItem(STORAGE_TAB_ID, id);
2028
+ }
2029
+ return id;
2030
+ }
2031
+ function readSessionHint(ttlMs) {
2032
+ const raw = sessionStorage.getItem(STORAGE_SESSION);
2033
+ if (!raw) return null;
2034
+ try {
2035
+ const parsed = JSON.parse(raw);
2036
+ if (Date.now() - parsed.ts > ttlMs) return null;
2037
+ if (!parsed.token) return null;
2038
+ return {
2039
+ id: parsed.id,
2040
+ token: parsed.token
2041
+ };
2042
+ } catch (_e) {
2043
+ return null;
2044
+ }
2045
+ }
2046
+ function writeSession(sessionId, sessionToken) {
2047
+ sessionStorage.setItem(STORAGE_SESSION, JSON.stringify({
2048
+ id: sessionId,
2049
+ token: sessionToken,
2050
+ ts: Date.now()
2051
+ }));
2052
+ }
2053
+ function readCounter() {
2054
+ const raw = sessionStorage.getItem(STORAGE_COUNTER);
2055
+ if (!raw) return 0;
2056
+ const n = Number(raw);
2057
+ return Number.isFinite(n) ? n : 0;
2058
+ }
2059
+ function writeCounter(counter) {
2060
+ sessionStorage.setItem(STORAGE_COUNTER, String(counter));
2061
+ }
2062
+ //#endregion
2063
+ export { workerScript as n, createUploader as t };