@tengence/track-sdk-web 1.2.1 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -21,9 +21,10 @@ const client = TrackSDK.init({
21
21
  // 可选,不传则需 apiKey 或 setToken;authUrl 服务的特定参数(如 module=track)放入查询串,SDK 请求体固定为空对象 {}
22
22
  authUrl: "https://www.tengence.com/wp-json/tengence/v1/auth/access-token?module=track",
23
23
  platform: "web", // web/h5/ios/android/wechat_miniprogram/alipay_miniprogram,缺省按 UA 推断 web/h5
24
- traceBehavior: true,
25
- traceError: true,
26
- tracePerformance: true,
24
+ // 采集范围由 dataTypes 单一旋钮控制(默认全量 auto/behavior/performance/error):
25
+ // 优先级 使用方显式(此处/运行时 setConfig)> 远程配置(collect 下发)> 内置默认。
26
+ // 原 traceBehavior/tracePerformance/traceError 三个开关已在 v2 移除(见「变更与迁移」)。
27
+ dataTypes: ["auto", "behavior", "performance", "error"],
27
28
  });
28
29
  ```
29
30
 
@@ -152,7 +153,7 @@ client.registerGlobalProperties({
152
153
 
153
154
  ## 自动采集事件(全埋点,v1.1.13 补全)
154
155
 
155
- `traceBehavior: true`(默认)时自动采集以下事件,无需业务手动 `track`:
156
+ 采集范围由 `dataTypes` 控制:默认全量(auto/behavior/performance/error);`dataTypes` 含 `auto` 时自动采集以下事件,无需业务手动 `track`:
156
157
 
157
158
  | 事件 | 触发 | 说明 |
158
159
  | --- | --- | --- |
@@ -250,6 +251,16 @@ client.registerGlobalProperties({
250
251
  | 定时器到点强制发送 | 修复"定时到点仅检查条数不发送"问题(低流量页面数据可能长期滞留):周期定时器到点即发送(时间触发),与"满 100 条 / 满 56KB / 每 5 秒"语义一致 |
251
252
  | 冒烟测试 | 新增 T(413 降容)/ U(onDrop 四场景),22/22 全绿;场景隔离增强(resetCalls 清空 storage,避免前序滞留数据污染) |
252
253
 
254
+ ## v2 破坏性变更与迁移(线上配置下发链路)
255
+
256
+ | 变更 | 说明 |
257
+ | --- | --- |
258
+ | 移除 trace 开关 | `traceBehavior`/`tracePerformance`/`traceError` **彻底移除(不保留、不做废弃标记)**,采集范围统一由 `dataTypes` 单一旋钮控制(默认全量 `["auto","behavior","performance","error"]`)。迁移:删除 init 中的这三个参数即可(原为 true 的行为即默认全量;`dataTypes:["behavior"]` 等价于旧 `traceBehavior:false` + 仅行为)。 |
259
+ | 三源优先级 | 采集/采样/节奏/开关的生效值为 **使用方显式 > 远程配置 > 内置默认**:① 使用方(init `dataTypes` 等 + 运行时 `client.setConfig(patch)`)最高;② 远程配置(后端经 collect `/v1/track/config` 下发,DI 控制台可设)次之,覆盖默认;③ 内置默认兜底。远程不可改安全地址(`pushUrl`/`authUrl`/`realTimeUrl`/`apiKey`)与合规隐私(`enableTracking`/`respectGpc`/`sanitize`)。 |
260
+ | 新增 `setConfig`/`getConfig` | `client.setConfig({ ... })` 运行时注入显式配置并重算生效值(优先级最高);`client.getConfig()` 读取当前生效配置。仅接受可下发可控键(`dataTypes`/`enableScroll`/`enableFormTrack`/`enableAutoSessionId`/`errorTraceRate`/`reportInterval`/`cacheNumber`/`maxCacheSize`/`maxRetries`/`resourceFlowLimit`)。 |
261
+ | 远程可下发键扩展 | 远程配置除 `dataTypes`/`idFieldName` 外,新增 `errorTraceRate`/`reportInterval`/`cacheNumber`/`maxCacheSize`/`maxRetries`/`resourceFlowLimit`/`enableScroll`/`enableFormTrack`/`enableAutoSessionId`(仅当下发的键生效,未下发回退默认)。 |
262
+ | 上报周期热更新 | 远程下发变更 `reportInterval` 或使用方 `setConfig` 改 `reportInterval` 时,SDK 级联重置普通通道周期定时器(新周期下次调度生效);实时通道周期不参与远程下发。 |
263
+
253
264
  ## v1.1.8 变更(自 v1.1.7)
254
265
 
255
266
  | 变更 | 说明 |
package/dist/client.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { BaseOptions, ReportData, TrackFunction, RegisterProperties, DropReason, SdkError } from "./interface";
1
+ import { BaseOptions, ReportData, TrackFunction, RegisterProperties, DropReason, SdkError, SdkConfigPatch } from "./interface";
2
2
  declare global {
3
3
  interface Window {
4
4
  trackMonitor: {
@@ -11,6 +11,8 @@ declare global {
11
11
  setToken: (token?: string) => void;
12
12
  registerGlobalProperties: (props: RegisterProperties) => void;
13
13
  enableTracking: (flag?: boolean) => boolean;
14
+ setConfig: (patch: SdkConfigPatch) => void;
15
+ getConfig: () => Record<string, unknown>;
14
16
  };
15
17
  }
16
18
  }
@@ -26,9 +28,6 @@ interface SdkOptions {
26
28
  isLogger: boolean;
27
29
  errorTraceRate: number;
28
30
  resourceFlowLimit: number;
29
- traceBehavior: boolean;
30
- tracePerformance: boolean;
31
- traceError: boolean;
32
31
  enableAutoSessionId: boolean;
33
32
  sanitize: {
34
33
  stripQuery: boolean;
@@ -40,6 +39,8 @@ interface SdkOptions {
40
39
  enableTracking: boolean;
41
40
  respectGpc: boolean;
42
41
  requestTimeout: number;
42
+ configUrl: string;
43
+ configTtl: number;
43
44
  onError?: (err: SdkError) => void;
44
45
  }
45
46
  export declare let options: SdkOptions | undefined;
@@ -54,6 +55,20 @@ declare const createBrowserClient: (opt: BaseOptions) => {
54
55
  setToken: (token?: string) => void;
55
56
  registerGlobalProperties: (props: RegisterProperties) => void;
56
57
  enableTracking: (flag?: boolean) => boolean;
58
+ setConfig: (patch: SdkConfigPatch) => void;
59
+ getConfig: () => {
60
+ dataTypes: import("./interface").DataType[];
61
+ idFieldName: string;
62
+ errorTraceRate: number;
63
+ reportInterval: number;
64
+ cacheNumber: number;
65
+ maxCacheSize: number;
66
+ maxRetries: number;
67
+ resourceFlowLimit: number;
68
+ enableScroll: boolean;
69
+ enableFormTrack: boolean;
70
+ enableAutoSessionId: boolean;
71
+ };
57
72
  };
58
73
  beforeClose: () => void;
59
74
  };
@@ -0,0 +1,67 @@
1
+ import { DataType, BaseOptions } from "./interface";
2
+ /**
3
+ * SDK 三源配置合并引擎(线上配置下发链路 v2)
4
+ *
5
+ * 优先级(业界对齐 ConfigCat LocalOverRemote / Adobe programmatic-over-base /
6
+ * Tealium Prism「程序化 > 远程 JSON > 基础配置」):
7
+ * 使用方显式(L2) > 远程配置(L1) > 内置默认(L0)
8
+ *
9
+ * 三层分开保存(不把合并值写回各层),运行时取 resolved[k] = explicit[k] ?? remote[k] ?? default[k],
10
+ * 由此天然实现「使用方显式覆盖远程、远程覆盖默认」,无需额外判断谁的来源优先级更高。
11
+ *
12
+ * 可下发键(TRACK 契约):dataTypes / idFieldName / 采样 / 节奏 / 开关。
13
+ * 安全地址(pushUrl/authUrl/realTimeUrl/apiKey)与合规隐私(enableTracking/respectGpc/sanitize)
14
+ * 远程不可改 —— 仅默认 + 使用方显式,故不在 REMOTE_CONFIG_KEYS 内。
15
+ */
16
+ export interface SdkConfig {
17
+ /** 采集范围(auto 全埋点 / behavior 行为 / performance 性能 / error 错误) */
18
+ dataTypes: DataType[];
19
+ /** 行为数据主键字段名 */
20
+ idFieldName: string;
21
+ /** 错误采样率(0-1,0 关闭错误上报,1 全量) */
22
+ errorTraceRate: number;
23
+ /** 普通通道上报周期(ms) */
24
+ reportInterval: number;
25
+ /** 缓存条数触发上限 */
26
+ cacheNumber: number;
27
+ /** 缓存体积触发上限(KB) */
28
+ maxCacheSize: number;
29
+ /** 最大重试次数 */
30
+ maxRetries: number;
31
+ /** 资源性能明细条数上限(0-200,0 关闭 resource_flow) */
32
+ resourceFlowLimit: number;
33
+ /** 滚动深度采集 */
34
+ enableScroll: boolean;
35
+ /** 表单交互采集 */
36
+ enableFormTrack: boolean;
37
+ /** 会话自动维护 */
38
+ enableAutoSessionId: boolean;
39
+ }
40
+ /** 内置默认(L0) */
41
+ export declare const DEFAULT_CONFIG: SdkConfig;
42
+ /** 远程可下发键(安全地址 / 采集总闸 / GPC / 脱敏不在此列) */
43
+ export declare const REMOTE_CONFIG_KEYS: (keyof SdkConfig)[];
44
+ /** 远程配置快照(含版本/更新时间元信息,仅承载远程下发键) */
45
+ export type RemoteConfigSnapshot = Partial<SdkConfig> & {
46
+ appId?: string;
47
+ configVersion?: number;
48
+ updatedAt?: string;
49
+ };
50
+ type Listener = () => void;
51
+ /** 重算 resolved:explicit ?? remote ?? default;任一来源变化(init/远程拉取成功/setConfig)时调用 */
52
+ export declare const recompute: () => SdkConfig;
53
+ /** 注入使用方显式层(init 原始 options 的可行键,含运行时 setConfig 增量) */
54
+ export declare const setExplicitConfig: (raw: Partial<BaseOptions>) => SdkConfig;
55
+ /** 应用远程配置(拉取成功或命中缓存时注入 L1;null 表示无远程,回退默认) */
56
+ export declare const applyRemoteConfig: (remote: RemoteConfigSnapshot | null) => SdkConfig;
57
+ /** 当前生效配置(合并后) */
58
+ export declare const getConfig: () => SdkConfig;
59
+ /** 当前远程配置快照(仅远程下发键;无则为 null) */
60
+ export declare const getRemoteConfig: () => RemoteConfigSnapshot | null;
61
+ /** 数据类型是否允许采集/上报(按合并后 dataTypes) */
62
+ export declare const isDataTypeEnabled: (dataType?: string) => boolean;
63
+ /** 订阅配置变更(recompute 触发);返回取消订阅函数 */
64
+ export declare const onConfigChange: (fn: Listener) => (() => void);
65
+ /** 仅测试/内省用:取显式层 */
66
+ export declare const getExplicitConfig: () => Partial<SdkConfig>;
67
+ export {};
package/dist/index.d.ts CHANGED
@@ -9,5 +9,7 @@ declare const init: (opt: BaseOptions) => {
9
9
  setToken: (token?: string | undefined) => void;
10
10
  registerGlobalProperties: (props: import("./interface").RegisterProperties) => void;
11
11
  enableTracking: (flag?: boolean | undefined) => boolean;
12
+ setConfig: (patch: Partial<Pick<BaseOptions, "dataTypes" | "enableScroll" | "enableFormTrack" | "enableAutoSessionId" | "errorTraceRate" | "reportInterval" | "cacheNumber" | "maxCacheSize" | "maxRetries" | "resourceFlowLimit">>) => void;
13
+ getConfig: () => Record<string, unknown>;
12
14
  };
13
15
  export default init;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- class e extends Error{status;constructor(e,t){super(t||`[TM]: Auth error ${e}`),this.name="AuthError",this.status=e}}const t=({method:e,url:t,data:r,headers:n={},withCredentials:o=!1,timeoutMs:i})=>new Promise(((a,s)=>{const c=new XMLHttpRequest;c.open(e,t,!0),i&&(c.timeout=i),Object.keys(n).forEach((e=>{c.setRequestHeader(e,n[e])})),c.withCredentials=!!o,c.onreadystatechange=()=>{if(4===c.readyState)if(c.status>=200&&c.status<300)try{const e=JSON.parse(c.responseText);a(e)}catch(e){s(e)}else{const e=new Error(`[TM]: Request failed with status ${c.status}`);e.status=c.status,s(e)}},c.onerror=()=>{s(new Error("[TM]: Network error"))},c.ontimeout=()=>{const e=new Error("[TM]: Request timeout");e.timeout=!0,s(e)},r?c.send(r):c.send()})),r=(e,t,r)=>{if(!r)return fetch(e,t);const n=new AbortController,o=setTimeout((()=>n.abort()),r);return fetch(e,{...t,signal:n.signal}).catch((e=>{if(e&&"AbortError"===e.name){const e=new Error("[TM]: Request timeout");throw e.timeout=!0,e}throw e})).finally((()=>clearTimeout(o)))},n=(n,o,i,a)=>{const s={"Content-Type":"application/json"};i&&(s.Authorization=`Bearer ${i}`);const c=()=>t({method:"POST",url:n,data:JSON.stringify(o),headers:s,withCredentials:!0,timeoutMs:a});return"function"!=typeof fetch?c():r(n,{method:"POST",keepalive:!0,credentials:"include",headers:s,body:JSON.stringify(o)},a).then((t=>{if(401===t.status||403===t.status)throw new e(t.status,`[TM]: Auth error ${t.status}`);if(429===t.status){const e=new Error("[TM]: Request throttled with status 429");e.status=429;const r=t.headers.get("Retry-After");if(r){const t=parseInt(r,10);isNaN(t)||(e.retryAfter=1e3*t)}throw e}if(!t.ok){const e=new Error(`[TM]: Request failed with status ${t.status}`);throw e.status=t.status,e}return t.json()})).catch((t=>{if(t instanceof e)throw t;if(t&&t.status)throw t;return c()}))},o=window.requestIdleCallback||window.requestAnimationFrame||(e=>setTimeout(e,17));function i(e,t=150,r=!1){let n=null;return function(...o){const i=this,a=r&&!n;n&&clearTimeout(n),n=setTimeout((()=>{n=null,r||e.apply(i,o)}),t),a&&e.apply(i,o)}}const a=(e,t=300)=>{let r=0;return function(...n){const o=Date.now();o-r>=t&&(r=o,e.apply(this,n))}};function s(e,t=""){if(!e)return t;const r=e.parentElement,{id:n}=e,o=e.tagName.toLowerCase(),i=t?`>${t}`:"";return r&&r!==document.documentElement&&r!==document.body?n?`#${n}${i}`:s(r,`${o}${i}`):`${o}${i}`}const c=()=>{if(window.performance?.navigation)return performance.navigation.type;if(window.performance?.getEntriesByType){const e=performance.getEntriesByType("navigation");if(e.length>0)return e[0].type}return 255},l=e=>{"prerendering"in document&&document.prerendering?(e=>{"prerendering"in document&&document.prerendering?addEventListener("prerenderingchange",(()=>e()),!0):e()})((()=>l(e))):"complete"!==document?.readyState?addEventListener("load",(()=>l(e)),!0):setTimeout(e)};function d(e){return"number"!=typeof e||!isFinite(e)||e<0?null:Math.round(100*e)/100}function u(){const e=new Uint8Array(16);if("undefined"!=typeof crypto&&"function"==typeof crypto.getRandomValues)crypto.getRandomValues(e);else for(let t=0;t<16;t++)e[t]=Math.floor(256*Math.random());e[6]=15&e[6]|64,e[8]=63&e[8]|128;let t="";for(let r=0;r<16;r++)t+=(e[r]<16?"0":"")+e[r].toString(16);return t}const m=e=>e instanceof ErrorEvent?"Script error."===e.message?"cors":"js":"resource",p=e=>(e=>{let t=5381;for(let r=0;r<e.length;r++)t=(t<<5)+t+e.charCodeAt(r)>>>0;return t.toString(16).padStart(8,"0")})(e)+(e=>{let t=5381;for(let r=e.length-1;r>=0;r--)t=((t<<5)+t^e.charCodeAt(r))>>>0;return t.toString(16).padStart(8,"0")})(e);const f={view:"#3b82f6",click:"#06b6d4",expose:"#8b5cf6",enter:"#10b981",leave:"#f59e0b",stay:"#84cc16",cart:"#ec4899",buy:"#ef4444",pay:"#dc2626",default:"#6b7280"},h={view:"👁️",click:"👆",expose:"✨",enter:"🚪",leave:"👋",stay:"⏱️",cart:"🛒",buy:"💰",pay:"💳",default:"📊"},g={common:"#3b82f6",behavior:"#10b981",performance:"#f59e0b",error:"#ef4444",custom:"#8b5cf6",default:"#6b7280"},y=(e,t)=>{t.forEach(((t,r)=>{const n=t.event_type||"unknown",o=t.data_type||"auto",i=(e=>f[e]||f.default)(n),a=(e=>g[e]||g.default)(o),s=(e=>h[e]||h.default)(n);let c=t.event_detail;if("string"==typeof c)try{c=JSON.parse(c)}catch(e){}console.groupCollapsed(`%c${s} [TM-${e}] %c${o.toUpperCase()}%c → %c${n.toUpperCase()}%c #${r+1}`,"color: #6b7280; font-weight: bold;",`color: ${a}; font-weight: bold; background: ${a}20; padding: 2px 6px; border-radius: 3px;`,"color: #6b7280;",`color: ${i}; font-weight: bold; background: ${i}20; padding: 2px 6px; border-radius: 3px;`,"color: #6b7280; font-weight: normal;");const l={...t,event_detail:c};console.log("%c"+JSON.stringify(l,null,2),"color: #6b7280; font-family: monospace; font-size: 11px; line-height: 1.5;"),console.groupEnd()})),console.log(`%c✅ [TM] 本次通过 ${e} 上报 ${t.length} 条埋点数据`,"color: #10b981; font-weight: bold; font-size: 12px; padding: 4px 8px; background: #10b98120; border-radius: 4px; border-left: 3px solid #10b981;")};let w;const v="TRACK_MONITOR_DATA",T="MONITOR_REAL_TIME_DATA",_="TRACK_MONITOR_USER",b="tengence_device_id",S="tengence_register_properties",E="TRACK_MONITOR_LOGGER",k="tengence_tracking_enabled",x=2e3,M="tengence_access_token";let A=null,L=null;const C=e=>((e,n,o)=>{const i={"Content-Type":"application/json"},a=()=>t({method:"POST",url:e,data:JSON.stringify(n),headers:i,withCredentials:!0,timeoutMs:o});return"function"!=typeof fetch?a():r(e,{method:"POST",credentials:"include",headers:i,body:JSON.stringify(n)},o).then((e=>{if(!e.ok){const t=new Error(`[TM]: Request failed with status ${e.status}`);throw t.status=e.status,t}return e.json()})).catch((e=>{if(e&&e.status)throw e;return a()}))})(e,{},w?.requestTimeout).then((e=>{const t=e&&e.data,r=t&&t.accessToken,n=t&&t.accessExpAt;if(!r||"number"!=typeof n)throw new Error("[TM]: authUrl 响应缺少 accessToken/accessExpAt");return((e,t)=>{A={token:e,expAt:t};try{localStorage.setItem(M,JSON.stringify({token:e,expAt:t}))}catch(e){}})(r,n),r})),R=e=>{const t=(()=>{if(A)return A;try{const e=localStorage.getItem(M);if(!e)return null;const t=JSON.parse(e);if(t&&"string"==typeof t.token&&t.token&&"number"==typeof t.expAt)return A={token:t.token,expAt:t.expAt},A}catch(e){}return null})();return(r=t)&&r.token.length>0&&r.expAt-6e4>Date.now()?Promise.resolve(t.token):(L||(L=C(e).catch((e=>{throw e})).finally((()=>{L=null}))),L);var r},I={timer:null,promise:null},$={timer:null,promise:null},q=e=>{const t=JSON.stringify(e);return(new TextEncoder).encode(t).length/1024};let N=null;const P=()=>{if(N)return N;try{const e=localStorage.getItem(S),t=e?JSON.parse(e):{};return N=t,t}catch(e){return console.error("[TM]: get register properties fail: ",e),{}}},O=e=>{N=e;try{localStorage.setItem(S,JSON.stringify(e))}catch(e){console.error("[TM]: save register properties fail: ",e)}},U=e=>{if(!e||"object"!=typeof e||Array.isArray(e))return void console.error("[TM]: registerGlobalProperties props must be a plain object");const t={...P(),...e},r=Object.keys(t);if(r.length>50){const e={};return r.slice(0,50).forEach((r=>{e[r]=t[r]})),console.warn("[TM]: register properties exceed max 50 keys, extra keys dropped"),void O(e)}O(t)},B=e=>{const t=document.cookie.match(new RegExp("(?:^|;\\s*)"+e+"=([^;]*)"));return t?decodeURIComponent(t[1]):void 0},z=e=>{document.cookie=`${b}=${encodeURIComponent(e)}; Max-Age=63072000; Path=/; Secure; SameSite=Lax`};let D;const F=()=>{if(D)return D;try{let e=localStorage.getItem(b);if(e)return B(b)||z(e),D=e;const t=B(b);if(t){try{localStorage.setItem(b,t)}catch(e){}return D=t}e=u();try{localStorage.setItem(b,e)}catch(e){}return z(e),D=e}catch(e){return void console.error("[TM]: get or create device id fail: ",e)}},j="tengence_session_id",H=()=>{try{const e=sessionStorage.getItem(j);let t=e?JSON.parse(e):null;const r=Date.now();return!t||!t.id||r-t.lastActiveAt>18e5?(t={id:u(),lastActiveAt:r},sessionStorage.setItem(j,JSON.stringify(t))):(t.lastActiveAt=r,sessionStorage.setItem(j,JSON.stringify(t))),t.id}catch(e){return}},J=(e,t)=>{try{const r=new URL(e,location.href);if(!r.searchParams.toString())return e;if(t&&t.length){const e=[];for(const n of t){const t=r.searchParams.get(n);null!==t&&e.push(`${n}=${encodeURIComponent(t)}`)}r.search=e.length?`?${e.join("&")}`:""}else r.search="";return r.toString()}catch(t){return e}},K=(e,t,r)=>{if("string"==typeof e)return t>0&&e.length>t?e.slice(0,t)+"...[truncated]":e;if(Array.isArray(e))return e.map((e=>K(e,t,r)));if(e&&"object"==typeof e){const n={};for(const o of Object.keys(e)){const i=e[o];"string"==typeof i&&/(^|_)url$|(^|_)href$|^referrer$/i.test(o)&&/^https?:\/\//i.test(i)?n[o]=J(i,r):n[o]=K(i,t,r)}return n}return e},W=e=>{const t={page_url:location.href,hostname:window.location.hostname||window.location.host,os:window.navigator.platform,user_id:localStorage.getItem(_)||void 0,user_agent:window.navigator.userAgent,screen_width:window.screen.width,screen_height:window.screen.height,lib_version:"1.2.1",lib_type:"js",event_time:Date.now(),timezone_offset:(new Date).getTimezoneOffset().toString()},r=w?.sanitize;let n;try{n="string"==typeof e.event_detail?e.event_detail:JSON.stringify(r&&(r.maxTextLength>0||r.stripQuery)?K(e.event_detail,r.maxTextLength,r.preserveQueryKeys):e.event_detail)}catch(e){return Y("serialize_failed","事件 event_detail 序列化失败(循环引用/BigInt?),该事件丢弃",{error:e}),void console.warn("[TM]: event_detail 序列化失败,该事件丢弃",e)}return{session_id:e.session_id||(w?.enableAutoSessionId?H():void 0),request_id:e.request_id,event_id:e.event_id||u(),spm:e.spm,data_type:e.data_type||"behavior",event_type:e.event_type,event_detail:n,...t,page_url:r&&r.stripQuery?J(t.page_url,r.preserveQueryKeys):t.page_url,device_id:F(),register_properties:JSON.stringify(P()),platform:e.platform||X}};let X;const Q=()=>{try{return"true"===localStorage.getItem(E)}catch(e){return!1}},G=(e,t,r,n,o)=>void 0===e?t:"number"!=typeof e||Number.isNaN(e)||e<r||e>n?(console.warn(`[TM]: 配置 ${o}=${e} 非法,回退默认值 ${t}`),t):e,V=(e,t)=>{try{w?.onDrop?.(e,t)}catch(e){}},Y=(e,t,r)=>{w?.isLogger&&console.error(`[TM]: ${t}`);try{w?.onError?.({code:e,message:t,context:r})}catch(e){}},Z=()=>{try{const e=localStorage.getItem(k);return null===e||"1"===e}catch(e){return!0}},ee=t=>{const r=t.apiKey;let i;const a=/Android|iPhone|iPad|iPod|Mobile/i.test(window.navigator.userAgent);X=t.platform||(a?"h5":"web"),w={pushUrl:t.pushUrl||"https://api.tengence.com/v1/push/event",authUrl:t.authUrl,realTimeUrl:t.realTimeUrl,cacheNumber:G(t.cacheNumber,100,1,1/0,"cacheNumber"),reportInterval:G(t.reportInterval,5e3,100,1/0,"reportInterval"),realTimeReportInterval:G(t.realTimeReportInterval,200,100,1/0,"realTimeReportInterval"),maxCacheSize:G(t.maxCacheSize,56,1,1/0,"maxCacheSize"),maxRetries:G(t.maxRetries,10,0,1/0,"maxRetries"),isLogger:t.isLogger??Q(),errorTraceRate:G(t.errorTraceRate,.5,0,1,"errorTraceRate"),resourceFlowLimit:G(t.resourceFlowLimit,15,0,200,"resourceFlowLimit"),traceBehavior:t.traceBehavior??!0,tracePerformance:t.tracePerformance??!0,traceError:t.traceError??!0,sanitize:!1===t.sanitize?{stripQuery:!1,maxTextLength:0,preserveQueryKeys:[]}:{stripQuery:t.sanitize?.stripQuery??!1,maxTextLength:G(t.sanitize?.maxTextLength,0,0,1/0,"sanitize.maxTextLength"),preserveQueryKeys:t.sanitize?.preserveQueryKeys||[]},enableAutoSessionId:t.enableAutoSessionId??!1,enableTracking:t.enableTracking??Z(),respectGpc:t.respectGpc??!0,requestTimeout:G(t.requestTimeout,1e4,1e3,6e4,"requestTimeout"),beforeSend:t.beforeSend,onDrop:t.onDrop,onError:t.onError};let{pushUrl:s,authUrl:c,realTimeUrl:l,cacheNumber:d,reportInterval:u,realTimeReportInterval:m,maxCacheSize:p,maxRetries:f}=w;r||c||(console.error("[TM]: 未配置 apiKey 或 authUrl,SDK 无法获取上报凭证,数据将不会上报。请配置 apiKey(直连)或 authUrl(自动换取 accessToken),或调用 setToken 注入 accessToken。"),Y("init_missing_credential","未配置 apiKey 或 authUrl,SDK 无法获取上报凭证,数据将不会上报。请配置 apiKey(直连)或 authUrl(自动换取 accessToken),或调用 setToken 注入 accessToken。"));const h={retryCount:0,nextRetryAt:0,retryExhausted:!1,halveBatch:!1},g={retryCount:0,nextRetryAt:0,retryExhausted:!1,halveBatch:!1},b=e=>{try{localStorage.setItem(_,e)}catch(e){console.error("[TM]: monitor bind user fail: ",e)}},S=()=>{localStorage.removeItem(_)},L={},C={},N=new Set;let P=null;const O=()=>{null!==P&&(clearTimeout(P),P=null),N.size&&(N.forEach((e=>{try{localStorage.setItem(e,JSON.stringify(L[e]||[]))}catch(t){Y("queue_write_failed","写入本地缓存队列失败(隐私模式/容量满?),本次数据仅保留内存",{key:e,error:t})}})),N.clear())},B=e=>{if(L[e])return L[e];let t=[];try{t=JSON.parse(localStorage.getItem(e)||"[]")}catch(t){Y("queue_read_failed","读取本地缓存队列失败,按空队列处理",{key:e,error:t})}return L[e]=t,C[e]=t.reduce(((e,t)=>e+q(t)),0),L[e]},z=(e,t)=>{N.delete(e),L[e]=t,C[e]=t.reduce(((e,t)=>e+q(t)),0);try{localStorage.setItem(e,JSON.stringify(t))}catch(t){Y("queue_write_failed","写入本地缓存队列失败(隐私模式/容量满?),队列清空处理",{key:e,error:t});try{localStorage.setItem(e,"[]")}catch(t){Y("localstorage_unavailable","localStorage 不可用,本次数据仅保留内存",{key:e,error:t})}}},D=e=>{i=e},F=async(t,o,a=!1)=>{const d=t&&l?l:s;let u;try{u=r||i||(c?await R(c):void 0)}catch(e){throw Y("token_fetch_failed","从 authUrl 获取 accessToken 失败,本批暂不上报(保留队列待重试)",{authUrl:c,error:e}),e}if(!u)throw Y("init_missing_credential","未配置 apiKey/authUrl 且未注入 accessToken,本次数据未上报(保留缓存队列待重试)"),new Error("[TM]: credential missing, skip report");w?.isLogger&&y(t?"RealTimeFetch":"Fetch",o);const m=w?.beforeSend?(()=>{let e;try{e=w.beforeSend(o)}catch(e){Y("before_send_failed","beforeSend 钩子抛错,本次按原始数据发送",{error:e})}return Array.isArray(e)?e:o})():o,p=a?void 0:w?.requestTimeout;return n(d,{data:m},u,p).catch((async t=>{const o=t?.status;if((t instanceof e||401===o||403===o)&&!r&&!i&&c){(()=>{A=null;try{localStorage.removeItem(M)}catch(e){}})();const e=await R(c).catch((()=>{}));if(e)return n(d,{data:m},e,p);Y("token_invalid","上报 401/403 且刷新 accessToken 失败,本批暂不上报(保留队列待重试)",{authUrl:c})}throw t}))},j=(e,t)=>{const r=new Set(t.filter((e=>!!e)));if(!r.size)return;const n=B(e);if(!n.length)return;const o=n.filter((e=>e.event_id&&!r.has(e.event_id)));o.length!==n.length&&z(e,o)},H=(e,t,r=0)=>{const n=(t?m:u)*Math.pow(2,e)*(.8+.4*Math.random()),o=Math.min(n,6e4);return Math.max(o,r)},J=(e,t)=>{const r=q(t);if(r>=64)return V([t],"item_too_large"),void console.warn("[TM]: 单条事件超过体积上限(64KB),丢弃该条");const n=B(e);if(n.unshift(t),C[e]+=r,n.length>x){const t=n.length-x,r=n.splice(n.length-t,n.length);C[e]=n.reduce(((e,t)=>e+q(t)),0),V(r,"queue_overflow"),console.warn(`[TM]: 队列超过上限(2000条),丢弃最旧 ${t} 条`)}(e=>{N.add(e),null===P&&(P=setTimeout((()=>{P=null,O()}),200))})(e),K(e,C[e]>=p)},K=(e,t=!1,r=!1)=>{if(!w?.enableTracking)return;let n=B(e);if(!n.length)return;const o=(e=>e===T)(e),i=o?$:I,a=(e=>e?g:h)(o);if(a.halveBatch&&n.length>1&&(n=n.slice(0,Math.ceil(n.length/2))),a.retryExhausted)return;if(Date.now()<a.nextRetryAt)return void(null===i.timer&&(i.timer=setTimeout((()=>{i.timer=null,K(e)}),a.nextRetryAt-Date.now())));if(0!==a.retryCount||(n.length>=d||t)){if(null!==i.timer&&(clearTimeout(i.timer),i.timer=null),i.promise)return;i.promise=(async(e,t,r,n,o=!1)=>{const i=[];let a=[],s=0;for(const e of t){const t=1024*q(e);a.length&&s+t>65536&&(i.push(a),a=[],s=0),a.push(e),s+=t}a.length&&i.push(a);for(const t of i){const n=await F(r,t,o),i=n?.data?.accepted_ids,a=n?.data?.rejected_ids;if(Array.isArray(i)){if(j(e,i),Array.isArray(a)&&a.length){const r=new Set(a);j(e,a);const n=t.filter((e=>e.event_id&&r.has(e.event_id)));n.length&&V(n,"server_rejected"),console.warn(`[TM]: 服务端校验拒绝 ${a.length} 条(永久性拒绝),已从队列移除并通知 onDrop`)}}else j(e,t.map((e=>e.event_id))),w?.isLogger&&console.warn("[TM]: 响应缺少 accepted_ids,按整批成功清理")}n.retryCount=0,n.nextRetryAt=0,n.halveBatch=!1})(e,n,o,a,r).catch((e=>{((e,t,r,n,o)=>{t?.timeout&&Y("request_timeout","上报请求超时,数据保留队列按退避重试",{url:r&&l?l:s,timeoutMs:w?.requestTimeout});const i=t?.status;if(413===i)return void(o.length>1?(n.halveBatch=!0,n.retryCount++,n.nextRetryAt=Date.now()+H(n.retryCount,r,0),console.warn(`[TM]: 批次过大(HTTP 413),降容半批重发(本批 ${o.length} 条)`)):(n.retryExhausted=!0,V(o,"rejected_4xx"),console.warn("[TM]: 单条事件仍超限(HTTP 413),数据保留在队列")));if(i&&i>=400&&i<500&&401!==i&&403!==i&&408!==i&&410!==i&&429!==i)return n.retryExhausted=!0,V(o,"rejected_4xx"),void console.warn(`[TM]: 批次提交被服务端拒绝(HTTP ${i}),数据保留在队列并暂停自动重试`);if(n.retryCount++,n.retryCount>f)return n.retryExhausted=!0,V(o,"retries_exhausted"),void console.warn(`[TM]: 重试次数已达上限(${f}),数据保留在队列(不丢弃),待下次会话或手动触发重试`);const a=429===i&&t?.retryAfter||0;n.nextRetryAt=Date.now()+H(n.retryCount,r,a),console.error(`[TM]: send report fail, retryCount: ${n.retryCount}, next retry after ${Math.round((n.nextRetryAt-Date.now())/1e3)}s`)})(0,e,o,a,n)})).finally((()=>{i.timer=null,i.promise=null,K(e)}))}else if(null===i.timer){const t=o?m:u;i.timer=setTimeout((()=>{i.timer=null,K(e,!0)}),t)}},ee=e=>{if(!w?.enableTracking||w?.respectGpc&&function(){const e="undefined"!=typeof navigator?navigator:void 0;return!0===e?.globalPrivacyControl}())return void(w?.isLogger&&console.warn("[TM]: 用户已选择退出采集(enableTracking=false 或 GPC 信号开启),本事件忽略"));if(!e||"object"!=typeof e)return void console.error("[TM]: track data must be an object");const t=!0===e.track_real_time,r=W(e);if(r)try{J(t&&l?T:v,r)}catch(e){Y("enqueue_failed","事件入队失败",{error:e})}},te=(e,t,r)=>{ee("string"==typeof e?{event_type:e,event_detail:t,...r}:e)},re=()=>{K(v,!0),K(T,!0);const e=[I.promise,$.promise].filter((e=>!!e));return Promise.all(e).then((()=>{}))},ne=()=>{w.isLogger=!0;try{localStorage.setItem(E,"true")}catch(e){console.error("[TM]: enable logger fail:",e)}},oe=()=>{w.isLogger=!1;try{localStorage.setItem(E,"false")}catch(e){console.error("[TM]: disable logger fail:",e)}};o((()=>{K(v,!0),K(T,!0)}));const ie=e=>("boolean"==typeof e&&(w.enableTracking=e,(e=>{try{localStorage.setItem(k,e?"1":"0")}catch(e){}})(e),e?w?.isLogger&&console.warn("[TM]: 恢复采集"):(z(v,[]),z(T,[]),w?.isLogger&&console.warn("[TM]: 用户已选择退出采集,已清空未上报队列"))),!0===w?.enableTracking);return window.trackMonitor={track:te,flush:re,bindUser:b,unBindUser:S,enableLogger:ne,disableLogger:oe,setToken:D,registerGlobalProperties:U,enableTracking:ie},{client:{track:te,flush:re,bindUser:b,unBindUser:S,enableLogger:ne,disableLogger:oe,setToken:D,registerGlobalProperties:U,enableTracking:ie},beforeClose:()=>{const e=()=>{O(),K(v,!0,!0),K(T,!0,!0)};window.addEventListener("beforeunload",e),window.addEventListener("pagehide",e),document.addEventListener("visibilitychange",(()=>{"hidden"===document.visibilityState&&e()})),window.addEventListener("online",e)}}},te=(re=16,function(){const e=new Uint8Array(re);if("undefined"!=typeof crypto&&"function"==typeof crypto.getRandomValues)crypto.getRandomValues(e);else for(let t=0;t<re;t++)e[t]=Math.floor(256*Math.random());let t="";for(let r=0;r<re;r++)t+=(e[r]<16?"0":"")+e[r].toString(16);return t})();var re;const ne=e=>{const t=history[e];return function(){const r=t.apply(this,arguments),n=new Event(e);return window.dispatchEvent(n),r}},oe=e=>{window.addEventListener("replaceState",(t=>e(t)),!0),window.addEventListener("pushState",(t=>e(t)),!0)},ie=e=>{window.addEventListener("popstate",(t=>e(t)),!0)},ae=[25,50,75,90],se=e=>{history.pushState=ne("pushState"),history.replaceState=ne("replaceState"),(()=>{let e="";const t=()=>{const t=window.location.href;if(t===e)return;const{host:r,hostname:n,href:o,protocol:i,origin:a,port:s,pathname:l,search:d,hash:u}=window.location,m={host:r,hostname:n,href:o,protocol:i,origin:a,port:s,pathname:l,search:d,hash:u,title:document.title,language:navigator.language.substring(0,2),user_agent:navigator.userAgent,win_screen:`${window.screen.width}x${window.screen.height}`,doc_screen:`${document.documentElement.clientWidth}x${document.documentElement.clientHeight}`,referrer:document.referrer,type:c()};window.trackMonitor.track({data_type:"auto",event_type:"page_view",event_detail:m}),e=t},r=i(t,200);t(),ie((()=>{r()})),oe((()=>{r()})),window.addEventListener("popstate",(()=>{r()}))})(),(()=>{let e=document.referrer,t=window.location.href,r=Date.now(),n=!0;const o=(n=!1)=>{if(window.location.href!==t||n){const n=Date.now()-r;n>200&&window.trackMonitor.track({data_type:"auto",event_type:"page_leave",event_detail:{url:t,referrer:e,duration:n}}),r=Date.now(),e=t,t=window.location.href}},a=i(o);o(),ie((()=>{a()})),oe((()=>{a()})),document.addEventListener("visibilitychange",(()=>{"hidden"===document.visibilityState?n&&(n=!1,o(!0)):(n=!0,r=Date.now())})),window.addEventListener("beforeunload",(()=>{n&&(n=!1,o(!0))}),!0)})(),(()=>{const e=a((e=>{const t=function(e){if(!e)return;if(["A","INPUT","TEXTAREA","BUTTON"].includes(e.tagName))return e;if(e.hasAttribute("track-click"))return e;return e.closest("a, button, [track-click]")||void 0}(e.target);if(!t)return;const r={element_id:t.id,element_content:t.textContent?.trim().slice(0,200)||null,element_class_name:t.className||null,element_name:t.getAttribute("name")||null,element_type:t.tagName.toLowerCase(),element_path:s(t),scroll_width:document.documentElement.scrollWidth,scroll_height:document.documentElement.scrollHeight,pageX:e.pageX,pageY:e.pageY,ratio:window.devicePixelRatio||1};window.trackMonitor.track({data_type:"auto",event_type:"click",event_detail:r})}));window.addEventListener("click",e,!0)})(),!1!==e?.enableScroll&&(()=>{const e=new Set,t=a((()=>{const r=document.documentElement,n=r.scrollHeight-r.clientHeight;if(n<=0)return;const o=Math.round((window.scrollY||r.scrollTop)/n*100),i=ae.filter((t=>o>=t&&!e.has(t)));i.length&&(i.forEach((t=>{e.add(t),window.trackMonitor.track({data_type:"auto",event_type:"scroll",event_detail:{scroll_depth:t}})})),e.has(90)&&window.removeEventListener("scroll",t))}),300);window.addEventListener("scroll",t,{passive:!0})})()};let ce=null,le=null;const de="track-expose",ue="track-view",me=e=>{try{le=new WeakMap}catch(e){console.error("[TM]: create WeakMap fail: ",e)}const t=(e,t=!1)=>{const n=le?.get(e);if(n&&!t)return;n&&(n.viewTimer&&clearTimeout(n.viewTimer),n.exposeTimer&&clearTimeout(n.exposeTimer));const o=e.dataset.durationView||500,i=e.dataset.durationExpose||500;le?.set(e,{duration_view:o,duration_expose:i,viewTimer:null,exposeTimer:null}),ce?.observe(e),t&&function(e){if(!(e instanceof Element))return!1;if(!function e(t){if(!t)return!0;const r=window.getComputedStyle(t);return"none"!==r.display&&"hidden"!==r.visibility&&0!==parseFloat(r.opacity)&&e(t.parentElement)}(e))return!1;const t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)}(e)&&r(e)},r=t=>{const r=le?.get(t);if(!r)return;const o=t.dataset.eventDetail,i=t.dataset.traceid??void 0,a=t.dataset.spm,s=t.hasAttribute("track-real-time"),c=t.hasAttribute(ue),l=t.hasAttribute(de);c&&l?r.exposeTimer=window.setTimeout((()=>{e({spm:a,request_id:i,data_type:"auto",event_type:"view_expose",event_detail:o,track_real_time:s}),t.removeAttribute(ue),r.exposeTimer=null}),parseInt(r.duration_expose,10)):(c&&(r.viewTimer=window.setTimeout((()=>{e({spm:a,request_id:i,data_type:"auto",event_type:"view",event_detail:o,track_real_time:s}),t.removeAttribute(ue),l&&r.exposeTimer||n(t),r.viewTimer=null}),parseInt(r.duration_view,10))),l&&(r.exposeTimer=window.setTimeout((()=>{e({spm:a,request_id:i,data_type:"auto",event_type:"expose",event_detail:o,track_real_time:s}),r.exposeTimer=null}),parseInt(r.duration_expose,10))))},n=e=>{const t=le?.get(e);t&&(ce?.unobserve(e),t.viewTimer&&clearTimeout(t.viewTimer),t.exposeTimer&&clearTimeout(t.exposeTimer),le?.delete(e))},o=e=>{e.forEach((e=>{const t=e.target,o=le?.get(t);o&&(o.viewTimer&&(clearTimeout(o.viewTimer),o.viewTimer=null),o.exposeTimer&&(clearTimeout(o.exposeTimer),o.exposeTimer=null),e.isIntersecting&&(r(t),t.hasAttribute(ue)||t.hasAttribute(de)||n(t)))}))};ce=(()=>{let e=null;try{e=new IntersectionObserver(o,{root:null,threshold:.5})}catch(e){console.error("[TM]: create IntersectionObserver fail: ",e)}return e})();new Set([...document.querySelectorAll(`[${de}]`),...document.querySelectorAll(`[${ue}]`)]).forEach((e=>t(e))),new MutationObserver((e=>{e.forEach((e=>{if("attributes"===e.type&&e.target instanceof HTMLElement){const r=e.target,o=e.attributeName,i=["data-event-detail","data-traceid","data-spm","data-duration-view","data-duration-expose"];r.hasAttribute(de)||r.hasAttribute(ue)?i.includes(o)?t(r,!0):o!==de&&o!==ue||t(r,!1):n(r)}else"childList"===e.type&&(e.addedNodes.forEach((e=>{if(e instanceof HTMLElement)if(e.hasAttribute(de)||e.hasAttribute(ue))t(e);else{new Set([...e.querySelectorAll(`[${de}]`),...e.querySelectorAll(`[${ue}]`)]).forEach((e=>t(e)))}})),e.removedNodes.forEach((e=>{if(e instanceof HTMLElement){const t=le?.get(e);if(t)n(e);else{new Set([...e.querySelectorAll(`[${de}]`),...e.querySelectorAll(`[${ue}]`)]).forEach((e=>n(e)))}}})))}))})).observe(document.body||document.documentElement,{attributes:!0,childList:!0,subtree:!0})},pe=/^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;function fe(e){const t=e.match(pe);if(!t)return{};return{filename:t[2],functionName:t[1]||"",lineno:parseInt(t[3],10)||void 0,colno:parseInt(t[4],10)||void 0}}function he(e){try{const{stack:t}=e;if(!t)return[];const r=[];for(const e of t.split("\n").slice(1)){const t=fe(e);!t||t.filename?.includes("chrome-extension://")||t.filename?.includes("node_modules")||t.filename?.includes("<anonymous>")||r.push(t)}return r.slice(0,10)}catch(e){return[]}}const ge=new Set,ye=(e,t)=>{if((r=w?.errorTraceRate??.5)<0||r>1?(console.warn("[TM]: probability should be between 0 and 1"),0):Math.random()<r){if(window.trackMonitor.track(t),ge.size>=1e3){const e=ge.values().next().value;void 0!==e&&ge.delete(e)}ge.add(e)}var r},we=()=>{window.addEventListener("error",(e=>{(e=>{if(e instanceof ErrorEvent&&"Script error."===e.message){const t=p("js-Script error.");if(ge.has(t))return;return void ye(t,{data_type:"error",event_type:"js",event_detail:{traceId:te,msg:'Script error.(跨域脚本未加载 crossorigin 属性,无法获取堆栈;建议脚本加 crossorigin="anonymous")',target:"",stack:[],errorUuid:t,meta:{filename:e.filename,colno:e.colno,lineno:e.lineno,crossorigin_missing:!0}}})}if("js"!==m(e))return;if((e=>{const t=e.error?.stack||"";return/chrome-extension:\/\//.test(t)})(e))return;const t=p(`js-${e.message}-${e.filename}`);if(ge.has(t))return;const r=he(e.error),n={traceId:te,msg:e.message,target:r[0]?`${r[0].filename?.split("?")[0]}:${r[0].lineno}:${r[0].colno}`:"",stack:r,errorUuid:t,meta:{filename:e.filename,colno:e.colno,lineno:e.lineno}};ye(t,{data_type:"error",event_type:"js",event_detail:n})})(e)}),!0)},ve=()=>{window.addEventListener("error",(e=>{(e=>{if("resource"!==m(e))return;const t=e.target,r=p(`resource-${t.src}-${t.tagName}`);if(ge.has(r))return;const n={traceId:te,msg:`加载${t.tagName}失败`,target:t.src?.split("?")[0],errorUuid:r,meta:{url:t.src,html:t.outerHTML,tagName:t.tagName}};ye(r,{data_type:"error",event_type:"resource",event_detail:n})})(e)}),!0)},Te=()=>{window.addEventListener("unhandledrejection",(e=>(e=>{const t=e.reason?.message||e.reason,r=p(`unhandledrejection-${t}`);if(ge.has(r))return;const n={traceId:te,msg:t,stack:he(e.reason),errorUuid:r};ye(r,{data_type:"error",event_type:"unhandledrejection",event_detail:n})})(e)),!0)},_e=()=>{const e=(e,t,r)=>{var n;if("string"!=typeof(n=e.url)||![w?.pushUrl,w?.authUrl,w?.realTimeUrl].filter((e=>!!e)).some((e=>0===n.indexOf(e))))if(t){const n=p(`http-${t}-${e.url}-${r}`);if(ge.has(n))return;const o={traceId:te,errorType:t,msg:r,target:e.url.split("?")[0],errorUuid:n,request:e};ye(n,{data_type:"error",event_type:"http",event_detail:o})}else if(e.status>=400){let r=e.statusText;const n=p(`http-${t="http_error"}-${e.url}-${r}`);if(ge.has(n))return;const o={traceId:te,errorUuid:n,errorType:t,target:e.url.split("?")[0],msg:r,request:e};ye(n,{data_type:"error",event_type:"http",event_detail:o})}};((e,t)=>{if("XMLHttpRequest"in window&&"function"==typeof window.XMLHttpRequest){const e=window.XMLHttpRequest;window.oXMLHttpRequest||(window.oXMLHttpRequest=e),window.XMLHttpRequest=function(){const r=new e,{open:n,send:o}=r;let i={};r.open=(e,t,o,a,s)=>{void 0===o&&(o=!0),i.method=e,i.url=t,n.call(r,e,t,o,a,s)},r.send=e=>{i.requestTime=(new Date).getTime(),o.call(r,e)};const a=(e,n)=>{const{status:o,statusText:a}=r,s=(new Date).getTime();i={...i,status:o,statusText:a,responseTime:s,duration:s-i.requestTime},"function"==typeof t&&t(i,e,n)};return r.addEventListener("loadend",(()=>a())),r.addEventListener("error",(()=>a("net_error","ERR_NETWORK"))),r.addEventListener("abort",(()=>a("cannel_request","ERR_CANCELED"))),r.addEventListener("timeout",(()=>a("timeout","ERR_NETWORK"))),r}}})(0,e),((e,t)=>{if("fetch"in window&&"function"==typeof window.fetch){const e=window.fetch;window.oFetch||(window.oFetch=e),window.fetch=async(r,n)=>{let o={};return o.method=n?.method||"",o.url=(r&&"string"!=typeof r?r?.url:r)||"",o.requestTime=(new Date).getTime(),e.call(window,r,n).then((async e=>{if("function"==typeof t){const r=e.clone(),n=(new Date).getTime();o={...o,status:r.status,statusText:r.statusText,responseTime:n,duration:n-o.requestTime},t(o)}return e})).catch((e=>{if("function"==typeof t){const r=(new Date).getTime();o={...o,responseTime:r,duration:r-o.requestTime},"AbortError"===e.name?t(o,"cannel_request","ERR_CANCELED"):t(o,"net_error","ERR_NETWORK")}return Promise.reject(e)}))}}})(0,e)};const be=new WeakSet,Se=e=>({form_id:e.id||null,form_class:"string"==typeof e.className?e.className:null,form_name:e.getAttribute("name")||null,form_action:e.getAttribute("action")||null,form_text:(e.textContent||"").trim().slice(0,200)||null});let Ee=-1;const ke=e=>{addEventListener("pageshow",(t=>{t.persisted&&(Ee=t.timeStamp,e(t))}),!0)},xe=(e,t,r,n)=>{let o,i;return a=>{t.value>=0&&(a||n)&&(i=t.value-(o??0),(i||void 0===o)&&(o=t.value,t.delta=i,t.rating=((e,t)=>e>t[1]?"poor":e>t[0]?"needs-improvement":"good")(t.value,r),e(t)))}},Me=e=>{requestAnimationFrame((()=>requestAnimationFrame((()=>e()))))},Ae=()=>{const e=performance.getEntriesByType("navigation")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},Le=()=>{const e=Ae();return e?.activationStart??0},Ce=(e,t=-1)=>{const r=Ae();let n="navigate";return Ee>=0?n="back-forward-cache":r&&(document.prerendering||Le()>0?n="prerender":document.wasDiscarded?n="restore":r.type&&(n=r.type.replace(/_/g,"-"))),{name:e,value:t,rating:"good",delta:0,entries:[],id:`v5-${Date.now()}-${Math.floor(8999999999999*Math.random())+1e12}`,navigationType:n}},Re=new WeakMap;function Ie(e,t){return Re.get(e)||Re.set(e,new t),Re.get(e)}class $e{t;i=0;o=[];h(e){if(e.hadRecentInput)return;const t=this.o[0],r=this.o.at(-1);this.i&&t&&r&&e.startTime-r.startTime<1e3&&e.startTime-t.startTime<5e3?(this.i+=e.value,this.o.push(e)):(this.i=e.value,this.o=[e]),this.t?.(e)}}const qe=(e,t,r={})=>{try{if(PerformanceObserver.supportedEntryTypes.includes(e)){const n=new PerformanceObserver((e=>{Promise.resolve().then((()=>{t(e.getEntries())}))}));return n.observe({type:e,buffered:!0,...r}),n}}catch{}},Ne=e=>{let t=!1;return()=>{t||(e(),t=!0)}};let Pe=-1;const Oe=new Set,Ue=()=>"hidden"!==document.visibilityState||document.prerendering?1/0:0,Be=e=>{if("hidden"===document.visibilityState){if("visibilitychange"===e.type)for(const e of Oe)e();isFinite(Pe)||(Pe="visibilitychange"===e.type?e.timeStamp:0,removeEventListener("prerenderingchange",Be,!0))}},ze=()=>{if(Pe<0){const e=Le(),t=document.prerendering?void 0:globalThis.performance.getEntriesByType("visibility-state").filter((t=>"hidden"===t.name&&t.startTime>e))[0]?.startTime;Pe=t??Ue(),addEventListener("visibilitychange",Be,!0),addEventListener("prerenderingchange",Be,!0),ke((()=>{setTimeout((()=>{Pe=Ue()}))}))}return{get firstHiddenTime(){return Pe},onHidden(e){Oe.add(e)}}},De=e=>{document.prerendering?addEventListener("prerenderingchange",(()=>e()),!0):e()},Fe=[1800,3e3],je=(e,t={})=>{De((()=>{const r=ze();let n,o=Ce("FCP");const i=qe("paint",(e=>{for(const t of e)"first-contentful-paint"===t.name&&(i.disconnect(),t.startTime<r.firstHiddenTime&&(o.value=Math.max(t.startTime-Le(),0),o.entries.push(t),n(!0)))}));i&&(n=xe(e,o,Fe,t.reportAllChanges),ke((r=>{o=Ce("FCP"),n=xe(e,o,Fe,t.reportAllChanges),Me((()=>{o.value=performance.now()-r.timeStamp,n(!0)}))})))}))},He=[.1,.25];let Je=0,Ke=1/0,We=0;const Xe=e=>{for(const t of e)t.interactionId&&(Ke=Math.min(Ke,t.interactionId),We=Math.max(We,t.interactionId),Je=We?(We-Ke)/7+1:0)};let Qe;const Ge=()=>Qe?Je:performance.interactionCount??0;let Ve=0;class Ye{u=[];l=new Map;m;p;v(){Ve=Ge(),this.u.length=0,this.l.clear()}L(){const e=Math.min(this.u.length-1,Math.floor((Ge()-Ve)/50));return this.u[e]}h(e){if(this.m?.(e),!e.interactionId&&"first-input"!==e.entryType)return;const t=this.u.at(-1);let r=this.l.get(e.interactionId);if(r||this.u.length<10||e.duration>t.P){if(r?e.duration>r.P?(r.entries=[e],r.P=e.duration):e.duration===r.P&&e.startTime===r.entries[0].startTime&&r.entries.push(e):(r={id:e.interactionId,entries:[e],P:e.duration},this.l.set(r.id,r),this.u.push(r)),this.u.sort(((e,t)=>t.P-e.P)),this.u.length>10){const e=this.u.splice(10);for(const t of e)this.l.delete(t.id)}this.p?.(r)}}}const Ze=e=>{const t=globalThis.requestIdleCallback||setTimeout;"hidden"===document.visibilityState?e():(e=Ne(e),addEventListener("visibilitychange",e,{once:!0,capture:!0}),t((()=>{e(),removeEventListener("visibilitychange",e,{capture:!0})})))},et=[200,500],tt=(e,t={})=>{if(!globalThis.PerformanceEventTiming||!("interactionId"in PerformanceEventTiming.prototype))return;const r=ze();De((()=>{"interactionCount"in performance||Qe||(Qe=qe("event",Xe,{type:"event",buffered:!0,durationThreshold:0}));let n,o=Ce("INP");const i=Ie(t,Ye),a=e=>{Ze((()=>{for(const t of e)i.h(t);const t=i.L();t&&t.P!==o.value&&(o.value=t.P,o.entries=t.entries,n())}))},s=qe("event",a,{durationThreshold:t.durationThreshold??40});n=xe(e,o,et,t.reportAllChanges),s&&(s.observe({type:"first-input",buffered:!0}),r.onHidden((()=>{a(s.takeRecords()),n(!0)})),ke((()=>{i.v(),o=Ce("INP"),n=xe(e,o,et,t.reportAllChanges)})))}))};class rt{m;h(e){this.m?.(e)}}const nt=[2500,4e3],ot=[800,1800],it=e=>{document.prerendering?De((()=>it(e))):"complete"!==document.readyState?addEventListener("load",(()=>it(e)),!0):setTimeout(e)};function at(){const e={ttfb:null,lcp:null,fp:null,fcp:null,connectionRtt:null,ttfbRequestTime:null,inp:null,cls:null,dcl:null,loadTime:null};((e,t={})=>{De((()=>{const r=ze();let n,o=Ce("LCP");const i=Ie(t,rt),a=e=>{t.reportAllChanges||(e=e.slice(-1));for(const t of e)i.h(t),t.startTime<r.firstHiddenTime&&(o.value=Math.max(t.startTime-Le(),0),o.entries=[t],n())},s=qe("largest-contentful-paint",a);if(s){n=xe(e,o,nt,t.reportAllChanges);const r=Ne((()=>{a(s.takeRecords()),s.disconnect(),n(!0)})),i=e=>{e.isTrusted&&(Ze(r),removeEventListener(e.type,i,{capture:!0}))};for(const e of["keydown","click","visibilitychange"])addEventListener(e,i,{capture:!0});ke((r=>{o=Ce("LCP"),n=xe(e,o,nt,t.reportAllChanges),Me((()=>{o.value=performance.now()-r.timeStamp,n(!0)}))}))}}))})((t=>{e.lcp=d(t.value)}),{reportAllChanges:!0}),((e,t={})=>{const r=ze();je(Ne((()=>{let n,o=Ce("CLS",0);const i=Ie(t,$e),a=e=>{for(const t of e)i.h(t);i.i>o.value&&(o.value=i.i,o.entries=i.o,n())},s=qe("layout-shift",a);s&&(n=xe(e,o,He,t.reportAllChanges),r.onHidden((()=>{a(s.takeRecords()),n(!0)})),ke((()=>{i.i=0,o=Ce("CLS",0),n=xe(e,o,He,t.reportAllChanges),Me((()=>n()))})),setTimeout(n))})))})((t=>{e.cls=Math.round(1e4*t.value)/1e4}),{reportAllChanges:!0}),tt((t=>{e.inp=d(t.value)}),{reportAllChanges:!0}),((e,t={})=>{let r=Ce("TTFB"),n=xe(e,r,ot,t.reportAllChanges);it((()=>{const o=Ae();o&&(r.value=Math.max(o.responseStart-Le(),0),r.entries=[o],n(!0),ke((()=>{r=Ce("TTFB",0),n=xe(e,r,ot,t.reportAllChanges),n(!0)})))}))})((t=>{e.ttfb=d(t.value)})),je((t=>{e.fcp=d(t.value)}));const t=()=>{(()=>{try{performance.getEntriesByType("paint").forEach((t=>{"first-paint"===t.name&&(e.fp=d(t.startTime))}))}catch(e){console.warn("[TM]: Failed to collect FP:",e)}try{const t=navigator.connection||navigator.mozConnection||navigator.webkitConnection;t&&void 0!==t.rtt&&(e.connectionRtt=t.rtt)}catch(e){console.warn("[TM]: Failed to collect Connection RTT:",e)}try{const t=performance.getEntriesByType("navigation")[0];if(t){const{responseStart:r,requestStart:n}=t;r>0&&n>0&&n<=r&&(e.ttfbRequestTime=d(r-n))}}catch(e){console.warn("[TM]: Failed to collect TTFB Request Time:",e)}try{const t=performance.getEntriesByType("navigation")[0];if(t){const{domContentLoadedEventEnd:r,loadEventEnd:n,fetchStart:o}=t;r>0&&o>0&&(e.dcl=d(r-o)),n>0&&o>0&&(e.loadTime=d(n-o))}}catch(e){console.warn("[TM]: Failed to collect DCL and Load Time:",e)}})(),window.trackMonitor.track({data_type:"performance",event_type:"metrics",event_detail:{traceId:te,data:e}})};let r=0;const n=()=>{const e=Date.now();e-r<3e4||(r=e,t())};window.addEventListener("beforeunload",t),window.addEventListener("pagehide",n),document.addEventListener("visibilitychange",(()=>{"hidden"===document.visibilityState&&n()}))}const st="__tengence_sdk",ct=e=>{if("undefined"!=typeof window&&window.trackMonitor&&window.trackMonitor[st])return console.warn("[TM]: init 已调用过,复用现有实例(如需重建请刷新页面)"),window.trackMonitor;const{client:t,beforeClose:r}=ee(e);var n;return me(t.track),!1!==e.traceBehavior&&se({enableScroll:e.enableScroll}),!1!==e.enableFormTrack&&(n=t.track,document.addEventListener("focusin",(e=>{const t=e.target;if(!(r=t)||"INPUT"!==r.tagName&&"SELECT"!==r.tagName&&"TEXTAREA"!==r.tagName)return;var r;const o=t.closest("form");o&&!be.has(o)&&(be.add(o),n({data_type:"auto",event_type:"form_start",event_detail:Se(o)}))}),!0),document.addEventListener("submit",(e=>{const t=e.target;if(!t||"FORM"!==t.tagName)return;const r=e.submitter;n({data_type:"auto",event_type:"form_submit",event_detail:{...Se(t),submitter_id:r?.id||null,submitter_text:(r?.textContent||"").trim().slice(0,200)||null}})}),!0)),!1!==e.traceError&&(we(),ve(),Te(),_e()),!1!==e.tracePerformance&&l((()=>{!function(){const e=window.performance||window.msPerformance;if(!e)return{dnsLookupTime:null,tcpConnectTime:null,ttfb:null,transferTime:null,domParseTime:null,domCompleteTime:null,loadEventTime:null,totalPageLoad:null};const t=e.getEntriesByType&&"function"==typeof e.getEntriesByType?e.getEntriesByType("navigation"):void 0,r=Array.isArray(t)?t[0]:void 0;let n=null;if(r)n=r;else{const t=e.timing;t&&(n={startTime:0,domainLookupStart:t.domainLookupStart,domainLookupEnd:t.domainLookupEnd,connectStart:t.connectStart,connectEnd:t.connectEnd,requestStart:t.requestStart,responseStart:t.responseStart,responseEnd:t.responseEnd,domInteractive:t.domInteractive,domComplete:t.domComplete,loadEventEnd:t.loadEventEnd,fetchStart:t.fetchStart},!n.requestStart&&t.fetchStart&&(n.requestStart=t.fetchStart))}const o={dnsLookupTime:n?d(n.domainLookupEnd-n.domainLookupStart):null,tcpConnectTime:n?d(n.connectEnd-n.connectStart):null,ttfb:n?d(n.responseStart-(n.requestStart??n.fetchStart??0)):null,transferTime:n?d(n.responseEnd-n.responseStart):null,domParseTime:n?d(n.domInteractive-n.responseEnd):null,domCompleteTime:n?d(n.domComplete-n.domInteractive):null,loadEventTime:n?d(n.loadEventEnd-(n.domComplete??0)):null,totalPageLoad:n?d((n.loadEventEnd??performance.now())-(n.startTime??0)):null};window.trackMonitor.track({data_type:"performance",event_type:"navigation_timing",event_detail:{traceId:te,data:o}})}(),function(){const e=window.performance||window.msPerformance;if(!e)return[];const t=[];if(e.getEntriesByType){const r=(e.getEntriesByType("resource")||[]).map((e=>{const t="number"==typeof e.redirectEnd&&"number"==typeof e.redirectStart?d(e.redirectEnd-e.redirectStart):null,r="number"==typeof e.domainLookupEnd&&"number"==typeof e.domainLookupStart?d(e.domainLookupEnd-e.domainLookupStart):null,n="number"==typeof e.connectEnd&&"number"==typeof e.connectStart?d(e.connectEnd-e.connectStart):null,o="number"==typeof e.requestStart&&"number"==typeof e.fetchStart?d(e.requestStart-e.fetchStart):null,i="number"==typeof e.responseStart&&"number"==typeof e.requestStart?d(e.responseStart-e.requestStart):null,a="number"==typeof e.responseEnd&&"number"==typeof e.responseStart?d(e.responseEnd-e.responseStart):null,s="number"==typeof e.duration?d(e.duration):null,c="number"==typeof e.startTime?d(e.startTime):null,l="number"==typeof e.transferSize&&isFinite(e.transferSize)&&e.transferSize>=0?Math.round(e.transferSize):null,u="number"==typeof e.encodedBodySize&&isFinite(e.encodedBodySize)&&e.encodedBodySize>=0?Math.round(e.encodedBodySize):null,m="number"==typeof e.decodedBodySize&&isFinite(e.decodedBodySize)&&e.decodedBodySize>=0?Math.round(e.decodedBodySize):null;return{name:e.name,initiatorType:e.initiatorType||"",startTime:c,duration:s,redirectTime:t,cacheTime:o,dnsTime:r,connectTime:n,requestTime:i,responseTime:a,transferSize:l,encodedBodySize:u,decodedBodySize:m}}));r.sort(((e,t)=>(t.duration??0)-(e.duration??0)));const n=w?.resourceFlowLimit??15;if(0===n)return;for(let e=0;e<Math.min(n,r.length);e++)t.push(r[e]);if(!t.length)return}window.trackMonitor.track({data_type:"performance",event_type:"resource_flow",event_detail:{traceId:te,data:t}})}(),at()})),l((()=>{r()})),window.trackMonitor[st]=!0,window.trackMonitor};export{ct as default};
1
+ class e extends Error{status;constructor(e,t){super(t||`[TM]: Auth error ${e}`),this.name="AuthError",this.status=e}}const t=({method:e,url:t,data:r,headers:n={},withCredentials:o=!1,timeoutMs:a})=>new Promise(((i,s)=>{const c=new XMLHttpRequest;c.open(e,t,!0),a&&(c.timeout=a),Object.keys(n).forEach((e=>{c.setRequestHeader(e,n[e])})),c.withCredentials=!!o,c.onreadystatechange=()=>{if(4===c.readyState)if(c.status>=200&&c.status<300)try{const e=JSON.parse(c.responseText);i(e)}catch(e){s(e)}else{const e=new Error(`[TM]: Request failed with status ${c.status}`);e.status=c.status,s(e)}},c.onerror=()=>{s(new Error("[TM]: Network error"))},c.ontimeout=()=>{const e=new Error("[TM]: Request timeout");e.timeout=!0,s(e)},"POST"===e&&r?c.send(r):c.send()})),r=(e,t,r)=>{if(!r)return fetch(e,t);const n=new AbortController,o=setTimeout((()=>n.abort()),r);return fetch(e,{...t,signal:n.signal}).catch((e=>{if(e&&"AbortError"===e.name){const e=new Error("[TM]: Request timeout");throw e.timeout=!0,e}throw e})).finally((()=>clearTimeout(o)))},n=(n,o,a,i)=>{const s={"Content-Type":"application/json"};a&&(s.Authorization=`Bearer ${a}`);const c=()=>t({method:"POST",url:n,data:JSON.stringify(o),headers:s,withCredentials:!0,timeoutMs:i});return"function"!=typeof fetch?c():r(n,{method:"POST",keepalive:!0,credentials:"include",headers:s,body:JSON.stringify(o)},i).then((t=>{if(401===t.status||403===t.status)throw new e(t.status,`[TM]: Auth error ${t.status}`);if(429===t.status){const e=new Error("[TM]: Request throttled with status 429");e.status=429;const r=t.headers.get("Retry-After");if(r){const t=parseInt(r,10);isNaN(t)||(e.retryAfter=1e3*t)}throw e}if(!t.ok){const e=new Error(`[TM]: Request failed with status ${t.status}`);throw e.status=t.status,e}return t.json()})).catch((t=>{if(t instanceof e)throw t;if(t&&t.status)throw t;return c()}))},o=window.requestIdleCallback||window.requestAnimationFrame||(e=>setTimeout(e,17));function a(e,t=150,r=!1){let n=null;return function(...o){const a=this,i=r&&!n;n&&clearTimeout(n),n=setTimeout((()=>{n=null,r||e.apply(a,o)}),t),i&&e.apply(a,o)}}const i=(e,t=300)=>{let r=0;return function(...n){const o=Date.now();o-r>=t&&(r=o,e.apply(this,n))}};function s(e,t=""){if(!e)return t;const r=e.parentElement,{id:n}=e,o=e.tagName.toLowerCase(),a=t?`>${t}`:"";return r&&r!==document.documentElement&&r!==document.body?n?`#${n}${a}`:s(r,`${o}${a}`):`${o}${a}`}const c=()=>{if(window.performance?.navigation)return performance.navigation.type;if(window.performance?.getEntriesByType){const e=performance.getEntriesByType("navigation");if(e.length>0)return e[0].type}return 255},l=e=>{"prerendering"in document&&document.prerendering?(e=>{"prerendering"in document&&document.prerendering?addEventListener("prerenderingchange",(()=>e()),!0):e()})((()=>l(e))):"complete"!==document?.readyState?addEventListener("load",(()=>l(e)),!0):setTimeout(e)};function u(e){return"number"!=typeof e||!isFinite(e)||e<0?null:Math.round(100*e)/100}function d(){const e=new Uint8Array(16);if("undefined"!=typeof crypto&&"function"==typeof crypto.getRandomValues)crypto.getRandomValues(e);else for(let t=0;t<16;t++)e[t]=Math.floor(256*Math.random());e[6]=15&e[6]|64,e[8]=63&e[8]|128;let t="";for(let r=0;r<16;r++)t+=(e[r]<16?"0":"")+e[r].toString(16);return t}const m=e=>e instanceof ErrorEvent?"Script error."===e.message?"cors":"js":"resource",p=e=>(e=>{let t=5381;for(let r=0;r<e.length;r++)t=(t<<5)+t+e.charCodeAt(r)>>>0;return t.toString(16).padStart(8,"0")})(e)+(e=>{let t=5381;for(let r=e.length-1;r>=0;r--)t=((t<<5)+t^e.charCodeAt(r))>>>0;return t.toString(16).padStart(8,"0")})(e);const f={view:"#3b82f6",click:"#06b6d4",expose:"#8b5cf6",enter:"#10b981",leave:"#f59e0b",stay:"#84cc16",cart:"#ec4899",buy:"#ef4444",pay:"#dc2626",default:"#6b7280"},h={view:"👁️",click:"👆",expose:"✨",enter:"🚪",leave:"👋",stay:"⏱️",cart:"🛒",buy:"💰",pay:"💳",default:"📊"},g={common:"#3b82f6",behavior:"#10b981",performance:"#f59e0b",error:"#ef4444",custom:"#8b5cf6",default:"#6b7280"},y=(e,t)=>{t.forEach(((t,r)=>{const n=t.event_type||"unknown",o=t.data_type||"auto",a=(e=>f[e]||f.default)(n),i=(e=>g[e]||g.default)(o),s=(e=>h[e]||h.default)(n);let c=t.event_detail;if("string"==typeof c)try{c=JSON.parse(c)}catch(e){}console.groupCollapsed(`%c${s} [TM-${e}] %c${o.toUpperCase()}%c → %c${n.toUpperCase()}%c #${r+1}`,"color: #6b7280; font-weight: bold;",`color: ${i}; font-weight: bold; background: ${i}20; padding: 2px 6px; border-radius: 3px;`,"color: #6b7280;",`color: ${a}; font-weight: bold; background: ${a}20; padding: 2px 6px; border-radius: 3px;`,"color: #6b7280; font-weight: normal;");const l={...t,event_detail:c};console.log("%c"+JSON.stringify(l,null,2),"color: #6b7280; font-family: monospace; font-size: 11px; line-height: 1.5;"),console.groupEnd()})),console.log(`%c✅ [TM] 本次通过 ${e} 上报 ${t.length} 条埋点数据`,"color: #10b981; font-weight: bold; font-size: 12px; padding: 4px 8px; background: #10b98120; border-radius: 4px; border-left: 3px solid #10b981;")},w={dataTypes:["auto","behavior","performance","error"],idFieldName:"event_id",errorTraceRate:.5,reportInterval:5e3,cacheNumber:100,maxCacheSize:56,maxRetries:10,resourceFlowLimit:15,enableScroll:!0,enableFormTrack:!0,enableAutoSessionId:!1},T=["dataTypes","idFieldName","errorTraceRate","reportInterval","cacheNumber","maxCacheSize","maxRetries","resourceFlowLimit","enableScroll","enableFormTrack","enableAutoSessionId"];let v={},b=null,S={...w};const _=[],E=e=>{const t={};for(const r of T){const n=e[r];void 0!==n&&(t[r]=n)}return t},k=e=>{if(!Array.isArray(e))return;const t=new Set(w.dataTypes);t.add("custom");const r=e.filter((e=>t.has(String(e))));return r.length?Array.from(new Set(r)):void 0},x=(e,t,r,n)=>{const o="number"!=typeof e||Number.isNaN(e)?NaN:e;return o>=r&&o<=n?o:t},A=(e,t)=>"boolean"==typeof e?e:t,M=()=>{const e={};for(const t of T){const r=v[t]??b?.[t];void 0!==r&&(e[t]=r)}return S=(e=>{const t=w;return{dataTypes:k(e.dataTypes)??t.dataTypes,idFieldName:"string"==typeof e.idFieldName&&e.idFieldName?e.idFieldName:t.idFieldName,errorTraceRate:x(e.errorTraceRate,t.errorTraceRate,0,1),reportInterval:x(e.reportInterval,t.reportInterval,100,864e5),cacheNumber:x(e.cacheNumber,t.cacheNumber,1,1e5),maxCacheSize:x(e.maxCacheSize,t.maxCacheSize,1,10240),maxRetries:x(e.maxRetries,t.maxRetries,0,100),resourceFlowLimit:x(e.resourceFlowLimit,t.resourceFlowLimit,0,200),enableScroll:A(e.enableScroll,t.enableScroll),enableFormTrack:A(e.enableFormTrack,t.enableFormTrack),enableAutoSessionId:A(e.enableAutoSessionId,t.enableAutoSessionId)}})(e),(()=>{for(const e of _)try{e()}catch{}})(),S},L=e=>(v={...v,...E(e)},M()),C=e=>(b=e?E(e):null,M()),I=()=>S,R=["auto","behavior","performance","error"],N="tengence_sdk_config",$=(e,t)=>{if(t)return t;if(e){const t=/^(https?:\/\/[^/]+)/.exec(e);if(t)return`${t[1]}/v1/track/config`}return"https://api.tengence.com/v1/track/config"},q=async(n,o,a)=>{try{const i=await((n,o,a)=>{const i={};o&&(i.Authorization=`Bearer ${o}`);const s=()=>t({method:"GET",url:n,headers:i,withCredentials:!0,timeoutMs:a});return"function"!=typeof fetch?s():r(n,{method:"GET",credentials:"include",headers:i},a).then((t=>{if(401===t.status||403===t.status)throw new e(t.status,`[TM]: Auth error ${t.status}`);if(!t.ok){const e=new Error(`[TM]: Request failed with status ${t.status}`);throw e.status=t.status,e}return t.json()})).catch((t=>{if(t instanceof e)throw t;if(t&&t.status)throw t;return s()}))})(n,o,a),s=(e=>{if(!e||!Array.isArray(e.dataTypes)||0===e.dataTypes.length)return null;const t={fetchedAt:Date.now()},r=new Set(R);return r.add("custom"),t.dataTypes=e.dataTypes.filter((e=>r.has(String(e)))),"string"==typeof e.idFieldName&&e.idFieldName&&(t.idFieldName=e.idFieldName),"number"==typeof e.errorTraceRate&&(t.errorTraceRate=e.errorTraceRate),"number"==typeof e.reportInterval&&(t.reportInterval=e.reportInterval),"number"==typeof e.cacheNumber&&(t.cacheNumber=e.cacheNumber),"number"==typeof e.maxCacheSize&&(t.maxCacheSize=e.maxCacheSize),"number"==typeof e.maxRetries&&(t.maxRetries=e.maxRetries),"number"==typeof e.resourceFlowLimit&&(t.resourceFlowLimit=e.resourceFlowLimit),"boolean"==typeof e.enableScroll&&(t.enableScroll=e.enableScroll),"boolean"==typeof e.enableFormTrack&&(t.enableFormTrack=e.enableFormTrack),"boolean"==typeof e.enableAutoSessionId&&(t.enableAutoSessionId=e.enableAutoSessionId),"string"==typeof e.appId&&(t.appId=e.appId),"number"==typeof e.configVersion&&(t.configVersion=e.configVersion),"string"==typeof e.updatedAt&&(t.updatedAt=e.updatedAt),t})(i?.data??i);return s?(C(s),(e=>{try{localStorage.setItem(N,JSON.stringify(e))}catch{}})(s),s):("undefined"!=typeof console&&console.warn("[TM]: 远程配置返回空,沿用缓存/默认配置"),null)}catch(e){return"undefined"!=typeof console&&console.warn("[TM]: 拉取远程配置失败,沿用缓存/默认配置",e),null}};let F;const P="TRACK_MONITOR_DATA",O="MONITOR_REAL_TIME_DATA",U="TRACK_MONITOR_USER",z="tengence_device_id",B="tengence_register_properties",D="TRACK_MONITOR_LOGGER",j="tengence_tracking_enabled",H=2e3,J="tengence_access_token";let K=null,G=null;const W=e=>((e,n,o)=>{const a={"Content-Type":"application/json"},i=()=>t({method:"POST",url:e,data:JSON.stringify(n),headers:a,withCredentials:!0,timeoutMs:o});return"function"!=typeof fetch?i():r(e,{method:"POST",credentials:"include",headers:a,body:JSON.stringify(n)},o).then((e=>{if(!e.ok){const t=new Error(`[TM]: Request failed with status ${e.status}`);throw t.status=e.status,t}return e.json()})).catch((e=>{if(e&&e.status)throw e;return i()}))})(e,{},F?.requestTimeout).then((e=>{const t=e&&e.data,r=t&&t.accessToken,n=t&&t.accessExpAt;if(!r||"number"!=typeof n)throw new Error("[TM]: authUrl 响应缺少 accessToken/accessExpAt");return((e,t)=>{K={token:e,expAt:t};try{localStorage.setItem(J,JSON.stringify({token:e,expAt:t}))}catch(e){}})(r,n),r})),X=e=>{const t=(()=>{if(K)return K;try{const e=localStorage.getItem(J);if(!e)return null;const t=JSON.parse(e);if(t&&"string"==typeof t.token&&t.token&&"number"==typeof t.expAt)return K={token:t.token,expAt:t.expAt},K}catch(e){}return null})();return(r=t)&&r.token.length>0&&r.expAt-6e4>Date.now()?Promise.resolve(t.token):(G||(G=W(e).catch((e=>{throw e})).finally((()=>{G=null}))),G);var r},Q={timer:null,promise:null},V={timer:null,promise:null},Y=e=>{const t=JSON.stringify(e);return(new TextEncoder).encode(t).length/1024};let Z=null;const ee=()=>{if(Z)return Z;try{const e=localStorage.getItem(B),t=e?JSON.parse(e):{};return Z=t,t}catch(e){return console.error("[TM]: get register properties fail: ",e),{}}},te=e=>{Z=e;try{localStorage.setItem(B,JSON.stringify(e))}catch(e){console.error("[TM]: save register properties fail: ",e)}},re=e=>{if(!e||"object"!=typeof e||Array.isArray(e))return void console.error("[TM]: registerGlobalProperties props must be a plain object");const t={...ee(),...e},r=Object.keys(t);if(r.length>50){const e={};return r.slice(0,50).forEach((r=>{e[r]=t[r]})),console.warn("[TM]: register properties exceed max 50 keys, extra keys dropped"),void te(e)}te(t)},ne=e=>{const t=document.cookie.match(new RegExp("(?:^|;\\s*)"+e+"=([^;]*)"));return t?decodeURIComponent(t[1]):void 0},oe=e=>{document.cookie=`${z}=${encodeURIComponent(e)}; Max-Age=63072000; Path=/; Secure; SameSite=Lax`};let ae;const ie=()=>{if(ae)return ae;try{let e=localStorage.getItem(z);if(e)return ne(z)||oe(e),ae=e;const t=ne(z);if(t){try{localStorage.setItem(z,t)}catch(e){}return ae=t}e=d();try{localStorage.setItem(z,e)}catch(e){}return oe(e),ae=e}catch(e){return void console.error("[TM]: get or create device id fail: ",e)}},se="tengence_session_id",ce=()=>{try{const e=sessionStorage.getItem(se);let t=e?JSON.parse(e):null;const r=Date.now();return!t||!t.id||r-t.lastActiveAt>18e5?(t={id:d(),lastActiveAt:r},sessionStorage.setItem(se,JSON.stringify(t))):(t.lastActiveAt=r,sessionStorage.setItem(se,JSON.stringify(t))),t.id}catch(e){return}},le=(e,t)=>{try{const r=new URL(e,location.href);if(!r.searchParams.toString())return e;if(t&&t.length){const e=[];for(const n of t){const t=r.searchParams.get(n);null!==t&&e.push(`${n}=${encodeURIComponent(t)}`)}r.search=e.length?`?${e.join("&")}`:""}else r.search="";return r.toString()}catch(t){return e}},ue=(e,t,r)=>{if("string"==typeof e)return t>0&&e.length>t?e.slice(0,t)+"...[truncated]":e;if(Array.isArray(e))return e.map((e=>ue(e,t,r)));if(e&&"object"==typeof e){const n={};for(const o of Object.keys(e)){const a=e[o];"string"==typeof a&&/(^|_)url$|(^|_)href$|^referrer$/i.test(o)&&/^https?:\/\//i.test(a)?n[o]=le(a,r):n[o]=ue(a,t,r)}return n}return e},de=e=>{const t={page_url:location.href,hostname:window.location.hostname||window.location.host,os:window.navigator.platform,user_id:localStorage.getItem(U)||void 0,user_agent:window.navigator.userAgent,screen_width:window.screen.width,screen_height:window.screen.height,lib_version:"1.2.3",lib_type:"js",event_time:Date.now(),timezone_offset:(new Date).getTimezoneOffset().toString()},r=F?.sanitize;let n;try{n="string"==typeof e.event_detail?e.event_detail:JSON.stringify(r&&(r.maxTextLength>0||r.stripQuery)?ue(e.event_detail,r.maxTextLength,r.preserveQueryKeys):e.event_detail)}catch(e){return ge("serialize_failed","事件 event_detail 序列化失败(循环引用/BigInt?),该事件丢弃",{error:e}),void console.warn("[TM]: event_detail 序列化失败,该事件丢弃",e)}return{session_id:e.session_id||(I().enableAutoSessionId?ce():void 0),request_id:e.request_id,event_id:e.event_id||d(),spm:e.spm,data_type:e.data_type||"behavior",event_type:e.event_type,event_detail:n,...t,page_url:r&&r.stripQuery?le(t.page_url,r.preserveQueryKeys):t.page_url,device_id:ie(),register_properties:JSON.stringify(ee()),platform:e.platform||me}};let me;const pe=()=>{try{return"true"===localStorage.getItem(D)}catch(e){return!1}},fe=(e,t,r,n,o)=>void 0===e?t:"number"!=typeof e||Number.isNaN(e)||e<r||e>n?(console.warn(`[TM]: 配置 ${o}=${e} 非法,回退默认值 ${t}`),t):e,he=(e,t)=>{try{F?.onDrop?.(e,t)}catch(e){}},ge=(e,t,r)=>{F?.isLogger&&console.error(`[TM]: ${t}`);try{F?.onError?.({code:e,message:t,context:r})}catch(e){}},ye=()=>{try{const e=localStorage.getItem(j);return null===e||"1"===e}catch(e){return!0}},we=t=>{const r=t.apiKey;let a;const i=/Android|iPhone|iPad|iPod|Mobile/i.test(window.navigator.userAgent);me=t.platform||(i?"h5":"web"),F={pushUrl:t.pushUrl||"https://api.tengence.com/v1/push/event",authUrl:t.authUrl,realTimeUrl:t.realTimeUrl,cacheNumber:fe(t.cacheNumber,100,1,1/0,"cacheNumber"),reportInterval:fe(t.reportInterval,5e3,100,1/0,"reportInterval"),realTimeReportInterval:fe(t.realTimeReportInterval,200,100,1/0,"realTimeReportInterval"),maxCacheSize:fe(t.maxCacheSize,56,1,1/0,"maxCacheSize"),maxRetries:fe(t.maxRetries,10,0,1/0,"maxRetries"),isLogger:t.isLogger??pe(),errorTraceRate:fe(t.errorTraceRate,.5,0,1,"errorTraceRate"),resourceFlowLimit:fe(t.resourceFlowLimit,15,0,200,"resourceFlowLimit"),sanitize:!1===t.sanitize?{stripQuery:!1,maxTextLength:0,preserveQueryKeys:[]}:{stripQuery:t.sanitize?.stripQuery??!1,maxTextLength:fe(t.sanitize?.maxTextLength,0,0,1/0,"sanitize.maxTextLength"),preserveQueryKeys:t.sanitize?.preserveQueryKeys||[]},enableAutoSessionId:t.enableAutoSessionId??!1,enableTracking:t.enableTracking??ye(),respectGpc:t.respectGpc??!0,requestTimeout:fe(t.requestTimeout,1e4,1e3,6e4,"requestTimeout"),configUrl:$(t.pushUrl,t.configUrl),configTtl:fe(t.configTtl,3e5,6e4,864e5,"configTtl"),beforeSend:t.beforeSend,onDrop:t.onDrop,onError:t.onError},L(t);let{pushUrl:s,authUrl:c,realTimeUrl:l,realTimeReportInterval:u}=F;r||c||(console.error("[TM]: 未配置 apiKey 或 authUrl,SDK 无法获取上报凭证,数据将不会上报。请配置 apiKey(直连)或 authUrl(自动换取 accessToken),或调用 setToken 注入 accessToken。"),ge("init_missing_credential","未配置 apiKey 或 authUrl,SDK 无法获取上报凭证,数据将不会上报。请配置 apiKey(直连)或 authUrl(自动换取 accessToken),或调用 setToken 注入 accessToken。"));const d=(()=>{try{const e=localStorage.getItem(N);if(!e)return null;const t=JSON.parse(e);return Array.isArray(t.dataTypes)&&0!==t.dataTypes.length?t:null}catch{return null}})();var m;d&&C(d),m=()=>{null!==Q.timer&&(clearTimeout(Q.timer),Q.timer=null,G(P))},_.push(m),o((async()=>{try{const e=r||a||(c?await X(c):void 0);e&&await q(F.configUrl,e,F.requestTimeout)}catch{}}));const p={retryCount:0,nextRetryAt:0,retryExhausted:!1,halveBatch:!1,waitingCredential:!1},f={retryCount:0,nextRetryAt:0,retryExhausted:!1,halveBatch:!1,waitingCredential:!1},h=e=>{try{localStorage.setItem(U,e)}catch(e){console.error("[TM]: monitor bind user fail: ",e)}},g=()=>{localStorage.removeItem(U)},w={},T={},v=new Set;let b=null;const E=()=>{null!==b&&(clearTimeout(b),b=null),v.size&&(v.forEach((e=>{try{localStorage.setItem(e,JSON.stringify(w[e]||[]))}catch(t){ge("queue_write_failed","写入本地缓存队列失败(隐私模式/容量满?),本次数据仅保留内存",{key:e,error:t})}})),v.clear())},k=e=>{if(w[e])return w[e];let t=[];try{t=JSON.parse(localStorage.getItem(e)||"[]")}catch(t){ge("queue_read_failed","读取本地缓存队列失败,按空队列处理",{key:e,error:t})}return w[e]=t,T[e]=t.reduce(((e,t)=>e+Y(t)),0),w[e]},x=(e,t)=>{v.delete(e),w[e]=t,T[e]=t.reduce(((e,t)=>e+Y(t)),0);try{localStorage.setItem(e,JSON.stringify(t))}catch(t){ge("queue_write_failed","写入本地缓存队列失败(隐私模式/容量满?),队列清空处理",{key:e,error:t});try{localStorage.setItem(e,"[]")}catch(t){ge("localstorage_unavailable","localStorage 不可用,本次数据仅保留内存",{key:e,error:t})}}},A=e=>{a=e,e&&(p.waitingCredential=!1,f.waitingCredential=!1,G(P),G(O))},M=async(t,o,i=!1)=>{const u=t&&l?l:s;let d;try{d=r||a||(c?await X(c):void 0)}catch(e){throw ge("token_fetch_failed","从 authUrl 获取 accessToken 失败,本批暂不上报(保留队列待重试)",{authUrl:c,error:e}),e}if(!d){ge("init_missing_credential","未配置 apiKey/authUrl 且未注入 accessToken,本次数据未上报(保留缓存队列待重试)");const e=new Error("[TM]: credential missing, skip report");throw e.missingCredential=!0,e}F?.isLogger&&y(t?"RealTimeFetch":"Fetch",o);const m=F?.beforeSend?(()=>{let e;try{e=F.beforeSend(o)}catch(e){ge("before_send_failed","beforeSend 钩子抛错,本次按原始数据发送",{error:e})}return Array.isArray(e)?e:o})():o,p=i?void 0:F?.requestTimeout;return n(u,{data:m},d,p).catch((async t=>{const o=t?.status;if((t instanceof e||401===o||403===o)&&!r&&!a&&c){(()=>{K=null;try{localStorage.removeItem(J)}catch(e){}})();const e=await X(c).catch((()=>{}));if(e)return n(u,{data:m},e,p);ge("token_invalid","上报 401/403 且刷新 accessToken 失败,本批暂不上报(保留队列待重试)",{authUrl:c})}throw t}))},R=(e,t)=>{const r=new Set(t.filter((e=>!!e)));if(!r.size)return;const n=k(e);if(!n.length)return;const o=n.filter((e=>e.event_id&&!r.has(e.event_id)));o.length!==n.length&&x(e,o)},z=(e,t,r=0)=>{const n=(t?u:I().reportInterval)*Math.pow(2,e)*(.8+.4*Math.random()),o=Math.min(n,6e4);return Math.max(o,r)},B=(e,t)=>{const r=Y(t);if(r>=64)return he([t],"item_too_large"),void console.warn("[TM]: 单条事件超过体积上限(64KB),丢弃该条");const n=k(e);if(n.unshift(t),T[e]+=r,n.length>H){const t=n.length-H,r=n.splice(n.length-t,n.length);T[e]=n.reduce(((e,t)=>e+Y(t)),0),he(r,"queue_overflow"),console.warn(`[TM]: 队列超过上限(2000条),丢弃最旧 ${t} 条`)}(e=>{v.add(e),null===b&&(b=setTimeout((()=>{b=null,E()}),200))})(e),G(e,T[e]>=I().maxCacheSize)},G=(e,t=!1,n=!1)=>{if(!F?.enableTracking)return;let o=k(e);if(!o.length)return;const i=(e=>e===O)(e),d=i?V:Q,m=(e=>e?f:p)(i);if(m.waitingCredential)return;if(m.halveBatch&&o.length>1&&(o=o.slice(0,Math.ceil(o.length/2))),m.retryExhausted)return;if(Date.now()<m.nextRetryAt)return void(null===d.timer&&(d.timer=setTimeout((()=>{d.timer=null,G(e)}),m.nextRetryAt-Date.now())));if(0!==m.retryCount||(o.length>=I().cacheNumber||t)){if(null!==d.timer&&(clearTimeout(d.timer),d.timer=null),d.promise)return;d.promise=(async(e,t,r,n,o=!1)=>{const a=[];let i=[],s=0;for(const e of t){const t=1024*Y(e);i.length&&s+t>65536&&(a.push(i),i=[],s=0),i.push(e),s+=t}i.length&&a.push(i);for(const t of a){const n=await M(r,t,o),a=n?.data?.accepted_ids,i=n?.data?.rejected_ids;if(Array.isArray(a)){if(R(e,a),Array.isArray(i)&&i.length){const r=new Set(i);R(e,i);const n=t.filter((e=>e.event_id&&r.has(e.event_id)));n.length&&he(n,"server_rejected"),console.warn(`[TM]: 服务端校验拒绝 ${i.length} 条(永久性拒绝),已从队列移除并通知 onDrop`)}}else R(e,t.map((e=>e.event_id))),F?.isLogger&&console.warn("[TM]: 响应缺少 accepted_ids,按整批成功清理")}n.retryCount=0,n.nextRetryAt=0,n.halveBatch=!1})(e,o,i,m,n).catch((e=>{((e,t,n,o,i)=>{if(t?.missingCredential)return void(r||a||c||(o.waitingCredential=!0));t?.timeout&&ge("request_timeout","上报请求超时,数据保留队列按退避重试",{url:n&&l?l:s,timeoutMs:F?.requestTimeout});const u=t?.status;if(413===u)return void(i.length>1?(o.halveBatch=!0,o.retryCount++,o.nextRetryAt=Date.now()+z(o.retryCount,n,0),console.warn(`[TM]: 批次过大(HTTP 413),降容半批重发(本批 ${i.length} 条)`)):(o.retryExhausted=!0,he(i,"rejected_4xx"),console.warn("[TM]: 单条事件仍超限(HTTP 413),数据保留在队列")));if(u&&u>=400&&u<500&&401!==u&&403!==u&&408!==u&&410!==u&&429!==u)return o.retryExhausted=!0,he(i,"rejected_4xx"),void console.warn(`[TM]: 批次提交被服务端拒绝(HTTP ${u}),数据保留在队列并暂停自动重试`);if(o.retryCount++,o.retryCount>I().maxRetries)return o.retryExhausted=!0,he(i,"retries_exhausted"),void console.warn(`[TM]: 重试次数已达上限(${I().maxRetries}),数据保留在队列(不丢弃),待下次会话或手动触发重试`);const d=429===u&&t?.retryAfter||0;o.nextRetryAt=Date.now()+z(o.retryCount,n,d),console.error(`[TM]: send report fail, retryCount: ${o.retryCount}, next retry after ${Math.round((o.nextRetryAt-Date.now())/1e3)}s`)})(0,e,i,m,o)})).finally((()=>{d.timer=null,d.promise=null,G(e)}))}else if(null===d.timer){const t=i?u:I().reportInterval;d.timer=setTimeout((()=>{d.timer=null,G(e,!0)}),t)}},W=e=>{if(!F?.enableTracking||F?.respectGpc&&function(){const e="undefined"!=typeof navigator?navigator:void 0;return!0===e?.globalPrivacyControl}())return void(F?.isLogger&&console.warn("[TM]: 用户已选择退出采集(enableTracking=false 或 GPC 信号开启),本事件忽略"));if(!e||"object"!=typeof e)return void console.error("[TM]: track data must be an object");const t=!0===e.track_real_time,r=de(e);var n;if(r)if(!(n=r.data_type)||S.dataTypes.includes(n))try{B(t&&l?O:P,r)}catch(e){ge("enqueue_failed","事件入队失败",{error:e})}else F?.isLogger&&console.warn(`[TM]: 数据类型 ${r.data_type} 未在远程配置中启用,本事件不上报`)},Z=(e,t,r)=>{W("string"==typeof e?{event_type:e,event_detail:t,...r}:e)},ee=()=>{G(P,!0),G(O,!0);const e=[Q.promise,V.promise].filter((e=>!!e));return Promise.all(e).then((()=>{}))},te=()=>{F.isLogger=!0;try{localStorage.setItem(D,"true")}catch(e){console.error("[TM]: enable logger fail:",e)}},ne=()=>{F.isLogger=!1;try{localStorage.setItem(D,"false")}catch(e){console.error("[TM]: disable logger fail:",e)}};o((()=>{G(P,!0),G(O,!0)}));const oe=e=>("boolean"==typeof e&&(F.enableTracking=e,(e=>{try{localStorage.setItem(j,e?"1":"0")}catch(e){}})(e),e?F?.isLogger&&console.warn("[TM]: 恢复采集"):(x(P,[]),x(O,[]),F?.isLogger&&console.warn("[TM]: 用户已选择退出采集,已清空未上报队列"))),!0===F?.enableTracking),ae=e=>{L(e)},ie=()=>({...I()});return window.trackMonitor={track:Z,flush:ee,bindUser:h,unBindUser:g,enableLogger:te,disableLogger:ne,setToken:A,registerGlobalProperties:re,enableTracking:oe,setConfig:ae,getConfig:ie},{client:{track:Z,flush:ee,bindUser:h,unBindUser:g,enableLogger:te,disableLogger:ne,setToken:A,registerGlobalProperties:re,enableTracking:oe,setConfig:ae,getConfig:ie},beforeClose:()=>{const e=()=>{E(),G(P,!0,!0),G(O,!0,!0)};window.addEventListener("beforeunload",e),window.addEventListener("pagehide",e),document.addEventListener("visibilitychange",(()=>{"hidden"===document.visibilityState&&e()})),window.addEventListener("online",e)}}},Te=(ve=16,function(){const e=new Uint8Array(ve);if("undefined"!=typeof crypto&&"function"==typeof crypto.getRandomValues)crypto.getRandomValues(e);else for(let t=0;t<ve;t++)e[t]=Math.floor(256*Math.random());let t="";for(let r=0;r<ve;r++)t+=(e[r]<16?"0":"")+e[r].toString(16);return t})();var ve;const be=e=>{const t=history[e];return function(){const r=t.apply(this,arguments),n=new Event(e);return window.dispatchEvent(n),r}},Se=e=>{window.addEventListener("replaceState",(t=>e(t)),!0),window.addEventListener("pushState",(t=>e(t)),!0)},_e=e=>{window.addEventListener("popstate",(t=>e(t)),!0)},Ee=[25,50,75,90],ke=e=>{history.pushState=be("pushState"),history.replaceState=be("replaceState"),(()=>{let e="";const t=()=>{const t=window.location.href;if(t===e)return;const{host:r,hostname:n,href:o,protocol:a,origin:i,port:s,pathname:l,search:u,hash:d}=window.location,m={host:r,hostname:n,href:o,protocol:a,origin:i,port:s,pathname:l,search:u,hash:d,title:document.title,language:navigator.language.substring(0,2),user_agent:navigator.userAgent,win_screen:`${window.screen.width}x${window.screen.height}`,doc_screen:`${document.documentElement.clientWidth}x${document.documentElement.clientHeight}`,referrer:document.referrer,type:c()};window.trackMonitor.track({data_type:"auto",event_type:"page_view",event_detail:m}),e=t},r=a(t,200);t(),_e((()=>{r()})),Se((()=>{r()})),window.addEventListener("popstate",(()=>{r()}))})(),(()=>{let e=document.referrer,t=window.location.href,r=Date.now(),n=!0;const o=(n=!1)=>{if(window.location.href!==t||n){const n=Date.now()-r;n>200&&window.trackMonitor.track({data_type:"auto",event_type:"page_leave",event_detail:{url:t,referrer:e,duration:n}}),r=Date.now(),e=t,t=window.location.href}},i=a(o);o(),_e((()=>{i()})),Se((()=>{i()})),document.addEventListener("visibilitychange",(()=>{"hidden"===document.visibilityState?n&&(n=!1,o(!0)):(n=!0,r=Date.now())})),window.addEventListener("beforeunload",(()=>{n&&(n=!1,o(!0))}),!0)})(),(()=>{const e=i((e=>{const t=function(e){if(!e)return;if(["A","INPUT","TEXTAREA","BUTTON"].includes(e.tagName))return e;if(e.hasAttribute("track-click"))return e;return e.closest("a, button, [track-click]")||void 0}(e.target);if(!t)return;const r={element_id:t.id,element_content:t.textContent?.trim().slice(0,200)||null,element_class_name:t.className||null,element_name:t.getAttribute("name")||null,element_type:t.tagName.toLowerCase(),element_path:s(t),scroll_width:document.documentElement.scrollWidth,scroll_height:document.documentElement.scrollHeight,pageX:e.pageX,pageY:e.pageY,ratio:window.devicePixelRatio||1};window.trackMonitor.track({data_type:"auto",event_type:"click",event_detail:r})}));window.addEventListener("click",e,!0)})(),!1!==e?.enableScroll&&(()=>{const e=new Set,t=i((()=>{const r=document.documentElement,n=r.scrollHeight-r.clientHeight;if(n<=0)return;const o=Math.round((window.scrollY||r.scrollTop)/n*100),a=Ee.filter((t=>o>=t&&!e.has(t)));a.length&&(a.forEach((t=>{e.add(t),window.trackMonitor.track({data_type:"auto",event_type:"scroll",event_detail:{scroll_depth:t}})})),e.has(90)&&window.removeEventListener("scroll",t))}),300);window.addEventListener("scroll",t,{passive:!0})})()};let xe=null,Ae=null;const Me="track-expose",Le="track-view",Ce=e=>{try{Ae=new WeakMap}catch(e){console.error("[TM]: create WeakMap fail: ",e)}const t=(e,t=!1)=>{const n=Ae?.get(e);if(n&&!t)return;n&&(n.viewTimer&&clearTimeout(n.viewTimer),n.exposeTimer&&clearTimeout(n.exposeTimer));const o=e.dataset.durationView||500,a=e.dataset.durationExpose||500;Ae?.set(e,{duration_view:o,duration_expose:a,viewTimer:null,exposeTimer:null}),xe?.observe(e),t&&function(e){if(!(e instanceof Element))return!1;if(!function e(t){if(!t)return!0;const r=window.getComputedStyle(t);return"none"!==r.display&&"hidden"!==r.visibility&&0!==parseFloat(r.opacity)&&e(t.parentElement)}(e))return!1;const t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)}(e)&&r(e)},r=t=>{const r=Ae?.get(t);if(!r)return;const o=t.dataset.eventDetail,a=t.dataset.traceid??void 0,i=t.dataset.spm,s=t.hasAttribute("track-real-time"),c=t.hasAttribute(Le),l=t.hasAttribute(Me);c&&l?r.exposeTimer=window.setTimeout((()=>{e({spm:i,request_id:a,data_type:"auto",event_type:"view_expose",event_detail:o,track_real_time:s}),t.removeAttribute(Le),r.exposeTimer=null}),parseInt(r.duration_expose,10)):(c&&(r.viewTimer=window.setTimeout((()=>{e({spm:i,request_id:a,data_type:"auto",event_type:"view",event_detail:o,track_real_time:s}),t.removeAttribute(Le),l&&r.exposeTimer||n(t),r.viewTimer=null}),parseInt(r.duration_view,10))),l&&(r.exposeTimer=window.setTimeout((()=>{e({spm:i,request_id:a,data_type:"auto",event_type:"expose",event_detail:o,track_real_time:s}),r.exposeTimer=null}),parseInt(r.duration_expose,10))))},n=e=>{const t=Ae?.get(e);t&&(xe?.unobserve(e),t.viewTimer&&clearTimeout(t.viewTimer),t.exposeTimer&&clearTimeout(t.exposeTimer),Ae?.delete(e))},o=e=>{e.forEach((e=>{const t=e.target,o=Ae?.get(t);o&&(o.viewTimer&&(clearTimeout(o.viewTimer),o.viewTimer=null),o.exposeTimer&&(clearTimeout(o.exposeTimer),o.exposeTimer=null),e.isIntersecting&&(r(t),t.hasAttribute(Le)||t.hasAttribute(Me)||n(t)))}))};xe=(()=>{let e=null;try{e=new IntersectionObserver(o,{root:null,threshold:.5})}catch(e){console.error("[TM]: create IntersectionObserver fail: ",e)}return e})();new Set([...document.querySelectorAll(`[${Me}]`),...document.querySelectorAll(`[${Le}]`)]).forEach((e=>t(e))),new MutationObserver((e=>{e.forEach((e=>{if("attributes"===e.type&&e.target instanceof HTMLElement){const r=e.target,o=e.attributeName,a=["data-event-detail","data-traceid","data-spm","data-duration-view","data-duration-expose"];r.hasAttribute(Me)||r.hasAttribute(Le)?a.includes(o)?t(r,!0):o!==Me&&o!==Le||t(r,!1):n(r)}else"childList"===e.type&&(e.addedNodes.forEach((e=>{if(e instanceof HTMLElement)if(e.hasAttribute(Me)||e.hasAttribute(Le))t(e);else{new Set([...e.querySelectorAll(`[${Me}]`),...e.querySelectorAll(`[${Le}]`)]).forEach((e=>t(e)))}})),e.removedNodes.forEach((e=>{if(e instanceof HTMLElement){const t=Ae?.get(e);if(t)n(e);else{new Set([...e.querySelectorAll(`[${Me}]`),...e.querySelectorAll(`[${Le}]`)]).forEach((e=>n(e)))}}})))}))})).observe(document.body||document.documentElement,{attributes:!0,childList:!0,subtree:!0})},Ie=/^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;function Re(e){const t=e.match(Ie);if(!t)return{};return{filename:t[2],functionName:t[1]||"",lineno:parseInt(t[3],10)||void 0,colno:parseInt(t[4],10)||void 0}}function Ne(e){try{const{stack:t}=e;if(!t)return[];const r=[];for(const e of t.split("\n").slice(1)){const t=Re(e);!t||t.filename?.includes("chrome-extension://")||t.filename?.includes("node_modules")||t.filename?.includes("<anonymous>")||r.push(t)}return r.slice(0,10)}catch(e){return[]}}const $e=new Set,qe=(e,t)=>{if((r=I().errorTraceRate)<0||r>1?(console.warn("[TM]: probability should be between 0 and 1"),0):Math.random()<r){if(window.trackMonitor.track(t),$e.size>=1e3){const e=$e.values().next().value;void 0!==e&&$e.delete(e)}$e.add(e)}var r},Fe=()=>{window.addEventListener("error",(e=>{(e=>{if(e instanceof ErrorEvent&&"Script error."===e.message){const t=p("js-Script error.");if($e.has(t))return;return void qe(t,{data_type:"error",event_type:"js",event_detail:{traceId:Te,msg:'Script error.(跨域脚本未加载 crossorigin 属性,无法获取堆栈;建议脚本加 crossorigin="anonymous")',target:"",stack:[],errorUuid:t,meta:{filename:e.filename,colno:e.colno,lineno:e.lineno,crossorigin_missing:!0}}})}if("js"!==m(e))return;if((e=>{const t=e.error?.stack||"";return/chrome-extension:\/\//.test(t)})(e))return;const t=p(`js-${e.message}-${e.filename}`);if($e.has(t))return;const r=Ne(e.error),n={traceId:Te,msg:e.message,target:r[0]?`${r[0].filename?.split("?")[0]}:${r[0].lineno}:${r[0].colno}`:"",stack:r,errorUuid:t,meta:{filename:e.filename,colno:e.colno,lineno:e.lineno}};qe(t,{data_type:"error",event_type:"js",event_detail:n})})(e)}),!0)},Pe=()=>{window.addEventListener("error",(e=>{(e=>{if("resource"!==m(e))return;const t=e.target,r=p(`resource-${t.src}-${t.tagName}`);if($e.has(r))return;const n={traceId:Te,msg:`加载${t.tagName}失败`,target:t.src?.split("?")[0],errorUuid:r,meta:{url:t.src,html:t.outerHTML,tagName:t.tagName}};qe(r,{data_type:"error",event_type:"resource",event_detail:n})})(e)}),!0)},Oe=()=>{window.addEventListener("unhandledrejection",(e=>(e=>{const t=e.reason?.message||e.reason,r=p(`unhandledrejection-${t}`);if($e.has(r))return;const n={traceId:Te,msg:t,stack:Ne(e.reason),errorUuid:r};qe(r,{data_type:"error",event_type:"unhandledrejection",event_detail:n})})(e)),!0)},Ue=()=>{const e=(e,t,r)=>{var n;if("string"!=typeof(n=e.url)||![F?.pushUrl,F?.authUrl,F?.realTimeUrl].filter((e=>!!e)).some((e=>0===n.indexOf(e))))if(t){const n=p(`http-${t}-${e.url}-${r}`);if($e.has(n))return;const o={traceId:Te,errorType:t,msg:r,target:e.url.split("?")[0],errorUuid:n,request:e};qe(n,{data_type:"error",event_type:"http",event_detail:o})}else if(e.status>=400){let r=e.statusText;const n=p(`http-${t="http_error"}-${e.url}-${r}`);if($e.has(n))return;const o={traceId:Te,errorUuid:n,errorType:t,target:e.url.split("?")[0],msg:r,request:e};qe(n,{data_type:"error",event_type:"http",event_detail:o})}};((e,t)=>{if("XMLHttpRequest"in window&&"function"==typeof window.XMLHttpRequest){const e=window.XMLHttpRequest;window.oXMLHttpRequest||(window.oXMLHttpRequest=e),window.XMLHttpRequest=function(){const r=new e,{open:n,send:o}=r;let a={};r.open=(e,t,o,i,s)=>{void 0===o&&(o=!0),a.method=e,a.url=t,n.call(r,e,t,o,i,s)},r.send=e=>{a.requestTime=(new Date).getTime(),o.call(r,e)};const i=(e,n)=>{const{status:o,statusText:i}=r,s=(new Date).getTime();a={...a,status:o,statusText:i,responseTime:s,duration:s-a.requestTime},"function"==typeof t&&t(a,e,n)};return r.addEventListener("loadend",(()=>i())),r.addEventListener("error",(()=>i("net_error","ERR_NETWORK"))),r.addEventListener("abort",(()=>i("cannel_request","ERR_CANCELED"))),r.addEventListener("timeout",(()=>i("timeout","ERR_NETWORK"))),r}}})(0,e),((e,t)=>{if("fetch"in window&&"function"==typeof window.fetch){const e=window.fetch;window.oFetch||(window.oFetch=e),window.fetch=async(r,n)=>{let o={};return o.method=n?.method||"",o.url=(r&&"string"!=typeof r?r?.url:r)||"",o.requestTime=(new Date).getTime(),e.call(window,r,n).then((async e=>{if("function"==typeof t){const r=e.clone(),n=(new Date).getTime();o={...o,status:r.status,statusText:r.statusText,responseTime:n,duration:n-o.requestTime},t(o)}return e})).catch((e=>{if("function"==typeof t){const r=(new Date).getTime();o={...o,responseTime:r,duration:r-o.requestTime},"AbortError"===e.name?t(o,"cannel_request","ERR_CANCELED"):t(o,"net_error","ERR_NETWORK")}return Promise.reject(e)}))}}})(0,e)};const ze=new WeakSet,Be=e=>({form_id:e.id||null,form_class:"string"==typeof e.className?e.className:null,form_name:e.getAttribute("name")||null,form_action:e.getAttribute("action")||null,form_text:(e.textContent||"").trim().slice(0,200)||null});let De=-1;const je=e=>{addEventListener("pageshow",(t=>{t.persisted&&(De=t.timeStamp,e(t))}),!0)},He=(e,t,r,n)=>{let o,a;return i=>{t.value>=0&&(i||n)&&(a=t.value-(o??0),(a||void 0===o)&&(o=t.value,t.delta=a,t.rating=((e,t)=>e>t[1]?"poor":e>t[0]?"needs-improvement":"good")(t.value,r),e(t)))}},Je=e=>{requestAnimationFrame((()=>requestAnimationFrame((()=>e()))))},Ke=()=>{const e=performance.getEntriesByType("navigation")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},Ge=()=>{const e=Ke();return e?.activationStart??0},We=(e,t=-1)=>{const r=Ke();let n="navigate";return De>=0?n="back-forward-cache":r&&(document.prerendering||Ge()>0?n="prerender":document.wasDiscarded?n="restore":r.type&&(n=r.type.replace(/_/g,"-"))),{name:e,value:t,rating:"good",delta:0,entries:[],id:`v5-${Date.now()}-${Math.floor(8999999999999*Math.random())+1e12}`,navigationType:n}},Xe=new WeakMap;function Qe(e,t){return Xe.get(e)||Xe.set(e,new t),Xe.get(e)}class Ve{t;i=0;o=[];h(e){if(e.hadRecentInput)return;const t=this.o[0],r=this.o.at(-1);this.i&&t&&r&&e.startTime-r.startTime<1e3&&e.startTime-t.startTime<5e3?(this.i+=e.value,this.o.push(e)):(this.i=e.value,this.o=[e]),this.t?.(e)}}const Ye=(e,t,r={})=>{try{if(PerformanceObserver.supportedEntryTypes.includes(e)){const n=new PerformanceObserver((e=>{Promise.resolve().then((()=>{t(e.getEntries())}))}));return n.observe({type:e,buffered:!0,...r}),n}}catch{}},Ze=e=>{let t=!1;return()=>{t||(e(),t=!0)}};let et=-1;const tt=new Set,rt=()=>"hidden"!==document.visibilityState||document.prerendering?1/0:0,nt=e=>{if("hidden"===document.visibilityState){if("visibilitychange"===e.type)for(const e of tt)e();isFinite(et)||(et="visibilitychange"===e.type?e.timeStamp:0,removeEventListener("prerenderingchange",nt,!0))}},ot=()=>{if(et<0){const e=Ge(),t=document.prerendering?void 0:globalThis.performance.getEntriesByType("visibility-state").filter((t=>"hidden"===t.name&&t.startTime>e))[0]?.startTime;et=t??rt(),addEventListener("visibilitychange",nt,!0),addEventListener("prerenderingchange",nt,!0),je((()=>{setTimeout((()=>{et=rt()}))}))}return{get firstHiddenTime(){return et},onHidden(e){tt.add(e)}}},at=e=>{document.prerendering?addEventListener("prerenderingchange",(()=>e()),!0):e()},it=[1800,3e3],st=(e,t={})=>{at((()=>{const r=ot();let n,o=We("FCP");const a=Ye("paint",(e=>{for(const t of e)"first-contentful-paint"===t.name&&(a.disconnect(),t.startTime<r.firstHiddenTime&&(o.value=Math.max(t.startTime-Ge(),0),o.entries.push(t),n(!0)))}));a&&(n=He(e,o,it,t.reportAllChanges),je((r=>{o=We("FCP"),n=He(e,o,it,t.reportAllChanges),Je((()=>{o.value=performance.now()-r.timeStamp,n(!0)}))})))}))},ct=[.1,.25];let lt=0,ut=1/0,dt=0;const mt=e=>{for(const t of e)t.interactionId&&(ut=Math.min(ut,t.interactionId),dt=Math.max(dt,t.interactionId),lt=dt?(dt-ut)/7+1:0)};let pt;const ft=()=>pt?lt:performance.interactionCount??0;let ht=0;class gt{u=[];l=new Map;m;p;v(){ht=ft(),this.u.length=0,this.l.clear()}L(){const e=Math.min(this.u.length-1,Math.floor((ft()-ht)/50));return this.u[e]}h(e){if(this.m?.(e),!e.interactionId&&"first-input"!==e.entryType)return;const t=this.u.at(-1);let r=this.l.get(e.interactionId);if(r||this.u.length<10||e.duration>t.P){if(r?e.duration>r.P?(r.entries=[e],r.P=e.duration):e.duration===r.P&&e.startTime===r.entries[0].startTime&&r.entries.push(e):(r={id:e.interactionId,entries:[e],P:e.duration},this.l.set(r.id,r),this.u.push(r)),this.u.sort(((e,t)=>t.P-e.P)),this.u.length>10){const e=this.u.splice(10);for(const t of e)this.l.delete(t.id)}this.p?.(r)}}}const yt=e=>{const t=globalThis.requestIdleCallback||setTimeout;"hidden"===document.visibilityState?e():(e=Ze(e),addEventListener("visibilitychange",e,{once:!0,capture:!0}),t((()=>{e(),removeEventListener("visibilitychange",e,{capture:!0})})))},wt=[200,500],Tt=(e,t={})=>{if(!globalThis.PerformanceEventTiming||!("interactionId"in PerformanceEventTiming.prototype))return;const r=ot();at((()=>{"interactionCount"in performance||pt||(pt=Ye("event",mt,{type:"event",buffered:!0,durationThreshold:0}));let n,o=We("INP");const a=Qe(t,gt),i=e=>{yt((()=>{for(const t of e)a.h(t);const t=a.L();t&&t.P!==o.value&&(o.value=t.P,o.entries=t.entries,n())}))},s=Ye("event",i,{durationThreshold:t.durationThreshold??40});n=He(e,o,wt,t.reportAllChanges),s&&(s.observe({type:"first-input",buffered:!0}),r.onHidden((()=>{i(s.takeRecords()),n(!0)})),je((()=>{a.v(),o=We("INP"),n=He(e,o,wt,t.reportAllChanges)})))}))};class vt{m;h(e){this.m?.(e)}}const bt=[2500,4e3],St=[800,1800],_t=e=>{document.prerendering?at((()=>_t(e))):"complete"!==document.readyState?addEventListener("load",(()=>_t(e)),!0):setTimeout(e)};function Et(){const e={ttfb:null,lcp:null,fp:null,fcp:null,connectionRtt:null,ttfbRequestTime:null,inp:null,cls:null,dcl:null,loadTime:null};((e,t={})=>{at((()=>{const r=ot();let n,o=We("LCP");const a=Qe(t,vt),i=e=>{t.reportAllChanges||(e=e.slice(-1));for(const t of e)a.h(t),t.startTime<r.firstHiddenTime&&(o.value=Math.max(t.startTime-Ge(),0),o.entries=[t],n())},s=Ye("largest-contentful-paint",i);if(s){n=He(e,o,bt,t.reportAllChanges);const r=Ze((()=>{i(s.takeRecords()),s.disconnect(),n(!0)})),a=e=>{e.isTrusted&&(yt(r),removeEventListener(e.type,a,{capture:!0}))};for(const e of["keydown","click","visibilitychange"])addEventListener(e,a,{capture:!0});je((r=>{o=We("LCP"),n=He(e,o,bt,t.reportAllChanges),Je((()=>{o.value=performance.now()-r.timeStamp,n(!0)}))}))}}))})((t=>{e.lcp=u(t.value)}),{reportAllChanges:!0}),((e,t={})=>{const r=ot();st(Ze((()=>{let n,o=We("CLS",0);const a=Qe(t,Ve),i=e=>{for(const t of e)a.h(t);a.i>o.value&&(o.value=a.i,o.entries=a.o,n())},s=Ye("layout-shift",i);s&&(n=He(e,o,ct,t.reportAllChanges),r.onHidden((()=>{i(s.takeRecords()),n(!0)})),je((()=>{a.i=0,o=We("CLS",0),n=He(e,o,ct,t.reportAllChanges),Je((()=>n()))})),setTimeout(n))})))})((t=>{e.cls=Math.round(1e4*t.value)/1e4}),{reportAllChanges:!0}),Tt((t=>{e.inp=u(t.value)}),{reportAllChanges:!0}),((e,t={})=>{let r=We("TTFB"),n=He(e,r,St,t.reportAllChanges);_t((()=>{const o=Ke();o&&(r.value=Math.max(o.responseStart-Ge(),0),r.entries=[o],n(!0),je((()=>{r=We("TTFB",0),n=He(e,r,St,t.reportAllChanges),n(!0)})))}))})((t=>{e.ttfb=u(t.value)})),st((t=>{e.fcp=u(t.value)}));const t=()=>{(()=>{try{performance.getEntriesByType("paint").forEach((t=>{"first-paint"===t.name&&(e.fp=u(t.startTime))}))}catch(e){console.warn("[TM]: Failed to collect FP:",e)}try{const t=navigator.connection||navigator.mozConnection||navigator.webkitConnection;t&&void 0!==t.rtt&&(e.connectionRtt=t.rtt)}catch(e){console.warn("[TM]: Failed to collect Connection RTT:",e)}try{const t=performance.getEntriesByType("navigation")[0];if(t){const{responseStart:r,requestStart:n}=t;r>0&&n>0&&n<=r&&(e.ttfbRequestTime=u(r-n))}}catch(e){console.warn("[TM]: Failed to collect TTFB Request Time:",e)}try{const t=performance.getEntriesByType("navigation")[0];if(t){const{domContentLoadedEventEnd:r,loadEventEnd:n,fetchStart:o}=t;r>0&&o>0&&(e.dcl=u(r-o)),n>0&&o>0&&(e.loadTime=u(n-o))}}catch(e){console.warn("[TM]: Failed to collect DCL and Load Time:",e)}})(),window.trackMonitor.track({data_type:"performance",event_type:"metrics",event_detail:{traceId:Te,data:e}})};let r=0;const n=()=>{const e=Date.now();e-r<3e4||(r=e,t())};window.addEventListener("beforeunload",t),window.addEventListener("pagehide",n),document.addEventListener("visibilitychange",(()=>{"hidden"===document.visibilityState&&n()}))}const kt="__tengence_sdk",xt=e=>{if("undefined"!=typeof window&&window.trackMonitor&&window.trackMonitor[kt])return console.warn("[TM]: init 已调用过,复用现有实例(如需重建请刷新页面)"),window.trackMonitor;const{client:t,beforeClose:r}=we(e),n=I(),o=n.dataTypes.includes("auto");var a;return o&&(Ce(t.track),!1!==n.enableScroll&&ke({enableScroll:n.enableScroll})),o&&!1!==n.enableFormTrack&&(a=t.track,document.addEventListener("focusin",(e=>{const t=e.target;if(!(r=t)||"INPUT"!==r.tagName&&"SELECT"!==r.tagName&&"TEXTAREA"!==r.tagName)return;var r;const n=t.closest("form");n&&!ze.has(n)&&(ze.add(n),a({data_type:"auto",event_type:"form_start",event_detail:Be(n)}))}),!0),document.addEventListener("submit",(e=>{const t=e.target;if(!t||"FORM"!==t.tagName)return;const r=e.submitter;a({data_type:"auto",event_type:"form_submit",event_detail:{...Be(t),submitter_id:r?.id||null,submitter_text:(r?.textContent||"").trim().slice(0,200)||null}})}),!0)),n.dataTypes.includes("error")&&(Fe(),Pe(),Oe(),Ue()),n.dataTypes.includes("performance")&&l((()=>{!function(){const e=window.performance||window.msPerformance;if(!e)return{dnsLookupTime:null,tcpConnectTime:null,ttfb:null,transferTime:null,domParseTime:null,domCompleteTime:null,loadEventTime:null,totalPageLoad:null};const t=e.getEntriesByType&&"function"==typeof e.getEntriesByType?e.getEntriesByType("navigation"):void 0,r=Array.isArray(t)?t[0]:void 0;let n=null;if(r)n=r;else{const t=e.timing;t&&(n={startTime:0,domainLookupStart:t.domainLookupStart,domainLookupEnd:t.domainLookupEnd,connectStart:t.connectStart,connectEnd:t.connectEnd,requestStart:t.requestStart,responseStart:t.responseStart,responseEnd:t.responseEnd,domInteractive:t.domInteractive,domComplete:t.domComplete,loadEventEnd:t.loadEventEnd,fetchStart:t.fetchStart},!n.requestStart&&t.fetchStart&&(n.requestStart=t.fetchStart))}const o={dnsLookupTime:n?u(n.domainLookupEnd-n.domainLookupStart):null,tcpConnectTime:n?u(n.connectEnd-n.connectStart):null,ttfb:n?u(n.responseStart-(n.requestStart??n.fetchStart??0)):null,transferTime:n?u(n.responseEnd-n.responseStart):null,domParseTime:n?u(n.domInteractive-n.responseEnd):null,domCompleteTime:n?u(n.domComplete-n.domInteractive):null,loadEventTime:n?u(n.loadEventEnd-(n.domComplete??0)):null,totalPageLoad:n?u((n.loadEventEnd??performance.now())-(n.startTime??0)):null};window.trackMonitor.track({data_type:"performance",event_type:"navigation_timing",event_detail:{traceId:Te,data:o}})}(),function(){const e=window.performance||window.msPerformance;if(!e)return[];const t=[];if(e.getEntriesByType){const r=(e.getEntriesByType("resource")||[]).map((e=>{const t="number"==typeof e.redirectEnd&&"number"==typeof e.redirectStart?u(e.redirectEnd-e.redirectStart):null,r="number"==typeof e.domainLookupEnd&&"number"==typeof e.domainLookupStart?u(e.domainLookupEnd-e.domainLookupStart):null,n="number"==typeof e.connectEnd&&"number"==typeof e.connectStart?u(e.connectEnd-e.connectStart):null,o="number"==typeof e.requestStart&&"number"==typeof e.fetchStart?u(e.requestStart-e.fetchStart):null,a="number"==typeof e.responseStart&&"number"==typeof e.requestStart?u(e.responseStart-e.requestStart):null,i="number"==typeof e.responseEnd&&"number"==typeof e.responseStart?u(e.responseEnd-e.responseStart):null,s="number"==typeof e.duration?u(e.duration):null,c="number"==typeof e.startTime?u(e.startTime):null,l="number"==typeof e.transferSize&&isFinite(e.transferSize)&&e.transferSize>=0?Math.round(e.transferSize):null,d="number"==typeof e.encodedBodySize&&isFinite(e.encodedBodySize)&&e.encodedBodySize>=0?Math.round(e.encodedBodySize):null,m="number"==typeof e.decodedBodySize&&isFinite(e.decodedBodySize)&&e.decodedBodySize>=0?Math.round(e.decodedBodySize):null;return{name:e.name,initiatorType:e.initiatorType||"",startTime:c,duration:s,redirectTime:t,cacheTime:o,dnsTime:r,connectTime:n,requestTime:a,responseTime:i,transferSize:l,encodedBodySize:d,decodedBodySize:m}}));r.sort(((e,t)=>(t.duration??0)-(e.duration??0)));const n=I().resourceFlowLimit;if(0===n)return;for(let e=0;e<Math.min(n,r.length);e++)t.push(r[e]);if(!t.length)return}window.trackMonitor.track({data_type:"performance",event_type:"resource_flow",event_detail:{traceId:Te,data:t}})}(),Et()})),l((()=>{r()})),window.trackMonitor[kt]=!0,window.trackMonitor};export{xt as default};
@@ -23,9 +23,7 @@ export interface BaseOptions {
23
23
  realTimeUrl?: string;
24
24
  realTimeReportInterval?: number;
25
25
  isLogger?: boolean;
26
- traceBehavior?: boolean;
27
- tracePerformance?: boolean;
28
- traceError?: boolean;
26
+ dataTypes?: DataType[];
29
27
  enableScroll?: boolean;
30
28
  enableFormTrack?: boolean;
31
29
  errorTraceRate?: number;
@@ -34,6 +32,8 @@ export interface BaseOptions {
34
32
  enableTracking?: boolean;
35
33
  respectGpc?: boolean;
36
34
  requestTimeout?: number;
35
+ configUrl?: string;
36
+ configTtl?: number;
37
37
  sanitize?: SanitizeOptions | false;
38
38
  beforeSend?: (events: ReportData[]) => ReportData[];
39
39
  onDrop?: (events: ReportData[], reason: DropReason) => void;
@@ -90,3 +90,8 @@ export type TrackFunction = (event: string | ClientReportData, detail?: any, opt
90
90
  export interface AnyObject {
91
91
  [key: string]: any;
92
92
  }
93
+ /**
94
+ * 运行时配置增量(client.setConfig / 使用方显式 L2,优先级最高)。
95
+ * 仅暴露远程可下发的可控键(安全地址/采集总闸/GPC/脱敏不在其列——远程不可改)。
96
+ */
97
+ export type SdkConfigPatch = Partial<Pick<BaseOptions, "dataTypes" | "enableScroll" | "enableFormTrack" | "enableAutoSessionId" | "errorTraceRate" | "reportInterval" | "cacheNumber" | "maxCacheSize" | "maxRetries" | "resourceFlowLimit">>;
@@ -0,0 +1 @@
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).TrackSDK={})}(this,(function(e){"use strict";var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},t(e,r)};var r=function(){return r=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},r.apply(this,arguments)};function n(e,t,r,n){return new(r||(r=Promise))((function(o,i){function a(e){try{l(n.next(e))}catch(e){i(e)}}function c(e){try{l(n.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,c)}l((n=n.apply(e,t||[])).next())}))}function o(e,t){var r,n,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=c(0),a.throw=c(1),a.return=c(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function c(c){return function(l){return function(c){if(r)throw new TypeError("Generator is already executing.");for(;a&&(a=0,c[0]&&(i=0)),i;)try{if(r=1,n&&(o=2&c[0]?n.return:c[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,c[1])).done)return o;switch(n=0,o&&(c=[2&c[0],o.value]),c[0]){case 0:case 1:o=c;break;case 4:return i.label++,{value:c[1],done:!1};case 5:i.label++,n=c[1],c=[0];continue;case 7:c=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==c[0]&&2!==c[0])){i=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]<o[3])){i.label=c[1];break}if(6===c[0]&&i.label<o[1]){i.label=o[1],o=c;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(c);break}o[2]&&i.ops.pop(),i.trys.pop();continue}c=t.call(e,i)}catch(e){c=[6,e],n=0}finally{r=o=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}([c,l])}}}function i(e){var t="function"==typeof Symbol&&Symbol.iterator,r=t&&e[t],n=0;if(r)return r.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function a(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,i=r.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(n=i.next()).done;)a.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return a}function c(e,t,r){if(r||2===arguments.length)for(var n,o=0,i=t.length;o<i;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))}"function"==typeof SuppressedError&&SuppressedError;var l=function(e){function r(t,r){var n=e.call(this,r||"[TM]: Auth error ".concat(t))||this;return Object.defineProperty(n,"status",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),n.name="AuthError",n.status=t,n}return function(e,r){if("function"!=typeof r&&null!==r)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");function n(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}(r,e),r}(Error),u=function(e){var t=e.method,r=e.url,n=e.data,o=e.headers,i=void 0===o?{}:o,a=e.withCredentials,c=void 0!==a&&a,l=e.timeoutMs;return new Promise((function(e,o){var a=new XMLHttpRequest;a.open(t,r,!0),l&&(a.timeout=l),Object.keys(i).forEach((function(e){a.setRequestHeader(e,i[e])})),a.withCredentials=!!c,a.onreadystatechange=function(){if(4===a.readyState)if(a.status>=200&&a.status<300)try{var t=JSON.parse(a.responseText);e(t)}catch(e){o(e)}else{var r=new Error("[TM]: Request failed with status ".concat(a.status));r.status=a.status,o(r)}},a.onerror=function(){o(new Error("[TM]: Network error"))},a.ontimeout=function(){var e=new Error("[TM]: Request timeout");e.timeout=!0,o(e)},"POST"===t&&n?a.send(n):a.send()}))},s=function(e,t,n){if(!n)return fetch(e,t);var o=new AbortController,i=setTimeout((function(){return o.abort()}),n);return fetch(e,r(r({},t),{signal:o.signal})).catch((function(e){if(e&&"AbortError"===e.name){var t=new Error("[TM]: Request timeout");throw t.timeout=!0,t}throw e})).finally((function(){return clearTimeout(i)}))},d=function(e,t,r,n){var o={"Content-Type":"application/json"};r&&(o.Authorization="Bearer ".concat(r));var i=function(){return u({method:"POST",url:e,data:JSON.stringify(t),headers:o,withCredentials:!0,timeoutMs:n})};return"function"!=typeof fetch?i():s(e,{method:"POST",keepalive:!0,credentials:"include",headers:o,body:JSON.stringify(t)},n).then((function(e){if(401===e.status||403===e.status)throw new l(e.status,"[TM]: Auth error ".concat(e.status));if(429===e.status){(n=new Error("[TM]: Request throttled with status 429")).status=429;var t=e.headers.get("Retry-After");if(t){var r=parseInt(t,10);isNaN(r)||(n.retryAfter=1e3*r)}throw n}var n;if(!e.ok)throw(n=new Error("[TM]: Request failed with status ".concat(e.status))).status=e.status,n;return e.json()})).catch((function(e){if(e instanceof l)throw e;if(e&&e.status)throw e;return i()}))},f=function(e,t,r){var n={};t&&(n.Authorization="Bearer ".concat(t));var o=function(){return u({method:"GET",url:e,headers:n,withCredentials:!0,timeoutMs:r})};return"function"!=typeof fetch?o():s(e,{method:"GET",credentials:"include",headers:n},r).then((function(e){if(401===e.status||403===e.status)throw new l(e.status,"[TM]: Auth error ".concat(e.status));if(!e.ok){var t=new Error("[TM]: Request failed with status ".concat(e.status));throw t.status=e.status,t}return e.json()})).catch((function(e){if(e instanceof l)throw e;if(e&&e.status)throw e;return o()}))},v=window.requestIdleCallback||window.requestAnimationFrame||function(e){return setTimeout(e,17)};function p(e,t,r){void 0===t&&(t=150),void 0===r&&(r=!1);var n=null;return function(){for(var o=[],i=0;i<arguments.length;i++)o[i]=arguments[i];var a=this,c=r&&!n;n&&clearTimeout(n),n=setTimeout((function(){n=null,r||e.apply(a,o)}),t),c&&e.apply(a,o)}}var m=function(e,t){void 0===t&&(t=300);var r=0;return function(){for(var n=[],o=0;o<arguments.length;o++)n[o]=arguments[o];var i=Date.now();i-r>=t&&(r=i,e.apply(this,n))}};function h(e,t){if(void 0===t&&(t=""),!e)return t;var r=e.parentElement,n=e.id,o=e.tagName.toLowerCase(),i=t?">".concat(t):"";return r&&r!==document.documentElement&&r!==document.body?n?"#".concat(n).concat(i):h(r,"".concat(o).concat(i)):"".concat(o).concat(i)}var y=function(){var e,t;if(null===(e=window.performance)||void 0===e?void 0:e.navigation)return performance.navigation.type;if(null===(t=window.performance)||void 0===t?void 0:t.getEntriesByType){var r=performance.getEntriesByType("navigation");if(r.length>0)return r[0].type}return 255},g=function(e){"prerendering"in document&&document.prerendering?function(e){"prerendering"in document&&document.prerendering?addEventListener("prerenderingchange",(function(){return e()}),!0):e()}((function(){return g(e)})):"complete"!==(null===document||void 0===document?void 0:document.readyState)?addEventListener("load",(function(){return g(e)}),!0):setTimeout(e)};function w(e){return"number"!=typeof e||!isFinite(e)||e<0?null:Math.round(100*e)/100}function T(){var e=new Uint8Array(16);if("undefined"!=typeof crypto&&"function"==typeof crypto.getRandomValues)crypto.getRandomValues(e);else for(var t=0;t<16;t++)e[t]=Math.floor(256*Math.random());e[6]=15&e[6]|64,e[8]=63&e[8]|128;var r="";for(t=0;t<16;t++)r+=(e[t]<16?"0":"")+e[t].toString(16);return r}var b=function(e){return e instanceof ErrorEvent?"Script error."===e.message?"cors":"js":"resource"},S=function(e){return function(e){for(var t=5381,r=0;r<e.length;r++)t=(t<<5)+t+e.charCodeAt(r)>>>0;return t.toString(16).padStart(8,"0")}(e)+function(e){for(var t=5381,r=e.length-1;r>=0;r--)t=((t<<5)+t^e.charCodeAt(r))>>>0;return t.toString(16).padStart(8,"0")}(e)};var _,E,x,k={view:"#3b82f6",click:"#06b6d4",expose:"#8b5cf6",enter:"#10b981",leave:"#f59e0b",stay:"#84cc16",cart:"#ec4899",buy:"#ef4444",pay:"#dc2626",default:"#6b7280"},A={view:"👁️",click:"👆",expose:"✨",enter:"🚪",leave:"👋",stay:"⏱️",cart:"🛒",buy:"💰",pay:"💳",default:"📊"},M={common:"#3b82f6",behavior:"#10b981",performance:"#f59e0b",error:"#ef4444",custom:"#8b5cf6",default:"#6b7280"},L=function(e,t){t.forEach((function(t,n){var o=t.event_type||"unknown",i=t.data_type||"auto",a=function(e){return k[e]||k.default}(o),c=function(e){return M[e]||M.default}(i),l=function(e){return A[e]||A.default}(o),u=t.event_detail;if("string"==typeof u)try{u=JSON.parse(u)}catch(e){}console.groupCollapsed("%c".concat(l," [TM-").concat(e,"] %c").concat(i.toUpperCase(),"%c → %c").concat(o.toUpperCase(),"%c #").concat(n+1),"color: #6b7280; font-weight: bold;","color: ".concat(c,"; font-weight: bold; background: ").concat(c,"20; padding: 2px 6px; border-radius: 3px;"),"color: #6b7280;","color: ".concat(a,"; font-weight: bold; background: ").concat(a,"20; padding: 2px 6px; border-radius: 3px;"),"color: #6b7280; font-weight: normal;");var s=r(r({},t),{event_detail:u});console.log("%c"+JSON.stringify(s,null,2),"color: #6b7280; font-family: monospace; font-size: 11px; line-height: 1.5;"),console.groupEnd()})),console.log("%c✅ [TM] 本次通过 ".concat(e," 上报 ").concat(t.length," 条埋点数据"),"color: #10b981; font-weight: bold; font-size: 12px; padding: 4px 8px; background: #10b98120; border-radius: 4px; border-left: 3px solid #10b981;")},C={dataTypes:["auto","behavior","performance","error"],idFieldName:"event_id",errorTraceRate:.5,reportInterval:5e3,cacheNumber:100,maxCacheSize:56,maxRetries:10,resourceFlowLimit:15,enableScroll:!0,enableFormTrack:!0,enableAutoSessionId:!1},I=["dataTypes","idFieldName","errorTraceRate","reportInterval","cacheNumber","maxCacheSize","maxRetries","resourceFlowLimit","enableScroll","enableFormTrack","enableAutoSessionId"],R={},N=null,O=r({},C),P=[],q=function(e){var t,r,n={};try{for(var o=i(I),a=o.next();!a.done;a=o.next()){var c=a.value,l=e[c];void 0!==l&&(n[c]=l)}}catch(e){t={error:e}}finally{try{a&&!a.done&&(r=o.return)&&r.call(o)}finally{if(t)throw t.error}}return n},F=function(e){if(Array.isArray(e)){var t=new Set(C.dataTypes);t.add("custom");var r=e.filter((function(e){return t.has(String(e))}));return r.length?Array.from(new Set(r)):void 0}},j=function(e,t,r,n){var o="number"!=typeof e||Number.isNaN(e)?NaN:e;return o>=r&&o<=n?o:t},U=function(e,t){return"boolean"==typeof e?e:t},z=function(){var e,t,r,n={};try{for(var o=i(I),a=o.next();!a.done;a=o.next()){var c=a.value,l=null!==(r=R[c])&&void 0!==r?r:null==N?void 0:N[c];void 0!==l&&(n[c]=l)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(t=o.return)&&t.call(o)}finally{if(e)throw e.error}}return O=function(e){var t,r=C;return{dataTypes:null!==(t=F(e.dataTypes))&&void 0!==t?t:r.dataTypes,idFieldName:"string"==typeof e.idFieldName&&e.idFieldName?e.idFieldName:r.idFieldName,errorTraceRate:j(e.errorTraceRate,r.errorTraceRate,0,1),reportInterval:j(e.reportInterval,r.reportInterval,100,864e5),cacheNumber:j(e.cacheNumber,r.cacheNumber,1,1e5),maxCacheSize:j(e.maxCacheSize,r.maxCacheSize,1,10240),maxRetries:j(e.maxRetries,r.maxRetries,0,100),resourceFlowLimit:j(e.resourceFlowLimit,r.resourceFlowLimit,0,200),enableScroll:U(e.enableScroll,r.enableScroll),enableFormTrack:U(e.enableFormTrack,r.enableFormTrack),enableAutoSessionId:U(e.enableAutoSessionId,r.enableAutoSessionId)}}(n),function(){var e,t;try{for(var r=i(P),n=r.next();!n.done;n=r.next()){var o=n.value;try{o()}catch(e){}}}catch(t){e={error:t}}finally{try{n&&!n.done&&(t=r.return)&&t.call(r)}finally{if(e)throw e.error}}}(),O},D=function(e){return R=r(r({},R),q(e)),z()},B=function(e){return N=e?q(e):null,z()},H=function(){return O},J=["auto","behavior","performance","error"],K="tengence_sdk_config",G=function(e,t){if(t)return t;if(e){var r=/^(https?:\/\/[^/]+)/.exec(e);if(r)return"".concat(r[1],"/v1/track/config")}return"".concat("https://api.tengence.com","/v1/track/config")},W=function(e,t,r){return n(void 0,void 0,void 0,(function(){var n,i,a,c,l;return o(this,(function(o){switch(o.label){case 0:return o.trys.push([0,2,,3]),[4,f(e,t,r)];case 1:return n=o.sent(),i=null!==(l=null==n?void 0:n.data)&&void 0!==l?l:n,a=function(e){if(!e||!Array.isArray(e.dataTypes)||0===e.dataTypes.length)return null;var t={fetchedAt:Date.now()},r=new Set(J);return r.add("custom"),t.dataTypes=e.dataTypes.filter((function(e){return r.has(String(e))})),"string"==typeof e.idFieldName&&e.idFieldName&&(t.idFieldName=e.idFieldName),"number"==typeof e.errorTraceRate&&(t.errorTraceRate=e.errorTraceRate),"number"==typeof e.reportInterval&&(t.reportInterval=e.reportInterval),"number"==typeof e.cacheNumber&&(t.cacheNumber=e.cacheNumber),"number"==typeof e.maxCacheSize&&(t.maxCacheSize=e.maxCacheSize),"number"==typeof e.maxRetries&&(t.maxRetries=e.maxRetries),"number"==typeof e.resourceFlowLimit&&(t.resourceFlowLimit=e.resourceFlowLimit),"boolean"==typeof e.enableScroll&&(t.enableScroll=e.enableScroll),"boolean"==typeof e.enableFormTrack&&(t.enableFormTrack=e.enableFormTrack),"boolean"==typeof e.enableAutoSessionId&&(t.enableAutoSessionId=e.enableAutoSessionId),"string"==typeof e.appId&&(t.appId=e.appId),"number"==typeof e.configVersion&&(t.configVersion=e.configVersion),"string"==typeof e.updatedAt&&(t.updatedAt=e.updatedAt),t}(i),a?(B(a),function(e){try{localStorage.setItem(K,JSON.stringify(e))}catch(e){}}(a),[2,a]):("undefined"!=typeof console&&console.warn("[TM]: 远程配置返回空,沿用缓存/默认配置"),[2,null]);case 2:return c=o.sent(),"undefined"!=typeof console&&console.warn("[TM]: 拉取远程配置失败,沿用缓存/默认配置",c),[2,null];case 3:return[2]}}))}))},X=void 0,Q="TRACK_MONITOR_DATA",V="MONITOR_REAL_TIME_DATA",$="TRACK_MONITOR_USER",Y="tengence_device_id",Z="tengence_register_properties",ee="TRACK_MONITOR_LOGGER",te="tengence_tracking_enabled",re=2e3,ne="tengence_access_token",oe=null,ie=null,ae=function(e){return(t=e,r={},n=null==X?void 0:X.requestTimeout,o={"Content-Type":"application/json"},i=function(){return u({method:"POST",url:t,data:JSON.stringify(r),headers:o,withCredentials:!0,timeoutMs:n})},"function"!=typeof fetch?i():s(t,{method:"POST",credentials:"include",headers:o,body:JSON.stringify(r)},n).then((function(e){if(!e.ok){var t=new Error("[TM]: Request failed with status ".concat(e.status));throw t.status=e.status,t}return e.json()})).catch((function(e){if(e&&e.status)throw e;return i()}))).then((function(e){var t=e&&e.data,r=t&&t.accessToken,n=t&&t.accessExpAt;if(!r||"number"!=typeof n)throw new Error("[TM]: authUrl 响应缺少 accessToken/accessExpAt");return function(e,t){oe={token:e,expAt:t};try{localStorage.setItem(ne,JSON.stringify({token:e,expAt:t}))}catch(e){}}(r,n),r}));var t,r,n,o,i},ce=function(e){var t,r=function(){if(oe)return oe;try{var e=localStorage.getItem(ne);if(!e)return null;var t=JSON.parse(e);if(t&&"string"==typeof t.token&&t.token&&"number"==typeof t.expAt)return oe={token:t.token,expAt:t.expAt}}catch(e){}return null}();return(t=r)&&t.token.length>0&&t.expAt-6e4>Date.now()?Promise.resolve(r.token):(ie||(ie=ae(e).catch((function(e){throw e})).finally((function(){ie=null}))),ie)},le={timer:null,promise:null},ue={timer:null,promise:null},se=function(e){var t=JSON.stringify(e);return(new TextEncoder).encode(t).length/1024},de=null,fe=function(){if(de)return de;try{var e=localStorage.getItem(Z),t=e?JSON.parse(e):{};return de=t,t}catch(e){return console.error("[TM]: get register properties fail: ",e),{}}},ve=function(e){de=e;try{localStorage.setItem(Z,JSON.stringify(e))}catch(e){console.error("[TM]: save register properties fail: ",e)}},pe=function(e){if(e&&"object"==typeof e&&!Array.isArray(e)){var t=r(r({},fe()),e),n=Object.keys(t);if(n.length>50){var o={};return n.slice(0,50).forEach((function(e){o[e]=t[e]})),console.warn("[TM]: register properties exceed max ".concat(50," keys, extra keys dropped")),void ve(o)}ve(t)}else console.error("[TM]: registerGlobalProperties props must be a plain object")},me=function(e){var t=document.cookie.match(new RegExp("(?:^|;\\s*)"+e+"=([^;]*)"));return t?decodeURIComponent(t[1]):void 0},he=function(e){document.cookie="".concat(Y,"=").concat(encodeURIComponent(e),"; Max-Age=63072000; Path=/; Secure; SameSite=Lax")},ye=function(){if(_)return _;try{var e=localStorage.getItem(Y);if(e)return me(Y)||he(e),_=e;var t=me(Y);if(t){try{localStorage.setItem(Y,t)}catch(e){}return _=t}e=T();try{localStorage.setItem(Y,e)}catch(e){}return he(e),_=e}catch(e){return void console.error("[TM]: get or create device id fail: ",e)}},ge="tengence_session_id",we=function(){try{var e=sessionStorage.getItem(ge),t=e?JSON.parse(e):null,r=Date.now();return!t||!t.id||r-t.lastActiveAt>18e5?(t={id:T(),lastActiveAt:r},sessionStorage.setItem(ge,JSON.stringify(t))):(t.lastActiveAt=r,sessionStorage.setItem(ge,JSON.stringify(t))),t.id}catch(e){return}},Te=function(e,t){var r,n;try{var o=new URL(e,location.href);if(!o.searchParams.toString())return e;if(t&&t.length){var a=[];try{for(var c=i(t),l=c.next();!l.done;l=c.next()){var u=l.value,s=o.searchParams.get(u);null!==s&&a.push("".concat(u,"=").concat(encodeURIComponent(s)))}}catch(e){r={error:e}}finally{try{l&&!l.done&&(n=c.return)&&n.call(c)}finally{if(r)throw r.error}}o.search=a.length?"?".concat(a.join("&")):""}else o.search="";return o.toString()}catch(t){return e}},be=function(e,t,r){var n,o;if("string"==typeof e)return t>0&&e.length>t?e.slice(0,t)+"...[truncated]":e;if(Array.isArray(e))return e.map((function(e){return be(e,t,r)}));if(e&&"object"==typeof e){var a={};try{for(var c=i(Object.keys(e)),l=c.next();!l.done;l=c.next()){var u=l.value,s=e[u];"string"==typeof s&&/(^|_)url$|(^|_)href$|^referrer$/i.test(u)&&/^https?:\/\//i.test(s)?a[u]=Te(s,r):a[u]=be(s,t,r)}}catch(e){n={error:e}}finally{try{l&&!l.done&&(o=c.return)&&o.call(c)}finally{if(n)throw n.error}}return a}return e},Se=function(e){var t,n={page_url:location.href,hostname:window.location.hostname||window.location.host,os:window.navigator.platform,user_id:localStorage.getItem($)||void 0,user_agent:window.navigator.userAgent,screen_width:window.screen.width,screen_height:window.screen.height,lib_version:"1.2.3",lib_type:"js",event_time:Date.now(),timezone_offset:(new Date).getTimezoneOffset().toString()},o=null==X?void 0:X.sanitize;try{t="string"==typeof e.event_detail?e.event_detail:JSON.stringify(o&&(o.maxTextLength>0||o.stripQuery)?be(e.event_detail,o.maxTextLength,o.preserveQueryKeys):e.event_detail)}catch(e){return ke("serialize_failed","事件 event_detail 序列化失败(循环引用/BigInt?),该事件丢弃",{error:e}),void console.warn("[TM]: event_detail 序列化失败,该事件丢弃",e)}return r(r({session_id:e.session_id||(H().enableAutoSessionId?we():void 0),request_id:e.request_id,event_id:e.event_id||T(),spm:e.spm,data_type:e.data_type||"behavior",event_type:e.event_type,event_detail:t},n),{page_url:o&&o.stripQuery?Te(n.page_url,o.preserveQueryKeys):n.page_url,device_id:ye(),register_properties:JSON.stringify(fe()),platform:e.platform||E})},_e=function(){try{return"true"===localStorage.getItem(ee)}catch(e){return!1}},Ee=function(e,t,r,n,o){return void 0===e?t:"number"!=typeof e||Number.isNaN(e)||e<r||e>n?(console.warn("[TM]: 配置 ".concat(o,"=").concat(e," 非法,回退默认值 ").concat(t)),t):e},xe=function(e,t){var r;try{null===(r=null==X?void 0:X.onDrop)||void 0===r||r.call(X,e,t)}catch(e){}},ke=function(e,t,r){var n;(null==X?void 0:X.isLogger)&&console.error("[TM]: ".concat(t));try{null===(n=null==X?void 0:X.onError)||void 0===n||n.call(X,{code:e,message:t,context:r})}catch(e){}},Ae=function(){try{var e=localStorage.getItem(te);return null===e||"1"===e}catch(e){return!0}},Me=function(e){var t,a,c,u,s,f,p,m,h=e.apiKey,y=void 0,g=/Android|iPhone|iPad|iPod|Mobile/i.test(window.navigator.userAgent);E=e.platform||(g?"h5":"web"),X={pushUrl:e.pushUrl||"https://api.tengence.com/v1/push/event",authUrl:e.authUrl,realTimeUrl:e.realTimeUrl,cacheNumber:Ee(e.cacheNumber,100,1,1/0,"cacheNumber"),reportInterval:Ee(e.reportInterval,5e3,100,1/0,"reportInterval"),realTimeReportInterval:Ee(e.realTimeReportInterval,200,100,1/0,"realTimeReportInterval"),maxCacheSize:Ee(e.maxCacheSize,56,1,1/0,"maxCacheSize"),maxRetries:Ee(e.maxRetries,10,0,1/0,"maxRetries"),isLogger:null!==(t=e.isLogger)&&void 0!==t?t:_e(),errorTraceRate:Ee(e.errorTraceRate,.5,0,1,"errorTraceRate"),resourceFlowLimit:Ee(e.resourceFlowLimit,15,0,200,"resourceFlowLimit"),sanitize:!1===e.sanitize?{stripQuery:!1,maxTextLength:0,preserveQueryKeys:[]}:{stripQuery:null!==(c=null===(a=e.sanitize)||void 0===a?void 0:a.stripQuery)&&void 0!==c&&c,maxTextLength:Ee(null===(u=e.sanitize)||void 0===u?void 0:u.maxTextLength,0,0,1/0,"sanitize.maxTextLength"),preserveQueryKeys:(null===(s=e.sanitize)||void 0===s?void 0:s.preserveQueryKeys)||[]},enableAutoSessionId:null!==(f=e.enableAutoSessionId)&&void 0!==f&&f,enableTracking:null!==(p=e.enableTracking)&&void 0!==p?p:Ae(),respectGpc:null===(m=e.respectGpc)||void 0===m||m,requestTimeout:Ee(e.requestTimeout,1e4,1e3,6e4,"requestTimeout"),configUrl:G(e.pushUrl,e.configUrl),configTtl:Ee(e.configTtl,3e5,6e4,864e5,"configTtl"),beforeSend:e.beforeSend,onDrop:e.onDrop,onError:e.onError},D(e);var w=X.pushUrl,T=X.authUrl,b=X.realTimeUrl,S=X.realTimeReportInterval;h||T||(console.error("[TM]: 未配置 apiKey 或 authUrl,SDK 无法获取上报凭证,数据将不会上报。请配置 apiKey(直连)或 authUrl(自动换取 accessToken),或调用 setToken 注入 accessToken。"),ke("init_missing_credential","未配置 apiKey 或 authUrl,SDK 无法获取上报凭证,数据将不会上报。请配置 apiKey(直连)或 authUrl(自动换取 accessToken),或调用 setToken 注入 accessToken。"));var _,x=function(){try{var e=localStorage.getItem(K);if(!e)return null;var t=JSON.parse(e);return Array.isArray(t.dataTypes)&&0!==t.dataTypes.length?t:null}catch(e){return null}}();x&&B(x),_=function(){null!==le.timer&&(clearTimeout(le.timer),le.timer=null,ae(Q))},P.push(_),v((function(){return n(void 0,void 0,void 0,(function(){var e,t,r;return o(this,(function(n){switch(n.label){case 0:return n.trys.push([0,7,,8]),(t=h||y)?[3,4]:T?[4,ce(T)]:[3,2];case 1:return r=n.sent(),[3,3];case 2:r=void 0,n.label=3;case 3:t=r,n.label=4;case 4:return(e=t)?[4,W(X.configUrl,e,X.requestTimeout)]:[3,6];case 5:n.sent(),n.label=6;case 6:return[3,8];case 7:return n.sent(),[3,8];case 8:return[2]}}))}))}));var k={retryCount:0,nextRetryAt:0,retryExhausted:!1,halveBatch:!1,waitingCredential:!1},A={retryCount:0,nextRetryAt:0,retryExhausted:!1,halveBatch:!1,waitingCredential:!1},M=function(e){try{localStorage.setItem($,e)}catch(e){console.error("[TM]: monitor bind user fail: ",e)}},C=function(){localStorage.removeItem($)},I={},R={},N=new Set,q=null,F=function(){null!==q&&(clearTimeout(q),q=null),N.size&&(N.forEach((function(e){try{localStorage.setItem(e,JSON.stringify(I[e]||[]))}catch(t){ke("queue_write_failed","写入本地缓存队列失败(隐私模式/容量满?),本次数据仅保留内存",{key:e,error:t})}})),N.clear())},j=function(e){if(I[e])return I[e];var t=[];try{t=JSON.parse(localStorage.getItem(e)||"[]")}catch(t){ke("queue_read_failed","读取本地缓存队列失败,按空队列处理",{key:e,error:t})}return I[e]=t,R[e]=t.reduce((function(e,t){return e+se(t)}),0),I[e]},U=function(e,t){N.delete(e),I[e]=t,R[e]=t.reduce((function(e,t){return e+se(t)}),0);try{localStorage.setItem(e,JSON.stringify(t))}catch(t){ke("queue_write_failed","写入本地缓存队列失败(隐私模式/容量满?),队列清空处理",{key:e,error:t});try{localStorage.setItem(e,"[]")}catch(t){ke("localstorage_unavailable","localStorage 不可用,本次数据仅保留内存",{key:e,error:t})}}},z=function(e){y=e,e&&(k.waitingCredential=!1,A.waitingCredential=!1,ae(Q),ae(V))},J=function(e,t,r){return void 0===r&&(r=!1),n(void 0,void 0,void 0,(function(){var i,a,c,u,s,f,v,p;return o(this,(function(m){switch(m.label){case 0:i=e&&b?b:w,m.label=1;case 1:return m.trys.push([1,6,,7]),(c=h||y)?[3,5]:T?[4,ce(T)]:[3,3];case 2:return u=m.sent(),[3,4];case 3:u=void 0,m.label=4;case 4:c=u,m.label=5;case 5:return a=c,[3,7];case 6:throw s=m.sent(),ke("token_fetch_failed","从 authUrl 获取 accessToken 失败,本批暂不上报(保留队列待重试)",{authUrl:T,error:s}),s;case 7:if(!a)throw ke("init_missing_credential","未配置 apiKey/authUrl 且未注入 accessToken,本次数据未上报(保留缓存队列待重试)"),(f=new Error("[TM]: credential missing, skip report")).missingCredential=!0,f;return(null==X?void 0:X.isLogger)&&L(e?"RealTimeFetch":"Fetch",t),v=(null==X?void 0:X.beforeSend)?function(){var e;try{e=X.beforeSend(t)}catch(e){ke("before_send_failed","beforeSend 钩子抛错,本次按原始数据发送",{error:e})}return Array.isArray(e)?e:t}():t,p=r||null==X?void 0:X.requestTimeout,[2,d(i,{data:v},a,p).catch((function(e){return n(void 0,void 0,void 0,(function(){var t,r;return o(this,(function(n){switch(n.label){case 0:return t=null==e?void 0:e.status,e instanceof l||401===t||403===t?h||y||!T?[3,2]:(function(){oe=null;try{localStorage.removeItem(ne)}catch(e){}}(),[4,ce(T).catch((function(){}))]):[3,2];case 1:if(r=n.sent())return[2,d(i,{data:v},r,p)];ke("token_invalid","上报 401/403 且刷新 accessToken 失败,本批暂不上报(保留队列待重试)",{authUrl:T}),n.label=2;case 2:throw e}}))}))}))]}}))}))},Y=function(e,t){var r=new Set(t.filter((function(e){return!!e})));if(r.size){var n=j(e);if(n.length){var o=n.filter((function(e){return e.event_id&&!r.has(e.event_id)}));o.length!==n.length&&U(e,o)}}},Z=function(e,t,r){void 0===r&&(r=0);var n=(t?S:H().reportInterval)*Math.pow(2,e)*(.8+.4*Math.random()),o=Math.min(n,6e4);return Math.max(o,r)},ie=function(e,t){var r=se(t);if(r>=64)return xe([t],"item_too_large"),void console.warn("[TM]: 单条事件超过体积上限(".concat(64,"KB),丢弃该条"));var n=j(e);if(n.unshift(t),R[e]+=r,n.length>re){var o=n.length-re,i=n.splice(n.length-o,n.length);R[e]=n.reduce((function(e,t){return e+se(t)}),0),xe(i,"queue_overflow"),console.warn("[TM]: 队列超过上限(".concat(re,"条),丢弃最旧 ").concat(o," 条"))}!function(e){N.add(e),null===q&&(q=setTimeout((function(){q=null,F()}),200))}(e),ae(e,R[e]>=H().maxCacheSize)},ae=function(e,t,r){if(void 0===t&&(t=!1),void 0===r&&(r=!1),null==X?void 0:X.enableTracking){var a=j(e);if(a.length){var c=function(e){return e===V}(e),l=c?ue:le,u=function(e){return e?A:k}(c);if(!u.waitingCredential)if(u.halveBatch&&a.length>1&&(a=a.slice(0,Math.ceil(a.length/2))),!u.retryExhausted)if(Date.now()<u.nextRetryAt)null===l.timer&&(l.timer=setTimeout((function(){l.timer=null,ae(e)}),u.nextRetryAt-Date.now()));else if(0!==u.retryCount||(a.length>=H().cacheNumber||t)){if(null!==l.timer&&(clearTimeout(l.timer),l.timer=null),l.promise)return;l.promise=function(e,t,r,a,c){return void 0===c&&(c=!1),n(void 0,void 0,void 0,(function(){var n,l,u,s,d,f,v,p,m,h,y,g,w,T,b,S,_,E;return o(this,(function(x){switch(x.label){case 0:n=[],l=[],u=0;try{for(s=i(t),d=s.next();!d.done;d=s.next())f=d.value,v=1024*se(f),l.length&&u+v>65536&&(n.push(l),l=[],u=0),l.push(f),u+=v}catch(e){w={error:e}}finally{try{d&&!d.done&&(T=s.return)&&T.call(s)}finally{if(w)throw w.error}}l.length&&n.push(l),p=function(t){var n,i,a,l,u;return o(this,(function(o){switch(o.label){case 0:return[4,J(r,t,c)];case 1:return n=o.sent(),i=null===(_=null==n?void 0:n.data)||void 0===_?void 0:_.accepted_ids,a=null===(E=null==n?void 0:n.data)||void 0===E?void 0:E.rejected_ids,Array.isArray(i)?(Y(e,i),Array.isArray(a)&&a.length&&(l=new Set(a),Y(e,a),u=t.filter((function(e){return e.event_id&&l.has(e.event_id)})),u.length&&xe(u,"server_rejected"),console.warn("[TM]: 服务端校验拒绝 ".concat(a.length," 条(永久性拒绝),已从队列移除并通知 onDrop")))):(Y(e,t.map((function(e){return e.event_id}))),(null==X?void 0:X.isLogger)&&console.warn("[TM]: 响应缺少 accepted_ids,按整批成功清理")),[2]}}))},x.label=1;case 1:x.trys.push([1,6,7,8]),m=i(n),h=m.next(),x.label=2;case 2:return h.done?[3,5]:(y=h.value,[5,p(y)]);case 3:x.sent(),x.label=4;case 4:return h=m.next(),[3,2];case 5:return[3,8];case 6:return g=x.sent(),b={error:g},[3,8];case 7:try{h&&!h.done&&(S=m.return)&&S.call(m)}finally{if(b)throw b.error}return[7];case 8:return a.retryCount=0,a.nextRetryAt=0,a.halveBatch=!1,[2]}}))}))}(e,a,c,u,r).catch((function(e){!function(e,t,r,n,o){if(null==t?void 0:t.missingCredential)h||y||T||(n.waitingCredential=!0);else{(null==t?void 0:t.timeout)&&ke("request_timeout","上报请求超时,数据保留队列按退避重试",{url:r&&b?b:w,timeoutMs:null==X?void 0:X.requestTimeout});var i=null==t?void 0:t.status;if(413!==i){if(i&&i>=400&&i<500&&401!==i&&403!==i&&408!==i&&410!==i&&429!==i)return n.retryExhausted=!0,xe(o,"rejected_4xx"),void console.warn("[TM]: 批次提交被服务端拒绝(HTTP ".concat(i,"),数据保留在队列并暂停自动重试"));if(n.retryCount++,n.retryCount>H().maxRetries)return n.retryExhausted=!0,xe(o,"retries_exhausted"),void console.warn("[TM]: 重试次数已达上限(".concat(H().maxRetries,"),数据保留在队列(不丢弃),待下次会话或手动触发重试"));var a=429===i&&(null==t?void 0:t.retryAfter)||0;n.nextRetryAt=Date.now()+Z(n.retryCount,r,a),console.error("[TM]: send report fail, retryCount: ".concat(n.retryCount,", next retry after ").concat(Math.round((n.nextRetryAt-Date.now())/1e3),"s"))}else o.length>1?(n.halveBatch=!0,n.retryCount++,n.nextRetryAt=Date.now()+Z(n.retryCount,r,0),console.warn("[TM]: 批次过大(HTTP 413),降容半批重发(本批 ".concat(o.length," 条)"))):(n.retryExhausted=!0,xe(o,"rejected_4xx"),console.warn("[TM]: 单条事件仍超限(HTTP 413),数据保留在队列"))}}(0,e,c,u,a)})).finally((function(){l.timer=null,l.promise=null,ae(e)}))}else if(null===l.timer){var s=c?S:H().reportInterval;l.timer=setTimeout((function(){l.timer=null,ae(e,!0)}),s)}}}},de=function(e){var t;if(!(null==X?void 0:X.enableTracking)||(null==X?void 0:X.respectGpc)&&!0===(null==(t="undefined"!=typeof navigator?navigator:void 0)?void 0:t.globalPrivacyControl))(null==X?void 0:X.isLogger)&&console.warn("[TM]: 用户已选择退出采集(enableTracking=false 或 GPC 信号开启),本事件忽略");else if(e&&"object"==typeof e){var r,n=!0===e.track_real_time,o=Se(e);if(o)if(!(r=o.data_type)||O.dataTypes.includes(r))try{ie(n&&b?V:Q,o)}catch(e){ke("enqueue_failed","事件入队失败",{error:e})}else(null==X?void 0:X.isLogger)&&console.warn("[TM]: 数据类型 ".concat(o.data_type," 未在远程配置中启用,本事件不上报"))}else console.error("[TM]: track data must be an object")},fe=function(e,t,n){de("string"==typeof e?r({event_type:e,event_detail:t},n):e)},ve=function(){ae(Q,!0),ae(V,!0);var e=[le.promise,ue.promise].filter((function(e){return!!e}));return Promise.all(e).then((function(){}))},me=function(){X.isLogger=!0;try{localStorage.setItem(ee,"true")}catch(e){console.error("[TM]: enable logger fail:",e)}},he=function(){X.isLogger=!1;try{localStorage.setItem(ee,"false")}catch(e){console.error("[TM]: disable logger fail:",e)}};v((function(){ae(Q,!0),ae(V,!0)}));var ye=function(e){return"boolean"==typeof e&&(X.enableTracking=e,function(e){try{localStorage.setItem(te,e?"1":"0")}catch(e){}}(e),e?(null==X?void 0:X.isLogger)&&console.warn("[TM]: 恢复采集"):(U(Q,[]),U(V,[]),(null==X?void 0:X.isLogger)&&console.warn("[TM]: 用户已选择退出采集,已清空未上报队列"))),!0===(null==X?void 0:X.enableTracking)},ge=function(e){D(e)},we=function(){return r({},H())};return window.trackMonitor={track:fe,flush:ve,bindUser:M,unBindUser:C,enableLogger:me,disableLogger:he,setToken:z,registerGlobalProperties:pe,enableTracking:ye,setConfig:ge,getConfig:we},{client:{track:fe,flush:ve,bindUser:M,unBindUser:C,enableLogger:me,disableLogger:he,setToken:z,registerGlobalProperties:pe,enableTracking:ye,setConfig:ge,getConfig:we},beforeClose:function(){var e=function(){F(),ae(Q,!0,!0),ae(V,!0,!0)};window.addEventListener("beforeunload",e),window.addEventListener("pagehide",e),document.addEventListener("visibilitychange",(function(){"hidden"===document.visibilityState&&e()})),window.addEventListener("online",e)}}},Le=(x=16,function(){var e=new Uint8Array(x);if("undefined"!=typeof crypto&&"function"==typeof crypto.getRandomValues)crypto.getRandomValues(e);else for(var t=0;t<x;t++)e[t]=Math.floor(256*Math.random());var r="";for(t=0;t<x;t++)r+=(e[t]<16?"0":"")+e[t].toString(16);return r})(),Ce=function(e){var t=history[e];return function(){var r=t.apply(this,arguments),n=new Event(e);return window.dispatchEvent(n),r}},Ie=function(e){window.addEventListener("replaceState",(function(t){return e(t)}),!0),window.addEventListener("pushState",(function(t){return e(t)}),!0)},Re=function(e){window.addEventListener("popstate",(function(t){return e(t)}),!0)},Ne=[25,50,75,90],Oe=function(e){var t,r,n;history.pushState=Ce("pushState"),history.replaceState=Ce("replaceState"),t="",n=p(r=function(){var e=window.location.href;if(e!==t){var r=window.location,n={host:r.host,hostname:r.hostname,href:r.href,protocol:r.protocol,origin:r.origin,port:r.port,pathname:r.pathname,search:r.search,hash:r.hash,title:document.title,language:navigator.language.substring(0,2),user_agent:navigator.userAgent,win_screen:"".concat(window.screen.width,"x").concat(window.screen.height),doc_screen:"".concat(document.documentElement.clientWidth,"x").concat(document.documentElement.clientHeight),referrer:document.referrer,type:y()};window.trackMonitor.track({data_type:"auto",event_type:"page_view",event_detail:n}),t=e}},200),r(),Re((function(){n()})),Ie((function(){n()})),window.addEventListener("popstate",(function(){n()})),function(){var e=document.referrer,t=window.location.href,r=Date.now(),n=!0,o=function(n){if(void 0===n&&(n=!1),window.location.href!==t||n){var o=Date.now()-r;o>200&&window.trackMonitor.track({data_type:"auto",event_type:"page_leave",event_detail:{url:t,referrer:e,duration:o}}),r=Date.now(),e=t,t=window.location.href}},i=p(o);o(),Re((function(){i()})),Ie((function(){i()})),document.addEventListener("visibilitychange",(function(){"hidden"===document.visibilityState?n&&(n=!1,o(!0)):(n=!0,r=Date.now())})),window.addEventListener("beforeunload",(function(){n&&(n=!1,o(!0))}),!0)}(),function(){var e=m((function(e){var t,r=function(e){if(e)return["A","INPUT","TEXTAREA","BUTTON"].includes(e.tagName)||e.hasAttribute("track-click")?e:e.closest("a, button, [track-click]")||void 0}(e.target);if(r){var n={element_id:r.id,element_content:(null===(t=r.textContent)||void 0===t?void 0:t.trim().slice(0,200))||null,element_class_name:r.className||null,element_name:r.getAttribute("name")||null,element_type:r.tagName.toLowerCase(),element_path:h(r),scroll_width:document.documentElement.scrollWidth,scroll_height:document.documentElement.scrollHeight,pageX:e.pageX,pageY:e.pageY,ratio:window.devicePixelRatio||1};window.trackMonitor.track({data_type:"auto",event_type:"click",event_detail:n})}}));window.addEventListener("click",e,!0)}(),!1!==(null==e?void 0:e.enableScroll)&&function(){var e=new Set,t=m((function(){var r=document.documentElement,n=r.scrollHeight-r.clientHeight;if(!(n<=0)){var o=Math.round((window.scrollY||r.scrollTop)/n*100),i=Ne.filter((function(t){return o>=t&&!e.has(t)}));i.length&&(i.forEach((function(t){e.add(t),window.trackMonitor.track({data_type:"auto",event_type:"scroll",event_detail:{scroll_depth:t}})})),e.has(90)&&window.removeEventListener("scroll",t))}}),300);window.addEventListener("scroll",t,{passive:!0})}()},Pe=null,qe=null,Fe="track-expose",je="track-view",Ue=function(e){try{qe=new WeakMap}catch(e){console.error("[TM]: create WeakMap fail: ",e)}var t=function(e,t){void 0===t&&(t=!1);var n=null==qe?void 0:qe.get(e);if(!n||t){n&&(n.viewTimer&&clearTimeout(n.viewTimer),n.exposeTimer&&clearTimeout(n.exposeTimer));var o=e.dataset.durationView||500,i=e.dataset.durationExpose||500;null==qe||qe.set(e,{duration_view:o,duration_expose:i,viewTimer:null,exposeTimer:null}),null==Pe||Pe.observe(e),t&&function(e){if(!(e instanceof Element))return!1;if(!function e(t){if(!t)return!0;var r=window.getComputedStyle(t);return"none"!==r.display&&"hidden"!==r.visibility&&0!==parseFloat(r.opacity)&&e(t.parentElement)}(e))return!1;var t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)}(e)&&r(e)}},r=function(t){var r,o=null==qe?void 0:qe.get(t);if(o){var i=t.dataset.eventDetail,a=null!==(r=t.dataset.traceid)&&void 0!==r?r:void 0,c=t.dataset.spm,l=t.hasAttribute("track-real-time"),u=t.hasAttribute(je),s=t.hasAttribute(Fe);u&&s?o.exposeTimer=window.setTimeout((function(){e({spm:c,request_id:a,data_type:"auto",event_type:"view_expose",event_detail:i,track_real_time:l}),t.removeAttribute(je),o.exposeTimer=null}),parseInt(o.duration_expose,10)):(u&&(o.viewTimer=window.setTimeout((function(){e({spm:c,request_id:a,data_type:"auto",event_type:"view",event_detail:i,track_real_time:l}),t.removeAttribute(je),s&&o.exposeTimer||n(t),o.viewTimer=null}),parseInt(o.duration_view,10))),s&&(o.exposeTimer=window.setTimeout((function(){e({spm:c,request_id:a,data_type:"auto",event_type:"expose",event_detail:i,track_real_time:l}),o.exposeTimer=null}),parseInt(o.duration_expose,10))))}},n=function(e){var t=null==qe?void 0:qe.get(e);t&&(null==Pe||Pe.unobserve(e),t.viewTimer&&clearTimeout(t.viewTimer),t.exposeTimer&&clearTimeout(t.exposeTimer),null==qe||qe.delete(e))},o=function(e){e.forEach((function(e){var t=e.target,o=null==qe?void 0:qe.get(t);o&&(o.viewTimer&&(clearTimeout(o.viewTimer),o.viewTimer=null),o.exposeTimer&&(clearTimeout(o.exposeTimer),o.exposeTimer=null),e.isIntersecting&&(r(t),t.hasAttribute(je)||t.hasAttribute(Fe)||n(t)))}))};Pe=function(){var e=null;try{e=new IntersectionObserver(o,{root:null,threshold:.5})}catch(e){console.error("[TM]: create IntersectionObserver fail: ",e)}return e}(),new Set(c(c([],a(document.querySelectorAll("[".concat(Fe,"]"))),!1),a(document.querySelectorAll("[".concat(je,"]"))),!1)).forEach((function(e){return t(e)})),new MutationObserver((function(e){e.forEach((function(e){if("attributes"===e.type&&e.target instanceof HTMLElement){var r=e.target,o=e.attributeName;r.hasAttribute(Fe)||r.hasAttribute(je)?["data-event-detail","data-traceid","data-spm","data-duration-view","data-duration-expose"].includes(o)?t(r,!0):o!==Fe&&o!==je||t(r,!1):n(r)}else"childList"===e.type&&(e.addedNodes.forEach((function(e){e instanceof HTMLElement&&(e.hasAttribute(Fe)||e.hasAttribute(je)?t(e):new Set(c(c([],a(e.querySelectorAll("[".concat(Fe,"]"))),!1),a(e.querySelectorAll("[".concat(je,"]"))),!1)).forEach((function(e){return t(e)})))})),e.removedNodes.forEach((function(e){e instanceof HTMLElement&&((null==qe?void 0:qe.get(e))?n(e):new Set(c(c([],a(e.querySelectorAll("[".concat(Fe,"]"))),!1),a(e.querySelectorAll("[".concat(je,"]"))),!1)).forEach((function(e){return n(e)})))})))}))})).observe(document.body||document.documentElement,{attributes:!0,childList:!0,subtree:!0})},ze=/^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;function De(e){var t=e.match(ze);return t?{filename:t[2],functionName:t[1]||"",lineno:parseInt(t[3],10)||void 0,colno:parseInt(t[4],10)||void 0}:{}}function Be(e){var t,r,n,o,a;try{var c=e.stack;if(!c)return[];var l=[];try{for(var u=i(c.split("\n").slice(1)),s=u.next();!s.done;s=u.next()){var d=De(s.value);!d||(null===(n=d.filename)||void 0===n?void 0:n.includes("chrome-extension://"))||(null===(o=d.filename)||void 0===o?void 0:o.includes("node_modules"))||(null===(a=d.filename)||void 0===a?void 0:a.includes("<anonymous>"))||l.push(d)}}catch(e){t={error:e}}finally{try{s&&!s.done&&(r=u.return)&&r.call(u)}finally{if(t)throw t.error}}return l.slice(0,10)}catch(e){return[]}}var He=new Set,Je=function(e,t){if((n=H().errorTraceRate)<0||n>1?(console.warn("[TM]: probability should be between 0 and 1"),0):Math.random()<n){if(window.trackMonitor.track(t),He.size>=1e3){var r=He.values().next().value;void 0!==r&&He.delete(r)}He.add(e)}var n},Ke=function(){window.addEventListener("error",(function(e){!function(e){var t;if(e instanceof ErrorEvent&&"Script error."===e.message){var r=S("js-Script error.");if(He.has(r))return;Je(r,{data_type:"error",event_type:"js",event_detail:{traceId:Le,msg:'Script error.(跨域脚本未加载 crossorigin 属性,无法获取堆栈;建议脚本加 crossorigin="anonymous")',target:"",stack:[],errorUuid:r,meta:{filename:e.filename,colno:e.colno,lineno:e.lineno,crossorigin_missing:!0}}})}else if("js"===b(e)&&!function(e){var t,r=(null===(t=e.error)||void 0===t?void 0:t.stack)||"";return/chrome-extension:\/\//.test(r)}(e)){var n=S("js-".concat(e.message,"-").concat(e.filename));if(!He.has(n)){var o=Be(e.error),i={traceId:Le,msg:e.message,target:o[0]?"".concat(null===(t=o[0].filename)||void 0===t?void 0:t.split("?")[0],":").concat(o[0].lineno,":").concat(o[0].colno):"",stack:o,errorUuid:n,meta:{filename:e.filename,colno:e.colno,lineno:e.lineno}};Je(n,{data_type:"error",event_type:"js",event_detail:i})}}}(e)}),!0)},Ge=function(){window.addEventListener("error",(function(e){!function(e){var t;if("resource"===b(e)){var r=e.target,n=S("resource-".concat(r.src,"-").concat(r.tagName));if(!He.has(n)){var o={traceId:Le,msg:"加载".concat(r.tagName,"失败"),target:null===(t=r.src)||void 0===t?void 0:t.split("?")[0],errorUuid:n,meta:{url:r.src,html:r.outerHTML,tagName:r.tagName}};Je(n,{data_type:"error",event_type:"resource",event_detail:o})}}}(e)}),!0)},We=function(){window.addEventListener("unhandledrejection",(function(e){return function(e){var t,r=(null===(t=e.reason)||void 0===t?void 0:t.message)||e.reason,n=S("".concat("unhandledrejection","-").concat(r));if(!He.has(n)){var o={traceId:Le,msg:r,stack:Be(e.reason),errorUuid:n};Je(n,{data_type:"error",event_type:"unhandledrejection",event_detail:o})}}(e)}),!0)},Xe=function(){var e=function(e,t,r){var n;if("string"!=typeof(n=e.url)||![null==X?void 0:X.pushUrl,null==X?void 0:X.authUrl,null==X?void 0:X.realTimeUrl].filter((function(e){return!!e})).some((function(e){return 0===n.indexOf(e)})))if(t){var o=S("http-".concat(t,"-").concat(e.url,"-").concat(r));if(He.has(o))return;var i={traceId:Le,errorType:t,msg:r,target:e.url.split("?")[0],errorUuid:o,request:e};Je(o,{data_type:"error",event_type:"http",event_detail:i})}else if(e.status>=400){var a=e.statusText;o=S("http-".concat(t="http_error","-").concat(e.url,"-").concat(a));if(He.has(o))return;i={traceId:Le,errorUuid:o,errorType:t,target:e.url.split("?")[0],msg:a,request:e};Je(o,{data_type:"error",event_type:"http",event_detail:i})}};!function(e,t){if("XMLHttpRequest"in window&&"function"==typeof window.XMLHttpRequest){var n=window.XMLHttpRequest;window.oXMLHttpRequest||(window.oXMLHttpRequest=n),window.XMLHttpRequest=function(){var e=new n,o=e.open,i=e.send,a={};e.open=function(t,r,n,i,c){void 0===n&&(n=!0),a.method=t,a.url=r,o.call(e,t,r,n,i,c)},e.send=function(t){a.requestTime=(new Date).getTime(),i.call(e,t)};var c=function(n,o){var i=e.status,c=e.statusText,l=(new Date).getTime();a=r(r({},a),{status:i,statusText:c,responseTime:l,duration:l-a.requestTime}),"function"==typeof t&&t(a,n,o)};return e.addEventListener("loadend",(function(){return c()})),e.addEventListener("error",(function(){return c("net_error","ERR_NETWORK")})),e.addEventListener("abort",(function(){return c("cannel_request","ERR_CANCELED")})),e.addEventListener("timeout",(function(){return c("timeout","ERR_NETWORK")})),e}}}(0,e),function(e,t){if("fetch"in window&&"function"==typeof window.fetch){var i=window.fetch;window.oFetch||(window.oFetch=i),window.fetch=function(e,a){return n(void 0,void 0,void 0,(function(){var c;return o(this,(function(l){return(c={}).method=(null==a?void 0:a.method)||"",c.url=(e&&"string"!=typeof e?null==e?void 0:e.url:e)||"",c.requestTime=(new Date).getTime(),[2,i.call(window,e,a).then((function(e){return n(void 0,void 0,void 0,(function(){var n,i;return o(this,(function(o){return"function"==typeof t&&(n=e.clone(),i=(new Date).getTime(),c=r(r({},c),{status:n.status,statusText:n.statusText,responseTime:i,duration:i-c.requestTime}),t(c)),[2,e]}))}))})).catch((function(e){if("function"==typeof t){var n=(new Date).getTime();c=r(r({},c),{responseTime:n,duration:n-c.requestTime}),"AbortError"===e.name?t(c,"cannel_request","ERR_CANCELED"):t(c,"net_error","ERR_NETWORK")}return Promise.reject(e)}))]}))}))}}}(0,e)};var Qe=new WeakSet,Ve=function(e){return{form_id:e.id||null,form_class:"string"==typeof e.className?e.className:null,form_name:e.getAttribute("name")||null,form_action:e.getAttribute("action")||null,form_text:(e.textContent||"").trim().slice(0,200)||null}};function $e(e,t,r){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t);if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Ye(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var Ze=-1,et=e=>{addEventListener("pageshow",(t=>{t.persisted&&(Ze=t.timeStamp,e(t))}),!0)},tt=(e,t,r,n)=>{var o,i;return a=>{t.value>=0&&(a||n)&&(((i=t.value-(null!=o?o:0))||void 0===o)&&(o=t.value,t.delta=i,t.rating=((e,t)=>e>t[1]?"poor":e>t[0]?"needs-improvement":"good")(t.value,r),e(t)))}},rt=e=>{requestAnimationFrame((()=>requestAnimationFrame((()=>e()))))},nt=()=>{var e=performance.getEntriesByType("navigation")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},ot=()=>{var e,t=nt();return null!==(e=null==t?void 0:t.activationStart)&&void 0!==e?e:0},it=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:-1,r=nt(),n="navigate";return Ze>=0?n="back-forward-cache":r&&(document.prerendering||ot()>0?n="prerender":document.wasDiscarded?n="restore":r.type&&(n=r.type.replace(/_/g,"-"))),{name:e,value:t,rating:"good",delta:0,entries:[],id:"v5-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12),navigationType:n}},at=new WeakMap;function ct(e,t){return at.get(e)||at.set(e,new t),at.get(e)}class lt{constructor(){$e(this,"t",void 0),$e(this,"i",0),$e(this,"o",[])}h(e){var t;if(!e.hadRecentInput){var r=this.o[0],n=this.o.at(-1);this.i&&r&&n&&e.startTime-n.startTime<1e3&&e.startTime-r.startTime<5e3?(this.i+=e.value,this.o.push(e)):(this.i=e.value,this.o=[e]),null===(t=this.t)||void 0===t||t.call(this,e)}}}var ut,st=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};try{if(PerformanceObserver.supportedEntryTypes.includes(e)){var n=new PerformanceObserver((e=>{Promise.resolve().then((()=>{t(e.getEntries())}))}));return n.observe(function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?Ye(Object(r),!0).forEach((function(t){$e(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):Ye(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}({type:e,buffered:!0},r)),n}}catch(e){}},dt=e=>{var t=!1;return()=>{t||(e(),t=!0)}},ft=-1,vt=new Set,pt=()=>"hidden"!==document.visibilityState||document.prerendering?1/0:0,mt=e=>{if("hidden"===document.visibilityState){if("visibilitychange"===e.type)for(var t of vt)t();isFinite(ft)||(ft="visibilitychange"===e.type?e.timeStamp:0,removeEventListener("prerenderingchange",mt,!0))}},ht=()=>{if(ft<0){var e,t=ot(),r=document.prerendering||null===(e=globalThis.performance.getEntriesByType("visibility-state").filter((e=>"hidden"===e.name&&e.startTime>t))[0])||void 0===e?void 0:e.startTime;ft=null!=r?r:pt(),addEventListener("visibilitychange",mt,!0),addEventListener("prerenderingchange",mt,!0),et((()=>{setTimeout((()=>{ft=pt()}))}))}return{get firstHiddenTime(){return ft},onHidden(e){vt.add(e)}}},yt=e=>{document.prerendering?addEventListener("prerenderingchange",(()=>e()),!0):e()},gt=[1800,3e3],wt=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};yt((()=>{var r,n=ht(),o=it("FCP"),i=st("paint",(e=>{for(var t of e)"first-contentful-paint"===t.name&&(i.disconnect(),t.startTime<n.firstHiddenTime&&(o.value=Math.max(t.startTime-ot(),0),o.entries.push(t),r(!0)))}));i&&(r=tt(e,o,gt,t.reportAllChanges),et((n=>{o=it("FCP"),r=tt(e,o,gt,t.reportAllChanges),rt((()=>{o.value=performance.now()-n.timeStamp,r(!0)}))})))}))},Tt=[.1,.25],bt=0,St=1/0,_t=0,Et=e=>{for(var t of e)t.interactionId&&(St=Math.min(St,t.interactionId),_t=Math.max(_t,t.interactionId),bt=_t?(_t-St)/7+1:0)},xt=()=>{var e;return ut?bt:null!==(e=performance.interactionCount)&&void 0!==e?e:0},kt=0;class At{constructor(){$e(this,"u",[]),$e(this,"l",new Map),$e(this,"m",void 0),$e(this,"p",void 0)}v(){kt=xt(),this.u.length=0,this.l.clear()}L(){var e=Math.min(this.u.length-1,Math.floor((xt()-kt)/50));return this.u[e]}h(e){var t;if(null!==(t=this.m)&&void 0!==t&&t.call(this,e),e.interactionId||"first-input"===e.entryType){var r=this.u.at(-1),n=this.l.get(e.interactionId);if(n||this.u.length<10||e.duration>r.P){var o;if(n?e.duration>n.P?(n.entries=[e],n.P=e.duration):e.duration===n.P&&e.startTime===n.entries[0].startTime&&n.entries.push(e):(n={id:e.interactionId,entries:[e],P:e.duration},this.l.set(n.id,n),this.u.push(n)),this.u.sort(((e,t)=>t.P-e.P)),this.u.length>10){var i=this.u.splice(10);for(var a of i)this.l.delete(a.id)}null===(o=this.p)||void 0===o||o.call(this,n)}}}}var Mt=e=>{var t=globalThis.requestIdleCallback||setTimeout;"hidden"===document.visibilityState?e():(e=dt(e),addEventListener("visibilitychange",e,{once:!0,capture:!0}),t((()=>{e(),removeEventListener("visibilitychange",e,{capture:!0})})))},Lt=[200,500],Ct=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(globalThis.PerformanceEventTiming&&"interactionId"in PerformanceEventTiming.prototype){var r=ht();yt((()=>{var n;"interactionCount"in performance||ut||(ut=st("event",Et,{type:"event",buffered:!0,durationThreshold:0}));var o,i=it("INP"),a=ct(t,At),c=e=>{Mt((()=>{for(var t of e)a.h(t);var r=a.L();r&&r.P!==i.value&&(i.value=r.P,i.entries=r.entries,o())}))},l=st("event",c,{durationThreshold:null!==(n=t.durationThreshold)&&void 0!==n?n:40});o=tt(e,i,Lt,t.reportAllChanges),l&&(l.observe({type:"first-input",buffered:!0}),r.onHidden((()=>{c(l.takeRecords()),o(!0)})),et((()=>{a.v(),i=it("INP"),o=tt(e,i,Lt,t.reportAllChanges)})))}))}};class It{constructor(){$e(this,"m",void 0)}h(e){var t;null===(t=this.m)||void 0===t||t.call(this,e)}}var Rt=[2500,4e3],Nt=[800,1800],Ot=e=>{document.prerendering?yt((()=>Ot(e))):"complete"!==document.readyState?addEventListener("load",(()=>Ot(e)),!0):setTimeout(e)};function Pt(){var e={ttfb:null,lcp:null,fp:null,fcp:null,connectionRtt:null,ttfbRequestTime:null,inp:null,cls:null,dcl:null,loadTime:null};!function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};yt((()=>{var r,n=ht(),o=it("LCP"),i=ct(t,It),a=e=>{for(var a of(t.reportAllChanges||(e=e.slice(-1)),e))i.h(a),a.startTime<n.firstHiddenTime&&(o.value=Math.max(a.startTime-ot(),0),o.entries=[a],r())},c=st("largest-contentful-paint",a);if(c){r=tt(e,o,Rt,t.reportAllChanges);var l=dt((()=>{a(c.takeRecords()),c.disconnect(),r(!0)})),u=e=>{e.isTrusted&&(Mt(l),removeEventListener(e.type,u,{capture:!0}))};for(var s of["keydown","click","visibilitychange"])addEventListener(s,u,{capture:!0});et((n=>{o=it("LCP"),r=tt(e,o,Rt,t.reportAllChanges),rt((()=>{o.value=performance.now()-n.timeStamp,r(!0)}))}))}}))}((function(t){e.lcp=w(t.value)}),{reportAllChanges:!0}),function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=ht();wt(dt((()=>{var n,o=it("CLS",0),i=ct(t,lt),a=e=>{for(var t of e)i.h(t);i.i>o.value&&(o.value=i.i,o.entries=i.o,n())},c=st("layout-shift",a);c&&(n=tt(e,o,Tt,t.reportAllChanges),r.onHidden((()=>{a(c.takeRecords()),n(!0)})),et((()=>{i.i=0,o=it("CLS",0),n=tt(e,o,Tt,t.reportAllChanges),rt((()=>n()))})),setTimeout(n))})))}((function(t){e.cls=Math.round(1e4*t.value)/1e4}),{reportAllChanges:!0}),Ct((function(t){e.inp=w(t.value)}),{reportAllChanges:!0}),function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=it("TTFB"),n=tt(e,r,Nt,t.reportAllChanges);Ot((()=>{var o=nt();o&&(r.value=Math.max(o.responseStart-ot(),0),r.entries=[o],n(!0),et((()=>{r=it("TTFB",0),(n=tt(e,r,Nt,t.reportAllChanges))(!0)})))}))}((function(t){e.ttfb=w(t.value)})),wt((function(t){e.fcp=w(t.value)}));var t=function(){!function(){try{performance.getEntriesByType("paint").forEach((function(t){"first-paint"===t.name&&(e.fp=w(t.startTime))}))}catch(e){console.warn("[TM]: Failed to collect FP:",e)}try{var t=navigator.connection||navigator.mozConnection||navigator.webkitConnection;t&&void 0!==t.rtt&&(e.connectionRtt=t.rtt)}catch(e){console.warn("[TM]: Failed to collect Connection RTT:",e)}try{if(o=performance.getEntriesByType("navigation")[0]){var r=o.responseStart,n=o.requestStart;r>0&&n>0&&n<=r&&(e.ttfbRequestTime=w(r-n))}}catch(e){console.warn("[TM]: Failed to collect TTFB Request Time:",e)}try{var o;if(o=performance.getEntriesByType("navigation")[0]){var i=o.domContentLoadedEventEnd,a=o.loadEventEnd,c=o.fetchStart;i>0&&c>0&&(e.dcl=w(i-c)),a>0&&c>0&&(e.loadTime=w(a-c))}}catch(e){console.warn("[TM]: Failed to collect DCL and Load Time:",e)}}(),window.trackMonitor.track({data_type:"performance",event_type:"metrics",event_detail:{traceId:Le,data:e}})},r=0,n=function(){var e=Date.now();e-r<3e4||(r=e,t())};window.addEventListener("beforeunload",t),window.addEventListener("pagehide",n),document.addEventListener("visibilitychange",(function(){"hidden"===document.visibilityState&&n()}))}var qt="__tengence_sdk";e.init=function(e){if("undefined"!=typeof window&&window.trackMonitor&&window.trackMonitor[qt])return console.warn("[TM]: init 已调用过,复用现有实例(如需重建请刷新页面)"),window.trackMonitor;var t,n=Me(e),o=n.client,i=n.beforeClose,a=H(),c=a.dataTypes.includes("auto");return c&&(Ue(o.track),!1!==a.enableScroll&&Oe({enableScroll:a.enableScroll})),c&&!1!==a.enableFormTrack&&(t=o.track,document.addEventListener("focusin",(function(e){var r=e.target;if((n=r)&&("INPUT"===n.tagName||"SELECT"===n.tagName||"TEXTAREA"===n.tagName)){var n,o=r.closest("form");o&&!Qe.has(o)&&(Qe.add(o),t({data_type:"auto",event_type:"form_start",event_detail:Ve(o)}))}}),!0),document.addEventListener("submit",(function(e){var n=e.target;if(n&&"FORM"===n.tagName){var o=e.submitter;t({data_type:"auto",event_type:"form_submit",event_detail:r(r({},Ve(n)),{submitter_id:(null==o?void 0:o.id)||null,submitter_text:((null==o?void 0:o.textContent)||"").trim().slice(0,200)||null})})}}),!0)),a.dataTypes.includes("error")&&(Ke(),Ge(),We(),Xe()),a.dataTypes.includes("performance")&&g((function(){!function(){var e,t,r,n,o,i=window.performance||window.msPerformance;if(!i)return{dnsLookupTime:null,tcpConnectTime:null,ttfb:null,transferTime:null,domParseTime:null,domCompleteTime:null,loadEventTime:null,totalPageLoad:null};var a=i.getEntriesByType&&"function"==typeof i.getEntriesByType?i.getEntriesByType("navigation"):void 0,c=Array.isArray(a)?a[0]:void 0,l=null;if(c)l=c;else{var u=i.timing;u&&!(l={startTime:0,domainLookupStart:u.domainLookupStart,domainLookupEnd:u.domainLookupEnd,connectStart:u.connectStart,connectEnd:u.connectEnd,requestStart:u.requestStart,responseStart:u.responseStart,responseEnd:u.responseEnd,domInteractive:u.domInteractive,domComplete:u.domComplete,loadEventEnd:u.loadEventEnd,fetchStart:u.fetchStart}).requestStart&&u.fetchStart&&(l.requestStart=u.fetchStart)}var s={dnsLookupTime:l?w(l.domainLookupEnd-l.domainLookupStart):null,tcpConnectTime:l?w(l.connectEnd-l.connectStart):null,ttfb:l?w(l.responseStart-(null!==(t=null!==(e=l.requestStart)&&void 0!==e?e:l.fetchStart)&&void 0!==t?t:0)):null,transferTime:l?w(l.responseEnd-l.responseStart):null,domParseTime:l?w(l.domInteractive-l.responseEnd):null,domCompleteTime:l?w(l.domComplete-l.domInteractive):null,loadEventTime:l?w(l.loadEventEnd-(null!==(r=l.domComplete)&&void 0!==r?r:0)):null,totalPageLoad:l?w((null!==(n=l.loadEventEnd)&&void 0!==n?n:performance.now())-(null!==(o=l.startTime)&&void 0!==o?o:0)):null};window.trackMonitor.track({data_type:"performance",event_type:"navigation_timing",event_detail:{traceId:Le,data:s}})}(),function(){var e=window.performance||window.msPerformance;if(!e)return[];var t=[];if(e.getEntriesByType){var r=(e.getEntriesByType("resource")||[]).map((function(e){var t="number"==typeof e.redirectEnd&&"number"==typeof e.redirectStart?w(e.redirectEnd-e.redirectStart):null,r="number"==typeof e.domainLookupEnd&&"number"==typeof e.domainLookupStart?w(e.domainLookupEnd-e.domainLookupStart):null,n="number"==typeof e.connectEnd&&"number"==typeof e.connectStart?w(e.connectEnd-e.connectStart):null,o="number"==typeof e.requestStart&&"number"==typeof e.fetchStart?w(e.requestStart-e.fetchStart):null,i="number"==typeof e.responseStart&&"number"==typeof e.requestStart?w(e.responseStart-e.requestStart):null,a="number"==typeof e.responseEnd&&"number"==typeof e.responseStart?w(e.responseEnd-e.responseStart):null,c="number"==typeof e.duration?w(e.duration):null,l="number"==typeof e.startTime?w(e.startTime):null,u="number"==typeof e.transferSize&&isFinite(e.transferSize)&&e.transferSize>=0?Math.round(e.transferSize):null,s="number"==typeof e.encodedBodySize&&isFinite(e.encodedBodySize)&&e.encodedBodySize>=0?Math.round(e.encodedBodySize):null,d="number"==typeof e.decodedBodySize&&isFinite(e.decodedBodySize)&&e.decodedBodySize>=0?Math.round(e.decodedBodySize):null;return{name:e.name,initiatorType:e.initiatorType||"",startTime:l,duration:c,redirectTime:t,cacheTime:o,dnsTime:r,connectTime:n,requestTime:i,responseTime:a,transferSize:u,encodedBodySize:s,decodedBodySize:d}}));r.sort((function(e,t){var r,n;return(null!==(r=t.duration)&&void 0!==r?r:0)-(null!==(n=e.duration)&&void 0!==n?n:0)}));var n=H().resourceFlowLimit;if(0===n)return;for(var o=0;o<Math.min(n,r.length);o++)t.push(r[o]);if(!t.length)return}window.trackMonitor.track({data_type:"performance",event_type:"resource_flow",event_detail:{traceId:Le,data:t}})}(),Pt()})),g((function(){i()})),window.trackMonitor[qt]=!0,window.trackMonitor}}));