UNPKG

web-see-monitor

Version:

前端监控 SDK,包含性能监控、错误监控和用户行为监控

1 lines 18.8 kB
{"version":3,"file":"index.cjs","sources":["../src/core/monitor.ts","../src/core/base-plugin.ts","../src/plugins/performance/index.ts","../src/plugins/error/index.ts","../src/utils/debounce.ts","../src/plugins/behavior/index.ts"],"sourcesContent":["import { MonitorConfig, ReportData } from './types';\nimport { BasePlugin } from './base-plugin';\n\nexport class Monitor {\n private config: MonitorConfig;\n private plugins: Map<string, BasePlugin> = new Map();\n private cache: ReportData[] = [];\n private timer: NodeJS.Timeout | null = null;\n private readonly MAX_CACHE_LENGTH = 10;\n private readonly REPORT_INTERVAL = 5000; // 5秒\n\n constructor(config: MonitorConfig) {\n this.config = {\n ...config,\n enable: config.enable ?? true,\n sampling: config.sampling ?? 1,\n maxCache: config.maxCache ?? this.MAX_CACHE_LENGTH,\n reportInterval: config.reportInterval ?? this.REPORT_INTERVAL,\n };\n this.init();\n }\n\n private init(): void {\n if (!this.config.enable) return;\n \n // 初始化插件\n if (this.config.plugins) {\n this.config.plugins.forEach(Plugin => {\n const instance = new Plugin();\n instance.setReport(this.addCache.bind(this));\n instance.init();\n this.plugins.set(instance.name, instance);\n });\n }\n\n // 页面卸载前发送剩余数据\n window.addEventListener('unload', () => {\n this.report(true);\n });\n }\n\n public destroy(): void {\n this.plugins.forEach(plugin => plugin.destroy());\n this.plugins.clear();\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n\n private addCache(data: ReportData): void {\n // 采样\n if (Math.random() > this.config.sampling) return;\n\n this.cache.push({\n ...data,\n timestamp: Date.now(),\n });\n\n if (this.cache.length >= this.config.maxCache) {\n this.report();\n } else if (!this.timer) {\n this.timer = setTimeout(() => this.report(), this.config.reportInterval);\n }\n }\n\n private report(isUnload = false): void {\n if (this.cache.length === 0) return;\n\n const data = this.cache.slice();\n this.cache = [];\n\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n\n const reportData = {\n appId: this.config.appId,\n userId: this.config.userId,\n userAgent: navigator.userAgent,\n data\n };\n\n // 页面卸载前使用 sendBeacon\n if (isUnload && navigator.sendBeacon) {\n navigator.sendBeacon(this.config.reportUrl, JSON.stringify(reportData));\n return;\n }\n\n // 普通上报使用 fetch\n fetch(this.config.reportUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(reportData),\n keepalive: true\n }).catch(error => {\n console.error('Report error:', error);\n // 上报失败,重新加入缓存\n this.cache.push(...data);\n });\n }\n} ","import { BasePluginConfig, ReportData } from './types';\n\nexport abstract class BasePlugin {\n protected config: BasePluginConfig = {};\n public report?: (data: ReportData) => void;\n\n public abstract name: string;\n\n public setConfig(config: BasePluginConfig): void {\n this.config = { ...this.config, ...config };\n }\n\n public setReport(report: (data: ReportData) => void): void {\n this.report = report;\n }\n\n public abstract init(): void;\n public abstract destroy(): void;\n} ","import { BasePlugin } from '../../core/base-plugin';\nimport { ReportData } from '../../core/types';\nimport { PerformanceData } from './types';\n\nexport class PerformancePlugin extends BasePlugin {\n public name = 'performance';\n private performanceObserver?: PerformanceObserver;\n\n public init(): void {\n this.monitorPageLoad();\n this.monitorResourceLoad();\n }\n\n public destroy(): void {\n this.performanceObserver?.disconnect();\n }\n\n private monitorPageLoad(): void {\n window.addEventListener('load', () => {\n setTimeout(() => {\n const performance = window.performance;\n if (!performance) return;\n\n const timing = performance.timing;\n const data: PerformanceData = {\n type: 'performance',\n subType: 'page-load',\n dnsTime: timing.domainLookupEnd - timing.domainLookupStart,\n tcpTime: timing.connectEnd - timing.connectStart,\n whiteScreenTime: timing.domLoading - timing.navigationStart,\n domReadyTime: timing.domContentLoadedEventEnd - timing.navigationStart,\n loadTime: timing.loadEventEnd - timing.navigationStart,\n };\n\n this.report?.(data);\n }, 0);\n });\n }\n\n private monitorResourceLoad(): void {\n this.performanceObserver = new PerformanceObserver((list) => {\n const entries = list.getEntries() as PerformanceResourceTiming[];\n entries.forEach((entry) => {\n const data: PerformanceData = {\n type: 'performance',\n subType: 'resource',\n name: entry.name,\n initiatorType: entry.initiatorType,\n duration: entry.duration,\n transferSize: entry.transferSize,\n };\n this.report?.(data);\n });\n });\n\n this.performanceObserver.observe({ entryTypes: ['resource'] });\n }\n} ","import { BasePlugin } from '../../core/base-plugin';\nimport { ErrorData } from './types';\n\nexport class ErrorPlugin extends BasePlugin {\n public name = 'error';\n private errorHandler: (event: ErrorEvent) => void;\n private rejectionHandler: (event: PromiseRejectionEvent) => void;\n\n constructor() {\n super();\n this.errorHandler = this.handleError.bind(this);\n this.rejectionHandler = this.handleRejection.bind(this);\n }\n\n public init(): void {\n window.addEventListener('error', this.errorHandler, true);\n window.addEventListener('unhandledrejection', this.rejectionHandler);\n }\n\n public destroy(): void {\n if (this.errorHandler) {\n window.removeEventListener('error', this.errorHandler, true);\n }\n if (this.rejectionHandler) {\n window.removeEventListener('unhandledrejection', this.rejectionHandler);\n }\n }\n\n private shouldIgnoreError(error: Error | string): boolean {\n const ignoreErrors = (this.config.ignoreErrors || []) as RegExp[];\n const errorMessage = error instanceof Error ? error.message : error;\n return ignoreErrors.some(pattern => pattern.test(errorMessage));\n }\n\n private handleError(event: ErrorEvent): void {\n if (this.shouldIgnoreError(event.error || event.message)) return;\n\n const data: ErrorData = {\n type: 'error',\n subType: 'javascript',\n message: event.message,\n filename: event.filename,\n position: `${event.lineno}:${event.colno}`,\n stack: event.error?.stack,\n };\n this.report?.(data);\n }\n\n private handleRejection(event: PromiseRejectionEvent): void {\n const error = event.reason;\n if (this.shouldIgnoreError(error)) return;\n\n const data: ErrorData = {\n type: 'error',\n subType: 'promise',\n message: error?.message || error,\n stack: error?.stack,\n };\n this.report?.(data);\n }\n} ","export function debounce<T extends (...args: any[]) => any>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let timer: NodeJS.Timeout | null = null;\n \n return function(this: any, ...args: Parameters<T>) {\n if (timer) clearTimeout(timer);\n \n timer = setTimeout(() => {\n fn.apply(this, args);\n timer = null;\n }, delay);\n };\n} ","import { BasePlugin } from '../../core/base-plugin';\nimport { BehaviorData } from './types';\nimport { debounce } from '../../utils/debounce';\n\nexport class BehaviorPlugin extends BasePlugin {\n public name = 'behavior';\n private clickHandler: (event: MouseEvent) => void;\n\n constructor() {\n super();\n this.clickHandler = debounce(this.handleClick.bind(this), 300);\n }\n\n public init(): void {\n this.monitorPV();\n document.addEventListener('click', this.clickHandler, true);\n }\n\n public destroy(): void {\n if (this.clickHandler) {\n document.removeEventListener('click', this.clickHandler, true);\n }\n }\n\n private monitorPV(): void {\n const data: BehaviorData = {\n type: 'behavior',\n subType: 'pv',\n url: window.location.href,\n referer: document.referrer,\n };\n this.report?.(data);\n }\n\n private handleClick(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n const data: BehaviorData = {\n type: 'behavior',\n subType: 'click',\n path: this.getElementPath(target),\n };\n this.report?.(data);\n }\n\n private getElementPath(element: HTMLElement): string {\n if (!element || !element.tagName) return '';\n \n const path = [] as string[];\n let currentElement: HTMLElement | null = element;\n \n while (currentElement) {\n let selector = currentElement.tagName.toLowerCase();\n if (currentElement.id) {\n selector += `#${currentElement.id}`;\n } else if (currentElement.className) {\n selector += `.${currentElement.className.split(' ').join('.')}`;\n }\n path.unshift(selector);\n currentElement = currentElement.parentElement;\n }\n \n return path.join(' > ');\n }\n} "],"names":[],"mappings":";;MAGa,OAAO,CAAA;AAQlB,IAAA,WAAA,CAAY,MAAqB,EAAA;;AANzB,QAAA,IAAA,CAAA,OAAO,GAA4B,IAAI,GAAG,EAAE,CAAC;QAC7C,IAAK,CAAA,KAAA,GAAiB,EAAE,CAAC;QACzB,IAAK,CAAA,KAAA,GAA0B,IAAI,CAAC;QAC3B,IAAgB,CAAA,gBAAA,GAAG,EAAE,CAAC;AACtB,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,CAAC;QAGtC,IAAI,CAAC,MAAM,GAAG;AACZ,YAAA,GAAG,MAAM;AACT,YAAA,MAAM,EAAE,CAAA,EAAA,GAAA,MAAM,CAAC,MAAM,mCAAI,IAAI;AAC7B,YAAA,QAAQ,EAAE,CAAA,EAAA,GAAA,MAAM,CAAC,QAAQ,mCAAI,CAAC;YAC9B,QAAQ,EAAE,MAAA,MAAM,CAAC,QAAQ,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,IAAI,CAAC,gBAAgB;YAClD,cAAc,EAAE,MAAA,MAAM,CAAC,cAAc,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,IAAI,CAAC,eAAe;SAC9D,CAAC;QACF,IAAI,CAAC,IAAI,EAAE,CAAC;KACb;IAEO,IAAI,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO;;AAGhC,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YACvB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,IAAG;AACnC,gBAAA,MAAM,QAAQ,GAAG,IAAI,MAAM,EAAE,CAAC;AAC9B,gBAAA,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7C,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC5C,aAAC,CAAC,CAAC;AACJ,SAAA;;AAGD,QAAA,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAK;AACrC,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACpB,SAAC,CAAC,CAAC;KACJ;IAEM,OAAO,GAAA;AACZ,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;AACjD,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzB,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AACnB,SAAA;KACF;AAEO,IAAA,QAAQ,CAAC,IAAgB,EAAA;;QAE/B,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,OAAO;AAEjD,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AACd,YAAA,GAAG,IAAI;AACP,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;AACtB,SAAA,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;YAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;AACf,SAAA;AAAM,aAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACtB,YAAA,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AAC1E,SAAA;KACF;IAEO,MAAM,CAAC,QAAQ,GAAG,KAAK,EAAA;AAC7B,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;AAChC,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAEhB,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzB,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AACnB,SAAA;AAED,QAAA,MAAM,UAAU,GAAG;AACjB,YAAA,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;AACxB,YAAA,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,IAAI;SACL,CAAC;;AAGF,QAAA,IAAI,QAAQ,IAAI,SAAS,CAAC,UAAU,EAAE;AACpC,YAAA,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;YACxE,OAAO;AACR,SAAA;;AAGD,QAAA,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;AAC3B,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,cAAc,EAAE,kBAAkB;AACnC,aAAA;AACD,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;AAChC,YAAA,SAAS,EAAE,IAAI;AAChB,SAAA,CAAC,CAAC,KAAK,CAAC,KAAK,IAAG;AACf,YAAA,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;;YAEtC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAC3B,SAAC,CAAC,CAAC;KACJ;AACF;;MCtGqB,UAAU,CAAA;AAAhC,IAAA,WAAA,GAAA;QACY,IAAM,CAAA,MAAA,GAAqB,EAAE,CAAC;KAezC;AAVQ,IAAA,SAAS,CAAC,MAAwB,EAAA;AACvC,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;KAC7C;AAEM,IAAA,SAAS,CAAC,MAAkC,EAAA;AACjD,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;KACtB;AAIF;;ACdK,MAAO,iBAAkB,SAAQ,UAAU,CAAA;AAAjD,IAAA,WAAA,GAAA;;QACS,IAAI,CAAA,IAAA,GAAG,aAAa,CAAC;KAoD7B;IAjDQ,IAAI,GAAA;QACT,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,mBAAmB,EAAE,CAAC;KAC5B;IAEM,OAAO,GAAA;;AACZ,QAAA,CAAA,EAAA,GAAA,IAAI,CAAC,mBAAmB,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,UAAU,EAAE,CAAC;KACxC;IAEO,eAAe,GAAA;AACrB,QAAA,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAK;YACnC,UAAU,CAAC,MAAK;;AACd,gBAAA,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACvC,gBAAA,IAAI,CAAC,WAAW;oBAAE,OAAO;AAEzB,gBAAA,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;AAClC,gBAAA,MAAM,IAAI,GAAoB;AAC5B,oBAAA,IAAI,EAAE,aAAa;AACnB,oBAAA,OAAO,EAAE,WAAW;AACpB,oBAAA,OAAO,EAAE,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,iBAAiB;AAC1D,oBAAA,OAAO,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,YAAY;AAChD,oBAAA,eAAe,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,eAAe;AAC3D,oBAAA,YAAY,EAAE,MAAM,CAAC,wBAAwB,GAAG,MAAM,CAAC,eAAe;AACtE,oBAAA,QAAQ,EAAE,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,eAAe;iBACvD,CAAC;AAEF,gBAAA,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,MAAG,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,EAAA,IAAI,CAAC,CAAC;aACrB,EAAE,CAAC,CAAC,CAAC;AACR,SAAC,CAAC,CAAC;KACJ;IAEO,mBAAmB,GAAA;QACzB,IAAI,CAAC,mBAAmB,GAAG,IAAI,mBAAmB,CAAC,CAAC,IAAI,KAAI;AAC1D,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAiC,CAAC;AACjE,YAAA,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;;AACxB,gBAAA,MAAM,IAAI,GAAoB;AAC5B,oBAAA,IAAI,EAAE,aAAa;AACnB,oBAAA,OAAO,EAAE,UAAU;oBACnB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,aAAa,EAAE,KAAK,CAAC,aAAa;oBAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,YAAY,EAAE,KAAK,CAAC,YAAY;iBACjC,CAAC;AACF,gBAAA,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,MAAG,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,EAAA,IAAI,CAAC,CAAC;AACtB,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;KAChE;AACF;;ACtDK,MAAO,WAAY,SAAQ,UAAU,CAAA;AAKzC,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE,CAAC;QALH,IAAI,CAAA,IAAA,GAAG,OAAO,CAAC;QAMpB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACzD;IAEM,IAAI,GAAA;QACT,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;KACtE;IAEM,OAAO,GAAA;QACZ,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;AAC9D,SAAA;QACD,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,MAAM,CAAC,mBAAmB,CAAC,oBAAoB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;AACzE,SAAA;KACF;AAEO,IAAA,iBAAiB,CAAC,KAAqB,EAAA;QAC7C,MAAM,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAa,CAAC;AAClE,QAAA,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;AACpE,QAAA,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;KACjE;AAEO,IAAA,WAAW,CAAC,KAAiB,EAAA;;QACnC,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC;YAAE,OAAO;AAEjE,QAAA,MAAM,IAAI,GAAc;AACtB,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,OAAO,EAAE,YAAY;YACrB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ,EAAE,GAAG,KAAK,CAAC,MAAM,CAAI,CAAA,EAAA,KAAK,CAAC,KAAK,CAAE,CAAA;AAC1C,YAAA,KAAK,EAAE,CAAA,EAAA,GAAA,KAAK,CAAC,KAAK,0CAAE,KAAK;SAC1B,CAAC;AACF,QAAA,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,MAAG,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,EAAA,IAAI,CAAC,CAAC;KACrB;AAEO,IAAA,eAAe,CAAC,KAA4B,EAAA;;AAClD,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;AAC3B,QAAA,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;YAAE,OAAO;AAE1C,QAAA,MAAM,IAAI,GAAc;AACtB,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,CAAA,KAAK,KAAL,IAAA,IAAA,KAAK,uBAAL,KAAK,CAAE,OAAO,KAAI,KAAK;AAChC,YAAA,KAAK,EAAE,KAAK,KAAA,IAAA,IAAL,KAAK,KAAL,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,KAAK,CAAE,KAAK;SACpB,CAAC;AACF,QAAA,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,MAAG,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,EAAA,IAAI,CAAC,CAAC;KACrB;AACF;;AC5De,SAAA,QAAQ,CACtB,EAAK,EACL,KAAa,EAAA;IAEb,IAAI,KAAK,GAA0B,IAAI,CAAC;IAExC,OAAO,UAAoB,GAAG,IAAmB,EAAA;AAC/C,QAAA,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;AAE/B,QAAA,KAAK,GAAG,UAAU,CAAC,MAAK;AACtB,YAAA,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACrB,KAAK,GAAG,IAAI,CAAC;SACd,EAAE,KAAK,CAAC,CAAC;AACZ,KAAC,CAAC;AACJ;;ACVM,MAAO,cAAe,SAAQ,UAAU,CAAA;AAI5C,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE,CAAC;QAJH,IAAI,CAAA,IAAA,GAAG,UAAU,CAAC;AAKvB,QAAA,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;KAChE;IAEM,IAAI,GAAA;QACT,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;KAC7D;IAEM,OAAO,GAAA;QACZ,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;AAChE,SAAA;KACF;IAEO,SAAS,GAAA;;AACf,QAAA,MAAM,IAAI,GAAiB;AACzB,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;YACzB,OAAO,EAAE,QAAQ,CAAC,QAAQ;SAC3B,CAAC;AACF,QAAA,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,MAAG,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,EAAA,IAAI,CAAC,CAAC;KACrB;AAEO,IAAA,WAAW,CAAC,KAAiB,EAAA;;AACnC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB,CAAC;AAC3C,QAAA,MAAM,IAAI,GAAiB;AACzB,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;SAClC,CAAC;AACF,QAAA,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,MAAG,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,EAAA,IAAI,CAAC,CAAC;KACrB;AAEO,IAAA,cAAc,CAAC,OAAoB,EAAA;AACzC,QAAA,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO;AAAE,YAAA,OAAO,EAAE,CAAC;QAE5C,MAAM,IAAI,GAAG,EAAc,CAAC;QAC5B,IAAI,cAAc,GAAuB,OAAO,CAAC;AAEjD,QAAA,OAAO,cAAc,EAAE;YACrB,IAAI,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACpD,IAAI,cAAc,CAAC,EAAE,EAAE;AACrB,gBAAA,QAAQ,IAAI,CAAI,CAAA,EAAA,cAAc,CAAC,EAAE,EAAE,CAAC;AACrC,aAAA;iBAAM,IAAI,cAAc,CAAC,SAAS,EAAE;AACnC,gBAAA,QAAQ,IAAI,CAAI,CAAA,EAAA,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACjE,aAAA;AACD,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACvB,YAAA,cAAc,GAAG,cAAc,CAAC,aAAa,CAAC;AAC/C,SAAA;AAED,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACzB;AACF;;;;;;;"}